ll-llm:一个零依赖、可插拔的 OpenAI 兼容 LLM 代理

# ll-llm:一个零依赖、可插拔的 OpenAI 兼容 LLM 代理

开源地址:github.com/371684029/ll-llm

## 背景

日常开发中经常要在不同 LLM 后端间切换------Cursor CLI 做代码、OpenCode 跑分析、OpenAI 调接口。每个后端格式不同、认证不同、模型名不同,切一次改一堆配置。更麻烦的是,大多数 AI 工具(Continue.dev、Aider、VS Code 插件)只认 OpenAI API 格式。于是写了 ll-llm------零运行时依赖的 HTTP 代理,统一包装成 OpenAI 兼容接口。

## 一句话讲清楚

把任何 LLM 后端包装成标准 OpenAI API,对接任何 OpenAI SDK 客户端。

复制代码
你的代码 / IDE 插件
      │  POST /v1/chat/completions
      ▼
   ll-llm (端口 6666)
      │
      ├── cursor Provider   → spawn cursor agent
      ├── opencode Provider → HTTP API (规划中)
      └── openai Provider   → HTTP API (规划中)

## 目前做了什么

第一个版本完成 Cursor CLI 后端代理:模型映射(gpt-4o/claude-3.5-sonnet → Cursor 内部 ID)、流式+非流式双模式、base64 图片多模态、agent 模式切换(ask/agent/plan)、三种密钥配置方式 + 启动格式校验。

复制代码
from openai import OpenAI
client = OpenAI(base_url="http://localhost:6666/v1", api_key="any-key")
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "解释量子计算"}],
)

## 技术设计

1. 零运行时依赖------只用 node:http、node:child_process、node:fs,打包 15KB,不需要 node_modules。

2. Provider 可插拔架构------核心接口只有两行:

复制代码
export interface LLMProvider {
  readonly name: string;
  chat(options): AsyncGenerator<ChatChunk>;
}

路由层 handleChat 只调 provider.chat(options),不碰内部实现。加新后端零改动路由。

3. 模型解析三层优先级------显式 mode 字段 > 模型名后缀(gpt-4-ask) > 默认 agent。

4. Fail-fast 启动校验------密钥缺失或格式不对直接 exit(1),避免"服务跑了才发现 500"。

## 如何扩展新后端

三步:1) 写 ~50 行实现 LLMProvider 接口 → 2) index.ts 注册一行 → 3) model-map.ts 加映射。路由代码不动。

## 部署

复制代码
tar -xzf ll-llm.tar.gz && cd dist
echo 'CURSOR_API_KEY="crsr_你的密钥"' > .env
node index.js   # 无需 npm install

## 后续计划

接入 OpenCode Go 的 deepseek-v4-pro 作为第二个后端,改 model 字段即可在多个后端间透明切换。


GitHub: github.com/371684029/ll-llm | MIT | Node.js ≥ 20 + Cursor CLI

相关推荐
西红柿炖牛腩3542 小时前
机房电脑不能联网,怎么离线把课件里的 3D 模型压小?Draco / Meshopt 参数清单
前端·javascript·3d·性能优化·大屏端
爱喝水的小周2 小时前
实验十三 Vue 过渡与动画—电商后台消息中心实现
前端·javascript·vue.js
无责任此方_修行中2 小时前
如何不用括号调用 JS 的函数?
前端·javascript·node.js
无责任此方_修行中2 小时前
Deno 的八年:一场没逃出 Node 引力的运行时起义
前端·javascript·node.js
用户298698530143 小时前
在 React 中使用 JavaScript 将 Markdown 转换为 PDF
javascript·react.js·markdown
Hilaku4 小时前
为什么我在团队里禁止使用 axios?
前端·javascript·程序员
一只游鱼4 小时前
我用原生 JS 做了一个「会呼吸」的博客:Canvas 水境 + 合成音效 + 会破裂的留言气泡(vibe coding)
javascript·agent·canvas·github pages
只睡四小时5 小时前
Local-First 数据契约:一张表装下 4 类数据
前端·javascript·架构设计·local-first·数据契约
云浪16 小时前
Go 并发实战:从零实现一个高并发安全的任务调度器
javascript·后端·go
OpsEye1 天前
大模型账单对账难:不同厂商 Token 统计口径差异怎么处理
javascript·ai编程