Skip to main content

Functions

query()

SDK 的主入口函数。创建一个 async iterator,按消息到达顺序流式输出消息。

参数

返回值

返回 AsyncIterator[Message],通过 async for 消费。

QoderSDKClient

基于类的多轮会话 API。适合需要在多轮之间保持会话状态、动态切换模型或权限模式的场景。

client.query()

在当前长连接会话中发送用户消息。priority="now" 停止当前回复并立即处理,"next" 在下一个合适的时机处理,"later" 等当前回复结束后处理。should_query=False 会把消息加入对话,但不会仅凭这条消息触发回复。处理时机仍由 priority 决定。 message_uuid 用于取消消息和 replay 去重,不要在同一会话内复用。异步可迭代输入不能同时传 message_uuid,应在每个消息字典中分别设置 uuidsession_id 是入站 wire 元数据,不会把消息路由到其他会话;输入始终归属当前连接的 CLI session。

client.interrupt()

停止当前生成或工具执行,但不断开 client,也不会清空排队消息。参见中断当前轮次

client.cancel_async_message()

按 UUID 取消排队中的用户消息。取消成功返回 True;消息不存在或已无法取消时返回 False。参见取消排队消息

client.get_server_info()

返回连接时取得的初始化快照,包含当前会话发现到的 commands、agents、skills 等信息。skills 是发现清单,不代表主会话当前全部可调用。返回类型见 SDKControlInitializeResponse,skill 发现与调用策略见 Skills

client.list_plugins()

读取当前 CLI 的 plugin inventory 和每个 plugin 的资源摘要。它与 get_server_info() 的初始化资源快照是两个独立入口;返回字段见 Plugins 返回值参考

外置会话函数

Python 使用独立的异步函数查看和修改 SessionStore 中的会话。接入方式和行为说明见外置会话存储
directory 用于标识项目,默认使用当前目录。列表与消息函数支持 limitoffset

import_session_to_store()

把已有的本地会话复制到外置存储。

Types

QoderAgentOptions

query()QoderSDKClient 的配置对象。Python SDK 使用 snake_case 字段名。

SessionStore

外置存储适配器需要实现的异步协议。appendload 是必需方法;其余方法是可选能力,可以通过抛出 NotImplementedError 表示未实现。
SessionKey 包含 project_keysession_id 和可选的 subpathSessionStoreEntry 是不透明的 JSON-safe 字典。行为要求见外置会话存储

SessionStoreFlushMode

InMemorySessionStore

用于开发和测试的内置存储。它实现全部可选能力,并额外提供 get_entries(key)sizeclear()。进程退出后数据会丢失。

SDKSessionInfo

外置会话列表和查询函数返回的会话元数据。
file_size 表示可用时的序列化会话数据大小。时间字段使用 Unix 毫秒时间戳。

SessionMessage

会话和子代理消息函数返回的历史用户或助手消息。

Settings

QoderAgentOptions.settings 可以传 settings 文件路径,也可以直接传 dict[str, Any]。SDK 会把对象中的键原样传给 CLI,因此 settings 键仍使用 camelCase。下面列出与 skill 相关的字段;默认值和实际效果取决于配套 CLI 版本。

skillOverrides

按 skill 名控制发现和可见性。插件 skill 使用插件限定名 plugin:skill,其它来源使用裸名;匹配时先检查完整名称,再回退到裸名。 完整的会话级 skill 配置见 Skills

SDKControlInitializeResponse

client.get_server_info() 返回的初始化快照。
这里的 skills 是带元数据的发现清单。消息流中的 SystemMessage(subtype="init").data["skills"] 是名称列表 list[str],两者不是同一个返回结构。

认证

便捷用法见 SDK 认证

Agents Reference

本页汇总 SDK Agent 相关的稳定配置项。入门和使用场景见 子 Agent 使用指南

可用 Agent 来源

当前会话可用的 Agent 可能来自多个来源: 交互式 CLI 中可以通过 /agents 查看当前发现的 Agent;命令行可以运行 qodercli agents list。Python SDK 中可以在 QoderSDKClient 连接完成后调用 client.supported_agents() 获取当前会话可用 Agent 的摘要。

QoderAgentOptions.agents

类型: dict[str, AgentDefinition] | None 注册当前会话可用的自定义 Agent。dict key 是 Agent 名称,value 是该 Agent 的定义。
必须包含 Agent 工具:自定义子 Agent 需要主会话通过内置 Agent 工具发起委派,因此 allowed_tools 中必须包含 Agent 工具。
注册后,模型可通过内置 Agent 工具调用这些子 Agent。主会话要能委派任务,工具集中必须存在 Agentallowed_tools=["Agent"] 是必需的预授权写法。如果你使用 tools 收窄主会话可用工具,也要把 Agent 放进去。

QoderAgentOptions.agent

类型: str | None 指定主会话以哪个 Agent 身份运行。值可以是 agents 中注册的名称,也可以是当前 CLI 已发现的内置 / 插件 Agent 名称。
设置后,主会话使用该 Agent 的 promptmodel 和工具限制。省略时使用默认主会话行为。

AgentDefinition

自定义 Agent 的定义。Python SDK 的 AgentDefinition 是 dataclass,字段名使用协议风格 camelCase。下列字段是当前版本 SDK 覆盖并经过功能测试验证的稳定能力。
Python SDK 会把 AgentDefinition 通过 dataclasses.asdict() 序列化进 initialize 请求;qodercli 再按当前 Agent schema 解析。

description

描述 Agent 适合处理什么任务。它会影响模型是否选择该 Agent。
建议写清楚触发场景。避免只写 Helpful assistant 这类宽泛描述。

prompt

Agent 的系统提示词,用来定义角色、约束和输出格式。

tools

Agent 可用工具白名单。设置后,Agent 只能使用列出的工具。
省略 tools 时,使用子 Agent 默认工具表。子 Agent 的工具表不继承主会话 allowed_tools 的裁剪。

disallowedTools

从 Agent 工具集中排除指定工具。
省略 disallowedTools 时,子 Agent 不继承主会话 disallowed_tools 的裁剪。通常不要同时设置 toolsdisallowedTools,除非你明确知道最终工具集合。

model

为 Agent 指定模型,省略时使用会话默认模型。Python 类型层面是 str | None,SDK 不在本地限制具体字符串。常见模型级别包括: Agent 还支持两个特殊写法:

mcpServers

限制或增加该 Agent 可用的 MCP server。每个 entry 可以是会话级 server 名称,也可以是一个内联 server 配置映射。 引用会话级 MCP server:
给某个 Agent 配专属 MCP server:
只想暴露某个 MCP 工具时,同时配置 tools=["mcp__server__tool"],避免把该 server 的全部工具都暴露给 Agent。

skills

预加载到 Agent 上下文的 skill 名称列表。支持普通 skill 名称,也支持插件限定名。
会话级 skill 行为见 Skills

initialPrompt

当该 Agent 通过 QoderAgentOptions.agent 成为主会话 Agent 时,自动作为首轮用户输入提交。
该字段只对主会话 Agent 生效。作为子 Agent 被 Agent 工具调用时会被忽略。

maxTurns

限制 Agent 的最大 API 轮次。适合控制成本、执行时间和循环风险。

effort

控制 Agent 的推理努力级别。更高的 effort 通常适合复杂审查、架构分析和高风险变更,但会增加延迟和 token 消耗。

permissionMode

控制该 Agent 内部工具执行的权限模式。它和会话级 permission_mode 使用同一组语义,但作用范围只限这个 Agent。会话级权限链路、allowed_tools / disallowed_tools / can_use_tool 的优先级和示例见 权限控制
权限语义介绍见 权限控制

AgentInfo

QoderSDKClient.supported_agents() 返回的 Agent 摘要。
Python SDK 当前没有导出名为 AgentInfo 的 TypedDict;supported_agents() 的返回类型是 list[dict[str, Any]]。上面的结构是实际返回 dict 的稳定字段约定。
返回列表可能包含通过 agents 注册的 Agent,也可能包含当前 CLI 发现的内置、项目、用户或插件 Agent。实际可用项取决于 qodercli 版本和当前配置。

上下文与调用边界

  • 子 Agent 使用独立上下文,不接收父会话完整历史。
  • 父会话传给子 Agent 的主要信息,是调用 Agent 工具时传入的任务 prompt。
  • 子 Agent 的中间工具结果不会直接进入父会话;父会话收到的是子 Agent 最终返回。
  • 子 Agent 不能再生成自己的子 Agent,因此不要把 Agent 放进子 Agent 的 tools
  • initialPrompt 只对 agent 指定的主会话 Agent 生效。

相关文档

Model Policy

query() 的动态模型选择能力。两种模式:固定模型(不传 resolve_model,使用 options.model 或后端默认)与动态回调模式(传入 resolve_model,每次 LLM 调用前由回调决定模型)。完整概念、触发时机与错误处理见 Model Policy

options.resolve_model

类型: ModelPolicyProvider 动态回调模式入口。传入即进入动态回调模式,每次 LLM 请求前 SDK 都会调用该回调拿模型;回调返回的 model 是该次请求的最终模型,不会自动降级

