BGMLAI/gate.cat
GitHub: BGMLAI/gate.cat
gate.cat 是一个确定性的 AI agent 操作拦截网关,在工具调用执行前以 fail-closed 方式阻止不可逆或违规操作。
Stars: 0 | Forks: 0
# gate.cat
**在你的 AI agent 执行不可逆操作之前阻止它。** 这种操作否决是
**确定性与模型无关的** —— 它是一个 deny-list + exec-check + human-in-the-loop 的组合,在边界处检查*工具调用*,因此它能以同样的方式保护任何 agent:一个 Claude Code
hook(前沿),一个 crewAI/LangGraph 应用,或者一个在 Ollama/vLLM 上的本地 7-30B 模型。`TruthPipeline`
通过确定性检查(exec/calc/lookup)以及采样分布不确定性信号,提供了一个诚实的判定(confirmed / refuted / uncertain / unchecked);`veto.py` 会消费该判定,以便在工具调用执行前进行阻止、暂停或询问人类。(这种不确定性*信号* —— 一个次要功能 —— 正是 7-30B 本地模型发挥优势的所在;请参阅下文的“为什么选择小型/廉价模型”。
否决本身不需要这种假设。)
一种机制,而非两款产品:验证引擎(`TruthPipeline`)和消费它的 action-gate(`before_action` / `VetoGate`)打包在一起 —— 相同的包,相同的品牌。
语义缓存和 Cache-Augmented Synthesis(见下文)是支撑两者的底层引擎。
[](https://github.com/BGMLAI/gate.cat/actions/workflows/ci.yml)
[](https://pypi.org/project/gate.cat/)
[](LICENSE)
[](https://pypi.org/project/gate.cat/)
[](https://gate.cat)
**真实的拦截,每月发布:** [gate.cat](https://gate.cat) 发布 *Veto Catches* —— 记录 agent 尝试过的一个真实不可逆命令,以及这堵防护墙是如何阻止它的。
一个 AI agent 决定运行 README 中的单行安装命令。gate 在它执行哪怕一个字节之前就阻止了它 —— 这是一个真实的终端,`pip install gate-cat`,绝非合成剪辑:

专门拦截 `curl … | sh` 模式;混淆/base64 的安装诡计仍然可能逃逸 —— 请参阅 [OBJECTIONS.md](OBJECTIONS.md)。演职人员:[`docs/demos/demo_a.cast`](docs/demos/demo_a.cast)。
## 安装
```
pip install gate.cat # core (inside a venv)
pip install "gate-cat[openai]" # + OpenAI wrapper
pip install "gate-cat[anthropic]" # + Anthropic wrapper
pip install "gate-cat[proxy]" # + proxy server (FastAPI)
pip install "gate-cat[all]" # everything
```
## Hook —— 最强模式
在 harness 中、**模型控制流之外** 进行强制约束:在 gate 返回之前,工具调用无法执行。`pip install gate-cat` 会将
`gatecat-hook` 控制台脚本放到你的 PATH 中;通过将以下内容添加到 `.claude/settings.json` 来将其注册为 Claude Code 的
`PreToolUse` hook(无需编辑任何内容 —— 通过名称调用,不需要绝对路径):
```
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash|Write|Edit",
"hooks": [{ "type": "command", "command": "gatecat-hook" }]
}
]
}
}
```
现在让你的 agent 运行 `rm -rf ~/project`:该调用将被阻止(exit 2),并且模型会看到 `VETO [DELETE_ANALYZER]: deletes '/home/you/project' under
protected root '/home' - requires a human`。对于像 `/tmp/x` 这样的临时路径下的删除操作是故意*允许*的 —— gate 会阻止触及持久位置的删除操作,而不会在临时目录上唠叨。随时运行 `gate.cat` 以查看它监视并阻止了哪些操作。Fail-closed:如果引擎缺失或出错,将选择阻止而不是放行。在临时的 CI/sandbox 中,它会自动解除武装并记录为 no-op(`GATECAT_VETO_EPHEMERAL=0` 会强制其保持武装状态)。
框架适配器(crewAI / LangGraph / AutoGen)也存在,但它们是进程内约定 —— prompt 注入可以绕过它们。只有 hook 是 agent 无法跳过的强制约束。请参阅
[`examples/veto_integrations/`](examples/veto_integrations/) 了解适配器的用法。
## 受控 shell —— 为任何通过 shell 执行的 agent 提供强制约束
没有使用 Claude Code?Hook 只会在那里触发,而代理只能看到 OpenAI-API 模型层输出的内容。但是**几乎每个 agent 最终都会通过 shell 运行命令** —— `sh -c ""`。`gatecat-shell` 就处于那个 exec 执行点上:将 agent 的 shell 指向它,每一个命令在真实的 shell 运行它之前,都会经过与 hook 相同的确定性引擎审查。
```
# gate 一个命令,然后运行它 — 拦截 => exit 2,真正的 shell 永远看不到它
gatecat-shell -c "rm -rf ~/project" # VETO [DELETE_ANALYZER] ... exit 2
gatecat-shell -c "git status" # allowed -> execs /bin/sh -c "git status"
# 仅 gate,无 exec(用于 git hooks、CI wrappers、其他 agents 的原语)
gatecat-shell --check "terraform destroy -auto-approve" # exit 2
echo "DROP TABLE users" | gatecat-shell --check # exit 2
# 对于任何驱动 bash 会话的 agent,你可以植入:一个 DEBUG-trap gate
eval "$(gatecat-shell --install-bash)"
```
只要工具允许你设置 shell 命令,就可以将 agent 的执行指向它(许多工具支持 `$SHELL` 或配置的 exec 设置)。真正的 shell 是
`/bin/sh`;设置 `GATECAT_SHELL_REAL=/bin/bash` 来更改它。受控命令会逐字节传递 —— gate 看到的是它运行的确切字符串,因此不存在重新解析的漏洞。
**信任类别,诚实标注。** 作为 agent 的 *shell binary*(`-c` 模式)设置时,这是模型控制流之外的强制约束 —— 与 hook 属于同一类别。`--install-bash` DEBUG 陷阱*较弱*:会话内的命令可以通过执行 `trap - DEBUG` 来解除其武装,因此请尽可能选择设置 shell binary。无论哪种方式,它都是一个**字符串门控,而不是一个 sandbox** —— 它读取命令,但不包含进程;请在 OS sandbox 中运行 agent,*并且*在前面保留 gate。Fail-closed:引擎故障、无法解析的 `-c` 或评估错误会以 exit 2 退出,而不是运行该命令。
## 停滞 —— 捕捉忙碌但毫无进展的 agent
deny-list 可以阻止一个危险命令;但它对一个由永远不会取得进展的*安全*命令组成的循环无能为力 —— agent 重新运行失败的构建,或者重新提出同样失败的修复方案。`StateStagnationDetector` 会跨步骤监视 agent 的 STATE,并在状态停止变动时停止它:
```
from gatecat.state_stagnation import StateStagnationDetector
det = StateStagnationDetector(max_repeat_action=2, max_no_change=2)
for step in agent_loop():
reason = det.update(action=step.tool_call, state_repr=step.diff,
error=step.error, cost=step.cost, progress=step.tests_passing)
if reason:
pause_and_report(reason); break # the loop isn't moving — turn back / escalate
```
`update()` 返回第一个触发的信号的原因(`repeat_action`、
`no_state_change`、`repeat_error`、`cost_without_progress`)或 `None`。它是
**确定性的** —— 关键点在于编码错误通常是*自信地犯错*:
模型重新提出同样的糟糕修复方案且没有任何分散性,因此概率性分歧门控对它视而不见,而状态比较则能无视置信度捕捉到循环。
仅供参考(失控的 agent 只是浪费预算,而不是不可逆的操作)。这与 koryto 的 `StagnationMonitor` 不同,后者监视的是检索通道而不是 agent。
## Truth Pipeline (koryto → gate → veto)
一个入口点,将 SDK 的验证模块组合成适用于任何模型的真值 + 合规 pipeline(手机上的 3B SLM 和前沿 LLM 使用相同的 `sample_fn` 回调)。
```
from gatecat import TruthPipeline, ActionPolicy, ActionVetoed
pipe = TruthPipeline(
sample_fn=my_llm, # callback(prompt) -> str
fact_base={"capital of france": "Paris"}, # lookup channel (optional)
policy=ActionPolicy(deny=[r"terraform.*prod"], max_amount=100.0),
)
r = pipe.evaluate("Evaluate: 6 / 2 * 3", answer="1")
r.verdict # "refuted" — caught confident-wrong, deterministically, $0
r.truth # "9" — the correct value, so the caller can self-correct
@pipe.guard() # compliance on ACTIONS
def deploy(target): ...
deploy(target="terraform apply prod") # raises ActionVetoed BEFORE executing
pipe.compliance_report() # audit trail: verdicts + vetoes
```
策略的实际应用:运行 `dev`,拒绝 `destroy prod`,将 `apply staging` 升级交由人类处理 —— 一个确定性 gate,三种结果:

来源:[`examples/veto_terraform.py`](examples/veto_terraform.py)。演职人员:[`docs/demos/demo_b.cast`](docs/demos/demo_b.cast)。
**诚实的判定** —— pipeline 永远不会宣称超出其测量范围的结果:
| 判定 | 含义 | `reliable` | `trusted` |
|---|---|---|---|
| `confirmed` | 答案与经过验证的原子(exec/calc/lookup)匹配 | ✅ | ✅ |
| `refuted` | 答案与经过验证的原子相矛盾 | ❌ | ❌ |
| `uncertain` | 没有仲裁者的软分歧,或高采样分布 | ❌ | ❌ |
| `unchecked` | 超出验证范围 —— **并非** “true”,只是“无法检查” | ❌ | ✅ |
对于关键系统,请根据 `report.reliable`(仅限 confirmed)进行过滤,而不是 `trusted`。
**判定优先级**(冲突通过结构设计来解决):
1. `exec`/`calc`(硬性,在物理上独立于模型)永远优先 —— 甚至都不会询问 gate。
2. `lookup` 分歧交由可选的 `arbiter_fn` 处理;如果没有 → `uncertain`
(仅当你的事实库在查询时是最新的,才设置 `lookup_hard_block=True`)。
3. `gate`(采样分布)仅在不存在经验证的原子时运行。
4. `veto` 是一个正交轴:它评判*操作*,采用 fail-closed 机制,并且没有策略的 `guard()`
会引发异常,而不是静默允许一切。
**方法**:`evaluate(q, answer)` 验证现有答案 · `ask(q)` 使用 `sample_fn` 生成然后验证 · `guard()` 用执行前 veto 装饰工具函数 · `check_action(repr)` 评估操作而不运行它。
**`arbiter_fn` 契约**:`(question, answer, KorytoVerdict) -> Optional[bool]` —
`True` = 事实库是对的(反驳成立),`False` = 模型是对的(过时的事实库,答案被 confirmed),`None`/exception = 没有裁定 → `uncertain`。
每个发声的阶段都会记录在 `report.stages` 中,以便调试。
**为什么选择小型/廉价模型**(这是关于不确定性*信号*,而不是 veto —— veto 是模型无关的):为了成本和数据驻留,agent 越来越多地运行在廉价/本地模型(通过 Ollama/vLLM 运行 7-30B)上。这正是 gate 的*不确定性信号*最强的地方(AUC 0.77–0.90,测量样本 N=4800),也是优先考虑前沿模型的安全防护供应商没有瞄准的地方 —— 在前沿模型上,该*信号*会减弱(AUC 0.68–0.71)。action-veto 的 deny-list + exec-check 完全不依赖于模型大小;它保护 Claude Code(前沿)agent 的方式与其保护本地 agent 的方式完全相同。
*命名说明*:`koryto`(波兰语:河床)是该项目对确定性验证层的规范术语 —— 概率性的“河流”(模型输出)被确定性的“河床”(exec/calc/lookup)约束。这是一个刻意的品牌术语,而不是翻译的偶然。
## 交易
只需花费你六十秒的时间,换取:
- 一个你的 agent 无法通过其运行 `terraform destroy`、`rm -rf`、`DROP TABLE` 或 `gh repo delete` 的确定性 gate —— 针对不可逆操作类有 71 条默认策略,fail-closed,在真实流量上测得的干预率约为 ~0.6%(它不会唠叨你);
- 一个可随时粘贴的 Claude Code PreToolUse hook —— 最强模式:
在 harness 中、模型控制流之外强制执行;
- 针对 crewAI / LangGraph / AutoGen 的适配器(诚实标注:进程内约定,比 hook 弱);
- 如果不适合你,可一键卸载。最坏的情况,你只损失了一分钟。
我们作为回报的要求 —— 这个项目依靠一种硬通货运行:
- 🐛 **一个 veto 故事** —— [告诉我们拦截了什么,或者漏掉了什么](https://github.com/BGMLAI/gate.cat/issues/new?template=veto-story.yml)。
漏掉的比赞美更有价值:报告的漏洞会被修复并在 CHANGELOG 中致谢,而且 bypass 测试套件正是根据这些报告扩充的。 ……如果 gate 在蠢事发生之前阻止了它,点个 ⭐ 可以帮助其他人发现这个项目。
## 定价
**本地 gate 永久免费 —— 包括本地报告。** 付费层,**gate.cat Cloud**,是你 veto 历史的机外副本 —— 这是一个拥有 shell 访问权限的 agent 无法删除或重写的版本(本地日志在其影响半径之内)。发布价格:**Solo €19/mo · Team €149/mo 统一价格(最多 10 台机器) · Business €399/mo**。Stripe 结算已上线,支持自动激活和订阅生命周期管理。本地 gate 保持永久免费。[开始使用 Solo (€19/mo)](https://buy.stripe.com/7sY6oAaRD5qU79m2Vo67S09)
或购买一次性的 €29 policy pack:
[Fintech](https://buy.stripe.com/dRm5kw6Bn3iMfFS1Rk67S0c) ·
[PaaS](https://buy.stripe.com/3cI5kw3pbaLeeBO2Vo67S0d) ·
[HTTP-API Breadth](https://buy.stripe.com/aFa8wIgbX06AdxK67A67S0e)。
完整的边界和层级详情:[PRICING.md](PRICING.md)。
## 验证数字
每一个公开的数字都可以追溯到 [FACTS.md](FACTS.md) 中的一行(声明 → 来源 → 允许的措辞),而标题测量背后的语料库 harness 位于 [`scripts/`](scripts/README.md) 中 —— 复现它们,如果你的数字与我们的不一致,那就是我们想要的 bug 报告。~0.6% 声明中那 14.7k 条命令的一半是我们自己的私有日志(在 FACTS.md 中已标记);公共语料库那一半你可以自己重新运行。
**Recall** —— 我们最关心的声明(有任何危险的东西溜过去了吗?)在 [RECALL.md](RECALL.md) 中沿两个维度进行了测量。确定性的那个不需要数据集,并且可以在几秒钟内运行:
```
git clone https://github.com/BGMLAI/gate.cat && cd gate.cat
pip install -e . # the veto engine (zero-dependency core)
python scripts/recall_danger_axis.py # 43/43 known danger classes through the FULL gate, 0 false-blocks
```
(harness 位于 `scripts/` 中 —— 没有随 pip wheel 一起发布 —— 所以请从克隆的代码库中进行验证,在那里你还可以阅读它所检查的危险目录。)
## 缓存 / Cache-Augmented Synthesis(支持引擎)
上面的验证/veto 层运行在语义缓存之上。单独使用时,缓存也可以作为 OpenAI/Anthropic SDK 的直接替代包装器,提供三层响应:逐字缓存、合成、upstream —— 缓存语义相似的查询并返回即时响应(<10ms),或者从缓存的知识中合成(~300ms, ~$0.002),而不是进行完整的 upstream 调用。
## 快速开始
### OpenAI(直接插入,零代码修改)
```
from gatecat import CachedOpenAI
client = CachedOpenAI(api_key="sk-...")
# 首次调用:~500ms (API + cache populate)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "What is the capital of France?"}],
)
# 使用类似查询的第二次调用:~5ms (cache hit)
response2 = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "capital of France?"}],
)
print(response2.gatecat_hit) # True
```
### Anthropic
```
from gatecat import CachedAnthropic
client = CachedAnthropic(api_key="sk-ant-...")
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "What is Python?"}],
)
print(message.gatecat_hit) # True on cache hit
```
### 流式传输
流式传输工作透明。缓存未命中会缓冲并存储响应;缓存命中将作为合成流重播。
```
stream = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Explain quantum computing"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")
```
### Cache-Augmented Synthesis (CAS)
当查询与缓存条目相似但不完全匹配时,CAS 会使用廉价的 LLM 从缓存的知识中合成新的响应 —— 而不是调用昂贵的 upstream API。
```
from gatecat import CachedOpenAI
client = CachedOpenAI(
synthesis_mode="auto", # enable three-tier response
# Uses Gemini Flash Lite via OpenRouter by default (~$0.002/synthesis)
# Or point to local llama-cpp: synthesis_model="local/phi-4-mini"
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Explain photosynthesis"}],
)
if response.gatecat_hit:
print("Verbatim cache hit (<10ms, $0.00)")
elif response.gatecat_synthesized:
print("Synthesized from cache (~300ms, ~$0.002)")
else:
print("Upstream API call (~500ms, ~$0.03)")
```
```
Three-tier response:
Query --> Embed --> HNSW search
|
sim >= 0.92 | VERBATIM HIT --> Return cached response <10ms $0.00
sim >= 0.80 | SYNTHESIS --> Top-K cached Q&A + LLM ~300ms ~$0.002
sim < 0.80 | UPSTREAM MISS --> Call API, cache response ~500ms ~$0.03
```
跨 5 个领域的 100 个问题基准测试验证:与直接 API 响应相比,**平均质量比率为 0.892**。
### 代理模式 —— veto 任何本地 agent,零代码 (Ollama / NIM / OpenRouter / vLLM)
Ollama、NIM、OpenRouter、vLLM 和 LM Studio 都使用 OpenAI API,因此**在它们前面的一个代理就能保护它们所有人** —— 你的 agent 只需要更改一个 `base_url`,无需编写代码。当模型要求运行工具时,代理会根据 21 条拒绝策略检查建议的调用,并**在 agent 执行它们之前阻止危险操作**(`rm -rf`、`terraform destroy`、`DROP TABLE`、磁盘擦除、仓库删除等)。
```
pip install "gate-cat[proxy]"
# 将 proxy 指向你的 provider(图中展示了本地 Ollama;NIM/OpenRouter/vLLM 同理)
export OPENAI_BASE_URL="http://localhost:11434/v1" # your real provider
export GATECAT_ALLOW_INSECURE_UPSTREAM=1 # only for a local http provider
gatecat-proxy # listens on :8080
```
然后你的 agent 指向代理而不是提供商 —— 这就是所有的更改:
```
client = OpenAI(base_url="http://localhost:8080/v1") # was 11434; now guarded
```
危险的工具调用将作为拒绝返回,而不是执行。模式:
`GATECAT_PROXY_TOOL_VETO=block`(默认) / `flag`(仅标注) / `off`。
注意事项:这会拦截模型**通过 API** 发出的工具调用;直接通过 shell 执行的 agent 仍然需要 harness hook(`gatecat-hook`)。
将 gate.cat 作为独立代理服务器运行。无需 SDK 集成 —— 只需更改 `base_url`:
```
# Docker(推荐)
docker run -e OPENAI_API_KEY=sk-... -p 8080:8080 gatecat/proxy
# 或者 pip
pip install "gate-cat[proxy]"
gatecat-proxy # starts on :8080
```
然后将你现有的代码指向代理:
```
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1") # that's it
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "What is Python?"}],
)
# Cache headers:X-Gatecat-Hit, X-Gatecat-Synthesized
```
适用于任何兼容 OpenAI 的客户端(curl、LangChain、LiteLLM 等)。通过环境变量进行配置:
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `OPENAI_API_KEY` | — | 用于 upstream provider 的 API key |
| `GATECAT_SIMILARITY_THRESHOLD` | `0.92` | 缓存命中阈值 |
| `GATECAT_SYNTHESIS_MODE` | `off` | `off` / `auto` / `always` |
| `GATECAT_TTL` | `86400` | 缓存 TTL,以秒为单位 |
| `GATECAT_PORT` | `8080` | 服务器端口 |
### 异步
```
from gatecat import AsyncCachedOpenAI, AsyncCachedAnthropic
async_client = AsyncCachedOpenAI()
response = await async_client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello"}],
)
```
### 独立缓存
将 `SemanticCache` 直接用于任何基于 embedding 的缓存:
```
from gatecat import SemanticCache
cache = SemanticCache(
similarity_threshold=0.92,
cache_ttl=86400, # 24 hours
)
cache.populate("What is Python?", "Python is a programming language...")
result = cache.lookup("Tell me about Python") # cache hit
```
### 负面缓存(黑名单)
在已知的不良查询模式到达 API 之前将其阻止:
```
# 拦截查询 pattern
client.cache.negative.add(
"What is the airspeed of an unladen swallow?",
reason="hallucination",
)
# 类似的查询现已被拦截
client.cache.negative.check("airspeed of swallows") # returns match info
# 管理 blocklist
client.cache.negative.list(limit=50)
client.cache.negative.remove(entry_id=42)
client.cache.negative.report_false_positive(entry_id=42)
```
## 配置
```
client = CachedOpenAI(
# Cache settings
cache_dir="~/.gatecat", # where to store cache data
similarity_threshold=0.92, # cosine similarity for cache hit (0-1)
negative_threshold=0.85, # threshold for negative cache
cache_ttl=86400, # TTL in seconds (24h default)
cache_max_entries=100_000, # max entries before LRU eviction
cache_enabled=True, # set False to disable
on_negative_hit="raise", # "raise" | "skip" | callable
# Synthesis settings (CAS)
synthesis_mode="off", # "off" | "auto" | "always"
synthesis_model="google/gemini-2.0-flash-lite-001", # any OpenAI-compatible model
synthesis_model_base_url=None, # auto-detected from OPENROUTER_API_KEY
synthesis_model_api_key=None, # auto-detected from env
synthesis_threshold=0.80, # min similarity for synthesis candidates
synthesis_top_k=5, # number of cached Q&A pairs for synthesis
# OpenAI settings (passthrough)
api_key="sk-...",
)
```
## 工作原理
```
Query --> Embed (MiniLM-L6, 384-dim) --> Search HNSW index
|-- VERBATIM HIT (sim >= 0.92) --> Return cached response (<10ms)
|-- SYNTHESIS (sim >= 0.80) --> Top-K cached Q&A + cheap LLM (~300ms)
'-- MISS (sim < 0.80) --> Call upstream API, cache response (~500ms)
```
- **Embedder**:ONNX MiniLM-L6-v2(90MB,本地运行,无 API 调用)
- **Index**:hnswlib HNSW,用于快速的近似最近邻搜索
- **Store**:SQLite,带有用于并发访问的 WAL 模式
- **Fallback**:如果 hnswlib 不可用,则使用 numpy 暴力破解
## CLI
```
gatecat-cli stats # Show cache statistics
gatecat-cli entries # List cached entries
gatecat-cli evict # Remove expired entries
gatecat-cli clear # Clear all entries
gatecat-cli lookup "query" # Test a cache lookup
```
## 自定义 Embedder
为你自己的任何模态注册 embedder:
```
from gatecat.embedders import BaseEmbedder, register_embedder
import numpy as np
class MyEmbedder(BaseEmbedder):
dim = 256
modality = "custom"
def encode(self, input_data) -> np.ndarray:
# Your embedding logic here
...
register_embedder("my-embedder", MyEmbedder)
cache = SemanticCache(embedder="my-embedder")
```
内置 embedder:`minilm`(文本)、`clip`(图像,即将推出)、`clap`(语音,即将推出)。
## 比较
| 功能 | gate.cat | GPTCache | LiteLLM | Redis LangCache |
|---------|-----------|----------|---------|-----------------|
| 语义相似度 | 是 | 是 | 仅限精确匹配 | 是 |
| Cache-Augmented Synthesis | 是 | 否 | 否 | 否 |
| OpenAI 直接插入 | 是 | 部分 | 是 | 否 |
| Anthropic 直接插入 | 是 | 否 | 是 | 否 |
| 流式传输支持 | 是 | 否 | 否 | 否 |
| 负面缓存 | 是 | 否 | 否 | 否 |
| 多模态(计划中) | 是 | 否 | 否 | 否 |
| 异步 | 是 | 否 | 是 | 否 |
| 零配置 | 是 | 否 | 否 | 否 |
| 代理模式 (Docker) | 是 | 否 | 是 | 否 |
| 本地(无服务器) | 是 | 是 | 否 | 否 |
| 许可证 | Apache 2.0 | MIT | MIT | Redis |
## 许可证
Apache 2.0 —— 请参阅 [LICENSE](LICENSE)。
由 [BGML.ai](https://bgml.ai) / [Fundacja BLOOM](https://bloom.foundation) 构建。
Policy Packs → [gate.cat/#packs](https://gate.cat/#packs)
标签:AI智能体, AI风险缓解, DLL 劫持, Petitpotam, Python, 人工介入, 大语言模型, 安全防护, 执行控制, 拦截网关, 无后门, 逆向工具