A unified LLM protocol middleware converting between OpenAI, Anthropic, Gemini and other provider formats via the Lucent IR neutral protocol
///|
let prism = Prism::new().with_provider("openai")
///|
let req_json = prism.encode_request("你好", PrismOptions::default())
// → {"model":"gpt-4o","input":[{"type":"message","role":"user","content":[...]}]}
///|
let reply = prism.decode_response(resp_json) // Ok("你好!有什么可以帮你的?")///|
let prism = Prism::new().with_provider("anthropic") // 自动适配 Claude 格式
// → {"model":"claude-sonnet-4","messages":[...]}///|
let prism = Prism::new().with_provider("openai-chat")
// send 是 Host 注入的 HTTP 回调
///|
let result = prism.complete("你好", PrismOptions::default(), send)
// result = Ok("你好!有什么可以帮你的?")从概念到代码:四层递进,每个包只有单一职责。
Provider A ──┐
Provider B ──┤── Lucent IR ──→ 任意目标协议
Provider C ──┘ (O(N) 替代 O(N²))| 方向 | 解码(外部 → Lucent IR) | 编码(Lucent IR → 外部) |
|---|---|---|
| 请求 | ext_to_lux_request(String) → Result[LucentRequest, String] | lux_request_to_ext(LucentRequest) → Result[String, String] |
| 响应 | ext_to_lux_response(String) → Result[LucentResponse, String] | lux_response_to_ext(LucentResponse) → Result[String, String] |
| 流式 | ext_sse_to_events(String) → Result[Array[LucentStreamEvent], String] | lux_events_to_ext_sse(Array[LucentStreamEvent]) → Result[String, String] |
| 适配器 | 协议 | 状态 |
|---|---|---|
| provider/openai_chat | OpenAI Chat Completions | ✅ |
| provider/openai_responses | OpenAI Responses API | ✅ |
| provider/openai_codex | OpenAI Codex 变体 | ✅ |
| provider/openai_azure | Azure OpenAI | ✅ |
| provider/openai_vllm | vLLM | ✅ |
| provider/anthropic | Anthropic Messages API | ✅ |
| provider/gemini | Google Gemini API | ✅ |
| provider/gemini_vertex | Google Vertex AI | ✅ |
| provider/gemini_interactions | Gemini Interactions | ✅ |
| 层级 | 包路径 | 职责 | 依赖 |
|---|---|---|---|
| L0 | lux/ | Lucent IR 核心类型 + JSON 序列化 | 仅 core/json |
| L1 | provider/*/ | 厂商双向编解码适配器 | 仅 lux/ |
| L2 | sdk/ | Provider 注册表 + Prism / Context / Event | 所有 provider |
| L3 | wasm/ | 通用 WASM 导出层 | 仅 sdk/ + lux/ |
Prism::encode_request("你好", opts)
→ Context::new().add_user("你好")
→ context_to_lux_request() # L0: 构建 LucentRequest
→ match_provider_name("openai") # L2: SDK 注册表调度
→ reg.request_encode(req) # L1: openai_chat 适配器
→ OpenAI JSON 字符串 → Host 发 HTTP ┌──────────────┐
Provider JSON ──► │ Lucent IR │ ──► Provider JSON
(decode ←) │ (中立格式) │ (→ encode)
└──────────────┘
↕
SDK 注册表调度
↕
WASM 通用导出层优化前: 根包 + sdk + wasm 各独立 import 7 个 provider → 3 处修改
优化后: 只需在 sdk/ 注册 1 处 → wasm 和根包零感知///|
let prism = Prism::new().with_provider("openai")
///|
let req = prism.encode_request("写一首诗", PrismOptions::default())
///|
let reply = prism.decode_response(resp_json)let ctx = Context::new()
.add_system("你是一个有用的助手")
.add_user("帮我查北京的天气")
.add_tools([SdkTool { name: "get_weather", ... }])
match prism.decode_sse(sse_text) {
Ok(events) => {
for event in events {
match event {
TextDelta(s) => ui.append(s) // 流式文本
ToolCall(tc) => execute_tool(tc) // 工具调用
Thinking(t) => ui.show_thinking(t) // 推理过程
Finish(r) => break // 结束
}
}
}
}| 模块 | 状态 |
|---|---|
| Lucent IR 核心类型 (34+ 类型) | ✅ |
| JSON 序列化 / 反序列化 | ✅ |
| 流式事件 + 累加器 | ✅ |
| 9 个 Provider 适配器(各 6 函数) | ✅ |
| 跨协议往返一致性测试 | ✅ |
| SDK 表层 API(Prism / Context / Event) | ✅ |
| WASM 导出层(15 个导出函数,见 scripts/export_count.sh) | ✅ |
| MoonBit 测试 | ✅ 807 passed |
| 多语言 wrapper(Go/TS) | ✅ 可用(classic wasm ABI) |
| Transport Daemon(HTTP JSON-RPC + SSE 流式) | ✅(Go,wazero backend) |
| Transport Daemon(UDS/NamedPipe/WebSocket + session 流式) | ✅ |
| 客户端 SDK(clients/go、clients/python,传输可插拔) | ✅(HTTP/UDS/WS 一行切换) |
| 质量门禁 | ✅ 警告 506→0(CI --deny-warn)、导出数生成式维护(scripts/export_count.sh) |
| SDK 验证(T01-T12) | ✅ 全部完成 |
| 运行示例(src/examples/sdk-basic) | ✅ 可运行 |
| WASM 真实 API 测试 | ✅ 通过 |
# MoonBit SDK 示例
moon run src/examples/sdk-basic
# TypeScript WASM 示例(真实 API),详见 examples/README.md
cd examples/ts-wasm && bun run src/main.tsmoon run src/examples/sdk-basicA unified LLM protocol middleware converting between OpenAI, Anthropic, Gemini and other provider formats via the Lucent IR neutral protocol