附录 B:Python 进程内薄 harness 候选调研
性质:主文 §四的取证附录。上一轮调研是 2026-09-04 的 50 页〈仓库引用;未随包提供〉,本附录只补新前提下的差异,不重复它已核实的事实(Pi 的钩子与事件流、MIT、No MCP;Claude Agent SDK 的四分法与商业条款;DeepSeek Harness 的 Cordis 插件架构等)。 取证日期 2026-09-21。外部事实标来源 URL(清单见 §六),源码引用给文件路径与行号(版本或 commit 一并标出);仓库内事实标
路径:行号。 标注:【事实】=一手来源直接可证;【推断】=由事实推出、未实机验证;【待验证】=有线索未坐实或查不到。 取证方式:七个候选分别由独立子代理按同一提纲取证(官方文档、GitHub 源码与 Releases、PyPI/npm 注册表 JSON、LICENSE),Pi 的 agent loop 由本人在浅克隆(commit3390bd9,2026-09-20)上逐文件核。Tavily 搜索当天配额耗尽,改用 crawl4ai 直读官方页与 GitHub/PyPI/npm 的 REST 接口,未影响取证范围。
新前提(与 50 页不同之处,本附录一切打分以此为准)
| 项 | 50 页(0904) | 本轮(0921) |
|---|---|---|
| 运行环境层 | agent-hub-daemon,每会话一容器 |
平台自己的 FastAPI(Python 3.12)进程内,SSE 流式 |
| 助手定位 | 未细分,按通用 agent 评 | 组织者型对话助手:理解→拆解→匹配能力→请求确认;不产内容、不需沙箱与文件系统 |
| 工具面 | MCP 是硬约束 | 平台注册的 Python 函数(与界面同一套模块接口),不要求 MCP |
| 模型 | 经 daemon 的 Provider Registry | 经公司 OpenAI 兼容网关(含 GLM 等国产模型) |
| 确认门/护栏/记忆 | 看候选开箱度 | 平台自建,候选只需给可续跑的本地挂载点 |
| 用户 | 未区分 | C 端,首响延迟敏感 |
| 评分维度 | 六维,无成本与延迟 | 六维保留,新增「首响延迟」「常驻成本」两维 |
一、一页结论
- 推荐 pydantic-ai(
pydantic-ai-slim[openai])作 agent loop,加权 4.45 分第一;第二选择是自建薄 harness(Python,借 Pi 的 loop 设计),4.33 分(精确 4.325),两者差 0.12 在噪声内。 第三 OpenAI Agents SDK 4.05,第四 Google ADK 3.80。Pi 原样嵌入 3.15,Claude Agent SDK、DeepSeek Harness、Anthropic SDKtool_runner三者不过硬门槛,不入排名(原因见第 4 条)。 - pydantic-ai 领先靠的是与新前提的贴合,不是能力更强。 它是本轮唯一同时满足下面五条的候选:纯 Python 进程内、核心依赖只有 9 个(wheel 1.9 MB)、确认门完全本地(
requires_approval→DeferredToolRequests→ 传回DeferredToolResults续跑,无服务端状态)、对 OpenAI 兼容端点有 profile 机制且已有智谱 GLM 的专用 provider 与 profile、版本政策白纸黑字「minor 版不做破坏性变更」(2.0 于 2026-06-23 发布,之后的 breaking 只在弃用期满后进 major)。遥测(Logfire)是 opt-in 且核心不依赖它。 - 自建薄排第二而不是第一,是因为新前提把「要自己重写的清单」砍掉了一半,但没砍到零。 50 页 A.4 列的六项里,子 agent 编排、技能加载、会话分支三项在组织者型助手上不需要;多模型工具格式差异被 OpenAI 兼容网关抹平只剩 GLM 类的 strict/json_schema 差异;上下文压缩在「对话短」前提下退化为按轮截断;重试分类只剩网关 429/5xx/超时三类。剩下真正要写的是 loop 本身(Pi 的
runLoop只有 130 行)、事件模型、钩子语义、消息序列化——约一两千行 Python 加同等测试。它在可移植性与不被收割两维满分,输在起步就要建齐这些并长期维护,而 pydantic-ai 把这一层以 MIT 给了、且业务面(工具=纯函数、历史=JSON 列表)不被它锁死。 - 三个候选被硬门槛淘汰,原因都是「不是进程内」或「走不了公司网关」,不是能力问题:Claude Agent SDK 的唯一传输是拉起捆绑在 wheel 里的
claudeCLI 子进程(二进制 217 MB,wheel 按平台 92~103 MB),官方明说不支持经网关路由到非 Claude 模型,且用量受 Anthropic 商业条款约束;DeepSeek Harness 的官方 Python SDK 是「用 JSON-RPC 驱动dsh子进程」,架构文档明确拒绝进程内挂载,且今天仍标 developer preview、22 个 npm 版本无一非预发布;Anthropic Python SDK 的tool_runner走 Anthropic Messages 协议(路径硬编码/v1/messages),公司网关是 OpenAI 兼容路径,除非网关另开 Anthropic 协议端点否则用不了,且它只能调 Claude,与「含 GLM」前提冲突。 - Pi 的定位从「候选」改为「设计参考」,与主文 §零第 2 条一致。 事实层:
@earendil-works/pi-agent-core0.86.1 仍是 TypeScript,官方无 Python 实现(PyPI 上同名的pi-agent-core/pi-coding-agent是无关第三方包);每个包有 CHANGELOG(50 页写「未找到」,本轮核实有,在各包目录下而非根目录),但仍无 semver/稳定性承诺,6 个月内 agent 包 9 个版本、coding-agent 包 17 个版本带「Breaking Changes」节,session 模型、harness 工具上下文、状态对象各重做过至少一次。真正值得搬到 Python 的是它 loop 的形状(§二 1.5 列了清单),不是代码。 - 与 50 页结论差异的原因是前提变化,不是事实变化。 0904 到 0921 这 17 天里,被核实的事实没有一条反转:Pi 仍 TS、仍无 semver;Claude Agent SDK 仍要子进程;DeepSeek Harness 仍预览;ADK、OpenAI Agents SDK、pydantic-ai 各自的能力面只有增量。变的是四条前提(运行环境层不再是 daemon、工具面不再以 MCP 为硬约束、确认门等由平台自建、新增首响与常驻两维),而 50 页 §6 改选条件 2 与 4 早已写明「MCP 不再硬约束→Pi 升」「压缩/子 agent/技能判为平台自控→自建薄升到 3.9 量级」,本轮结果正落在它预留的区间里。50 页当年没评 pydantic-ai(A.5 末尾一句「层次更薄、未入打分表」),是本轮把它补进来后它拿了第一,这一点要如实讲。
- 敏感性:把 pydantic-ai 的 D 维(主体风险)从 4 压到 3(假设 Pydantic 公司把关键能力挪进商业产品),总分 4.30 仍与自建薄持平;把自建薄的 A 维(开箱度)从 2 抬到 3(假设团队认定 loop 与事件模型本来就该自己掌控),自建薄 4.48(精确 4.475)反超。所以这两个方案的取舍不由分数定,由一条组织判断定:平台愿不愿意用一个第三方的
Model/Agent抽象换掉一两千行自维护代码。 主文建议:先用 pydantic-ai 起步,把工具函数、消息历史 JSON、确认门协议三样写成平台自持的边界,两年内若要换成自建,业务面零改动。 - 必须做的最小实验(与主文 §零第 5 条同一件事):在公司网关上用 GLM 跑通 pydantic-ai 的「工具调用→
requires_approval停下→续跑」全链路并量首响,单一变量换成自建的最小流式转发作对照。本附录所有延迟判断都是路径分析,没有一个候选实测过。
二、候选逐项事实卡
2.1 Pi(earendil-works/pi,npm @earendil-works/pi-agent-core)
版本与发布【事实】
- npm 最新 0.86.1(2026-09-20),dist-tag
legacy-node20指 0.74.2;包首发 2026-05-07,共 47 版;MIT;dist.unpackedSize5,124,992 字节(466 文件)。最近 30 天(08-22~09-21)发版 6 次:0.84.3/0.84.4/0.85.0/0.85.1/0.86.0/0.86.1。pi-ai、pi-coding-agent同窗口各 6 次,monorepo 统一版号。 pi-agent-core依赖:diff、yaml、ignore、typebox、@earendil-works/chord、@earendil-works/pi-ai、@earendil-works/pi-telemetry。pi-ai0.86.1 依赖含openai 6.40.0、@anthropic-ai/sdk 0.124.0、@google/genai、@aws-sdk/client-bedrock-runtime。
agent loop 的实际代码量与结构【事实,本人核 commit 3390bd9】
- 文件
packages/agent/src/agent-loop.ts,全文 857 行。入口agentLoop()在第 37 行(返回EventStream<AgentEvent, AgentMessage[]>),agentLoopContinue()第 70 行,主体runLoop()第 162~289 行(约 130 行):外层while(true)处理 follow-up 队列,内层while (hasMoreToolCalls || pendingMessages.length > 0)依次做prepareNextTurn→ 消费 steering 队列 →streamAssistantResponse→ 按stopReason分流(error/aborted直接agent_end;length时把整批工具调用判失败而不执行)→executeToolCalls(顺序或并行)→turn_end→shouldStopAfterTurn。其余 700 行是工具执行的准备、校验、并行、错误结果构造。 - 事件只有 10 种(
packages/agent/src/types.ts:448-463):agent_start/agent_end、turn_start/turn_end、message_start/message_update/message_end、tool_execution_start/tool_execution_update/tool_execution_end。50 页写的「36 个具名钩子、19 类 JSONL 事件」属于上层pi-coding-agent的扩展系统,不在 core。 - 钩子语义(
types.ts:60-160):beforeToolCall返回{ block: true, reason?, terminate? }即阻断(loop 发一条错误工具结果给模型);afterToolCall返回字段级覆盖(content/details/isError/usage/terminate,无深合并);shouldStopAfterTurn返回 true 则不再开下一轮;prepareNextTurn可替换下一轮的 context/model/thinkingLevel 或追加消息;transformContext在convertToLlm前做上下文裁剪;getSteeringMessages/getFollowUpMessages两个队列(用户中途插话与「说完再说」);toolExecution: "sequential" | "parallel"。所有回调的契约都写着「must not throw or reject」。 - core 包总量:
packages/agent/src不含测试 30,637 行,其中 loop 本体(agent-loop.ts+agent.ts+types.ts+stream-fn.ts+index.ts)2,099 行,harness/子树 28,103 行(含 session 树、压缩、技能、pico3 实验运行时 7,994 行、Node 执行环境等)。「Pi 的 loop 几百行」在 core 层成立,「Pi 很薄」在包层不成立。 - 压缩(
harness/compaction/compaction.ts):默认reserveTokens 16384、keepRecentTokens 20000,按 provider 回报的 usage 或按字符估算触发,摘要由模型生成(SUMMARIZATION_SYSTEM_PROMPT第 420 行起),切点按「turn 起点」找(findCutPoint)。会话是实体树:EntryType = "message" | "compaction" | "branch_summary" | "custom"(harness/session/types.ts:16),fork()支持按分支或整树、含或不含选中条目(fork-policy.ts)。重试只有一个按RetryPolicy算退避的retryNotBefore/waitUntil(runtime/drive/retry.ts,36 行),分类在pi-ai。
稳定性承诺与变更记录【事实】
- 根目录无
CHANGELOG.md,但packages/agent/CHANGELOG.md(713 行)、packages/coding-agent/CHANGELOG.md(5,805 行)等每包一份;AGENTS.md:105规定### Breaking Changes节格式。GitHub Releases 有正式条目(v0.86.1 等,非 prerelease)。 - README、CONTRIBUTING、AGENTS、各包 README 与
docs/grepsemver/stable/breaking,未找到任何 API 稳定性或 semver 承诺;版本仍 0.x;packages/agent/README.md有「Experimental facet services」节。 - 6 个月内(2026-03-21 起)agent 包 9 个版本、coding-agent 包 17 个版本带 Breaking Changes 节。与嵌入方最相关的:0.84.0(08-06)旧 session 模型整体换成 v4 lane-based
Session/SessionStorage/SessionRepo,AgentHarness从 experimental 提为默认导出并删旧路径;0.82.0(07-24)AgentHarness的ExecutionEnv依赖与工具上下文改造;0.81.0(07-21)SessionStorage接口改、streamFn改必需;0.80.0(06-23)鉴权只走AgentHarnessOptions.models;0.77.0(05-28)事件改名;0.75.0(05-17)Node 最低 22.19;0.69.0(04-22)TypeBox 0.34→1.x;0.65.0(04-03)AgentState重塑 29 条;0.84.4(08-28)prepareNextTurn时机改动;0.86.0(09-19)provider 流输入从Context改TranscriptContext。【推断】半年内嵌入方至少跟 4~5 次迁移。 - 新包(2026-08-06 起):
pi-server(自述「Experimental local server」,多前端挂同一会话,鉴权留给应用)、pi-protocol(CBOR 信封,协议版本 8,「Session与AgentHarness仍是进程内的」)、pi-durable(Pico 运行时,09-19 首发)、pi-client、pi-session-backend-sqlite-node、chord。全仓库 markdown grepmulti-user/multi-tenant/per-user仅一处遥测说明——没有官方多用户服务端形态。
官方 Python 实现【事实】:没有。earendil-works 组织 16 个仓库里唯一的 Python 项目 absurd 是基于 Postgres 的持久化工作流系统,不是 Pi 的 Python 版;PyPI pi-agent-core 0.1.1、pi-coding-agent 0.6.0 是无关第三方同名包,pi-ai 404。
「借鉴其 loop 设计用 Python 重写」要搬的概念(本人核源码后的清单):
- 事件模型:10 种事件的三层嵌套(agent→turn→message/tool),
message_update携带 provider 原生增量事件(text_delta等),映射 SSE 时一层即可。 - 钩子的三种介入语义:阻断(
block+reason)、字段级覆盖(afterToolCall)、停止(shouldStopAfterTurn/terminate提示,且「批内全部 terminate 才提前停」)。 - 两个消息队列:steering(本轮工具执行中插入)与 follow-up(模型本要停时再喂),以及
QueueMode: "all" | "one-at-a-time"。 stopReason === "length"时整批工具调用判失败不执行(agent-loop.ts:222-231),防止截断参数被执行。convertToLlm与transformContext两个纯函数边界:内部消息类型(可含 UI 通知等自定义角色)与送模型的消息分离。- 回调「不得抛异常」契约与
AbortSignal贯穿。 - 压缩的两个阈值语义(保留给摘要的预算、压缩后保留的近期 token)与「按 turn 起点切」规则——组织者型助手初期可不做自动压缩,但阈值口径值得沿用。
不需要搬:会话实体树与 fork、技能加载、Node 执行环境、pico3、
pi-server协议。
2.2 OpenAI Agents SDK(Python,openai-agents,openai/openai-agents-python)
源码引用基于 tag v0.22.3。
- 进程内【事实】:
Runner.run/run_sync/run_streamed(src/agents/run.py:259-469)纯类方法,无子进程、无守护进程。默认 tracing 往 OpenAI 上报(tracing/processors.py:45端点https://api.openai.com/v1/traces/ingest,后台守护线程 5 秒批量发),关法:OPENAI_AGENTS_DISABLE_TRACING=1、set_tracing_disabled(True)、RunConfig(tracing_disabled=True)。文档明写用非 OpenAI key 会报 401,要先关。 - 流式【事实】:三类事件
raw_response_event/run_item_stream_event/agent_updated_stream_event;token 级增量从raw_response_event里的ResponseTextDeltaEvent取,Chat Completions 路径会被chatcmpl_stream_handler.py:917-922转成同一事件。审批中断后stream_events()结束、interruptions暴露待批项。 - 工具【事实】:
@function_tool(别名@tool)用inspect.signature+get_type_hints+pydanticcreate_model生成 schema,griffe 解析 google/numpy/sphinx docstring(function_schema.py);sync 函数经asyncio.to_thread,async 直接 await;failure_error_function默认把异常文本回给模型,传None则抛。 - 确认门与护栏【事实】:input/output/tool 三层 guardrail;
needs_approval=True|callable→RunResult.interruptions→result.to_state()→state.approve/reject→Runner.run(agent, state)续跑。RunState.to_json/from_json(run_state.py:1784、:2266)是本地 JSON 快照(schema1.17),from_json不访问网络;只有应用自己启用了conversation_id/previous_response_id服务端会话才依赖 OpenAI 侧状态。 - OpenAI 兼容端点【事实】:
AsyncOpenAI(base_url=…)+OpenAIChatCompletionsModel、set_default_openai_api("chat_completions")+OPENAI_BASE_URL、LitellmModel(extra,官方定位 best-effort beta)。文档明列限制:多数第三方不支持 Responses API 与json_schema结构化输出;Chat Completions 路径静默丢弃 Responses-only 字段(可strict_feature_validation=True改为快速失败);不稳定的工具调用增量需buffer_streamed_tool_calls=True。 - Session【事实】:存完整
TResponseInputItem列表(Responses API 输入项形态);SQLAlchemySession用create_async_engine,示例与 extra 都是postgresql+asyncpg;RedisSession用redis.asyncio;无 token 级裁剪,只有SessionSettings(limit=N)条数上限、ToolOutputTrimmer、以及依赖 OpenAIresponses.compact的OpenAIResponsesCompactionSession。 - 许可证与节奏【事实】:MIT(OpenAI);最新 0.22.3(2026-09-17);30 天发版 3 次;6 个月 47 版、10 次 minor。版本策略
0.Y.Z:Y 升即对非 beta 公共接口的 breaking。6 个月内带 breaking 的 minor:0.15(拒答改抛ModelRefusalError)、0.16(默认模型改)、0.17(sandbox 路径限制)、0.20(默认模型改、mcpv2)、0.21(openai>=3+httpx2)、0.22(OpenAIProvider参数冲突改抛错等)。仓库无独立 CHANGELOG,只在 Releases 与docs/release.md。 - 依赖【事实】:核心 12 项,
mcp>=1.19.0,<3是强依赖,另 5 项是给传递依赖设安全下限;wheel 1,149,658 字节;requires_python>=3.10。 - 首响路径【事实+推断】:client 与 tracing 懒初始化,
run.py无 HTTP 调用;除模型请求外无额外往返;tracing 在守护线程不阻塞。
2.3 Google ADK(Python,google-adk,google/adk-python)
源码引用基于 tag v2.9.2(commit dafa8e9)。
- 进程内【事实】:
Runner(app_name, agent, session_service=…).run_async(user_id, session_id, new_message, run_config)返回AsyncGenerator[Event](runners.py:175-260、:1030-1075),不需要adk api_server;runners.py不 importgoogle.cloud。遥测两条线默认都不上报:OTel provider 只在adk api_server/adk web且设了--otel_to_cloud或OTEL_EXPORTER_OTLP_*时装配;CLI 使用统计需用户在~/.adk/config.json明确同意,提示语「OFF by default」。 - 流式【事实】:
RunConfig(streaming_mode=StreamingMode.SSE)产出partial=True文本分片与函数调用参数分片,再给一个聚合事件(需去重);粒度=上游 chunk。BIDI 走run_live(),要求模型实现connect(),只有 Gemini(google_llm.py:520)实现,LiteLlm没有——非 Gemini 模型不可用双向流。 - 工具【事实】:
FunctionTool用 pydanticcreate_model().model_json_schema()生成参数 schema,描述只取函数级 docstring,不解析Args:段(参数说明只能靠Field(description=…));async 直接 await,sync 在事件循环上直接调用(【推断】阻塞型 sync 工具会阻塞循环,可配ToolThreadPoolConfig)。 - 确认门【事实】:
require_confirmation=True或tool_context.request_confirmation(hint, payload)→ 框架发出adk_request_confirmationFunctionCall 并挂long_running_tool_ids,本轮停下;恢复时客户端以user角色发FunctionResponse{id, name='adk_request_confirmation', response={confirmed, payload}},Runner反推 invocation 后重跑原工具(flows/llm_flows/request_confirmation.py:75-330)。文档明写可「直接发给 ADK runner」,自建 SSE 服务可用。before_tool_callback返回非 None 即跳过工具。特性登记为EXPERIMENTAL, default_on=True。【待验证】文档「Known limitations」写DatabaseSessionService不支持该特性,但源码里没找到对应守卫。 - 非 Gemini 模型【事实】:
LiteLlm(model="openai/<model>", api_base=…, api_key=…),kwargs 原样并入每次litellm.acompletion;Agent(model="openai/…")也会被LLMRegistry自动解析成LiteLlm。litellm只在extensions/allextra。流式与非流式都是原生acompletion,无线程池转换。结构化输出转response_format=json_schema。ADK 文档没有 LiteLLM 功能限制表。 - Session 与压缩【事实】:
DatabaseSessionService用create_async_engine,强制异步驱动(postgresql+asyncpg://),asyncpg不在任何 extra 需自装;内置EventsCompactionConfig(按 invocation 滑窗或按 token 阈值,摘要由LlmEventSummarizer做),标@experimental。 - 许可证与节奏【事实】:Apache-2.0(Google LLC);最新 2.9.2(2026-09-18);30 天 5 次(含 1.x 维护线 1.39.1);6 个月 breaking:2.0.0 GA(05-19,
BaseAgent改为BaseNode子类、Event 新增字段、不得直接 append event、工具里宽泛except会关掉自动重试)、2.6.0(artifact 按 app 命名空间)、2.7.0(pyarrow移出gcpextra)、2.9.0(失败节点恢复时重跑、InMemorySessionService未知会话 append 抛错、MCP SDK 2.x 未声明字段丢弃)。 - 依赖【事实】:核心必装 23 项,含
fastapi、uvicorn、starlette、websockets、opentelemetry-api/sdk、google-genai、google-auth[pyopenssl]、graphviz、watchdog;google-cloud-*全在 extra;wheel 4,631,024 字节;requires_python>=3.10。 - 首响路径【事实+推断】:无额外进程;LiteLlm 路径多一层 litellm 的请求转换,无跨进程或额外网络跳;2.7.0 起
import google.adk惰性加载。
2.4 pydantic-ai(pydantic-ai-slim/pydantic-ai,pydantic/pydantic-ai)
源码引用基于 main(2026-09-19T15:57Z)。
- 进程内【事实】:
run/run_sync/run_stream/run_stream_events/iter全是库内协程或上下文管理器;Agent._instrument_default = False(agent/__init__.py:500),不开启就不包InstrumentedModel;文档原话「Otherwise there's virtually no overhead and nothing is sent」。注意:未配置 instrumentation 时首次 run 会向 stderr 打一段横幅(仅在 stderr 是终端或识别到编码代理环境变量时),PYDANTIC_AI_NO_BANNER或pydantic_ai.BANNER_ENABLED=False关掉,纯本地不联网。 - 流式【事实】:
run_stream()的stream_text(delta=True, debounce_by=None)给 chunk 级增量(默认debounce_by=0.1秒会分组,要最小首字延迟需关掉);run_stream_events()(v2 仅限 async 上下文管理器)输出PartStartEvent/PartDeltaEvent/FunctionToolCallEvent/FunctionToolResultEvent/FinalResultEvent/DeferredToolRequestsEvent等(messages.py:4045-5053);iter()按UserPromptNode/ModelRequestNode/CallToolsNode/End逐节点。run_stream()有语义陷阱:把第一个匹配输出类型的输出当最终输出,后续悬挂工具默认不执行,全程跑完要用run_stream_events()或iter()。 - 工具【事实】:
@agent.tool(首参RunContext)/@agent.tool_plain;schema 从签名+griffe 解析 docstring;sync/async 都行;ModelRetry抛出即生成RetryPromptPart回送模型,参数校验失败同样触发;retries每工具独立计数、默认 1,7 层优先级可覆盖,耗尽抛UnexpectedModelBehavior;ToolFailed报失败但不消耗重试预算。 - 确认门【事实】:
requires_approval=True或函数内raise ApprovalRequired(metadata=…);Agent(output_type=[str, DeferredToolRequests])时 run 结束、result.output是DeferredToolRequests(calls, approvals, metadata);续跑agent.run(None, message_history=result.all_messages(), deferred_tool_results=DeferredToolResults(approvals={id: True | ToolApproved(override_args=…) | ToolDenied(message=…)}))(_deferred.py:27-172)。另有同进程内联的HandleDeferredToolCalls(handler)capability。【推断】完全本地状态,源码与文档无任何服务端存储参与。文档警告审批不是对不可信客户端的授权边界,敏感动作仍需在工具内鉴权。 - OpenAI 兼容【事实】:
OpenAIChatModel(models/openai.py:944,旧名OpenAIModelv2 已删)+OpenAIProvider(base_url=…, api_key=…),内部直接构造openai.AsyncOpenAI(providers/_openai_compatible.py:35-50);v2 默认openai:前缀走 Responses API,Chat Completions 要用openai-chat:或显式OpenAIChatModel。OpenAIChatCompatibleProvider字面量 21 个(alibaba, azure, cerebras, crusoe, deepseek, fireworks, github, github-copilot, heroku, litellm, moonshotai, nebius, ollama, openrouter, ovhcloud, sambanova, snowflake, together, vercel, vllm, zai)。OpenAIModelProfile(profiles/openai.py:168)字段含openai_supports_strict_tool_definition、openai_supports_tool_choice_required、openai_chat_supports_multiple_system_messages、openai_chat_supports_max_completion_tokens、openai_chat_thinking_field等,基类有json_schema_transformer;文档明确提醒OpenAIProvider改了base_url不会改 profile 选择,要自己传profile=。智谱 GLM:ZaiProvider(providers/zai.py:26,base_url='https://api.z.ai/api/paas/v4')、ZaiModel、ZaiModelProfile(profiles/zai.py:8,glm-5/4.7/4.6/4.5 标supports_thinking,GLM-5.2/5.3 支持reasoning_effort),openai_chat_thinking_field='reasoning_content'。【待验证】国内open.bigmodel.cn域名与公司网关都不在源码,用时把zai_model_profile配到指向网关的OpenAIProvider上即可,需实测。 - 持久与压缩【事实】:Temporal/DBOS/Prefect 各是可选 extra;不用时状态就是
ModelMessage列表,ModelMessagesTypeAdapter(messages.py:2996)序列化到自己的jsonb列,v1 序列化的历史 v2 可反序列化,版本政策承诺新增 part 不算破坏。history_processors=v2 已删,改capabilities=[ProcessHistory(fn)](本质before_model_request钩子);现成多档压缩策略在另一个包pydantic-ai-harness(0.32.0,MIT)。 - 许可证、主体、商业化【事实】:MIT,「Copyright (c) Pydantic Services Inc. 2024 to present」;商业化是 Logfire(托管遥测平台,有免费层与自托管企业版)+企业支持;slim wheel 内 grep 仅
durable_exec/temporal/_logfire.py在TYPE_CHECKING或函数内引用 logfire,核心只依赖opentelemetry-api,不装 logfire 全功能可用。 - 版本与节奏【事实】:最新 2.46.0(2026-09-19);30 天 16 次(15 个 2.x+1.107.6);里程碑 v1.0.0 2025-09-04、v2.0.0 2026-06-23(beta 自 05-21)。版本政策原文:「We will not intentionally make breaking changes in minor releases. Functionality marked as deprecated in a release is not removed until the next major version, which we won't release sooner than 3 months after V2.0.」「security fixes for V1 for at least 6 months after V2's stable release」。6 个月内 breaking 集中在 v2.0.0 一次(泛型默认改
object、ModelProfile改TypedDict、默认 extras 瘦身、end_strategy默认graceful、OpenAIModel→OpenAIChatModel、history_processors→capabilities、DeferredToolCalls→DeferredToolRequests、run_stream_events()仅上下文管理器等),此外 v2.33.0(08-21)上游anthropic1.0 升 httpx2 造成过一个「breakage window」(不影响只用 openai extra 的场景)。 - 依赖【事实】:slim 核心 9 条(
anyio、genai-prices、griffelib、httpx2、opentelemetry-api、pydantic-graph、pydantic、typing-inspection,exceptiongroup仅 <3.11);openaiextra=openai>=3.8.0+tiktoken;注意httpx2走系统信任库不带 certifi,容器需装ca-certificates。wheel 1,883,684 字节;pydantic-ai全量包是空壳,默认捆 8 个 extras。requires_python>=3.10。 - 首响路径【事实+推断】:直接
await self.client.chat.completions.create(...)(models/openai.py:1164),无额外进程与网络跳;默认不产生出站遥测;价格表不自动联网。
2.5 Anthropic Python SDK tool_runner 与 Claude Agent SDK(Python)
甲、anthropic SDK 的工具循环(源码 main,最近推送 2026-09-18)
- 【事实】
tool_runner只在 beta 命名空间(resources/beta/messages/messages.py:1356起四个重载);返回BetaToolRunner(stream=False)或BetaStreamingToolRunner(stream=True),for message in runner每轮一条模型消息,until_done()跑完;max_iterations到上限静默退出不抛异常;工具异常被捕获后以is_error: true的tool_result回给模型,循环继续;同步客户端只能配@beta_tool同步工具、异步客户端配@beta_async_tool,不能混。 - 【事实】流式:每轮 yield 一个
BetaMessageStream,逐事件可取text(token 级增量)、input_json(工具入参增量);官方 Python 示例在 Tool Runner 文档「Streaming」节。 - 【事实】协议是 Anthropic Messages API:请求路径硬编码
"/v1/messages"(非 beta)与"/v1/messages?beta=true"(beta),无任何/chat/completions路径;base_url可由构造参数或ANTHROPIC_BASE_URL覆盖,但只改主机与前缀,请求体仍是messages/system/tools/input_schema/tool_use/tool_result结构。Anthropic 官方的「OpenAI SDK compatibility」是反方向(让 OpenAI SDK 把base_url指到https://api.anthropic.com/v1/调 Claude),且限制「Prompt caching is not supported」「strict… is ignored」。Claude Code 的网关兼容指南列的受支持格式只有 Anthropic Messages、Bedrock、Vertex 三种。 - 【推断】要经公司 OpenAI 兼容网关用它,网关必须另开 Anthropic 协议端点或做 Chat Completions ↔ Messages 转译;且它只能调 Claude 模型,与「含 GLM」前提冲突。两条都不满足则不可用。【待验证】公司网关是否暴露 Anthropic 协议端点。
- 【事实】MIT;最新 1.7.0(2026-09-18);30 天 7 次;6 个月唯一 ⚠ BREAKING 是 1.0.0(2026-08-20,升
httpx2、移除messages.parse(stream=True)、移除tool_runner(compaction_control=)改服务端 compaction);核心依赖 7 项,wheel 1,255,606 字节;requires_python>=3.10。
乙、Claude Agent SDK(claude-agent-sdk,anthropics/claude-agent-sdk-python)
- 【事实】必须拉起
claudeCLI 子进程:唯一内置传输SubprocessCLITransport(_internal/transport/subprocess_cli.py:220),_find_cli()先找捆绑件_bundled/claude(第 337~351 行),再shutil.which("claude"),都没有抛CLINotFoundError提示npm install -g @anthropic-ai/claude-code;connect()用anyio.open_process([cli_path, "--output-format", "stream-json", "--verbose", …, "--input-format", "stream-json"])(第 859~867 行)。SDK 源码 grephttpx|api.anthropic.com|aiohttp|urllib零命中,requires_dist无任何 HTTP 客户端、不依赖anthropic包——模型请求全在 CLI 内。 - 【事实】PyPI wheel 捆绑 CLI 二进制:本地下载 0.2.157 的 macOS arm64 wheel
unzip -l,claude_agent_sdk/_bundled/claude217,662,576 字节,占解压总量 99.8%;wheel 按平台 92~103 MB;_cli_version.py记2.1.278;无 Windows wheel。没有「无子进程」模式,唯一扩展点Transport抽象类 docstring 写「The Claude Code team may change or remove this abstract class in any future release」,且它只搬 stream-json 帧、对端仍要是 Claude Code 进程。 - 【事实】模型端点:CLI 读
ANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN(官方 env-vars 页),SDK 经ClaudeAgentOptions.env透传;官方原话「doesn't support routing Claude Code to non-Claude models through any gateway」「ANTHROPIC_BASE_URLchanges where requests are sent, not which model answers them」。 - 【事实】商业条款:代码 MIT,但 README 与 overview 写「Use of the Claude Agent SDK is governed by Anthropic's Commercial Terms of Service, including when you use it to power products and services that you make available to your own customers and end users」;overview「Unless previously approved, Anthropic does not allow third party developers to offer claude.ai login or rate limits for their products」及品牌限制(不得称 Claude Code);商业条款 D.4「resell the Services except as expressly approved by Anthropic」。【推断】按用量向终端用户收费是否构成 resell 需与 Anthropic 确认,属法务项。
- 【事实】最新 0.2.157(2026-09-18,classifier「3 - Alpha」);30 天 13 次、6 个月 107 版(绝大多数是「Updated bundled Claude CLI」);CHANGELOG 明确标 Breaking 的只有 0.2.129(2026-08-04,skills 名称校验);核心依赖
anyio、jsonschema、mcp<3,>=1.23、sniffio;requires_python>=3.10。 - 【事实】首响:官方无子进程启动耗时数字;headless 页推荐
--bare模式「will become the default for-pin a future release」(跳过 CLAUDE.md、skills、plugins、hooks、MCP 加载),Python 的ClaudeAgentOptions无bare字段需走extra_args;issue #333(2025-11 建,仍 open,无维护者回复)用户自述「20-30+ seconds」,环境未知,不作论据。
2.6 DeepSeek Harness(deepseek-ai/deepseek-harness)
- 【事实】语言 TypeScript(GitHub API),根
package.json名@deepseek-ai/dsh-root、version0.1.6-alpha.2,pnpm workspace;根目录无pyproject.toml,但有python/sdk/(PyPIdeepseek-harness-sdk)与python/sdk-runtime/(deepseek-harness-runtime-bin,把dsh可执行文件打进 wheel)。PyPI 的deepseek-harness(无后缀)是第三方包(author Henry Zhang),勿混淆。 - 【事实】官方 Python SDK 是子进程驱动:
python/README.md「Python packages for driving DeepSeek Harness as a subprocess. The client SDK communicates with the bundled runtime over newline-delimited JSON-RPC on stdio.」python/sdk/README.md「The Python SDK has no separate application entrypoint. It launches the bundleddshCLI with--profile sdk」「Every launch requires an explicit Harness home」。docs/architecture.md:「direct in-process plugin mounting … are not Harness application launchers.verify-application-entrypoints… rejects a Node application path that bypassesdsh.」sdk-minimalprofile「deliberately excludesdsh-base, Web, settings, managed credentials, telemetry, compaction, filesystem tools, workspace instructions, skills, jobs, and subagents」且是 danger-full-access 策略。Python API:DeepSeekHarness(dsh_home, cwd, provider, model, …)上下文管理器,initialize_timeout_seconds默认 30 秒。 - 【事实】稳定性:README 今天仍写「DeepSeek Harness is in developer preview and iterating rapidly. THERE WILL BE COMPATIBILITY-BREAKING CHANGES.」npm
@deepseek-ai/dshlatest=0.1.5-rc.2(2026-09-10)、alpha=0.1.6-alpha.2(09-17),22 个版本无一非预发布;PyPIdeepseek-harness-sdk最新 0.1.5rc1(09-10),7 个版本全预发布。30 天 npm 发版 12 次、GitHub Releases 14 条(全 prerelease)。无 CHANGELOG 文件,变更只在 Releases 正文,其中明写破坏的如dsh-v0.1.3-alpha.1(09-04)「Breaking change: The Session persistence API is now owned by lifecycle-scopedSessionHandles;agentLoop.create()is asynchronous」、v0.1.0-rc.8(08-19)SQLite 数据结构不兼容。 - 【事实】MIT;
SAFETY.md仍写「has not undergone a security audit and must not be treated as secure or production-ready」。 - 【事实】自定义 OpenAI 兼容 provider 走
llm-pi-ai插件(底层是 Pi 的@earendil-works/pi-ai):settings.yaml的llm-pi-ai.providers.<id>配api: openai-completions、baseURL、apiKeyEnv、models,另有compat.thinkingFormat、compat.maxTokensField等网关兼容开关;文档提醒「Most OpenAI-compatible gateways refuse at least one thing OpenAI accepts」。【推断】Pi provider 层的破坏性变更会传导到它。
2.7 自建薄 harness(Python,借 Pi 设计)
按 50 页 A.4「要自己重写的清单」在新前提下逐项重评(每项给「是否仍需」与依据):
| 50 页清单项 | 新前提下 | 依据与做法 |
|---|---|---|
| 上下文压缩(触发阈值+摘要 token 成本) | 降级为按轮截断+每会话 token 上限,自动摘要压缩推迟 | 组织者型助手每轮「理解→复述→建议→等确认」,会话短;技术方案 :398 定它只做轻问答。初期用代码化的「保留最近 N 轮+系统提示重注入」即可(pydantic-ai 的 ProcessHistory 或自建 transformContext),Pi 的 reserveTokens 16384/keepRecentTokens 20000 两个阈值口径可沿用。摘要压缩是模型判断类任务,等有长会话数据再上 |
| 自动重试的错误分类 | 仍需,但缩到三类 | 网关 429/5xx/超时。HTTP 层重试 openai SDK 自带 max_retries(默认 2);工具参数校验失败的「回模型重试」pydantic-ai 有 ModelRetry,自建约 50 行。Pi 的 retryNotBefore/waitUntil 只有 36 行,分类在 pi-ai |
| 子 agent 编排 | 不需要 | 能力经 A2A 交给 AI 员工,是一次工具调用(或异步任务),不是子 agent;技术方案 §3.5「转出去」 |
| 技能加载与渐进披露 | 不需要 | 工具是平台注册的固定 Python 函数,数量少(策划说明五类意图对应的读写接口),一次性全量声明即可 |
| 多模型工具调用格式差异 | 大部分被网关抹平,剩 GLM 类的 strict/json_schema 差异 | 公司网关统一 OpenAI Chat Completions 协议;剩余差异是 strict 支持、多条 system 消息、reasoning_content 字段——pydantic-ai 的 OpenAIModelProfile+ZaiModelProfile 已列出这些开关,自建要自己维护一张 profile 表 |
| 会话分支与 fork | 不需要 | C 端线性对话,无分支;Pi 的实体树与 fork 是编码代理场景 |
| (新增)steering/插话与 SSE 断线续传 | 需要,任何候选都不给 | Pi 的 steering/follow-up 两队列是设计参考;断线续传靠平台自己的消息表+事件序号 |
| (新增)确认门协议 | 需要,平台自建(前提已定) | 自建时就是 loop 在 beforeToolCall 返回「挂起」并把待批项写库;用 pydantic-ai 则是 DeferredToolRequests 落库、前端确认后 DeferredToolResults 续跑 |
【推断】自建工作量:loop(参照 Pi runLoop 130 行)+10 种事件+三种钩子语义+消息序列化+重试+截断+确认挂起,约 1~2 千行 Python 加同等测试,与 50 页「循环几百行、保障齐全才难」一致,但「保障」的范围因新前提缩小了一半以上。它在 C(可移植)、D(不被收割)、F(判断与确定性切分)三维仍是满分,输在 A(全部自建)与 E(协议自己跟,虽然本轮 E 权重已降)。
三、八项速览(任务书第 8 条)
| 候选 | 首响路径额外进程/网络跳 | 零常驻基础设施 | Python 原生 | 许可证 | 维护主体风险 | 6 个月 breaking 记录 | 与「模型只做判断」纪律的契合 |
|---|---|---|---|---|---|---|---|
| Pi(原样嵌入) | 多一个 Node 进程+IPC(无官方 Python) | 否(Node 子进程或 sidecar) | 否(TS) | MIT | Earendil Works,小团队,0.x 无 semver | agent 包 9 版、coding-agent 17 版带 Breaking | 高:路由/重试/截断全是代码回调,模型只出消息与工具调用 |
| OpenAI Agents SDK | 无(tracing 守护线程,需关上报) | 是 | 是 | MIT | OpenAI;0.Y 每升即 breaking,6 个月 6 次;强依赖 mcp |
0.15/0.16/0.17/0.20/0.21/0.22 | 高:max_turns、error_handlers、三层 guardrail 代码化;但 Chat Completions 路径静默丢字段需开严格校验 |
| Google ADK | 无(LiteLlm 多一层请求转换) | 是(但核心必装 fastapi/uvicorn/otel 等 23 项) | 是 | Apache-2.0 | Google;2.x 与 1.x 并行;Gemini 优先(bidi 仅 Gemini) | 2.0.0/2.6.0/2.7.0/2.9.0 | 高:before_tool_callback、EventsCompactionConfig、重试配置化 |
| pydantic-ai | 无(默认 debounce_by=0.1 需关) |
是 | 是 | MIT | Pydantic Services;版本政策明文 minor 不 breaking;30 天 16 版 | v2.0.0 一次集中;v2.33.0 上游 anthropic 波及 | 高:retries 每工具计数、ModelRetry、UsageLimits、ProcessHistory 全代码化 |
Anthropic tool_runner |
无(若网关支持 Anthropic 协议) | 是 | 是 | MIT | Anthropic;beta 命名空间 | 1.0.0(08-20) | 中:max_iterations 静默退出、无护栏挂载点,需自己在循环体里做 |
| Claude Agent SDK | 子进程(217 MB CLI),每会话一进程 | 否 | 否(壳是 Python,引擎是 CLI) | 代码 MIT+Anthropic 商业条款 | Anthropic;不支持非 Claude 模型经网关 | 0.2.129 | 高(hooks 22 个、canUseTool),但被门槛淘汰 |
| DeepSeek Harness | 子进程(dsh Node 二进制),初始化超时默认 30 s |
否 | 否(Python SDK 是子进程客户端) | MIT | DeepSeek;developer preview,「THERE WILL BE COMPATIBILITY-BREAKING CHANGES」 | Releases 正文多条(session API、SQLite 结构) | 高(guard 插件、fail-closed 审批),但被门槛淘汰 |
| 自建薄(Python) | 无 | 是 | 是 | 自有 | 平台自己 | 无 | 最高(全部代码化,按平台纪律写) |
四、对照矩阵
硬门槛(任一不过即不入排名):① 能在平台 FastAPI 进程内以库方式运行、不拉子进程;② 能经公司 OpenAI 兼容网关调含 GLM 的模型。Claude Agent SDK 不过 ①②,DeepSeek Harness 不过 ①,Anthropic tool_runner 不过 ②(待网关核实)。三者下表仍给分供参照,但标「门槛不过」。Pi 原样嵌入不过 ①,但因它是白晨点名的候选,单列一行并以「Node sidecar」形态打分。
权重(六维沿用 50 页命名,权重按新前提调整;两维新增;合计 100%):
| 维度 | 50 页权重 | 本轮权重 | 调整理由 |
|---|---|---|---|
| A 硬要求开箱(确认门/护栏/事件流的本地可续挂载点) | 20% | 15% | 确认门、护栏、记忆已定由平台自建,候选只需给挂载点,且挂载点各家都有;降 5 |
| B 服务化可达(本轮定义改为进程内嵌入摩擦:依赖体积、async、状态可外置) | 20% | 15% | 多用户由 FastAPI 承担,候选不再需要租户概念;降 5 |
| C 业务层可移植性(工具、历史、确认门协议能否原样迁走) | 20% | 20% | 不变,仍是长视野最重项 |
| D 维护主体与许可证风险 | 15% | 15% | 不变 |
| E 协议与生态跟进(MCP/A2A) | 15% | 5% | 工具=进程内 Python 函数,MCP 不再硬约束;A2A 在能力接入层由平台自写;降 10 |
| F 判断与确定性切分 | 10% | 10% | 不变 |
| G 首响延迟(首响路径上的额外进程、网络跳、默认阻塞) | — | 10% | 新增:C 端用户、NN/g 10 秒阈值(附录 C) |
| H 常驻成本(是否需要 sidecar/子进程/外部服务) | — | 10% | 新增:主文 §二的「成本形状」论点要落到候选上 |
打分(1~5,5 最好;总分=加权和,保留两位):
| 候选 | A 15% | B 15% | C 20% | D 15% | E 5% | F 10% | G 10% | H 10% | 总分 | 门槛 |
|---|---|---|---|---|---|---|---|---|---|---|
| pydantic-ai | 4.5 | 5 | 4 | 4 | 3.5 | 4.5 | 5 | 5 | 4.45 | 过 |
| 自建薄(Python,借 Pi 设计) | 2 | 5 | 5 | 4.5 | 2 | 5 | 5 | 5 | 4.33 | 过 |
| OpenAI Agents SDK | 4 | 4.5 | 3.5 | 3.5 | 4 | 4 | 4.5 | 5 | 4.05 | 过 |
| Google ADK | 4 | 4 | 3 | 3.5 | 4.5 | 4 | 4 | 4.5 | 3.80 | 过 |
Anthropic tool_runner |
2.5 | 3.5 | 3 | 3 | 3 | 4 | 4.5 | 5 | 3.45 | 不过 ② |
| Pi(Node sidecar) | 4.5 | 1.5 | 3 | 3 | 3 | 4.5 | 3 | 3 | 3.15 | 不过 ① |
| DeepSeek Harness | 4.5 | 2 | 3 | 2 | 3.5 | 4.5 | 2 | 2.5 | 2.95 | 不过 ① |
| Claude Agent SDK | 4 | 2 | 3 | 2.5 | 4.5 | 4 | 1.5 | 2.5 | 2.90 | 不过 ①② |
最容易被质疑的给分说明:
- pydantic-ai C 给 4 不给 5:工具是纯 Python 函数、历史是有版本兼容承诺的 JSON,这两样迁得走;但
Model/Provider/RunContext/DeferredToolRequests是它的私有抽象,换底座时 loop 周边的胶水要重写。D 给 4 不给 4.5:30 天 16 次发版的节奏快,minor 不 breaking 是承诺不是保证(v2.33.0 上游波及就是例子),且下一个 major 最快 2026-09 后即可发。 - 自建薄 A 给 2 不给 1:50 页给 1 是「全部自建」;本轮确认门/护栏本就由平台建,候选在这一维的差距缩小,自建的相对劣势也缩小。E 给 2:不需要 MCP,但网关协议细节仍要自己跟。
- OpenAI Agents SDK D 给 3.5:MIT、OpenAI 主体稳,但
0.Y每升即 breaking 且 6 个月 6 次,加上强依赖mcp(我们不用)与默认上报 tracing(要关)。B 给 4.5:SQLAlchemySession原生 asyncpg、RunState本地 JSON,嵌入摩擦小,但 session item 是 Responses API 形态。 - ADK B 给 4:纯库可用,但核心必装 23 项含
fastapi/uvicorn/opentelemetry-sdk/google-genai,与平台已有 FastAPI 叠一层;C 给 3:Event 模型与FunctionResponse形态是 Gemini 的,FunctionTool不解析 docstring 参数说明,工具要改写成Field(description=…)。 - Pi B 给 1.5:无官方 Python,只能 Node sidecar+自定义 IPC,且
pi-server自述 experimental、鉴权留给应用;G/H 各 3:多一跳与一个常驻进程,但不是每会话一进程。
敏感性(只列会翻结论的):
| 假设 | 变动 | 结果 |
|---|---|---|
| Pydantic 公司把关键能力挪进商业产品 | pydantic-ai D 4→3 | 4.30,与自建薄 4.33 持平,不翻 |
| 团队判定 loop 与事件模型必须自控 | 自建薄 A 2→3 | 4.48(精确 4.475),自建薄第一 |
| 平台要求 A2A 原生(能力接入层不自写) | E 权重 5→15、其余按比例压 | ADK 升到约 3.9,仍第四;不翻 |
| 公司网关开 Anthropic 协议端点且只用 Claude | Anthropic tool_runner 过门槛 |
3.45,第五;不翻 |
五、未核实项(按对结论的影响排序)
- 【待验证】所有候选的首响延迟都是路径分析,没有实测。 最小实验:公司网关+GLM,pydantic-ai 与自建最小流式转发各跑 ≥20 组配对,量「请求发出→SSE 首字」。这是主文 §零第 5 条实验的进程内那一半。
- 【待验证】pydantic-ai 的
ZaiModelProfile配到公司网关上是否直接可用(reasoning_content字段、strict 工具定义、多条 system 消息三项),以及 GLM 经网关是否支持json_schema结构化输出。 - 【待验证】公司 OpenAI 兼容网关是否同时暴露 Anthropic Messages 协议端点。决定 Anthropic
tool_runner是否过门槛②(即使过也只能调 Claude)。 - 【待验证】ADK 文档写
DatabaseSessionService不支持 tool confirmation,源码没找到守卫;若为真,ADK 的 A 维要再降。 - 【待验证】Claude Agent SDK 子进程首响:官方无数字,issue #333 的 20~30 秒是用户自述。它已被门槛淘汰,只在主文要引用「子进程路径慢」时才需要实测。
- 【待验证】Pi 的
pi-durable/chord(9 月新发)会不会演变成服务端形态——目前自述 local/experimental,只影响「Pi 作二期第二引擎」的判断,不影响本轮。 - 【未找到】pydantic-ai 内置的智谱国内域名(
open.bigmodel.cn):ZaiProvider.base_url固定为api.z.ai,用国内域名或公司网关要自传base_url。 - 【未找到】OpenAI Agents SDK 与 ADK 安装后含传递依赖的磁盘占用(未安装,只有 wheel 大小)。
六、来源清单(访问日期均为 2026-09-21)
Pi
- https://registry.npmjs.org/@earendil-works/pi-agent-core / https://registry.npmjs.org/@earendil-works/pi-ai / https://registry.npmjs.org/@earendil-works/pi-coding-agent / https://registry.npmjs.org/@earendil-works/pi-server / pi-protocol / pi-durable / pi-client / pi-session-backend-sqlite-node / chord
- https://api.github.com/repos/earendil-works/pi / https://api.github.com/repos/earendil-works/pi/releases?per_page=5 / https://api.github.com/repos/earendil-works/pi/git/trees/main?recursive=1 / https://api.github.com/orgs/earendil-works/repos?per_page=100
- https://github.com/earendil-works/pi/blob/main/AGENTS.md / packages/agent/CHANGELOG.md / packages/coding-agent/CHANGELOG.md / packages/agent/README.md / packages/server / packages/protocol / packages/durable / packages/client / packages/session-backends/sqlite-node
- 本地浅克隆
/tmp/pi-src(commit3390bd9,2026-09-20):packages/agent/src/agent-loop.ts、agent.ts、types.ts、harness/compaction/compaction.ts、harness/session/types.ts、harness/session/fork-policy.ts、harness/runtime/drive/retry.ts、packages/agent/package.json;/tmp/pi-hist(加深至 2026-03-17,用于git log --grep) - https://github.com/earendil-works/absurd/blob/main/README.md / https://pypi.org/pypi/pi-agent-core/json / https://pypi.org/pypi/pi-coding-agent/json / https://pypi.org/pypi/pi-ai/json(404)
OpenAI Agents SDK
- https://pypi.org/pypi/openai-agents/json / https://api.github.com/repos/openai/openai-agents-python / https://api.github.com/repos/openai/openai-agents-python/releases?per_page=50
- 源码(tag v0.22.3,
https://raw.githubusercontent.com/openai/openai-agents-python/v0.22.3/前缀):LICENSE、pyproject.toml、src/agents/run.py、stream_events.py、tracing/setup.py、tracing/processors.py、tracing/provider.py、_config.py、function_schema.py、tool.py、decorators.py、run_state.py、guardrail.py、tool_guardrails.py、run_config.py、models/openai_provider.py、models/openai_chatcompletions.py、models/chatcmpl_stream_handler.py、models/multi_provider.py、extensions/models/litellm_model.py、memory/session.py、memory/session_settings.py、memory/sqlite_session.py、memory/openai_conversations_session.py、memory/openai_responses_compaction_session.py、extensions/memory/sqlalchemy_session.py、extensions/memory/redis_session.py、extensions/tool_output_trimmer.py - 文档:https://openai.github.io/openai-agents-python/tracing/ / config/ / streaming/ / tools/ / guardrails/ / human_in_the_loop/ / models/ / sessions/ / release/ / running_agents/ / results/
Google ADK
- https://pypi.org/pypi/google-adk/json / https://api.github.com/repos/google/adk-python / https://api.github.com/repos/google/adk-python/releases / https://raw.githubusercontent.com/google/adk-python/main/CHANGELOG.md / …/LICENSE
- 源码(tag v2.9.2,commit
dafa8e9,src/google/adk/):runners.py、agents/run_config.py、agents/_streaming_mode.py、agents/context.py、agents/llm_agent.py、agents/base_agent.py、apps/app.py、apps/_configs.py、flows/llm_flows/base_llm_flow.py、flows/llm_flows/_live_llm_flow.py、flows/llm_flows/functions.py、flows/llm_flows/request_confirmation.py、tools/function_tool.py、tools/tool_context.py、tools/tool_confirmation.py、tools/_automatic_function_calling_util.py、tools/_function_parameter_parse_util.py、tools/_function_tool_declarations.py、features/_feature_registry.py、models/lite_llm.py、models/base_llm.py、models/google_llm.py、models/registry.py、sessions/database_session_service.py、sessions/vertex_ai_session_service.py、memory/__init__.py、telemetry/setup.py、telemetry/tracing.py、cli/api_server.py、cli/cli_tools_click.py、cli/_telemetry/_metrics_reporter.py、utils/_telemetry_config.py、__init__.py;样例contributing/samples/hitl/tool_confirmation/ - 文档:https://google.github.io/adk-docs/tools/confirmation/ / agents/models/litellm/ / agents/models/vllm/ / runtime/runconfig/ / live/models/ / sessions/session/ / sessions/memory/ / context/compaction/ / 2.0/ / observability/ / release-notes/
pydantic-ai
- https://pypi.org/pypi/pydantic-ai-slim/json / https://pypi.org/pypi/pydantic-ai/json / https://pypi.org/pypi/pydantic-ai-harness/json / https://api.github.com/repos/pydantic/pydantic-ai / https://api.github.com/repos/pydantic/pydantic-ai/releases / https://github.com/pydantic/pydantic-ai/releases/tag/v1.0.0 / v2.0.0 / v2.0.0b1 / v2.14.0 / v2.33.0 / https://github.com/pydantic/pydantic-ai/blob/main/LICENSE / pydantic_ai_slim/pyproject.toml
- 源码(main,2026-09-19T15:57Z,
pydantic_ai_slim/pydantic_ai/):__init__.py、_display.py、_deferred.py、_function_schema.py、_griffe.py、agent/__init__.py、agent/abstract.py、exceptions.py、messages.py、result.py、tools.py、models/__init__.py、models/openai.py、providers/openai.py、providers/_openai_compatible.py、providers/zai.py、profiles/openai.py、profiles/zai.py、profiles/deepseek.py、profiles/moonshotai.py、durable_exec/temporal/_logfire.py;本地解包pydantic_ai_slim-2.46.0-py3-none-any.whl做grep logfire - 文档(ai.pydantic.dev 已 301 到 pydantic.dev/docs/ai/):https://pydantic.dev/docs/ai/overview/install/ / core-concepts/agent/ / tools-toolsets/tools/ / tools-toolsets/tools-advanced/ / tools-toolsets/deferred-tools/ / capabilities/handle-deferred-tool-calls/ / capabilities/process-history/ / capabilities/compaction/ / capabilities/instrumentation/ / capabilities/durable_execution/overview/ / core-concepts/message-history/ / core-concepts/storage/ / models/openai/ / models/zai/ / integrations/logfire/ / project/version-policy/ / project/changelog/ / overview/migration/ / overview/enterprise-support/
Anthropic Python SDK 与 Claude Agent SDK
- https://pypi.org/pypi/anthropic/json / https://api.github.com/repos/anthropics/anthropic-sdk-python / …/releases / 源码(main,
https://raw.githubusercontent.com/anthropics/anthropic-sdk-python/main/前缀):src/anthropic/lib/tools/_beta_runner.py、_beta_functions.py、_tool_dispatch.py、__init__.py、src/anthropic/resources/beta/messages/messages.py、src/anthropic/resources/messages/messages.py、src/anthropic/_client.py、_constants.py、lib/streaming/_beta_types.py、_beta_messages.py、examples/tools_runner.py、tools_stream.py、tools.py、CHANGELOG.md、MIGRATION.md、LICENSE - https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-runner / https://platform.claude.com/docs/en/agents-and-tools/tool-use/handle-tool-calls / https://platform.claude.com/docs/en/api/openai-sdk
- https://pypi.org/pypi/claude-agent-sdk/json / wheel 实物
claude_agent_sdk-0.2.157-py3-none-macosx_11_0_arm64.whl(本地unzip -l)/ https://api.github.com/repos/anthropics/claude-agent-sdk-python / …/releases / 源码(main):src/claude_agent_sdk/_internal/transport/subprocess_cli.py、_internal/transport/__init__.py、_internal/client.py、query.py、_errors.py、_cli_version.py、_bundled/.gitignore、types.py、README.md、LICENSE、CHANGELOG.md、pyproject.toml/ https://github.com/anthropics/claude-agent-sdk-python/issues/333 - https://code.claude.com/docs/en/agent-sdk/overview / agent-sdk/python / env-vars / llm-gateway / llm-gateway-protocol / model-config / headless / https://www.anthropic.com/legal/commercial-terms
DeepSeek Harness
- https://api.github.com/repos/deepseek-ai/deepseek-harness / …/releases?per_page=30 / …/git/trees/master?recursive=1 / https://github.com/deepseek-ai/deepseek-harness/blob/master/README.md / SAFETY.md / package.json / python/README.md / python/sdk/README.md / python/sdk/pyproject.toml / packages/sdk/README.md / packages/sdk/client/README.md / packages/sdk/server/README.md / packages/bundle/sdk-minimal/README.md / packages/bundle/headless/README.md / docs/architecture.md / docs/user/guide/providers.md
- https://deepseek-harness.github.io/deepseek-harness/en/guide/providers / https://deepseek-harness.github.io/deepseek-harness/en/guide/python-sdk / https://registry.npmjs.org/@deepseek-ai/dsh / https://pypi.org/pypi/deepseek-harness-sdk/json / https://pypi.org/pypi/deepseek-harness-runtime-bin/json / https://pypi.org/pypi/deepseek-harness/json(第三方同名包)
仓库内
archive/wiki过时页/wiki-过时页-0908归档/50-AI助手运行底座harness选型调研.md(§1、§4、§5、§6、附录 A.3、A.4、A.5、A.8)docs/reports/2026-09-AI创业平台技术方案/AI创业平台技术方案.md:15、:181、:241、:391、:398、:455/tmp/ai-assistant-reeval/brief.md(本轮调研简报,不入库)