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

相关推荐
程序员大阳14 分钟前
HTML+CSS+JS对话式实战(6)-学生端查看活动功能开发
javascript·css·html·模块·查看学生
子兮曰19 小时前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome
强尼银手19 小时前
我花一天做了个格斗游戏原型,判定全对,然后被「美术」劝退了
前端·javascript
总要学点什么21 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
OpsEye21 小时前
混合云 AI 架构,如何统一做敏感内容拦截?
javascript·ai编程
Funlang1 天前
给机器写的 JavaScript 造个笼子
开发语言·javascript·ecmascript
古茗前端团队1 天前
由 key 引发的思考
前端·javascript·react.js
kyriewen1 天前
我扫了 422 个仓库,近一半 CI 在裸装依赖
前端·javascript·程序员
vipxieliang1 天前
JavaScript 迭代器与生成器:控制异步与惰性求值
前端·javascript
Hilaku1 天前
Event Loop 这篇你看完就不用再看别的了!
前端·javascript·程序员