@ agentskit/ 适应器
简介 : major-package
连接到任何LLM提供者——并在它们之间互换——而不触碰你的应用代码.
标记 : ai • 妇女 agents • 妇女 llm • 妇女 agentskit • 妇女 openai • 妇女 anthropic • 妇女 claude • 妇女 gemini • 妇女 chatgpt • 妇女 ollama • 妇女 embeddings • 妇女 providers
已核实的证据
- 软件包元数据和测试在
packages/adapters/。 。 。 . - 软件包指南 : https://www.agentskit.io/docs/参考文献/packages/adapters
- 稳定地图: 文件/服务.md
如何适应生态系统
@agentskit/适应器是提供者层:互换OpenAI,Anthropic,双子座,Ollama,本地模型,以及嵌入提供者而不重写您的代理.
- 探员Kit:与本回购中的其他包一起作曲,从可互换的小零件来构建代理.
- 书记官处: 查找已使用此图层的即时代理和模板 登记. agentskit.io。 。 。 .
- 游戏本: 学习本层背后的生产模式 游戏本. agentskit.io。 。 。 .
为什么适配器
- 供应商独立性 – 通过更改一行从 OpenAI 切换到 Anthropic 到本地 Ollama 模式; 您的钩子、 运行时间和工具保持不变
- 目录中25个本地适配器 – Anthropic, OpenAI, 双子座, Ollama, DeepSeek, Grok, Kimi, Mistral, Cohere, College, Groq, Fireworks, OpenRouter, Hugging Face, LM Studio, vLLM, lama.cpp, LangChain, Vercel AI SDK 以及其他兼容供应商
- 内嵌函数 – 相同的适配器模式覆盖了文本嵌入, 这样您就可以再利用提供者配置用于聊天和RAG
- 本地单行AI —— 说
ollama({ model: 'llama3.1' })没有 API 密钥的全线下线代理 - CLI 支持的代理人 —— 说
@agentskit/adapters/cli规范文本、JSON和基于非加太语的当地LLM cLI - 朗彩桥 —— 说
@agentskit/adapters/langchain-bridge将任何适配器转换为 LangChainBaseChatModel页:1createAgent
门户和多式联运
openaiCompatible({ model, baseUrl, path, headers, fetch }) 支持自定义
与 OpenAI 兼容的终点; apiKey 是可选的,而且信头会覆盖默认值.
openRouter 别名 openrouter· ; cloudflareAiGateway 财务报告和审定财务报表 workersAi 供应
Cloudflare REST URL 没有运行时间绑定. 提供了目录 URL 变量
明确通过 env,包括: CLOUDFLARE_ACCOUNT_ID。 。 。 .
兼容OpenAI、Anthropic、双子座/Vertex和Ollama序列器读取
message.parts. 不支持的来源/模式 CapabilityUnsupportedError
与 code: CAPABILITY_UNSUPPORTED 当启用多模式输入时。 模型
没有多式联运能力,则返回文本部分和短附件标记,
省略二进制数据与数据 URL, 并记录每个请求最多一个警告 .
OpenAI和Anthropic助手二进制部分也使用此文本倒置.
明确 capabilities.multiModal 优于模型名称的热力学
(GPT-4/5, o-series, vision, 双子座和克洛德3+名, 包括提供者前缀).
为能力不同的定制模型或供应商明确规定.
见 测试模式矩阵 财务报告和审定财务报表
配置指南。 。 。 .
这些都是本地的有线格式测试;现场提供者的验收仍未核实.
安装
npm install @agentskit/adapters
以下运行时间示例也需要 @agentskit/runtime。RAG 实例
需求 @agentskit/rag, (中文(简体) ), @agentskit/memory选择 vectra
端点( e)npm install @agentskit/rag @agentskit/memory vectra) (中文(简体) ).
快速实例
import { anthropic } from '@agentskit/adapters'
import { createRuntime } from '@agentskit/runtime'
// Switch provider by swapping one import
const adapter = anthropic({ apiKey: process.env.ANTHROPIC_API_KEY, model: 'claude-sonnet-4-6' })
// const adapter = openai({ apiKey: process.env.OPENAI_API_KEY, model: 'gpt-4o' })
// const adapter = ollama({ model: 'llama3.1' })
const runtime = createRuntime({ adapter })
const result = await runtime.run('Summarize the latest AI news')
console.log(result.content)
嵌入(用于RAG)
对向量嵌入使用相同的包- 有线 openaiEmbedder, (中文(简体) ), geminiEmbedder,或 ollamaEmbedder 输入 @agentskit/rag数字 :
import { openaiEmbedder } from '@agentskit/adapters'
import { createRAG } from '@agentskit/rag'
import { fileVectorMemory } from '@agentskit/memory'
const rag = createRAG({
embed: openaiEmbedder({ apiKey: process.env.OPENAI_API_KEY! }),
store: fileVectorMemory({ path: './vectors' }),
})
特征
- 提供商:Anthropic,OpenAI,双子座,Ollama,DeepSeek,Grok,Kimi,Mistral,Cohere,同心,Groq,Fireworks,OpenRouter,Hugging Face,LM Studio,vLLLM,llama.cpp,LangChain,LangGraph,Vercel AI SDK,通用
ReadableStream - 嵌入器 :
openaiEmbedder, (中文(简体) ),geminiEmbedder, (中文(简体) ),ollamaEmbedder, (中文(简体) ),deepseekEmbedder, (中文(简体) ),grokEmbedder, (中文(简体) ),kimiEmbedder, (中文(简体) ),createOpenAICompatibleEmbedder - 获取备份适配器运行于共享
Adapter合同v1套套件(ADR 0001);SDK后置适配器有针对供应商的合同和复原力覆盖面 - 自定义适配器作者通过
createAdapter() - 高序适配器:
createRouter(费用/相关性/分类),createEnsembleAdapter(退出+合并),createFallbackAdapter(下个指令)
CLI 支持的适配器
只有节点 @agentskit/adapters/cli 子路径运行一个明确选中的
无外壳的 LLM 可执行文件 :
import { createCliAdapter, getCliProviderManifest, resolveCliManifest } from '@agentskit/adapters/cli'
const manifest = getCliProviderManifest('codex')
if (!manifest) throw new Error('provider manifest is unavailable')
const adapter = createCliAdapter(resolveCliManifest(manifest, { mode: 'review-safe' }))
一般工厂是 createCliAdapter (单位:千美元)exec-text, (中文(简体) ),
createJsonCliAdapter (单位:千美元)exec-json),以及 createAcpCliAdapter (ACP v1 超过)
JSON线). 内置清单包括了Codex、Claude代码(文本和JSON)
输出),Grok CLI,和OpenCode. resolveCliManifest 保持命令、 argv、 协议、 提供者 id,以及
模式明确; diagnoseCliProviderManifest 核实可用性
可选版本模式. review-safe 是默认值: 没有 shell, 自动
安装、本地登录、MCP、插件或终端工具。 使用
trusted-local 当开发商有意想要CLI本地化时
认证与环境. requiredCapabilities 检查之前
产卵,以及 onDiagnostic 接收已编辑的退出、超时、中止和
输出限制数据。 结构化输出失败关闭; 超时、 中止、 输出
限制,而非零出站则产生终端适配器出错. 流程终止
等待适配器完成,包括输入或输出失败时.
restricted-environment 是一个明确的环境允许列表模式;不是
oS、文件系统、进程或网络沙盒。 使用 @agentskit/sandbox 当 a
需要真正的隔离边界.
exec-text 对 exec-json: 每个协议可以返回的内容
协议决定哪个流块可以生成一个表单 。 选一个 以你需要的东西来显示,而不是用CLI的名称:
| 议定书 | 工厂 | 弹出 | 不详 |
|---|---|---|---|
exec-text | createCliAdapter | text (流出), done | structuredOutput, (中文(简体) ), reasoning, (中文(简体) ), tool_call, 使用量 |
exec-json | createJsonCliAdapter | text, (中文(简体) ), reasoning, (中文(简体) ), tool_call, (中文(简体) ), usage, (中文(简体) ), done | 流程(每个流程一个响应) |
acp | createAcpCliAdapter | text, (中文(简体) ), reasoning (流出), done | 工具调用( 已拒绝)、 MCP、 插件、 终端 |
validateCliProviderManifest 拒绝一份声称拥有
协议无法交付,以及 requiredCapabilities 产卵前失败
同样的原因 实践中: claude-code 财务报告和审定财务报表 codex 清单为
exec-text 并且只提供纯文本。 用于工具调用、使用或
claude 代码使用中的结构化输出 claude-code-json 换句话说.
该表在编译时执行. CliProviderManifest 工会
歧视 protocol, (中文(简体) ), capabilities 输入为
CliCapabilitiesFor<protocol>,以及 getCliProviderManifest('claude-code')
返回时 CliProviderManifestFor<'exec-text'>,因此此选项不进行打字检查 :
const manifest = getCliProviderManifest('claude-code')!
resolveCliManifest(manifest, { requiredCapabilities: { tools: true } })
// ^^^^^ not assignable: exec-text has no tools/structuredOutput
克劳德代码
有两个第一人名单 claude 可执行文件 :
claude-code—— 说claude -p, (中文(简体) ),exec-text。将最后的答案流为文本.claude-code-json—— 说claude -p --output-format json, (中文(简体) ),exec-json参数 输入结果信封text, (中文(简体) ),tool_call,以及usage块与session_id, (中文(简体) ),total_cost_usd, (中文(简体) ),duration_ms,以及num_turns作为元数据.is_error或无success子类型未关闭 .
import { createJsonCliAdapter, getCliProviderManifest, resolveCliManifest } from '@agentskit/adapters/cli'
const manifest = getCliProviderManifest('claude-code-json')
if (!manifest) throw new Error('provider manifest is unavailable')
const adapter = createJsonCliAdapter(resolveCliManifest(manifest, { mode: 'trusted-local' }))
请求提出时 context.tools,工具列表和一个
{ text?, toolCalls } 答复合同附于克洛德密码系统
快速通过 --append-system-prompt· ; claude-code-json 承认对象
(栅栏或赤裸地) result 字符串和发送 tool_call 块. 流言蜚语的结果不变 text。 。 。 .
structured_output 从 --json-schema 同样的荣耀 工具
执行本身仍然是消费者的责任:适配器永远不会
启用 Claude Code 自己的工具, MCP, 或插件 .
即时序列化
createCliAdapter 财务报告和审定财务报表 createJsonCliAdapter 默认写入原始
AdapterRequest 作为JSON在stdin上的一行。 这个合同是正确的
目的创建的 CLI, 但代理化的 CLI 读取 stdin 是一个用户提示, 而 Claude
代码拒绝一个包含 systemPrompt 作为明显的
即时注射尝试。 因此,第一当事方名单使用两个
导出序列器 :
-
serializeCliPrompt(使用时间:codex)写有标签的块:[system] You are a reviewer. [user] review this -
serializeCliMessages加号claudeCodeRequestArgs(使用时间:claude-code财务报告和审定财务报表claude-code-json) 只将对话写入 stdin( 一个单一用户) 电文是写光的),通过系统即时和工具合同 结束--append-system-prompt校对:Soup 用户内部的相同指示, 即使标签[system]标记为注射尝试,而通过系统 标出请求context.tools回来像一个tool_call块.
名单可以声明 serializeRequest, (中文(简体) ), requestArgs (因请求而异)
argv, 后附 args, (中文(简体) ), parseOutput,以及 parse· ; resolveCliManifest
把他们送到工厂. buildCliSystemPrompt(request) 返回时
其他带有系统即时旗的CLI的系统即时加工具合同.
使用 buildArgs(request) 仅针对在 argv 中需要提示的 CLI; 是
并且仍然使用直接无壳产卵。 设定
serializeRequest: () => '' 当提供者不消耗Stdin。 对于
JSONL或事件包装输出, parseOutput(stdout) 能够解码原始 stdout
在正常时间之前 parse(value) 调用运行.
对于为文件写最后回复的CLI, outputFile 读取文件
在进程完成后,以相同的字节限制并中止处理.
LangChain桥:使用任何适配器作为LangChain聊天模式
langchain() 财务报告和审定财务报表 langgraph() 揭发一个LangChain可诉
AdapterFactory编辑 @agentskit/adapters/langchain-bridge 子路径去
其它方式: adapterToLangChainModel(adapter) 覆盖任意 AdapterFactory
(mock, Ollama,一个CLI后卫的适配器,.)作为一个真实的 BaseChatModel,这样它就可以
替换 ChatAnthropic编号 :ChatOpenAI 内 createAgent, (中文(简体) ), AgentNode,或平原
链条。 这需要 @langchain/core (可选的同伴依赖性).
import { createAgent } from 'langchain'
import { tool } from '@langchain/core/tools'
import { mockAdapter } from '@agentskit/adapters'
import { adapterToLangChainModel } from '@agentskit/adapters/langchain-bridge'
const add = tool(async ({ a, b }) => String(a + b), {
name: 'add',
description: 'Add two numbers',
schema: { type: 'object', properties: { a: { type: 'number' }, b: { type: 'number' } }, required: ['a', 'b'] },
})
const model = adapterToLangChainModel(mockAdapter({ response: [/* ... */] }), { modelName: 'mock' })
const agent = createAgent({ model, tools: [add] })
bindTools()转发 LangChain 工具( 结构化工具, OpenAI 格式) 定义、可运行的工具)作为 AgentsKitToolDefinition开始context.tools· ;tool_choice土地在context.metadata.toolChoice。 。 。 .- 系统消息成为两个
system信息、信息和context.systemPrompt· ; AI 信件保留tool_calls; 保存工具消息tool_call_id。 。 。 . tool_call块变成AIMessage.tool_calls(args分析 从JSON),usage块变成usage_metadata, (中文(简体) ),reasoning块块 :additional_kwargs.reasoning, (中文(简体) ),error块掷出,和.stream()产量AIMessageChunk编号与tool_call_chunks。 。 。 .- 每个反应都是真实的
AIMessage编号 :AIMessageChunk比如说wrapModelCall中间软件和responseFormat携手合作。 默认profile报告toolCalling并且没有本地人structuredOutput这样createAgent使用工具策略,任何工具调用适配器都可以使用 满足。 过profile: { structuredOutput: true }仅用于适配器 尊重JSON提供方的计划.
连续担保
- 流终止一次
done或者说error; 终端错误带有Error内metadata.error。 。 。 . - 获取重试使用
@agentskit/net备份和Retry-After解析fetchWithRetry和适配器retry选项保留3尝试默认值.readSSELines仍为已贬值的相容性包装; 新解析器应消耗parseSSE活动直接. - SSE 事件数据保存白空并加入多个
data:带有新行的字段。 NDJSON读取器冲出最后的UTF-8块并接受最后一个没有新行的记录. - 在其本土完成标记前关闭的提供商溪被作为短道速滑处理,不成功.
abort(reason)向活动获取读取器和 SDK 请求并用相同的错误语义终止 .- 本地工具历史保存调用/结果关联 。 必要时将并行工具结果编码为单一提供者转弯.
- 当协议支持时, 身份证书会留在提供者头; 双子座 API 密钥永远不会被放置在请求的 URL 中.
vercelAI消耗 Vercel AI SDK UI 消息流 v1 协议,包括其所需的响应头和[DONE]标记.
高序适配器
import { createRouter, anthropic, openai } from '@agentskit/adapters'
// Auto-pick cheapest capable candidate per request.
const router = createRouter({
candidates: [
{ id: 'haiku', adapter: anthropic({ model: 'claude-haiku-4-5' }), cost: 0.25 },
{ id: 'sonnet', adapter: anthropic({ model: 'claude-sonnet-4-6' }), cost: 3 },
{ id: 'gpt-mini', adapter: openai({ model: 'gpt-4o-mini' }), cost: 0.15 },
],
})
见 适配器路由器, (中文(简体) ), 组合,以及 后退链。 。 。 .
生态系统
| 软件包 | 作用 |
|---|---|
| @ agentskit/ 核心 | Adapter, (中文(简体) ), EmbedFn,类型 |
| @ agentskit/ 运行时间 | 无头 createRuntime |
| @ agentskit/ 擦伤 | createRAG + 嵌入器 |
| @ agentskit/ 记忆 | 矢量 + 聊天内存后端 |
测试适配器
三个内置的公用设备 让你测试特工 却没碰到真正的LLM.
mockAdapter - 决定性对策
import { mockAdapter } from '@agentskit/adapters'
const adapter = mockAdapter({
response: [
{ type: 'text', content: 'Hello!' },
{ type: 'done' },
],
})
传递一个函数来使响应请求意识,或者通过数组以返回每个调用上的不同块(顺序模式). 使用可选 history 数组,可以捕捉每个断言请求.
recordingAdapter + 键 inMemorySink - 抓住真正的电话
import { recordingAdapter, inMemorySink, anthropic } from '@agentskit/adapters'
const sink = inMemorySink()
const adapter = recordingAdapter(
anthropic({ apiKey: process.env.ANTHROPIC_API_KEY!, model: 'claude-sonnet-4-6' }),
sink,
)
// Runs the real LLM and captures every chunk to sink.fixture
replayAdapter ——重放被捕获的固定装置
import { replayAdapter } from '@agentskit/adapters'
import fixture from './fixture.json'
const adapter = replayAdapter(fixture) // no network calls
典型的工作流程:记录一次 dev → 承诺 JSON 固定 → 在 CI 中重放.
贡献者
许可证
麻省理工学院——见 自由主义。 。 。 .
文档
成熟性和相容性
- 稳定性: β 语录 看到了吗 文件/服务.md
- 为了将来的冻结,执行被硬化了,但促销仍然需要90天的β窗口,两条被放出的小线,被接受的包裹RFC,以及ADR 0024所要求的寄存证据.
- 节点.js 20+ 财务报告和审定财务报表 类型脚本 严格模式
- 发表于
@agentskit/adapters