mcpField
Q
quellgeist-metrics

quellgeist-metrics

本地服务
github.com/Rajeev-Shyam数据与分析114 周前更新

关于 quellgeist-metrics

面向 Quellgeist 事件分诊的只读 MCP 服务,可查询本地指标时间序列,为生产故障调查提供指标证据。

主要功能

  1. 01查询指标时间序列
  2. 02读取本地指标数据
  3. 03只读访问

适用场景

  1. 01在事件分诊时检查指标
  2. 02将指标变化与事件时间对照

MCP 相关

通过 stdio 向 MCP 客户端提供 `query_metrics` 工具,是 Quellgeist 只读事件分诊 MCP 服务之一。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"rajeev-shyam-quellgeist-metrics": {
"command": "uvx",
"args": [
"quellgeist"
],
"env": {
"QG_METRICS_PATH": "<QG_METRICS_PATH>"
}
}
}
}
启动命令uvx quellgeist
需要配置的环境变量
QG_METRICS_PATHPath to the metric series to read (default: demo/metrics.json, resolved against the working directory).

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiquellgeist0.1.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Quellgeist

ci security tuned 4B License: MIT Python 3.12+

值得信赖的一线事件分诊:按置信度排序的根因假设,每条主张都有真实证据句柄作为依据——Agent 宁可弃答,也不猜测。

Quellgeist 是一个与模型无关的 AI Agent,用于生产事件的一线分诊。 它通过只读工具(结构化日志 + 最近部署 + 指标时间序列)运行清晰易懂的 JSON-action ReAct 循环,然后生成结构化的诊断: 按置信度排序的根因假设,每条假设都有 Agent 实际看到的结构化证据句柄(LogRef.id / CommitRef.sha / MetricRef.id)作为依据——绝不使用自由文本。它的两大特色是:

  • 引用结构化句柄。 证据是可核验的句柄,而不是句子,因此伪造引用是可衡量的,并且会被无密钥伪造检查确定性地拒绝——这不是模糊字符串匹配的问题。
  • 宁可弃答,不要幻觉。 自信地给出错误原因是最糟糕的答案,因此,*"证据不足"*是一种一等结果。

状态:Wave 4 已完成——微调有效。 对本地推理模型(Qwen3-4B,通过 Ollama 提供服务)进行的 DR-0020 QLoRA 微调,使其在留出集上的表现从基础模型的 0/16 提升到 12/16——零伪造、零推测性筛选,成本还比基础模型更低——同时在同一留出集上以 $0、完全离线的方式胜过 31B 前沿模型(Gemma-4-31B,10/16)。通过三种方式交叉验证未记忆:fixtures ≈ 留出集;core-fresh ≥ core-overlap;结构探测 7/10。 有两个需要如实说明的局限:resource_exhaustion 类别未能迁移(0/N;前沿模型能通过),系统层面的对抗性弃答召回率为 6/12——31B 前沿模型也有同样的上限(同为 6/12),这不是微调导致的退步。该 Agent 出错时只会不完整或过于谨慎,绝不会自信地伪造。请参阅 状态与路线图 · 微调案例研究。

有何不同

证据是句柄每个假设都会引用日志行中来源稳定的 id 或提交的 sha,这些值从工具结果中逐字复制——确定性伪造检查据此进行查询。说明文字保存在仅用于显示的 note 中。(DR-0009)
弃答是一项功能当信号较弱时,Agent 会返回 abstained=true、弃答原因和空的假设列表——由架构强制执行。
从设计上与模型无关循环会从普通聊天文本中解析 JSON 操作,因此无论使用 Gemini 免费层还是本地 4-bit Qwen,运行方式都完全相同——不依赖任何后端的原生函数调用。只需更改一项配置即可切换模型。(DR-0008、DR-0010)
可靠性由门禁把关,而非口头保证每次推送都会运行无密钥、确定性的 CI 门禁(ruff + black + pytest,包括由 fixtures 支持的评估工具)。
它是什么 / 它不是什么
  • **它是:**一线 分诊 Agent——基于只读日志/部署/指标,给出按可能性排序、附有证据引用的根因假设(或坦诚弃答);其模型无关的循环既可运行在托管的前沿模型上,也可运行在本地 4B 模型上。
  • **它不是:**自主修复器(它绝不会修改生产环境——解决方案验证是延期、优先精简的后续阶段);也不是经过生产级加固的服务(演示刻意设计成玩具示例);更不是通用 Agent。它所评估的留出集是 词汇表外但结构内 的——这并不代表它能处理未见过的事件形态或真实生产数据。

快速入门(约 30 秒即可让服务故障并生成结构化日志)

需要 uv 和 Python 3.12+。

只需一条无需密钥的命令,即可查看符合真实情形的诊断结果(无需模型,也无需 API 密钥):

uv sync && uv run quellgeist diagnose --demo     # renders the demo incident's cited postmortem

然后针对正在运行的玩具服务执行完整循环:

uv run uvicorn demo.app.main:app          # 1. start the toy service (leave running)

# --- in a second shell, from the repo root ---
uv run python -m demo.chaos.bad_deploy    # 2. inject a simulated bad deploy
curl -s localhost:8000/login              # 3. trip /login -> 500s + structured error logs
uv run quellgeist diagnose --show-trace   # 4. diagnose live (needs a model; see below)

uv run python -m demo.chaos.reset         # back to a green slate

实时步骤需要一个推理器——请参阅运行模型。 没有密钥时,quellgeist diagnose 会以状态码 1 退出,并输出一行错误信息和提示(绝不会显示回溯);--demo 始终无需密钥即可运行,并根据 gold 确定性地生成相同格式的输出。

架构

自定义且清晰易懂的循环充当编排层;三个只读工具构成证据接口;Diagnosis 架构则是事后分析渲染器和评测裁判共同读取的契约。

flowchart TD
    trigger(["incident trigger - CLI"]) --> loop
    model["reasoner via LiteLLM<br/>(Gemini or local Qwen, swappable)"] -. "chat completion" .-> loop

    subgraph loopbox["model-agnostic JSON-action ReAct loop"]
      loop["run_loop()<br/>decide, call tool, observe, repeat"]
    end

    loop -- "query_logs" --> logs["logs tool<br/>structured JSONL, stable ids"]
    loop -- "get_recent_commits" --> commits["commits tool<br/>deploy_log.json, shas"]
    loop -- "query_metrics" --> metrics["metrics tool<br/>time-series, named series"]
    logs -- "rows + ids" --> loop
    commits -- "commits + shas" --> loop
    metrics -- "series + names" --> loop

    loop --> diag["Diagnosis (schema.py)<br/>ranked hypotheses citing<br/>LogRef.id / CommitRef.sha / MetricRef.id, or abstains"]
    diag --> pm["postmortem renderer<br/>deterministic Markdown"]
    diag --> judge["eval judge<br/>fixture scenarios, CI gate"]

这三个工具也都通过标准输入/输出作为 MCP 服务公开(python -m quellgeist.servers.logs_mcp、…commits_mcp、…metrics_mcp)。Agent 目前通过 ToolSpec 注册表,在进程内复用相同的工具函数;标准输入/输出 MCP-客户端路径(由 Agent 通过线缆驱动这些服务)已列入路线图(DR-0010)。

深入了解:docs/architecture.md 介绍了完整流程(循环 → 工具 → 验证器 → 事后分析)、时序图、模块映射和跨领域设计决策。

每次发布带标签的版本时,服务都会发布到 Official MCP Registry(请参阅docs/publishing.md);发布后,每个服务都可以通过 uvx --from quellgeist quellgeist-logs-mcp(或 …-commits-mcp / …-metrics-mcp)运行。

示例会话

注入有问题的部署——它会写入一个标记,使 verify_token 出现 NoneType 回归,并生成 deploy_log.json;其中的问题提交正好在错误出现前合入(以下为示例 stdout——时间戳会反映你的运行时间;路径相对于仓库根目录):

$ uv run python -m demo.chaos.bad_deploy
injected bad deploy a1b2c3d (touched demo/app/auth.py) at 2026-06-24T12:22:43Z
  marker:     demo/.bad_deploy
  deploy log: demo/deploy_log.json
next: hit /login to generate the 500s, then `quellgeist diagnose`

配置好推理器后,quellgeist diagnose 会读取日志和部署信息并生成事后分析报告。CI 环境中没有经过验证的模型密钥(DR-0012),因此以下诊断结果由 gold 渲染——通过 render_postmortem 根据夹具中带标签的原因和证据句柄确定性生成,并非模型实时输出:

# Incident Postmortem (rendered from gold)

## Root-cause hypotheses

### 1. Bad deploy a1b2c3d (10:01:50Z) refactored auth.py and introduced a NoneType error in verify_token; /login 500s begin ~20s later at 10:02:12Z.  (confidence: 1.00)

Evidence:
- log #2
- commit a1b2c3d

你也可以自行复现该渲染结果(无需模型):

uv run python - <<'PY'
from evals.scenarios.generator import load_scenario
from quellgeist.agent.schema import Diagnosis, Hypothesis
from quellgeist.output.postmortem import render_postmortem

s = load_scenario("evals/scenarios/fixtures/bad_deploy_0001.json")
gold = Diagnosis(hypotheses=[
    Hypothesis(cause=s.gold_cause, confidence=1.0, evidence=s.gold_evidence_refs)
])
print(render_postmortem(gold, title="Incident Postmortem (rendered from gold)"))
PY

重点不在于文字描述,而在于 log #2 和 commit a1b2c3d 是指向真实信号的精确句柄,而非转述。实时运行还会补充一行摘要和建议操作;证据不足以确定可信原因时,则会直接弃答。

使用 --out postmortem.md 将事后分析报告写入文件,或使用 --out postmortem.html(或 --format html)生成独立的 HTML 页面——渲染结果同样是确定性的,不依赖外部资源。

运行模型

推理模型可以是任意 LiteLLM 模型字符串,通过 --model 或 QG_MODEL 环境变量选择(默认值为 gemini/gemini-3.5-flash)。LiteLLM 从环境变量读取服务提供商密钥;仓库中不会存储任何内容。

export QG_MODEL="gemini/gemini-3.5-flash"
export GEMINI_API_KEY="…"
uv run quellgeist diagnose --show-trace

也可以通过 Ollama 完全在本地离线运行——这是预期的家庭默认方案 (DR-0008;具体工件已在 DR-0019 中固定),无需 API 密钥:

ollama pull qwen3:4b-instruct-2507-q4_K_M
export QG_MODEL="ollama_chat/qwen3:4b-instruct-2507-q4_K_M"
uv run quellgeist diagnose --show-trace

基础版与微调版——重要。 上面的 ollama pull 拉取的是基础版 Qwen3-4B: 它是诚实、安全的底线——在留出集上得分为 0/16,对所有情况都弃答, 绝不捏造(DR-0019)。12/16 的头条结果来自 DR-0020 微调版(quellgeist-qwen3-dr0020), 你可以通过 finetune/README.md 构建并提供服务(免费 Colab QLoRA 运行 → ollama create)。在发布该微调 GGUF、可通过一行命令拉取之前,普通 ollama pull 提供的都是基础模型——安全,但尚无实用性。要查看实时诊断,请使用托管模型(上文)或微调版。

提醒(DR-0012):在未经验证且未启用计费的项目中使用 Gemini 密钥,会导致当前模型返回 429 limit: 0,因此随附的 CI 门禁特意设计为无需密钥;由模型驱动的评估则需要密钥,并在 带外运行(DR-0015)。在家中,预期的默认推理模型是通过 Ollama 运行的本地 Qwen3-4B (DR-0008)。

运行评估(推理模型 + 验证器 + LLM 评审器)

夹具评估使用确定性的关键词评审器为推理模型评分,并检查是否存在捏造内容(无需密钥的门禁); 此外还可以运行两个模型层(DR-0016):一个验证器,用于确认引用的证据支持各项假设 (否则强制弃答),以及一个提供建议的 LLM 评审器评分标准。

export GEMINI_API_KEY="…"
export QG_MODEL="gemini/gemini-3.5-flash"
QG_VERIFY=1 QG_JUDGE_LLM=1 \
QG_MIN_CALL_INTERVAL_S=6 \      # pace calls under the free-tier RPM (avoids 429 bursts)
  uv run python -m evals.run_evals

QG_VERIFIER_MODEL / QG_JUDGE_MODEL 可分别指定各层使用的模型(默认使用 QG_MODEL)。后端无法访问(配额不足/503/超时)或凭据被拒绝(密钥缺失/无效/过期) 时,都会报告为跳过,而非失败(DR-0015/DR-0017),因此带外评估不会因免费套餐的小故障而 显示红色。LLM 评审器的评分仅供参考(不会用于门禁)。在人工标注的黄金子集上,使用独立 评审模型(groq/llama-3.1-8b-instant ≠ 推理模型)时,它与人工判定结果的一致性达到 Cohen's kappa 0.81——该结果已在此子集上验证(DR-0018);但当 QG_JUDGE_MODEL 与推理模型相同时,仍属于自我评分。

CI 的带外评估通过 Groq 运行(groq/llama-3.3-70b-versatile,需要 GROQ_API_KEY):Gemini 免费套餐在云端 CI 中被证明无法使用(429 → 503 → 超时 → 密钥无效),因此只需更改一个环境变量就替换了推理模型——这正体现了模型无关的 理念(DR-0017)。预期的家庭默认方案仍是本地 Qwen3-4B(DR-0008)。

在真实数据上使用

演示程序会读取三个规范文件;你的生产信号并非如此。 quellgeist ingest 是适配器——将其指向真实数据源,它就会写入工具所读取的规范文件:

quellgeist ingest \
  --logs    /var/log/myapp/     # file or directory; JSONL, JSON, plain text, or mixed
  --deploys deploys.json        # JSON array, GitHub payload, or `git log` text
  --metrics prom.json           # a Prometheus response or a canonical array
  --out-dir ./signals
# prints the `export QG_*` lines; then:
quellgeist diagnose --show-trace --strict-citations   # add --model / a provider key

它能够处理杂乱的真实数据(将外部字段名映射到架构字段、把时间戳规范化为 UTC、将格式错误的 行强制转换,而不会导致运行崩溃),并且 query_logs 会限制单次观测返回的行数(QG_MAX_ROWS, 默认值为 200),避免大型日志撑爆上下文窗口。确定性的“引用或弃答”保证在实际使用时 生效:diagnose 会针对真实信号验证每个引用的句柄,并在发现捏造内容时发出警告(--strict-citations 会在 CI 中以非零状态码退出)。完整指南:docs/ingestion.md。

运行实时服务(v2)

v2 将同一个冻结核心封装成实时、并发、可观测的事件响应服务:经过签名的 webhook 会触发调查,工作池会在每个事件隔离的快照上运行未改动的循环,每次运行及其跟踪记录和成本都会持久化到 SQLite,操作员会先批准 / 引导 / 拒绝,然后服务才会将结果发布到 Slack 和一份独立的 HTML 页面;沙盒修复后,Agent 会重新读取信号以确认恢复情况。所有内容均为增量改动;冻结的测量面保持不变。整个技术栈只需一个文件即可运行:

cp .env.example .env            # set QG_WEBHOOK_SECRET, QG_OPERATOR_TOKEN, QG_VERIFIER_MODEL…
docker compose up --build       # demo service + agent service + Ollama
docker compose exec ollama ollama pull qwen3:4b-instruct-2507-q4_K_M   # first run only

# break it, trigger an investigation, review, then confirm the fix in the sandbox:
docker compose exec demo python -m demo.chaos.bad_deploy
#   … POST a signed incident to :8000/incidents, approve it on the HTML page …
docker compose exec demo python -m demo.chaos.fix_deploy   # heal without wiping the log
#   … POST /incidents/{id}/verify-resolution → recovered | not_recovered | inconclusive

密钥仅通过环境变量提供(因为这是公开仓库);服务采用故障关闭机制——未设置 webhook 密钥时会拒绝所有请求,未设置操作员令牌时会关闭操作员界面,并且绝不会发布捏造的或未经验证的诊断结果。设计文档:DR-0023 + 规范。

状态与路线图

项目分阶段滚动推进——只有当前阶段实现了详细内容 (参见 docs/quellgeist-plan-rolling-wave.md)。 完整的决策历史记录见 ADR 日志。

阶段范围状态
0降低模型选择风险(4B 能否编排此循环)✅ 已完成 — 默认模型 = Qwen3-4B(DR-0008)
1错误部署切片:演示 → 破坏 → 诊断 → 事后分析;评测框架 + CI✅ 已完成 — 核心链路已构建并通过单元测试
2可靠性核心:验证器检查、确定性捏造检测、弃答、大模型裁判✅ 已构建 — 提供无需密钥的确定性门控,并可选择启用验证器 / 裁判;首次真实运行通过,未出现捏造(DR-0016/DR-0017)。裁判验证 + 可靠性率将延续到阶段 3
3扩大覆盖面:配置 / 环境变量 + 资源耗尽类别、指标、约 50 个场景✅ 已完成 — 65 个场景的测试套件覆盖 3 个类别;首次完整运行结果为 61/65,0 捏造;裁判已验证(kappa 0.81)。参见可靠性和裁判验证案例研究
4成本 / 微调:QLoRA Qwen3-4B 与基础模型及前沿模型对比,含 / 不含验证器✅ 已完成 — 基础模型 0/16 → 微调后保留集 12/16(0 捏造、0 推测性过滤;成本低于基础模型);与 Gemma-4-31B 相比具备竞争力(能力方面 16 项中胜出 10 项,弃答方面 12 项中打平 6 项);resource_exhaustion 未能学会 + 对抗性弃答的共同上限为 6/12(案例研究,DR-0019/DR-0020)
5润色并发布:HTML 渲染、安全审查、MCP 注册表、上线🚧 工程已完成 — 等待发布审批(HTML 渲染 + 安全扫描器 + 威胁模型 + 注册表 / OIDC 脚手架均已完成;剩下发布标签和上线)
6解决情况验证循环⤳ 已并入 v2(阶段 9)
v2(7–9)实时事件响应服务(webhook → 并发工作器 → 持久化运行记录 → HITL 审核 → Slack/HTML → 沙盒解决情况复核)+ Dockerfile/compose✅ 已构建 — 阶段 7–9 已交付:经过签名的 webhook → 并发工作器 → 持久化且带引用的运行记录 → 故障关闭的 HITL 审核门控 → Slack/HTML → 确定性沙盒解决情况复核;非 root Docker + compose;339 项无需密钥的测试,冻结部分的差异为空(DR-0023/0027/0028,规范)
v2 轨道 B(10)可靠性轨道:考虑时序的验证器 + 结构变化 / 结构外泛化评测🚧 已规划 — DR-0024–0026

阶段边界是刻意划定的,并非尚未完成:只有当前阶段实现了详细内容,后续阶段已规划,但有意暂不实现。v2 是在经过验证的 v1 核心上进行的增量扩展——冻结的微调测量面绝不会更改(DR-0023;由 tests/frozen/ 保护)。

可靠性门槛

确定性 CI 门槛是可靠性契约:339 项测试(通过 pre-commit 运行 ruff

  • black,然后运行 pytest——涵盖循环永不崩溃/优雅弃答行为、确定性伪造检查和 基于引用的判定门槛、验证器和辅助 LLM 判定器、参数化 场景生成、判定器验证测试框架、服务端筛选器、事后分析渲染器、基于固定测试数据的评估测试框架、真实数据导入 + 稳健性层、端到端真实事件测试框架,以及 v2 实时服务—— 签名 Webhook、每个事件的并发隔离、HITL 审核门槛和 确定性沙箱解决方案检查),在 Python 3.12 和 3.13 上运行。

在常规流程之外,模型驱动评估会在 65 个场景的 测试套件上运行推理器。最近一次完整运行的得分为通过 61/65 项,0 项伪造证据 (Cerebras Gemma-4-31B)——各类别明细和失败分析见 可靠性案例研究。

uv run pytest tests/ -q
uv run pre-commit run --all-files

开发与贡献

开发环境设置、约定和 wave 模型见 CONTRIBUTING.md;举报方式和禁止机密信息/ 玩具演示政策见 SECURITY.md;社区行为规范见 CODE_OF_CONDUCT.md。Bug 报告和功能请求请使用 问题模板;PR 请遵循 PR 模板。

许可证

MIT © Rajeev Shyam Kumar。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。