Skip to main content
Glama
leocelis

Horizon Fidelity Monitor

Horizon 保真度监控器

“质量不是模型属性——而是对话属性。”

Horizon 是一个面向 AI 代理的实时对话健康监控器。它跟踪多轮对话的结构动态——语义漂移、信息增益、本体论差距宽度、时间去同步、昼夜认知负荷、对话速度和因果可达性——这些维度是 LLM 无法从对话内部可靠呈现的。

Horizon 提供两个测量平面对话平面(始终存在,如上所述)逐轮测量对话的健康状况。可选的任务平面——Memento Mori——测量经过的日历时间与目标的关系:年龄、截止日期、停滞、每实体延迟以及有限视野的份额。在您配置存储之前,它处于惰性状态。请参阅任务平面

Horizon 不是操纵、谄媚或人类影响检测器——它测量对话动态,而不是代理是否在引导或奉承用户。请参阅 LEGAL.md §1

为什么需要外部监控器?LLM 具有有限且不可靠的自我认知:内省研究表明部分自我访问是脆弱的,并且在复杂或分布外任务上会退化(Binder et al. 2024arXiv: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 时空信号


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" 适用于 /sse URL。

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_conversationprocess_turnconfigure_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 个字段:

核心(始终存在)

信号

描述

fidelity_score

综合对话健康度 [0, 1]

igt_value

每轮信息增益——语义新颖性

divergence_score

意图/响应差距的 Jensen-Shannon 代理

twr_value

令牌浪费率——语义冗余

consistency_score

双可预测性——结构连贯性

epsilon_t

估计的本体论差距宽度 [0, 1]

health_status

healthy / degrading / critical / converged

conversation_mode

execute / explore / refine / learn(自动检测)

时间(需要 timestamp

信号

描述

gap_seconds

自上一轮以来的墙钟时间间隔

estimated_retention

人类记忆保持(艾宾浩斯半衰期模型)

circadian_factor

此时段的人类认知能力 [0.3, 1.0]

temporal_asymmetry

时间去同步的惩罚

resumption_cost

none / low / medium / high / extreme

temporal_references

已解析的指示表达式(“昨天”、“上周”)

节奏(需要 timestamp + 轮次 ≥ 2)

信号

描述

conversation_velocity

语义位移 / 固有时间

conversation_acceleration

速度增量(需要轮次 ≥ 3)

时空(需要 timestamp + 轮次 ≥ 2)——仅描述性元数据

信号

描述(隐喻)

简明定义(它计算什么)

spacetime_interval

ds² 具有类闵可夫斯基签名 (−,+,+,+)

一个 4 项加权距离:ds² = −α·log(1+Δt)² + β·ΔD_JS² + γ·Δε² + δ·ΔC²。时间项上的负号是约定,不是物理定律。

interval_class

timelike / spacelike / lightlike

ds² 的符号桶(< −ε> ε,否则为 lightlike)。仅作为元数据发出——没有事件或保真度分数使用它

因果(需要 timestamp

信号

描述(隐喻)

简明定义(计算内容)

reachable_turns

仍处于因果光锥内的轮次

满足 in_context × retention(Δt) × cosine_similarity > θ 的先前轮次数 — 仍在窗口内、尚未被记忆衰减、且主题相关。

reachable_fraction

仍可因果达及的历史比例

reachable_turns / (turn − 1)

空间(需要 client_context

信号

描述

location_class

home / office / mobile_transit / unknown

spatial_constraint

注意力预算、屏幕容量、最大响应长度

spatial_frame_shift

上下文切换幅度


16 种事件类型(对话平面)

所有事件默认处于观察模式(仅发出,不采取行动)。当你的事件在你的领域达到 ≥ 0.7 的精确率/召回率后,通过 configure() 启用主动模式。

事件

触发时机

checkpoint.clarification

D_JS 高于澄清阈值

checkpoint.comprehension

一致性降至阈值以下

alert.drift

保真度连续 drift_window 轮下降

alert.contradiction

双向可预测性低于一致性阈值

alert.verbosity

Token 浪费率高于冗长阈值

signal.convergence

IGT 趋势持续走低 — 自然终点临近

signal.optimal_length

已达到 T*(估计最优长度)

signal.horizon_widening

IGT 趋势强烈为正 — 对话正在扩展

signal.session_reset

时间间隔大且保留率低

signal.temporal_desync

间隔 + 保留率降至失同步阈值以下

signal.broken_reference

可达比例降至引用断裂阈值以下

signal.frame_shift

空间约束发生显著变化

signal.pace_shift

对话加速超过节奏阈值

signal.light_cone_collapse

可达比例低于光锥阈值

signal.grounding_required

启发式接地需求分数越过阈值 — 智能体应使用模糊措辞或引用接地证据

signal.pace_premature_report

用户回复速度快于先前标记的延迟操作可能完成的速度,且没有完成信号


使命平面(Memento Mori)

“进展不是轮次的属性 — 它是日历的属性。”

对话平面回答的问题是*这段对话是否在退化?*使命平面回答的是另一个问题:*这个目标是否仍在推进,以什么时钟为参照?*对对话监控器来说,一个月里各自健康却未推进任何目标的对话,就是一个完美健康月。

名字即设计。每个存储恰好有一个根地平线 — 你选择的有限结束日期。其他一切都挂在它之下,因此一个条目每度过一天,就是一份明显在减少的预算中的一份。没有有限的根,推迟工作就没有代价,“以后”永远免费。这正是这个平面存在所要揭示的失败。

**它默认关闭。**未配置存储时,它的六个工具不会注册,你的集成中不会有任何变化。

它捕获的问题

一个任务被要求在 7 月 20 日前完成。现在已是 8 月 18 日,自 7 月 2 日以来没有人碰过这个使命。一个决定被搁置“等事情平静下来”,并设定了 8 月 10 日的复查日期,而这个日期已经悄然过去。工作已经在某一方手里放了三个星期。这些在任何对话、任何跟踪器的状态列或模型的上下文窗口中都是不可见的 — 而且关于它的每段对话的每一轮看起来都很健康。

使命平面将其报告为:使命已 78 天,距上次进展 47 天,任务生命周期已过期,搁置超期 8 天,目前被 operator 阻塞 21 天且仍在继续。

词汇表

在根地平线之下,所有东西都是树中的一个条目。共有八种:

种类

含义

horizon

有限的根 — 每个存储恰好一个,也是每一份份额的分母

mission

带时钟的目标;可能停滞的东西

task

带有 TTL 的工作单元 — 一个约定的时间窗口,其到期意味着去调查,绝不是你估算得不好

deadline

一个外部日期(监管、合同、市场),理想情况下与它所门控的内部工作相关联

gate

带有年龄预算的检查点

entity

工作经过并等待的对象 — 队列、供应商、系统、你

deferral

一次搁置。必须有复查日期;没有复查日期的搁置会被存储拒绝

probe

对另一种工作方式的小型、带日期的试验,以便通过测量而非观点来比较路线

输出中还会出现另外两个术语: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 var

TLS 验证是强制性的 — 没有 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 是信息性的。

信号

触发时机

层级

signal.deadline_window

外部截止时间进入其预警窗口时

P1

signal.ttl_expired

任务超出其已批准的生命周期时 — 调查阻塞原因

P1

signal.deferral_expired

延期超过其复审日期时

P2

signal.gate_aging

门控在无进展的情况下超出其时限预算时

P2

signal.mission_stalled

任务在阈值时间内没有进展事件时(与记录路径检查配对)

P2

signal.slowest_entity

任务中记录的最慢实体的身份发生变化时

P2

signal.clock_unpaired

存在截止时间但没有关联的内部状态时

P2

signal.horizon_share

条目的已用时间超过剩余根地平线的阈值比例时

P3

signal.cost_of_delay

累计延迟成本超过操作员阈值时(速率 + 金额 + 阈值均已声明)

P3

signal.probe_ready

探针驻留完成时 — 足以比较数字,绝不是通电测试

P3

signal.path_ahead

探针记录的驻留时间短于现有实体的累计延迟时(仅描述性)

P3

signal.breakeven_passed

已批准的盈亏平衡日期已过但未出现所测改进时

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 下限);需要直接质量标签

V0_2_0_EVIDENCE.md §Fix 4, adapt_external_corpus.py

事件预测退化(领先而非滞后)

⚠️ 已在 MT-Bench 上测试 — 数据不足(2 轮对话;事件很少触发);工具可用

leading_indicator.json, measure_leading_indicator.py

对事件采取行动改善结果(+15.7%)

⚠️ 仅合成 A/B 测试;需要独立语料库

run_interventional_ab.py, LEGAL.md §5

以下四个门控在一个带标签的 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 up

Horizon 通过 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 gate

ComplyEdge TrustLint — 欧盟 AI 法案

Horizon 在面向 LLM 的工件上集成 ComplyEdge TrustLint — 与 IVD 相同的离线 + 运行时 + 信任模式。

内容

离线(必需)

./scripts/compliance/check.sh — 扫描 horizon_intent.yaml + horizon-monitor.mdc

运行时(BYOK)

./scripts/compliance/runtime_check.sh — 提供实时徽章 + 信任页面

CI 门控

.github/workflows/ci.yml 作业 compliance + 可选 compliance-runtime

Agent 规则

<BEGIN-COMPLYEDGE v1.0> 位于 docs/cursor-rules/horizon-monitor.mdc

集成指南: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

epsilon_t — 估计的意图/响应差距宽度 [0, 1]

THCP-2 — 存在一个最优长度 T*,超过后保真度衰减

IGT 趋势收敛检测(signal.convergenceestimated_t_star

THCP-3 — 通信需要编码/解码伴随

consistency_score — 双向嵌入可预测性

THCP-4 — 全局一致性需要跨轮次的"层片粘合"

跨轮次矛盾 / 主张一致性检查

THCP-5 — 最优轨迹位于"光锥"附近

reachable_fraction — 先前轮次上的保留 × 相似度

THCP 仅为设计动机——完整的猜想到信号映射请参阅 docs/product/THCP_FIDELITY_MONITOR_PRD.md


社区


许可证

MIT — 参见 LICENSE


法律声明

文档

用途

LEGAL.md

完整法律声明:Horizon 是什么/不是什么、高风险领域警告、性能声明范围、欧盟 AI 法案分类、grounding hook 隐私、责任限制

TERMS_OF_SERVICE.md

约束托管服务器访问和商业使用的具有约束力的条款

PRIVACY_POLICY.md

符合 GDPR 第 13 条的隐私声明——收集哪些数据以及您的权利

DATA_PROCESSING_AGREEMENT.md

面向欧盟企业用户的 GDPR 第 28 条 DPA 模板(通过电子邮件申请)

SECURITY.md

负责任披露政策;已知的自托管安全注意事项

性能声明: 本 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.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    Structural observability for AI conversations. Detects loops, stuck states, breakthroughs, and convergence across 17 channels without analyzing content.
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A 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.
    13
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Provides AI agents with real-time cognitive health monitoring, detecting context rot through token utilization, retrieval accuracy, and session fatigue analysis.
    47
    13
    MIT

Latest Blog Posts

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