@crvouga/mockingbird-service-openai

中文文档
1.11.0发布于 2026/11/11MITTypeScriptES Module构建来源已验证近 30 天下载 1.7万

本地的脚本OpenAI模拟器:聊天/工具循环,SSE,嵌入,模型,文件以及没有计费推论的上传.

中文使用文档
文档目录7 节
  1. 安装
  2. 使用量
  3. 路线和坚持行为
  4. 控制、失败和隐私
  5. API 密码
  6. 甲骨文和核查
  7. 故意不模拟

@crvouga/mockingbird-service-openai (英语)

本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .

A 类 阴道,可移植,完全本地 OpenAI 模拟器用于聊天补全,函数工具循环, 聊天SSE流,嵌入,模型,文件并进行上传. 未修改过的验证 开源软件国际化之简体中文组, (中文(简体) ), @ai-sdk/openai 4.0.83 (英语) 财务报告和审定财务报表 (一) 7.0.127 (中文(简体) ) 过节点HTTP. 它不进行推断,也不要求供应商账户或开具API密钥.

安装

bun add @crvouga/mockingbird-service-openai

使用量

这些例子使用官方 [email protected] SDK(英语:SDK).

import OpenAI from "openai"
import { createRuntime, DEFAULT_TOKEN } from "@crvouga/mockingbird-service-openai"

// Test setup: the emulator, scripted with the reply the test expects.
const emulator = createRuntime({
  scripts: [{
    kind: "chat",
    message: { role: "assistant", content: "Fixture answer" },
    usage: { prompt_tokens: 12, completion_tokens: 3, cached_tokens: 8 },
  }],
})

// The app's own OpenAI client. Only its fetch changes: requests reach the
// emulator in this process instead of api.openai.com.
const openai = new OpenAI({
  apiKey: DEFAULT_TOKEN,
  fetch: (url: RequestInfo | URL, init?: RequestInit) => emulator.fetch(new Request(url, init)),
})
const completion = await openai.chat.completions.create({
  model: "fixture-chat",
  messages: [{ role: "user", content: "Fixture question" }],
})
console.log(completion.choices[0]?.message.content) // "Fixture answer"
console.log(completion.usage?.total_tokens) // 15

对于Vercel AI SDK,也安装 @ai-sdk/[email protected] 财务报告和审定财务报表 [email protected],并点 供应商 baseURL 在一个听服务器. 使用明确的 .chat() 提供商:提供商的默认模式使用Resolution API.

import { createOpenAI } from "@ai-sdk/openai"
import { generateText } from "ai"
import { createServer } from "@crvouga/mockingbird-service-openai/server"
import { DEFAULT_TOKEN } from "@crvouga/mockingbird-service-openai"

const server = await createServer({
  scripts: [{ kind: "chat", message: { role: "assistant", content: "Fixture answer" } }],
})
try {
  const provider = createOpenAI({ baseURL: `${server.url}/v1`, apiKey: DEFAULT_TOKEN })
  console.log((await generateText({ model: provider.chat("fixture-chat"), prompt: "Fixture", maxRetries: 0 })).text)
} finally {
  await server.close()
}

openai 还接受 baseURL: server.url + "/v1" 和钉子 apiKey。 。 。 . CLI是: 校对: mockingbird-openai serve --port 8813。 。 。 . createServer() 默认为麻黄口.

路线和坚持行为

终点行为
POST /v1/chat/completions脚本助手 JSON 或 Chat SSE; 工具、 完成原因和精确使用
GET /v1/chat/completions仅存储完成,模型过滤器, after, (中文(简体) ), limit, (中文(简体) ), order
GET 编号 : DELETE /v1/chat/completions/{completion_id}检索/删除a store: true 完成
POST /v1/embeddings精确的脚本向量、字符串或符号输入、浮标/基准64编码和尺寸
GET /v1/models 编号 : GET /v1/models/{model}配置合成模型固定装置
POST 编号 : GET /v1/files多段文件创建; 以目的、 顺序、 后面和限制方式列出元数据
GET 编号 : DELETE /v1/files/{file_id}元数据读取和删除
GET /v1/files/{file_id}/content精确的二进制字节
POST /v1/uploads创建一个未完成的上传, 在一个小时后过期
POST /v1/uploads/{upload_id}/parts多块 data,未公布的待公布部分
POST /v1/uploads/{upload_id}/complete已订购 part_ids; 准确宣布的字节数和可选的 MD5 检查
POST /v1/uploads/{upload_id}/cancel取消待定的上传

