模型
雷恩的仓库里每个模特都有一扇门。一个 Model 采用文本,图像,视频,音频和PDF格式
部分。它会用文本、代币、美元和为什么停止来回答。 ask 解析一个选项的答案
当答案不合适时,再问一遍。
规则:调用模型的代码通过这个包调用它。一个新的供应商,一个新的零件种类或者
新的价格在这里,从来没有在打电话的人。没有警卫强制这样做;这份文件和雷恩的
designs/2026-10-26-research-engine.md 记录它。
| 进口 | 做 | 运行在 |
|---|---|---|
@wrenautomation/models | Model, Part, Usage; anthropic, gemini, cohere, compatible (Groq, OpenRouter, Mistral, Cerebras, OpenAI), gateway; rotating 关键的戒指, fallback 模型秩序, geminiLiveKeys, geminiFile (文件API上传); fakeModel, scriptedModel; 的错误 | 节点,工人 |
@wrenautomation/models/hear | 语音对文本: groqEar, cohereEar, compatibleEar (任何 /audio/transcriptions 服务器); fakeEar | 节点,工人 |
@wrenautomation/models/prices | 一个价格表: MODEL_PRICES, SPEECH_PRICES, priceUsd, priced, speechUsd, addUsage, pricesText | 节点,工人 |
@wrenautomation/models/command | shell命令作为模型(commandModel),有关订阅的克劳德守则(claudeCode) | 节点 |
@wrenautomation/models/spec | 来自设置字符串的模型: modelFromSpec("anthropic:sonnet", env) | 节点 |
@wrenautomation/models/judge | 评委:打印问题(noul 是或不是, choice, score)回答每个标签的概率,没有文本; jevJudge (类型安全的Jev, TYPESAFE_API_KEY; Laya与 TYPESAFE_BASE_URL), judgeFromSpec("jev", env), fakeJudge, judgeFailure, top。一个暗示或路由器,绝不是最后决定 | 节点,工人 |
使用
import { anthropic, fallback, gemini } from "@wrenautomation/models";
import { z } from "zod";
const claude = anthropic({ key: [key1, key2], model: "sonnet" });
const { value, usage } = await claude.ask("Name three colours.", z.object({ colours: z.array(z.string()) }));
// usage: { input, output, cacheRead?, cacheWrite?, usd }
const eyes = gemini({ key: geminiKeys });
const reply = await eyes.complete({
prompt: [
{ type: "text", text: "What is on this slide?" },
{ type: "image", data: pngBytes, mediaType: "image/png" },
],
effort: "low",
});
// A stretch of a YouTube video, sampled at one frame per 2 s, at low resolution.
const clip = await eyes.complete({
prompt: [
{ type: "video", data: new URL(youtubeUrl), mediaType: "video/mp4", clip: { startS: 60, endS: 90, fps: 0.5 } },
{ type: "text", text: "What is said and shown?" },
],
resolution: "low",
});
// Newest model first; each call starts at the top and moves down past a busy or refused one.
const reader = fallback([gemini({ key, model: "gemini-3.8-flash" }), gemini({ key })], { passes: 4 });
Gemini在generateContent上读了一段剪辑视频: withClips 添加了 videoMetadata 输入SDK
不发送。Interactions API也会读取一段时间,但在自由键上,它的闪存配额被消耗掉了
立即(见2026-10-27;flash-lite回答)。
如果文件太大,无法以内联方式发送,将使用 geminiFile。它在一个键的项目中,所以
读它的 part 戴着双子座的模特 file.key 独自一人,然后 file.drop().
规范字符串: fake, claude-code[:model], anthropic[:haiku|sonnet|opus|id], gateway[:alias],
gemini[:id], cohere[:id], groq|openrouter|mistral|cerebras|openai[:id], command:<shell command>.
钥匙来自 <VENDOR>_API_KEY,或者戒指 NUM_<VENDOR> + <VENDOR>_API_KEY_1..n.
错误
每个错误都说明调用者下一步要做什么。每张支票(isTransient, isCut)也匹配by
名称,以便保存此包的两个副本的主机仍然对它们进行排序。
| 错误 | 当 | 下一个 |
|---|---|---|
Transient | 408,429,5xx,连接断开,超时 | 等待 retryAfter再试一次 |
Refused | 401, 402, 403 | 钥匙圈移动到下一个键 |
InputRejected | 400, 413, 422 | 更改请求 |
Unsupported | 部分类型的模型不采取 | 选择另一个模型;零件从不掉落 |
Cut | 输出帽停止了应答 | partial 保存文本到目前为止, usage 其成本 |
Filtered | 卖主自己停止了回答(双子座的) RECITATION, SAFETY(运行失败) | stop 说的;换句话说 |
NoAnswer | ask 修复后没有发现形状相同的物体 | issues 说为什么 |
钥匙圈会立即跳过拒绝键或忙键,并在以后的呼叫中跳过拒绝键。当每个键都忙时,它等待2秒
翻倍到30秒 passes 通过(默认1)。SDK内的重试关闭。错误永远不会携带钥匙:一个附和它的供应商(双子座)
在一个悬着的钥匙上,它被熄灭了吗 [key].
价格
美元/百万代币,截至 PRICES_AS_OF。呼叫自由钥匙圈(Cohere, Gemini, Groq,
OpenRouter :free,门户。 free,克劳德代码的订阅)记录 usd: 0,
free: true, listUsd (这要花多少钱)。人为缓存写入是1.25倍的输入
(5分钟)或2x(1小时);读取是0.1倍(Opus 5.5为0.05倍)。俳句5.5分为两层
提示超过10万代币的价格为5倍。Jev只需要输入:它的答案是免费的。一个没有
Row保留它的令牌并且没有 usd.
来源:Anthropic的定价页面;从activepieces.com和pricepertoken.com凝聚;Groq从 groq.com/pricing;来自anotherwrapper.com和benchlm.ai的Gemini;来自typesafe的Jev。
为什么要使用AI SDK
适配器位于 AI SDK 7 (Apache 2.0):一个调用人形Anthropic,
谷歌,Cohere和每个openai兼容的服务器,每个供应商的媒体部件和令牌细节。
其他选择是每个供应商自己的SDK(四种调用形式和四种使用格式)和
平原 fetch (每条线格式手工保存)。此包只添加SDK遗漏的内容:
错误按下一步要做的事情、钥匙圈、价格、带修复的解析和语音进行排序。
开发
pnpm install
pnpm lint && pnpm typecheck && pnpm test
一、 v* 标签向NPM发布(.github/workflows/release.yml可信发布:不存储令牌)。
许可证:PolyForm Strict 1.0.0 (LICENSE.md)。