8. Agent API 协议规范¶
概述¶
本文档描述了与AI智能体通信的结构化JSON协议。该协议定义了支持以下功能的消息、请求和响应:
流式内容传输
工具/函数调用
多模态内容(文本、图像、数据)
全生命周期的状态跟踪
错误处理
协议结构¶
1. 核心枚举¶
角色:
class Role:
ASSISTANT = "assistant"
USER = "user"
SYSTEM = "system"
TOOL = "tool" # 新增:工具角色
消息类型:
class MessageType:
MESSAGE = "message"
FUNCTION_CALL = "function_call"
FUNCTION_CALL_OUTPUT = "function_call_output"
PLUGIN_CALL = "plugin_call"
PLUGIN_CALL_OUTPUT = "plugin_call_output"
COMPONENT_CALL = "component_call"
COMPONENT_CALL_OUTPUT = "component_call_output"
MCP_LIST_TOOLS = "mcp_list_tools"
MCP_APPROVAL_REQUEST = "mcp_approval_request"
MCP_TOOL_CALL = "mcp_call"
MCP_APPROVAL_RESPONSE = "mcp_approval_response"
REASONING = "reasoning" # 新增:推理过程消息类型
HEARTBEAT = "heartbeat"
ERROR = "error"
@classmethod
def all_values(cls):
"""返回MessageType中所有常量值"""
return [
value
for name, value in vars(cls).items()
if not name.startswith("_") and isinstance(value, str)
]
运行状态:
class RunStatus:
Created = "created"
InProgress = "in_progress"
Completed = "completed"
Canceled = "canceled"
Failed = "failed"
Rejected = "rejected"
Unknown = "unknown"
Queued = "queued" # 新增:排队状态
Incomplete = "incomplete" # 新增:未完成状态
2. 工具定义¶
函数参数:
class FunctionParameters(BaseModel):
type: str # 必须为 "object"
properties: Dict[str, Any]
required: Optional[List[str]]
函数工具:
class FunctionTool(BaseModel):
name: str
description: str
parameters: Union[Dict[str, Any], FunctionParameters]
工具:
class Tool(BaseModel):
type: Optional[str] = None # 目前仅支持 "function"
function: Optional[FunctionTool] = None
函数调用:
class FunctionCall(BaseModel):
"""
助手提示消息工具调用函数的模型类
"""
call_id: Optional[str] = None
"""工具调用的ID"""
name: Optional[str] = None
"""要调用的函数名称"""
arguments: Optional[str] = None
"""调用函数的参数,由模型生成的JSON格式
注意:模型生成的JSON不一定有效,可能产生未定义的参数。
在调用函数前请验证参数有效性
"""
函数调用输出:
class FunctionCallOutput(BaseModel):
"""
助手提示消息工具调用函数的模型类
"""
call_id: str
"""工具调用的ID"""
output: str
"""函数执行结果"""
3. 内容模型¶
基础内容模型:
class Content(Event):
type: str
"""内容部分的类型"""
object: str = "content"
"""内容部分的标识"""
index: Optional[int] = None
"""在消息内容列表中的索引位置"""
delta: Optional[bool] = False
"""是否为增量内容"""
msg_id: str = None
"""消息唯一ID"""
专用内容类型:
class ImageContent(Content):
type: str = ContentType.IMAGE
"""内容部分的类型"""
image_url: Optional[str] = None
"""图片URL详情"""
class TextContent(Content):
type: str = ContentType.TEXT
"""内容部分的类型"""
text: Optional[str] = None
"""文本内容"""
class DataContent(Content):
type: str = ContentType.DATA
"""内容部分的类型"""
data: Optional[Dict] = None
"""数据内容"""
class AudioContent(Content):
type: str = ContentType.AUDIO
"""内容部分的类型"""
data: Optional[str] = None
"""音频数据详情"""
format: Optional[str] = None
"""音频数据格式"""
class FileContent(Content):
type: str = ContentType.FILE
"""内容部分的类型"""
file_url: Optional[str] = None
"""文件URL详情"""
file_id: Optional[str] = None
"""文件ID详情"""
filename: Optional[str] = None
"""文件名详情"""
file_data: Optional[str] = None
"""文件数据详情"""
class RefusalContent(Content):
type: str = ContentType.REFUSAL
"""内容部分的类型"""
refusal: Optional[str] = None
"""拒绝内容"""
4. 消息模型¶
class Message(Event):
id: str = Field(default_factory=lambda: "msg_" + str(uuid4()))
"""消息唯一ID"""
object: str = "message"
"""消息标识"""
type: str = "message"
"""消息类型"""
status: str = RunStatus.Created
"""消息状态:in_progress, completed 或 incomplete"""
role: Optional[str] = None
"""消息作者角色,应为 `user`,`system`, 'assistant'"""
content: Optional[
List[Union[TextContent, ImageContent, DataContent]]
] = None
"""消息内容"""
code: Optional[str] = None
"""消息错误代码"""
message: Optional[str] = None
"""消息错误描述"""
关键方法:
add_delta_content(): 向现有消息追加部分内容content_completed(): 标记内容片段为完成状态add_content(): 添加完整的内容片段
5. 请求模型¶
基础请求:
class BaseRequest(BaseModel):
input: List[Message]
stream: bool = True
智能体请求:
class AgentRequest(BaseRequest):
model: Optional[str] = None
top_p: Optional[float] = None
temperature: Optional[float] = None
frequency_penalty: Optional[float] = None
presence_penalty: Optional[float] = None
max_tokens: Optional[int] = None
stop: Optional[Union[Optional[str], List[str]]] = None
n: Optional[int] = Field(default=1, ge=1, le=5)
seed: Optional[int] = None
tools: Optional[List[Union[Tool, Dict]]] = None
session_id: Optional[str] = None
response_id: Optional[str] = None
6. 响应模型¶
基础响应:
class BaseResponse(Event):
sequence_number: str = None
id: str = Field(default_factory=lambda: "response_" + str(uuid4()))
object: str = "response"
created_at: int = int(datetime.now().timestamp())
completed_at: Optional[int] = None
error: Optional[Error] = None
output: Optional[List[Message]] = None
usage: Optional[Dict] = None
智能体响应:
class AgentResponse(BaseResponse):
session_id: Optional[str] = None
7. 错误模型¶
class Error(BaseModel):
code: str
message: str
协议流程¶
请求/响应生命周期¶
客户端发送
AgentRequest,包含:输入消息
生成参数
工具定义
会话上下文
服务端响应
AgentResponse对象流,包含:状态更新 (
created→in_progress→completed)带内容片段的输出消息
最终使用指标
内容流式传输¶
当请求中 stream=True 时:
文本内容以
delta=true片段增量发送每个片段包含指向目标内容槽的
index最终片段通过
status=completed标记完成
流式传输示例:
{"status":"created","id":"response_...","object":"response"}
{"status":"created","id":"msg_...","object":"message","type":"assistant"}
{"status":"in_progress","type":"text","index":0,"delta":true,"text":"Hello","object":"content"}
{"status":"in_progress","type":"text","index":0,"delta":true,"text":", ","object":"content"}
{"status":"in_progress","type":"text","index":0,"delta":true,"text":"world","object":"content"}
{"status":"completed","type":"text","index":0,"delta":false,"text":"Hello, world!","object":"content"}
{"status":"completed","id":"msg_...","object":"message", ...}
{"status":"completed","id":"response_...","object":"response", ...}
状态转换¶
状态 |
描述 |
|---|---|
|
对象创建时的初始状态 |
|
操作正在处理中 |
|
操作成功完成 |
|
操作因错误终止 |
|
操作被系统拒绝 |
|
操作被用户取消 |
最佳实践¶
流处理:
缓冲增量片段直到收到
status=completed使用
msg_id关联内容与父消息尊重多片段消息的
index顺序
错误处理:
检查响应中的
error字段监控
failed状态转换对可恢复错误实施重试逻辑
状态管理:
使用
session_id保持会话连续性跟踪
created_at/completed_at监控延迟使用
sequence_number排序(如已实现)
使用示例¶
用户查询:
{
"input": [{
"role": "user",
"content": [{"type": "text", "text": "描述这张图片"}],
"type": "message"
}],
"stream": true,
"model": "gpt-4-vision"
}
智能体响应流:
{"id":"response_123","object":"response","status":"created"}
{"id":"msg_abc","object":"message","type":"assistant","status":"created"}
{"status":"in_progress","type":"text","index":0,"delta":true,"text":"这张","object":"content","msg_id":"msg_abc"}
{"status":"in_progress","type":"text","index":0,"delta":true,"text":"图片显示...","object":"content","msg_id":"msg_abc"}
{"status":"completed","type":"text","index":0,"delta":false,"text":"这张图片显示...","object":"content","msg_id":"msg_abc"}
{"id":"msg_abc","status":"completed","object":"message"}
{"id":"response_123","status":"completed","object":"response"}
Agent API 协议构建方式¶
Agent API 协议提供了分层Builder模式来生成符合协议规范的流式响应数据。通过使用 agent_api_builder 模块,开发者可以轻松构建复杂的流式响应序列。
1. 构建器架构¶
Agent API 构建器采用三层架构设计:
ResponseBuilder: 响应构建器,负责管理整个响应流程
MessageBuilder: 消息构建器,负责构建和管理单个消息对象
ContentBuilder: 内容构建器,负责构建和管理单个内容对象
2. 核心类说明¶
ResponseBuilder(响应构建器)¶
from agentscope_runtime.engine.helpers.agent_api_builder import ResponseBuilder
# 创建响应构建器
response_builder = ResponseBuilder(session_id="session_123")
# 设置响应状态
response_builder.created() # 创建状态
response_builder.in_progress() # 进行中状态
response_builder.completed() # 完成状态
# 创建消息构建器
message_builder = response_builder.create_message_builder(
role="assistant",
message_type="message"
)
MessageBuilder(消息构建器)¶
# 创建内容构建器
content_builder = message_builder.create_content_builder(
content_type="text",
index=0
)
# 添加内容到消息
message_builder.add_content(content)
# 完成消息构建
message_builder.complete()
ContentBuilder(内容构建器)¶
# 添加文本增量
content_builder.add_text_delta("Hello")
content_builder.add_text_delta(" World")
# 设置完整文本内容
content_builder.set_text("Hello World")
# 设置图片内容
content_builder.set_image_url("https://example.com/image.jpg")
# 设置数据内容
content_builder.set_data({"key": "value"})
# 完成内容构建
content_builder.complete()
3. 完整使用示例¶
以下示例展示如何使用Agent API构建器生成完整的流式响应序列:
from agentscope_runtime.engine.helpers.agent_api_builder import ResponseBuilder
def generate_streaming_response(text_tokens):
"""生成流式响应序列"""
# 创建响应构建器
response_builder = ResponseBuilder(session_id="session_123")
# 生成完整的流式响应序列
for event in response_builder.generate_streaming_response(
text_tokens=["Hello", " ", "World", "!"],
role="assistant"
):
yield event
# 使用示例
for event in generate_streaming_response(["Hello", " ", "World", "!"]):
print(event)
4. 流式响应序列¶
使用 generate_streaming_response 方法可以生成标准的流式响应序列:
响应创建 (
response.created)响应开始 (
response.in_progress)消息创建 (
message.created)内容流式输出 (
content.delta事件)内容完成 (
content.completed)消息完成 (
message.completed)响应完成 (
response.completed)
5. 支持的内容类型¶
ContentBuilder 支持多种内容类型:
TextContent: 文本内容,支持增量输出
ImageContent: 图片内容,支持URL和base64格式
DataContent: 数据内容,支持任意JSON数据
AudioContent: 音频内容,支持多种音频格式
FileContent: 文件内容,支持文件URL和文件数据
RefusalContent: 拒绝内容,用于表示拒绝执行
6. 最佳实践¶
状态管理: 确保按正确顺序调用状态方法(created → in_progress → completed)
内容索引: 为多内容消息正确设置index值
增量输出: 使用add_delta方法实现流式文本输出
错误处理: 在构建过程中适当处理异常情况
资源清理: 及时调用complete方法完成构建
7. 高级用法¶
多内容消息构建¶
# 创建包含文本和图片的消息
message_builder = response_builder.create_message_builder()
# 添加文本内容
text_builder = message_builder.create_content_builder("text", index=0)
text_builder.set_text("这是一张图片:")
text_builder.complete()
# 添加图片内容
image_builder = message_builder.create_content_builder("image", index=1)
image_builder.set_image_url("https://example.com/image.jpg")
image_builder.complete()
# 完成消息
message_builder.complete()
数据内容构建¶
# 创建包含结构化数据的消息
data_builder = message_builder.create_content_builder("data", index=0)
# 设置数据内容
data_builder.set_data({
"type": "function_call",
"name": "get_weather",
"arguments": '{"city": "Beijing"}'
})
# 添加数据增量
data_builder.add_data_delta({"status": "processing"})
data_builder.add_data_delta({"result": "sunny"})
data_builder.complete()
通过使用Agent API构建器,开发者可以轻松构建符合协议规范的复杂流式响应,实现更好的用户体验和更灵活的响应控制。