mcpField
H
Horizon Fidelity Monitor

Horizon Fidelity Monitor

远程服务
leocelis.github.ioAI 与智能体02 天前更新

关于 Horizon Fidelity Monitor

Horizon Fidelity Monitor 衡量多轮 AI 对话中的结构变化,例如漂移、信息增益和时间不同步。它面向需要逐轮监测对话、且不希望调用模型的 Agent 开发者。

主要功能

  1. 01逐轮对话健康评分
  2. 02漂移、新颖度与一致性信号
  3. 03时间与对话节奏指标
  4. 04因果可达性度量
  5. 05观察模式对话事件

适用场景

  1. 01监测 Agent 多轮对话质量
  2. 02识别漂移或连贯性下降
  3. 03检查时间和上下文对对话的影响

MCP 相关

提供创建对话、处理轮次和配置会话的 MCP 工具。可通过托管 SSE 端点连接,也可作为本地 stdio 或 SSE 服务运行。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://horizon.leocelis.com/sse
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

全部服务地址
SSEhttps://horizon.leocelis.com/sse需要授权

工具

详细介绍

Horizon 保真度监控器

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

测试 ComplyEdge 执行认证

Horizon 是一款面向 AI Agent 的实时对话健康监控器。它跟踪多轮对话的结构动态——语义漂移、信息增益、本体间隙宽度、时间不同步、昼夜节律认知负荷、对话速度和因果可达性;这些维度无法由大模型在对话内部可靠地呈现。

Horizon 提供两个测量平面。对话平面(上文所述,始终启用)逐轮测量对话健康状况。可选的任务平面 ——Memento Mori——测量相对于目标的日历时间流逝:时长、截止日期、停滞、各实体延迟,以及有限时间范围的占比。在配置存储之前,该平面不会运行。请参阅任务平面。

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

为什么需要外部监控器?大模型的自我认知有限且不可靠:内省研究表明,大模型只能部分访问自身状态,这种能力很脆弱,在复杂或分布外任务中会退化(Binder 等,2024;arXiv:2512.12411)。因此,Horizon 不依赖模型报告自身的对话动态,而是通过廉价、确定、始终运行且完全不调用模型的算术方法,从外部对其进行测量。


为什么要构建它

多轮 AI Agent 会丧失准确性。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)。每个信号——信息增益、偏离度、估算本体间隙宽度、因果可达性——都是基于文本嵌入和时间戳计算的标准信息论或算术指标;完整定义请参阅四维时空信号。


入门

三种方式——选择最适合你工作流的方式:

方式 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_conversation、process_turn、configure_session。

Alpha 访问权限: Horizon 的托管端点目前处于私人 alpha 阶段。密钥会发放给希望监控真实项目的 Agent 开发者。发起讨论申请密钥——请描述你的用例,我们会发送密钥。

方式 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 评审评估确定性、持续运行且耗时低于 50 毫秒的评分
人类评审者主观质量系统性结构衰减
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_valueToken 浪费率——语义冗余度
consistency_score双向可预测性——结构连贯性
epsilon_t估算的本体论差距宽度 [0, 1]
health_statushealthy / degrading / critical / converged
conversation_modeexecute / explore / refine / learn(自动检测)
时间(需要 timestamp)
信号描述
gap_seconds距上一轮的实际时间间隔
estimated_retention人类记忆保持率(艾宾浩斯半衰期模型)
circadian_factor此时的人类认知能力 [0.3, 1.0]
temporal_asymmetry时间不同步惩罚
resumption_costnone / 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_classtimelike / spacelike / lightlikeds² 的符号类别(< −ε、> ε,否则为 lightlike)。仅作为元数据输出——没有任何事件或保真度评分会使用它。
因果(需要 timestamp)
信号描述(比喻)通俗定义(计算内容)
reachable_turns仍处于因果光锥内的轮次先前轮次的计数,其中 in_context × retention(Δt) × cosine_similarity > θ——仍在上下文窗口内、记忆尚未衰减且主题相关。
reachable_fraction历史记录中仍可因果触达的比例reachable_turns / (turn − 1)。
空间(需要 client_context)
信号描述
location_classhome / office / mobile_transit / unknown
spatial_constraint注意力预算、屏幕容量、最大响应长度
spatial_frame_shift上下文切换幅度

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

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

事件触发条件
checkpoint.clarificationD_JS 高于澄清阈值
checkpoint.comprehension一致性低于阈值
alert.drift连续 drift_window 轮的保真度持续下降
alert.contradiction双向可预测性低于一致性阈值
alert.verbosityToken 浪费率高于冗长度阈值
signal.convergenceIGT 趋势持续偏低——自然终点即将到来
signal.optimal_length达到 T*(估算的最佳长度)
signal.horizon_wideningIGT 趋势强烈为正——对话正在扩展
signal.session_reset时间间隔较长且留存率较低
signal.temporal_desync时间间隔加上留存率下降,低于时序失同步阈值
signal.broken_reference可达比例低于失效引用阈值
signal.frame_shift空间约束发生显著变化
signal.pace_shift对话加速程度高于节奏阈值
signal.light_cone_collapse可达比例低于光锥阈值

仅适用于 MCP 服务,且仅当其配置了 COMPLYEDGE_API_KEY 时:alert.compliance(始终处于主动模式)——ComplyEdge 根据某项 EU AI Act 规则标记了该轮的 human_message 或 agent_response;该事件会指出对应规则,确保下一条回复不会基于这些内容继续展开。 | signal.grounding_required | 启发式依据需求分数超过阈值——Agent 应谨慎表述或引用依据证据 | | signal.pace_premature_report | 用户回复速度快于先前标记的延迟操作在合理情况下可能完成的速度,且没有完成信号 |


任务平面(Memento Mori)

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

对话平面回答的是*这段对话是否正在恶化?*任务平面回答的是另一个问题:*这个目标是否仍在推进?它受什么时限约束?*一个月里,每次对话单独看来都很健康,却毫无进展;对于对话监控器来说,这就是一个月的完美健康状态。

名称即设计。每个存储区都恰好有一个根期限——一个由你选择的有限截止日期。其他一切都以此为基础,因此每个事项占用的每一天,都是一份肉眼可见、正在耗尽的预算。没有有限的根期限,推迟工作就没有代价,“以后再说”便永远免费。这个平面旨在让这种失效变得可见。

**默认关闭。**未配置存储区时,其七种工具不会注册,你的集成也不会有任何变化。

它能发现的问题

一项任务的截止日期是 7 月 20 日。现在已是 8 月 18 日,自 7 月 2 日以来没有人再推进这项任务。一项决定被搁置,理由是“等事情平静下来再说”,并设定了 8 月 10 日的复查日期,但这个日期已悄然过去。这项工作已经由一方持有三周。所有这些情况都不会显示在任何对话中、任何追踪器的状态栏中,也不会出现在模型的上下文窗口里——而每一段关于此事的对话,每一轮看起来都很健康。

任务平面会这样报告:任务已存在 78 天,距离上次进展已有 47 天,任务生命周期已过期,搁置已逾期 8 天,目前已由 operator 阻塞 21 天,且仍在持续。

词汇

根 horizon 下的树中,每个对象都是一个条目。共有八种类型:

类型含义
horizon有限根节点——每个存储区恰好有一个,也是每项份额的分母
mission有时限的目标;可能停滞的对象
task带有 TTL 的工作单元——双方约定的时间窗口,过期意味着需要调查,而不是你估算得不好
deadline外部日期(监管、合同、市场),理想情况下应关联到其所制约的内部工作
gate带有时限预算的检查点
entity工作流经并等待的对象——队列、供应商、系统,或你自己
deferral暂存项。必须提供重新审视日期;没有日期时,存储区会拒绝创建
probe对替代工作方式进行的小型、有日期的试验,以便通过测量而非意见比较不同路线

输出中还会出现两个术语:驻留时段(sojourn)是某个阶段中记录的一次停留(进入 → 退出),而现行方式(incumbent)是你今天采用的工作方式,与对某种替代方案的试验相对。

快速入门
export HORIZON_MEMENTO_STORE_PATH=~/.horizon/missions.db   # the default: one local file
在持久化的多租户环境中运行(MySQL)

基于文件的存储是合适的默认选择,但对于部署之间文件系统会重置的主机来说,它并不是正确的选择——运行平面看起来正常,却会悄无声息地忘掉所有内容,这比完全不运行还糟。对于这类主机,请将其连接到 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,这是单一有限根节点保证正常生效,并非错误。要了解完整示例——任务过期、暂存项逾期、阻塞实体、写入被拒绝以及信号触发——请运行 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 规则,了解要粘贴到宿主中的代码块。

它拒绝做什么

只做核算,绝不估算。引擎绝不凭空编造时长、日期或金额:

  • 不做预测、不预测完成时间,也不计算反事实的“另一条路径会花费多少”
  • 不做 NPV/IRR/DCF,不使用贴现率,不进行货币换算——金额只会与测得的时间相乘
  • 不对路径延迟进行 p 值、置信区间或序贯检验:在单个操作者的样本量下,任何优势主张都经不起审计,因此比较仅作描述
  • 不做人员分析——实体延迟按功能岗位报告;测量某人的等待时间,但绝不将其转化为评分、排名或可解析的身份标识
  • 缺少输入时,结果会直接省略并附上说明字段,绝不会用替代值填补

每一行都带有 derivation 字符串,逐项说明其计算过程;任何汇总统计还会附带其汇总的 n。相同的数据存储和相同的评估时刻会生成字节完全相同的报告。

文档:产品需求 · 技术规范 · Agent 规则 · 验收测试计划


配置

# 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——暂时请参阅 路径 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)

设计约束(由测试强制执行):

  • 不调用大模型——仅执行纯算术运算并使用本地嵌入
  • 默认不进行外部网络调用——完全本地运行
  • 核心代码不依赖任何传递引入的框架
  • 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.50.685 / 0.659
V2 — 每事件 P/R每个事件 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

跨嵌入稳定性:在三个句子转换器后端(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(端口 3847 上的 MCP 服务)
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 token;请求会按密钥限流并隔离。请参阅上文的路径 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 — EU AI Act

Horizon 在面向 LLM 的制品上集成 ComplyEdge TrustLint,采用与 IVD 相同的离线 + 运行时 + 信任模式。

层级内容
离线(必需)./scripts/compliance/check.sh — 扫描 horizon_intent.yaml + horizon-monitor.mdc
运行时(MCP)在服务环境中设置 COMPLYEDGE_API_KEY 后,process_turn 会通过 POST /v1/check 检查 human_message(提示词)和 agent_response(输出);如果违反规定,则返回 alert.compliance
运行时(BYOK)./scripts/compliance/runtime_check.sh — 提供实时徽章 + 信任页面
CI 门禁.github/workflows/ci.yml 中的 compliance + 可选的 compliance-runtime 任务
Agent 规则docs/cursor-rules/horizon-monitor.mdc 中的 <BEGIN-COMPLYEDGE v1.0>

集成指南:docs/integrations/COMPLYEDGE.md。公开的 CE 嵌入文档:信任徽章。


仓库布局

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 的设计受到 Trans-Horizon Communication Protocol(THCP)的启发。THCP 是一种推测性框架,它将人类与 AI 的通信映射到广义相对论的隐喻上。THCP 的五个“猜想”是设计直觉,而非已证实的定律——每个猜想都只有在指向一个具体、可计算的信号时才有用:

THCP 猜想(隐喻)启发出的可计算信号
THCP-1 — 不可约的本体论损失 ε > 0epsilon_t — 估算的意图/响应差距宽度 [0, 1]
THCP-2 — 存在一个最优长度 T*,超过该长度后保真度会衰减IGT 趋势收敛检测(signal.convergence、estimated_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 是什么/不是什么、高风险领域警告、性能声明范围、欧盟《人工智能法案》分类、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。

评论

支持 Markdown

第一次接触 MCP?

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

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