Ollama 探测拦截与 Cloudflare Workers 边缘优化

当在 Hermes Agent 中配置了自定义提供商(custom)端点时,客户端在初始化阶段会尝试自动剥离 /v1 尾缀并向后端发起 POST /api/show 请求进行 Ollama 服务探测。如果后端仅提供标准 OpenAPI 接口,将导致网关产生大量的 404 错误日志并增加启动时滞。

本卡片记录如何利用 Cloudflare 边缘计算(Workers)拦截并 Mock 该探测请求,从而在不修改本地环境的前提下优化启动速度并净化日志。


一、 第一性原理:Cloudflare Tunnel 的能力边界

  • Tunnel 功能定位:Cloudflare Tunnel(cloudflared)的核心作用是内网穿透与安全路由。它在其 Ingress 规则中虽然可以直接返回特定的 HTTP 状态码,但不具备对特定路径请求进行 Payload 修改或静态 Mock 返回 JSON 响应体的能力。
  • 直接返回的局限:如果强行通过 Tunnel 返回 200 状态码而没有合法的 JSON 响应体,会导致 Hermes 客户端在反序列化数据时引发严重的崩溃错误,而不是优雅退回到默认上下文长度。

二、 解决方案:Cloudflare Workers 边缘拦截 (SOP)

由于流量已托管在 Cloudflare 边缘网络上,我们可以使用 Serverless 架构,在流量穿过 Tunnel 到达本地服务器之前完成边缘拦截和 Mock。

1. 客户端规避策略 (可选)

如果需要从客户端直接杜绝探测,可在本地 Hermes 的 config.yaml 配置文件中为对应的 custom 提供商显式指定上下文长度:

context_length: 8192

2. Workers 边缘拦截配置步骤 (推荐)

  1. 登录 Cloudflare 控制台,进入左侧菜单的 Workers & Pages -> Overview
  2. 点击 Create Application -> Create Worker,随意命名(例如 mock-api-show),点击 Deploy
  3. 进入代码编辑器(Edit code),写入以下拦截代理代码:
    export default {
      async fetch(request, env, ctx) {
        const url = new URL(request.url);
        // 拦截针对 /api/show 的 POST 探测请求
        if (request.method === "POST" && url.pathname === "/api/show") {
          return new Response(JSON.stringify({ modelfile: "" }), {
            status: 200,
            headers: {
              "Content-Type": "application/json",
              "Access-Control-Allow-Origin": "*" // 解决跨域限制
            }
          });
        }
        // 其余流量正常穿透并回源至 Tunnel
        return fetch(request);
      }
    };
  4. 点击右上角 Deploy 部署生效。
  5. 绑定自定义路由
    • 在该 Worker 页面中,选择 Settings -> Triggers -> Routes -> Add route
    • 填写要绑定的域名路径:[REDACTED].yinf.de/api/show
    • Zone 选择你的域名。

三、 逆向评估与防线 (Inversion)

1. 方案优势

  • 零本地配置:本地容器环境(cli-proxy-apicloudflared)无需做任何修改,保持环境纯净。
  • 超低延迟:拦截在最近的 Cloudflare 全球边缘节点完成,探测请求根本不会穿过穿透隧道打到本地服务器,本地网关的 404 日志彻底消失。

2. 潜在风险与死法清单

  • 路由掩蔽效应:如果未来该域名需要真正接入标准的本地 Ollama 实例,必须手动到 Cloudflare 控制台将该 Worker 路由解绑,否则真实的 /api/show 请求会被边缘节点强行拦截并返回空 Mock 数据,导致模型调用报错。

相关链接