Cohere API 调用

官方来源

基于 Cohere v2 的 Chat、Embed、Rerank、Tool Use 与 Structured Outputs 文档整理。当前 Python 主客户端是 cohere.ClientV2。

常用入口

Python 方法用途
co.chat()文本、多轮、RAG、JSON 和工具调用
co.chat_stream()流式聊天
co.embed()文本、图片或混合内容向量化
co.rerank()按查询相关性重新排序文档

Cohere 的特色是生成、Embedding 与 Rerank 可以组合成 RAG 流程。

安装与设置 API Key

python -m pip install --upgrade cohere  # 安装或更新 Cohere 官方 Python SDK。
$env:COHERE_API_KEY = Read-Host 'COHERE_API_KEY' -MaskInput  # 仅在当前 PowerShell 进程以遮罩方式读取 Key,不写入代码。

1. 文本生成

import os  # 导入环境变量访问接口,避免将 API Key 硬编码到源码中。
import cohere  # 导入 Cohere SDK 主模块。
 
co = cohere.ClientV2(api_key=os.environ["COHERE_API_KEY"])  # 从当前进程读取 Key 并创建 v2 客户端。
 
response = co.chat(  # 发起一轮 v2 Chat 请求。
    model="command-a-plus-05-2026",  # 选择本课示例模型;运行前以官方模型页核对可用性。
    messages=[  # 按角色和时间顺序传入上下文。
        {"role": "system", "content": "你是一个简洁的中文技术老师。"},  # 约束回答风格。
        {"role": "user", "content": "用三点解释 API 调用。"},  # 当前用户问题。
    ],
)
 
print(response.message.content[0].text)  # 输出第一个文本内容块。
print(response.usage)  # 输出服务返回的实际用量。

模型更新较快,应从 Models 核对当前可用 ID,不要继续使用 v1 时代的旧 command 别名。

2. 多轮对话

messages = [  # 在应用侧保存完整历史;API 请求之间不会自动记忆。
    {"role": "system", "content": "你是 Python 老师。"},  # 固定系统指令。
    {"role": "user", "content": "字典是什么?"},  # 第一轮用户问题。
]
 
first = co.chat(model="command-a-plus-05-2026", messages=messages)  # 发送首轮历史并取得回答。
assistant_text = first.message.content[0].text  # 取出第一个文本内容块。
 
messages.append({"role": "assistant", "content": assistant_text})  # 将首轮回答写回历史。
messages.append({"role": "user", "content": "给一个读取键值的例子。"})  # 添加基于前文的追问。
 
second = co.chat(model="command-a-plus-05-2026", messages=messages)  # 用完整历史发起第二轮。
print(second.message.content[0].text)  # 输出第二轮文本回答。

v2 已把当前消息和历史统一放入 messages,不要照搬 v1 的 message= 与 chat_history= 写法。

3. 流式输出

stream = co.chat_stream(  # 请求 v2 Chat 以事件流形式返回生成内容。
    model="command-a-plus-05-2026",  # 选择流式生成的目标模型。
    messages=[  # 提供本轮用户消息。
        {"role": "user", "content": "写一份 Python API 学习建议。"},  # 本轮生成任务。
    ],
)
 
for event in stream:  # 按到达顺序消费每个 Cohere 流事件。
    if event.type == "content-delta":  # 只处理增量文本事件,其他事件有不同结构。
        print(event.delta.message.content.text, end="", flush=True)  # 立即显示这段文本增量。

工具调用和流式响应还会出现其他事件类型;复杂应用应按 event.type 分支处理,而不是假设所有事件都有文本。

4. 结构化 JSON 输出

import json  # 导入标准 JSON 解析器,用于在本地验证结构化响应。
 
response = co.chat(  # 请求模型生成符合 JSON Schema 的学习计划。
    model="command-a-plus-05-2026",  # 选择支持结构化输出的目标模型。
    messages=[{  # 将任务和 JSON 要求明确写进用户消息。
        "role": "user",  # 声明消息来自用户。
        "content": "生成一个 7 天 Python API 学习计划,并输出 JSON。",  # 指定内容目标和输出格式。
    }],
    response_format={  # 声明响应的 JSON 格式及字段约束。
        "type": "json_object",  # 要求响应主体是 JSON 对象。
        "json_schema": {  # 使用 Cohere v2 的 json_schema 字段给出 schema。
            "type": "object",  # 顶层必须是对象。
            "properties": {  # 定义允许的字段和类型。
                "topic": {"type": "string"},  # 学习主题字段。
                "days": {"type": "integer"},  # 计划天数字段。
                "tasks": {"type": "array", "items": {"type": "string"}},  # 任务字符串数组。
            },
            "required": ["topic", "days", "tasks"],  # 要求三个关键字段均存在。
        },
    },
)
 
data = json.loads(response.message.content[0].text)  # 将结构化文本解析为 Python 对象;异常应被调用边界处理。
print(data["tasks"])  # 读取任务列表;生产代码还应校验值域和业务约束。

启用 JSON 输出时,提示中也应明确提到 JSON。v2 Chat reference 中 schema 字段名为 json_schema,不是通用的 schema。同时,response_format 当前不能与 documents 或 tools 组合;需要检索/工具和稳定结构时,应拆成可审计的阶段(例如先检索/执行并核对结果,再由结构化生成步骤消费最小必要事实),而不是假设单次请求能同时承担全部职责。

5. 给 Chat 提供检索文档

documents = [  # 模拟已由上游检索出的少量相关文档。
    "venv 用于隔离项目依赖。",  # 与问题直接相关的候选事实。
    "pip 用于安装 Python 包。",  # 另一条可供模型引用的候选事实。
]
 
