跳转到主要内容
Kimi K3 具备面向复杂任务的推理、编码和工具调用能力。本指南以“行业信息整理 Agent”为例,演示如何组合官方联网搜索工具与一个自定义工具,构建可运行、可控的 Agent。

任务拆解

先把行业研究任务拆成三个阶段,再决定工具和提示词:
  1. 检索:确定研究范围,搜索最新数据、企业信息和新闻;
  2. 分析:比较来源、识别冲突,区分事实、估算和推断;
  3. 输出:生成包含摘要、关键发现、风险和来源的结构化报告。
这种拆解让模型负责规划和判断,让工具负责检索或执行确定性逻辑。不要把工具能够完成的工作重复写进冗长的 system prompt。

工具设计

本示例组合两类工具:
  • 官方 web-search:检索实时行业资料。平台还提供 fetchcode_runnerexcel 等工具,完整列表和 Formula 调用方式见官方工具
  • 自定义 build_research_plan:根据主题、地区和年份生成确定性的研究范围,展示如何声明并在本地执行函数工具。
自定义工具使用 JSON Schema 描述参数。将 additionalProperties 设为 false,并在 required 中列出必填字段,可以减少模型生成无效参数的概率。 当工具增加到几十个甚至更多时,不要把所有 schema 都放进每次请求。请参考 Kimi K3 工具调用最佳实践动态加载工具,先检索候选工具,再按需加载。

Prompt 设计

System prompt 只描述角色、工作流程和质量边界,把具体工具参数留给工具 schema:
业务格式、合规要求或受众发生变化时,再增量补充约束。更多建议见 Prompt 最佳实践

K3 API 配置

请使用 Python 3.9 或更高版本,并安装 OpenAI Python SDK 和用于调用官方 Formula 工具的 HTTP 客户端:
CN 站点使用 https://api.moonshot.cn/v1,模型为 kimi-k3。API Key 仅从 MOONSHOT_API_KEY 环境变量读取。 Kimi K3 始终进行推理,当前顶层 reasoning_effort 的唯一支持值为 "max"。工具循环必须把 SDK 返回的完整 assistant message 追加到 messages,不能只复制 contenttool_calls,否则会丢失可能返回的 reasoning_content,破坏后续工具调用上下文。参数和不同模型的差异请以思考模式思考力度模型参数参考为准。

完整 Agent Loop

将下面代码保存为 agent.py。示例动态读取 web-search 的工具声明,在本地执行自定义工具,并用最多 8 轮的循环处理工具调用。
循环中的两个上下文细节缺一不可:
  1. messages.append(message) 追加完整 assistant message,以保留 K3 返回的 reasoning_content
  2. 每条 tool message 使用对应的 tool_call_id,让模型知道结果属于哪个调用。
示例遇到 finish_reason="length" 时会立即报错,避免把截断内容当作最终报告。单个工具调用失败时,错误会作为对应的 tool result 返回给模型,并继续处理本轮其他调用。 MAX_TOOL_ROUNDS 防止工具不断调用造成无限循环,也避免递归实现带来的调用栈增长。

运行与排错

运行示例:
可以把 main() 中的问题替换为目标行业、地区和年份。最终输出应包含摘要、关键发现、风险与来源,而不是大段工具原始结果。 常见问题:
  • finish_reasonlength:示例会抛出 RuntimeError;结合模型参数参考提高 max_completion_tokens,或缩短工具结果;
  • 达到最大工具轮数:检查工具描述是否重叠、工具结果是否明确,并收紧任务范围;
  • 工具持续返回参数错误:检查函数 schema、requiredenumadditionalProperties,不要用 prompt 代替参数约束;
  • 第二轮工具调用失败:确认追加的是完整 SDK assistant message,且每条工具结果保留了正确的 tool_call_id
  • 官方工具请求失败:确认 endpoint、API Key、Formula URI 和工具可用性,详细调用方式见官方工具

自定义工具与优化

示例中的 build_research_plan 已完整展示“声明 schema → 本地分派 → 返回 JSON → 关联 tool_call_id”的流程。接入数据库、内部搜索或文件生成服务时,只需用真实实现替换该函数,并保持 schema 与返回结构一致。 进一步优化时: