Kimi API 调用
官方来源
基于 Kimi 开放平台快速开始、Chat Completion、Tool Use 和 Files API 文档整理。Kimi 使用 OpenAI 兼容格式,Python 中通常使用
openai包。
常用入口
| Python 方法 | 用途 |
|---|---|
client.chat.completions.create() | 文本、多轮、思考和工具调用 |
stream=True | 流式输出 |
client.files.create() | 上传文件 |
client.files.content() | 获取 Kimi 解析后的文件内容 |
client.files.list() / delete() | 管理已上传文件 |
不把 Kimi 的
web_search作为新生产依赖2026-07-22 的 K2.6 quickstart 明示该工具正在升级、现有文档已过时且近期不建议使用。需要联网检索时,选择有当前稳定合同的检索提供方,并把引用、时效、访问控制和失败回退留在应用层;不要因模型能调用工具就跳过这些门。
安装与设置 API Key
python -m pip install --upgrade "openai>=1.0" # 安装或更新用于调用兼容接口的 OpenAI Python SDK。
$env:MOONSHOT_API_KEY = Read-Host 'MOONSHOT_API_KEY' -MaskInput # 仅在当前 PowerShell 进程以遮罩方式读取 Key,不写入代码。1. endpoint 与客户端
| 平台 | base_url |
|---|---|
| 中国开放平台 | https://api.moonshot.cn/v1 |
| 国际开放平台 | https://api.moonshot.ai/v1 |
Key 必须与平台注册区域匹配。以下示例使用中国开放平台:
import os # 导入环境变量访问接口,避免将 API Key 硬编码到源码中。
from openai import OpenAI # 导入可调用 OpenAI 兼容协议的客户端类。
client = OpenAI( # 创建指向中国 Kimi 开放平台 endpoint 的客户端。
api_key=os.environ["MOONSHOT_API_KEY"], # 从当前进程环境读取 Key;缺失时让程序尽早失败。
base_url="https://api.moonshot.cn/v1", # 选择中国 endpoint;国际 Key 应改用对应国际地址。
)2. 文本生成
response = client.chat.completions.create( # 发起一轮聊天生成请求。
model="kimi-k2.6", # 选择本课示例模型;实际可用性需按区域和套餐核对。
messages=[ # 按角色和时间顺序传入消息。
{"role": "system", "content": "你是一个简洁的中文技术老师。"}, # 约束回答风格的系统指令。
{"role": "user", "content": "用三点解释 API 调用。"}, # 当前用户问题。
],
)
print(response.choices[0].message.content) # 输出第一候选助手消息的文本。
print(response.usage) # 输出服务返回的实际用量。模型名称与可用能力可能按地区和套餐不同,应先查看控制台或当前模型列表。
3. 多轮对话
messages = [ # 在应用侧保存完整对话历史;API 请求之间不会自动记忆。
{"role": "system", "content": "你是 Python 老师。"}, # 固定行为约束。
{"role": "user", "content": "字典是什么?"}, # 第一轮用户提问。
]
first = client.chat.completions.create(model="kimi-k2.6", messages=messages) # 发送首轮历史并取得回答。
messages.append({ # 将首轮回答加入历史,供下一轮看到。
"role": "assistant", # 声明消息来自助手。
"content": first.choices[0].message.content, # 保存第一候选回答文本。
})
messages.append({"role": "user", "content": "给一个按键读取值的例子。"}) # 添加基于前文的追问。
second = client.chat.completions.create(model="kimi-k2.6", messages=messages) # 发送完整历史发起第二轮。
print(second.choices[0].message.content) # 输出第二轮文本回答。长对话会持续消耗上下文。应用应控制历史长度,必要时做摘要,而不是无限追加。
4. 流式输出
stream = client.chat.completions.create( # 请求服务器以增量 chunk 返回生成内容。
model="kimi-k2.6", # 选择流式生成的目标模型。
messages=[{"role": "user", "content": "写一份 Python API 学习建议。"}], # 提供本轮用户任务。
stream=True, # 开启流式模式。
)
for chunk in stream: # 按到达顺序消费每个流分片。
if not chunk.choices: # 某些分片不包含候选内容。
continue # 跳过空 choices,避免下标访问错误。
text = chunk.choices[0].delta.content or "" # 读取第一候选文本增量;缺失时使用空字符串。
print(text, end="", flush=True) # 立即输出增量文本,模拟流式界面。思考模型可能额外返回 reasoning_content。做多轮工具调用时,是否必须保留该字段应以所选模型的官方说明为准。
5. K2.6 的思考模式:可显式关闭,不臆造跨厂商开关
K2.6 的官方 quickstart 将长思考作为模型能力,并展示了关闭它的顶层请求字段。通过 OpenAI SDK 时把厂商扩展放入 extra_body:
response = client.chat.completions.create( # 发起一个显式关闭思考模式的兼容请求。
model="kimi-k2.6", # 选择 K2.6 模型;扩展字段应以当前官方说明为准。
messages=[{"role": "user", "content": "比较两种数据库迁移方案。"}], # 提供需要比较的用户问题。
extra_body={"thinking": {"type": "disabled"}}, # 将 Kimi 特有的关闭思考字段透传给服务。
)
print(response.choices[0].message.content) # 输出模型最终可见文本,而非假设存在推理内容。kimi-k2.6 的当前示例不要求调用者传入 enabled;不要从其他厂商照搬 reasoning_effort 或自造 thinking 值。若成本、时延或工具轨迹依赖思考配置,先在目标地区、精确模型和 SDK 版本上做非敏感集成验证,再把结果写入路由/评测基线。
6. Function Calling
import json # 用于解析模型函数参数和序列化工具结果。
def get_weather(city: str) -> dict: # 定义由宿主程序实际执行的无副作用教学工具。
return {"city": city, "temperature": 25, "unit": "celsius"} # 返回离线固定数据,避免例子访问真实天气服务。
tools = [{ # 声明模型可选择调用的函数工具。
"type": "function", # 指定工具类别。
"function": { # 描述函数名称、用途和输入 schema。
"name": "get_weather", # 必须与宿主的工具白名单一致。
"description": "查询指定城市的天气。", # 帮助模型选择工具。
"parameters": { # 使用 JSON Schema 限制参数。
"type": "object", # 参数必须是对象。
"properties": {"city": {"type": "string"}}, # 只允许 city 字符串字段。
"required": ["city"], # 调用时必须提供 city。
},
},
}]
messages = [{"role": "user", "content": "上海现在多少度?"}] # 初始化会在工具轮次间保存的消息历史。
first = client.chat.completions.create( # 先让模型决定是否需要调用工具。
model="kimi-k2.6", # 选择支持工具调用的模型。
messages=messages, # 发送当前用户问题。
tools=tools, # 提供允许执行的工具契约。
)
assistant_message = first.choices[0].message # 取得模型消息及可能存在的 tool_calls。
messages.append(assistant_message) # 原样保存 assistant 消息,保留扩展字段和调用关联信息。
for tool_call in assistant_message.tool_calls or []: # 遍历所有工具调用;未调用时安全跳过。
arguments = json.loads(tool_call.function.arguments) # 解析模型传来的 JSON 参数;生产代码须先做 schema、权限和语义校验。
result = get_weather(**arguments) # 将通过校验的参数解包传给本地函数。
messages.append({ # 添加一条与当前调用 ID 对应的工具结果。
"role": "tool", # 声明消息承载本地工具执行结果。
"tool_call_id": tool_call.id, # 精确关联模型发起的调用。
"content": json.dumps(result, ensure_ascii=False), # 序列化结果为 JSON,并保留中文字符。
})
if assistant_message.tool_calls: # 只有实际执行过工具时才请求模型续接。
final = client.chat.completions.create( # 让模型基于回传的工具结果生成最终答案。
model="kimi-k2.6", # 使用与工具决策轮一致的模型。
messages=messages, # 包含完整 assistant 消息与对应 tool 结果。
tools=tools, # 继续提供同一工具 schema。
)
print(final.choices[0].message.content) # 输出最终文本回答。Kimi 思考模型进行多步工具调用时,通常要完整保留 assistant 消息中的扩展字段。最稳妥的做法是直接把 SDK 返回的 assistant message 追加到历史,而不是只复制文本。
7. 上传并解析文件
from pathlib import Path # 用 Path 表示本地文件路径,避免手工拼接分隔符。
file_path = Path(r"D:\data\paper.pdf") # 替换为拥有上传和处理授权的实际 PDF 路径。
with file_path.open("rb") as file_handle: # 以二进制只读方式打开文件,并在退出后自动关闭句柄。
uploaded = client.files.create( # 上传文件并保存服务返回的文件对象。
file=file_handle, # 将已打开的二进制文件作为上传内容。
purpose="file-extract", # 声明该文件用于服务端解析提取。
)
file_content = client.files.content(file_id=uploaded.id).text # 读取服务解析出的文本;生产代码要考虑大小和敏感数据边界。
response = client.chat.completions.create( # 基于解析后的文档文本发起总结请求。
model="kimi-k2.6", # 选择本例的文本模型。
messages=[ # 将提取内容和用户任务作为对话上下文。
{"role": "system", "content": file_content}, # 将文件正文作为系统上下文;真实应用应做分块、权限与长度控制。
{"role": "user", "content": "总结文档并列出三个关键结论。"}, # 指定文档分析任务。
],
)
print(response.choices[0].message.content) # 输出文档总结文本。较新的 Kimi API 也可能支持在消息中用 ms://<file_id> 引用文件。两种方式不要混写,应按当前 Chat API 的 File reference 说明选择。
文件管理示例:
for item in client.files.list().data: # 遍历当前账号可见的已上传文件。
print(item.id, item.filename) # 显示文件标识和名称,避免打印不必要的文件内容。
client.files.delete(uploaded.id) # 删除本例刚上传的文件;生产代码应确认保留策略和目标 ID。8. 查看模型
models = client.models.list() # 向服务查询当前账户可见的模型列表。
for model in models.data: # 遍历每个模型对象。
print(model.id) # 输出 API 模型 ID,供后续在官方能力表中核验。这比从旧博客复制模型名更可靠,但模型能力、上下文和计费仍要查官方模型说明。
常见易错点
- 中国与国际 endpoint、API Key 混用。
- 忘记配置
base_url,请求被发到 OpenAI。 - Kimi 特有字段没有放进
extra_body。 - 思考/工具调用只保留文本,丢失
reasoning_content或tool_calls。 - 依赖正在升级且当前文档明确不建议使用的
web_search作为生产检索合同。 - 文件上传后没有读取解析内容或按 API 要求引用文件。
- 长对话无限追加,最终超过上下文或成本过高。
官方延伸阅读
返回 厂商 AI API 参考目录;通用 HTTP 契约与可靠性见 API 学习目录。