response = co.chat(  # 让模型基于显式文档集合回答问题。
    model="command-a-plus-05-2026",  # 选择本例的聊天模型。
    messages=[{"role": "user", "content": "venv 有什么作用?"}],  # 提出需要依据文档回答的问题。
    documents=documents,  # 传入检索阶段已筛选出的文本,不替代检索和权限控制。
)
 
print(response.message.content[0].text)  # 输出模型回答的第一个文本块。
print(response.message.citations)  # 输出引用信息,便于展示或审计证据来源。

这适合把已经检索到的少量相关文档交给模型回答。大规模 RAG 通常先 Embed 检索,再 Rerank,最后 Chat。

6. Embedding

response = co.embed(  # 调用 Embed API,将一批文档文本转换为向量。
    model="embed-v4.0",  # 选择入库与查询时应保持一致的 embedding 模型。
    texts=[  # 批量提供待向量化文本。
        "Python 适合快速开发。",  # 第一条候选文档。
        "Rust 重视性能和内存安全。",  # 第二条候选文档。
    ],
    input_type="search_document",  # 标记这些向量用于检索库中的文档,而不是用户查询。
    output_dimension=1024,  # 指定输出维度;向量库 schema 需与之匹配。
    embedding_types=["float"],  # 请求浮点向量输出。
)
 
vectors = response.embeddings.float  # 取出 SDK 返回的浮点向量列表。
print(len(vectors), len(vectors[0]))  # 检查向量数量和单条维度。

语义搜索时必须区分输入类型:

  • 入库文档:input_type="search_document"
  • 用户查询:input_type="search_query"
  • 分类:classification
  • 聚类:clustering

查询向量示例:

query_response = co.embed(  # 为用户查询生成可与文档向量比较的向量。
    model="embed-v4.0",  # 与入库文档使用同一 embedding 模型。
    texts=["哪种语言适合快速开发?"],  # 提供单条用户查询。
    input_type="search_query",  # 标记这是查询侧输入,与 document 侧语义不同。
    output_dimension=1024,  # 与入库向量维度保持一致。
    embedding_types=["float"],  # 请求浮点向量输出。
)
 
query_vector = query_response.embeddings.float[0]  # 取出第一条查询的向量。

入库与查询要保持同一模型、输出维度和 embedding 类型。

7. Rerank

Rerank 接收一个查询和若干候选文档,返回按相关性重新排序的结果:

documents = [  # 模拟上游向量检索获得的候选文档。
    "venv 用于隔离 Python 项目的依赖。",  # 与依赖隔离高度相关。
    "Git 用于版本控制。",  # 相关性较低的干扰候选。
    "pip 用于安装 Python 包。",  # 与 Python 依赖管理相关的候选。
]
 
response = co.rerank(  # 根据查询与候选文本的语义相关性进行重排。
    model="rerank-v4.0-pro",  # 选择偏质量的 Rerank 模型;实际选型要评估延迟和成本。
    query="如何避免两个 Python 项目的依赖冲突?",  # 提供用户检索意图。
    documents=documents,  # 传入待重排的候选集合。
    top_n=2,  # 只请求排名最靠前的两个结果。
)
 
for result in response.results:  # 遍历服务按相关性排序后的结果。
    print(result.index, result.relevance_score, documents[result.index])  # 输出原始索引、分数和对应文档文本。

rerank-v4.0-pro 偏质量,rerank-v4.0-fast 偏低延迟与高吞吐。Rerank 不生成答案,只负责排序。

8. Function Calling

tools = [{  # 向模型声明一个可选择的函数工具。
    "type": "function",  # 指定工具类别为函数。
    "function": {  # 描述工具名称、用途和输入 schema。
        "name": "get_weather",  # 名称必须和宿主允许执行的工具一致。
        "description": "查询指定城市的天气。",  # 帮助模型选择工具。
        "parameters": {  # 使用 JSON Schema 限制参数。
            "type": "object",  # 参数必须是对象。
            "properties": {"city": {"type": "string"}},  # 只允许 city 字符串字段。
            "required": ["city"],  # 调用时必须提供 city。
        },
    },
}]
 
response = co.chat(  # 请求模型根据用户问题决定是否调用声明工具。
    model="command-a-plus-05-2026",  # 选择支持工具调用的模型。
    messages=[{"role": "user", "content": "上海现在多少度?"}],  # 提供当前用户问题。
    tools=tools,  # 将允许执行的工具 schema 发送给模型。
)
 
for tool_call in response.message.tool_calls or []:  # 遍历模型返回的工具调用;没有调用时安全跳过。
    print(tool_call.function.name, tool_call.function.arguments)  # 仅展示名称和原始参数;执行前仍须做校验与授权。

完整流程还需由 Python 执行函数,并使用对应的 tool_call_id 把工具结果作为 tool 消息发回。执行前必须验证参数。

常见易错点

  • 使用 Client 或 v1 的 message= 写法,却按 v2 文档取响应。
  • 流式事件不判断 event.type。
  • 把 response_format 与 documents 或 tools 合用;当前 v2 Chat reference 不支持该组合。
  • Embedding 入库和查询都使用同一个 input_type。
  • 向量维度或模型不一致,导致无法比较。
  • 把 Rerank 当作生成模型;它只返回排序和相关性分数。
  • 使用过时 Command 模型 ID。

官方延伸阅读

返回 厂商 AI API 参考目录;通用 HTTP 契约与可靠性见 API 学习目录。