DEFAULT_TOKEN 实值 fixture-openai-token· ; tokens: [{ token, models?: string[] }] 配置 合成无记名证书和可选型号访问. 无效/ 丢失的证书返回 401, 403,未知型号/资源 404,畸形请求400 { error: { message, type, param, code } } 财务报告和审定财务报表 x-request-id。默认模式是 fixture-chat 财务报告和审定财务报表 fixture-embedding (三维. models 接受 { id, kind: "chat" | "embedding", dimensions?, created?, owned_by? }. 没有模型名称意味着真正的推论或供应商的可用性.

脚本选择会消耗第一个匹配其类型和可选的未消费脚本 match: { model?, lastRole?, contentIncludes?, toolCallId? }。未匹配的脚本仍然排队. ChatScript 已经 kind: "chat", (中文(简体) ), message: { role: "assistant", content: string | null, tool_calls?, refusal? }选项 finish_reason, (中文(简体) ), usage, (中文(简体) ), chunk_size 财务报告和审定财务报表 stream_delay_ms。 。 。 . 函数调用 { id?, type: "function", function: { name, arguments: string } }· ; 参数必须是有效的 JSON 字符串. 遗失的身份证一次生成,并持续存在。 助理 以工具/反驳方式保留无效内容;a role: "tool" 答复必须提及先前 助理呼叫身份证 完成原因为: stop, (中文(简体) ), tool_calls, (中文(简体) ), length, (中文(简体) ), content_filter。 。 。 . EmbeddingScript 已经 kind: "embedding", (中文(简体) ), vectors: number[][],可选匹配和使用.

准确的用法是 { prompt_tokens, completion_tokens?, cached_tokens? } (非负整数, 缓存时间最多). 聊天答覆包括全部符和 prompt_tokens_details.cached_tokens。 。 。 . 没有脚本, 本地默认为 Fixture response; 嵌入使用决定散列 向量计. 默认符号估计数 UTF-8 字节除以 4, 四舍五入, 最小值 一个 这些缺省是合成政策;供应使用/媒介用于精确的消费者测试. 它们没有大致的语义推论,或声称是等同的.

SSE 发射 chat.completion.chunk JSON 有索引内容/工具参数三角洲, 最终 结束原因,和 [DONE]。 。 。 . stream_options.include_usage: true 添加最后的空选择 使用块; 较早的块带有无效使用. chunk_size 计数 Unicode 字符; stream_delay_ms 延迟为取消测试提供框架。 中止/取消 流并清除其待决的计时器; 开始完成仍然是已创建的资源.

仅 store: true 完成部分可通过供应商阅读。 聊天命令默认为 上升的创作时间。 它的本地页面界限是默认的 20, 最多 100 个 。 文件命令本地默认降级 创建时间,限制/最大为一万;呼叫者可以明确设定订单. 稳定插入顺序换行 创建时的联系. after 是最后一个资源 ID; 所有页面曝光 first_id, (中文(简体) ), last_id, (中文(简体) ), has_more。重复 prompt_cache_key,信头或请求的ID不复制创建: 有文件记载的"查特"合同并不能保证"一能"的突变. 只上传完成 接受等待上传; 完成/取消/过期上传拒绝进一步的突变.

使用多部分机构的文件 purpose 财务报告和审定财务报表 file。所支持的目的有: assistants, (中文(简体) ), batch, (中文(简体) ), fine-tune, (中文(简体) ), vision, (中文(简体) ), user_data; 上传阶段使用前四. 批次文件于 三十日来. 可选 expires_after[anchor]=created_at 财务报告和审定财务报表 expires_after[seconds] 接受 3,600–2,592,000秒(英语: 分阶段上传完成后在调用器部分创建文件 命令,验证字节数/检查和,并永远不公布部分数据. maxFileBytes 默认 至 20 MiB并限制文件/上载/部件; 这不是生产配额.

所有记录都使用 SQLite Collections 和 IdSequence; 生命周期时间戳/过期使用共享 时钟. 每个命名空间接收构建器 scripts, (中文(简体) ), models, (中文(简体) ), files 固定; 重置还原 他们。 文件接受 { id?, filename, purpose, bytes: string | number[], expires_at? }。 。 。 . 使用 x-mockingbird-namespace, (中文(简体) ), /__admin/ns/{namespace}/v1/...,或共享证书登记 为SDKs。 时间线分会/检查点重用共享运行时间并保持状态隔离.

控制、失败和隐私

DEFAULT_ADMIN_KEY 实值 fixture-openai-admin。管理数据路径需要 x-mockingbird-admin-key; 配置一个非空 adminKey 用来替换它。 习惯 adminPrefix 移动所有控件和命名空间路径载体。 共享时钟,错误,重置,日记, 状态、证书、指标和时间线路线仍然可用.

控制权目的
POST /__admin/scripts严格验证和排队一个恰克/嵌入脚本
GET /__admin/scripts身份证、类型和消费状态
POST /__admin/raw-faults明显未加工 { body: string, status?, content_type?, model? }; 允许错误的供应商数据
GET /__admin/request-metadata模型、计数/作用、字节长度、散列和反应/标记标识
POST /__admin/request-assertions{ fingerprints: string[] },比较订购的 SHA-256 请求散列
GET /__admin/stream-metadata打开/ 关闭/ 放弃流状态和块数
GET /__admin/upload-metadata上传元数据

普通脚本拒绝未知字段,在原子上反应形状不正确. 原始错误控制 是唯一的逃生舱门. fingerprint(body) 计算确切的 JSON 序列化 SHA-256 散列 - 财产命令事项。 没有保留任何收到的提示/工具结果 . 脚本、答复、文件/部分字节和原始断层体是用 SQLite 加密的 AES-GCM 私有运行时键和逻辑命名空间绑定 。 一般状态快照显示密码文本和 元数据, 绝不是正文或密钥 。 供应商资源读取解密请求的产出 . 共享请求日记/日志只包含元数据;API密钥从未被登录.

预设起火一次: rate_limited (429,"重试后"和"后"), server_error (500个), service_unavailable (503个), network_reset, (中文(简体) ), invalid_json, (中文(简体) ), malformed_stream, (中文(简体) ), content_refusal, (中文(简体) ), slow_response (发送前50分). 可读错误/ 滴入不消耗脚本 . 报道的原始客户端只重复了网络错误,429和5xx. 官方 OpenAI SDK 另加 408/409 由自己的政策重审;配置 maxRetries 当他们坚持尝试的时候。 运输 latency使用壁时间,而资源寿命周期则使用模拟器时钟.

API 密码

根导出 OpenAIAPI, (中文(简体) ), createRuntime, (中文(简体) ), document, (中文(简体) ), supportedOperationIds, (中文(简体) ), DEFAULT_MODELS, (中文(简体) ), DEFAULT_TOKEN, (中文(简体) ), DEFAULT_ADMIN_KEY, (中文(简体) ), OPENAI_NAMESPACE, (中文(简体) ), OPENAI_PRESETS, (中文(简体) ), fingerprint, (中文(简体) ), validateScript, (中文(简体) ), createVaultKey, (中文(简体) ), vendorError,并导出固定/标记/选项/运行时间类型. API 曝光 fetch, (中文(简体) ), reset, (中文(简体) ), ensureSeeded, (中文(简体) ), queue, (中文(简体) ), queueRaw, (中文(简体) ), seedFile, (中文(简体) ), state, (中文(简体) ), app, (中文(简体) ), sqlite节点 ./server 出口 createServer, (中文(简体) ), DEFAULT_PORT, (中文(简体) ), serveTarget 和服务器类型. 可选 vaultKey 是召客提供的私人关键材料, 从未在状态中坚持.

甲骨文和核查

合同正式签订后 聊天创建, (中文(简体) ), 函数调用, (中文(简体) ), 存储的聊天列表, (中文(简体) ), 嵌入, (中文(简体) ), 模型, (中文(简体) ), 文件, (中文(简体) ), 文件列表, (中文(简体) ), 上传, (中文(简体) ), 完成,以及 错误。 。 。 .

bun test 在节点HTTP上验证未修改的 SDK, 报告的非流工具循环精确 重试计数、SSE/破坏处理、精确字节和舞台原子学、命名空间/重置/时间线, 每个预设程序 每一个启动的JSON操作, 和故意的分歧。 多段/二进制作业已进行验收测试. bun run parity 出口2:存储器政策禁止开出账单推断. 没有现场OpenAI结果 索赔; 正式文件和当地SDK执行是证据.

故意不模拟

反应 API、实时/音频/图像/批量/精细调整 API、内置主机工具、多式联运 内容解释、真实推论/开具、帐单、生产配额、, 生产不透明的ID/cursor编码和无文件的要求ID分解。 这个包 从来没有打电话给OpenAI。 加密的持久性是私有运行时态,而不是生产密钥金库.

版本与发布记录

@crvouga/mockingbird-service-openai 共发布 21 个版本,首次发布于 2026/10/05;过去 12 个月发布了 21 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.11.0latest2026/11/11今天
1.10.82026/11/038 天前
1.10.72026/11/038 天前
1.10.62026/11/038 天前
1.10.52026/11/038 天前
1.10.42026/11/038 天前

关于 @crvouga/mockingbird-service-openai 的常见问题

@crvouga/mockingbird-service-openai 是什么?

本地的脚本OpenAI模拟器:聊天/工具循环,SSE,嵌入,模型,文件以及没有计费推论的上传.

如何安装 @crvouga/mockingbird-service-openai?

在项目目录运行 npm install @crvouga/mockingbird-service-openai,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 mockingbird-openai,可以用 npx mockingbird-openai 直接运行。

@crvouga/mockingbird-service-openai 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@crvouga/mockingbird-service-openai 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@crvouga/mockingbird-service-openai 可以商用吗?

@crvouga/mockingbird-service-openai 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@crvouga/mockingbird-service-openai 的下载量有多少?

根据 npm 官方下载统计,@crvouga/mockingbird-service-openai 在 2026/10/11 – 2026/11/09 这 30 天内被下载 17,314 次,日均约 577 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@crvouga/mockingbird-service-openai 还在维护吗?

最新版本 1.11.0 发布于 2026/11/11(今天);至今共发布 21 个版本,其中过去 12 个月发布了 21 个;首次发布于 2026/10/05。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。