copilot-kit-ag-ui 端到端验证指南:用真实服务器驱动 Claude Managed Agents 与 CopilotKit 演示
【免费下载链接】claude-quickstartsA collection of projects designed to help developers quickly get started with building deployable applications using the Claude API项目地址: https://gitcode.com/GitHub_Trending/an/claude-quickstarts
本指南基于 managed-agents/copilot-kit-ag-ui/.claude/skills/verify/SKILL.md 编写,围绕"如何验证对 copilot-kit-ag-ui 演示项目的改动"这一主题展开。该项目是一个由 Claude Managed Agent 驱动的个人理财助手聊天应用:Anthropic 托管 Agent 循环与容器,CopilotKit 渲染聊天界面,回复逐 token 流式输出,Agent 需要展示数字时会在对话内联渲染交互式图表。读完本文,你将掌握一套"无凭据冒烟验证 + 有凭据真实对话验证"的双路径验证方法,理解每个探针背后的源码链路,并能在改动后快速判断服务端、前端与 Agent 集成是否端到端可用。
验证的第一原则:构建并驱动真实服务器
SKILL.md 开门见山给出了一条铁律:
Build and drive the real server.
npm run typecheckis CI's job, not evidence.
意思是:类型检查是 CI 的职责,不是验证证据。要验证改动,必须真正构建前端、启动真实服务器,并用 HTTP 请求驱动它走完路由到 SDK 的完整路径。这与仓库的设计一致——CLAUDE.md 明确写着"There are no tests. Verify changes by running the app"(项目没有测试用例,验证方式就是运行应用)。
因此验证的基本流程固定在两条路径上:一是无 Anthropic 凭据时的冒烟验证(覆盖除真实 Agent 对话外的全部接线),二是有真实凭据时的端到端对话验证(覆盖含真实 Agent 回合的完整链路)。两条路径都以 README.md 中的命令体系为基础:npm install安装全部 workspace,npm run setup一次性预置环境与 Agent,npm run dev启动开发服务器(runtime 在 :8787,web 在 :5173),npm run build构建前端到web/dist,npm start以单端口运行生产服务器。
无凭据路径:用 stub ID 启动服务器并逐项探测
没有 Anthropic 凭据或尚未预置 Agent 时,服务器依然可以启动并服务除"真实 Agent 回合"之外的一切。因为服务器的启动只要求Agent 身份存在(ID 类环境变量或agent-ids.json),并不要求身份真实有效——真正的 API 调用发生在聊天消息发出之时。
启动命令
在仓库根目录的 managed-agents/copilot-kit-ag-ui 下执行:
npm install && npm run build ANTHROPIC_API_KEY=sk-ant-test ANTHROPIC_ENVIRONMENT_ID=env_x \ ANTHROPIC_AGENT_ID=agent_x ANTHROPIC_AGENT_VERSION=1 PORT=8799 npm startnpm run build先把 web workspace 构建出web/dist——这是后面静态服务探针的前提(见 Gotchas 一节);ANTHROPIC_API_KEY=sk-ant-test是无效的测试凭据,仅供冒烟测试,验证时用假值即可;ANTHROPIC_ENVIRONMENT_ID、ANTHROPIC_AGENT_ID、ANTHROPIC_AGENT_VERSION=1三个 stub ID 让 server/src/setup.ts 中的loadAgentIds()走"env vars first"分支——三个变量全部设置时优先于agent-ids.json,且三者必须同时出现,只设置其中一部分会被视为部署配置错误直接抛异常;PORT=8799覆盖默认端口 8787,避免与开发服务器冲突(对应 server/src/index.ts 的process.env.PORT ?? 8787)。
服务器启动时loadAgentIds()会在模块顶层执行(server/src/index.ts 的"Fail fast"设计),ID 缺失会立刻报No agent configured并退出——这是刻意为之:启动期报错好过聊到一半才报错。
探针一:根路径返回构建后的前端
GET :8799/期望返回构建好的web/dist/index.html。注意仓库没有 SPA catch-all 路由,未知路径一律 404。对应源码在 server/src/index.ts:fs.existsSync(webDist)成立时挂载express.static(webDist),仅当web/dist存在时静态服务才会激活。
探针二:info 端点列出已注册 Agent
GET :8799/api/copilotkit/info期望返回已注册的 Agent 列表。这个探针的价值在于:不发起任何 API 调用,就能确认 Agent 的 ID 与类注册是否正确。它验证的是 server/src/index.ts 中CopilotSseRuntime的接线——agents里注册了'financial-assistant'键,对应一个ManagedAgentsAgent实例(来自上游@ag-ui/claude-managed-agents包),并传入managedAgentId、agentVersion、environmentId与backendTools: vizTools。
探针三:POST run 端点走通完整路由并收到 Anthropic 401
POST :8799/api/copilotkit/agent/financial-assistant/run Content-Type: application/json {"threadId":"t1","runId":"r1","messages":[{"id":"m1","role":"user","content":"hi"}],"state":{},"tools":[],"context":[],"forwardedProps":{}}请求体是标准的AG-UI 消息结构(thread/run 标识 + 消息数组 + state/tools/context/forwardedProps)。期望结果:请求到达 AG-UI 适配器,随后因无效的sk-ant-test凭据从 Anthropic 返回401,这个 401 以 SSE 的RUN_ERROR事件形式回传。这个探针是整个无凭据路径的核心:一个来自 Anthropic 的 401 恰恰证明了"浏览器 → CopilotKit runtime → AG-UI 适配器 → Anthropic SDK"的完整路由是通的——链路接线正确,只是凭据无效。
探针四:CORS 行为验证
OPTIONS :8799/api/copilotkit Origin: https://example.com期望行为:设置ALLOWED_ORIGINS时,允许列表内的 Origin 收到回显的Access-Control-Allow-Origin头,列表外的 Origin 不收到该头。对应 server/src/index.ts 的 CORS 逻辑:ALLOWED_ORIGINS按逗号切分、trim、过滤空值后作为cors.origin白名单;未设置时默认放行所有 Origin(permissive CORS,本地开发没问题);设置但为空则拒绝所有跨域。由于该端点没有鉴权且每条消息都会消耗 API 额度,公开部署时必须设置ALLOWED_ORIGINS。
探针五:构建期烘焙 runtime URL
VITE_COPILOT_RUNTIME_URL=... npm run build grep web/dist/assets -r "<你的URL>"期望在web/dist/assets的产物中 grep 到该 URL,确认前端"构建期"就把 runtime 地址写死。对应前端源码 web/src/App.tsx:import.meta.env.VITE_COPILOT_RUNTIME_URL || '/api/copilotkit'。默认同源路径/api/copilotkit同时适用于开发代理与单进程部署;只有当前端与 runtime 分开托管时才需要在构建时注入该变量。
有凭据路径:真实 Agent 回合与内联图表
有真实凭据时,按 README.md 的正常流程走:
npm run setup # 一次性预置环境 + Agent npm run dev # runtime :8787,web :5173打开 http://localhost:5173,发送一个会触发可视化工具的问题,例如:
show me a growth projection for $500/month at 7%
期望结果是图表在对话内联渲染。这条路径验证的是生成式 UI(Generative UI)的完整闭环:
- Agent 调用
show_growth_projection可视化工具——四个可视化工具(payoff timeline 债务清偿、growth projection 增长预测、budget breakdown 预算分解、comparison 场景对比)定义在 server/src/vizTools.ts,作为backendTools传给 AG-UI 适配器; - 适配器把每次调用以
TOOL_CALL_*事件流式推送到浏览器; - 前端 web/src/viz/renderers.tsx 中的
useRenderTool注册把工具调用映射为 React 组件,CopilotChat将其内联挂载; - 组件的滑块在客户端重新计算图表(纯前端财务数学见 web/src/viz/finance.ts,无需再发起 Agent 回合);
- handler 的 ack 回传会话,回合继续流动。
一个有真实凭据的回合还应该验证会话记忆:每个聊天线程映射一个 managed session,追问"那如果我每月投 1000 呢"应能基于上文回答。服务器每次创建新会话时会在日志打印 Console trace URL(见 server/src/index.ts 的 sessionStore 包装),可以并排观察原始 Agent 活动。
Gotchas:验证中常见的三个坑
SKILL.md 明确记录了三个最容易踩的坑,验证时务必对照检查:
启动强制要求 Agent 身份。要么运行过
npm run setup生成了agent-ids.json,要么显式设置ANTHROPIC_ENVIRONMENT_ID、ANTHROPIC_AGENT_ID、ANTHROPIC_AGENT_VERSION三个环境变量。两者都缺失是刻意设计的启动失败——loadAgentIds()(server/src/setup.ts)会抛出No agent configured错误;三个变量只设部分同样报错。静态服务仅在
web/dist存在时激活。npm start不会自动构建前端,所以先npm run build再跑探针,否则GET /会 404。补充一个从源码与 CLAUDE.md 中归纳的关联注意点:workspace 根 package.json 通过
overrides把rxjs钉在 7.8.1——AG-UI 客户端与 CopilotKit runtime 之间交换 RxJS observable,若依赖树中出现两份 rxjs 会导致instanceof检查失败。遇到 Observable 相关的 instanceof 报错,从 workspace 根重新安装让 overrides 生效。
配置速查:验证与部署相关的环境变量
结合 README.md 的配置表与源码,验证/部署相关的变量如下:
| 变量 | 作用于 | 默认值 | 说明 |
|---|---|---|---|
ANTHROPIC_API_KEY | server | ant auth login配置文件 | API 凭据;冒烟测试可填sk-ant-test假值 |
ANTHROPIC_ENVIRONMENT_ID | server | 读自agent-ids.json | 无持久磁盘平台的环境 ID |
ANTHROPIC_AGENT_ID | server | 读自agent-ids.json | Agent ID,与其余两个 ID 变量成组设置 |
ANTHROPIC_AGENT_VERSION | server | 读自agent-ids.json | Agent 版本(整数,非整数启动即报错) |
PORT | server | 8787 | runtime 端口 |
ALLOWED_ORIGINS | server | 放行所有 | 逗号分隔的 CORS 白名单;设空 = 拒绝跨域 |
VITE_COPILOT_RUNTIME_URL | web 构建 | /api/copilotkit | 前端单独托管时的 runtime 地址,构建期烘焙 |
npm run setup结束时会打印三个ANTHROPIC_*ID 值,可直接粘贴到部署平台的 env 配置中;三个变量全部设置时优先于agent-ids.json(server/src/setup.ts)。
验证路径背后的源码支撑
无凭据探针之所以能"以假乱真"地验证大部分接线,根源在于 server/src/index.ts 的分层设计:
- 会话层:
InMemorySessionStore被包装成自定义SessionStore,只为在每个新会话创建时打印 Console trace URL(get/set/delete转发给内存实现); - 运行时层:
CopilotSseRuntime注册ManagedAgentsAgent,后者负责 AG-UI 线程 ↔ managed session 的全部翻译——文本增量流、TOOL_CALL_*事件、REASONING_*事件、断线中断、回合时长上限(单回合 5 分钟)都封装在上游包中,本仓库不含任何桥接代码; - 工具层:server/src/vizTools.ts 的四个
BackendCustomTool是"只渲染"工具——渲染本身就是结果,所以 handler 忽略输入、只返回"rendered to the user"确认。它们不在setup时注册到 Agent 上,而是由适配器在每个会话作为工具覆盖合并进 Agent 自带工具集,因此修改工具契约无需重新预置 Agent; - 渲染层:web/src/viz/renderers.tsx 对四个可视化工具各注册一个
useRenderTool,外加一个name: '*'的通配注册,把内置工具调用(web_search、bash、文件操作)渲染为可折叠的活动行(ToolActivity),避免工具调用在对话中"消失"。
值得一提的实现细节:renderers.tsx用带 coercion 的 zod schema解析工具参数,而不是盲目展开props.parameters——因为 CopilotKit runtime 各版本传递工具参数的形状不同(typed 对象、数字全字符串化的对象、嵌套数组以 JSON 字符串到达的对象),z.coerce负责把字符串化的数字转回数值,asRecord/parseStructured负责规整嵌套结构。这正是"真实服务器驱动验证"优于类型检查的又一例证:类型在编译期检查,而线格式在运行时才暴露。
总结
copilot-kit-ag-ui 的验证哲学可以概括为三句话:typecheck 不是证据,跑起来才是;没有凭据也能验证除真实回合外的全部接线;有凭据时用一个触发可视化工具的问题即可验证生成式 UI 的完整闭环。按本文的无凭据五探针 + 有凭据真实对话路径执行,配合 Gotchas 清单排查,即可在改动后快速、确定地回答"这个演示还能端到端跑通吗"。
【免费下载链接】claude-quickstartsA collection of projects designed to help developers quickly get started with building deployable applications using the Claude API项目地址: https://gitcode.com/GitHub_Trending/an/claude-quickstarts
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考