options.resolve_model_timeout_ms

类型: int,默认 500 回调超时(毫秒)。超时后抛 ModelPolicyTimeoutError,query 失败,不降级。仅在传入 resolve_model 时生效。

ModelPolicyProvider

回调函数签名。同步或异步均可。
触发时机按 QoderModelPurpose 区分: 行为要点:
  • 同一会话内会触发多次(每个 turn / tool / 子任务前都会再问一次)。
  • 回调返回的 model 是该次请求的最终模型,SDK 不再做二次校验。
  • 抛异常或返回空 model 让 query 直接失败,详细错误处理见 Model Policy — 错误处理

ModelPolicyContext

回调每次接收的上下文。

QoderModelPurpose

ModelPolicyResult

回调返回值。
支持的 parameters 键: model 形式:
  • 字符串 — 后端支持的模型 ID(如 auto / performance / glm51),具体可用值由 client.get_available_models() 实时返回。必须非空,否则 query 失败。
  • CustomModel 对象(BYOK) — SDK 自动提取对象里的 model 字段作为本次调用的模型标识,其余字段作为凭证转发给 CLI 路由到第三方 LLM。

CustomModel

BYOK 凭证。在 resolve_model 回调里把 model 字段直接设为该对象,本次 LLM 请求会路由到第三方 provider。
注意:
  • provider 必须命中目录里的 key,否则后端鉴权失败。
  • api_key 错误时鉴权失败让 query 直接失败(动态回调模式不降级)。
  • BYOK 调用平台 total_cost_usd 计为 0,token 用量按真实值上报,由 provider 侧扣费。

BYOK 目录类型

client.list_byok_providers() 返回的 provider/model 目录。

BYOKProviderInfo

BYOKFieldInfo

BYOKModelTypeInfo

BYOKModelInfo

ModelInfo

client.get_available_models() 返回的可用模型摘要,也作为 ModelPolicyContext.availableModels 的元素类型。

ModelContextConfig

模型的上下文窗口配置,按层级标签(如 "200K""1M")索引。

ModelThinkingConfig

模型的思考(推理)配置。

ModelPromotion

CLI 从模型列表 API 透传的优惠/折扣信息。嵌套字段名保持服务端的 snake_case 形式。

ServerModelJson

模型列表 API 返回的 JSON 兼容原始模型条目。服务端新增字段尚未进入 ModelInfo 一等字段时,可以从这里读取。

UsageInfo

client.get_usage_info() 返回的账号配额与用量快照。
各额度桶均以 unit(通常为 credits)为单位,按 total(组织包为 cap)给出 used / remaining / percentage。 缺失字段或运行时类型不符合预期的字段会从返回字典中省略。

ModelPolicyTimeoutError

resolve_model 回调超过 options.resolve_model_timeout_ms 仍未返回时由 SDK 抛出,query 直接失败,不降级。

client.set_model()

运行中切换固定模型模式下的模型,下一次 LLM 调用生效。仅在固定模型模式下生效;动态回调模式下调用不会覆盖回调结果。可用模型 ID 见 ModelInfo.value

client.set_proxy()

设置或清除当前 qodercli 会话的代理。支持 http://https://socks5://socks://。传 None 或空字符串可清除代理。

client.get_available_models()

实时拉取当前账号可用的模型列表。返回最新结果,不缓存;暂时无法获取时返回空列表,不抛异常。动态回调模式下 ModelPolicyContext.availableModels 已实时携带相同列表,无需额外调用。

client.list_byok_providers()

返回当前账号可用的 BYOK provider/model 目录数组:
  • 返回 None:CLI 不支持该接口(兼容降级,不抛异常)。
  • 返回数组(可能为空):当前账号可用的 provider 列表(空数组表示账号未开通 BYOK)。
字段语义见 BYOK 目录类型

client.get_usage_info()

实时获取当前账号的配额与用量信息(由运行中的 CLI 返回)。
  • 返回 None:CLI 未登录、旧版本 CLI 不支持该接口,或 CLI 未返回字典(兼容降级,不抛异常)。
  • 返回 UsageInfo 字典:运行时类型合法的账号配额与用量字段。缺失或类型不合法的字段会被省略。
返回类型见 UsageInfo

CanUseTool

宿主自定义的工具权限审批回调。

ToolPermissionContext

完整使用与例子见 权限控制

PermissionMode

更多权限链路说明见 权限控制

PermissionResult

CanUseTool 的返回值。
allow.updated_input 修改后会替换工具实际收到的入参。deny.interrupt=True 拒绝同时中断 Agent。 can_use_tool 收到的 tool_name 是完整工具名,例如 "Bash""Read""mcp__orders__lookup_order"

