HarmonyOS 鸿蒙Next中@wrap_model_call 和 @wrap_tool_call 的作用
HarmonyOS 鸿蒙Next中@wrap_model_call 和 @wrap_tool_call 的作用
在 LangChain V1.0+(特别是基于 langgraph 和新版 create_agent 的架构)中,[@wrap_model_call](/user/wrap_model_call) 和 [@wrap_tool_call](/user/wrap_tool_call) 是用于定义 Agent 中间件(Middleware) 的两个核心装饰器。
它们的作用是允许开发者在不修改 Agent 核心逻辑的情况下,拦截、增强或修改 Agent 运行过程中的关键步骤。这类似于 Web 框架(如 Express.js 或 FastAPI)中的中间件概念,但专门针对 LLM Agent 的“思考 - 行动”循环。
以下是它们的详细作用、区别及代码示例:
1. [@wrap_model_call](/user/wrap_model_call):包裹模型调用
作用位置:在 Agent 调用大语言模型(LLM)生成回复或决定下一步动作之前和之后。
主要用途:
- 自动重试 (Retry):当模型调用因网络错误或速率限制(Rate Limit)失败时,自动重试。
- 缓存 (Caching):检查相同的 Prompt 是否已有缓存结果,避免重复调用模型以节省 Token。
- 模型回退 (Fallback):如果主模型(如
gpt-4)不可用,自动切换到备用模型(如gpt-3.5)。 - 日志与追踪 (Logging/Tracing):记录输入 Prompt、输出内容、耗时和 Token 用量,用于调试或接入 LangSmith。
- 提示词注入/修改:在发送给模型前动态修改 System Prompt(例如添加当前的时间或用户上下文)。
函数签名逻辑:
它通常接收一个 handler(下一个处理步骤),并返回一个异步函数,该函数接收 model_inputs(模型输入)并返回 model_outputs。
代码示例:实现简单的重试机制
from langchain.agents.middleware import wrap_model_call
import asyncio
[@wrap_model_call](/user/wrap_model_call)
async def retry_middleware(request, handler):
"""
当模型调用失败时,自动重试 3 次。
request: 包含模型输入信息的对象
handler: 下一个中间件或实际的模型调用函数
"""
max_retries = 3
for attempt in range(max_retries):
try:
# 调用下一个处理步骤(即真正的模型调用)
return await handler(request)
except Exception as e:
if attempt == max_retries - 1:
raise e # 最后一次尝试失败,抛出异常
print(f"模型调用失败,正在重试 ({attempt + 1}/{max_retries}): {e}")
await asyncio.sleep(2 ** attempt) # 指数退避
2. [@wrap_tool_call](/user/wrap_tool_call):包裹工具调用
作用位置:在 Agent 决定调用某个工具(Tool),实际执行该工具函数之前和之后。
主要用途:
- 权限控制 (Authorization):检查当前用户是否有权限执行该工具(例如:禁止普通用户调用“删除数据库”工具)。
- 参数修正/验证 (Input Validation):在工具执行前,清洗或修正模型生成的参数(例如:将相对时间“明天”转换为具体日期)。
- 模拟/Mock (Testing):在测试环境中,拦截真实工具调用,返回固定的假数据。
- 超时控制 (Timeout):防止某个工具执行时间过长卡死整个 Agent。
- 错误格式化:捕获工具抛出的异常,将其转换为 LLM 能理解的友好错误消息,而不是让 Agent 崩溃。
函数签名逻辑:
它接收 request(包含工具名称、参数等信息)和 handler(实际的工具执行函数)。
代码示例:实现工具超时和错误处理
from langchain.agents.middleware import wrap_tool_call
import asyncio
[@wrap_tool_call](/user/wrap_tool_call)
async def timeout_and_error_middleware(request, handler):
"""
为工具调用设置 10 秒超时,并捕获所有异常返回友好提示。
request: 包含 tool_name, tool_args 等信息
handler: 实际的工具执行函数
"""
try:
# 使用 asyncio.wait_for 设置超时
result = await asyncio.wait_for(handler(request), timeout=10.0)
return result
except asyncio.TimeoutError:
return f"错误:工具 '{request.tool_name}' 执行超时(超过10秒)。"
except Exception as e:
# 捕获异常,返回字符串而不是抛出,让 LLM 知道出错了并尝试其他方案
return f"工具执行出错:{str(e)}。请检查参数或尝试其他方法。"
3. 如何在 create_agent 中使用
这两个装饰器定义的函数需要作为 中间件列表 传递给 create_agent。
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
# 1. 定义模型
model = ChatOpenAI(model="gpt-4o")
# 2. 定义工具
tools = [get_weather] # 假设已定义
# 3. 组合中间件
# 顺序很重要:请求会按顺序经过这些中间件
my_middleware = [
retry_middleware, # 先处理模型重试
timeout_and_error_middleware, # 再处理工具超时
# 还可以添加更多...
]
# 4. 创建 Agent
agent = create_agent(
model=model,
tools=tools,
middleware=my_middleware # 传入中间件列表
)
# 现在 agent 在执行时会自动应用上述逻辑
# response = await agent.ainvoke({"messages": [{"role": "user", "content": "北京天气?"}]})
总结对比
| 特性 | [@wrap_model_call](/user/wrap_model_call) |
[@wrap_tool_call](/user/wrap_tool_call) |
|---|---|---|
| 拦截点 | LLM 推理阶段 (Thinking) | 工具执行阶段 (Acting) |
| 主要对象 | Prompt, Model Response, Token Usage | Tool Name, Tool Arguments, Tool Output |
| 典型场景 | 重试、缓存、限流、Prompt 注入、计费统计 | 权限校验、参数清洗、超时控制、Mock 测试、错误屏蔽 |
| 性能影响 | 影响生成首字的时间 (Latency) | 影响单个工具步骤的执行时间 |
| 返回值处理 | 通常返回模型的原始输出 (Message) | 通常返回工具的执行结果 (String/JSON) |
通过合理使用这两个装饰器,你可以构建出高可用、安全且可观测的企业级 Agent,而无需侵入性地修改 Agent 的核心源码。这是 LangChain V1.0 推荐的最佳实践模式。
更多关于HarmonyOS 鸿蒙Next中@wrap_model_call 和 @wrap_tool_call 的作用的实战教程也可以访问 https://www.itying.com/category-93-b0.html
@wrap_model_call 用于包装AI模型调用,将模型API封装为HarmonyOS服务。@wrap_tool_call 用于包装工具调用,将第三方工具或服务接口封装为HarmonyOS可调用的服务。两者都是鸿蒙Next中AI能力框架的关键装饰器,用于实现服务化封装和统一调用。
更多关于HarmonyOS 鸿蒙Next中@wrap_model_call 和 @wrap_tool_call 的作用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,@wrap_model_call 和 @wrap_tool_call 是用于增强智能体(Agent)开发的两个关键装饰器,它们允许开发者在模型调用和工具调用过程中插入自定义逻辑,实现诸如重试、缓存、权限控制等功能,而无需修改核心业务代码。
@wrap_model_call 主要用于拦截和处理大语言模型(LLM)的调用过程。它允许开发者在模型调用前后执行自定义操作,例如自动重试失败的请求、缓存重复的提示词结果以实现成本节约、在主模型不可用时切换到备用模型、记录详细的日志和性能指标,或者在发送给模型前动态修改提示词内容。这有助于提升模型的可靠性和可观测性。
@wrap_tool_call 则专注于拦截和处理工具(Tool)的执行过程。开发者可以利用它在工具实际运行前后添加控制逻辑,例如进行用户权限验证、对输入参数进行清洗和校验、在测试环境中模拟工具返回、为工具执行设置超时限制,以及捕获工具异常并将其转化为友好的错误信息返回给智能体,从而避免整个流程中断。
在实际使用中,通过 create_agent 创建智能体时,可以将由这两个装饰器定义的中间件函数组合成一个列表传入。这些中间件会按照定义的顺序依次执行,形成一个处理管道。这种设计模式使得智能体具备了高度的可扩展性和可维护性,是构建健壮、安全、高效的企业级智能体应用的重要实践。

