ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

手搓生产级 AI Agent 系统(17):Agent Registry 与 Capability Marketplace 实战——用 TaoToken 统一 Key 打通 Tool、Skill、MC

手搓生产级 AI Agent 系统(17):Agent Registry 与 Capability Marketplace 实战——用 TaoToken 统一 Key 打通 Tool、Skill、MC 1. 能力散落成灾从 10 个 Tool 到 500 个 Capability 的治理困局Agent 数量少的时候架构简单得让人安心一个 Agent 挂三五个 ToolTool 写在代码里谁要用谁 import。但半年后系统往往会膨胀成 25 个 Agent、18 个 Skill、60 个 REST Tool、14 个 MCP Server、9 个 Workflow、5 个模型 Provider 的混合体。这时候问题不再是“模型会不会调用 Tool”而是“整个组织到底有哪些能力、谁能发现、谁能调用、谁负责、出问题怎么停”。我见过最典型的场景某个团队要做一个合同风险分析功能翻遍代码库发现三个团队分别写了contract_risk、legal_review、contract_check三个 Tool底层访问的是同一个法务系统。没有统一目录重复造轮子根本发现不了。更危险的是当某个 MCP Server 紧急下线时平台无法在几分钟内回答“哪些 Agent、Workflow、租户受影响”只能靠grep -R tool_name .逐个仓库翻。这就是 Agent Registry 与 Capability Marketplace 要解决的核心问题。它不是做一个漂亮的“Agent 商店”而是先建立一套统一能力目录把 REST Tool、MCP Tool、Skill、Sub-Agent、Workflow 都抽象为可发现、可授权、可版本、可观测、可废弃的 Capability。然后通过 Discovery Policy、语义搜索、Risk Gate、Credential Broker 和 Invocation Ledger让模型只看到当前任务真正有权使用的一小部分能力。适合谁读正在把 Agent 从单体运行推向平台化的开发者手上有多个团队各自维护 Tool、Skill、MCP Server需要统一治理的架构师以及想让 Agent 能力可复用、可审计、可下线的技术负责人。本文会给出可复制的注册中心配置、能力清单结构与授权策略示例并用 TaoToken 统一 Key/API 通道完成多能力接入与复用验证。核心检索词先明确Agent Registry 是组织级能力目录Capability Marketplace 是能力复用与发现层两者共同构成 Agent Control Plane 的 Capability Plane。没有这一层Agent 平台永远停留在“每个项目自己接工具”的阶段。2. TaoToken 前置统一 Key 打通 Tool、Skill、MCP 的接入通道在动手写 Registry 之前先把接入通道统一。生产级 Agent 系统里Tool、Skill、MCP Server、Sub-Agent 往往各自对接不同的模型 ProviderKey 散落在环境变量、配置文件、密钥管理服务里。一旦要新增一个能力或切换模型就要改多处配置。TaoToken 的价值在于提供统一的 API 通道让所有能力通过同一个 Base URL 和 Key 访问模型Registry 只需要管理能力元数据不需要关心底层 Provider 差异。先拿到统一 Key。访问 https://taotoken.net/api-keys 创建 API Key建议按环境分 Key开发环境一个、预发一个、生产一个。生产 Key 不要写进代码仓库放进密钥管理服务Registry 的 Credential Broker 在调用时动态注入。Base URL 统一为https://taotoken.net/api注意这个地址不带 UTM 参数是纯 API 端点。模型对话调试可以用 https://taotoken.net/models 先验证通道是否通。如果你要做长期编码或 Agent 开发Coding Plan 页面 https://taotoken.net/coding-plan 有更详细的配额与模型说明。控制台在 https://taotoken.net/console 接入文档在 https://taotoken.net/doc 。这里要强调一个设计原则Registry 不保存长期 Credential。真正调用时走Capability Resolver → Policy → Credential Broker → 短期 Token → Adapter这条链路。TaoToken 的 Key 作为 Provider 层的凭证由 Credential Broker 按需签发短期 Token高风险 Capability 的 TTL 可能只有 1 到 5 分钟调用结束即失效。为什么要在 Registry 之前先统一 Key因为如果每个 Capability 背后绑定的 Provider 各自一套认证Credential Broker 就要为每种 Provider 写一套适配逻辑复杂度爆炸。统一到 TaoToken 之后Provider Binding 只需要记录providerType: taotoken和endpointRefCredential Broker 用同一套逻辑签发短期凭证。配置上建议在环境变量里放三个值export TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_API_KEYsk-your-key-here export TAOTOKEN_MODEL_IDclaude-sonnet-4-5Model ID 要写全Registry 的 CapabilityManifest 里providerBinding字段会引用它。如果你用 Claude Code 做开发接入配置在 https://taotoken.net/claudecode 有说明如果用 Codexauth.json 的配置方式在文档里有示例。Cline MCP 的接入也在文档覆盖范围内。统一 Key 之后Registry 的职责就清晰了它只管“有什么能力、谁能用、怎么授权”不管“底层用哪个 Provider 的哪个 Key”。这是关注点分离的关键一步。3. 可复制配置CapabilityManifest 与 Registry 注册中心落地现在进入实操。先定义 Capability 的统一抽象。不管背后是 REST Tool、MCP Tool、Skill、Sub-Agent 还是 Workflow对调用方来说都是“可复用能力”。用枚举统一类型public enum CapabilityType { REST_TOOL, MCP_TOOL, SKILL, SUB_AGENT, WORKFLOW, DATA_SOURCE }Capability 的最小 Contract 用 record 定义字段要覆盖生命周期、风险、权限、版本、Schema 哈希public record CapabilityManifest( String capabilityId, String displayName, CapabilityType type, String version, CapabilityStatus status, RiskLevel riskLevel, String ownerTeam, String description, String inputSchemaRef, String outputSchemaRef, SetString requiredScopes, boolean approvalRequired, InvocationLimits limits, String providerBinding, String schemaHash ) {}状态不要只有enabledtrue/false生产能力需要完整生命周期public enum CapabilityStatus { DRAFT, REVIEW, PRODUCTION, DEPRECATED, DISABLED }Registry 的配置文件用 JSON 落地路径放在config/registry/capabilities.json。下面是一个可复制的片段包含一个 MCP Tool 和一个 Skill{ capabilities: [ { capabilityId: crm.customer.read, displayName: 读取客户 CRM 信息, type: MCP_TOOL, version: v3, status: PRODUCTION, riskLevel: LOW, ownerTeam: sales-platform, description: 读取指定客户的 CRM 基本信息、当前销售阶段和最近 20 条跟进记录。只读不修改 CRM。Use when the task requires current CRM status. Do not use for contract, payment or support data., inputSchemaRef: schemas/crm.customer.read.input.json, outputSchemaRef: schemas/crm.customer.read.output.json, requiredScopes: [crm.read], approvalRequired: false, limits: { maxCallsPerRun: 5, timeoutSeconds: 10, estimatedCost: 0.002 }, providerBinding: taotoken-mcp-crm, schemaHash: sha256:9f2a... }, { capabilityId: legal.contract.risk, displayName: 合同风险分析, type: SKILL, version: v2, status: PRODUCTION, riskLevel: MEDIUM, ownerTeam: legal-tech, description: 分析合同条款风险输出风险等级与修改建议。只读不修改合同原文。, inputSchemaRef: schemas/legal.contract.risk.input.json, outputSchemaRef: schemas/legal.contract.risk.output.json, requiredScopes: [contract.read, legal.analyze], approvalRequired: false, limits: { maxCallsPerRun: 3, timeoutSeconds: 30, estimatedCost: 0.031 }, providerBinding: taotoken-skill-legal, schemaHash: sha256:3c7b... } ] }Provider Binding 单独定义让同一个业务能力可以做多 Provider 容灾{ bindings: [ { bindingId: taotoken-mcp-crm, capabilityId: crm.customer.read, providerType: taotoken, endpointRef: https://taotoken.net/api, version: v3, region: cn-east, priority: 1, status: ACTIVE } ] }Discovery 与 Invocation 必须拆开这是第一个关键安全边界。Policy 接口至少有两个动作public interface CapabilityPolicy { boolean canDiscover(AccessContext access, CapabilityManifest capability); InvocationDecision canInvoke(AccessContext access, CapabilityManifest capability, InvocationRequest request); }Policy 必须在语义搜索之前执行。如果 Registry 里有 1000 个能力错误顺序是“Embedding Search → Top 10 → 权限过滤”因为搜索结果本身就可能泄露未授权能力。正确顺序是“权限粗过滤 → 语义搜索 → 风险过滤 → 任务上下文过滤 → Top K”。这应该成为 Agent Registry 的默认规则。Discovery 请求与返回结构public record CapabilityDiscoveryRequest( String agentId, String tenantId, String subjectId, String purpose, String taskDescription, SetCapabilityType allowedTypes, RiskLevel maximumRisk, int limit ) {} public record CapabilityCandidate( String capabilityId, String version, String description, RiskLevel risk, boolean approvalRequired, double relevanceScore, CapabilityHealth health ) {}注意返回里不包含 Secret也不一定立即返回完整 Tool Schema。为什么要延迟加载假设企业有 800 个 Capability每个 Tool Schema 平均 500 Token一次性塞给模型就是 40 万 Token完全不可接受。合理流程是“Intent → Capability Discovery → 得到 5 到 10 个候选 → Materialize Tool Schema → LLM 选择 → Invoke”先发现能力再加载协议。评分可以组合语义相似度、关键词、Agent 亲和度、可靠度、延迟、成本score ( semantic * 0.40 keyword * 0.20 agent_affinity * 0.15 reliability * 0.10 latency_score * 0.05 cost_score * 0.10 )但 Permission Hard 和 Risk Gate 永远不进入加权平均。没有权限就是 0Critical 且不满足审批就是 0不能因为语义相关度很高就突破权限。Description 要像 API 文档不是营销文案。差的描述是“一个智能、强大、灵活的客户管理工具”模型完全不知道该什么时候用。好的描述是“读取指定客户的 CRM 基本信息、当前销售阶段和最近 20 条跟进记录。只读不修改 CRM”再进一步加上“Use when the task requires current CRM status. Do not use for contract, payment or support data. Read-only.”。Description 本身也是 Agent 选择质量的一部分。4. 验证请求用 TaoToken 统一通道跑通多能力接入与复用配置写完后要验证 Registry 能否正确发现能力、Policy 能否正确拦截、Credential Broker 能否签发短期 Token、Adapter 能否通过 TaoToken 统一通道完成调用。下面给出一套可执行的验证流程。第一步启动 Registry 服务加载config/registry/capabilities.json。用 curl 验证 Discovery 接口curl -X POST https://your-registry.local/api/discovery \ -H Content-Type: application/json \ -H Authorization: Bearer $REGISTRY_TOKEN \ -d { agentId: sales-renewal-agent, tenantId: tenant-001, subjectId: user-42, purpose: renewal-analysis, taskDescription: 评估客户续约风险需要 CRM 当前状态, allowedTypes: [MCP_TOOL, SKILL], maximumRisk: MEDIUM, limit: 5 }预期返回 5 个以内的候选每个包含capabilityId、version、relevanceScore、health。如果返回空检查 Policy 的canDiscover是否把crm.readscope 正确映射到sales-renewal-agent。第二步验证 Policy 拦截。用一个没有contract.readscope 的 Agent 请求合同风险能力curl -X POST https://your-registry.local/api/discovery \ -H Content-Type: application/json \ -H Authorization: Bearer $REGISTRY_TOKEN \ -d { agentId: hr-agent, tenantId: tenant-001, subjectId: user-99, purpose: hr-query, taskDescription: 查询员工合同, allowedTypes: [SKILL], maximumRisk: MEDIUM, limit: 5 }预期legal.contract.risk不出现在结果里。如果出现了说明 Policy 在语义搜索之后才执行顺序错了。第三步验证 Credential Broker 签发短期 Token。调用 Invocation 接口curl -X POST https://your-registry.local/api/invoke \ -H Content-Type: application/json \ -H Authorization: Bearer $REGISTRY_TOKEN \ -d { runId: run-20250101-001, stepId: step-3, agentId: sales-renewal-agent, subjectId: user-42, tenantId: tenant-001, purpose: renewal-analysis, capabilityId: crm.customer.read, capabilityVersion: v3, arguments: {customerId: C-10086} }预期返回InvocationResult包含status: SUCCESS、latency、cost。Credential Broker 内部用 TaoToken 的 Key 签发短期 TokenTTL 默认 5 分钟。如果返回 401检查TAOTOKEN_API_KEY是否有效以及providerBinding是否指向正确的endpointRef。第四步验证 Invocation Ledger 落库。查询最近一次调用记录curl https://your-registry.local/api/ledger?runIdrun-20250101-001 \ -H Authorization: Bearer $REGISTRY_TOKEN预期返回CapabilityInvocationRecord包含capabilityId、capabilityVersion、providerBinding、risk、status、latency、cost、startedAt。这条记录是后续审计、成本归因、热度分析、Deprecated 影响面分析的基础。第五步验证 Emergency Disable。把crm.customer.read的disable_discovery设为 true重新请求 Discovery预期该能力不再出现。再把disable_invocation设为 true请求 Invoke预期返回DENY。两个动作分开先阻止新任务使用正在运行的任务按风险决定继续、取消还是人工介入。第六步验证多 Provider 容灾。给crm.customer.read增加第二个 bindingpriority: 2指向备用 endpoint。把主 binding 的status设为DEGRADED重新 Invoke预期自动切到备用 binding。这一步验证了 Capability 与 Provider 分离的价值。跑完这六步Registry 的核心链路就通了Discovery 能发现、Policy 能拦截、Credential 能签发、Adapter 能调用、Ledger 能记录、Kill Switch 能止血。接下来才是 Marketplace 的评分、推荐、模板、跨团队复用。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 对照接入过程中最容易踩的坑集中在认证、代理、响应解析和 OAuth 四类。下面按真实报错逐个排查。401 Unauthorized。最常见的原因是TAOTOKEN_API_KEY没设置或写错。检查环境变量echo $TAOTOKEN_API_KEY | head -c 8如果输出为空说明没导出。另一个原因是 Key 过期或被撤销去 https://taotoken.net/api-keys 重新生成。还有一种情况是 Credential Broker 签发的短期 Token TTL 已过调用发生在 TTL 之后。把 TTL 从 1 分钟调到 5 分钟或者检查调用链路是否有重试导致 Token 复用超时。local proxy failed。这个报错通常出现在本地开发环境Agent 尝试通过本地代理访问 TaoToken API 但代理未启动或端口不对。检查HTTP_PROXY、HTTPS_PROXY环境变量是否指向了一个不存在的端口。生产环境不要设置这些变量直接让请求走https://taotoken.net/api。如果公司网络有出口限制联系网络团队放行taotoken.net域名不要用本地代理绕。reading choices 报错。这个错误一般出现在解析模型响应时代码期望response.choices[0].message.content但实际返回结构不同。原因可能是 Model ID 写错或者请求体里stream: true但代码按非流式解析。检查TAOTOKEN_MODEL_ID是否与文档一致流式请求要用 SSE 解析。另一个原因是 Registry 的 Adapter 在 Materialize Tool Schema 时把tools字段格式写错导致模型返回了非预期结构。对照文档里的请求示例逐字段核对。OAuth 相关报错。如果 Capability 背后是 OAuth 保护的 MCP Server报错可能是invalid_scope或token_expired。检查requiredScopes是否与 OAuth Provider 注册的 scope 一致。Credential Broker 签发短期 Token 时scope 要从InvocationContext.grantedScopes取不能硬编码。如果报OAuth callback failed检查回调地址是否在 Provider 白名单里。Schema 不匹配报错。Tool 参数改一个字段就可能让旧 Agent 失败。Registry 保存schemaHash升级时如果是 Breaking Change旧版本保留兼容期不要原地覆盖。报错schema_hash_mismatch时检查 Agent 缓存的 Schema 是否过期强制刷新 Discovery 结果。Discovery 返回空。按顺序排查Policy 的canDiscover是否返回 falsemaximumRisk是否设得太低allowedTypes是否漏了目标类型语义搜索的 embedding 服务是否正常CapabilityHealth是否把该能力标记为 UNHEALTHY 导致隐藏。逐个排除不要一上来就改代码。Invocation 超时。检查limits.timeoutSeconds是否设得太短MCP Tool 冷启动可能超过 10 秒。检查 Provider Binding 的endpointRef是否可达。检查 TaoToken 通道是否正常用 https://taotoken.net/models 做一次模型对话验证。Credential 泄露风险。如果发现 Registry 日志里打印了完整 Key立即检查日志脱敏配置。Registry 不保存长期 Credential短期 Token 也不应该落日志。Invocation Ledger 只记录invocationId、capabilityId、status、latency、cost不记录 Token 本身。CC Switch / Cline MCP / Codex auth.json 配置三件套。如果你用这些工具接入必须写全三件套Base URL 填https://taotoken.net/apiKey 填sk-开头的 API KeyModel ID 填完整模型名如claude-sonnet-4-5。缺任何一个都会报认证或模型不存在错误。Codex 的auth.json里base_url和api_key要对应Cline MCP 的mcpServers配置里env要带上TAOTOKEN_API_KEY。6. 从 Registry 到 Marketplace能力复用与语义一致的接入路径基础治理稳定之后才有资格做 Marketplace。Marketplace 可以增加 Rating、Usage、Owner、Examples、Templates、Install、Subscription但最重要的仍然不是 UI而是每个能力必须先有 Owner、Version、Permission、Risk、SLO、Contract。没有这些Marketplace 只是把混乱展示得更漂亮。一个内部 Marketplace 页面应该显示Customer Renewal AnalysisType: WorkflowOwner: Sales PlatformVersion: v8Risk: MediumUsed by: 18 AgentsSuccess Rate: 94.1%P95: 12.8sCost: $0.031 / invocationPermissions: crm.read contract.readApproval: No。用户点击“Add to Agent”不是直接安装先走 Policy Check。推荐算法也要小心。如果按调用量排序很容易产生“热门越来越热门”。更合理的推荐看任务相关性、权限、组织认可、可靠度、成本、风险不是 App Store 的下载排行榜。Registry 还有一个很实在的作用减少重复造 Tool。团队 A 做customer_search团队 B 做crm_lookup团队 C 做find_account三套代码访问同一个 CRM。Registry 在新建 Capability 时做 Semantic Duplicate Detection提示“已有 3 个相似能力”让团队决定复用还是新建。Capability Promotion 流程DRAFT → REVIEW → STAGING → PRODUCTION。检查 Schema、权限、风险、Owner、测试、SLO、审计、成本高风险 Tool 再加安全 Review。Deprecated 不等于立刻下线Manifest 里保存announced_at、disable_at、replacement、migration_noteDiscovery 结果提醒 Agent“这个 Capability 即将下线”新 Run 不再选择旧 Workflow 有迁移期。Emergency Disable 要支持两个动作分开disable_discoverytrue阻止新任务使用disable_invocationtrue立即阻断。Kill Switch 范围支持 CAPABILITY、PROVIDER_BINDING、AGENT、TENANT、GLOBAL不必一出问题就停整个 Agent 平台。Observability 层指标capability_discovery_total、capability_discovery_empty_total、capability_invocation_total、capability_policy_denied_total、capability_approval_required_total、capability_schema_error_total、capability_provider_failure_total、capability_cost_total。Marketplace 层看capability_reuse_count、capability_unique_agents、capability_deprecation_remaining_users。一个非常有用的指标是 Reuse Ratio被 2 个以上 Agent 使用的 Capability 除以全部生产 Capability。如果只有 8%说明公司所谓“平台能力”很可能仍是各项目私有代码。逐步增长到 20%、40%、60%才说明复用层开始形成。另一个指标是 Orphan Capability没有 Owner、没有调用、没有消费者的能力应该定期清理否则 Registry 会变成工具坟场。Agent Registry 本身也需要 AgentManifestpublic record AgentManifest( String agentId, String version, String ownerTeam, AgentStatus status, String modelProfile, SetString capabilityPolicies, String promptRef, String memoryPolicyRef, String runtimeProfile, String evaluatorSuiteRef ) {}一个 Agent 不应该绑定具体 Tool。差的写法是tools: [crm_get_customer_v3, crm_get_contract_v2]成熟的写法是capabilities: [crm.customer.read, contract.current.read]。运行时 Registry 决定绑定哪个 Provider 和具体实现底层 Tool 升级不会强迫所有 Agent 改 Prompt。Capability Marketplace 的真正终点不是让员工像装 App 一样装 Agent而是让组织中已经验证过的 AI 能力能够被安全、低成本地重新组合。一个销售团队跑通customer-risk以后续约 Agent、售前 Agent、客服 Agent 都可以复用不再每个团队重写 Prompt、重接 CRM。这才是平台真正产生规模效应的地方。接入路径上排障和接入问题去 https://taotoken.net/api-keys 拿 Key配合 https://taotoken.net/doc 的接入文档验证模型通道用 https://taotoken.net/models 做模型对话长期编码和 Agent 开发用 https://taotoken.net/coding-plan 的 Coding Plan。控制台在 https://taotoken.net/console 管理配额和 Key。Claude Code 接入看 https://taotoken.net/claudecode Codex 和 Cline MCP 的配置在文档里有完整示例。最后给一份上线检查清单Tool、Skill、MCP、Sub-Agent 和 Workflow 有统一 Capability IDCapability 有 Owner、Version、Risk 和 StatusDiscovery 与 Invocation 权限分离Policy 在语义搜索之前执行Agent 不一次加载全部 Tool SchemaCredential 不存 Registry调用使用短期 Credential高风险 Capability 支持 ApprovalBreaking Schema 有兼容期MCP Server 被视为 Provider BindingRegistry 可以查询 Agent → Capability 影响图每次调用进入 Invocation LedgerCapability Health 参与路由Deprecated 有替代项和截止时间Emergency Disable 可以阻止发现和调用Marketplace 上线前先完成治理字段重复 Capability 能被发现Agent 绑定业务 Capability不绑定具体实现。生产 Agent 平台发展到一定规模以后瓶颈会从“模型会不会调用 Tool”变成“整个组织到底有哪些能力谁能发现谁能调用谁负责出了问题怎么停”。Capability Registry 解决能力治理Marketplace 解决能力复用。当 Tool、Skill、MCP Server、Sub-Agent 和 Workflow 都进入同一个能力层以后Agent 才能从“每个项目自己接工具”真正进入平台化。
返回列表