Add project summary and Linux.do post

This commit is contained in:
coolxll
2026-03-30 15:48:14 +08:00
parent df69105329
commit 1423c5e6b4
3 changed files with 341 additions and 0 deletions

1
.gitignore vendored
View File

@@ -9,3 +9,4 @@ dist/
coverage.* coverage.*
.idea/ .idea/
.vscode/ .vscode/
nul

137
LINUXDO_POST.md Normal file
View File

@@ -0,0 +1,137 @@
# 把 Lingma 变成 OpenAI 兼容的 API 服务
> 写了一个 IPC 代理,让 Lingma 可以用标准 OpenAI API 调用
## 缘起
事情要从 [opencli](https://github.com/jackwener/opencli) 说起。
当时想给它写个插件扩展,本来打算用 Electron 做 UI通过浏览器 DevTools 协议跟 Lingma 通信。但这样太绕了,性能也不好。
后来偶然看 Lingma 的日志,发现它在本地启了一个 Named Pipe
```
\\\\.\\pipe\\lingma-xxxxxx
```
顺着这个线索翻进程文件,在 `%APPDATA%/Lingma/SharedClientCache/.info.json` 里发现了这个:
```json
{
"websocketPort": 36510,
"pid": 14060,
"ipcServerPath": "\\\\.\\pipe\\lingma-bf0f32"
}
```
原来 Lingma 启动时会把自己的通信地址写在这个文件里。不需要走浏览器,直接连 pipe 就行。有了地址,就可以连上去了。
## 是什么
`lingma-ipc-proxy` 是一个本地代理服务,通过 Named Pipe 或 WebSocket 与 Lingma 通信,对外暴露兼容 OpenAI / Anthropic 的 HTTP API。
这样你就可以在 Cursor、Claude Desktop、或其他支持 OpenAI API 的工具里用 Lingma 的模型了。
## 能做什么
- ✅ 兼容 `/v1/chat/completions``/v1/messages`
- ✅ 支持流式输出 (SSE)
- ✅ 支持工具调用(通过 prompt 模拟)
- ✅ 自动发现 Lingma 连接pipe 或 websocket
- ✅ 可配置会话模式:复用 / 临时 / 自动
## 快速开始
```powershell
# 克隆
cd C:\Workspace\Personal\lingma-ipc-proxy
# 直接运行
go run .\cmd\lingma-ipc-proxy --port 8095
# 或者构建 exe
.\scripts\build.ps1
.\dist\lingma-ipc-proxy.exe
```
## 使用示例
```powershell
$body = @{
model = "dashscope_qwen3_coder"
messages = @(@{ role = "user"; content = "你好" })
stream = $false
} | ConvertTo-Json
Invoke-RestMethod -Method Post `
-Uri http://127.0.0.1:8095/v1/chat/completions `
-ContentType "application/json" `
-Body $body
```
## 一些技术细节
**传输层自动发现**
- 先读 `%APPDATA%/Lingma/SharedClientCache/.info.json`
- 找不到就扫 `\\.\pipe\lingma-*`
- 也支持手动指定 pipe 或 ws 地址
**会话管理三种模式**
- `reuse`: 一直用同一个会话(适合单轮)
- `fresh`: 每次新建临时会话(适合多轮长对话)
- `auto`: 单轮复用,带 history 走 fresh默认
**工具调用怎么做的**
Lingma 原生不支持工具调用,所以用 prompt 注入的方式:
1. 把工具定义塞进 system prompt
2. 让模型输出 ` ```json action` 代码块
3. 代理解析 action block 转成 tool_call 格式
4. 工具结果再塞回去继续对话
## 部署为 Windows 服务
```powershell
# 用 NSSM
.\scripts\install-nssm-service.ps1 -NssmPath C:\Tools\nssm\nssm.exe
# 或者用 WinSW
.\scripts\install-winsw-service.ps1
.\LingmaIpcProxy.exe install
.\LingmaIpcProxy.exe start
```
## 项目结构
```
cmd/lingma-ipc-proxy/ # 入口
internal/
httpapi/ # HTTP 层,处理 OpenAI/Anthropic 格式
lingmaipc/ # IPC 层pipe/ws 传输
service/ # 业务层,会话管理
toolemulation/ # 工具模拟
```
纯 Go 实现,只依赖 `go-winio``gorilla/websocket`
## 代码质量
- 分层清晰,没搞过度设计
- 配置优先级:默认值 → JSON → 环境变量 → 命令行
- 有基础测试覆盖
- 支持优雅关闭
## 局限
- 目前只支持 Windows因为 Named Pipe
- 单请求限流channel buffer=1
- 工具调用是 prompt 模拟的,不是原生支持
> 有大佬如果能扒出 Lingma 原生工具调用的协议,那最好不过了。目前我是通过 prompt 注入让模型输出 action block再解析成 tool_call能用但不够优雅。
## 仓库
代码在自托管仓库,有兴趣可以看看实现细节。
---
有类似需求的可以交流,也欢迎提建议。

203
SUMMARY.md Normal file
View File

@@ -0,0 +1,203 @@
# lingma-ipc-proxy 项目总结
## 项目概述
**lingma-ipc-proxy** 是一个独立的 Go 后端服务,通过 Lingma 本地 pipe 或 WebSocket 传输与其通信,对外暴露兼容 OpenAI 和 Anthropic 的 API 接口。
### 核心功能
- **API 兼容性**: 支持 OpenAI (`/v1/chat/completions`) 和 Anthropic (`/v1/messages`) 格式的 API
- **流式与非流式响应**: 完整支持 SSE 流式输出和普通 JSON 响应
- **双传输层**: 支持 Windows Named Pipe 和 WebSocket 两种传输方式
- **直接 IPC 通信**: 直接与 Lingma 进程通信,不依赖 DOM/CDP
- **工具调用模拟**: 通过 prompt 注入方式模拟工具调用能力
---
## 架构设计
### 项目结构
```
lingma-ipc-proxy/
├── cmd/lingma-ipc-proxy/ # 入口程序
│ └── main.go # 配置加载、服务启动、信号处理
├── internal/
│ ├── httpapi/ # HTTP API 层
│ │ ├── server.go # HTTP 路由、请求处理、流式响应
│ │ └── server_test.go # 工具模拟相关测试
│ ├── lingmaipc/ # IPC 通信层
│ │ ├── client.go # JSON-RPC 客户端、通知订阅
│ │ ├── transport.go # Pipe/WebSocket 传输实现
│ │ └── transport_test.go # 传输层测试
│ ├── service/ # 业务逻辑层
│ │ └── service.go # 会话管理、请求编排、模型列表
│ └── toolemulation/ # 工具调用模拟
│ └── toolemulation.go # 工具定义解析、Action Block 处理
├── scripts/ # 构建与服务安装脚本
│ ├── build.ps1
│ ├── install-nssm-service.ps1
│ └── install-winsw-service.ps1
├── config.example.json # 配置文件示例
├── README.md / README.zh-CN.md
└── go.mod # Go 1.25.0
```
### 核心模块职责
| 模块 | 职责 |
|------|------|
| `httpapi` | HTTP 服务、请求解析、响应格式化OpenAI/Anthropic 双协议) |
| `lingmaipc` | 底层 IPC 通信Named Pipe/WebSocket、JSON-RPC 协议 |
| `service` | 业务逻辑编排、会话生命周期管理、模型列表获取 |
| `toolemulation` | 工具调用模拟(通过 prompt 注入实现) |
---
## 技术实现亮点
### 1. 配置优先级设计
支持四层配置覆盖(优先级从低到高):
1. 内置默认值
2. JSON 配置文件
3. 环境变量
4. 命令行参数
### 2. 会话管理模式
三种会话模式满足不同场景:
- `reuse`: 持续复用 sticky 会话(适合单轮对话)
- `fresh`: 每次请求新建临时会话(适合多轮对话)
- `auto`: 智能判断(单轮复用,带 history/system 走 fresh
### 3. 传输层自动发现
支持自动检测 Lingma 连接方式:
- 读取 `%APPDATA%/Lingma/SharedClientCache/.info.json`
- 自动扫描 `\\.\pipe\lingma-*` 命名管道
- 支持显式配置覆盖
### 4. 流式响应实现
通过 Go Channel 实现真正的异步流式:
- `GenerateStream` 返回 `(eventsCh, doneCh)`
- HTTP 层使用 `http.Flusher` 实时推送 SSE
- 支持 Anthropic 和 OpenAI 两种流式格式
### 5. 工具调用模拟
不依赖原生工具支持,通过 prompt 工程实现:
- 注入工具定义到 system prompt
- 要求模型输出 `\`\`\`json action` 代码块
- 解析 Action Block 转换为 Tool Call
- 支持工具结果回传继续对话
---
## API 端点
| 端点 | 方法 | 说明 |
|------|------|------|
| `/` / `/health` | GET | 健康检查 |
| `/v1/models` | GET | 获取可用模型列表 |
| `/v1/messages` | POST | Anthropic 格式对话 |
| `/v1/chat/completions` | POST | OpenAI 格式对话 |
---
## 部署方式
### 1. 直接运行
```powershell
go run .\cmd\lingma-ipc-proxy --port 8095 --session-mode auto
```
### 2. 构建可执行文件
```powershell
.\scripts\build.ps1
# 输出: dist\lingma-ipc-proxy.exe
```
### 3. Windows 服务部署
支持 NSSM 和 WinSW 两种方式:
```powershell
# NSSM
.\scripts\install-nssm-service.ps1 -NssmPath C:\Tools\nssm\nssm.exe
# WinSW
.\scripts\install-winsw-service.ps1
.\LingmaIpcProxy.exe install
.\LingmaIpcProxy.exe start
```
---
## 代码质量
### 测试覆盖
- `transport_test.go`: 共享客户端信息解析、WebSocket URL 规范化
- `server_test.go`: 工具模拟历史消息处理
### 设计模式
- **分层架构**: 清晰的 API/Service/IPC 分层
- **信号量限流**: 使用 buffered channel 实现单请求限流
- **连接池管理**: sticky session + 连接复用
- **优雅关闭**: 信号监听 + context 超时控制
### 依赖项
```go
require (
github.com/Microsoft/go-winio v0.6.2 // Windows Named Pipe
github.com/gorilla/websocket v1.5.3 // WebSocket 支持
)
```
---
## 项目状态评估
### 已完成 ✅
- [x] 基础 HTTP API 服务OpenAI/Anthropic 双协议)
- [x] Named Pipe 传输层
- [x] WebSocket 传输层
- [x] 流式响应支持SSE
- [x] 会话管理reuse/fresh/auto 三种模式)
- [x] 模型列表获取
- [x] 配置文件支持JSON
- [x] 环境变量支持
- [x] Windows 服务部署脚本
- [x] 工具调用模拟prompt 注入方式)
- [x] 基础测试覆盖
### 技术债务/待优化 ⚠️
- [ ] 工具模拟目前通过 prompt 注入,非原生支持
- [ ] 单请求限流channel buffer=1可能成为瓶颈
- [ ] 仅支持 WindowsNamed Pipe 依赖)
- [ ] 测试覆盖率可进一步提升
---
## 使用场景
1. **本地开发**: 将 Lingma 能力以标准 OpenAI API 暴露给其他工具
2. **IDE 集成**: 在 VS Code/Cursor 等工具中使用 Lingma 模型
3. **自动化脚本**: 通过标准 HTTP API 调用 Lingma 能力
4. **工具链集成**: 支持 function calling 的 agent 工作流
---
## 总结
这是一个**功能完整、架构清晰**的 IPC 代理项目。代码质量良好,分层合理,配置灵活,部署方便。核心能力是将 Lingma 的私有 IPC 协议转换为业界标准的 OpenAI/Anthropic API使得 Lingma 可以无缝集成到更广泛的 AI 工具生态中。
项目已达到**可用状态**,可以作为生产环境的本地代理服务部署。