jakecastillo/sloppy-joe

GitHub: jakecastillo/sloppy-joe

Sloppy Joe 是一个模型无关的 AI 运维控制循环,在 LLM gateway 之上将成本、延迟、质量等信号转化为受治理、可审计、可逆的自动化补救措施。

Stars: 0 | Forks: 0

# 🥪 Sloppy Joe **提供受治理的 AI 运维。** Sloppy Joe 是一个开源的、与模型无关的 **控制循环**,旨在清理在生产环境中运行 AI 时的糟糕状况。它位于你已运行的 LLM gateway *之上*,并将模型层的信号——成本飙升、 fallback 风暴、延迟/质量倒退、 guardrail 触发、 provider 宕机——转化为**受治理、经审计、通过 Git 审查的自动化响应**。 ## 一句话简介 一次成本 / eval / guardrail 违规会触发一项受治理的、作用域受限的、经审计的补救措施,其**策略是 Git 中的一个文件,你可以在 PR 中审查它并在 CI 中重放它**——它作为任何 gateway 都可以应用的、已签名且可逆的 intent 来执行。 ## 体验感受 ``` # 单次执行:立即通过您的规则运行一个 signal(执行操作,然后写入 audit) $ sloppy inject --now --rules examples/rules examples/signals/cost-spike.json applied route_override target=gpt-4o applied page target=gpt-4o # CI gate:重放一个 fixture 并查看会触发什么(无副作用) $ sloppy test --replay examples/fixtures/replay.jsonl --rules examples/rules replay: 4 signal(s), 6 intent(s) would fire # 防篡改 audit log $ sloppy audit tail chain: verified ✓ (3 entries) # 持续运行:HTTP ingest + TTL auto-revert + /status metrics $ sloppyd --rules examples/rules 🥪 sloppyd listening on :8723 ``` ## 状态 ✅ **v0 已实现(计划 1–4)。** 包括一个可导入的 Go 库[^lib] + `sloppy` CLI + `sloppyd` daemon。所有包的 `go test ./...` 均通过(green);静态的 `CGO_ENABLED=0` 二进制文件。设计和计划位于 [`docs/superpowers/`](docs/superpowers/)。与设计合作伙伴的 **Phase-0 需求验证** 正在同步进行(参见 [`docs/vision.md`](docs/vision.md))。 [^lib]: 可导入的核心是 `github.com/sloppyjoe/sloppy` 模块(`cmd/` 之外的所有内容);请通过 `sloppyjoe "github.com/sloppyjoe/sloppy"` 来导入。早期设计文档中的 `libsloppyjoe` 名称从未作为独立工件发布。 ## 架构 Sloppy Joe 是一个**控制循环,而不是 gateway**——它位于你已运行的 LLM gateway 旁边,消费其遥测数据,并通过狭义的、已签名的、可逆的 intent 对其进行反向操作。它永远不会出现在推理请求的热路径上,也永远不会持有你的 provider 密钥。 ``` flowchart LR apps["Apps / agents"] -->|inference requests| gw subgraph GW["LLM gateway — you already run it (not built by Sloppy Joe)"] gw["LiteLLM · Bifrost · Envoy AI Gateway"] keys[("provider keys live HERE")] end gw --> prov["OpenAI · Anthropic · Ollama / vLLM"] subgraph SJ["Sloppy Joe — AI-ops control loop (off the hot path)"] auth["ee/ API-key RBAC"] subgraph ING["ingest (HTTP)"] i1["POST /v1/signals"] i2["POST /v1/usage"] i3["POST /v1/otlp/metrics"] end eng["engine: reconcile → CEL → sign → govern → idempotent"] rls[("rules/*.yaml + CEL")] subgraph ST["state.Store"] led[("cost ledger")] aud[("hash-chained audit")] rev[("pending TTL reverts")] end brk["secret broker (admin / notify tokens only)"] subgraph ACT["actuators — signed, reversible intents"] ac1["LiteLLM route_override"] ac2["GitHub issue"] ac3["Slack page"] ac4["Bifrost · Envoy"] end end gw -. OTel telemetry .-> ING auth --> ING ING --> eng rls --> eng eng <--> ST brk --> ACT eng --> ACT ac1 -. admin API .-> gw ac4 -. admin API .-> gw ac2 --> ext1["GitHub"] ac3 --> ext2["Slack"] subgraph BK["state backends"] db1[("SQLite — solo")] db2[("Redis — multi-replica")] end ST --- db1 ST --- db2 subgraph BIN["binaries"] c1["sloppy CLI — inject · test --replay · audit · doctor"] c2["sloppyd — ingest + TTL revert + /status"] end c1 --> eng c2 --> ING ``` 运行时循环——**观察 → 决策 → 执行 → 记录 → 回滚**——全部在请求热路径之外进行: ``` sequenceDiagram participant GW as Gateway (OTel) participant IN as Sloppy Joe ingest participant EN as engine participant ST as state (ledger/audit/reverts) participant AC as actuator GW-->>IN: telemetry / signal (cost burn, latency, fallback…) IN->>EN: Signal EN->>ST: read cost / policy state EN->>EN: CEL match? `for:` window held? EN->>EN: build + ed25519-sign RemediationIntent EN->>ST: idempotency check (skip if already applied) EN->>AC: Apply (reroute / open issue / page) AC-->>GW: admin API (reroute) EN->>ST: mark applied + append hash-chained audit Note over EN,ST: TTL elapses (sloppyd ticker) EN->>AC: Revert EN->>ST: mark reverted + audit ``` ## 快速开始 ``` go build -o bin/sloppy ./cmd/sloppy go build -o bin/sloppyd ./cmd/sloppyd # 通过示例规则触发一个已记录的 signal,然后读取 audit ./bin/sloppy inject --now --rules examples/rules --db /tmp/sloppy.db examples/signals/cost-spike.json ./bin/sloppy audit tail --db /tmp/sloppy.db # 根据已持久化的公钥验证每个已应用 intent 的 ed25519 签名 # (sloppy.key.pub)。如果任何签名验证失败,则以非零状态退出 —— 这是一个可作 CI gate 的检查。 ./bin/sloppy audit --verify-sigs --db /tmp/sloppy.db --key sloppy.key # 或者运行 daemon 并通过 HTTP POST signals / usage ./bin/sloppyd --rules examples/rules --db /tmp/sloppy.db & curl -XPOST localhost:8723/v1/signals -d @examples/signals/cost-spike.json curl localhost:8723/status ``` **命令:** `sloppy inject` · `sloppy rules validate` · `sloppy test --replay` · `sloppy audit tail` · `sloppy audit --verify-sigs` · `sloppy doctor` · `sloppyd` (daemon)。 - **可验证的签名:** intent 经过 ed25519 签名;应用的审计条目会持久化已签名的规范字节 + 完整签名。`sloppy audit --verify-sigs` 会重新计算每个 intent 的规范字节,并根据持久化的公钥(`sloppy.key.pub`)验证签名,如有任何失败将以非零状态退出。私钥(`sloppy.key`,模式 `0600`)是伪造可验证 intent 所必需的;仅持有公钥的用户可以验证真实性并检测篡改,但无法进行签名。有关威胁模型,请参阅 [`SECURITY.md`](SECURITY.md)。 - **状态后端:** `sloppyd --store sqlite`(默认)或 `--store redis --redis-addr host:6379`。 - **认证:** `sloppyd --auth` 配合 `SLOPPY_API_KEYS="key1=ingest:write,status:read"`。 - **Gateway:** 要接入真实的 LiteLLM admin API,请设置 `SLOPPY_LITELLM_URL` 和 `SLOPPY_TOKEN_LITELLM`。 - **`for:` 时间窗口:** 一次性的 `sloppy inject --now` 会立即触发;`sloppyd` daemon 会在实时信号流中评估 `for:` 时间窗口。 - **在 CI 中把关规则(无需基础设施):** `sloppy rules validate ./rules` 会编译每个 CEL `when`,检查 action 类型和 `intent_budget`,并在出错时以非零状态退出——你可以将其直接放入 PR 检查中。 ## 文档 第一次来这里?通往高效产出的最快路径: 1. **运行它** —— 上面的[快速开始](#quickstart),然后探索 [`examples/`](examples/)(CEL 规则 + 示例信号 + 重放测试夹具)。 2. **了解它为何存在** —— [`docs/vision.md`](docs/vision.md):问题、转型与切入点。 3. **看看它是为谁准备的** —— [`docs/audience.md`](docs/audience.md):谁*操作*它,对比谁*受益*于它。 📖 **完整文档地图 → [`docs/`](docs/README.md)** —— 每一份文档,按意图分组(*理解 · 规划 · 验证 · 贡献*)。单一索引,没有重复内容:描述都在那里,本 README 仅作指引。 ## 原则 - **与模型无关** —— 消费 OpenTelemetry GenAI + CloudEvents,通过供应商中立的已签名 intent 执行操作 - **Linux/Unix 优先** —— 单一的静态 Go 二进制文件 - **库优先** —— 一个小型核心库;CLI + daemon 只是轻量级封装 - **从独立打包到企业级均可适用**,源自同一个核心(适配器可替换) - **问题驱动 · 自动化优先** —— 且是多用途的,而非单一用途 - **绝不持有你的 provider 密钥** —— 它们保留在 gateway 中 ## 部署(本地端到端) 一个 `docker-compose.yml` 即可启动整个循环——Ollama(本地模型)、LiteLLM (gateway)、Redis(状态)和 `sloppyd`(控制循环),无需 provider 密钥: ``` docker compose up -d --build # 驱动一次成本飙升并观察其修复过程: curl -XPOST localhost:8723/v1/signals -d @examples/signals/cost-spike.json curl localhost:8723/status ``` 端到端测试针对该堆栈运行。它受 `integration` 构建标签保护,因此绝不会在常规套件中运行: ``` SLOPPY_E2E_BASE=http://localhost:8723 go test -tags integration ./test/e2e/... ``` ## 许可证 Sloppy Joe 采用 **[Apache License 2.0](LICENSE)** 授权——宽松许可, 包含明确的专利授权(这是控制平面 / 基础设施项目的信任标准)。贡献 将通过相同的许可证在[开发者原产地证明](.github/DCO)签署(`git commit -s`)下被接受;请参阅 [CONTRIBUTING](CONTRIBUTING.md)。版权所有 © The Sloppy Joe Authors。 *在开放中构建。一旦 v0 设计锁定,欢迎贡献。*
标签:EVTX分析, Go语言, LLM网关, 人工智能运维, 可审计性, 搜索引擎查询, 日志审计, 用户代理, 程序破解, 自动化响应, 请求拦截