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(见下文)是支撑两者的底层引擎。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/BGMLAI/gate.cat/actions/workflows/ci.yml) [![PyPI](https://img.shields.io/pypi/v/gate.cat)](https://pypi.org/project/gate.cat/) [![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE) [![Python](https://img.shields.io/pypi/pyversions/gate.cat)](https://pypi.org/project/gate.cat/) [![Site](https://img.shields.io/badge/site-gate.cat-cbdd1a)](https://gate.cat) **真实的拦截,每月发布:** [gate.cat](https://gate.cat) 发布 *Veto Catches* —— 记录 agent 尝试过的一个真实不可逆命令,以及这堵防护墙是如何阻止它的。 一个 AI agent 决定运行 README 中的单行安装命令。gate 在它执行哪怕一个字节之前就阻止了它 —— 这是一个真实的终端,`pip install gate-cat`,绝非合成剪辑: ![gate.cat blocks a curl-pipe-shell an agent tried to run](https://static.pigsec.cn/wp-content/uploads/repos/cas/bc/bc5c87b5c4fcc32740a859a71c7a2d5df7a56375bda94b4b96f44a6cb03384a5.gif) 专门拦截 `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,三种结果: ![gate.cat policy: dev runs, prod denied, staging escalated to a human](https://static.pigsec.cn/wp-content/uploads/repos/cas/8f/8f2a1844e41e0ef7575c228643474385a05711d7c8dc9a0a1b840aeff4962327.gif) 来源:[`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, 人工介入, 大语言模型, 安全防护, 执行控制, 拦截网关, 无后门, 逆向工具