twp/1 对话(本文档仅收录非流形态;stream:true → SSE 事件语法 t.open/t.delta/t.usage/t.warn/t.close/t.err,单源 = src/contract/twp.ts):参数消毒服务端化(Profile params 剥除/钳制)、meta.requestId 请求层幂等(认证后出网前占位,同 id 成功交换上游调用恒 1 次、计费恒 1 次;完成后重放返缓存结果(非流,携 x-tansr-idempotent-replay: 1)或 409(流式结果不可重放);计量与结算幂等为计费层兜底)、usage_events 恒填 api_key_id、越权模型恒 403 model_not_authorized(未知/授权面外/direct 同拒);上游方言不透传(4xx/5xx 收敛 502 upstream_error);请求签名三头可选(在场恒校验,签名覆盖 rawBody 原始字节)
const url = 'https://api.tansr.com/t1/exchange';const options = { method: 'POST', headers: { 'x-tansr-key-id': '<x-tansr-key-id>', 'x-tansr-key': '<x-tansr-key>', 'Content-Type': 'application/json' }, body: '{"model":"example","thread":[{"role":"system","blocks":[{"t":"text","v":"example","cacheable":true}]}],"tools":[{"name":"example","description":"example","inputSchema":{}}],"params":{"maxTokens":1,"temperature":1,"topP":1,"stop":["example"],"reasoning":"off","promptTokensEstimate":1},"meta":{"requestId":"example","sessionId":"example","client":{"name":"example","version":"example"},"purpose":"example"},"cache":{"skipWrite":true,"key":"example"},"stream":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.tansr.com/t1/exchange \ --header 'Content-Type: application/json' \ --header 'x-tansr-key: <x-tansr-key>' \ --header 'x-tansr-key-id: <x-tansr-key-id>' \ --data '{ "model": "example", "thread": [ { "role": "system", "blocks": [ { "t": "text", "v": "example", "cacheable": true } ] } ], "tools": [ { "name": "example", "description": "example", "inputSchema": {} } ], "params": { "maxTokens": 1, "temperature": 1, "topP": 1, "stop": [ "example" ], "reasoning": "off", "promptTokensEstimate": 1 }, "meta": { "requestId": "example", "sessionId": "example", "client": { "name": "example", "version": "example" }, "purpose": "example" }, "cache": { "skipWrite": true, "key": "example" }, "stream": true }'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”签名时间戳(unix 秒,十进制串;T-A34):与服务器时钟偏差 >300s → 401 signature_invalid
签名随机数(≥16 字符;T-A34):同 keyId 600s 窗内重现 → 401 nonce_replayed
请求签名(hex 小写;T-A34):HMAC-SHA256(K=sha256(SK 明文) 原始摘要, TWP1-HMAC-SHA256\n{METHOD}\n{path+query}\n{ts}\n{nonce}\n{sha256hex(rawBody)});三头须同现,在场恒校验;app signRequired 或 TANSR_API_TWP_REQUIRE_SIGNATURE=1 时未签名恒 401 signature_invalid
Request Bodyrequired
Section titled “Request Bodyrequired”object
Bundle 内 handle;授权面之外恒 403 model_not_authorized
object
object
object
object
object
工具结果正文(序列化后字符串)
object
JSON Schema(上游方言转换原样携带)
object
object
末端预估的 prompt token 数(T-A42 贴窗防御):在场且模型有 contextWindow 时,promptTokensEstimate + maxTokens(消毒后)> contextWindow 即 400 context_window_exceeded(预扣/预留之前拦截,零计费);缺席 = 仅既有输出钳制,零变化
object
幂等键,须 owner 级唯一(推荐 ULID;十王修案 FX-A-12 B-06):计量落库与台账结算按 twp:
会话 public id。批ι(RFC-R79-ι)起客户端铸造(ULID 形制,首见幂等登记,见 SESSION_PUBLIC_ID_RE);旧端沿用 /t1/heartbeat 签发值,两代同受理
object
计费归属用途(G-A10 加法可选;批ι 起词形受理:语义注册表见 TWP_PURPOSES,词表外词形值原样落列如实呈现,非词形 400)
object
一次性请求跳写(anthropic 方言不打消息尾断点;缺席/false = 正常断点)
前缀缓存亲和键(prompt_cache_key / metadata.user_id 素材;缺席回落 meta.sessionId)
True → SSE(t.* 事件);缺省/false → 单 JSON
Responses
Section titled “Responses”非流单 JSON(流式为 text/event-stream,不在本文档);幂等缓存重放时携 x-tansr-idempotent-replay: 1(体/计费头 = 完成时刻快照)
object
服务端签发(= x-tansr-request-id)
账套内 handle(回显)
object
非缓存输入段(不含缓存读/写命中;差价计费的全价段)
输出 token
缓存读命中段(上游未报恒 0;按价目 cacheRPerM 差价计费,未配缓存价回落全价)
缓存写段(anthropic 系 cache_creation;上游未报恒 0)
DECIMAL 字符串(实结)
DECIMAL 字符串(台账终审余额)
本次计量为服务端保守估算(上游缺报/断链补账);实报行键缺席
长尾计量维度桶(token/次数等整数量);仅非零桶携带;键词表见维度注册表;obs_ 前缀 = 观测位(不参与计费)
object
本次请求缓存净省费(DECIMAL 串,= readSaved − writePremium;销售四列快照直算)
Example
{ "blocks": [ { "t": "text", "cacheable": true } ], "usage": { "estimatedReason": "upstream_usage_missing" }, "stop": "end"}In_progress(T-A23:同 (owner, apiKey, requestId) 请求正在飞行中,按 retryAfterMs 退避后同 id 重试;并发同键单飞)
object
客户端幂等键回显(twp = meta.requestId;compat = idempotency-key 头)
建议重试间隔(毫秒;末端可自定退避)
Example
{ "status": "in_progress"}Content_blocked(T-A15 安全审查:入向 deny 恒在余额预扣之前拦截零计费;非流出向 deny 内容不下发、消耗如实;detail.reason 携理由;流式为异步抽检不阻流)/ egress_blocked(T-A24 出网零信任:org BYOK 上游目标命中私网/元数据/回环或非 HTTPS)/ context_window_exceeded(T-A42 贴窗防御:params.promptTokensEstimate 在场且模型有 contextWindow 时,估算入 + 消毒后 maxTokens > contextWindow 恒拒——幂等占位/预留/预扣之前拦截零计费,detail.promptTokensEstimate/maxTokens/contextWindow;字段缺席 = 仅既有输出钳制零变化)
object
object
错误码注册表单源派生(src/http/errors.ts ERROR_CODES;码稳定,消费方按码翻译)
object
Example
{ "error": { "code": "adjudicator_not_authorized" }}App_key_invalid / signature_invalid / nonce_replayed(T-A34)
object
object
错误码注册表单源派生(src/http/errors.ts ERROR_CODES;码稳定,消费方按码翻译)
object
Example
{ "error": { "code": "adjudicator_not_authorized" }}Insufficient_balance(预检 fail-closed 零上游)
object
object
错误码注册表单源派生(src/http/errors.ts ERROR_CODES;码稳定,消费方按码翻译)
object
Example
{ "error": { "code": "adjudicator_not_authorized" }}Model_not_authorized / app_disabled / app_ip_denied
object
object
错误码注册表单源派生(src/http/errors.ts ERROR_CODES;码稳定,消费方按码翻译)
object
Example
{ "error": { "code": "adjudicator_not_authorized" }}Idempotency_conflict(T-A23:同 requestId 异载荷;或已完成结果不可重放(流式/超限/中断,detail.replayable=false);或 requestId 已达计费层(reservation 在册)不再重飞——计费层兜底,幂等缓存丢失也恒不双打上游)
object
object
错误码注册表单源派生(src/http/errors.ts ERROR_CODES;码稳定,消费方按码翻译)
object
Example
{ "error": { "code": "adjudicator_not_authorized" }}Rate_limited(key 级 60s 窗,携 Retry-After;App 总闸 quota.rpm 触顶 detail.scope:“app”;SC-34 登记出口的 app_user 令牌径按每终端用户桶计,同一 perMinute 上限,触顶 detail.scope:“endUser”;既有 k 径信封不变)/ quota_exceeded(T-A17 策略包日 token 上限,UTC+8 日界,detail.limit/used/resetAt;T-A23 起计数在占位阶段原子预留(含在途),结算按实结差额校正)
object
object
错误码注册表单源派生(src/http/errors.ts ERROR_CODES;码稳定,消费方按码翻译)
object
Example
{ "error": { "code": "adjudicator_not_authorized" }}Upstream_error(上游拒绝;方言正文不透传,detail.upstreamStatus;幂等记 failed,同 id 可重试)/ upstream_disconnected(T-A35:上游断流;流中形态经 SSE t.err 同码下发)
object
object
错误码注册表单源派生(src/http/errors.ts ERROR_CODES;码稳定,消费方按码翻译)
object
Example
{ "error": { "code": "adjudicator_not_authorized" }}Pricing_guard_tripped(计费模型价格缺失/非法/越界,fail-closed)/ stream_backpressure(T-A35:SSE 下游写背压超限;流中形态经 t.err 同码下发)
object
object
错误码注册表单源派生(src/http/errors.ts ERROR_CODES;码稳定,消费方按码翻译)
object
Example
{ "error": { "code": "adjudicator_not_authorized" }}T-A35 分层超时(各档独立 env 可配,detail.tier/timeoutMs 携触发档):upstream_connect_timeout(建连档,流式径,缺省 10s)/ upstream_ttfb_timeout(首帧档,流式=头→首帧、非流=头+体全程,缺省 120s)/ upstream_idle_timeout(帧间档,缺省 90s;帧间存活恒不杀)/ upstream_total_timeout(总长档,缺省 3600s,仅最终保险);流中触发经 SSE t.err 同码下发(detail 说明档位)
object
object
错误码注册表单源派生(src/http/errors.ts ERROR_CODES;码稳定,消费方按码翻译)
object
Example
{ "error": { "code": "adjudicator_not_authorized" }}本文是否有帮助?
感谢反馈,我们会持续改进这篇文章。