[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-anasfik--openai":3,"tool-anasfik--openai":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",147882,2,"2026-04-09T11:32:47",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108111,"2026-04-08T11:23:26",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":76,"owner_company":77,"owner_location":78,"owner_email":79,"owner_twitter":77,"owner_website":80,"owner_url":81,"languages":82,"stars":87,"forks":88,"last_commit_at":89,"license":90,"difficulty_score":32,"env_os":91,"env_gpu":92,"env_ram":93,"env_deps":94,"category_tags":100,"github_topics":101,"view_count":32,"oss_zip_url":77,"oss_zip_packed_at":77,"status":17,"created_at":113,"updated_at":114,"faqs":115,"releases":156},5854,"anasfik\u002Fopenai","openai","Dart\u002FFlutter SDK for ChatGPT and all OpenAI APIs (GPT, Dall-e..)","openai 是一款专为 Dart 和 Flutter 开发者打造的非官方 SDK，旨在帮助开发者轻松地将 ChatGPT、DALL-E 图像生成、Whisper 语音处理等 OpenAI 前沿人工智能模型集成到自己的应用中。由于 OpenAI 官方尚未提供 Dart 语言的原生支持，这款工具填补了生态空白，让使用 Flutter 构建跨平台应用的团队也能无缝调用强大的 AI 能力。\n\n它主要解决了开发者在对接 OpenAI 复杂接口时面临的配置繁琐、流式响应处理困难以及错误调试不便等痛点。通过封装简洁直观的 API，openai 将复杂的网络请求转化为简单的代码调用，并内置了完善的异常处理与日志记录机制。\n\n该工具非常适合使用 Dart 或 Flutter 进行移动的端、Web 或桌面应用开发的软件工程师。其核心技术亮点包括对实时流式传输（Streaming）的完整支持，能够实现聊天回复或图像生成的逐字\u002F逐块渲染，显著提升用户体验；同时支持一次性全局认证配置和自定义超时设置，兼顾了开发效率与运行稳定性。此外，项目提供了丰富的示例代码，覆盖从基础对话到高级微调的各类场景，帮助开发者快速","openai 是一款专为 Dart 和 Flutter 开发者打造的非官方 SDK，旨在帮助开发者轻松地将 ChatGPT、DALL-E 图像生成、Whisper 语音处理等 OpenAI 前沿人工智能模型集成到自己的应用中。由于 OpenAI 官方尚未提供 Dart 语言的原生支持，这款工具填补了生态空白，让使用 Flutter 构建跨平台应用的团队也能无缝调用强大的 AI 能力。\n\n它主要解决了开发者在对接 OpenAI 复杂接口时面临的配置繁琐、流式响应处理困难以及错误调试不便等痛点。通过封装简洁直观的 API，openai 将复杂的网络请求转化为简单的代码调用，并内置了完善的异常处理与日志记录机制。\n\n该工具非常适合使用 Dart 或 Flutter 进行移动的端、Web 或桌面应用开发的软件工程师。其核心技术亮点包括对实时流式传输（Streaming）的完整支持，能够实现聊天回复或图像生成的逐字\u002F逐块渲染，显著提升用户体验；同时支持一次性全局认证配置和自定义超时设置，兼顾了开发效率与运行稳定性。此外，项目提供了丰富的示例代码，覆盖从基础对话到高级微调的各类场景，帮助开发者快速上手并构建智能化应用。","# 🚀 Dart OpenAI\n\n\u003Cdiv align=\"center\">\n\n[![GitHub commit activity](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fcommit-activity\u002Fm\u002Fanasfik\u002Fopenai)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai)\n[![GitHub contributors](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fcontributors\u002Fanasfik\u002Fopenai)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fgraphs\u002Fcontributors)\n[![GitHub Repo stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fanasfik\u002Fopenai?style=social)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai)\n[![GitHub Workflow Status](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fanasfik\u002Fopenai\u002Fdart.yml?label=tests)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Factions)\n[![GitHub Workflow Status](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fanasfik\u002Fopenai\u002Frelease.yml?label=build)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Factions)\n[![GitHub](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fanasfik\u002Fopenai)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fblob\u002Fmain\u002FLICENSE)\n[![Pub Version](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fv\u002Fdart_openai)](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)\n[![Pub Likes](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Flikes\u002Fdart_openai)](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)\n[![Pub Points](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fpoints\u002Fdart_openai)](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)\n[![Pub Popularity](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fpopularity\u002Fdart_openai)](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)\n\n**A comprehensive Dart\u002FFlutter client for OpenAI's powerful AI models**\n\n[Quick Start](#-quick-start) • [Documentation](#-documentation) • [Examples](#-examples) • [API Coverage](#-api-coverage) • [Contributing](#-contributing)\n\n\u003C\u002Fdiv>\n\n---\n\n## ✨ Overview\n\nDart OpenAI is an **unofficial** but comprehensive client package that allows developers to easily integrate OpenAI's state-of-the-art AI models into their Dart\u002FFlutter applications. The package provides simple, intuitive methods for making requests to OpenAI's various APIs, including GPT models, DALL-E image generation, Whisper audio processing, and more.\n\n> **⚠️ Note**: This is an **unofficial** package. OpenAI does not have an official Dart library.\n\n### 🎯 Key Features\n\n- 🚀 **Easy Integration** - Simple, intuitive API that mirrors OpenAI's documentation\n- 🔐 **Secure Authentication** - One-time setup, use anywhere in your application\n- 📡 **Streaming Support** - Real-time streaming for completions, chat, and fine-tune events\n- 🛠️ **Developer Friendly** - Comprehensive error handling and logging\n- 📚 **Rich Examples** - Ready-to-use examples for every implemented feature\n- 🎨 **Modern UI Support** - Optimized for Flutter applications\n- 🔄 **Custom APIs** - Additional custom endpoints for enhanced functionality\n\n---\n\n## 🚀 Quick Start\n\n### Installation\n\nAdd the package to your `pubspec.yaml`:\n\n```yaml\ndependencies:\n  dart_openai: \n```\n\n### Basic Setup\n\n```dart\nimport 'package:dart_openai\u002Fdart_openai.dart';\n\nvoid main() {\n  \u002F\u002F Set your API key\n  OpenAI.apiKey = \"your-api-key-here\";\n  \n  \u002F\u002F Optional: Set organization ID\n  OpenAI.organization = \"your-org-id\";\n  \n  \u002F\u002F Optional: Configure timeout\n  OpenAI.requestsTimeOut = Duration(seconds: 60);\n  \n  \u002F\u002F Optional: Enable logging\n  OpenAI.showLogs = true;\n  \n  runApp(MyApp());\n}\n```\n\n### Your First API Call\n\n```dart\n\u002F\u002F Simple chat completion\nfinal chatCompletion = await OpenAI.instance.chat.create(\n  model: \"gpt-3.5-turbo\",\n  messages: [\n    OpenAIChatCompletionChoiceMessageModel(\n      role: OpenAIChatMessageRole.user,\n      content: \"Hello, how are you?\",\n    ),\n  ],\n);\n\nprint(chatCompletion.choices.first.message.content);\n```\n\n---\n\n## 📊 API Coverage (2025)\n\n| API feature | Status | Details | Last Updated |\n|--------------|--------|----------| --------------|\n| **📋 [Responses](#-responses)** | ✅ Complete | All |  11-08-2025 17:33:39 |\n| **💭 [Conversations](#-conversations)** | ✅ Complete | All | 11-08-2025 17:38:56 |\n| **🎵 [Audio](#-audio)** | ✅ Complete | All | 11-08-2025 17:42:54 |\n| **🎬 [Videos](#-videos)** | 🗓️ planned | - ||\n| **🎨 [Images](#-images)** | ✅ Complete | All |  11-08-2025 17:53:45 |\n| **🎨 [Images Streaaming](#-images-streaaming)** | 🗓️ planned | - ||\n| **📊 [Embeddings](#-embeddings)** | ✅ Complete | All |  11-08-2025 17:56:30 |\n| **⚖️ [Evals](#️-evals)** | ✅ Complete | All |  11-08-2025 21:04:36 |\n| **🔧 [Fine-tuning](#-fine-tuning)** | 🧩 70% Complete | missing newer endpoints ||\n| **📊 [Graders](#-graders)** | ✅ Complete | All |  11-08-2025 21:46:48 |\n| **📦 [Batch](#-batch)** | 🗓️ planned | - ||\n| **📁 [Files](#-files)** | ✅ Complete | All | 11-08-2025 21:51:34|\n| **📤 [Uploads](#-uploads)** | 🗓️ planned | - ||\n| **🤖 [Models](#-models)** | ✅ Complete | All | 11-08-2025 21:53:13 |\n| **🛡️ [Moderation](#️-moderation)** | ✅ Complete | All |  11-08-2025 21:54:01 |\n| **🗃️ [Vector Stores](#️-vector-stores)** | ✅ Complete | All | 11-19-2025 12:24:15 |\n| **💬 ChatKit** | ❌ Not planned  | Beta feature ||\n| **📦 [Containers](#containers)** | ✅ Complete | All | 11-19-2025 12:24:15 |\n| **🕛 [Real-time](#-real-time)** | 🗓️ planned  | - ||\n| **💬 [Chat Completions](#-chat-completions)** | ✅ Complete | excluding stream functionality ||\n| **🤖 Assistants** | ❌ Not planned | beta feature ||\n| **🤖 [Administration](#-administration)** | 🗓️ planned | - ||\n| **📝 Completions (Legacy)** | ✅ Complete | All ||\n| **✏️ Edits (Legacy)** | ✅ Complete | All ||\n\n---\n\n## 📚 Documentation\n\n### Core APIs\n\n#### 📋 Responses\n\n```dart\n\u002F\u002F Create response\nOpenAiResponse response = await OpenAI.instance.responses.create(\n  input: \"Your input text here\",  \n  model: \"gpt-4\",\n);\n\n\u002F\u002F Get response\nOpenAiResponse response = await OpenAI.instance.responses.get(\n  responseId: \"response-id-here\",\n  startingAfter: 0, \n);\n\n\u002F\u002F Delete response\nawait OpenAI.instance.responses.delete(\n  responseId: \"response-id-here\",\n);\n\n\u002F\u002F Cancel response\nOpenAiResponse response = await OpenAI.instance.responses.cancel(\n  responseId: \"response-id-here\",\n);\n\n\u002F\u002F list input items\nOpenAiResponseInputItemsList response = await OpenAI.instance.responses.listInputItems(\n  responseId: \"response-id-here\",\n  limit: 10, \n);\n\n\n\u002F\u002F Get input token counts\nint inputTokens = await OpenAI.instance.responses.getInputTokenCounts(\n  model: \"gpt-5\",\n  input: \"Your input text here\",\n);\n```\n\n#### 💭 Conversations\n\n```dart\n\u002F\u002F Create conversation\nOpenAIConversation conversation = await OpenAI.instance.conversations.create(\n  items: [{\n    \"type\": \"message\",\n    \"role\": \"user\",\n    \"content\": \"Hello!\",\n  }],\n  metadata: {\n    \"key\": \"value\",\n    \"another_key\": \"another_value\",\n  },\n);\n\n\n\u002F\u002F Get conversation\nOpenAIConversation conversation = await OpenAI.instance.conversations.get(\n  conversationId: \"conversation-id-here\",\n);\n\n\u002F\u002F Update conversation\nOpenAIConversation updatedConversation = await OpenAI.instance.conversations.update(\n  conversationId: \"conversation-id\",\n  metadata: {\n    \"key\": \"new_value\",\n  },\n);\n\n\u002F\u002F Delete conversation\n await OpenAI.instance.conversations.delete(\n  conversationId: \"conversation-id-here\",\n);\n\n\u002F\u002F list items\nOpenAIConversationItemsResponse itemsList = await OpenAI.instance.conversations.listItems(\n  conversationId: \"conversation-id-here\",\n  limit: 10, \n);\n\n\u002F\u002F Create item\nOpenAIConversationItem item = await OpenAI.instance.conversations.createItems(\n  conversationId: \"conversation-id-here\",\n  items: [\n    \u002F\u002F ...\n  ],\n);\n\n\u002F\u002F get item\nOpenAIConversationItem item = await OpenAI.instance.conversations.getItem(\n  conversationId: \"conversation-id-here\",\n  itemId: \"item-id-here\",\n);\n\n\u002F\u002F delete item\nawait OpenAI.instance.conversations.deleteItem(\n  conversationId: \"conversation-id-here\",\n  itemId: \"item-id-here\",\n);\n```\n\n#### 🎵 Audio\n\n```dart\n\u002F\u002F Create speech\nFile speechFile = await OpenAI.instance.audio.createSpeech(\n  model: \"tts-1\",\n  input: \"Text to convert to speech\",\n  voice: OpenAIAudioVoice.fable,\n  responseFormat: OpenAIAudioSpeechResponseFormat.mp3,\n  outputDirectory: \"\u002Fpath\u002Fto\u002Foutput\u002Fdirectory\",\n  outputFileName: \"output_speech.mp3\",\n);\n\n\n\u002F\u002F Transcribe audio\nOpenAITranscriptionGeneralModel transcription = await OpenAI.instance.audio.createTranscription(\n  model: \"whisper-1\",\n  file: File(\"path\u002Fto\u002Faudio.mp3\"),\n  include: [\"logprobs\"],\n  responseFormat: OpenAIAudioResponseFormat.verbose_json,\n  language: \"en\",\n  prompt: \"This is a sample prompt to guide transcription\",\n);\n\u002F\u002F Handling different transcription response formats\nif (transcription is OpenAITranscriptionModel) {\n  print(transcription.logprobs);\n  print(transcription.text);\n  print(transcription.usage);\n} else if (transcription is OpenAITranscriptionVerboseModel) {\n  \u002F\u002F print the transcription.\n  print(transcription.text);\n  print(transcription.segments?.map((e) => e.end));\n}\n\n\u002F\u002F Create Translation\nfinal translationText = await OpenAI.instance.audio.createTranslation(\n  file: File(\"path\u002Fto\u002Faudio.mp3\"),\n  model: \"whisper-1\",\n  prompt: \"use unusual english words\",\n  responseFormat: OpenAIAudioResponseFormat.json,\n);\n\n```\n\n#### 🎬 Videos\n\n\u002F\u002F (To be implemented)\n\n#### 🎨 Images\n\n```dart\n\u002F\u002F Generate image\nOpenAIImageModel image = await OpenAI.instance.image.create(\n  model: \"dall-e-3\",\n  prompt: \"image of a cat in a spaceship\",\n  responseFormat: OpenAIImageResponseFormat.url,\n  size: OpenAIImageSize.size1024,\n  quality: OpenAIImageQuality.standard,\n  style: OpenAIImageStyle.vivid,\n);\n\n\u002F\u002F Edit image\nOpenAIImageModel imageEdit = await OpenAI.instance.image.edit(\n  prompt: 'A fantasy landscape with mountains and a river',\n  image: File(\"path\u002Fto\u002Fimage.png\"),\n  size: OpenAIImageSize.size1024,\n  responseFormat: OpenAIImageResponseFormat.b64Json,\n);\n\n\u002F\u002F Create variation\nList\u003COpenAIImageModel> imageVariation = await OpenAI.instance.image.variation(\n  model: \"dall-e-2\",\n  image: File(\"path\u002Fto\u002Fimage.png\"),\n  size: OpenAIImageSize.size512,\n  responseFormat: OpenAIImageResponseFormat.url,\n);\n```\n\n#### 🎨 Images Streaaming\n\n\u002F\u002F (To be implemented)\n\n#### 📊 Embeddings\n\n```dart\nOpenAIEmbeddingsModel embedding = await OpenAI.instance.embedding.create(\n  model: \"text-embedding-ada-002\",\n  input: \"This is a sample text\",\n);\n```\n\n#### ⚖️ Evals\n\n```dart\n\u002F\u002F Create eval\nOpenAIEval eval = await OpenAI.instance.evals.create(\n  dataSourceConfig: RequestDatatSourceConfig.logs(),\n);\n\n\u002F\u002F Get eval\nOpenAIEval eval = await OpenAI.instance.evals.get(\n  evalId: \"eval-id-here\",\n);\n\n\u002F\u002F Update eval\nOpenAIEval updatedEval = await OpenAI.instance.evals.update(\n  evalId: \"eval-id-here\",\n  metadata: {\n    \"key\": \"new_value\",\n  },\n);\n\n\u002F\u002F Delete eval\n await OpenAI.instance.evals.delete(\n  evalId: \"eval-id-here\",\n);\n\n\u002F\u002F List evals\nOpenAIEvalsList evalsList = await OpenAI.instance.evals.list(\n  limit: 10, \n);\n\n\u002F\u002F Get eval runs.\nOpenAIEvalRunsList evalRuns = await OpenAI.instance.evals.getRuns(\n  evalId: \"eval-id-here\",\n  limit: 3, \n);\n\n\u002F\u002F Get Eval run\nOpenAIEvalRun evalRun = await OpenAI.instance.evals.getRun(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n);\n\n\u002F\u002F Create run\nOpenAIEvalRun createdRun = await OpenAI.instance.evals.createRun(\n  evalId: \"eval-id-here\",\n  dataSource: EvalRunDataSource.jsonl(),\n);\n\n\u002F\u002F Cancel run\nOpenAIEvalRun canceledRun = await OpenAI.instance.evals.cancel(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n);\n\n\u002F\u002F Delete run\n await OpenAI.instance.evals.deleteRun(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n);\n\n\u002F\u002F Get output item of eval run.\nOpenAIEvalRunOutputItem outputItem = await OpenAI.instance.evals.getEvalRunOutputItem(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n  outputItemIdn: \"item-id-here\",\n);\n\n\u002F\u002F Get eval run output items.\nOpenAIEvalRunOutputItemsList outputItems = await OpenAI.instance.evals.getEvalRunOutputItems(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n  limit: 10,\n);\n```\n\n#### 🔧 Fine-tuning\n\n\u002F\u002F (To be implemented)\n\n#### 📊 Graders\n\n```dart\n\n\u002F\u002F graders\nfinal grader = OpenAIGraders.stringCheckGrader(...);\nfinal grader2 = OpenAIGraders.textSimilarityGrader(...);\nfinal grader3 = OpenAIGraders.scoreModelGrader(...);\nfinal grader4 = OpenAIGraders.labelModelGrader(...);\nfinal grader5 = OpenAIGraders.pythonGrader(...);\nfinal grader6 = OpenAIGraders.multiGrader(...);\n\n\u002F\u002F Run grader\nfinal grader = await OpenAI.instance.graders.runGrader(\n grader: grader,\n modelSample: \"The model output to be graded\", \n);\n\n\u002F\u002F Validate Grader\nfinal isValid = OpenAI.instance.graders.validateGrader(\n  grader: grader\n);\n```\n\n#### 📦 Batch\n\n\u002F\u002F (To be implemented)\n\n#### 📁 Files\n\n```dart\n\u002F\u002F Upload file\nOpenAIFileModel file = await OpenAI.instance.files.upload(\n  file: File(\"path\u002Fto\u002Ffile.jsonl\"),\n  purpose: \"assistants\",\n);\n\n\u002F\u002F List files\nList\u003COpenAIFileModel> files = await OpenAI.instance.files.list(\n  limit: 10,\n);\n\n\u002F\u002F Retrieve file\nOpenAIFileModel file = await OpenAI.instance.files.retrieve(\n   \"file_id\" \n);\n\n\u002F\u002F Delete file\nawait OpenAI.instance.files.delete(\"file-id-here\");\n\n\u002F\u002F Retrieve file content\nfinal content = await OpenAI.instance.files.retrieveContent(\n  \"file_id\"\n);\n```\n\n#### 📤 Uploads\n\n\u002F\u002F (To be implemented)\n\n#### 🤖 Models\n\n```dart\n\u002F\u002F List all available models\nList\u003COpenAIModelModel> models = await OpenAI.instance.model.list();\n\n\u002F\u002F Retrieve specific model\nOpenAIModelModel model = await OpenAI.instance.model.retrieve(\"gpt-3.5-turbo\");\n\n\u002F\u002F Delete fine-tuned model\nbool deleted = await OpenAI.instance.model.delete(\"fine-tuned-model-id\");\n```\n\n#### 🛡️ Moderation\n\n```dart\nOpenAIModerationModel moderation = await OpenAI.instance.moderation.create(\n  input: [\"Text to classify for moderation\"],\n  model: \"omni-moderation-latest\",\n);\n```\n\n#### 🗃️ Vector Stores\n\n##### Vector Stores\n\n```dart\n\u002F\u002F Create vector store\n  OpenAIVectorStoreModel vectorStore = await OpenAI.instance.vectorStores.vectorStores.create(\n    name: \"example_vector_store\",\n    chunkingStrategy: OpenAIVectorStoreChunkingStrategy.static(\n      chunkOverlapTokens: 300,\n      maxChunkSizeTokens: 750,\n    ),\n    expiresAfter: OpenAIVectorStoreExpiresAfter(\n      anchor: \"last_active_at\",\n      days: 1,\n    ),\n  ); \n\n  \u002F\u002F List vector stores\n OpenAIVectorStoreListModel allVEctorStores = await OpenAI.instance.vectorStores.vectorStores.list(limit: 30);\n\n \u002F\u002F Get vector store\n final firstVectorStoreAsync = await OpenAI.instance.vectorStores.vectorStores.get(\n   vectorStoreId: \"vector_store_id\",\n );\n\n\u002F\u002F Modify vector store\nfinal updatedVectorStore = await OpenAI.instance.vectorStores.vectorStores.modify(\n  vectorStoreId: \"vector_store_id\",\n  name: \"updated_vector_store_name\",\n);\n\n\u002F\u002F Delete vector store\nawait OpenAI.instance.vectorStores.vectorStores.delete(\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F search in vector store\nfinal searchVEctorStoreResult = await OpenAI.instance.vectorStores.vectorStores.search(\n   vectorStoreId: updatedVectorStore.id,\n   query: \"example\",\n   maxNumResults: 10,\n   filters: OpenAIVectorStoresSearchFilter.comparison(\n     type: \"eq\",\n     key: \"metadata.example_key\",\n     value: \"example_value\",\n   ),\n   rankingOptions: OpenAIVectorStoresRankingOptions(\n     ranker: \"none\",\n     scoreThreshold: 0,\n   ),\n);\n\n```\n\n##### Vector store files\n\n```dart\n\n\u002F\u002F Create vector store file\nfinal createdVectorStoreFile = await OpenAI.instance.vectorStores.vectorStoresFiles.create(\n  vectorStoreId: \"vector_store_id\",\n  fileId: \"file_id\",\n  attributes: {\n    \"chapter\": \"Chapter 1\",\n  },\n  chunckingStrategy: OpenAIVectorStoreChunkingStrategy.static(\n    chunkOverlapTokens: 300,\n    maxChunkSizeTokens: 750,\n  ),\n);\n\n\u002F\u002F List vector store files\nfinal vectorStoreFiles = await OpenAI.instance.vectorStores.vectorStoresFiles.list(\n  vectoreStoreId: \"vector_store_id\",\n  limit: 60,\n);\n\n\u002F\u002F Get vector store file\nfinal vectorStoreFile = await OpenAI.instance.vectorStores.vectorStoresFiles.get(\n  fileId: \"file_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F Get vector store file content\nfinal vectorStoreFileContent = await OpenAI.instance.vectorStores.vectorStoresFiles.getContent(\n  fileId: \"file_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F Update vector store file\nfinal updatedVectorStoreFile = await OpenAI.instance.vectorStores.vectorStoresFiles.update(\n  fileId: \"file_id\",\n  vectorStoreId: \"vector_store_id\",\n  attributes: {\n    \"chapter\": \"Updated Chapter 1\",\n  },\n);\n\n\u002F\u002F Delete vector store file\nawait OpenAI.instance.vectorStores.vectorStoresFiles.delete(\n  fileId: \"file_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n```\n\n##### Vector store file batches\n\n```dart\n\n\u002F\u002F Create vector store file batch\nfinal vectoreStoreFileBatch = await OpenAI.instance.vectorStores.vectorStoreFileBatch.create(\n  vectorStoreId: \"vector_store_id\",\n  chunkingStrategy: OpenAIVectorStoreChunkingStrategy.static(\n    chunkOverlapTokens: 200,\n    maxChunkSizeTokens: 550,\n  ),\n  attributes: {\n    \"batch_name\": \"My First Batch\",\n  },\n  fileIds: [\"file-abc123\", \"file-def456\"],\n);\n\n\u002F\u002F Get vector store file batch\nfinal batch = await OpenAI.instance.vectorStores.vectorStoreFileBatch.get(\n  batchId: \"batch_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F Cancel vector store file batch\nfinal cancelledBatch = await OpenAI.instance.vectorStores.vectorStoreFileBatch.cancel(\n  batchId: \"batch_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F List vector store files in a batch\nfinal vectorStoreBatchFiles = await OpenAI.instance.vectorStores.vectorStoreFileBatch.list(\n  vectorStoreId: \"vector_store_id\",\n  batchId: 'batch_id',\n);\n\n```\n\n#### 📦 Containers\n\n##### Containers\n\n```dart\n\u002F\u002F Create container\nfinal container = await OpenAI.instance.container.containers.create(\n  name: \"my special container\",\n);\n\n\u002F\u002F List containers\nfinal containers = await OpenAI.instance.container.containers.list(\n  limit: 20,\n);\n\n\u002F\u002F Get container\nfinal firstContainer = await OpenAI.instance.container.containers.get(\n  containerId: \"container_id\",\n);\n\n\u002F\u002F Delete container\nawait OpenAI.instance.container.containers.delete(\n  containerId: \"container_id\",\n);\n\n```\n\n##### Container Files\n\n```dart\n\u002F\u002F Create container file\nfinal containerFile = await OpenAI.instance.container.containerFiles.create(\n  file: File(\"path\u002Fto\u002Ffile\"),\n  containerId: \"container_id\",\n);\n\n\u002F\u002F Get container file\nfinal gotContainerFile = await OpenAI.instance.container.containerFiles.get(\n  containerId: \"container_id\",\n  fileId: \"file_id\",\n);\n\n\u002F\u002F Get container file content\nfinal gotContainerFileContent =\n    await OpenAI.instance.container.containerFiles.getContent(\n  containerId: \"container_id\",\n  fileId: \"file_id\",\n);\n\n\u002F\u002F List container files\nfinal allContainerFiles = await OpenAI.instance.container.containerFiles.list(\n  containerId: \"container_id\",\n  limit: 20,\n);\n\n\u002F\u002F Delete container file\nawait OpenAI.instance.container.containerFiles.delete(\n  fileId: \"file_id\",\n  containerId: \"container_id\",\n);\n\n```\n\n\n#### 🕛 Real-time\n\n\u002F\u002F (To be implemented)\n\n#### 💬 Chat Completions\n\n```dart\n\u002F\u002F Basic chat completion\nOpenAIChatCompletionModel chat = await OpenAI.instance.chat.create(\n  model: \"gpt-3.5-turbo\",\n  messages: [\n    OpenAIChatCompletionChoiceMessageModel(\n      role: OpenAIChatMessageRole.user,\n      content: \"Hello, how can you help me?\",\n    ),\n  ],\n  temperature: 0.7,\n  maxTokens: 150,\n);\n\n\u002F\u002F Streaming chat completion\nStream\u003COpenAIStreamChatCompletionModel> chatStream = OpenAI.instance.chat.createStream(\n  model: \"gpt-3.5-turbo\",\n  messages: [\n    OpenAIChatCompletionChoiceMessageModel(\n      role: OpenAIChatMessageRole.user,\n      content: \"Tell me a story\",\n    ),\n  ],\n);\n\nchatStream.listen((event) {\n  print(event.choices.first.delta.content);\n});\n```\n\n#### 🤖 Administration\n\n\u002F\u002F (To be implemented)\n\n---\n\n\n## 🔧 Configuration\n\n### Environment Variables\n\n```dart\n\u002F\u002F Using envied package\n@Envied(path: \".env\")\nabstract class Env {\n  @EnviedField(varName: 'OPEN_AI_API_KEY')\n  static const apiKey = _Env.apiKey;\n}\n\nvoid main() {\n  OpenAI.apiKey = Env.apiKey;\n  runApp(MyApp());\n}\n```\n\n### Custom Configuration\n\n```dart\nvoid main() {\n  \u002F\u002F Set API key\n  OpenAI.apiKey = \"your-api-key\";\n  \n  \u002F\u002F Set organization (optional)\n  OpenAI.organization = \"your-org-id\";\n  \n  \u002F\u002F Set custom base URL (optional)\n  OpenAI.baseUrl = \"https:\u002F\u002Fapi.openai.com\u002Fv1\";\n  \n  \u002F\u002F Set request timeout (optional)\n  OpenAI.requestsTimeOut = Duration(seconds: 60);\n  \n  \u002F\u002F Enable logging (optional)\n  OpenAI.showLogs = true;\n  OpenAI.showResponsesLogs = true;\n  \n  runApp(MyApp());\n}\n```\n\n---\n\n## 🚨 Error Handling\n\n```dart\ntry {\n  final chat = await OpenAI.instance.chat.create(\n    model: \"gpt-3.5-turbo\",\n    messages: [\n      OpenAIChatCompletionChoiceMessageModel(\n        role: OpenAIChatMessageRole.user,\n        content: \"Hello\",\n      ),\n    ],\n  );\n} on RequestFailedException catch (e) {\n  print(\"Request failed: ${e.message}\");\n  print(\"Status code: ${e.statusCode}\");\n} on MissingApiKeyException catch (e) {\n  print(\"API key not set: ${e.message}\");\n} on UnexpectedException catch (e) {\n  print(\"Unexpected error: ${e.message}\");\n}\n```\n\n---\n\n## 🤝 Contributing\n\nWe welcome contributions! Here's how you can help:\n\n### 🐛 Bug Reports\n\n- Use [GitHub Issues](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues) to report bugs\n- Include reproduction steps and environment details\n\n### 💡 Feature Requests\n\n- Suggest new features via [GitHub Issues](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues)\n- Check existing issues before creating new ones\n\n### 🔧 Code Contributions\n\n- Fork the repository\n- Create a feature branch\n- Make your changes\n- Add tests if applicable\n- Submit a pull request\n\n### 📚 Documentation\n\n- Help improve documentation\n- Add examples for missing features\n- Fix typos and improve clarity\n\n### 💰 Sponsoring\n\n- [Sponsor the project](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fanasfik)\n- Help maintain and improve the package\n\n---\n\n## 📜 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\n## 🙏 Acknowledgments\n\n- **OpenAI** for providing the amazing AI models and APIs\n- **Contributors** who help maintain and improve this package\n- **Sponsors** who support the project financially\n- **Community** for feedback and suggestions\n\n---\n\n## 📞 Support\n\n- 📖 [Full Documentation](https:\u002F\u002Fpub.dev\u002Fdocumentation\u002Fdart_openai\u002Flatest\u002F)\n- 🐛 [Report Issues](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues)\n- 💬 [Discussions](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fdiscussions)\n- 📧 [Contact](https:\u002F\u002Fgithub.com\u002Fanasfik)\n\n---\n\n\u003Cdiv align=\"center\">\n\n\n**Made with ❤️ by the Dart OpenAI community**\n\n[⭐ Star this repo](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai) • [🐛 Report Bug](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues) • [💡 Request Feature](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues) • [📖 Documentation](https:\u002F\u002Fpub.dev\u002Fdocumentation\u002Fdart_openai\u002Flatest\u002F)\n\n\u003C\u002Fdiv>\n","# 🚀 Dart OpenAI\n\n\u003Cdiv align=\"center\">\n\n[![GitHub 提交活动](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fcommit-activity\u002Fm\u002Fanasfik\u002Fopenai)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai)\n[![GitHub 贡献者](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fcontributors\u002Fanasfik\u002Fopenai)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fgraphs\u002Fcontributors)\n[![GitHub 仓库星标](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fanasfik\u002Fopenai?style=social)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai)\n[![GitHub 工作流状态](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fanasfik\u002Fopenai\u002Fdart.yml?label=tests)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Factions)\n[![GitHub 工作流状态](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fanasfik\u002Fopenai\u002Frelease.yml?label=build)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Factions)\n[![GitHub](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fanasfik\u002Fopenai)](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fblob\u002Fmain\u002FLICENSE)\n[![Pub 版本](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fv\u002Fdart_openai)](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)\n[![Pub 点赞数](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Flikes\u002Fdart_openai)](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)\n[![Pub 分数](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fpoints\u002Fdart_openai)](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)\n[![Pub 流行度](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fpopularity\u002Fdart_openai)](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)\n\n**一个全面的 Dart\u002FFlutter 客户端，用于访问 OpenAI 强大的 AI 模型**\n\n[快速入门](#-quick-start) • [文档](#-documentation) • [示例](#-examples) • [API 覆盖范围](#-api-coverage) • [贡献](#-contributing)\n\n\u003C\u002Fdiv>\n\n---\n\n## ✨ 概述\n\nDart OpenAI 是一个 **非官方** 但功能全面的客户端库，使开发者能够轻松地将 OpenAI 的最先进 AI 模型集成到他们的 Dart\u002FFlutter 应用程序中。该库提供了简单直观的方法来向 OpenAI 的各种 API 发送请求，包括 GPT 模型、DALL-E 图像生成、Whisper 音频处理等。\n\n> **⚠️ 注意**: 这是一个 **非官方** 包。OpenAI 并没有官方的 Dart 库。\n\n### 🎯 主要特性\n\n- 🚀 **易于集成** - 简单直观的 API，与 OpenAI 文档一致\n- 🔐 **安全的身份验证** - 一次性设置，可在应用程序的任何地方使用\n- 📡 **流式支持** - 实时流式传输完成、聊天和微调事件\n- 🛠️ **开发者友好** - 全面的错误处理和日志记录\n- 📚 **丰富的示例** - 为每个实现的功能提供即用型示例\n- 🎨 **现代 UI 支持** - 针对 Flutter 应用程序进行了优化\n- 🔄 **自定义 API** - 额外的自定义端点以增强功能\n\n---\n\n## 🚀 快速入门\n\n### 安装\n\n将该包添加到你的 `pubspec.yaml` 文件中：\n\n```yaml\ndependencies:\n  dart_openai: \n```\n\n### 基本设置\n\n```dart\nimport 'package:dart_openai\u002Fdart_openai.dart';\n\nvoid main() {\n  \u002F\u002F 设置你的 API 密钥\n  OpenAI.apiKey = \"your-api-key-here\";\n  \n  \u002F\u002F 可选：设置组织 ID\n  OpenAI.organization = \"your-org-id\";\n  \n  \u002F\u002F 可选：配置超时时间\n  OpenAI.requestsTimeOut = Duration(seconds: 60);\n  \n  \u002F\u002F 可选：启用日志记录\n  OpenAI.showLogs = true;\n  \n  runApp(MyApp());\n}\n```\n\n### 第一个 API 调用\n\n```dart\n\u002F\u002F 简单的聊天完成\nfinal chatCompletion = await OpenAI.instance.chat.create(\n  model: \"gpt-3.5-turbo\",\n  messages: [\n    OpenAIChatCompletionChoiceMessageModel(\n      role: OpenAIChatMessageRole.user,\n      content: \"你好，最近怎么样？\",\n    ),\n  ],\n);\n\nprint(chatCompletion.choices.first.message.content);\n```\n\n---\n\n## 📊 API 覆盖范围（2025年）\n\n| API 功能 | 状态 | 详情 | 最后更新 |\n|--------------|--------|----------| --------------|\n| **📋 [响应](#-responses)** | ✅ 完整 | 全部 |  11-08-2025 17:33:39 |\n| **💭 [对话](#-conversations)** | ✅ 完整 | 全部 | 11-08-2025 17:38:56 |\n| **🎵 [音频](#-audio)** | ✅ 完整 | 全部 | 11-08-2025 17:42:54 |\n| **🎬 [视频](#-videos)** | 🗓️ 计划中 | - ||\n| **🎨 [图像](#-images)** | ✅ 完整 | 全部 |  11-08-2025 17:53:45 |\n| **🎨 [图像流式传输](#-images-streaaming)** | 🗓️ 计划中 | - ||\n| **📊 [嵌入](#-embeddings)** | ✅ 完整 | 全部 |  11-08-2025 17:56:30 |\n| **⚖️ [评估](#️-evals)** | ✅ 完整 | 全部 |  11-08-2025 21:04:36 |\n| **🔧 [微调](#-fine-tuning)** | 🧩 完成 70% | 缺少较新的端点 ||\n| **📊 [评分器](#-graders)** | ✅ 完整 | 全部 |  11-08-2025 21:46:48 |\n| **📦 [批处理](#-batch)** | 🗓️ 计划中 | - ||\n| **📁 [文件](#-files)** | ✅ 完整 | 全部 | 11-08-2025 21:51:34|\n| **📤 [上传](#-uploads)** | 🗓️ 计划中 | - ||\n| **🤖 [模型](#-models)** | ✅ 完整 | 全部 | 11-08-2025 21:53:13 |\n| **🛡️ [内容审核](#️-moderation)** | ✅ 完整 | 全部 |  11-08-2025 21:54:01 |\n| **🗃️ [向量存储](#️-vector-stores)** | ✅ 完整 | 全部 | 11-19-2025 12:24:15 |\n| **💬 ChatKit** | ❌ 未计划  | 测试版功能 ||\n| **📦 [容器](#containers)** | ✅ 完整 | 全部 | 11-19-2025 12:24:15 |\n| **🕛 [实时](#-real-time)** | 🗓️ 计划中  | - ||\n| **💬 [聊天完成](#-chat-completions)** | ✅ 完整 | 不包括流式功能 ||\n| **🤖 助手** | ❌ 未计划 | 测试版功能 ||\n| **🤖 [管理](#-administration)** | 🗓️ 计划中 | - ||\n| **📝 完成（旧版）** | ✅ 完整 | 全部 ||\n| **✏️ 编辑（旧版）** | ✅ 完整 | 全部 ||\n\n---\n\n## 📚 文档\n\n### 核心 API\n\n#### 📋 响应\n\n```dart\n\u002F\u002F 创建响应\nOpenAiResponse response = await OpenAI.instance.responses.create(\n  input: \"Your input text here\",  \n  model: \"gpt-4\",\n);\n\n\u002F\u002F 获取响应\nOpenAiResponse response = await OpenAI.instance.responses.get(\n  responseId: \"response-id-here\",\n  startingAfter: 0, \n);\n\n\u002F\u002F 删除响应\nawait OpenAI.instance.responses.delete(\n  responseId: \"response-id-here\",\n);\n\n\u002F\u002F 取消响应\nOpenAiResponse response = await OpenAI.instance.responses.cancel(\n  responseId: \"response-id-here\",\n);\n\n\u002F\u002F 列出输入项\nOpenAiResponseInputItemsList response = await OpenAI.instance.responses.listInputItems(\n  responseId: \"response-id-here\",\n  limit: 10, \n);\n\n\n\u002F\u002F 获取输入 token 数量\nint inputTokens = await OpenAI.instance.responses.getInputTokenCounts(\n  model: \"gpt-5\",\n  input: \"Your input text here\",\n);\n```\n\n#### 💭 对话\n\n```dart\n\u002F\u002F 创建对话\nOpenAIConversation conversation = await OpenAI.instance.conversations.create(\n  items: [{\n    \"type\": \"message\",\n    \"role\": \"user\",\n    \"content\": \"你好！\",\n  }],\n  metadata: {\n    \"key\": \"value\",\n    \"another_key\": \"another_value\",\n  },\n);\n\n\n\u002F\u002F 获取对话\nOpenAIConversation conversation = await OpenAI.instance.conversations.get(\n  conversationId: \"conversation-id-here\",\n);\n\n\u002F\u002F 更新对话\nOpenAIConversation updatedConversation = await OpenAI.instance.conversations.update(\n  conversationId: \"conversation-id\",\n  metadata: {\n    \"key\": \"new_value\",\n  },\n);\n\n\u002F\u002F 删除对话\n await OpenAI.instance.conversations.delete(\n  conversationId: \"conversation-id-here\",\n);\n\n\u002F\u002F 列出项目\nOpenAIConversationItemsResponse itemsList = await OpenAI.instance.conversations.listItems(\n  conversationId: \"conversation-id-here\",\n  limit: 10, \n);\n\n\u002F\u002F 创建条目\nOpenAIConversationItem item = await OpenAI.instance.conversations.createItems(\n  conversationId: \"conversation-id-here\",\n  items: [\n    \u002F\u002F ...\n  ],\n);\n\n\u002F\u002F 获取条目\nOpenAIConversationItem item = await OpenAI.instance.conversations.getItem(\n  conversationId: \"conversation-id-here\",\n  itemId: \"item-id-here\",\n);\n\n\u002F\u002F 删除条目\nawait OpenAI.instance.conversations.deleteItem(\n  conversationId: \"conversation-id-here\",\n  itemId: \"item-id-here\",\n);\n```\n\n#### 🎵 音频\n\n```dart\n\u002F\u002F 创建语音\nFile speechFile = await OpenAI.instance.audio.createSpeech(\n  model: \"tts-1\",\n  input: \"要转换为语音的文本\",\n  voice: OpenAIAudioVoice.fable,\n  responseFormat: OpenAIAudioSpeechResponseFormat.mp3,\n  outputDirectory: \"\u002Fpath\u002Fto\u002Foutput\u002Fdirectory\",\n  outputFileName: \"output_speech.mp3\",\n);\n\n\n\u002F\u002F 转录音频\nOpenAITranscriptionGeneralModel transcription = await OpenAI.instance.audio.createTranscription(\n  model: \"whisper-1\",\n  file: File(\"path\u002Fto\u002Faudio.mp3\"),\n  include: [\"logprobs\"],\n  responseFormat: OpenAIAudioResponseFormat.verbose_json,\n  language: \"en\",\n  prompt: \"这是一个用于指导转录的示例提示\",\n);\n\u002F\u002F 处理不同的转录响应格式\nif (transcription is OpenAITranscriptionModel) {\n  print(transcription.logprobs);\n  print(transcription.text);\n  print(transcription.usage);\n} else if (transcription is OpenAITranscriptionVerboseModel) {\n  \u002F\u002F 打印转录内容。\n  print(transcription.text);\n  print(transcription.segments?.map((e) => e.end));\n}\n\n\u002F\u002F 创建翻译\nfinal translationText = await OpenAI.instance.audio.createTranslation(\n  file: File(\"path\u002Fto\u002Faudio.mp3\"),\n  model: \"whisper-1\",\n  prompt: \"使用不常见的英语单词\",\n  responseFormat: OpenAIAudioResponseFormat.json,\n);\n\n```\n\n#### 🎬 视频\n\n\u002F\u002F （待实现）\n\n#### 🎨 图像\n\n```dart\n\u002F\u002F 生成图像\nOpenAIImageModel image = await OpenAI.instance.image.create(\n  model: \"dall-e-3\",\n  prompt: \"太空飞船中的猫的图像\",\n  responseFormat: OpenAIImageResponseFormat.url,\n  size: OpenAIImageSize.size1024,\n  quality: OpenAIImageQuality.standard,\n  style: OpenAIImageStyle.vivid,\n);\n\n\u002F\u002F 编辑图像\nOpenAIImageModel imageEdit = await OpenAI.instance.image.edit(\n  prompt: '一座有山和河流的奇幻景观',\n  image: File(\"path\u002Fto\u002Fimage.png\"),\n  size: OpenAIImageSize.size1024,\n  responseFormat: OpenAIImageResponseFormat.b64Json,\n);\n\n\u002F\u002F 创建变体\nList\u003COpenAIImageModel> imageVariation = await OpenAI.instance.image.variation(\n  model: \"dall-e-2\",\n  image: File(\"path\u002Fto\u002Fimage.png\"),\n  size: OpenAIImageSize.size512,\n  responseFormat: OpenAIImageResponseFormat.url,\n);\n```\n\n#### 🎨 图像流\n\n\u002F\u002F （待实现）\n\n#### 📊 嵌入\n\n```dart\nOpenAIEmbeddingsModel embedding = await OpenAI.instance.embedding.create(\n  model: \"text-embedding-ada-002\",\n  input: \"这是一段示例文本\",\n);\n```\n\n#### ⚖️ 评估\n\n```dart\n\u002F\u002F 创建评估\nOpenAIEval eval = await OpenAI.instance.evals.create(\n  dataSourceConfig: RequestDatatSourceConfig.logs(),\n);\n\n\u002F\u002F 获取评估\nOpenAIEval eval = await OpenAI.instance.evals.get(\n  evalId: \"eval-id-here\",\n);\n\n\u002F\u002F 更新评估\nOpenAIEval updatedEval = await OpenAI.instance.evals.update(\n  evalId: \"eval-id-here\",\n  metadata: {\n    \"key\": \"new_value\",\n  },\n);\n\n\u002F\u002F 删除评估\n await OpenAI.instance.evals.delete(\n  evalId: \"eval-id-here\",\n);\n\n\u002F\u002F 列出评估\nOpenAIEvalsList evalsList = await OpenAI.instance.evals.list(\n  limit: 10, \n);\n\n\u002F\u002F 获取评估运行。\nOpenAIEvalRunsList evalRuns = await OpenAI.instance.evals.getRuns(\n  evalId: \"eval-id-here\",\n  limit: 3, \n);\n\n\u002F\u002F 获取评估运行\nOpenAIEvalRun evalRun = await OpenAI.instance.evals.getRun(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n);\n\n\u002F\u002F 创建运行\nOpenAIEvalRun createdRun = await OpenAI.instance.evals.createRun(\n  evalId: \"eval-id-here\",\n  dataSource: EvalRunDataSource.jsonl(),\n);\n\n\u002F\u002F 取消运行\nOpenAIEvalRun canceledRun = await OpenAI.instance.evals.cancel(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n);\n\n\u002F\u002F 删除运行\n await OpenAI.instance.evals.deleteRun(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n);\n\n\u002F\u002F 获取评估运行的输出项。\nOpenAIEvalRunOutputItem outputItem = await OpenAI.instance.evals.getEvalRunOutputItem(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n  outputItemIdn: \"item-id-here\",\n);\n\n\u002F\u002F 获取评估运行的输出项。\nOpenAIEvalRunOutputItemsList outputItems = await OpenAI.instance.evals.getEvalRunOutputItems(\n  evalId: \"eval-id-here\",\n  runId: \"run-id-here\",\n  limit: 10,\n);\n```\n\n#### 🔧 微调\n\n\u002F\u002F （待实现）\n\n#### 📊 评分器\n\n```dart\n\n\u002F\u002F 评分器\nfinal grader = OpenAIGraders.stringCheckGrader(...);\nfinal grader2 = OpenAIGraders.textSimilarityGrader(...);\nfinal grader3 = OpenAIGraders.scoreModelGrader(...);\nfinal grader4 = OpenAIGraders.labelModelGrader(...);\nfinal grader5 = OpenAIGraders.pythonGrader(...);\nfinal grader6 = OpenAIGraders.multiGrader(...);\n\n\u002F\u002F 运行评分器\nfinal grader = await OpenAI.instance.graders.runGrader(\n grader: grader,\n modelSample: \"待评分的模型输出\", \n);\n\n\u002F\u002F 验证评分器\nfinal isValid = OpenAI.instance.graders.validateGrader(\n  grader: grader\n);\n```\n\n#### 📦 批处理\n\n\u002F\u002F （待实现）\n\n#### 📁 文件\n\n```dart\n\u002F\u002F 上传文件\nOpenAIFileModel file = await OpenAI.instance.files.upload(\n  file: File(\"path\u002Fto\u002Ffile.jsonl\"),\n  purpose: \"assistants\",\n);\n\n\u002F\u002F 列出文件\nList\u003COpenAIFileModel> files = await OpenAI.instance.files.list(\n  limit: 10,\n);\n\n\u002F\u002F 检索文件\nOpenAIFileModel file = await OpenAI.instance.files.retrieve(\n   \"file_id\" \n);\n\n\u002F\u002F 删除文件\nawait OpenAI.instance.files.delete(\"file-id-here\");\n\n\u002F\u002F 检索文件内容\nfinal content = await OpenAI.instance.files.retrieveContent(\n  \"file_id\"\n);\n```\n\n#### 📤 上传\n\n\u002F\u002F （待实现）\n\n#### 🤖 模型\n\n```dart\n\u002F\u002F 列出所有可用的模型\nList\u003COpenAIModelModel> models = await OpenAI.instance.model.list();\n\n\u002F\u002F 检索特定模型\nOpenAIModelModel model = await OpenAI.instance.model.retrieve(\"gpt-3.5-turbo\");\n\n\u002F\u002F 删除微调后的模型\nbool deleted = await OpenAI.instance.model.delete(\"fine-tuned-model-id\");\n```\n\n#### 🛡️ 内容审核\n\n```dart\nOpenAIModerationModel moderation = await OpenAI.instance.moderation.create(\n  input: [\"需要进行内容审核的文本\"],\n  model: \"omni-moderation-latest\",\n);\n```\n\n#### 🗃️ 向量存储\n\n##### 向量存储\n\n```dart\n\u002F\u002F 创建向量存储\n  OpenAIVectorStoreModel vectorStore = await OpenAI.instance.vectorStores.vectorStores.create(\n    name: \"example_vector_store\",\n    chunkingStrategy: OpenAIVectorStoreChunkingStrategy.static(\n      chunkOverlapTokens: 300,\n      maxChunkSizeTokens: 750,\n    ),\n    expiresAfter: OpenAIVectorStoreExpiresAfter(\n      anchor: \"last_active_at\",\n      days: 1,\n    ),\n  ); \n\n  \u002F\u002F 列出向量存储\n OpenAIVectorStoreListModel allVEctorStores = await OpenAI.instance.vectorStores.vectorStores.list(limit: 30);\n\n \u002F\u002F 获取向量存储\n final firstVectorStoreAsync = await OpenAI.instance.vectorStores.vectorStores.get(\n   vectorStoreId: \"vector_store_id\",\n );\n\n\u002F\u002F 修改向量存储\nfinal updatedVectorStore = await OpenAI.instance.vectorStores.vectorStores.modify(\n  vectorStoreId: \"vector_store_id\",\n  name: \"updated_vector_store_name\",\n);\n\n\u002F\u002F 删除向量存储\nawait OpenAI.instance.vectorStores.vectorStores.delete(\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F 在向量存储中搜索\nfinal searchVEctorStoreResult = await OpenAI.instance.vectorStores.vectorStores.search(\n   vectorStoreId: updatedVectorStore.id,\n   query: \"example\",\n   maxNumResults: 10,\n   filters: OpenAIVectorStoresSearchFilter.comparison(\n     type: \"eq\",\n     key: \"metadata.example_key\",\n     value: \"example_value\",\n   ),\n   rankingOptions: OpenAIVectorStoresRankingOptions(\n     ranker: \"none\",\n     scoreThreshold: 0,\n   ),\n);\n\n```\n\n##### 向量存储文件\n\n```dart\n\n\u002F\u002F 创建向量存储文件\nfinal createdVectorStoreFile = await OpenAI.instance.vectorStores.vectorStoresFiles.create(\n  vectorStoreId: \"vector_store_id\",\n  fileId: \"file_id\",\n  attributes: {\n    \"chapter\": \"Chapter 1\",\n  },\n  chunckingStrategy: OpenAIVectorStoreChunkingStrategy.static(\n    chunkOverlapTokens: 300,\n    maxChunkSizeTokens: 750,\n  ),\n);\n\n\u002F\u002F 列出向量存储文件\nfinal vectorStoreFiles = await OpenAI.instance.vectorStores.vectorStoresFiles.list(\n  vectoreStoreId: \"vector_store_id\",\n  limit: 60,\n);\n\n\u002F\u002F 获取向量存储文件\nfinal vectorStoreFile = await OpenAI.instance.vectorStores.vectorStoresFiles.get(\n  fileId: \"file_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F 获取向量存储文件内容\nfinal vectorStoreFileContent = await OpenAI.instance.vectorStores.vectorStoresFiles.getContent(\n  fileId: \"file_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F 更新向量存储文件\nfinal updatedVectorStoreFile = await OpenAI.instance.vectorStores.vectorStoresFiles.update(\n  fileId: \"file_id\",\n  vectorStoreId: \"vector_store_id\",\n  attributes: {\n    \"chapter\": \"Updated Chapter 1\",\n  },\n);\n\n\u002F\u002F 删除向量存储文件\nawait OpenAI.instance.vectorStores.vectorStoresFiles.delete(\n  fileId: \"file_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n```\n\n##### 向量存储文件批次\n\n```dart\n\n\u002F\u002F 创建向量存储文件批次\nfinal vectoreStoreFileBatch = await OpenAI.instance.vectorStores.vectorStoreFileBatch.create(\n  vectorStoreId: \"vector_store_id\",\n  chunkingStrategy: OpenAIVectorStoreChunkingStrategy.static(\n    chunkOverlapTokens: 200,\n    maxChunkSizeTokens: 550,\n  ),\n  attributes: {\n    \"batch_name\": \"My First Batch\",\n  },\n  fileIds: [\"file-abc123\", \"file-def456\"],\n);\n\n\u002F\u002F 获取向量存储文件批次\nfinal batch = await OpenAI.instance.vectorStores.vectorStoreFileBatch.get(\n  batchId: \"batch_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F 取消向量存储文件批次\nfinal cancelledBatch = await OpenAI.instance.vectorStores.vectorStoreFileBatch.cancel(\n  batchId: \"batch_id\",\n  vectorStoreId: \"vector_store_id\",\n);\n\n\u002F\u002F 列出批次中的向量存储文件\nfinal vectorStoreBatchFiles = await OpenAI.instance.vectorStores.vectorStoreFileBatch.list(\n  vectorStoreId: \"vector_store_id\",\n  batchId: 'batch_id',\n);\n\n```\n\n#### 📦 容器\n\n##### 容器\n\n```dart\n\u002F\u002F 创建容器\nfinal container = await OpenAI.instance.container.containers.create(\n  name: \"my special container\",\n);\n\n\u002F\u002F 列出容器\nfinal containers = await OpenAI.instance.container.containers.list(\n  limit: 20,\n);\n\n\u002F\u002F 获取容器\nfinal firstContainer = await OpenAI.instance.container.containers.get(\n  containerId: \"container_id\",\n);\n\n\u002F\u002F 删除容器\nawait OpenAI.instance.container.containers.delete(\n  containerId: \"container_id\",\n);\n\n```\n\n##### 容器文件\n\n```dart\n\u002F\u002F 创建容器文件\nfinal containerFile = await OpenAI.instance.container.containerFiles.create(\n  file: File(\"path\u002Fto\u002Ffile\"),\n  containerId: \"container_id\",\n);\n\n\u002F\u002F 获取容器文件\nfinal gotContainerFile = await OpenAI.instance.container.containerFiles.get(\n  containerId: \"container_id\",\n  fileId: \"file_id\",\n);\n\n\u002F\u002F 获取容器文件内容\nfinal gotContainerFileContent =\n    await OpenAI.instance.container.containerFiles.getContent(\n  containerId: \"container_id\",\n  fileId: \"file_id\",\n);\n\n\u002F\u002F 列出容器文件\nfinal allContainerFiles = await OpenAI.instance.container.containerFiles.list(\n  containerId: \"container_id\",\n  limit: 20,\n);\n\n\u002F\u002F 删除容器文件\nawait OpenAI.instance.container.containerFiles.delete(\n  fileId: \"file_id\",\n  containerId: \"container_id\",\n);\n\n```\n\n\n#### 🕛 实时\n\n\u002F\u002F (待实现)\n\n#### 💬 聊天补全\n\n```dart\n\u002F\u002F 基本的聊天补全\nOpenAIChatCompletionModel chat = await OpenAI.instance.chat.create(\n  model: \"gpt-3.5-turbo\",\n  messages: [\n    OpenAIChatCompletionChoiceMessageModel(\n      role: OpenAIChatMessageRole.user,\n      content: \"Hello, how can you help me?\",\n    ),\n  ],\n  temperature: 0.7,\n  maxTokens: 150,\n);\n\n\u002F\u002F 流式聊天补全\nStream\u003COpenAIStreamChatCompletionModel> chatStream = OpenAI.instance.chat.createStream(\n  model: \"gpt-3.5-turbo\",\n  messages: [\n    OpenAIChatCompletionChoiceMessageModel(\n      role: OpenAIChatMessageRole.user,\n      content: \"Tell me a story\",\n    ),\n  ],\n);\n\nchatStream.listen((event) {\n  print(event.choices.first.delta.content);\n});\n```\n\n#### 🤖 管理\n\n\u002F\u002F (待实现)\n\n---\n\n\n\n\n## 🔧 配置\n\n### 环境变量\n\n```dart\n\u002F\u002F 使用 envied 包\n@Envied(path: \".env\")\nabstract class Env {\n  @EnviedField(varName: 'OPEN_AI_API_KEY')\n  static const apiKey = _Env.apiKey;\n}\n\nvoid main() {\n  OpenAI.apiKey = Env.apiKey;\n  runApp(MyApp());\n}\n```\n\n### 自定义配置\n\n```dart\nvoid main() {\n  \u002F\u002F 设置 API 密钥\n  OpenAI.apiKey = \"your-api-key\";\n  \n  \u002F\u002F 设置组织 ID（可选）\n  OpenAI.organization = \"your-org-id\";\n  \n  \u002F\u002F 设置自定义基础 URL（可选）\n  OpenAI.baseUrl = \"https:\u002F\u002Fapi.openai.com\u002Fv1\";\n  \n  \u002F\u002F 设置请求超时时间（可选）\n  OpenAI.requestsTimeOut = Duration(seconds: 60);\n  \n  \u002F\u002F 启用日志记录（可选）\n  OpenAI.showLogs = true;\n  OpenAI.showResponsesLogs = true;\n  \n  runApp(MyApp());\n}\n```\n\n---\n\n## 🚨 错误处理\n\n```dart\ntry {\n  final chat = await OpenAI.instance.chat.create(\n    model: \"gpt-3.5-turbo\",\n    messages: [\n      OpenAIChatCompletionChoiceMessageModel(\n        role: OpenAIChatMessageRole.user,\n        content: \"Hello\",\n      ),\n    ],\n  );\n} on RequestFailedException catch (e) {\n  print(\"请求失败: ${e.message}\");\n  print(\"状态码: ${e.statusCode}\");\n} on MissingApiKeyException catch (e) {\n  print(\"未设置 API 密钥: ${e.message}\");\n} on UnexpectedException catch (e) {\n  print(\"意外错误: ${e.message}\");\n}\n```\n\n---\n\n## 🤝 贡献\n\n我们欢迎贡献！以下是您可以帮助的方式：\n\n### 🐛 错误报告\n\n- 使用 [GitHub Issues](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues) 报告错误\n- 包括复现步骤和环境详情\n\n### 💡 功能请求\n\n- 通过 [GitHub Issues](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues) 提出新功能建议\n- 在创建新问题之前，请先检查现有问题\n\n### 🔧 代码贡献\n\n- 分叉仓库\n- 创建特性分支\n- 进行更改\n- 如果适用，添加测试\n- 提交拉取请求\n\n### 📚 文档\n\n- 帮助改进文档\n- 为缺失的功能添加示例\n- 修复拼写错误并提高清晰度\n\n### 💰 赞助\n\n- [赞助该项目](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fanasfik)\n- 帮助维护和改进这个包\n\n---\n\n## 📜 许可证\n\n本项目采用 MIT 许可证授权——详情请参阅 [LICENSE](LICENSE) 文件。\n\n---\n\n## 🙏 致谢\n\n- 感谢 **OpenAI** 提供的优秀 AI 模型和 API\n- 感谢帮助维护和改进本包的 **贡献者**\n- 感谢在经济上支持本项目的 **赞助者**\n- 感谢提供反馈和建议的 **社区**\n\n---\n\n## 📞 支持\n\n- 📖 [完整文档](https:\u002F\u002Fpub.dev\u002Fdocumentation\u002Fdart_openai\u002Flatest\u002F)\n- 🐛 [报告问题](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues)\n- 💬 [讨论区](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fdiscussions)\n- 📧 [联系](https:\u002F\u002Fgithub.com\u002Fanasfik)\n\n---\n\n\u003Cdiv align=\"center\">\n\n\n**由 Dart OpenAI 社区用心打造**\n\n[⭐ 给这个仓库点个星](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai) • [🐛 报告 Bug](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues) • [💡 请求功能](https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues) • [📖 文档](https:\u002F\u002Fpub.dev\u002Fdocumentation\u002Fdart_openai\u002Flatest\u002F)\n\n\u003C\u002Fdiv>","# Dart OpenAI 快速上手指南\n\n## 环境准备\n\n在开始之前，请确保您的开发环境满足以下要求：\n\n- **操作系统**：Windows、macOS 或 Linux\n- **运行时环境**：已安装 [Dart SDK](https:\u002F\u002Fdart.dev\u002Fget-dart) (推荐最新稳定版) 或 [Flutter SDK](https:\u002F\u002Fdocs.flutter.dev\u002Fget-started\u002Finstall)\n- **依赖项**：有效的 OpenAI API Key\n- **网络环境**：能够访问 `pub.dev` 和 OpenAI API 服务（国内开发者如遇网络问题，建议配置代理或使用国内镜像源）\n\n> **注意**：本库为社区维护的非官方客户端，OpenAI 官方暂未发布 Dart 版本 SDK。\n\n## 安装步骤\n\n### 1. 添加依赖\n\n打开项目的 `pubspec.yaml` 文件，在 `dependencies` 部分添加 `dart_openai`：\n\n```yaml\ndependencies:\n  dart_openai: ^latest_version\n```\n\n*注：请将 `^latest_version` 替换为 [pub.dev](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai) 上的最新版本号，或直接运行下方命令自动获取最新版。*\n\n### 2. 获取依赖包\n\n在项目根目录下执行以下命令安装依赖：\n\n```bash\ndart pub get\n```\n\n如果是 Flutter 项目：\n\n```bash\nflutter pub get\n```\n\n> **国内加速提示**：如果下载速度较慢，可临时使用清华大学或上海交大镜像源：\n> ```bash\n> export PUB_HOSTED_URL=https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Fdart-pub\n> flutter pub get\n> ```\n\n## 基本使用\n\n### 1. 初始化配置\n\n在应用启动时（如 `main.dart`），设置您的 API Key 及可选配置：\n\n```dart\nimport 'package:dart_openai\u002Fdart_openai.dart';\n\nvoid main() {\n  \u002F\u002F 必填：设置 OpenAI API Key\n  OpenAI.apiKey = \"your-api-key-here\";\n  \n  \u002F\u002F 可选：设置组织 ID (如有)\n  OpenAI.organization = \"your-org-id\";\n  \n  \u002F\u002F 可选：配置请求超时时间\n  OpenAI.requestsTimeOut = Duration(seconds: 60);\n  \n  \u002F\u002F 可选：开启日志调试\n  OpenAI.showLogs = true;\n  \n  runApp(MyApp());\n}\n```\n\n### 2. 发起第一个对话请求\n\n使用 GPT 模型进行简单的聊天补全：\n\n```dart\n\u002F\u002F 创建聊天完成请求\nfinal chatCompletion = await OpenAI.instance.chat.create(\n  model: \"gpt-3.5-turbo\",\n  messages: [\n    OpenAIChatCompletionChoiceMessageModel(\n      role: OpenAIChatMessageRole.user,\n      content: \"Hello, how are you?\",\n    ),\n  ],\n);\n\n\u002F\u002F 输出回复内容\nprint(chatCompletion.choices.first.message.content);\n```\n\n### 3. 其他核心功能示例\n\n本库支持丰富的 OpenAI 接口，以下是常用功能的简要调用方式：\n\n**生成图片 (DALL-E 3):**\n```dart\nOpenAIImageModel image = await OpenAI.instance.image.create(\n  model: \"dall-e-3\",\n  prompt: \"image of a cat in a spaceship\",\n  size: OpenAIImageSize.size1024,\n);\n```\n\n**语音转文字 (Whisper):**\n```dart\nOpenAITranscriptionGeneralModel transcription = await OpenAI.instance.audio.createTranscription(\n  model: \"whisper-1\",\n  file: File(\"path\u002Fto\u002Faudio.mp3\"),\n  responseFormat: OpenAIAudioResponseFormat.json,\n);\nprint(transcription.text);\n```\n\n**文本嵌入 (Embeddings):**\n```dart\nOpenAIEmbeddingsModel embedding = await OpenAI.instance.embedding.create(\n  model: \"text-embedding-ada-002\",\n  input: \"This is a sample text\",\n);\n```\n\n更多高级用法（如流式传输、微调、评估等）请参考官方文档或仓库中的 Examples 章节。","一位 Flutter 开发者正在构建一款跨平台的智能旅行助手应用，需要集成聊天对话、行程图片生成及语音交互功能。\n\n### 没有 openai 时\n- **重复造轮子**：由于 OpenAI 官方未提供 Dart 库，开发者必须手动封装复杂的 HTTP 请求、签名认证及 JSON 解析逻辑，耗费大量时间且容易出错。\n- **流式体验缺失**：实现类似 ChatGPT 的打字机效果极其困难，需自行处理底层 Socket 或 SSE 数据流，导致用户等待响应时界面卡顿，体验割裂。\n- **多模态整合繁琐**：若要同时支持 GPT 文本、DALL-E 绘图和 Whisper 语音，需分别维护三套独立的网络代码，项目结构混乱且难以统一错误处理。\n- **调试黑盒**：缺乏内置的日志与标准化异常捕获机制，遇到 API 限流或格式错误时，排查问题如同大海捞针，严重拖慢迭代速度。\n\n### 使用 openai 后\n- **开箱即用**：通过简单的 `pubspec.yaml` 配置即可引入，仅需一行代码设置 API Key，立刻获得与官方文档高度一致的直观调用接口。\n- **原生流式支持**：直接调用内置的 Stream 方法，轻松实现流畅的逐字输出效果，完美契合 Flutter 的响应式 UI 更新机制。\n- **全功能统一**：在一个包内无缝切换聊天、绘图（DALL-E）和语音（Whisper）接口，代码风格统一，大幅降低了多模态功能的开发门槛。\n- **稳健可观测**：内置完善的错误处理模型和可选日志开关，能清晰定位网络超时或参数错误，让开发与维护过程透明高效。\n\nopenai 将原本数周的底层通信基建工作压缩至几小时，让 Flutter 团队能专注于核心业务逻辑与创新体验的打磨。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fanasfik_openai_779466f1.png","anasfik","Anas Fikhi","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fanasfik_8c9b73ff.png","Guess Whyyy",null,"Marrakesh, Morocco","work@gwhyyy.com","https:\u002F\u002Fgwhyyy.com","https:\u002F\u002Fgithub.com\u002Fanasfik",[83],{"name":84,"color":85,"percentage":86},"Dart","#00B4AB",100,659,229,"2026-04-08T16:52:14","MIT","未说明 (跨平台，取决于 Dart\u002FFlutter 支持的系统)","不需要 (此为 API 客户端库，计算在云端进行)","未说明",{"notes":95,"python":96,"dependencies":97},"这是一个非官方的 Dart\u002FFlutter 客户端库，用于调用 OpenAI API。它本身不包含 AI 模型，因此无需本地 GPU、大内存或特定 Python 环境。用户只需在代码中配置 API Key 即可使用，运行环境需求等同于普通的 Dart 或 Flutter 应用开发环境。","不需要 (基于 Dart 语言)",[98,99],"dart_openai","Flutter\u002FDart SDK",[15,13,52,35,14],[102,103,104,105,64,106,107,108,109,110,111,112],"dart","dart-library","dart-package","dartlang","openai-api","ai","dall-e","dall-e-api","gpt-3","gpt3","flutter","2026-03-27T02:49:30.150509","2026-04-09T20:51:44.805773",[116,121,126,131,136,141,146,151],{"id":117,"question_zh":118,"answer_zh":119,"source_url":120},26548,"如何处理工具调用（toolCalls）并避免序列化错误？","在构建响应消息时，确保使用正确的模型构造方法。如果遇到 `Converting object to an encodable object failed` 错误，请升级到最新版本（如 5.0.0），该版本已修复此序列化问题。代码示例：\n```dart\nfinal functionMessage = OpenAIChatCompletionChoiceMessageModel(\n  content: [\n    OpenAIChatCompletionChoiceMessageContentItemModel.text(functionResponse),\n  ],\n  role: OpenAIChatMessageRole.tool,\n).asRequestFunctionMessage(toolCallId: toolCall.id!);\nmessageToSend.add(functionMessage);\n```","https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues\u002F127",{"id":122,"question_zh":123,"answer_zh":124,"source_url":125},26549,"发送包含图片的聊天请求时出现 'image_url' 类型错误怎么办？","这是一个已知 bug，旧版本（如 5.1.0）生成的 JSON 格式不符合 OpenAI API 要求（将对象误生成为字符串）。错误信息通常为 `expected an object, but got a string instead`。解决方案是立即更新到最新的包版本，维护者已在后续版本中修复了 `OpenAIChatCompletionChoiceMessageContentItemModel.imageUrl` 的序列化逻辑。","https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues\u002F176",{"id":127,"question_zh":128,"answer_zh":129,"source_url":130},26550,"为什么在 Flutter Web 上流式响应（Stream）只在请求结束时返回数据？","这是旧版本在 Web 平台上的兼容性问题。维护者已通过条件导入 `dart.library.js` 和 `dart.library.io` 修复了该问题，现在无需手动配置 `OpenAI.isWeb`。请将包升级到最新版本（如 4.1.4 或更高），流式响应即可在 Web 端正常工作。","https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues\u002F103",{"id":132,"question_zh":133,"answer_zh":134,"source_url":135},26551,"如何修改 OpenAI 的基础 URL（baseURL）以使用代理或特定区域节点？","由于部分地区无法直接访问官方 API，可以通过配置修改 `baseUrl`。该功能已在版本 1.8.3 中合并可用。您可以在初始化配置时设置自定义的 base URL，以便通过代理服务器转发请求。","https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues\u002F15",{"id":137,"question_zh":138,"answer_zh":139,"source_url":140},26552,"遇到 'meta' 包版本冲突导致依赖解析失败如何解决？","当出现 `flutter_test` 依赖 `meta 1.8.0` 而项目需要 `meta ^1.9.0` 的冲突时，请尝试更新 `dart_openai` 到最新版本（如 1.1.0 或更高），新版本通常已调整依赖范围以兼容 SDK 中的测试包。","https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues\u002F2",{"id":142,"question_zh":143,"answer_zh":144,"source_url":145},26553,"使用 Transcription 功能时遇到 'Stream has already been listened to' 错误怎么办？","该错误表明音频流被多次监听。在处理转录请求时，确保传入的音频流（Stream）只被消费一次。如果需要在多处使用数据，请先将流转换为列表或文件后再传递，避免重复订阅同一个流控制器。","https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues\u002F139",{"id":147,"question_zh":148,"answer_zh":149,"source_url":150},26554,"completion.createStream 似乎没有输出就直接结束了，是什么原因？","这通常不是库的问题，而是模型选择导致的。例如，使用 `text-davinci-003` 模型时，其返回结果可能非常短（仅几个词），导致流迅速结束。建议检查使用的模型名称，或尝试切换到 `gpt-3.5-turbo` 等模型进行测试。","https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues\u002F17",{"id":152,"question_zh":153,"answer_zh":154,"source_url":155},26555,"当前是否支持 Azure OpenAI 服务？","截至目前，该库对 Azure OpenAI 的原生支持尚未完成并合并。虽然有社区贡献者在推进，但因缺乏有效的 Azure 测试账户进行验证，相关进度已暂停。建议暂时使用其他专门支持 Azure 的 Dart 包，或关注官方后续更新。","https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fissues\u002F43",[157,162,167,172,177,182,186,190,194,198,202,206,210,214,218,222],{"id":158,"version":159,"summary_zh":160,"released_at":161},171789,"v6.0.0","## 变更内容\n* [音频] createTranscription 新增了 `timestamp_granularities[]` 请求参数，并更新了响应对象，由 @mihirshahxenlabs 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F157 中完成\n* postStream() 中因 jsonDecode(data) 导致的未处理异常，由 @masa8 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F153 中修复\n* [编辑] 修复聊天补全功能及可选参数，由 @lollipopkit 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F148 中完成\n* 从 ChatGPT 示例中移除 toolChoice 参数，由 @thomasdf 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F145 中完成\n* 修复：OpenAIChatCompletionChoiceMessageContentItemModel.im… 中的类型问题，由 @zmhu 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F144 中完成\n* 文档：编辑函数名称，由 @y0u-0 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F141 中完成\n* 为 gpt-4-vision 增加 imageBase64 能力，不再仅支持图片 URL，由 @jber18 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F166 中完成\n* 将 imageUrls 的 JSON 语法改为对象格式，而非字符串格式，由 @Mia-Ameisbichler 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F171 中完成\n* 将 “max_tokens” 重命名为 “max_completion_tokens”，并添加动态参数，由 @nafiskabbo 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F214 中完成\n* 功能：新增指定要创建的嵌入维度的功能，由 @MatthiasKi 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F211 中完成\n* 为 Whisper 添加 chunking_strategy 支持 #212，由 @DitriXNew 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F213 中完成\n* 修复（模型）：将 image_url 从字符串改为对象格式，符合 OpenAI API 规范，由 @MbBrainz 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F198 中完成\n* 更新 responseFormat 类型，由 @VadymMatus 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F208 中完成\n* 更新 README.md，由 @bashka411 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F197 中完成\n* 为 postStream API 添加超时设置，由 @kyakuno 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F194 中完成\n* 特性：支持动态 responseFormat，由 @DuzziG 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F193 中完成\n* 将所有拼写错误的 “Wether” 替换为 “Whether”，由 @luxun1910 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F192 中完成\n* 示例：获取语音的字节数据，而非直接保存到文件，由 @dylandhall 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F177 中完成\n* 修复：\u002Fchat 接口请求体的兼容性问题，由 @lollipopkit 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F178 中完成\n* 添加 stream_options 属性，用于获取 token 使用情况，由 @dominic-deantonio 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F180 中完成\n\n## 新贡献者\n* @mihirshahxenlabs 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F157 中完成了首次贡献\n* @masa8 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F153 中完成了首次贡献\n* @lollipopkit 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F148 中完成了首次贡献\n* @thomasdf 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F145 中完成了首次贡献\n* @y0u-0 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F141 中完成了首次贡献\n* @jber18 在 https:\u002F\u002Fgithub.com\u002Fanasfik\u002Fopenai\u002Fpull\u002F166 中完成了首次贡献\n* @Mia-Ameisbichler 在 https:\u002F\u002Fgithub.com\u002Fanas","2025-11-08T22:20:53",{"id":163,"version":164,"summary_zh":165,"released_at":166},171790,"v5.0.0","## 发布说明\n\n- 修复了 `RequestFunctionMessage` 类的 `toMap()` 方法中的一个 bug。\n- 进行了一些小幅改动。\n- 增加并改进了文档。\n- 发布了关于聊天补全相关方法即将发生破坏性变更的通知，以更好地支持 OpenAI Vision 功能和 JSON 模式。","2023-11-22T03:23:06",{"id":168,"version":169,"summary_zh":170,"released_at":171},171791,"v4.1.5","## 发布说明：\n\n- 移除了用于手动配置包以使用 `fetch_client` 而不是 `http_client` 的公开字段 `isWeb`，转而采用 `dart.library.js` 和 `dart.library.io` 的条件导入机制，自动检测平台并选择合适的客户端。\n- 新增了一个公开字段，用于在 Web 应用（如 Flutter Web 等）中配置包以使用 `fetch_client` 而不是 `http_client` 来发起请求。\n- 在音频模块中新增了语音转文本方法，并附带相关文档和示例代码。\n- 将聊天 API 中已弃用的 `_functions_` 和 `function_call` 迁移到使用新的字段（如 `tools` 等），并确认其在异步响应和流式响应中均能正常工作。\n- 公开了用于控制所有内部客户端方法请求超时时间的 API。\n- 为聊天完成 API 新增了支持图像和文本的多内容调用功能。","2023-11-18T00:08:26",{"id":173,"version":174,"summary_zh":175,"released_at":176},171792,"v4.1.2","## 发布说明：\n- 禁用了用于调试的打印方法。\n\n\u003Cbr>\n\n将其安装到您的 Dart\u002FFlutter 应用中，访问地址如下：\n- [https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)","2023-11-08T21:44:43",{"id":178,"version":179,"summary_zh":180,"released_at":181},171793,"v4.1.1","## 发布说明\n- 修复了图像变体方法中未生效的 `n` 参数。\n- 对其他图像 API 方法公开了不会破坏兼容性的 `model` 参数。\n- 修复了各类 bug 和问题。\n- 跟进了 OpenAI API 的更多变更。\n- 为该包添加了更多文档。\n- 为该包增加了更多示例。\n- 为该包增加了更多测试。\n\n\u003Cbr>\n\n您可以通过以下链接将其安装到您的 Dart\u002FFlutter 应用中：\n- [https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai](https:\u002F\u002Fpub.dev\u002Fpackages\u002Fdart_openai)","2023-11-08T21:32:37",{"id":183,"version":184,"summary_zh":77,"released_at":185},171794,"1.9.1","2023-03-27T00:12:29",{"id":187,"version":188,"summary_zh":77,"released_at":189},171795,"1.8.4","2023-03-22T18:03:30",{"id":191,"version":192,"summary_zh":77,"released_at":193},171796,"1.8.0","2023-03-09T11:39:17",{"id":195,"version":196,"summary_zh":77,"released_at":197},171797,"1.6.1","2023-03-08T17:53:38",{"id":199,"version":200,"summary_zh":77,"released_at":201},171798,"1.5.5","2023-03-02T22:33:43",{"id":203,"version":204,"summary_zh":77,"released_at":205},171799,"1.4.8","2023-02-17T20:43:22",{"id":207,"version":208,"summary_zh":77,"released_at":209},171800,"1.4.6","2023-02-14T01:48:26",{"id":211,"version":212,"summary_zh":77,"released_at":213},171801,"1.4.4","2023-02-12T16:40:57",{"id":215,"version":216,"summary_zh":77,"released_at":217},171802,"1.4.0","2023-02-11T14:13:35",{"id":219,"version":220,"summary_zh":77,"released_at":221},171803,"1.3.0","2023-02-11T12:42:12",{"id":223,"version":224,"summary_zh":77,"released_at":225},171804,"releases","2023-02-10T18:10:44"]