一个端点,
所有模型。
Tare 是挡在你所有模型前面的一层 OpenAI 兼容网关 —— 我们的,和你自己带来的。一个 base URL、一把 key,每一个 token 都算得清。
本地节点
这篇解决什么问题:让 Tare 的流量从你自己的网络出站,不走 Tare 服务器,并且先看清 这条保证在什么情况下会失效。
本地节点是一个跑在你自己网络里的小型代理。它做两件事:
- 从你的网络出去。 你打给 Tare 端点的调用,命中标了
LOCAL_NODE的渠道时,会经 隧道交给节点,从你的机器发向上游,而不是从 Tare 的服务器发出。适用于你的上游只接受来自你 自己控制、或者已经在供应商那边加过白名单的地址这种场景。 - 提供一个本地端点。 你的业务也可以直接调用节点:
127.0.0.1:8090上的/v1/chat/completions、/v1/completions和/v1/embeddings(OpenAI 形状,含 Azure OpenAI 的路径),以及/v1/messages(Anthropic Messages API)、/v1/responses(OpenAI Responses API)、/v1beta/models/{model}:generateContent(Google Gemini,Vertex AI 路径 也认)和/model/{model}/converse(AWS Bedrock,含 InvokeModel 上的 Anthropic 形状)。 各家 SDK 可直接将 endpoint 指向节点,流式与工具调用均支持。这时节点按你自己的路由执行: 标了LOCAL_NODE的渠道由节点直接调用上游,不经过 Tare;平台模型和默认直连的渠道自动 交回 Tare 执行,结果和计费与直接调用 Tare 一致。路由候选、价格、数据保护规则、账户状态都通过 隧道推到节点上,连接着就保持最新;节点把服务了什么报回去,计费由 Tare 完成。
不想自己装节点,也可以直接用官方节点,见下文「不想自建:用官方节点」。
先看这条警告:节点离线不会挡住流量
走 Tare 端点的调用,节点离线不会挡住流量,会静默退回直接调用上游,从 Tare 自己的服务器 发出去。 这个功能是为了优化路径,不想给一条渠道多加一种「整个不可用」的故障点。但这也意味着, 「这条流量只会从我自己的网络出去」这条保证,在节点掉线的时候不成立。如果你用这个功能正是 为了满足上游要求的来源 IP 限制,节点一掉线,这条保证会被静默打破,而不是报错提醒你。 目前没有开关能把它从「优先走这条路」改成「必须走这条路,走不通就失败」。 直接打节点的调用不存在退回:节点不在,调用就是失败。
用之前该知道的几件事
- 只有你自己的(BYOK)渠道能用本地节点。 平台共享渠道永远不能。
- 在 Channels 页勾选「通过本地节点转发」就生效,不需要另外申请批准。 勾选会同时写入出口模式
LOCAL_NODE和allowLocalEgress: true。渠道视图里如果出现allowLocalEgress: false(只会出现在不经控制台写入的数据里),这条渠道仍走直连,也不会推给节点;在控制台重新勾选一次即可。 - 「永远经 Tare 执行」的渠道:节点不接触该上游,流量仍从 Tare 的出口发出, 与直接调用 Tare 端点一致。
- 注册不止一个节点是真的多一份处理能力:走 Tare 的每次调用会随机挑一个当前在线的节点, 流量因此会分摊到所有节点上。这还不是「哪个节点更闲就派给谁」那种负载均衡:看不见某个节点 当前有多少并发,长短调用混在一起时不会分得完全均匀。如果注册的节点全部离线,表现和只有一个 节点离线时一样(见上面那条警告)。
- 你在控制台里的改动几秒内就到连接着的节点:新增或修改渠道、路由,渠道被停用或恢复,余额用尽, 数据保护规则变化。断开过的节点重连时会整个刷新一遍。
- 注册令牌和节点自己的凭据,首次显示之后就再也拿不回来;丢了只能重新生成令牌、重新注册。
三条请求路径
| 路径 | 调用地址 | 请求是否经过 Tare | 渠道由谁选择 | 出口 |
|---|---|---|---|---|
Tare 端点,渠道为 LOCAL_NODE | tare.jamerly.ai | 经过。Tare 选定渠道后经隧道将请求交给节点发出,响应经 Tare 返回 | Tare,逐次请求 | 节点 |
直接调用节点,渠道为 LOCAL_NODE | 127.0.0.1:8090 | 不经过。节点按本地候选表选择渠道并直接调用上游,响应直接返回 | 节点,按 Tare 预先推送的顺序 | 节点 |
| 直接调用节点,平台渠道、默认直连的渠道或标记「永远经 Tare 执行」的渠道 | 127.0.0.1:8090 | 经过。节点用调用方的 key 将该次调用交回 Tare,由 Tare 调用上游 | Tare,按调用方的路由(你自己的渠道会点名到这一条) | Tare |
第二条路径上 Tare 不参与请求处理。候选渠道、价目、数据保护规则和账户状态由 Tare 在配置变化时 (路由或渠道修改、熔断状态变化、余额变化)通过长连接推送到节点,节点保存在本地;每次请求只读取 本地副本,首个候选失败时顺序切换到下一个。该路径的延迟只包含节点到上游的一段,Tare 不可达时 仍可继续服务(见下文)。
第三条路径不用你配置:平台渠道和默认直连渠道的地址、密钥永远不会下发到你的机器,直接调用节点
时它们自动交回 Tare。「永远经 Tare 执行」在你自己的节点上效果和默认直连相同,区别只在官方节点上:
默认直连的渠道由官方节点发出,标了这个开关的渠道仍从 Tare 发出,适用于上游只接受 Tare 出口地址的情况。
LOCAL_NODE 与「永远经 Tare 执行」不能同时设置在一条渠道上:前者的出口是节点,后者的出口是
Tare,同时设置会使请求在节点与 Tare 之间往返一次。
不想自建:用官方节点
官方节点是 Tare 运营的同一款节点程序,地址 https://tare-node.jamerly.ai。不用装、不用注册令牌,
把 SDK 的 endpoint 从 http://127.0.0.1:8090 换成 https://tare-node.jamerly.ai(OpenAI SDK 的
base_url 填 https://tare-node.jamerly.ai/v1),带上你自己的 Tare API key 即可。支持的请求形状、
模型名与下文「直接调用节点」相同。平台渠道和默认直连的渠道由官方节点直接发出;标了 LOCAL_NODE
的渠道(必须从你的网络出去)和标了「永远经 Tare 执行」的渠道交回 Tare 处理。用量记在你的 key 和账户上,
计费与直接调用 Tare 一致。
搭建步骤
这里没有能拉的 Docker 镜像:镜像不在公开仓库里。真正走得通的只有二进制这条路,Linux/amd64。
1. 下载并解包
在要跑它的机器上下载并解包:
curl -fLO https://s.jamerly.ai/tare-local-node/stable/tare-local-node-linux-amd64.tar.gz
tar xzf tare-local-node-linux-amd64.tar.gz
2. 生成注册令牌
控制台 → Local Nodes → 生成注册令牌。和 key 一样只显示一次,立刻复制。它一次性使用, 24 小时内有效。用掉之后还能看到它注册成了哪个节点。
3. 启动节点
用这个令牌和账号下任意一把推理 key 启动它:
TARE_CONTROL_BASE_URL=https://tare.jamerly.ai TARE_TUNNEL_ADDR=tare-tunnel.jamerly.ai:9090 TARE_REGISTRATION_TOKEN=<第 2 步拿到的令牌> TARE_API_KEY=<你自己的推理 key> ./tare-local-node
TARE_CONTROL_BASE_URL 不要带 /api。隧道连的是公网域名,节点会自动用 TLS
(TARE_TUNNEL_TLS=auto)。
成功后会把长期凭据写到 /etc/tare-local-node/credentials.json 并完成注册,控制台里
能看到它就是这一步生效的标志。之后重启不再需要令牌:它读的是这个文件,而且令牌反正已经被消耗
掉了。
4. 把渠道指向本地节点
控制台 → Channels → 编辑你自己的某条渠道 → 勾选**「让这条渠道通过本地节点转发,而不是 直接调用」。同一位置的另一个开关「永远经 Tare 执行」**作用相反:直接调用节点时,该渠道的 请求交回 Tare 执行,节点不接触上游,也不持有该渠道的地址和密钥,适用于上游只接受 Tare 出口 地址的渠道。两个开关互斥。
端点方言下拉框里有四档只由本地节点提供:Google Gemini / Vertex AI(地址
…/models/{model}:generateContent,密钥放 x-goog-api-key;Vertex 主机使用 OAuth 访问
令牌)、Azure OpenAI(地址 …/openai/deployments/{deployment}/chat/completions?api-version=…,
deployment 段会换成模型的上游名)、AWS Bedrock Converse(地址
https://bedrock-runtime.{region}.amazonaws.com/model/{modelId}/converse,密钥填 Bedrock
API key,或填 ACCESS_KEY:SECRET_KEY 由节点做 SigV4 签名)和 OpenAI 旧版补全。这类渠道经
Tare 端点调用时不做翻译,直接转发。
5. (可选)把业务指到节点本地端点
将业务的 endpoint 指向该机器的 http://127.0.0.1:8090。OpenAI SDK 使用
/v1/chat/completions、/v1/completions 或 /v1/responses,AzureOpenAI 客户端设置
azure_endpoint;Anthropic SDK 使用 /v1/messages;Google GenAI SDK 设置 base_url
(generateContent 与 streamGenerateContent);boto3 的 bedrock-runtime 与
AnthropicBedrock 客户端设置 endpoint_url,请求签名不校验。模型名与调用 Tare 时相同。
限制:/v1/responses 不接受 previous_response_id(节点不保存对话状态,每次需发送完整的
input);/v1/completions 不接受 suffix;Bedrock 的 invoke 只接受 Anthropic
Messages 形状的请求体。
GET /v1/models 列出这个节点能路由到的模型,按发起请求的 SDK(OpenAI、Anthropic 或
Gemini)给对应的形状,上下文长度、输出上限、模态和价格字段与 Tare 的目录相同。算 token
(/v1/messages/count_tokens、Gemini 的 countTokens)在模型的渠道是原生 Anthropic 或
Gemini 端点时转发给该渠道,否则返回 501;节点不自行估算 token 数。
调用节点要带你自己的一把 Tare API key,放在 SDK 惯用的位置(Authorization: Bearer、
x-api-key、x-goog-api-key、api-key,或 SigV4 签名里的 access key)。节点默认按调用者
核验(TARE_NODE_AUTH_MODE=resolve):第一次见到一把 key 时经隧道问 Tare,答案缓存 60 秒;
key 必须属于节点注册的那个账户,否则 401。停用、过期、额度用尽的 key 和限制了来源 IP 的
key 与在 Tare 端点上一样被拒绝,目录里只列这把 key 的路由能到的模型,用量、额度和成本归因
按 key 记录。同一来源连续 20 次被 Tare 判为无效 key 后,再拿没见过的 key 来会收到 429 和
Retry-After,已经核验过的 key 不受影响。旧的「按推送的 key 清单在本地校验」仍可用
TARE_NODE_AUTH_MODE=snapshot 选择,启动时会打一条警告。
TARE_NODE_LISTEN 可以改监听地址,但凡能连上这个端口的东西都能花你账户的钱,
把它当 key 本身来看待。TARE_NODE_AUTH=off 可以关闭校验,但只在监听回环地址时被接受。
节点每 20 秒会打一次心跳证明自己还活着,并且每 8 分钟用你给它的那把推理 key 刷新一遍「该走它 转发的渠道清单」。那把 key 只用来做这件事,从不会拿去替你打模型调用。
直接调用节点
和调 Tare 一样的部分:模型名、请求和响应的形状、流式(节点会向上游要末帧的 usage,这次调用才
计得准)、响应头 X-Generation-Id、Call Traces 里带 token 数和费用的那条记录。
不一样的部分:
| 走 Tare 的端点 | 直接打节点 | |
|---|---|---|
| 参与的渠道 | 这个模型的每一条路由,含平台渠道 | 同样是每一条路由,按 Tare 排好的顺序;只有 LOCAL_NODE 渠道由节点发出,其余交回 Tare |
| 平台渠道、默认直连的渠道、标记「永远经 Tare 执行」的渠道 | 正常 | 节点不接触上游,也不持有其地址和密钥;该次调用用调用方的 key 交回 Tare 执行、计费、记录,返回的 X-Generation-Id 为 Tare 分配 |
| 上游方言 | OpenAI 兼容、OpenAI Responses、Anthropic | 以上三种,加上 Google Gemini / Vertex AI、Azure OpenAI、AWS Bedrock Converse 和旧版文本补全,按渠道端点上配置的方言;调用方的方言和渠道相同时,请求和响应原样直通 |
| 调用方可以用的形状 | OpenAI Chat Completions | OpenAI Chat Completions / 旧版 completions / Responses、Anthropic Messages、Google Gemini 与 Vertex AI、Azure OpenAI 路径、AWS Bedrock Converse 与 InvokeModel(Anthropic 形状) |
/v1/images/generations | 支持 | 501 not_implemented |
模型目录(GET /v1/models) | 你的 key 能调的模型 | 这个节点能路由到的模型,字段相同;同时提供 Anthropic 和 Gemini 的列表形状 |
算 token(count_tokens、countTokens) | 不提供 | 模型的渠道是原生 Anthropic 或 Gemini 端点时转发给该渠道,否则 501 |
| 渠道间故障转移 | 有 | 有,失败分类相同;结果会报回去,在所有地方都计入渠道健康 |
| 数据保护 | 在 Tare 上扫 | 在节点上由随行的扫描服务扫(见下文) |
| Call Traces 里的请求/响应正文 | 按你的留存设置 | 节点发出的调用没有(内容没有到过 Tare);交回 Tare 的调用按你的留存设置 |
| API key | 每次调用都查 | 节点向 Tare 核验并缓存 60 秒(默认 resolve 模式);拒绝规则、按 key 的用量和额度相同 |
| 余额与额度 | 每次调用都查 | 按最近一次推到节点的状态判断;权威的计费结果在调用之后到达,纠正节点的本地估算 |
调用方 key 的路由到不了的模型,节点返回 404;账户被封时返回 403,与 Tare 一致;没带 key 或 key 不存在返回 401。
节点连不上 Tare 的时候
直接调用里由节点发出的那部分(LOCAL_NODE 渠道)照常工作,用的是节点最后一次收到的东西:上次推送时的候选、价格、规则和账户状态。需要交回 Tare 的调用这时会失败。
已经核验过的 key 最多再沿用 10 分钟;这段时间里没见过的 key 返回 503(暂时无法核验),不是 401。
用量先存在节点上,隧道一恢复就发出去(保留最近 10,000 条),之后才会出现在 Call Traces 和 账单里。
这段时间里走 Tare 端点的调用按上面那条警告里说的方式退回。
节点上的数据保护
你的账户开着 DLP 时,直接调用由节点旁边的随行扫描服务来扫(TARE_DLP_SIDECAR_URL,
默认 http://127.0.0.1:8098),用的是 Security 页上账户级的那一套(账户开关、你按
类型的选择、推荐规则)。
按 key 的设置在这里永远不生效,因为直连请求里没有 key。到达上游的是脱敏后的文本,拦截则回
403 并带上实体类型,和 Tare 上一样。
规则生效而扫描服务连不上时,节点拒绝这次调用(503),不会不扫就转发。账户没开
DLP 就不需要扫描服务。
扫描服务是一个独立的包,Linux/amd64,自带运行时:
curl -fLO https://s.jamerly.ai/tare-local-node/stable/tare-dlp-sidecar-linux-amd64.tar.gz
tar xzf tare-dlp-sidecar-linux-amd64.tar.gz
./tare-dlp-sidecar/bin/tare-dlp-sidecar
它监听 127.0.0.1:8098,节点默认就找这个地址;要改的话扫描服务上的
TARE_DLP_SIDECAR_PORT 和节点上的 TARE_DLP_SIDECAR_URL 一起改。和节点
放在同一台机器上。
姓名/地点/机构名识别(NER)
人名、地名、机构名三类用的是一个本地语言模型,第一次用到时从 s.jamerly.ai 下载
(约 180 MB;TARE_DLP_NER_BASE_URL 可以指到你自己的镜像),加载要几分钟。
加载期间请求照常按其它类型扫、照常转发,这三类要等模型就绪后才开始被检测。
这三类开着时给它 2 GB 堆(TARE_DLP_SIDECAR_HEAP=2g);关着就什么都不下载。
控制台上能看到什么
- 注册令牌:历史上发过的每一个,带状态(待用 / 已用 / 已过期),用掉之后还能看到变成了哪个 节点。发出后只显示一小段指纹,不会再显示令牌本身。
- 节点:每个已注册节点的状态(在线 / 离线 / 注册中 / 已吊销)、节点程序版本、上次心跳时间。 另有一个独立的「隧道已连接」指示,反映的是此刻这条连接是不是真的活着;断线后几秒内这两个 状态可能对不上。
这些接口只认控制台会话,跟渠道、路由那两页一样:
| 操作 | 接口 |
|---|---|
| 生成注册令牌 | POST /v1/node/registration-tokens |
| 列出注册令牌 | GET /v1/node/registration-tokens |
| 列出节点 | GET /v1/node/nodes |
| 吊销节点 | POST /v1/node/revoke |
吊销一个节点
控制台 → Local Nodes → 吊销。
- 对新请求立刻生效:被吊销的节点不会再被选中,不管它的进程是不是还在跑。
- 不会强行断掉已经在进行中的连接;如果代理进程碰巧还活着,它只是不会再收到新任务。
- 要再用这个网络,重新生成一个令牌注册;被吊销的身份没法复活。
下一步
- 了解渠道与出口模式:读 渠道。
- 把模型指到这条渠道:读 路由。
- 看清楚一次调用留下了什么记录:读 Call Traces。
- 配置敏感内容扫描:读 数据保护(DLP)。