Microkernel · Plugins · TS / Python / Rust

把模型选择权还给开发者

PolyLLM 是一个微内核、插件化的大模型统一接入层。核心只负责协议、注册、解析与参数策略; 厂商适配独立成包,按需安装、独立演进。TypeScript、Python、Rust 三语言同一套协议, 同一份共享契约 fixture 裁决跨语言行为。

  • 统一 API
  • 模型别名与快照
  • 参数策略
  • 离线接入诊断
  • 本地可视化配置

Why PolyLLM

极简核心,按需插件

不把几十个供应商依赖塞进一个“全家桶”,而是让每个团队只安装自己需要的部分。

01

微内核核心

统一请求、响应、ModelSpec、注册表、别名解析与参数策略,不包含任何供应商 HTTP 逻辑。

02

插件自治

OpenAI、DeepSeek、Anthropic、Gemini、Ollama、OpenAI-compatible 独立成包,供应商 API 变化时只更新对应插件。

03

模型版本可控

ModelSpec 声明能力、参数约束、上下文窗口和快照;别名指向常用模型,快照锁定版本。

04

三语言同协议

TypeScript(npm)、Python(PyPI)、Rust(crates.io)同一套统一协议,行为由共享契约 fixture 裁决,跨语言不靠抄实现。

Diagnostics · Experimental

把「诡异的流式故障」变成可重放证据

普通聊天可用,但工具调用、参数或流式行为异常——这是 OpenAI-compatible 生态里一类高频、难查的故障。 polyllm diagnose 把你捕获的失败流重放到一个独立的规范参考累积器上, 输出分层结论与版本化 JSON 报告。纯离线:无网络、无凭据、无遥测。

一条命令,重放脱敏捕获
npx @you-want/polyllm-cli diagnose \
  --fixture ./my-fixture.json
✗ my-fixture.json [C13] captured-derived
  verdict: upstream-noncompliant-recoverable
  anomaly [stream-parse] STREAM_PARSE_MISSING_INDEX (chunk#1,chunk#2)
  observation OBS_EXPLICIT_NULL (chunk#2,chunk#3)
报告已写入: polyllm-diagnostics-report/

故障分层

request-mapping / upstream-response / stream-parse / normalization——哪一层出了问题,证据定位到 chunk。

稳定的异常码

STREAM_PARSE_MISSING_INDEX、NORMALIZATION_ARGS_IN_CONTENT 等——可进 CI,可被搜索引擎检索。

可重放的最小复现

脱敏 fixture 在新目录可重放;故意损坏的流必然让检查变红(变异检查),防止「报告永远绿」。

Quick Start

三分钟接入第一个模型

先用本地 Studio 完成选择和配置,再把生成物放进你的项目。当前稳定版本 0.6.0。

启动可视化配置
npx @you-want/polyllm-cli studio

CLI 会启动 http://127.0.0.1:5177,并自动打开浏览器。

  1. 选择厂商 同时启用多家厂商,为每家指定默认模型。
  2. 获取模型 填写 Key 与 Base URL 后本机探测;无法获取时手动添加模型 ID。
  3. 测试连接 对单个模型发起最小请求,确认 Key、模型与网关可用。
  4. 生成配置 下载 polyllm.config.json、环境变量模板和接入代码。
npm install @you-want/polyllm-core \
  @you-want/polyllm-openai \
  @you-want/polyllm-deepseek
import { createLLM } from '@you-want/polyllm-core'
import { openAIPlugin } from '@you-want/polyllm-openai'
import { deepSeekPlugin } from '@you-want/polyllm-deepseek'

const llm = createLLM({
  plugins: [openAIPlugin, deepSeekPlugin],
  providers: {
    openai: { apiKeyEnv: 'OPENAI_API_KEY' },
    deepseek: { apiKeyEnv: 'DEEPSEEK_API_KEY' },
  },
  paramPolicy: 'strict',
})

const response = await llm.chat('deepseek:chat', {
  messages: [{ role: 'user', content: '你好,PolyLLM' }],
})

Local Studio

官网只做引导,密钥留在本机

polyllm.raingpt.top 不提供 API Key 输入表单。真实配置界面由 CLI 在你的电脑上启动, 模型列表探测和连接测试都从本机发出。

  • API Key 只保存在当前浏览器会话中
  • 不写入 polyllm.config.json、日志或生成物
  • 生成配置只引用环境变量名称
  • 关闭标签页后会话缓存自动清空
npx @you-want/polyllm-cli studio --port 5177

Multi-language

TypeScript、Python、Rust,同一份协议

每种语言遵循生态习惯:TS 显式传插件、Python 类型完备、Rust async 客户端 + drop 即取消。行为一致性由共享契约 fixture 裁决。

TypeScript / Node.js

npm 包、显式插件注入、AsyncIterable 流式响应、严格类型。

0.6.0

Python

独立 wheel、py.typed、async API、SSE 流式解析与动态自定义模型。

0.6.0

Rust

7 个 crate、tokio async 客户端、全供应商适配(含 Gemini / Anthropic 原生协议)。

0.1.x · crates.io

Architecture

小核心,稳定协议

核心层不感知供应商细节,所有差异都收敛在插件边界内。

应用代码

使用统一 chat / chatStream API

PolyLLM Core

Registry · Resolver · ModelSpec · ParamPolicy

OpenAI
DeepSeek
Anthropic
Gemini
Ollama
OpenAI-compatible

Security

默认不把密钥带进代码

环境变量引用

生成物使用 apiKeyEnv / api_key_env,业务代码不持有明文密钥。

本机探测

Studio 的模型列表和连通性测试通过 localhost 服务代理,不经过官网服务器。

可审计边界

官网没有输入框收集 Key;CLI 与插件源码开源,便于审查网络请求。