McpServerConfig

MCP 服务器配置,传给 QoderAgentOptions.mcp_servers

McpStdioServerConfig

McpSSEServerConfig

McpHttpServerConfig

McpSdkServerConfig

create_sdk_mcp_server() 工厂返回,见 MCP - In-Process Server

McpServerToolPolicy

SdkPluginConfig

加载本地插件。

SettingSource

控制加载哪些 filesystem settings。
省略时按 CLI 默认加载所有源;传 [] 完全跳过。

Cloud Agent Reference

本节汇总 Cloud Agent experimental runtime 的配置类型。入门和使用场景见 Cloud Agent

CloudAgentOptions

QoderAgentOptions.experimental_cloud_agent 的类型。Cloud runtime 的 agent / session 引用配置;完整用法见 Cloud Agent
互斥约束
  • agent["id"]agent["create"] 互斥。
  • session["id"]session["create"] 互斥。
  • session["id"]不允许同时传 agent(session 自身已绑定 agent)。

AgentCreateParams (Cloud)

新建 Cloud Agent 的请求体,对应 Qoder Cloud OpenAPI 的 agent create 字段。

BetaManagedAgentsAgentToolset20260401Params

BetaManagedAgentsURLMCPServerParams

BetaManagedAgentsSkillParams


CloudSessionCreateParams

新建 Cloud session 的请求体。

CloudSessionResource


CloudAgentStreamOptions

SSE replay 和 delta 选项。Python SDK 同时接受 snake_case 和 camelCase。

CloudAgentEventMessage

Cloud runtime(options.experimental_cloud_agent)下,从 Qoder Cloud session SSE 流转发的事件。完整用法见 Cloud Agent

Cloud Agent 错误类型


相关文档

Tools Reference

本页汇总工具相关的稳定 API、内置工具列表和类型定义。使用路径和场景说明见 工具使用指南
说明:Python SDK 当前没有导出 TypeScript SDK 里的内置工具输入 / 输出类型集合,例如 BashInputFileReadInputToolInputSchemas。本页会在对应章节明确标注实现状态。

ToolConfig

TypeScript SDK 提供 options.toolConfig 用于配置部分内置工具行为:
Python SDK 当前没有导出等价的 QoderAgentOptions.tool_config 字段;AskUserQuestion 仍可作为运行时工具名用于 toolsallowed_toolsdisallowed_toolscan_use_tool 和 hooks matcher。

内置工具列表

toolsallowed_toolsdisallowed_toolscan_use_tool、hooks matcher 和 Agent 工具白名单里,内置工具使用下表中的运行时工具名。 自定义 MCP 工具名格式:

tool()

创建一个 SDK MCP 工具定义。Python 版是装饰器风格,handler 通过 @tool(...) 包装。
tool() 本身只定义工具;被装饰的 async handler 是工具被调用时执行的函数。namedescription 和重复工具名等注册约束由 create_sdk_mcp_server() 在注册工具时校验。

input_schema

Python SDK 没有 TypeScript SDK 的 AnyZodRawShape / InferShape。Python 版 input_schema 支持以下形式:
常见 Python 类型转换:

TypeScript-only schema helper types

SdkMcpTool

@tool() 装饰器返回 SdkMcpTool。通常不需要手动构造它。

ToolInvocationContext

handler 可以是单参数或双参数:
当 handler 接收第二个位置参数时,SDK 会传入 ToolInvocationContextextra.signal 会在 CLI 取消正在执行的工具调用时被设置。

ToolAnnotations

Python 版直接使用 mcp.types.ToolAnnotations
这些字段是元信息和调度提示,不是权限开关。是否允许执行仍由 toolsallowed_toolsdisallowed_toolspermission_modecan_use_tool 和 hooks 决定。

create_sdk_mcp_server()

创建一个与 SDK 同进程运行的 MCP server。

CreateSdkMcpServerOptions

TypeScript SDK 使用 CreateSdkMcpServerOptions 对象参数;Python SDK 未导出这个类型,也不使用 options 对象。Python 等价能力就是 create_sdk_mcp_server(name, version="1.0.0", tools=None) 的三个函数参数。

返回值

返回 McpSdkServerConfig,可直接作为 QoderAgentOptions.mcp_servers 的值。

McpServerToolPolicy

tools policy 字段存在于 Python 类型中。它主要用于 MCP server 配置层的工具权限策略;进程内 SDK server 的常见接入仍是通过 allowed_toolsdisallowed_toolspermission_modecan_use_tool 和 hooks 控制。

