ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI SDK 函数示例开发指南:在 examples/ai-functions 中编写、运行与维护可验证示例

AI SDK 函数示例开发指南:在 examples/ai-functions 中编写、运行与维护可验证示例 AI SDK 函数示例开发指南在 examples/ai-functions 中编写、运行与维护可验证示例【免费下载链接】aiThe AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents项目地址: https://gitcode.com/GitHub_Trending/ai/ai本篇指南以仓库中的开发技能文档 skills/develop-ai-functions-example/SKILL.md 为核心骨架系统讲解如何在 AI SDK 仓库的 examples/ai-functions 目录中开发函数示例包括示例的组织分类、命名规范、标准代码模板、运行方式、共享工具函数与可复用工具定义。读完本文你将掌握为该仓库新增 Provider、实现新特性、复现 Bug 时编写可运行示例的完整方法论并能直接上手在examples/ai-functions中创建、运行自己的示例脚本。示例库定位为什么需要一个专门的示例目录examples/ai-functions/是 AI SDK 仓库中专用于验证、测试和迭代 AI SDK 函数的脚本集合。它的核心价值在于让开发者以最小成本跨 Provider 快速验证generateText、streamText、generateObject等核心函数的可用性与行为差异同时为端到端集成测试提供脚本形式的等价用例。从 examples/ai-functions/README.md 可以看出该目录同时承担两类角色基本示例脚本按src/function/provider/xxx.ts组织的可独立运行脚本直接以pnpm tsx src/path/to/example.ts执行端到端 Provider 集成测试位于src/e2e下的 vitest 测试套件不纳入 CI 流水线仅供开发者手动冒烟测试 Provider 对常见特性的支持情况。绝大多数 e2e 测试用例在src对应子目录中都有等价的脚本形式。该示例包的依赖集中在 examples/ai-functions/package.jsonai与全部ai-sdk/*Provider 包均以workspace:*方式引用本地源码因此对 SDK 的修改可以立即在示例中验证。示例分类体系按 AI SDK 函数组织目录示例在examples/ai-functions/src/下按 AI SDK 函数维度组织每个函数对应一个顶层目录。以下为规范文档定义的核心分类经核对仓库实际目录与此完全一致并在此基础上扩展了更多能力目录用途generate-text/使用generateText()的非流式文本生成stream-text/使用streamText()的流式文本生成generate-object/使用generateObject()的结构化输出生成stream-object/使用streamObject()的流式结构化输出agent/ToolLoopAgent的 Agent 工作流示例embed/使用embed()的单个 Embedding 生成embed-many/使用embedMany()的批量 Embedding 生成generate-image/使用generateImage()的图像生成generate-speech/使用generateSpeech()的文本转语音transcribe/使用transcribe()的音频转写rerank/使用rerank()的文档重排序middleware/自定义中间件实现registry/Provider Registry 的配置与使用telemetry/OpenTelemetry 集成complex/多组件组合示例Agent、Router 等lib/共享工具函数不是示例tools/可复用的工具定义除规范文档列举的分类外仓库实际还演进出了generate-video/视频生成、start-batch/批量推理、upload-file/与upload-skill/文件与技能上传、stream-transcribe/、stream-translate/流式转写与翻译、sandbox/沙箱执行、harness-agent/编码 Agent harness 示例以及benchmark/加载与流式基准、e2e/Provider 端到端测试等目录说明该分类体系具有良好的可扩展性新增 AI SDK 函数时遵循一个函数一个顶层目录即可。文件命名规范函数 × Provider × 特性示例按函数与 Provider 分组入口示例统一命名为basic.ts附加示例使用描述性的 kebab-case短横线分隔名称模式示例说明function/provider/basic.tsgenerate-text/openai/basic.tsProvider 的基础用法function/provider/feature.tsstream-text/openai/tool-call.ts具体特性演示function/provider/sub-provider.tsstream-text/amazon-bedrock/anthropic.ts带子 Provider 的情况function/provider/sub-provider-feature.tsstream-text/google/vertex-anthropic-cache-control.ts子 Provider 叠加特性注意不要创建扁平化的 Provider 文件例如generate-text/openai.ts——它违反了每个 Provider 一个目录、入口为basic.ts的组织约定会让新增示例难以归类。仓库中的实际文件完全遵循这一规范例如 examples/ai-functions/src/generate-text/openai/basic.ts、generate-image/openai/edit-inpainting.ts特性、stream-text/amazon-bedrock/anthropic.ts子 Provider等。示例的标准结构run() 包装器所有示例统一使用lib/run.ts导出的run()包装器包裹主体逻辑。该包装器源码见 examples/ai-functions/src/lib/run.ts承担两项职责加载环境变量通过import dotenv/config自动读取.env文件中的 API Key 等配置错误处理与 API 错误日志捕获异常并打印完整错误栈当错误是APICallError实例时额外以print()输出请求体requestBodyValues与响应体responseBody方便定位 Provider 侧返回的具体问题若环境变量FAIL_ON_ERROR1已设置则以退出码 1 终止进程。此外run()还具备测试 fixture 记录能力当异步函数返回值带有fullStream流式结果或steps多步结果属性时会调用 lib/record-fixture.ts 将原始响应记录到output/目录详见后文测试 fixture 生成一节。基本模板非流式文本生成import { providerName } from ai-sdk/provider-name; import { generateText } from ai; import { run } from ../../lib/run; run(async () { const result await generateText({ model: providerName(model-id), prompt: Your prompt here., }); console.log(result.text); console.log(Token usage:, result.usage); console.log(Finish reason:, result.finishReason); });其中ai-sdk/provider-name需要替换为实际的 Provider 包如ai-sdk/openaimodel-id替换为该 Provider 下真实可用的模型 ID。作为参考仓库实际的 generate-text/openai/basic.ts 在输出时使用print()打印result.content、result.usage、result.finishReason与result.rawFinishReason并设置了maxRetries: 0以便快速暴露网络或鉴权问题。流式模板import { providerName } from ai-sdk/provider-name; import { streamText } from ai; import { printFullStream } from ../../lib/print-full-stream; import { run } from ../../lib/run; run(async () { const result streamText({ model: providerName(model-id), prompt: Your prompt here., }); await printFullStream({ result }); });printFullStream会消费流并实时输出文本增量同时对工具调用、推理过程等内容进行着色区分详见后文工具函数章节。工具调用模板import { providerName } from ai-sdk/provider-name; import { generateText, tool } from ai; import { z } from zod; import { run } from ../../lib/run; run(async () { const result await generateText({ model: providerName(model-id), tools: { myTool: tool({ description: Tool description, inputSchema: z.object({ param: z.string().describe(Parameter description), }), execute: async ({ param }) { return { result: Processed: ${param} }; }, }), }, prompt: Use the tool to..., }); console.log(JSON.stringify(result, null, 2)); });示例中tool()来自ai包inputSchema使用 Zod 定义输入结构execute为实际执行逻辑。规范文档提示复杂逻辑应添加注释说明非显而易见的代码模式。结构化输出模板import { providerName } from ai-sdk/provider-name; import { generateObject } from ai; import { z } from zod; import { run } from ../../lib/run; run(async () { const result await generateObject({ model: providerName(model-id), schema: z.object({ name: z.string(), items: z.array(z.string()), }), prompt: Generate a..., }); console.log(JSON.stringify(result.object, null, 2)); console.log(Token usage:, result.usage); });结构化输出通过 Zod或仓库依赖中同样支持的 Valibot、ArkType 等 schema 库声明目标结构result.object即为符合 schema 校验的对象。运行示例从examples/ai-functions目录执行脚本由tsx直接运行无需预先编译pnpm tsx src/generate-text/openai/basic.ts pnpm tsx src/stream-text/openai/tool-call.ts pnpm tsx src/agent/openai/generate.ts运行前需完成前置准备详见 examples/ai-functions/README.md在examples/ai-functions目录或仓库根目录创建.env文件写入所需 Provider 的 API Key例如OPENAI_API_KEYYOUR_OPENAI_API_KEY # 按需追加其他 Provider 的 Key在 AI SDK 仓库根目录依次执行pnpm install与pnpm build确保工作区包已构建从examples/ai-functions目录运行任意示例脚本。何时编写示例规范文档明确给出了 5 类应当新增示例的场景新增 Provider 时为该 Provider 支持的每个 APIgenerateText、streamText、generateObject等创建basic.ts示例用于快速验证 Provider 接入是否可用实现新特性时用至少一个 Provider 示例演示该特性作为特性的可复现证明复现 Bug 时创建能稳定复现问题的示例作为调试与修复的最小用例新增 Provider 专属选项时通过providerOptions展示 Provider 特有设置参数的用法生成测试 fixture 时利用示例脚本产出 API 响应 fixture可参考 skills/capture-api-response-test-fixture/SKILL.md 技能。这 5 类场景共同构成了示例先行的开发工作流示例不仅是文档更是验证 Provider 支持、驱动特性开发与保障质量的第一手工具。共享工具函数lib/ 目录examples/ai-functions/src/lib/存放所有示例共用的工具函数。规范文档列出的核心工具如下均已核对源码文件用途run.ts错误处理包装器自动加载.envprint.ts干净的对象打印过滤 undefined 值print-full-stream.ts彩色流式输出区分工具调用、推理、文本save-raw-chunks.ts保存流式原始分块用于测试 fixturepresent-image.ts在终端展示生成的图片save-audio.ts将生成的音频保存到磁盘此外仓库还扩展了record-fixture.tsfixture 记录、require-env.ts环境变量校验、spinner.ts、cancel-on-sigint.tsCtrlC 取消等辅助工具。print过滤 undefined 的精美打印源码见 examples/ai-functions/src/lib/print.ts。print(label, value, { depth })会递归移除对象中的null与undefined条目后再以console.dir输出避免结果对象中大量未使用的可选字段污染输出。depth选项控制递归打印深度默认无限import { print } from ../lib/print; // 打印对象时不显示 undefined 值 print(Result:, result); print(Usage:, result.usage, { depth: 2 });printFullStream着色流式输出源码见 examples/ai-functions/src/lib/print-full-stream.ts。它消费streamText的流并按 chunk 类型实时渲染文本text-start/text-delta/text-end增量输出普通文本推理reasoning-*增量以蓝色加粗的REASONING标题输出工具调用与结果tool-call与tool-result以绿色加粗输出完整 JSON工具审批tool-approval-request/tool-approval-response以黄色加粗输出错误error以红色加粗输出错误名称、消息与堆栈。同时支持onReasoning、onToolCall、onToolApproval、onText四个可选回调便于在示例中追加自定义处理逻辑import { printFullStream } from ../lib/print-full-stream; const result streamText({ ... }); await printFullStream({ result }); // 彩色输出文本、工具调用、推理save-raw-chunks 与 record-fixturefixture 生成save-raw-chunks.ts 将流中类型为raw的原始 chunk 逐行 JSON 序列化后写入output/filename.chunks.txt而 record-fixture.ts 则由run()自动触发当返回值含fullStream如streamText结果或steps如generateText多步结果时将原始响应按请求序号记录为output/示例名.n.chunks.txt或output/示例名.n.json文件名取自当前运行脚本的文件名。这两者都是capture-api-response-test-fixture技能生成测试快照的数据来源。present-image 与 save-audio产物落地present-image.ts 将generateImage返回的图像以终端预览形式展示通过terminal-imageSVG/WebP 先用sharp栅格化为 PNG并把原始全分辨率文件保存到output/image-时间戳-序号.extsave-audio.ts 依据mediaType将generateSpeech生成的音频保存为output/audio-时间戳.mp3|wav|flac|aac|ogg。可复用工具tools/ 目录tools/目录存放可在多个示例间复用的工具定义。规范文档给出的 weather-tool.ts 已核对源码它基于ai包的tool()与 Zod 定义inputSchemalocation字符串与outputSchema地点、天气状况、温度execute返回随机模拟的天气数据。使用时直接导入即可import { weatherTool } from ../tools/weather-tool; const result await generateText({ model: openai(gpt-4o), tools: { weather: weatherTool }, prompt: What is the weather in San Francisco?, });仓库中还扩展了sandbox-shell-tool.ts沙箱 Shell 执行、sandbox-file-tool.ts沙箱文件操作、mcp-tool-drift-detection.tsMCP 工具漂移检测等可复用工具并且types/目录提供了tool-set.ts等类型辅助便于在多个工具组合时统一类型推导。最佳实践规范文档总结了 6 条示例开发的最佳实践结合仓库实现可进一步展开保持示例聚焦每个示例只演示一个特性或用例便于定位问题、便于作为 fixture 来源使用描述性提示词让提示词清楚表达示例正在验证的目标例如仓库中generate-text/openai/basic.ts使用 Invent a new holiday and describe its traditions.使运行结果可预期优雅处理错误run()包装器已自动完成错误打印与 API 请求/响应体输出无需在每个示例中重复 try/catch使用真实模型 ID必须使用 Provider 实际可用的模型 ID如openai(gpt-6-astra)否则示例无法运行也就失去了验证意义复杂逻辑添加注释对非显而易见的代码模式如自定义中间件、沙箱配置加以说明按需复用工具优先复用weatherTool等现成工具或在tools/中创建新的可复用工具避免重复实现。结语examples/ai-functions是 AI SDK 仓库中以示例驱动验证理念的落地载体通过统一的目录组织、命名规范、run()包装器与lib/工具集任何开发者都能以极低的成本为任意 Provider 或新特性编写可运行、可复现、可生成测试 fixture 的示例。当你在 AI SDK 中新增 Provider、实现新函数或修复 Bug 时遵循本文介绍的规范创建一个聚焦的示例脚本既是对功能的即时验证也是对整个仓库生态的贡献。【免费下载链接】aiThe AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents项目地址: https://gitcode.com/GitHub_Trending/ai/ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表