@adia-ai/llm
提供者不可知的LLM客户端. 3个适配器(人体活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性活性
单曲后面 chat() + 键 streamChat() 外相为相. 在浏览器和节点中工作.
安装
npm install @adia-ai/llm
使用量
import { chat, streamChat } from '@adia-ai/llm';
// Direct API call (apiKey owned by the caller)
const reply = await chat({
apiKey: 'sk-...',
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: 'Hello' }],
});
// Streaming
for await (const chunk of streamChat({
apiKey: 'sk-...',
model: 'claude-haiku-4-5-20251001',
messages: [{ role: 'user', content: 'Hello' }],
})) {
if (chunk.type === 'text') process.stdout.write(chunk.text);
}
浏览器 dev-mode 警告( 自 v. 4. 3 起): 若为
createAdapter()解决apiKey在浏览器中运行时,桥会发出一发口罩console.warn(例如:.sk-ant-a…Fiw-),指出密钥会以请求头发送. 当地 def 罚款- 从不部署此形状警告已经解除window.__adia_llm_key_warning_shown(每页装入一个警告). 用于生产、使用 代理模式 (下一节)保留密钥服务器侧.
浏览器代理模式
proxyUrl 通过服务器端代理端的路由,所以 API 密钥永远不会
到达浏览器。 客户端支持 两个代理形状 财务报告和审定财务报表
根据 URL 使用的自动检测 :
智能代理( 提供者中立体)
默认. 发送任意 proxyUrl 和转接不匹配
下方的样式 — 通常为您自己的后端路由, 如 /api/chat编辑
客户端会说单一的提供者中立的协议; 代理持有
API 键并内部发送到右上游适配器.
for await (const chunk of streamChat({
proxyUrl: '/api/chat',
provider: 'openai', // optional — auto-detected from model
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: 'Hello' }],
})) { /* ... */ }
送去代理的遗体:
{
"provider": "openai",
"model": "gpt-4o-mini",
"messages": [{ "role": "user", "content": "Hello" }],
"system": "...optional...",
"maxTokens": 4096,
"temperature": 0.7,
"stream": true
}
每个上游提供者和管道的代理重构 SSE 字节
逐字记录。 参考智能代用程序已启动
packages/llm/core/server.js 在聊天- ii repo( 路由 : POST /api/chat, (中文(简体) ),
加号 /api/generate, (中文(简体) ), /api/generate/reset, (中文(简体) ), /api/convert-html 页:1
a2UI 生成管道。 没错 没有 与 npm 一起运出
软件包 – 它是在repo apps的开发便利.
A 类 thinking: true 请求还接受可选 thinkingBudget
(gh#3517):如果打电话者姓名不详 maxTokens人类的身体
建设者本身的违约增加为预算外加4096个回答符号
头室而不是平原的4096默认,所以默认的4000个托肯
认为预算不是无声无息地被压抑的 以留下任何回答的余地.
明确 maxTokens ;适配器仍然执行
提供方层budget_tokens >= 1024, (中文(简体) ), < max_tokens) (中文(简体) ).
通过代理( 真正的上游正体)
何时 proxyUrl 匹配 /api/llm/<provider>/<rest> (维特-德夫)
使用的形状 chat-ui 应用程序,客户端切换通过
模式。 代理是“ dumb ” —— 它只是将 URL 重写为真实
上游(https://api.<provider>.com/<rest>)和向后字节
不变。 客户发送 真实的上游形状 加减
适配器的普通认证头.
这是自动发现的,你没有明确选择它。 如果挂载 维特代理如:
// vite.config.js
server: {
proxy: {
'/api/llm/anthropic': {
target: 'https://api.anthropic.com',
rewrite: (p) => p.replace(/^\/api\/llm\/anthropic/, ''),
},
},
},
...然后经过 proxyUrl: '/api/llm/anthropic/v1/messages' 将
生成上游直接理解的请求.
| 形状 | URL 模式 | 体质 | 认证信头 | 使用时间 |
|---|---|---|---|---|
| 聪明 | /api/chat (任何东西非通过) | 提供者中性 | 无( 服务器持有密钥) | 您控制代理并想要一条跨供应商的路径 |
| 通过 | /api/llm/<provider>/<rest> | 真实的上游形状 | 适配器本身(如:. x-api-key(中文(简体) ) | 您正在使用 Vite/nginx URL 重写, 并且不希望服务器端发送 |
探测生命 adapters/index.js - 登记表
/\/api\/llm\/[a-z]+(\/|$)/。 。 。 .
生产部署
也没有 server.js (智能代理引用)或任何 Vite/nginx URL
重写( 通过引用) 由 npm 包运出 —— 两者
是开发时间的便利 用于在repo应用程序。 生产
消费者必须 部署自己的代理: 持有
您的提供者 API 密钥以及其中之一 :
- 说到智能代理合同 ——接受提供者中性
(b) 上文所记载的机构,以及按提供方发出的通知。 见
packages/llm/core/server.js执行参考文件(Express +)chat编号 :streamChat从这个包,~150 LOC). - 说通过合同 ——曝光
/api/llm/<provider>/<rest>向https://api.<provider>.com/<rest>用真实的 API- key 头 注入服务器侧 。 见上文Vite 配置片段 形状; 50 行 nginx 或 Express 代理操作精细.
无论哪一份合同都可行——客户自动发现,由你的代理 按 URL 形状执行。 选一个符合你已有的 基础设施.
平台本地网关(不需要代理代码)
如果您的 VM 运行在一个管理下的平台上, 提供 LLM 网关
土生土长(例如:. exe.dev (英语) 时间 http://169.254.169.254/gateway/llm/<provider>/<rest>
包括订阅的每份越野产品),最清洁的生产
跳过上面和刚刚的合同 倒数代号 /api/llm/*
通过Caddy/nginx直接到达平台终点无 API 密钥
在应用配置中,没有手卷代理代码,没有每个周期维护——
该平台处理认证、计费、模型选择.
AdiaUI回波显示了这种模式. infra/caddy/llm-gateway.snippet
为exe.dev VMs. §188 (v0.5.5) 保存一个空投的 Caddy文件片段
弧形删除了 ~ 155 LOC 手卷路由 server.js 内
支持这种方式。 见 .claude/docs/specs/exe-dev-platform-reference.md
.claude/docs/guides/production-llm-proxy-deployment.md全文 食谱(建筑迁移弧生活在git历史中,大约为v0.5.5.
0b阶段侦察清单:在手卷一个代理前,检查是否
您的平台提供了一个本地的平台。 寻找 LLM Gateway 编号 : AI 编号 :
Inference 在平台的文档。 其他类似平台
网关: Cloudflare AI网关, AWS Bedrock 代理, Azure OpenAI
私人终点 匹配形状; 检查定价; 偏好平台本地化
手卷起来,如果有的话.
子路径导出
| 子路径 | 目的 |
|---|---|
@adia-ai/llm | 默认 : chat, (中文(简体) ), streamChat, (中文(简体) ), createClient |
@adia-ai/llm/bridge | createAdapter ——将外观包裹在A2UI管道的适配器接口中 |
@adia-ai/llm/stub | StubLLMAdapter 确定测试适配器 |
@adia-ai/llm/adapters/anthropic | 直接适配对象 |
@adia-ai/llm/adapters/openai | 直接适配对象 |
@adia-ai/llm/adapters/gemini | 直接适配对象 |