hotwa 2451c35f9d feat: add bidirectional tool_calls normalization
- Add request-normalizer.ts to fix malformed tool_calls from clients
  - Ensure 'id' field exists (auto-generate if missing)
  - Ensure 'type: "function"' field exists
  - Convert 'arguments' string to object (Ollama expects object, not string)

- Update response-rewriter.ts for Ollama native tool_calls
  - Add missing 'type' field to tool_calls
  - Remove Ollama-specific 'function.index' field

- Fix types/ollama.ts: arguments should be object, not string

This enables multi-turn conversations with tool_calls history from OpenClaw
to work correctly with Ollama API.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 14:00:59 +08:00
2026-03-22 13:16:22 +08:00
2026-03-22 13:16:22 +08:00
2026-03-22 13:16:22 +08:00
2026-03-22 13:16:22 +08:00
2026-03-22 13:16:22 +08:00
2026-03-22 13:16:22 +08:00
2026-03-22 13:16:22 +08:00

OpenClaw Ollama Toolcall Proxy

提供在 OpenClaw 和 Ollama 之间的一个轻量级本地兼容 HTTP 代理层专门修复部分大模型直接把函数调用Tool Call作为 XML 文本输出在 content 里,而无法触发本地 Agent 的问题。

背景原理

当我们使用诸如 OpenClaw 这类 Agent 框架连接 Ollama 提供的开源大模型时:

  • 大模型(如特定微调版本)由于对齐方式,有时会在回答(content)中使用形如 <function=xxx> 的 XML/标记格式呼叫工具。
  • 下游的客户端(如 OpenClaw通常只认标准结构化的 JSON tool_calls
  • 本项目由此诞生:代理接收这些含有未解析标记的流,抽取并清洗后,重新组装为符合标准 OpenAI/Ollama 协议的结构化 tool_calls
  • 如果下游本身正常输出了 tool_calls,本代理不仅会透明无痕放行,甚至兼容 <thinking> 这类原生字段体。

技术栈与特性

  • 跨平台部署Node.js + TypeScript 编写,可以在 Linux (包括 WSL)、macOS 和 Windows 上以极小资源开销跑起来。
  • Fastify 核心:高性能 HTTP 代理。内部直接由内置 Fetch 转发,不携带额外重量级依赖。
  • 自动修正:内置独立的 xml-toolcall 解析器重写响应体。
  • 环境变量控制:利用 .env 对外暴漏服务映射控制。

快速上手

1. 前置要求

  • 安装 Node.js (推荐 v18+)
  • npm / yarn / pnpm

2. 获取代码与安装

```bash

克隆代码

git clone ssh://git@gitea.jmsu.top:2222/lingyuzeng/openclaw-ollama-toolcall-proxy.git cd openclaw-ollama-toolcall-proxy

安装依赖

npm install ```

3. 环境配置

复制环境变量样本: ```bash cp .env.example .env ``` 打开 .env 文件,你可以配置如下属性:

  • OLLAMA_PROXY_TARGET=http://你的OllamaIP:11434 (代理将会将请求路由至此,例如你在局域网内部机器)
  • PROXY_PORT=11435 (本代理的监听端口,为了避开 Ollama 默认的 11434
  • OLLAMA_DEFAULT_MODEL= (如果请求中不带 model 参数,可以强行兜底一个模型名)

4. 运行服务

开发或者调试模式启动(带有热更新重载): ```bash npm run dev ``` 生产运行模式: ```bash

预先进行 TypeScript 编译构建

npm run build

从产物运行

npm run start ```


自定义测试说明

对于环境和转发规则是否工作,可以使用本仓库里提供好的范例 JSON 对你的新端口进行验证:

```bash

目标确保对准代理监听(默认 11435

curl -s http://127.0.0.1:11435/api/chat
-H 'Content-Type: application/json'
-d @test/fixtures/openclaw-like-request.json ```

随后你应该能在控制台以及返回结果中观察到结构化完毕的调用了。代理在识别时会打印:[INFO] Rewriting response: found 1 tool calls in XML content

单元与集成测试验证

项目中提供了由 Vitest 构建的测试脚本。 ```bash npm run test ``` 将会进行 xml-toolcall 解析用例和端到端整合测试。

Description
No description provided
Readme 111 KiB
Languages
TypeScript 90.7%
Shell 8.4%
Dockerfile 0.9%