CallToolResult

Python SDK 不导出自己的 CallToolResult 类型。handler 返回 dict,SDK 将其转换为 MCP 的 CallToolResult

McpToolResultContent

Python SDK 当前识别以下 content block: 与 TS reference 的差异:
  • Python handler 使用 is_error,不是 MCP/TypeScript 的 isError 字段名;SDK 内部会映射为 MCP isError
  • Python handler 顶层 _meta 当前不会透传到 CallToolResult
  • Python call_tool 转换逻辑当前没有处理 audio content block;即使 MCP 类型导入了 AudioContent,handler 返回 {"type": "audio"} 也会进入 unsupported content warning 分支。

can_use_tool

工具权限审批回调定义在通用类型中,放在这里便于查找。

PermissionResult

can_use_tool 收到的 tool_name 是完整工具名,例如 BashReadmcp__orders__lookup_order

MCP status 工具信息

Python SDK 导出 McpToolInfoMcpToolAnnotations,用于描述 QoderSDKClient.get_mcp_status() 返回的 server 工具信息。
注意:status 中的 annotation 字段名是 CLI 投影后的 readOnlydestructiveopenWorld,不是 ToolAnnotations 入参中的 readOnlyHintdestructiveHintopenWorldHintidempotentHint 当前不在 status 工具列表里回显。

内置工具输入输出类型

TypeScript SDK 在类型层提供内置工具的输入 / 输出结构。Python SDK 当前没有导出这些 TypedDict,也没有导出 ToolInputSchemas / ToolOutputSchemas 联合类型。注意:下表中的类型名是 TypeScript reference 类型名;Python 权限配置和工具白名单里仍使用 内置工具列表 中的运行时工具名。 Python 侧公开、稳定可配置的是 内置工具列表 中的运行时工具名。如果需要在 Python 应用里强类型化内置工具参数,建议在业务侧自定义自己的 TypedDict 或 dataclass。

相关文档

Hooks Reference

使用指南和示例见 Hooks

事件概览

HookEvent

可注册的 hook 事件联合类型。

HookCallback

HookMatcher

BaseHookInput

所有 hook 事件的通用输入字段。

HookJSONOutput

Hook 回调的返回类型。
Python SDK 中 continue_ 对应 JSON 的 "continue" 键(避免关键字冲突)。 当多个 hook 返回冲突的 decision 值时,"deny" / "block" 优先(最严格规则生效)。

PreToolUseHookInput

hook_specific_outputhookSpecificOutput):

PostToolUseHookInput

输出行为: hook_specific_outputhookSpecificOutput):
当多个 hook 都设置了 updatedToolOutput 时,最后一个非空值生效。如需链式转换,请在单个回调内按顺序执行。

PostToolUseFailureHookInput

UserPromptSubmitHookInput

hook_specific_outputhookSpecificOutput):

SessionStartHookInput

hook_specific_outputhookSpecificOutput):

SessionEndHookInput

StopHookInput

返回 {"decision": "block", "reason": "..."} 可阻止 AI 停止并强制继续。reason 作为续接提示注入模型上下文。

SubagentStartHookInput

SubagentStopHookInput

PreCompactHookInput

PostCompactHookInput

CwdChangedHookInput

InstructionsLoadedHookInput

FileChangedHookInput

PermissionRequestHookInput

hook_specific_outputhookSpecificOutput): decision 为以下两种之一:
  • 批准: {"behavior": "allow", "updatedInput": {...}, "updatedPermissions": [...]}
  • 拒绝: {"behavior": "deny", "message": "..."}

Message Types

AssistantMessage

AI 的完整回复,按 turn 触达一次。contentTextBlockToolUseBlock 的列表。

UserMessage

CLI 输出流中的用户消息。priorityshould_query 保留消息进入会话时的调度元数据。

ResultMessage

整个会话结束时的最终消息。

SystemMessage

会话系统消息。subtype == "init"data 携带初始化信息(session_id、model、tools 等)。其中 data["skills"] 是 skill 名称列表;带描述和来源的发现清单从 client.get_server_info() 读取。

SDKMirrorErrorMessage

SDK 最终仍无法把一批数据写入外置会话存储时产生的非致命消息。当前 query 会继续执行。

StreamEvent

需启用 include_partial_messages=True,按 token 增量流出。
event["type"] 值: 完整用法见 流式输出

CloudAgentEventMessage

Cloud runtime 下的 SSE 事件消息。仅在 experimental_cloud_agent 模式下出现。完整字段见 Cloud Agent Reference

Content Blocks

AssistantMessage.content 中的元素: