Horizon Fidelity Monitor
Horizon 保真度监控器
“质量不是模型属性——而是对话属性。”
Horizon 是一个面向 AI 代理的实时对话健康监控器。它跟踪多轮对话的结构动态——语义漂移、信息增益、本体论差距宽度、时间去同步、昼夜认知负荷、对话速度和因果可达性——这些维度是 LLM 无法从对话内部可靠呈现的。
Horizon 提供两个测量平面。对话平面(始终存在,如上所述)逐轮测量对话的健康状况。可选的任务平面——Memento Mori——测量经过的日历时间与目标的关系:年龄、截止日期、停滞、每实体延迟以及有限视野的份额。在您配置存储之前,它处于惰性状态。请参阅任务平面。
Horizon 不是操纵、谄媚或人类影响检测器——它测量对话动态,而不是代理是否在引导或奉承用户。请参阅 LEGAL.md §1。
为什么需要外部监控器?LLM 具有有限且不可靠的自我认知:内省研究表明部分自我访问是脆弱的,并且在复杂或分布外任务上会退化(Binder et al. 2024;arXiv:2512.12411)。因此,与其依赖模型报告自身的对话动态,Horizon 使用廉价、确定性、始终开启的算术在外部测量它们,完全不调用模型。
为什么存在
多轮 AI 代理会失去准确性。ICLR 2026 杰出论文 “LLMs Get Lost In Multi-Turn Conversation”(Laban、Hayashi、Zhou 和 Neville——Microsoft Research / Salesforce Research)报告了多轮评估中平均 39% 的准确性下降——这是一个标准可观测性工具(LangSmith、RAGAS、DeepEval)无法看到的结构性属性,因为它们测量的是响应,而不是对话。
Horizon 就是为了弥合这一差距而构建的。它首先是可观测性: 它呈现响应级工具遗漏的对话动态,使用廉价的确定性算术,零模型调用。在四个受控的 A/B 场景中,Horizon 事件驱动了重新接地干预,我们测量到 +15.7% 的综合质量提升和 87% 更少的幻觉事件——但这些都是合成的、脚本化的场景,带有手动调整的控制器,而不是生产结果。请将它们视为有前景的内部证据,而不是保证的结果(请参阅验证和 LEGAL.md §5)。每个信号——信息增益、分歧、估计的本体论差距宽度、因果可达性——都是在文本嵌入和时间戳上计算的标准信息论或算术度量;完整定义请参阅 4D 时空信号。
阅读需求证明 → ICLR 2026 杰出论文(Laban 等人)
阅读类别论证 →
docs/content/naming-the-category-conversation-dynamics-monitoring.md阅读工程案例 →
docs/content/why-every-production-agent-needs-conversation-dynamics-monitoring.md
Related MCP server: nautilus-compass
入门
三条路径——选择适合您工作流程的一条:
路径 1 — 托管 MCP(最快,零安装)
将 Horizon 添加到任何 Cursor、VS Code 或 Claude Desktop 工作区的最快方式。无需 Python。
请求 alpha 密钥 → 打开讨论,然后为您的客户端添加配置:
Cursor(~/.cursor/mcp.json):
{
"mcpServers": {
"horizon": {
"url": "https://horizon.leocelis.com/sse",
"headers": { "Authorization": "Bearer YOUR_KEY_HERE" }
}
}
}VS Code / GitHub Copilot(工作区中的 .vscode/mcp.json):
{
"servers": {
"horizon": {
"type": "http",
"url": "https://horizon.leocelis.com/sse",
"headers": { "Authorization": "Bearer YOUR_KEY_HERE" }
}
}
}VS Code 注意: 使用
"servers"(而不是"mcpServers")和"type": "http"——VS Code 首先尝试 Streamable HTTP,然后自动回退到 SSE,因此"type": "http"适用于/sseURL。
Claude Desktop(~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"horizon": {
"url": "https://horizon.leocelis.com/sse",
"headers": { "Authorization": "Bearer YOUR_KEY_HERE" }
}
}
}就这样。重新加载您的 MCP 客户端,三个工具就会出现:new_conversation、process_turn、configure_session。
Alpha 访问: Horizon 的托管端点处于私有 alpha 阶段。密钥分发给想要监控真实项目的代理开发者。打开讨论 请求一个——描述您的用例,我们会发送一个密钥。
路径 2 — pip 安装(库集成)
尚未发布到 PyPI——在此之前,请使用下面的路径 3(从源代码安装)。
pip install horizon-monitor验证您的安装(在 5 个规范场景上运行完整管道,约 25 秒):
horizon-validate路径 3 — 从源代码运行 MCP 服务器
pip install 'horizon-monitor[mcp]'
horizon serve # stdio — for Cursor, Claude Desktop
horizon serve --transport sse --port 3847 # SSE — for web/team deployments添加到 ~/.cursor/mcp.json:
{
"mcpServers": {
"horizon": { "command": "horizon", "args": ["serve"] }
}
}完整的 Cursor 和 Claude Desktop 设置指南:docs/integrations/
它监控什么
标准可观测性工具评估单个响应的质量。Horizon 评估对话质量——这是一个结构上不同的问题:
工具 | 它看到的内容 | 它遗漏的内容 |
LangSmith, Braintrust | 延迟、成本、每个响应的质量 | 确定性、每轮结构信号 |
RAGAS, DeepEval | 每轮的忠实度、相关性(DeepEval 还有采样的多轮 LLM 评判指标) | 零 LLM 调用、每轮实时评分 |
Langfuse, Arize Phoenix | 会话级 LLM 评判评估 | 确定性、始终开启的评分,低于 50ms |
人工评分员 | 主观质量 | 系统性结构退化 |
Horizon | 对话动态 | 有意不遗漏任何内容 |
Horizon 不会取代每个响应或 LLM 评判的质量工具。区别在于如何测量:对每一轮进行确定性、零 LLM 调用的算术运算——实际上免费且始终开启——而替代方案是采样的 LLM 评判评估,每次采样都有成本,并且通常离线或异步运行,而不是实时运行。
快速开始
from horizon_monitor import FidelityMonitor
from datetime import datetime, timezone
monitor = FidelityMonitor()
session_id = monitor.new_conversation(metadata={"domain": "technical"})
result = monitor.process_turn(
session_id,
human_message="How does Python handle memory management?",
agent_response="Python uses reference counting and a cyclic garbage collector...",
timestamp=datetime.now(timezone.utc).isoformat(),
)
print(f"Fidelity: {result.fidelity_score:.2f}")
print(f"Health: {result.health_status}")
print(f"Circadian factor: {result.circadian_factor:.2f}")
print(f"Causal horizon: {result.reachable_turns} reachable turns")
for event in result.events:
print(f" Event: {event.type} (confidence={event.confidence:.2f})")框架集成
OpenAI SDK
from openai import OpenAI
from horizon_monitor import FidelityMonitor
monitor = FidelityMonitor()
session_id = monitor.new_conversation()
client = monitor.wrap(OpenAI(), session_id)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Tell me about quantum computing."}]
)
traj = monitor.get_trajectory(session_id)
print(f"Fidelity: {traj.current_fidelity:.2f} T*: {traj.estimated_t_star}")monitor.wrap() 接受自定义时间戳和上下文提供程序,用于测试和重放。
Anthropic SDK
from anthropic import Anthropic
from horizon_monitor import FidelityMonitor
monitor = FidelityMonitor()
session_id = monitor.new_conversation()
client = monitor.wrap(Anthropic(), session_id)
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
messages=[{"role": "user", "content": "Explain RLHF."}]
)LangChain
from langchain_openai import ChatOpenAI
from horizon_monitor import FidelityMonitor
from horizon_monitor.integrations.langchain import HorizonCallback
monitor = FidelityMonitor()
session_id = monitor.new_conversation()
callback = HorizonCallback(monitor, session_id)
llm = ChatOpenAI(callbacks=[callback])
llm.invoke("Explain the CAP theorem.")
print(f"Fidelity: {callback.last_result.fidelity_score:.2f}")OpenAI Agents SDK
from agents import Agent, Runner
from horizon_monitor import FidelityMonitor
monitor = FidelityMonitor()
session_id = monitor.new_conversation()
agent = Agent(name="assistant", model="gpt-4o-mini", instructions="You are helpful.")
for user_message in conversation:
result = Runner.run_sync(agent, user_message)
monitor.process_turn(session_id, human_message=user_message,
agent_response=result.final_output, timestamp=datetime.now(timezone.utc).isoformat())4D 时空信号
这里的“时空”是隐喻,不是物理学。 相对论词汇(闵可夫斯基间隔、光锥、固有时间)是设计灵感——它塑造了我们计算哪些量。下面的每个信号都归结为对文本嵌入和时间戳的标准信息论或算术度量,列在简明定义列中。Horizon 的行为或验证不依赖于这个类比在字面上成立,并且洛伦兹
interval_class仅作为描述性元数据发出——没有事件或分数依赖于它。
每个 process_turn() 返回一个 TurnResult,包含五个信号族中的 32 个字段:
核心(始终存在)
信号 | 描述 |
| 综合对话健康度 [0, 1] |
| 每轮信息增益——语义新颖性 |
| 意图/响应差距的 Jensen-Shannon 代理 |
| 令牌浪费率——语义冗余 |
| 双可预测性——结构连贯性 |
| 估计的本体论差距宽度 [0, 1] |
|
|
|
|
时间(需要 timestamp)
信号 | 描述 |
| 自上一轮以来的墙钟时间间隔 |
| 人类记忆保持(艾宾浩斯半衰期模型) |
| 此时段的人类认知能力 [0.3, 1.0] |
| 时间去同步的惩罚 |
|
|
| 已解析的指示表达式(“昨天”、“上周”) |
节奏(需要 timestamp + 轮次 ≥ 2)
信号 | 描述 |
| 语义位移 / 固有时间 |
| 速度增量(需要轮次 ≥ 3) |
时空(需要 timestamp + 轮次 ≥ 2)——仅描述性元数据
信号 | 描述(隐喻) | 简明定义(它计算什么) |
| ds² 具有类闵可夫斯基签名 (−,+,+,+) | 一个 4 项加权距离: |
|
|
|
因果(需要 timestamp)
信号 | 描述(隐喻) | 简明定义(计算内容) |
| 仍处于因果光锥内的轮次 | 满足 |
| 仍可因果达及的历史比例 |
|
空间(需要 client_context)
信号 | 描述 |
|
|
| 注意力预算、屏幕容量、最大响应长度 |
| 上下文切换幅度 |
16 种事件类型(对话平面)
所有事件默认处于观察模式(仅发出,不采取行动)。当你的事件在你的领域达到 ≥ 0.7 的精确率/召回率后,通过 configure() 启用主动模式。
事件 | 触发时机 |
| D_JS 高于澄清阈值 |
| 一致性降至阈值以下 |
| 保真度连续 |
| 双向可预测性低于一致性阈值 |
| Token 浪费率高于冗长阈值 |
| IGT 趋势持续走低 — 自然终点临近 |
| 已达到 T*(估计最优长度) |
| IGT 趋势强烈为正 — 对话正在扩展 |
| 时间间隔大且保留率低 |
| 间隔 + 保留率降至失同步阈值以下 |
| 可达比例降至引用断裂阈值以下 |
| 空间约束发生显著变化 |
| 对话加速超过节奏阈值 |
| 可达比例低于光锥阈值 |
| 启发式接地需求分数越过阈值 — 智能体应使用模糊措辞或引用接地证据 |
| 用户回复速度快于先前标记的延迟操作可能完成的速度,且没有完成信号 |
使命平面(Memento Mori)
“进展不是轮次的属性 — 它是日历的属性。”
对话平面回答的问题是*这段对话是否在退化?*使命平面回答的是另一个问题:*这个目标是否仍在推进,以什么时钟为参照?*对对话监控器来说,一个月里各自健康却未推进任何目标的对话,就是一个完美健康月。
名字即设计。每个存储恰好有一个根地平线 — 你选择的有限结束日期。其他一切都挂在它之下,因此一个条目每度过一天,就是一份明显在减少的预算中的一份。没有有限的根,推迟工作就没有代价,“以后”永远免费。这正是这个平面存在所要揭示的失败。
**它默认关闭。**未配置存储时,它的六个工具不会注册,你的集成中不会有任何变化。
它捕获的问题
一个任务被要求在 7 月 20 日前完成。现在已是 8 月 18 日,自 7 月 2 日以来没有人碰过这个使命。一个决定被搁置“等事情平静下来”,并设定了 8 月 10 日的复查日期,而这个日期已经悄然过去。工作已经在某一方手里放了三个星期。这些在任何对话、任何跟踪器的状态列或模型的上下文窗口中都是不可见的 — 而且关于它的每段对话的每一轮看起来都很健康。
使命平面将其报告为:使命已 78 天,距上次进展 47 天,任务生命周期已过期,搁置超期 8 天,目前被 operator 阻塞 21 天且仍在继续。
词汇表
在根地平线之下,所有东西都是树中的一个条目。共有八种:
种类 | 含义 |
| 有限的根 — 每个存储恰好一个,也是每一份份额的分母 |
| 带时钟的目标;可能停滞的东西 |
| 带有 TTL 的工作单元 — 一个约定的时间窗口,其到期意味着去调查,绝不是你估算得不好 |
| 一个外部日期(监管、合同、市场),理想情况下与它所门控的内部工作相关联 |
| 带有年龄预算的检查点 |
| 工作经过并等待的对象 — 队列、供应商、系统、你 |
| 一次搁置。必须有复查日期;没有复查日期的搁置会被存储拒绝 |
| 对另一种工作方式的小型、带日期的试验,以便通过测量而非观点来比较路线 |
输出中还会出现另外两个术语:sojourn(驻留)是某个阶段中一次被记录的停留(进入 → 退出),incumbent(现行方式)是你今天的工作方式,与某种替代方案的试验(probe)相对。
快速开始
export HORIZON_MEMENTO_STORE_PATH=~/.horizon/missions.db # the default: one local file基于文件的存储是合理的默认选择,但在任何文件系统会在部署之间重置的主机上,它就是错误的选择 — 这个平面看起来正常,却会悄悄忘记一切,这比完全不运行更糟。对于这些情况,请将其指向 MySQL 8:
pip install "horizon-monitor[mysql]"
export HORIZON_MEMENTO_STORE_DSN='mysql://user:pass@host:3306/horizon' # wins over _PATH
export HORIZON_MYSQL_SSL_CA=/path/to/server-ca.pem # or ..._CA_B64 for a PEM in an env varTLS 验证是强制性的 — 没有 CA,后端拒绝连接。每个 API 密钥映射到一个已分配的租户 ID(scripts/provision_tenant.py),因此轮换密钥会保留该租户的历史;未知或已撤销的密钥完全无法访问使命。
时钟的好坏取决于到达它的数据,而依赖记得去写的记录,在你忘记的那天就一文不值。因此,这个平面可以从你已经生成的只追加源中派生事件:
python scripts/ingest_artifacts.py --store ~/.horizon/missions.db \
--repo /path/to/repo --item-id <mission-id>每次提交都会变成一个 ARTIFACT 事件,携带来源自身的出处信息,事件的 valid_time 是提交的时间戳 — 而不是你摄取它的时刻。可以安全地从 cron 运行:它按来源的原生 ID 去重,并且只请求新增内容。
有两件事它不会做。它不会猜测某个工件属于哪个使命 — --item-id 是必需的,而适配器接口没有任何参数可以附加它。它也不会判断什么算进展。这些由你决定。
不确定一开始该注册什么?问问你的历史记录有什么建议:
python scripts/ingest_artifacts.py --store ~/.horizon/missions.db \
--repo /path/to/repo --propose它会报告形态 — 有多少工件、跨越什么时间段、从何时开始 — 并建议一个等于最早工件的 created_valid。它不会建议标题,因为工作是什么无法从提交日志中读出。不会写入任何内容;是否注册使命由你决定。
GitLocalAdapter 是参考实现;跟踪器和邮件元数据都适配同一个 ArtifactAdapter 接口。
from datetime import date, datetime, timezone
from horizon_monitor.memento import (
EventKind, ItemKind, MementoConfig, MementoStore, evaluate,
)
store = MementoStore("missions.db") # a real file; set this up once
root = store.register_item(
kind=ItemKind.HORIZON, title="engagement horizon",
created_valid=datetime(2026, 1, 1, tzinfo=timezone.utc),
end_date=date(2030, 1, 1),
)
mission = store.register_item(
kind=ItemKind.MISSION, title="ship-the-thing", parent_id=root,
stall_days=14, # silence longer than this is a stall
created_valid=datetime(2026, 6, 1, tzinfo=timezone.utc),
)
store.record_event( # progress: a side-effect of the work
item_id=mission, kind=EventKind.PROGRESS,
valid_time=datetime(2026, 7, 2, tzinfo=timezone.utc),
)
# The evaluation instant is always a parameter — the engine never reads a clock,
# so the same store at the same instant always yields the same report.
report = evaluate(
store.snapshot(), datetime(2026, 8, 18, 12, tzinfo=timezone.utc), MementoConfig()
)
row = next(r for r in report.items if r.item_id == mission)
print(f"age: {row.age_days} days") # 78 days
print(f"since progress: {row.days_since_progress} days") # 47 days
print(f"recording path: {row.recording_path}") # no recent work
print(f"horizon share: {row.horizon_share:.4f}") # 0.0595存储是一个真正的数据库,所以只需运行一次设置 — 注册第二个根会按设计抛出 DuplicateRootError,这是单一有限根保证在起作用,而不是 bug。要了解全貌 — 过期的任务、超期的搁置、阻塞的实体、被拒绝的写入和触发过的信号 — 请运行 examples/memento_mori_mission_clock.py(无需参数、无需网络、无需 API 密钥;它每次都会使用一个全新的临时存储)。
它衡量什么
输出 | 含义 |
年龄、剩余天数、TTL 状态 | 工作有多久、还剩多少时间、任务是否超出了它的时间窗口 |
距上次进展天数 + 记录路径检查 | 一次停滞 — 以及它是没有工作还是没有记录,两者绝不混淆 |
最慢实体 / 阻塞实体 | 记录中最长的等待,以及另外单独列出工作此刻在等待什么 |
地平线份额 | 这个条目消耗了剩余根地平线的多少份额 |
延迟成本、盈亏平衡日期 | 仅当你声明了小时费率和金额时 |
路径比较 | 试验记录的驻留时间,与现行方式累积的延迟并列对比 |
12 种信号类型(使命平面)
与对话平面的 16 种事件类型 相互独立,而非它们的扩展。每种信号在边沿触发一次 — 当其谓词变为真时 — 条件持续期间不会再次触发,且每轮最多一个新信号,所以糟糕的一周不会淹没你。层级决定了这个上限的优先顺序:P1 是时间关键的,P2 是结构性的,P3 是信息性的。
信号 | 触发时机 | 层级 |
| 外部截止时间进入其预警窗口时 | P1 |
| 任务超出其已批准的生命周期时 — 调查阻塞原因 | P1 |
| 延期超过其复审日期时 | P2 |
| 门控在无进展的情况下超出其时限预算时 | P2 |
| 任务在阈值时间内没有进展事件时(与记录路径检查配对) | P2 |
| 任务中记录的最慢实体的身份发生变化时 | P2 |
| 存在截止时间但没有关联的内部状态时 | P2 |
| 条目的已用时间超过剩余根地平线的阈值比例时 | P3 |
| 累计延迟成本超过操作员阈值时(速率 + 金额 + 阈值均已声明) | P3 |
| 探针驻留完成时 — 足以比较数字,绝不是通电测试 | P3 |
| 探针记录的驻留时间短于现有实体的累计延迟时(仅描述性) | P3 |
| 已批准的盈亏平衡日期已过但未出现所测改进时 | P3 |
这些信号依托现有的 process_turn 契约运行,适用于绑定 associate_mission 的会话。每个事件都携带 plane: "mission",且该契约刻意高调 — 任务信号会连同其数字一起呈现给操作员,而对话信号则静默应用。请参阅 agent rules 获取要粘贴到宿主中的代码块。
它拒绝什么
只做核算,绝不做估算。引擎从不凭空生成时长、日期或金额:
无预测、无完成预估、无反事实的"另一条路径本会花费多少"
无 NPV/IRR/DCF、无折现率、无货币换算 — 金钱只会乘以已测时间
无 p 值、置信区间或对路径延迟的序贯检验:在单操作员样本量下,任何优势主张都无法通过审计,因此比较仅为描述性
无人员分析 — 实体延迟按功能性槽位报告;个人的等待会被测量,但绝不会成为评分、排名或可解析的标识符
缺失输入通过带解释字段的省略降级,绝不通过替换
每一行都携带一个 derivation 字符串,说明其算术来源,任何汇总统计量还会额外携带其所汇总的 n。相同的存储加上相同的求值瞬间,会产生字节级相同的报告。
文档: 产品需求 · 技术规格 · agent rules · 验收测试计划
配置
# Per-session override
monitor.configure(
session_id=session_id,
clarification_threshold=0.25, # tighter D_JS gate
event_modes={"alert.drift": "active"}, # activate one event
)
# Compound weight override
monitor.configure(
fidelity_weights={"alpha": 0.35, "lambda_r": 0.12, "lambda_i": 0.28, "beta": 0.25},
temporal_weights={"gamma": 0.08, "delta": 0.04},
spacetime_coefficients={"alpha": 1.0, "beta": 1.0, "gamma": 0.8, "delta_st": 0.5},
)导出
# JSON
result = monitor.export_to(session_id, target="json")
# LangSmith / Langfuse / OpenTelemetry / Arize
result = monitor.export_to(session_id, target="langsmith",
connection={"api_key": "ls__..."})尚未发布到 PyPI — 请参阅 Path 3 以进行源码安装。
pip install horizon-monitor[langsmith] # or langfuse, otel, arize架构
Input: plain strings (human_message, agent_response, optional timestamp, optional client_context)
Core pipeline (< 50ms on CPU):
1. Embed both turns (local sentence-transformers, lazy-loaded)
2–6. IGT · D_JS · TWR · Bipredictability · Epsilon
7. Temporal signals — gap, retention, circadian, deictic
8. Fidelity dynamics — composite score
9. Health classification
10. Pace signals — velocity, acceleration
11. Spacetime interval — ds² and interval class
12. Causal reachability — light-cone membership
13. Spatial signals — device, location, frame shift
14. Mode detection — auto-classify conversation type
15. Event evaluation — 16 threshold checks
16. Optional: SQLite persistence
Output: TurnResult dataclass (32 fields)设计约束(测试强制):
零 LLM 调用 — 纯算术和本地嵌入
默认零外部网络调用 — 完全本地化
核心中零传递框架依赖
CPU 上核心流水线 < 50ms — 软目标(CI 对超过 50ms 的回归发出警告,超过 150ms 则硬性失败)
100 轮对话内存 < 100MB — 按声明值硬性强制
所有事件默认可观测 — 除非显式配置,否则绝不干扰
验证
已证明什么,未证明什么。 Horizon 的信号是相关性、领域内测量,与人类质量评分吻合良好。它们是可观测性,而非经过验证的结果保证。以下是每项主张的诚实状态:
主张 | 状态 | 位置 |
保真度与人类评分相关(领域内) | ✅ 已测量(ρ ≈ 0.6–0.7) | 下方门控 |
信号优于朴素启发式 | ✅ 已测量 | V3 |
在第三方语料库上成立(领域外) | ❌ 已测试 — 在 MT-Bench 专家判断上 ρ = 0.039(n=80;低于 0.3 下限);需要直接质量标签 | |
事件预测退化(领先而非滞后) | ⚠️ 已在 MT-Bench 上测试 — 数据不足(2 轮对话;事件很少触发);工具可用 | |
对事件采取行动改善结果(+15.7%) | ⚠️ 仅合成 A/B 测试;需要独立语料库 |
以下四个门控在一个带标签的 5,602 条记录语料库上通过(未捆绑 — 请参阅证据包;scripts/build_validation_corpus.py 会重新生成一个合成语料库来演练门控逻辑,而非这些确切数字):
门控 | 约束 | v0.2.0 |
V1 — 代理相关性 | 每对话 ρ ≥ 0.6,每轮 ρ ≥ 0.5 | 0.685 / 0.659 |
V2 — 每事件精确率/召回率 | 每个事件 P ≥ 0.7 且 R ≥ 0.7 | 全部 16 个事件 ≥ 0.70 / 0.70 |
V3 — 优于启发式 | rho 提升 > 25%,结构性 P ≥ 0.6 | +202.4% 提升,P=R=1.00 |
V5 — 跨领域 | 每轮 ρ ≥ 0.4 且每对话 ρ ≥ 0.48 | 最低 0.517 / 0.718 |
跨嵌入稳定性:在三个 sentence-transformer 后端(22M / 33M / 110M 参数)上,ρ_conv 离散度 0.026,ρ_turn 离散度 0.018。保真度信号存在于对话结构中,而非嵌入流形中。(注意:同一语料库上的跨嵌入稳定性不同于跨语料库的 OOD — 首次在 MT-Bench 成对标签上的第三方运行得到 ρ = 0.039;请参阅证据包 §Fix 4。)
修复缺口来源:DESIGN_FIXES_redteam_remediation.md
完整证据包:docs/reviews/V0_2_0_EVIDENCE.md
部署
自托管 Docker(MCP 服务器,端口 3847)
cd deploy/docker
docker compose upHorizon 通过 SSE 提供 MCP API。将 .cursor/mcp.json 指向 http://localhost:3847/sse。Dockerfile 在构建时预缓存 all-MiniLM-L6-v2 权重 — 零冷启动。
托管(DigitalOcean App Platform)
官方托管端点位于 https://horizon.leocelis.com。它运行在 DigitalOcean App Platform 上(单实例,进程内会话状态 — 重启后会话不会保留),需要 Bearer 令牌,按密钥限速并隔离。请参阅上文 Path 1。
开发
git clone https://github.com/leocelis/horizon.git
cd horizon
python -m venv .venv && source .venv/bin/activate
pip install -r requirements-dev.txt
pytest tests/ -v # full suite
pytest tests/unit tests/integration tests/e2e -v # fast path (~6 min)
ruff check src/ tests/
black --check src/ tests/
./scripts/compliance/check.sh # EU AI Act offline gateComplyEdge TrustLint — 欧盟 AI 法案
Horizon 在面向 LLM 的工件上集成 ComplyEdge TrustLint — 与 IVD 相同的离线 + 运行时 + 信任模式。
层 | 内容 |
离线(必需) |
|
运行时(BYOK) | |
CI 门控 |
|
Agent 规则 |
|
集成指南:docs/integrations/COMPLYEDGE.md。CE 采用指南:oss-trustlint-adoption-guide.md。
仓库结构
horizon/
├── src/horizon/ # package source (PEP 517/518 src/ layout)
│ ├── engines/ # IGT, D_JS, TWR, coherence, fidelity, epsilon, mode
│ ├── spacetime/ # temporal, circadian, deictic, velocity, interval, light cone, spatial
│ ├── events/ # 16-event evaluator
│ ├── integrations/ # OpenAI, Anthropic, LangChain, export targets
│ ├── mcp/ # MCP server + CLI
│ └── storage/ # optional SQLite persistence
├── tests/ # unit / integration / e2e / perf / validation
├── examples/ # runnable framework demos
├── deploy/ # Procfile, build.sh, runtime.txt, docker/
├── docs/
│ ├── product/ # public product overview
│ ├── content/ # published pieces on conversation dynamics monitoring
│ ├── integrations/ # Cursor / Claude Desktop / Copilot setup guides
│ ├── cursor-rules/ # horizon-monitor.mdc (canonical Cursor agent rule)
│ ├── spec/ # HORIZON_TECH_SPEC.md + intent.yaml
│ └── reviews/ # E2E reviews, validation evidence
└── pyproject.toml背景
Horizon 的设计灵感来自跨地平线通信协议(THCP),这是一个将人机通信映射到广义相对论隐喻的思辨性框架。五个 THCP"猜想"是设计直觉,而非已证实的定律 — 每一个之所以有用,仅仅是因为它指向了一个具体、可计算的信号:
THCP 猜想(隐喻) | 其启发的可计算信号 |
THCP-1 — 不可约的本体论损失 ε > 0 |
|
THCP-2 — 存在一个最优长度 T*,超过后保真度衰减 | IGT 趋势收敛检测( |
THCP-3 — 通信需要编码/解码伴随 |
|
THCP-4 — 全局一致性需要跨轮次的"层片粘合" | 跨轮次矛盾 / 主张一致性检查 |
THCP-5 — 最优轨迹位于"光锥"附近 |
|
THCP 仅为设计动机——完整的猜想到信号映射请参阅 docs/product/THCP_FIDELITY_MONITOR_PRD.md。
社区
申请 alpha 访问权限: 发起讨论 →
Bug 报告: GitHub Issues
贡献指南: CONTRIBUTING.md
许可证
MIT — 参见 LICENSE。
法律声明
文档 | 用途 |
完整法律声明:Horizon 是什么/不是什么、高风险领域警告、性能声明范围、欧盟 AI 法案分类、grounding hook 隐私、责任限制 | |
约束托管服务器访问和商业使用的具有约束力的条款 | |
符合 GDPR 第 13 条的隐私声明——收集哪些数据以及您的权利 | |
面向欧盟企业用户的 GDPR 第 28 条 DPA 模板(通过电子邮件申请) | |
负责任披露政策;已知的自托管安全注意事项 |
性能声明: 本 README 中 +15.7% 质量提升和幻觉事件减少 87% 的数据来自合成、脚本化的受控 A/B 场景,并使用了手工调校的参考控制器——并非生产流量,也非领域内验证语料库(V1–V5 门禁使用独立的标注数据集)。结果可能因领域、模型和部署配置而异。未经自行开展领域特定评估,请勿在外部营销中使用这些数据。完整范围和证据依据请参阅 LEGAL.md §5。
高风险领域: 未经领域特定验证和人工监督,请勿在医疗、法律、金融或应急服务场景中以 active 模式启用事件类型。请参阅 LEGAL.md §4。
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Related MCP Connectors
Persistent memory and drift detection for AI agents across session restarts.
AI agent observability for production traces, natural-language insights, and improvement loops.
Synthetic checks, nightly regression replay and model-drift alerts for AI agents
LLM Observability & Orchestration Agent
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceStructural observability for AI conversations. Detects loops, stuck states, breakthroughs, and convergence across 17 channels without analyzing content.2MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to retain memory of past interactions and detect behavioral drift, preventing repeated mistakes without LLM token extraction.447MIT
- AlicenseNot gradedqualityCmaintenanceA visual canary that detects context rot and silent model degradation in long agent conversations by embedding externally verified checkpoints and self-reported status into each response.13MIT
- AlicenseNot gradedqualityFmaintenanceProvides AI agents with real-time cognitive health monitoring, detecting context rot through token utilization, retrieval accuracy, and session fatigue analysis.4713MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/leocelis/horizon'
If you have feedback or need assistance with the MCP directory API, please join our Discord server