AOS 胶囊身份组装,TaoToken 作为 LLM API 入口

发布时间:2026/9/19 2:31:18
AOS 胶囊身份组装,TaoToken 作为 LLM API 入口 1. 从spark.v1.request.build到 LLM 调用身份组装后缺的是 API 入口capsule-identity 里最容易被忽略的不是save_identity而是spark.v1.request.build到spark.v1.response.ready之后的那一步系统提示词已经组装好Agent 要去调 LLM于是 Base URL、Key、模型名和 Token 消耗全出现了。本文把这一步的 LLM API 入口统一收到 TaoToken拿 Key 和看入口先从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentcapsule_identity_intro 开始。如果你正在给 AOS 写胶囊capsule-identity 的价值不只是“把提示词拼起来”。它把 Agent 的身份拆成可持久化状态呼号、类别、气质、信号、核心指令再在构建事件到来时叠加运行环境例如当前目录、平台类型、会话信息。这个模块由 Rust 写成采用双协议开源在 GitHub 上有一定关注度定位类似 Agent 系统里的/etc/profile启动时确定“我是谁、我在哪、我该遵守什么”。但身份组装完成并不等于 Agent 能工作。系统提示词只是输入的一部分后面还要调用模型。只要 Agent 开始推理、规划、调用工具就会消耗 Token。于是工程上会出现一个新的配置面LLM API 入口放在哪里Key 怎么下发Base URL 怎么填Claude Code、Codex、CC Switch 这类工具如何共用同一套入口。本文的可复现产出很明确在 capsule-identity 组装出系统提示词之后把 LLM API 入口配置为 TaoTokenBase URL 使用https://taotoken.net/apiKey 占位符使用YOUR_API_KEY。需要先说明capsule-identity 不是普通用户开箱即用的聊天产品它更像 Agent OS 里的一块基础设施。它通过 IPC 主题订阅和发布协作订阅构建请求发布准备好的提示词也可能接收保存身份的工具调用。作为 AOS 胶囊开发者我们真正要解决的是两段链路第一段是身份状态如何稳定组装第二段是组装后的提示词如何进入 LLM API。本文按这两段链路来落地。2. 复现 capsule-identity 身份组装的本地 Rust 骨架先不急着接完整 AOS可以在本地写一个最小 Rust 工程把身份结构、回退探测和系统提示词拼装逻辑复现出来。capsule-identity 的事件流程可以概括为收到构建请求后先从胶囊 KV 读身份KV 为空时探测home://.config/spark.toml随后补运行环境最后发布系统提示词。如果还没有身份就生成 onboarding 说明引导 LLM 调用保存动作把呼号、类别、气质、信号、核心指令写回状态并留下恢复副本。下面是一个可编译的 Rust 骨架。它不是 Unicity AOS 的完整实现而是把身份组装的核心数据流抽出来方便你接到自己的胶囊工程里。[package] name capsule-identity-llm version 0.1.0 edition 2021 rust-version 1.94 [dependencies] tokio { version 1, features [macros, rt-multi-thread] } reqwest { version 0.12, features [json] } serde { version 1, features [derive] } serde_json 1 toml 0.8 anyhow 1use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SparkIdentity { pub callsign: String, pub category: String, pub temperament: String, pub signal: String, pub core_instructions: VecString, } pub fn load_identity_or_onboarding() - SparkIdentity { let p std::path::Path::new(.config/spark.toml); if p.exists() { let raw std::fs::read_to_string(p).expect(read spark.toml); toml::from_str(raw).expect(parse spark.toml) } else { SparkIdentity { callsign: candidate.into(), category: assistant.into(), temperament: calm.into(), signal: onboarding.into(), core_instructions: vec![ 先完成身份引导再执行外部动作.into(), 所有外部动作都要显式记录.into(), ], } } } pub fn build_system_prompt(id: SparkIdentity, cwd: str, platform: str) - String { format!( You are {callsign}.\nCategory: {category}\nTemperament: {temperament}\nSignal: {signal}\nCore instructions:\n- {instructions}\nRuntime context:\n- cwd: {cwd}\n- platform: {platform}\n, callsign id.callsign, category id.category, temperament id.temperament, signal id.signal, instructions id.core_instructions.join(\n- ), cwd cwd, platform platform ) }这个骨架对应了 capsule-identity 的几个关键点。SparkIdentity是身份状态的序列化形态load_identity_or_onboarding先查.config/spark.toml失败则进入引导build_system_prompt把身份字段和运行上下文拼成最终提示词。真实 AOS 中状态不是全局的而是按 principal 隔离。principal 可以理解为调用主体不同主体看不到彼此的身份 KV。会话 ID 也会被回传方便在多轮循环里把一次身份构建和后续 LLM 调用关联起来。如果你在本地跑可以用下面命令验证cargo build cargo test cargo run编译通过后你拿到的不是一段写死在代码里的提示词而是一个由状态和上下文共同生成的system_prompt。下一步才是把它送进 LLM。3. 把系统提示词接到 TaoTokenKey、Base URL 与最小调用身份组装完成后Agent 需要调用 LLM。此时不要在代码里硬编码 Key也不要在多个工具里散落不同的 API 入口。这里统一从 TaoToken 获取 KeyBase URL 使用https://taotoken.net/apiKey 用占位符YOUR_API_KEY表示。配置前先去官网控制台拿 Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentcapsule_identity_sdk 。拿到后放在环境变量里不要提交到仓库。export TAOTOKEN_API_KEYYOUR_API_KEYRust 侧可以用reqwest发一个最小请求。注意这里的 Base URL 是https://taotoken.net/api手动拼接路径时按你所用接口补全。下面示例把系统提示词作为system消息传入并把session_id放进 metadata方便和 capsule-identity 的会话回传对齐。use anyhow::Context; use reqwest::Client; use serde_json::json; pub async fn call_taotoken(system_prompt: str, session_id: str) - anyhow::Resultserde_json::Value { let api_key std::env::var(TAOTOKEN_API_KEY) .context(请先设置 TAOTOKEN_API_KEYKey 占位符为 YOUR_API_KEY)?; let base_url https://taotoken.net/api; let body json!({ model: gpt-4o-mini, messages: [ {role: system, content: system_prompt}, {role: user, content: 请用一句话确认你的呼号、类别和当前工作目录。} ], metadata: {session_id: session_id}, temperature: 0.2 }); let resp Client::new() .post(format!({base_url}/v1/chat/completions)) .bearer_auth(api_key) .json(body) .send() .await?; let status resp.status(); let text resp.text().await?; if !status.is_success() { anyhow::bail!(TaoToken API 返回 {}: {}, status, text); } let value: serde_json::Value serde_json::from_str(text)?; Ok(value) }如果你更习惯 Python可以用requests做同样的验证import os import requests base_url https://taotoken.net/api api_key os.environ[TAOTOKEN_API_KEY] system_prompt You are candidate. Category: assistant. Signal: onboarding. resp requests.post( f{base_url}/v1/chat/completions, headers{Authorization: fBearer {api_key}}, json{ model: gpt-4o-mini, messages: [ {role: system, content: system_prompt}, {role: user, content: 确认身份。} ] }, timeout60, ) resp.raise_for_status() print(resp.json()[choices][0][message][content])这里的重点不是模型名而是入口的一致性。capsule-identity 负责身份TaoToken 负责 LLM API 入口。只要你把 Base URL 和 Key 抽成环境变量后续换模型、换工具、换运行环境时胶囊身份组装逻辑不需要跟着重写。4. Claude Code 侧settings.json 与 CC Switch 三件套很多 AOS 开发者会在本地用 Claude Code 辅助调试胶囊工程。Claude Code 读取的是ANTHROPIC_*系列环境变量因此配置时不要把 Codex 的字段混进来。典型做法是在项目或用户级settings.json中设置三件事Base URL、认证 Token、模型名。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }这里的ANTHROPIC_BASE_URL使用https://taotoken.net/apiANTHROPIC_AUTH_TOKEN使用YOUR_API_KEY模型名按你在 TaoToken 控制台可用的模型选择。更推荐把 Key 放到系统环境变量或密钥管理里而不是直接写进settings.json。如果你用 CC Switch 管理多套 Claude Code 配置可以把下面“三件套”固定下来配置项推荐值说明Base URLhttps://taotoken.net/apiClaude Code 通过ANTHROPIC_BASE_URL读取API KeyYOUR_API_KEY建议用环境变量注入不提交仓库Model控制台可用模型对应ANTHROPIC_MODELCC Switch 的意义是把这三件套在不同项目间切换而不是让你每次手改配置文件。你可以准备一套“胶囊开发”配置指向 TaoToken 入口再准备一套“临时实验”配置。切换后重启 Claude Code或者在终端确认环境变量已生效echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_MODEL test -n $ANTHROPIC_AUTH_TOKEN echo token set如果你还没有 Key先去官网控制台创建https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentcapsule_identity_ccswitch 。创建后把 Key 填到 CC Switch 或环境变量中。注意 Claude Code 使用ANTHROPIC_*Codex 不使用这套字段下一节会单独讲。5. Codex 侧config.toml 用独立 model_provider别混 ANTHROPIC_*Codex 的配置入口是config.toml它和 Claude Code 的settings.json不是一套体系。不要在 Codex 里设置ANTHROPIC_BASE_URL或ANTHROPIC_AUTH_TOKEN因为 Codex 的 provider 配置读取的是model_providers和env_key。把 TaoToken 作为自定义 provider 写入即可。model gpt-5 model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat然后设置环境变量export TAOTOKEN_API_KEYYOUR_API_KEY这里的base_url仍然使用https://taotoken.net/apienv_key指向TAOTOKEN_API_KEY。wire_api按你当前 Codex 版本支持的值填写示例用chat。如果你在同一个终端里同时调试 Claude Code 和 Codex建议分别开终端避免环境变量串扰# Claude Code 终端 export ANTHROPIC_AUTH_TOKENYOUR_API_KEY export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_MODELclaude-sonnet-4-20250514 # Codex 终端 export TAOTOKEN_API_KEYYOUR_API_KEYCodex 启动后如果 provider 配置正确它会用TAOTOKEN_API_KEY发请求。若报认证错误优先检查是否是 Key 没导出而不是去改ANTHROPIC_*。两套工具共用同一个 TaoToken 入口但变量名和配置文件必须分开。6. 多轮会话与 Token 观测会话 ID 如何贯穿胶囊与 APIcapsule-identity 的构建响应会回传会话 ID这个 ID 对多轮循环很重要。因为身份不是一次性的Agent 可能在后续回合里继续引用呼号、核心指令和环境信息。把会话 ID 带到 LLM 请求里可以把“身份构建”和“模型调用”串成可追踪链路。一个简单的审计结构可以这样设计#[derive(Debug, serde::Serialize)] struct LlmAudita { session_id: a str, principal: a str, callsign: a str, prompt_chars: usize, } pub fn record_audit(session_id: str, principal: str, id: SparkIdentity, prompt: str) { let audit LlmAudit { session_id, principal, callsign: id.callsign, prompt_chars: prompt.len(), }; println!({}, serde_json::to_string(audit).unwrap()); }LLM 响应里通常包含 usage 字段可以记录 prompt tokens、completion tokens 和总消耗。身份组装出的系统提示词如果很长每轮都重复发送会带来额外 Token 成本。工程上可以按 principal 和会话 ID 缓存一部分稳定身份只在环境变化时重新构建。但缓存不能破坏隔离不同 principal 不能共享身份缓存否则会出现身份串读。如果你要查看 Key 和用量入口可以在控制台管理https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentcapsule_identity_usage 。建议给本地开发、CI、生产 Agent 分配不同 Key至少在日志里能区分调用来源。capsule-identity 管身份状态TaoToken 管 API Key 和模型入口两边通过会话 ID 和 principal 对齐。7. 排障清单身份为空、spark.toml 探测失败、401 与 base_url 拼接接 TaoToken 时最常见的问题不在模型而在配置链路。下面按 capsule-identity 开发顺序列一份排障清单。第一身份为空。构建提示词里出现 onboarding 说明说明 KV 中没有持久化身份回退探测也没有找到有效spark.toml。这时不要急着改 LLM 参数先让引导流程走完确认save_identity被调用并把呼号、类别、气质、信号、核心指令写回状态。第二home://.config/spark.toml探测失败。检查当前 principal 是否有权限读取该路径检查文件格式是否为合法 TOML。字段缺失时反序列化会失败表现可能像“没有身份”。可以在本地用命令确认ls -la .config/spark.toml tomlq . .config/spark.toml第三换 principal 后读不到身份。这是隔离机制的预期行为。capsule KV 按调用主体隔离不是全局缓存。调试时确认你使用的是同一个 principal或者显式重新走引导。第四401 或认证失败。先确认TAOTOKEN_API_KEY已导出且值为YOUR_API_KEY对应的真实 Key。拿 Key 的入口在官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentcapsule_identity_troubleshooting 。不要在代码里写死 Key也不要把 Claude Code 的ANTHROPIC_AUTH_TOKEN拿去给 Codex 用。第五404 或路径拼接错误。SDK 的 Base URL 填https://taotoken.net/api手动拼接时不要重复叠加/v1。例如已经设置了 base_url 再拼/v1/chat/completions是合理的但如果你在 base_url 里又写了/v1就可能出现/api/v1/v1/...。用 curl 先验证入口export TAOTOKEN_API_KEYYOUR_API_KEY curl -sS https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json | head -c 800第六Claude Code 和 Codex 配置串了。记住Claude Code 用ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODELCodex 用config.toml的model_providers和env_key。把这两套分开排障范围会小很多。第七Token 消耗异常。身份提示词越长重复调用成本越高。可以把环境上下文压缩成短字段例如只保留 cwd 和 platform把详细说明留在本地文档里。Agent 工具调用记录也可能放大 Token建议按会话 ID 统计。8. 文末 CTA从模型对话到 Coding Plan再到创建 Key 与 Claude Code 文档如果你已经完成 capsule-identity 的身份组装下一步就是把它接到稳定的 LLM API 入口。按下面路径走一遍基本能把本文的配置落地。先验证模型对话确认系统提示词能正常返回https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentcapsule_identity_chat如果你要把这套入口用于日常编码 Agent查看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcapsule_identity_coding_plan创建并管理 API Key把YOUR_API_KEY换成真实 Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentcapsule_identity_api_keys需要在 Claude Code 中接入时对照文档配置settings.json和ANTHROPIC_*https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentcapsule_identity_claude_code_doc回到工程本身capsule-identity 最值得借鉴的设计是把 Agent 身份做成有生命周期、可持久化、可恢复、按主体隔离的模块而不是把提示词散落在各处。TaoToken 在这里承担的是 LLM API 入口Base URL 固定为https://taotoken.net/apiKey 用YOUR_API_KEY占位Claude Code、Codex、CC Switch 各自用正确字段接入。身份组装和 API 入口拆开管理后换模型、换工具、换环境时胶囊本身仍然稳定。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询