创建模型
每个模型接收一个凭证、一个模型名,以及可选的 API 专属Parameters 对象。下面三个 tab 分别展示流式、工具调用与推理三种典型初始化场景:
调用模型
通过传入一组Msg 对象(以及可选的 tools 和 tool_choice)调用模型:
stream 设置:
stream=False:返回单个ChatResponse,承载完整输出。stream=True:返回AsyncGenerator[ChatResponse, None]。中间 chunk(is_last=False)只携带增量内容;最后一个 chunk(is_last=True)承载完整的累积内容。
ChatResponse 包含若干内容块(TextBlock、ThinkingBlock、ToolCallBlock、DataBlock)、一个 is_last 标志、一个 finished_reason(FinishedReason.COMPLETED 或 FinishedReason.INTERRUPTED),以及记录 token 数与耗时的 ChatUsage。
中断模型调用
模型层的中断指的是异步取消:模型调用运行在 asyncio 任务中,取消该任务(触发asyncio.CancelledError)即可停止进行中的 API 请求,典型场景是用户在智能体推理过程中发起打断。
被取消时,ChatModelBase.__call__ 不会丢弃已生成的部分输出,而是捕获取消并返回一个最终 ChatResponse,其中包含已累积的内容,并将 finished_reason 标记为 FinishedReason.INTERRUPTED;正常结束时为 FinishedReason.COMPLETED,因此下游代码始终可以区分完整回答与被截断的回答:
Agent 类基于同样的机制停止运行中的推理-行动循环,并保持上下文一致。智能体层面的行为参见中断智能体。
生成结构化输出
当需要返回符合 Pydantic 模型或 JSON schema 的结构化结果时,调用generate_structured_output 而非 __call__。它返回一个 StructuredResponse,其 content 是经过 schema 校验的 dict:
generate_structured_output 会基于 schema 合成一个强制工具调用,再对模型输出做校验与修复。格式化器
格式化器(Formatter)负责把 AgentScope 的Msg 对象转换为各模型 API 期望的 list[dict] 载荷。它通过模型构造函数中可选的 formatter 参数配置。AgentScope 为每种 API 都内置了两种格式化器:
切换到多智能体模式只需传入 MultiAgent 变体,无需修改智能体代码:
FormatterBase 实现自定义格式化器,并通过同一个 formatter 参数传入。
自定义模型 API
开发者可以通过实现一个凭证与一个模型类,并注册该凭证,把自定义模型 API 接入 AgentScope。步骤 1:定义凭证
继承CredentialBase,使用唯一的 type 判别字段,并实现 get_chat_model_class():
步骤 2:实现模型类
继承ChatModelBase,定义内部 Parameters 类,并实现 _call_api。基类负责重试、流式累积与中断处理,因此 _call_api 只需要把 API 返回结果转换为 AgentScope 的 ChatResponse chunk:
对流式的自定义模型而言,直接以
ChatResponse(content=..., is_last=False) 产出增量返回即可。如果 _call_api 结束时没有产出 is_last=True 的最终 chunk,ChatModelBase.__call__ 会通过 ChatResponse.append_chat_response() 自动累积这些增量并返回最终响应;如果流式过程被取消,则会返回带有部分累积内容且 finished_reason=FinishedReason.INTERRUPTED 的响应。步骤 3:添加模型卡片(可选)
把 YAML 文件放在模型实现旁边的_models/ 目录里。每个文件描述一个模型:它的能力(input_types、output_types)、上限(context_size、output_size),以及该模型专属的 parameter_overrides(完整卡片格式参见前端集成):
MyProviderChatModel.list_models() 会加载该目录下的所有 YAML。如果想从其他位置(例如应用自己维护的模型注册表)拉取模型卡片,传入 custom_yaml_dir: