AI Agent 开发实战(09):第一个 AI Agent
发布时间2026-07-24标签AI Agent实战PythonTool CallingMemory目标前面 05–08 篇用的 Hermes、OpenClaw 都是别人写好的 Agent。本篇第一次自己写用 Python 一个 LLM SDK从零搭一个能调用工具 记住对话的最小 Agent。跑通后你会明白 Agent 的核心不是魔法而是一个模型 ↔ 工具 ↔ 记忆的循环。本文以 OpenRouter 为例复用第 03 篇申请的sk-or-Key模型用deepseek/deepseek-v4-pro。你换成 DeepSeek 官方端点第 02 篇或 Anthropic 也行只改base_url和api_key。环境准备已完成第 01 篇Python 已装一个模型 Key复用第 03 篇 OpenRouter Keysk-or-开头装依赖pip install openai python-dotenv步骤1. 放好 Key用 .env别硬编码项目目录建.envOPENROUTER_API_KEYsk-or-你的key AGENT_MODELdeepseek/deepseek-v4-pro真实 Key 只放.env加进.gitignore。硬编码进代码、再传 GitHub是新手最常见的泄露事故。2. 写 Agentagent.py一个文件讲清三件事工具定义、工具实现、对话循环。import os import json from datetime import datetime from dotenv import load_dotenv from openai import OpenAI load_dotenv() # 1) 客户端OpenAI 兼容端点复用第 03 篇的 OpenRouter client OpenAI( base_urlhttps://openrouter.ai/api/v1, api_keyos.environ[OPENROUTER_API_KEY], ) MODEL os.environ.get(AGENT_MODEL, deepseek/deepseek-v4-pro) # 2) 工具定义告诉模型你能调哪些函数、参数是什么 tools [ { type: function, function: { name: get_current_time, description: 获取当前时间用于回答和时间相关的问题, parameters: {type: object, properties: {}}, }, }, { type: function, function: { name: calculate, description: 计算一个数学表达式例如 123*456, parameters: { type: object, properties: { expression: {type: string, description: 要计算的表达式} }, required: [expression], }, }, }, ] # 3) 工具实现真正干活的 Python 函数 def get_current_time(): return datetime.now().strftime(%Y-%m-%d %H:%M:%S) def calculate(expression): try: return str(eval(expression)) # ⚠️ 仅演示用生产环境别对不可信输入用 eval except Exception as e: return f计算出错{e} available {get_current_time: get_current_time, calculate: calculate} # 4) Memory用消息列表累积多轮对话 messages [ {role: system, content: 你是一个有帮助的 AI 助手需要时用提供的工具。} ] def run_agent(user_input, max_turns5): messages.append({role: user, content: user_input}) for _ in range(max_turns): resp client.chat.completions.create( modelMODEL, messagesmessages, toolstools, tool_choiceauto ) msg resp.choices[0].message if msg.tool_calls: # 模型决定调工具先把带 tool_calls 的助手消息存进记忆 messages.append(msg) for tc in msg.tool_calls: fn available[tc.function.name] args json.loads(tc.function.arguments) result fn(**args) messages.append({ role: tool, tool_call_id: tc.id, content: str(result), }) # 继续循环让模型消化工具结果 else: messages.append({role: assistant, content: msg.content}) print(Agent:, msg.content) return print(达到最大轮次未得出最终回答) if __name__ __main__: print(输入 exit 退出) while True: user input(你) if user.lower() exit: break run_agent(user)3. 跑起来python agent.py验证三项全过 你的第一个 Agent 成立问现在几点→ 模型调用get_current_time工具返回真实时间问计算 123*456→ 模型调用calculate返回56088接着问刚才那个结果加 100 是多少→ 它记得上一步的56088Memory 生效算出56188第 3 项最关键如果它答得出来说明多轮记忆真的在工作而不是每次都当新对话。踩坑记录1.KeyError: OPENROUTER_API_KEY.env没建或load_dotenv()没跑。确认.env在同目录、且文件首行就load_dotenv()。2. 模型不调工具直接瞎编答案工具description写太含糊模型不知道何时该调。把描述写具体用于回答和时间相关的问题或在提问时明确点名请用 calculate 工具算。3. 死循环模型一直调工具不收敛。max_turns就是保险的终止条件生产环境必加别信模型一定会停。4.eval的安全坑示例里calculate用eval仅为演示。不可信输入下eval能执行任意代码——真实项目用ast.literal_eval或专用表达式库且只接受数字和运算符。5. Memory 越聊越长messages无限累积聊久了超 token 上限、变贵变慢。生产环境要对旧消息做截断或摘要这正是第 06 篇Hermes 在做的事。6. OpenRouter 模型名格式用厂商/模型斜杠格式deepseek/deepseek-v4-pro不是官方点号格式写错直接 404。下一步Agent 的骨架跑通了模型思考、工具执行、记忆留存。但这还是个单机脚本。真实项目里工具往往不在本地——比如你想让 Agent 查数据库、发消息得有一套标准协议把工具暴露出去→ AI Agent 开发实战10第一个 MCP第 10 篇写你的第一个 MCP Server——用统一协议把工具接进任意 AgentClaude Code 等不再是写死的 Python 函数。系列衔接从本篇起你从用别人的 Agent正式走进写自己的 Agent。后面 10–14 篇都是工程化这条线。

相关新闻

FreeRTOS嵌入式开发实战:从任务调度到项目应用全解析

FreeRTOS嵌入式开发实战:从任务调度到项目应用全解析

1. 从零到一:为什么FreeRTOS是嵌入式开发的必修课如果你刚开始接触单片机,可能觉得裸机编程(也就是不用操作系统,直接在main函数里写while(1)循环)已经足够应付LED闪烁、按键检测这些简单任务了。但当你开始面对一个需…

2026/8/18 20:33:07 阅读更多 →
FreeRTOS中断测试实战:从零中断延迟到任务响应异常排查

FreeRTOS中断测试实战:从零中断延迟到任务响应异常排查

1. 项目缘起:为什么FreeRTOS的中断测试如此关键?最近在调试一个基于STM32和FreeRTOS的嵌入式项目时,遇到了一个让人头疼的问题:一个本该在1毫秒内响应的外部中断,偶尔会延迟到几毫秒甚至十几毫秒才被处理。这直接导致了…

2026/8/18 20:33:07 阅读更多 →
宝可梦Switch游戏随机化与编辑终极指南:pkNX 5分钟快速上手指南

宝可梦Switch游戏随机化与编辑终极指南:pkNX 5分钟快速上手指南

宝可梦Switch游戏随机化与编辑终极指南:pkNX 5分钟快速上手指南 【免费下载链接】pkNX Pokmon (Nintendo Switch) ROM Editor & Randomizer 项目地址: https://gitcode.com/gh_mirrors/pk/pkNX 玩腻了原版剧情,想在剑盾里遇到一群"不讲道…

2026/8/18 20:33:07 阅读更多 →

最新新闻

语义率失真理论:量化多智能体协作中的通信成本与效率

语义率失真理论:量化多智能体协作中的通信成本与效率

1. 项目概述:当多智能体需要“对齐”时,我们如何衡量沟通的代价?在分布式人工智能和机器人协作领域,一个核心且日益紧迫的挑战是:多个拥有独立感知与决策能力的智能体,如何在资源受限(尤其是通信…

2026/8/19 4:07:28 阅读更多 →
基于Arduino与MPU6050的智能可穿戴设备DIY:从生物信号到视觉反馈

基于Arduino与MPU6050的智能可穿戴设备DIY:从生物信号到视觉反馈

1. 项目概述:从“神奇女侠”到“心灵头冠”的创意实现最近在整理自己的创意项目时,翻出了一个几年前做的“Wonder Woman Mind Tiara”(神奇女侠心灵头冠)原型。这玩意儿乍一听像是漫展道具,但它的内核其实是一个结合了…

2026/8/19 4:07:28 阅读更多 →
【计算机毕业设计单片机案例】单片机红外无线通信多路执行机构控制系统设计 基于 VS1838 红外接收模块的单片机遥控开关系统设计(021003)

【计算机毕业设计单片机案例】单片机红外无线通信多路执行机构控制系统设计 基于 VS1838 红外接收模块的单片机遥控开关系统设计(021003)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 4:07:28 阅读更多 →
语义信道理论:多智能体通信的演绎压缩与结构保真实践

语义信道理论:多智能体通信的演绎压缩与结构保真实践

1. 项目概述:从“鸡同鸭讲”到“心有灵犀”的通信革命在分布式人工智能和多智能体系统的世界里,通信效率与准确性一直是个核心痛点。想象一下,你指挥一个由无人机、机器人、传感器组成的团队执行协同任务,每个成员都在用自己独特的…

2026/8/19 4:07:28 阅读更多 →
【计算机毕业设计单片机案例】基于 STM32 或 51 单片机、ESP8266 的液晶显示无线测控系统 局域网通信嵌入式环境监测与继电器驱动控制系统实现(020903)

【计算机毕业设计单片机案例】基于 STM32 或 51 单片机、ESP8266 的液晶显示无线测控系统 局域网通信嵌入式环境监测与继电器驱动控制系统实现(020903)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 4:07:28 阅读更多 →
DIY 12V磷酸铁锂电池组:从原理到组装的自行车电源改造指南

DIY 12V磷酸铁锂电池组:从原理到组装的自行车电源改造指南

1. 从零开始:为什么选择磷酸铁锂制作12V自行车电池?如果你和我一样,是个喜欢折腾自行车改装,特别是给电动助力车、露营车灯或者车载小设备供电的玩家,那你肯定对电池不陌生。市面上现成的12V铅酸电池笨重、寿命短&…

2026/8/19 4:06:28 阅读更多 →

日新闻

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:30 阅读更多 →
AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:30 阅读更多 →
WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 一台刚配的新电脑,跑《魔兽争霸3》却卡成 PPT——这…

2026/8/19 0:02:31 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →