CopilotKit Built-in Agent 与 LangGraph-Python 参考集成的 Parity 对账指南
发布时间:2026/9/12 21:21:53 锦皓数字建站

CopilotKit Built-in Agent 与 LangGraph-Python 参考集成的 Parity 对账指南【免费下载链接】CopilotKitThe Frontend Stack for Agents Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit本文基于 CopilotKit 仓库中 PARITY_NOTES.md 编写系统梳理 Built-in AgentBIAshowcase 集成在迁移到Option A前端字节级对齐 LangGraph-Python 参考集成后与参考实现之间所有有意的适配、分歧与待修复差距。读完本文你将理解 BIA 的命名 Agent 注册机制、D6 探针与 harness 的正确对账方式、已知隔离quarantine项及解除条件、aimock fixture 的作用域陷阱以及一份面向真实 LLM 的后端审计修复清单——这些知识对参与该集成开发、编写 harness、维护 D6 探针或移植 demo 的工程师都有直接价值。为什么需要 Parity Notes审计者先读这份文件built-in-agentBIA是 CopilotKit 的 showcase 集成采用factory 模式Agent 以BuiltInAgent进程内方式运行在 Next.js API 路由处理器中不需要独立的 Agent 服务器进程。它的对账基准是LangGraph-PythonLGP参考集成showcase/integrations/langgraph-python。PARITY_NOTES 的存在意义在于审计者、harness 作者和 D6 探针维护者在标记缺失的对账项之前必须先查阅这份文件——因为 BIA 与 LGP 之间的差异大部分是有意为之比如 import 分组、命名 Agent 约定只有一小部分是真实的待修复缺陷。若不了解这些约定很容易把预期的 drift误报为回归。Option A前端与 LGP 字节级一致BIA 已迁移到Option A每一个src/app/demos/*前端都是对应 LGP 参考 demo 的逐字复制verbatim copy后端则是一个命名 Agent 注册表详见下一节。无论 LGP 渲染什么BIA 就渲染什么——不存在需要单独对账的 BIA 专属前端 fork。唯一的系统性差异是lint 机制层面的、而非语义层面的consistent-type-importsESLint 规范化。BIA 强制执行typescript-eslint/consistent-type-imports规则这是 PR 变绿的前提因此类型专用导入被拆分成import type { … }分组。约有 15 个 demo 前端与 LGP 源码的差异仅在于这种 import 分组。拆分在语义上与 DOM 输出完全一致类型导入在构建期即被擦除对运行时行为的影响为零。其余 demo 前端是逐字节完全相同的副本。因此harness 与 D6 探针应该基于能力与渲染出的 DOM来对账 BIA 与 LGP绝不要做源码文本级比较——import type分组是预期中且唯一被允许的 drift。Agent-id 约定命名 Agent 取代旧的default规则旧约定每个 demo 都指向字面量default已被取代、不再成立。不要再依赖它。现在每个 demo 指向的命名 Agent等于其前端agentid的值。这些名字注册在共享单路由注册表 src/app/api/copilotkit/route.ts 中需要隔离运行时a2ui、byoc/declarative、mcp、ogui、reasoning、auth、voice、multimodal、agent-config、beautiful-chat的 demo 则注册在专用的src/app/api/copilotkit-*路由中。从源码看共享路由中的注册表结构是const runtime new CopilotRuntime({ agents: { // 迁移期间保留的 catch-all Agent没有任何 demo 再指向它 default: createBuiltInAgent(), agentic_chat: createAgenticChatAgent(), chat-customization-css: createBuiltInAgent(), gen-ui-agent: createBuiltInAgent({ systemPrompt: GEN_UI_AGENT_PROMPT }), gen-ui-tool-based: createBuiltInAgent({ systemPrompt: GEN_UI_TOOL_BASED_PROMPT }), subagents: createBuiltInAgent({ systemPrompt: SUBAGENTS_PROMPT }), // 推理类 demo 走专门的 reasoning 适配器工厂 reasoning-custom: createAgenticChatReasoningAgent(), reasoning-default: createReasoningDefaultRenderAgent(), tool-rendering-reasoning-chain: createToolRenderingReasoningChainAgent(), // ...其余 ~20 个命名 Agent 共享 createBuiltInAgent() }, runner: new InMemoryAgentRunner(), });Agent-id 与前端映射的典型例子前端字面量 → 注册 Agent遗留下划线 id保留自字节级一致的 LGP 前端agentic_chat、frontend_tools、human_in_the_loop。连字符 id等于 demo slughitl-in-chat、hitl-in-app、shared-state-read、shared-state-read-write、subagents、gen-ui-agent、threadid-frontend-tool-roundtrip、reasoning-custom、reasoning-default、tool-rendering-reasoning-chain等。专用路由 Agentdeclarative-hashbrown-demo、byoc_json_renderdeclarative-json-render、a2ui-recovery、a2ui-fixed-schema、declarative-gen-ui、mcp-apps、multimodal-demo、auth-demo、agent-config-demo、voice-demo、beautiful-chat、open-gen-ui、open-gen-ui-advanced。harness 选择器、e2e spec 与 D6 探针凡是按 Agent-id 取 key 的必须使用 demo 自身的命名 Agent即其前端agent值而不是default。为向后兼容仍注册了一个通用 catch-alldefaultAgent但没有任何 demo 指向它。这也与 manifest.yaml 中注释的迁移说明相互印证。shared-state-streaming无逐 token 状态增量后端分歧BIA没有逐 token 的状态增量流式能力。该 demo 的前端已接线且与 LGP 字节级一致但进程内的 TanStack 后端不会像 LGP 的shared_state_streaming.py那样发射增量STATE_DELTAtoken。它在manifest.yaml的not_supported_features中被如实标记并渲染一个data-testidnot-supported-banner横幅见下文 NSF banners 一节。Interrupt demos被隔离上游 react-core RESUME-PATH buggen-ui-interrupt和interrupt-headless与 LGP 字节级一致使用相同的useInterrupt/useHeadlessInterrupt原语。它们被列入not_supported_features原因与 LGP 将其隔离的原因完全相同copilotkit/react-core/v2存在一个 RESUME-PATH hook bug——后端恢复并正常流式输出HTTP 200但前端从不追加确认用的 assistant 气泡导致 harness 的 DOM settle-check 超时。修复需要改发布包超出本集成的范围因此这两个 demo 被标记为 not-supportedskipped-incapable 侧行——既不是绿也不是红而非计为回归。它们仍保持接线状态。解除隔离的时机在同一个 bumpcopilotkit/react-core的 PR 中一并解除。Reasoning 三件套manifest 隔离以下三项在 manifest.yaml 中列入not_supported_features等待一个修复同类 RESUME-PATH bug 的copilotkit/react-core发布以及内置 factory 的后端 reasoning 事件发射能力reasoning-default-renderagentic-chat-reasoningtool-rendering-reasoning-chain其中tool-rendering-reasoning-chain仍是接线的 demo与 LGP 字节级一致后端由 src/lib/factory/reasoning-factory.ts 支撑但在隔离期间被排除在features:之外——这与 interrupt demos 的demo 存在但不是 feature形态相同。一旦上游react-core修复落地且factory 能稳定发射REASONING_MESSAGE_*事件就在react-corebump PR 中解除隔离。NSF bannersgraceful 的不支持横幅有两个 demo 渲染带data-testidnot-supported-banner的 graceful 横幅让 harness 能够确定性地探测它们而不是在缺失 UI 上超时gen-ui-interrupt隔离中见上文shared-state-streaming无逐 token 状态增量流式D6 探针应把命中not-supported-banner视为 PASS-SKIPPED而不是 FAIL。headless-complete 的服务端工具 reprompt 循环sequenceIndex fixture 门控BIA 通过 TanStack 的chat()引擎将get_weather/get_stock_price/get_revenue_chart/highlight_note注册为服务端执行工具。LLM 返回工具调用后TanStack 执行服务端工具并用结果重新提示 LLM原始用户 pill 文本始终保留在会话历史中因此按 userMessage 取 key 的 toolcall fixture 会在每次 reprompt 时天真地重新触发循环永不收敛。此外BIA 的/v1/responses端点还会把 assistant 的tool_call_id重写为运行时生成的fc-…值破坏了在非重写后端上有效的 toolCallId-keyed narration 回退。解决方案#5427 后续d6/built-in-agent/gen-ui-headless-complete.json将每个 pill 组织成(sequenceIndex:0 emitter, narration fallback)对emitter匹配该 pill 提示词的第一次请求计数器从 0 开始并发射工具调用随后的 BIA reprompt 迭代则穿过已耗尽的 emitter落到 narration 回退不再发射工具调用循环因此收敛。选择sequenceIndex而非hasToolResult:false的原因是hasToolResult是跨整个线程计算的——任何更早 pill 的工具结果都会永久禁用hasToolResult:false的 emitter从而破坏多轮会话。该模式是 BIA 专属的因为 LGP 将这些工具运行在 Python Agent内部并直接以 AG-UI 事件发射——没有 TanStack reprompt 循环——所以 LGP 的gen-ui-headless-complete.json保留着更简单的 userMessage-only emitter 模式。multimodalcopilot-add-menu-buttoncopilot-add-menu-button这个 testid 由copilotkit/react-core/v2的CopilotChatInput渲染随发布包一起发布不需要 BIA 侧的 cell 改动。multimodal demo 通过一个包装 CSS 选择器来样式化菜单按钮——可参考 LGP 的multimodaldemo 的模式BIA 的与其字节级一致。threadid-frontend-tool-roundtrip仅 feature无 catalog demothreadid-frontend-tool-roundtrip列在features:下——后端在 route.ts 注册了同名命名 Agent字节级一致的前端位于src/app/demos/threadid-frontend-tool-roundtrip/。它有意不作为demos:条目LGP 自己的 manifest 也没有 threadid demos 条目而且增加 demos 条目会因共享的showcase/shared/constraints.yaml中constrained-explicit白名单未列出它而导致validate-constraints失败。要将其作为 catalog demo 展示必须先把该 id 加入白名单独立 owner然后才能添加demos:条目。已知问题下游 Renderer / 状态订阅差距后续 PR剩余的 A2UI 失败位于集成层下游——即 A2UI renderer host。修复属于上游包copilotkit/react-core、A2UI renderer host已在后续 PR 中跟踪。集成层 diff源码级 testid、aimock fixtures、factory 后端接线是正确的。a2ui-fixed-schema — REDtestid 从不挂载D6 状态RED——a2ui-fixed-cardtestid 从不出现在 DOM 中。集成层正确源码 testid ✓aimock fixture 已创建并被消费 ✓a2ui-fixed-schema-factory.ts 发射格式良好的 v0.9 A2UI op 信封display_flight工具正常触发 ✓。缺失项A2UI renderer host 尽管收到了合法信封却没有把 Card 投影进 DOM。在 host 渲染之前任何集成层改动都无法满足 testid 预期。疑似修复位置A2UI renderer host 包在后续 PR 中跟踪。declarative-gen-ui — REDtestids 从不挂载D6 状态RED——declarative-card和declarative-metrictestid 从不出现。集成层正确源码 testid ✓aimock fixture 已创建并被消费三段式序列工作 ✓a2ui-factory.ts 的generate_a2ui正确触发 ✓。缺失项与a2ui-fixed-schema同类的 renderer-host 失败——host 未挂载投影的组件尽管生成流合法。疑似修复位置A2UI renderer host 包与a2ui-fixed-schema的 renderer-host 修复一起打包。注意declarative-gen-ui与mcp-apps在manifest.yaml中被标记为PENDING D6 CONFIRMATION候选 NSF并行 Agent 正在确认它们是下游-RED 而非已支持。在 orchestrator 定案前它们仍保留在features:中。gen-ui-agent — GREEN已收回react-core 前提已过时D6 状态GREEN——端到端通过 D6 探针。此前关于copilotkit/react-core存在STATE_DELTA → useAgent状态订阅差距的说法已过时被本地 D6 运行证伪。为什么能工作后端set_steps服务端工具结果在 tanstack-factory.ts 中被转换为STATE_DELTA[{op:add, path:/steps, value:steps}]set_steps分支。故意使用add而非replace是为了让 patch 即使在/steps尚不存在时也能落地且ag-ui/client0.0.57不会把它当作OPERATION_PATH_UNRESOLVABLE吞掉。接线在发布版 kit 中已完成——无需 react-core 改动。行动无——完全支持并计入。本地 D6 环境阻塞aimock:latest缺少上下文作用域有四个 cell 在本地变 RED原因是部署的ghcr.io/copilotkit/aimock:latest镜像没有实现context/x-aimock-contextfixture 作用域其 CLI 没有--context-field标志matchFixture也不做上下文检查。aimock 把所有 slug 的 fixtures 扁平加载按userMessage子串匹配先加载先命中d4/*在d6/*之前d6内部ag2在built-in-agent之前。因此对于userMessage跨 slug 共享的 pill更早加载的 fixture如d6/ag2/*或d4/*会遮蔽built-in-agent 自己的 fixture。这些遮蔽 fixture 使用toolCallId门控的 narration永远匹配不上 BIA/v1/responses重写后的fc-*tool-call id于是 reprompt 循环永不收敛。受影响的 cellBIA fixtures 本身是正确的在上下文感知的 aimock 下能收敛——已在过时镜像下验证为惰性/无效tool-rendering-custom-catchall已重写为 BIA 的sequenceIndexemitter narration 回退模式 4 个 LGP UI pills上下文重写headless-complete正确的sequenceIndexfixture 被遮蔽gen-ui-agent正确的竞品set_stepsfixture 被一个通用的{userMessage:summarize}d4条目遮蔽——与 STATE_DELTA add-op 无关factory 的add /steps没问题frontend-tools正确的sequenceIndexemitter 收尾 narration被d6/ag2/frontend-tools.json遮蔽修复基础设施非 BIA用一个包含context匹配的 aimock 构建重新部署showcase-aimockaimockorigin/main已具备。运行上下文感知 aimock 的 CI/staging 会显示这些 cell 为 GREEN。declarative-gen-ui 与 mcp-apps已解决为 GREEN非 NSF两者此前被怀疑为下游 host RED基于上下文作用域 aimock 的逐 demo 探针证明了相反结论——两者都是 GREENdeclarative-gen-ui—无改动即为 GREEN。此前的 RED 纯粹是跨 slug fixture 遮蔽见 aimock 一节a2ui-fixed-schema在同一个 A2UI renderer host 上通过说明 host 从来不是问题。全部四个 pill 都渲染出其 catalog testid断言通过。mcp-apps— fixture 修复后为 GREEN。根因excalidraw 的 MCPcreate_view工具在其inputSchema中把elements参数声明为字符串JSON 编码的数组但 fixtures 发射的是原始 JSON数组。BIA 通过jsonSchemaToZod→z.string()本地声明注入的 MCP 工具因此数组参数未通过输入校验、工具从未对 excalidraw 执行、没有ACTIVITY_SNAPSHOT触发、iframe 从未挂载。修复把elements作为 JSON 字符串发射在tool-rendering-reasoning-chain.json的create_view条目与mcp-apps.json的 flowchart 条目中。外部 MCP 服务器从 demo 容器是可达的——不是外部阻塞。这里涉及的jsonSchemaToZod位于 tanstack-factory.ts 中是一个浅层 JSON Schema → Zod 转换器覆盖{ type: object, properties: {...} }常见形态对string/number/integer/boolean/array做基本映射。它的设计意图代码注释中已说明是仅供 LLM 工具调用声明使用不做运行时校验。Real-LLM 后端审计针对真实 OpenAI 验证过的修复有一轮审计让 demos 面向真实OPENAI_API_KEY无 aimockOPENAI_BASE_URL未设置运行暴露了 aimock fixtures 掩盖的后端 bug。以下每项都已修复并在浏览器中端到端重验渲染 testids assistant 文本。这些与上面的 aimock/D6 备注正交。cvdiag 的.js导入扩展名——仅开发环境的/api/copilotkit500BLOCKERsrc/cvdiag/*.ts用显式.js扩展名导入兄弟模块如from ./schema.js。在next dev --turbopackmoduleResolution: bundler下这些 specifier 无法解析导致开发环境中每个请求到/api/copilotkit都返回 500。生产next build则能容忍。修复方式去掉schema.ts、edge-headers.ts、emit.ts、pb-writer-fetch.ts、cvdiag-emitter.ts中相对兄弟导入的.js扩展名。shared-state-read / shared-state-read-write —— UI 状态从未到达后端根因是demo 前端的客户端播种竞态而非转换器问题seed effect 以[]依赖运行因此它播种的是useAgent返回的临时agent而此时运行时/info同步仍在飞行中。当真实的运行时同步 agent 换入时新的引用[]-deps effect不会再跑于是真正被runAgent序列化进input.state的 agent 携带的是state: {}模型回答我没看到菜谱。运行时的convertInputToTanStackAI已经把input.state正确注入系统提示词。修复方式两个 demo 页面均改为在[agent]依赖上播种并用现有的!recipe/!preferences检查保护避免用户编辑被覆盖。已验证模型能读到播种的 recipe/preferences。shared-state-read-write ——set_notes结果未转为状态set_notes是服务端工具server-tools.ts返回{ notes }但tanstack-factory.ts的convertStream只把AGUISendStateSnapshot/AGUISendStateDelta/set_steps翻译为 STATE 事件。现已新增set_notes→STATE_DELTA add /notes分支与set_steps相同的 RFC-6902add-而非-replace理由。已验证让 Agent 记住某事会填充notes-list/note-item。declarative-gen-ui / a2ui-recovery —— 次级 A2UI LLM 输出空字符串a2ui-factory.ts的generate_a2ui此前传了modelOptions.response_format: { type: json_object }。TanStack 的openaiText面向 OpenAIResponsesAPI而 Responses API不接受Chat-Completions 的response_format参数——传入该参数会让次级调用返回空字符串已验证surface 因此从不绘制。修复方式移除response_formatJSON-only 输出改由系统提示词强制与 byoc factories 一致外加防御性的stripJsonFences解包该工具函数在 a2ui-factory.ts 中实现负责剥掉次级 LLM 可能加上的json …围栏。已在真实 OpenAI 上验证declarative-gen-ui与a2ui-recovery的 heal 回合会绘制declarative-metric/declarative-pie-chart/declarative-bar-chart。a2ui-recovery的exhaust/失败卡片路径由确定性 aimock fixtures 驱动——强制每个校验回合失败真实 LLM 会产出合法 surface因此失败卡片按设计无法在真实 key 下复现。Reasoning 三件套 —— 经 Responses API 的真实推理轨迹真实 OpenAI chat-completions不流式reasoning_content只有 aimock 流式因此此前的 chat-completionsextractReasoning适配器在真实 key 下产不出任何轨迹。reasoning-factory.ts现在改用openaiTextResponses API与其它所有 demo 相同的传输层搭配modelOptions.reasoning { effort: high, summary: auto }和一个type: custom转换器把 Responses-API 的 thinking STEP 块STEP_STARTEDstepType:thinkingSTEP_FINISHEDdeltas映射为REASONING_MESSAGE_*AG-UI 事件。已在真实 OpenAI 上验证reasoning-custom渲染reasoning-blockreasoning-default渲染内置的 Thought for … 块tool-rendering-reasoning-chain同时渲染推理块和工具卡片无 tool-render 回归。从源码看其实现细节如下reasoning-factory.ts模型默认为gpt-5.2可通过REASONING_MODEL环境变量切换为其它 Responses-API 推理模型如o3、gpt-5-thinking。推理强度默认为high可通过REASONING_EFFORT覆盖。自定义转换器维护REASONING_START → REASONING_MESSAGE_START → REASONING_MESSAGE_CONTENT* → REASONING_MESSAGE_END → REASONING_END生命周期一旦出现文本或工具调用立即关闭推理块文本与工具调用事件像tanstack-factory的转换器一样做了多轮重宣告去重。已记录的非阻塞注意点推理摘要要求effort: high在low/medium下真实 OpenAI 经常在短提示词上完成回合而不发射摘要 part。OpenAI 的提示词缓存意味着相同提示词被反复询问可能返回缓存完成无新推理摘要——首次/新鲜的询问可靠地产出。该改动把推理 demos 的传输层从 chat-completions 切换到 Responses API。文本 工具调用行为不变已验证如果 aimock D6 推理 fixtures 是为 chat-completions 的reasoning_content形态录制的需要为 Responses-API 推理摘要重新录制。manifest.yaml的not_supported_features条目保持不动此处无法在无 aimock 的情况下验证。auth voice 的[[...slug]]路由——仅开发服务器 500生产不受影响/api/copilotkit-auth/*与/api/copilotkit-voice/*仅有的两个 catch-all[[...slug]]路由其余路由都是单一route.ts会在请求时崩溃开发服务器的路由 worker——next dev --turbopack下经由 PostCSS/worker panic普通next devwebpack下则经由被掩盖的 Jest worker encountered … child process exceptionsWorkerError。崩溃发生在 handler 之下路由内的 try/catch 从不触发并且不会在生产中复现next buildnext start之后auth /info在带合法 token 时返回 200、不带时 401auth 聊天端到端运行assistant 回复、所有/info/run响应 200、零控制台错误voice /info返回 200。这是 catch-all API 路由 V2 运行时 handler 在next dev下的 dev-server 限制不是集成 bug——无需代码改动。生产不受影响。逐 demo system prompt —— 命名 Agent 注册表并非提示词中立LGP 给每个 demo 各自的 graph以及各自的 system promptlanggraph.json中有 28 个 graph。BIA 的注册表曾让约 20 个 demo 指向一个无提示词的createBuiltInAgent()其理论是逐 demo 行为由 aimock fixture 驱动。这在 D6 下成立但面对真实 LLM 会失败因为 fixture 回答的是一道模型从未被问过的问题。有五个 demo 在 D6 全绿的情况下实况是坏的Demo实况症状缺失的指令gen-ui-tool-based图表画出全零assistant 说未提供销售数据我用了占位值凭空构想示例值而不是索要数据移植自gen_ui_tool_based.pygen-ui-agent只调一次set_steps然后大段叙述进度卡片冻结在第 1 步逐步骤走完 pending → in_progress → completed移植自gen_ui_agent.pysubagents委派面板永远为空——转换器缺口见下节a2ui-recovery每个 pill 画出五张相同卡片每个请求只调用一次generate_a2ui这些提示词现在集中存放在 src/lib/factory/demo-prompts.ts通过createBuiltInAgent({ systemPrompt })传入。从 LGP 移植 demo 时务必连它的 graph 提示词一起移植——fixture 不会告诉你它丢了。以GEN_UI_TOOL_BASED_PROMPT为例它明确要求如果用户命名了图表主题但未提供具体数字例如展示一个按来源划分的网站流量饼图不要向他们索要数据。自己构想合理的示例值立即调用合适的render_*工具并在后续回复中简要注明这些值是示例。每个value必须是非零数字绝不要发射占位零。——这正是修复图表画全零症状的关键。state.slot需要转换器分支——没有按 Agent 的状态 schematanstack-factory.ts的convertStream是唯一发射 Agent 状态的地方。subagents曾发布了一个读取agent.state.delegations的前端但没有任何东西发射该 slot——于是子 Agent 工具正常执行、聊天正常填充、左侧日志却永远为空。现在它在每个子 Agent 结果上发射一个/delegationsdeltaLGP 用operator.addreducer 声明同一 slot并移植了 LGP 的_MAX_CRITIQUE_ITERATIONS 1上限防止 supervisor 堆叠重复的 critique 行。由 tanstack-factory.test.ts 钉住。从源码看转换器维护了delegations数组对research_agent/writing_agent/critique_agentSUBAGENT_TOOL_NAMES的结果逐条 push 并整数组add到/delegations还会从累积的TOOL_CALL_ARGS中抽取task文本args 流式分片到达解析失败时回退为空字符串。a2ui-recovery 只在 aimock 下演示恢复heal / recovery-exhausted 分支需要一个能按需发射非法 surface 的设计师 LLM。面对真实 LLM次级设计师第 1 次尝试就成功所以实况下 demo 只画出一张普通卡片、看不到恢复过程SINGLE_CALL_ADDENDUM提示词每个用户请求恰好调用一次generate_a2ui……即使结果看起来不对也绝不再调用第二次的存在是为了阻止 supervisor 重调工具画出重复卡片。要让该循环在实况可复现需要刻意注入故障——做一个故意失败的 demo。这被推迟为产品决策而非疏忽。何时更新这份文件维护纪律明确如下与文件末尾一致新增相对 LGP 的逐 demo 能力分歧 → 记录其理由。解除manifest 隔离 → 删除上面对应条目并在同一提交中翻转manifest.yaml的not_supported_features。新增NSF banner → 在此列出 demo testid。总结对账的黄金法则把 PARITY_NOTES.md 浓缩为三条可直接执行的原则对账目标永远是能力 渲染 DOM而非源码文本——import type分组是唯一允许的 drift。Agent-id 一律使用 demo 自身的命名 Agent前端agent值旧default约定已废弃命中not-supported-banner视为 PASS-SKIPPED。本地 RED 不等于集成 bug——先排除 aimock:latest的跨 slug fixture 遮蔽再对照本文件的已知下游renderer-host项与真实 LLM 审计结论最后才判定为回归。这份 Parity Notes 的价值正在于把预期差异、待解除的隔离、下游缺陷与已修复的实况 bug分层归档让后续每个接手者都能在对账时把火力集中在真正的问题上。【免费下载链接】CopilotKitThe Frontend Stack for Agents Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol项目地址: https://gitcode.com/GitHub_Trending/co/CopilotKit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。