
「Regnexe Python 实战系列」第 1 篇共 10 篇对应仓库examples/readme/01_multi_tool.py。上一篇00. 别再把 Python Agent 写成 Demo 了我开源了一个能管插件、记忆、事件、取消的框架。痛点只是想试个工具为什么要先设计插件体系很多 Agent 项目一上来就把工具做成插件、类、配置、注册表。这个方向没错但对第一个 Demo 来说太重了。你只是想验证一件事模型能不能同时查天气和空气质量然后给出跑步建议。结果还没跑起来先写了一堆工程结构。regnexe-py 给了一条最短路径已有 LangChain tool直接丢给with_tool(...)。实战代码来看仓库里的01_multi_tool.pyfromlangchain_core.toolsimporttoolfromregnexeimportConsoleEventListener,RegnexeAgentBuilder,Vendortooldefget_weather(city:str)-str:Get todays weather for a city.returnBeijing: sunny, 22 C.tooldefget_air_quality(city:str)-str:Get todays air quality index (AQI) for a city.returnBeijing: AQI 35, excellent air quality.agent(RegnexeAgentBuilder().with_default_model(Vendor.DEEPSEEK,deepseek-v4-flash).with_tool(get_weather,get_air_quality)# 一次注册多个.with_event_listener(ConsoleEventListener()).build())然后发起一次异步调用resultawaitagent.ainvoke(Check todays weather and air quality in Beijing, then tell me if its good for outdoor running.)注意这里没有新建插件类也没有写装饰器。tool仍然是 LangChain 的工具定义regnexe-py 只是把它接进统一 Builder。运行效果先把事件打出来示例里接了ConsoleEventListener()。跑起来后你能看到 Agent 什么时候开始、什么时候调用工具、工具返回了什么、最终状态是什么。这点很重要。Agent 调试不能只看最终回答否则你不知道模型到底有没有调用get_air_quality也不知道参数是不是传对了。控制台会打印出类似这样的事件流[AGENT ▶] RegnexeAgent goal: Check todays weather and air quality in Beijing, then tell me if its good for outdoor running. [TOOL ▶] mcp_tool:get_air_quality input{city: Beijing} [TOOL ▶] mcp_tool:get_weather input{city: Beijing} [TOOL ■] mcp_tool:get_air_quality outputBeijing: AQI 35, excellent air quality. [TOOL ■] mcp_tool:get_weather outputBeijing: sunny, 22 C. [AGENT ■] statuscompleted踩坑提醒tool的函数名和 docstring 会进入工具描述。函数名别写得太随意docstring 也别只写一句“查询”。模型能不能选对工具和工具描述质量直接相关。另一个细节是多工具顺序不要写死在业务代码里。你只需要把工具注册进去让模型根据目标决定是否都要调用如果必须强约束顺序那应该放到 Skill 或 Sub-Agent 里做成明确工作流。小结with_tool(...)适合三类场景PoC 阶段先验证 Agent 能不能跑通已经有现成 LangChain tool不想重写插件类工具数量少暂时不需要版本、分组和市场管理等工具开始变多就该进入后面的插件和 Marketplace 体系了。 上一篇00. 别再把 Python Agent 写成 Demo 了我开源了一个能管插件、记忆、事件、取消的框架 下一篇02. Skill 和 Sub-Agent 到底差在哪一个借工具一个有私有工具 项目地址https://github.com/flower-trees/regnexe-py