openai

GitHub
659 229 简单 1 次阅读 昨天MIT图像Agent插件语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

openai 是一款专为 Dart 和 Flutter 开发者打造的非官方 SDK,旨在帮助开发者轻松地将 ChatGPT、DALL-E 图像生成、Whisper 语音处理等 OpenAI 前沿人工智能模型集成到自己的应用中。由于 OpenAI 官方尚未提供 Dart 语言的原生支持,这款工具填补了生态空白,让使用 Flutter 构建跨平台应用的团队也能无缝调用强大的 AI 能力。

它主要解决了开发者在对接 OpenAI 复杂接口时面临的配置繁琐、流式响应处理困难以及错误调试不便等痛点。通过封装简洁直观的 API,openai 将复杂的网络请求转化为简单的代码调用,并内置了完善的异常处理与日志记录机制。

该工具非常适合使用 Dart 或 Flutter 进行移动的端、Web 或桌面应用开发的软件工程师。其核心技术亮点包括对实时流式传输(Streaming)的完整支持,能够实现聊天回复或图像生成的逐字/逐块渲染,显著提升用户体验;同时支持一次性全局认证配置和自定义超时设置,兼顾了开发效率与运行稳定性。此外,项目提供了丰富的示例代码,覆盖从基础对话到高级微调的各类场景,帮助开发者快速上手并构建智能化应用。

使用场景

一位 Flutter 开发者正在构建一款跨平台的智能旅行助手应用,需要集成聊天对话、行程图片生成及语音交互功能。

没有 openai 时

  • 重复造轮子:由于 OpenAI 官方未提供 Dart 库,开发者必须手动封装复杂的 HTTP 请求、签名认证及 JSON 解析逻辑,耗费大量时间且容易出错。
  • 流式体验缺失:实现类似 ChatGPT 的打字机效果极其困难,需自行处理底层 Socket 或 SSE 数据流,导致用户等待响应时界面卡顿,体验割裂。
  • 多模态整合繁琐:若要同时支持 GPT 文本、DALL-E 绘图和 Whisper 语音,需分别维护三套独立的网络代码,项目结构混乱且难以统一错误处理。
  • 调试黑盒:缺乏内置的日志与标准化异常捕获机制,遇到 API 限流或格式错误时,排查问题如同大海捞针,严重拖慢迭代速度。

使用 openai 后

  • 开箱即用:通过简单的 pubspec.yaml 配置即可引入,仅需一行代码设置 API Key,立刻获得与官方文档高度一致的直观调用接口。
  • 原生流式支持:直接调用内置的 Stream 方法,轻松实现流畅的逐字输出效果,完美契合 Flutter 的响应式 UI 更新机制。
  • 全功能统一:在一个包内无缝切换聊天、绘图(DALL-E)和语音(Whisper)接口,代码风格统一,大幅降低了多模态功能的开发门槛。
  • 稳健可观测:内置完善的错误处理模型和可选日志开关,能清晰定位网络超时或参数错误,让开发与维护过程透明高效。

openai 将原本数周的底层通信基建工作压缩至几小时,让 Flutter 团队能专注于核心业务逻辑与创新体验的打磨。

运行环境要求

操作系统
  • 未说明 (跨平台,取决于 Dart/Flutter 支持的系统)
GPU

不需要 (此为 API 客户端库,计算在云端进行)

内存

未说明

依赖
notes这是一个非官方的 Dart/Flutter 客户端库,用于调用 OpenAI API。它本身不包含 AI 模型,因此无需本地 GPU、大内存或特定 Python 环境。用户只需在代码中配置 API Key 即可使用,运行环境需求等同于普通的 Dart 或 Flutter 应用开发环境。
python不需要 (基于 Dart 语言)
dart_openai
Flutter/Dart SDK
openai hero image

快速开始

🚀 Dart OpenAI

GitHub 提交活动 GitHub 贡献者 GitHub 仓库星标 GitHub 工作流状态 GitHub 工作流状态 GitHub Pub 版本 Pub 点赞数 Pub 分数 Pub 流行度

一个全面的 Dart/Flutter 客户端,用于访问 OpenAI 强大的 AI 模型

快速入门文档示例API 覆盖范围贡献


✨ 概述

Dart OpenAI 是一个 非官方 但功能全面的客户端库,使开发者能够轻松地将 OpenAI 的最先进 AI 模型集成到他们的 Dart/Flutter 应用程序中。该库提供了简单直观的方法来向 OpenAI 的各种 API 发送请求,包括 GPT 模型、DALL-E 图像生成、Whisper 音频处理等。

⚠️ 注意: 这是一个 非官方 包。OpenAI 并没有官方的 Dart 库。

🎯 主要特性

  • 🚀 易于集成 - 简单直观的 API,与 OpenAI 文档一致
  • 🔐 安全的身份验证 - 一次性设置,可在应用程序的任何地方使用
  • 📡 流式支持 - 实时流式传输完成、聊天和微调事件
  • 🛠️ 开发者友好 - 全面的错误处理和日志记录
  • 📚 丰富的示例 - 为每个实现的功能提供即用型示例
  • 🎨 现代 UI 支持 - 针对 Flutter 应用程序进行了优化
  • 🔄 自定义 API - 额外的自定义端点以增强功能

🚀 快速入门

安装

将该包添加到你的 pubspec.yaml 文件中:

dependencies:
  dart_openai: 

基本设置

import 'package:dart_openai/dart_openai.dart';

void main() {
  // 设置你的 API 密钥
  OpenAI.apiKey = "your-api-key-here";
  
  // 可选:设置组织 ID
  OpenAI.organization = "your-org-id";
  
  // 可选:配置超时时间
  OpenAI.requestsTimeOut = Duration(seconds: 60);
  
  // 可选:启用日志记录
  OpenAI.showLogs = true;
  
  runApp(MyApp());
}

第一个 API 调用

// 简单的聊天完成
final chatCompletion = await OpenAI.instance.chat.create(
  model: "gpt-3.5-turbo",
  messages: [
    OpenAIChatCompletionChoiceMessageModel(
      role: OpenAIChatMessageRole.user,
      content: "你好,最近怎么样?",
    ),
  ],
);

print(chatCompletion.choices.first.message.content);

📊 API 覆盖范围(2025年)

API 功能 状态 详情 最后更新
📋 响应 ✅ 完整 全部 11-08-2025 17:33:39
💭 对话 ✅ 完整 全部 11-08-2025 17:38:56
🎵 音频 ✅ 完整 全部 11-08-2025 17:42:54
🎬 视频 🗓️ 计划中 -
🎨 图像 ✅ 完整 全部 11-08-2025 17:53:45
🎨 图像流式传输 🗓️ 计划中 -
📊 嵌入 ✅ 完整 全部 11-08-2025 17:56:30
⚖️ 评估 ✅ 完整 全部 11-08-2025 21:04:36
🔧 微调 🧩 完成 70% 缺少较新的端点
📊 评分器 ✅ 完整 全部 11-08-2025 21:46:48
📦 批处理 🗓️ 计划中 -
📁 文件 ✅ 完整 全部 11-08-2025 21:51:34
📤 上传 🗓️ 计划中 -
🤖 模型 ✅ 完整 全部 11-08-2025 21:53:13
🛡️ 内容审核 ✅ 完整 全部 11-08-2025 21:54:01
🗃️ 向量存储 ✅ 完整 全部 11-19-2025 12:24:15
💬 ChatKit ❌ 未计划 测试版功能
📦 容器 ✅ 完整 全部 11-19-2025 12:24:15
🕛 实时 🗓️ 计划中 -
💬 聊天完成 ✅ 完整 不包括流式功能
🤖 助手 ❌ 未计划 测试版功能
🤖 管理 🗓️ 计划中 -
📝 完成(旧版) ✅ 完整 全部
✏️ 编辑(旧版) ✅ 完整 全部

📚 文档

核心 API

📋 响应

// 创建响应
OpenAiResponse response = await OpenAI.instance.responses.create(
  input: "Your input text here",  
  model: "gpt-4",
);

// 获取响应
OpenAiResponse response = await OpenAI.instance.responses.get(
  responseId: "response-id-here",
  startingAfter: 0, 
);

// 删除响应
await OpenAI.instance.responses.delete(
  responseId: "response-id-here",
);

// 取消响应
OpenAiResponse response = await OpenAI.instance.responses.cancel(
  responseId: "response-id-here",
);

// 列出输入项
OpenAiResponseInputItemsList response = await OpenAI.instance.responses.listInputItems(
  responseId: "response-id-here",
  limit: 10, 
);


// 获取输入 token 数量
int inputTokens = await OpenAI.instance.responses.getInputTokenCounts(
  model: "gpt-5",
  input: "Your input text here",
);

💭 对话

// 创建对话
OpenAIConversation conversation = await OpenAI.instance.conversations.create(
  items: [{
    "type": "message",
    "role": "user",
    "content": "你好!",
  }],
  metadata: {
    "key": "value",
    "another_key": "another_value",
  },
);


// 获取对话
OpenAIConversation conversation = await OpenAI.instance.conversations.get(
  conversationId: "conversation-id-here",
);

// 更新对话
OpenAIConversation updatedConversation = await OpenAI.instance.conversations.update(
  conversationId: "conversation-id",
  metadata: {
    "key": "new_value",
  },
);

// 删除对话
 await OpenAI.instance.conversations.delete(
  conversationId: "conversation-id-here",
);

// 列出项目
OpenAIConversationItemsResponse itemsList = await OpenAI.instance.conversations.listItems(
  conversationId: "conversation-id-here",
  limit: 10, 
);

// 创建条目
OpenAIConversationItem item = await OpenAI.instance.conversations.createItems(
  conversationId: "conversation-id-here",
  items: [
    // ...
  ],
);

// 获取条目
OpenAIConversationItem item = await OpenAI.instance.conversations.getItem(
  conversationId: "conversation-id-here",
  itemId: "item-id-here",
);

// 删除条目
await OpenAI.instance.conversations.deleteItem(
  conversationId: "conversation-id-here",
  itemId: "item-id-here",
);

🎵 音频

// 创建语音
File speechFile = await OpenAI.instance.audio.createSpeech(
  model: "tts-1",
  input: "要转换为语音的文本",
  voice: OpenAIAudioVoice.fable,
  responseFormat: OpenAIAudioSpeechResponseFormat.mp3,
  outputDirectory: "/path/to/output/directory",
  outputFileName: "output_speech.mp3",
);


// 转录音频
OpenAITranscriptionGeneralModel transcription = await OpenAI.instance.audio.createTranscription(
  model: "whisper-1",
  file: File("path/to/audio.mp3"),
  include: ["logprobs"],
  responseFormat: OpenAIAudioResponseFormat.verbose_json,
  language: "en",
  prompt: "这是一个用于指导转录的示例提示",
);
// 处理不同的转录响应格式
if (transcription is OpenAITranscriptionModel) {
  print(transcription.logprobs);
  print(transcription.text);
  print(transcription.usage);
} else if (transcription is OpenAITranscriptionVerboseModel) {
  // 打印转录内容。
  print(transcription.text);
  print(transcription.segments?.map((e) => e.end));
}

// 创建翻译
final translationText = await OpenAI.instance.audio.createTranslation(
  file: File("path/to/audio.mp3"),
  model: "whisper-1",
  prompt: "使用不常见的英语单词",
  responseFormat: OpenAIAudioResponseFormat.json,
);

🎬 视频

// (待实现)

🎨 图像

// 生成图像
OpenAIImageModel image = await OpenAI.instance.image.create(
  model: "dall-e-3",
  prompt: "太空飞船中的猫的图像",
  responseFormat: OpenAIImageResponseFormat.url,
  size: OpenAIImageSize.size1024,
  quality: OpenAIImageQuality.standard,
  style: OpenAIImageStyle.vivid,
);

// 编辑图像
OpenAIImageModel imageEdit = await OpenAI.instance.image.edit(
  prompt: '一座有山和河流的奇幻景观',
  image: File("path/to/image.png"),
  size: OpenAIImageSize.size1024,
  responseFormat: OpenAIImageResponseFormat.b64Json,
);

// 创建变体
List<OpenAIImageModel> imageVariation = await OpenAI.instance.image.variation(
  model: "dall-e-2",
  image: File("path/to/image.png"),
  size: OpenAIImageSize.size512,
  responseFormat: OpenAIImageResponseFormat.url,
);

🎨 图像流

// (待实现)

📊 嵌入

OpenAIEmbeddingsModel embedding = await OpenAI.instance.embedding.create(
  model: "text-embedding-ada-002",
  input: "这是一段示例文本",
);

⚖️ 评估

// 创建评估
OpenAIEval eval = await OpenAI.instance.evals.create(
  dataSourceConfig: RequestDatatSourceConfig.logs(),
);

// 获取评估
OpenAIEval eval = await OpenAI.instance.evals.get(
  evalId: "eval-id-here",
);

// 更新评估
OpenAIEval updatedEval = await OpenAI.instance.evals.update(
  evalId: "eval-id-here",
  metadata: {
    "key": "new_value",
  },
);

// 删除评估
 await OpenAI.instance.evals.delete(
  evalId: "eval-id-here",
);

// 列出评估
OpenAIEvalsList evalsList = await OpenAI.instance.evals.list(
  limit: 10, 
);

// 获取评估运行。
OpenAIEvalRunsList evalRuns = await OpenAI.instance.evals.getRuns(
  evalId: "eval-id-here",
  limit: 3, 
);

// 获取评估运行
OpenAIEvalRun evalRun = await OpenAI.instance.evals.getRun(
  evalId: "eval-id-here",
  runId: "run-id-here",
);

// 创建运行
OpenAIEvalRun createdRun = await OpenAI.instance.evals.createRun(
  evalId: "eval-id-here",
  dataSource: EvalRunDataSource.jsonl(),
);

// 取消运行
OpenAIEvalRun canceledRun = await OpenAI.instance.evals.cancel(
  evalId: "eval-id-here",
  runId: "run-id-here",
);

// 删除运行
 await OpenAI.instance.evals.deleteRun(
  evalId: "eval-id-here",
  runId: "run-id-here",
);

// 获取评估运行的输出项。
OpenAIEvalRunOutputItem outputItem = await OpenAI.instance.evals.getEvalRunOutputItem(
  evalId: "eval-id-here",
  runId: "run-id-here",
  outputItemIdn: "item-id-here",
);

// 获取评估运行的输出项。
OpenAIEvalRunOutputItemsList outputItems = await OpenAI.instance.evals.getEvalRunOutputItems(
  evalId: "eval-id-here",
  runId: "run-id-here",
  limit: 10,
);

🔧 微调

// (待实现)

📊 评分器


// 评分器
final grader = OpenAIGraders.stringCheckGrader(...);
final grader2 = OpenAIGraders.textSimilarityGrader(...);
final grader3 = OpenAIGraders.scoreModelGrader(...);
final grader4 = OpenAIGraders.labelModelGrader(...);
final grader5 = OpenAIGraders.pythonGrader(...);
final grader6 = OpenAIGraders.multiGrader(...);

// 运行评分器
final grader = await OpenAI.instance.graders.runGrader(
 grader: grader,
 modelSample: "待评分的模型输出", 
);

// 验证评分器
final isValid = OpenAI.instance.graders.validateGrader(
  grader: grader
);

📦 批处理

// (待实现)

📁 文件

// 上传文件
OpenAIFileModel file = await OpenAI.instance.files.upload(
  file: File("path/to/file.jsonl"),
  purpose: "assistants",
);

// 列出文件
List<OpenAIFileModel> files = await OpenAI.instance.files.list(
  limit: 10,
);

// 检索文件
OpenAIFileModel file = await OpenAI.instance.files.retrieve(
   "file_id" 
);

// 删除文件
await OpenAI.instance.files.delete("file-id-here");

// 检索文件内容
final content = await OpenAI.instance.files.retrieveContent(
  "file_id"
);

📤 上传

// (待实现)

🤖 模型

// 列出所有可用的模型
List<OpenAIModelModel> models = await OpenAI.instance.model.list();

// 检索特定模型
OpenAIModelModel model = await OpenAI.instance.model.retrieve("gpt-3.5-turbo");

// 删除微调后的模型
bool deleted = await OpenAI.instance.model.delete("fine-tuned-model-id");

🛡️ 内容审核

OpenAIModerationModel moderation = await OpenAI.instance.moderation.create(
  input: ["需要进行内容审核的文本"],
  model: "omni-moderation-latest",
);

🗃️ 向量存储

向量存储
// 创建向量存储
  OpenAIVectorStoreModel vectorStore = await OpenAI.instance.vectorStores.vectorStores.create(
    name: "example_vector_store",
    chunkingStrategy: OpenAIVectorStoreChunkingStrategy.static(
      chunkOverlapTokens: 300,
      maxChunkSizeTokens: 750,
    ),
    expiresAfter: OpenAIVectorStoreExpiresAfter(
      anchor: "last_active_at",
      days: 1,
    ),
  ); 

  // 列出向量存储
 OpenAIVectorStoreListModel allVEctorStores = await OpenAI.instance.vectorStores.vectorStores.list(limit: 30);

 // 获取向量存储
 final firstVectorStoreAsync = await OpenAI.instance.vectorStores.vectorStores.get(
   vectorStoreId: "vector_store_id",
 );

// 修改向量存储
final updatedVectorStore = await OpenAI.instance.vectorStores.vectorStores.modify(
  vectorStoreId: "vector_store_id",
  name: "updated_vector_store_name",
);

// 删除向量存储
await OpenAI.instance.vectorStores.vectorStores.delete(
  vectorStoreId: "vector_store_id",
);

// 在向量存储中搜索
final searchVEctorStoreResult = await OpenAI.instance.vectorStores.vectorStores.search(
   vectorStoreId: updatedVectorStore.id,
   query: "example",
   maxNumResults: 10,
   filters: OpenAIVectorStoresSearchFilter.comparison(
     type: "eq",
     key: "metadata.example_key",
     value: "example_value",
   ),
   rankingOptions: OpenAIVectorStoresRankingOptions(
     ranker: "none",
     scoreThreshold: 0,
   ),
);
向量存储文件

// 创建向量存储文件
final createdVectorStoreFile = await OpenAI.instance.vectorStores.vectorStoresFiles.create(
  vectorStoreId: "vector_store_id",
  fileId: "file_id",
  attributes: {
    "chapter": "Chapter 1",
  },
  chunckingStrategy: OpenAIVectorStoreChunkingStrategy.static(
    chunkOverlapTokens: 300,
    maxChunkSizeTokens: 750,
  ),
);

// 列出向量存储文件
final vectorStoreFiles = await OpenAI.instance.vectorStores.vectorStoresFiles.list(
  vectoreStoreId: "vector_store_id",
  limit: 60,
);

// 获取向量存储文件
final vectorStoreFile = await OpenAI.instance.vectorStores.vectorStoresFiles.get(
  fileId: "file_id",
  vectorStoreId: "vector_store_id",
);

// 获取向量存储文件内容
final vectorStoreFileContent = await OpenAI.instance.vectorStores.vectorStoresFiles.getContent(
  fileId: "file_id",
  vectorStoreId: "vector_store_id",
);

// 更新向量存储文件
final updatedVectorStoreFile = await OpenAI.instance.vectorStores.vectorStoresFiles.update(
  fileId: "file_id",
  vectorStoreId: "vector_store_id",
  attributes: {
    "chapter": "Updated Chapter 1",
  },
);

// 删除向量存储文件
await OpenAI.instance.vectorStores.vectorStoresFiles.delete(
  fileId: "file_id",
  vectorStoreId: "vector_store_id",
);
向量存储文件批次

// 创建向量存储文件批次
final vectoreStoreFileBatch = await OpenAI.instance.vectorStores.vectorStoreFileBatch.create(
  vectorStoreId: "vector_store_id",
  chunkingStrategy: OpenAIVectorStoreChunkingStrategy.static(
    chunkOverlapTokens: 200,
    maxChunkSizeTokens: 550,
  ),
  attributes: {
    "batch_name": "My First Batch",
  },
  fileIds: ["file-abc123", "file-def456"],
);

// 获取向量存储文件批次
final batch = await OpenAI.instance.vectorStores.vectorStoreFileBatch.get(
  batchId: "batch_id",
  vectorStoreId: "vector_store_id",
);

// 取消向量存储文件批次
final cancelledBatch = await OpenAI.instance.vectorStores.vectorStoreFileBatch.cancel(
  batchId: "batch_id",
  vectorStoreId: "vector_store_id",
);

// 列出批次中的向量存储文件
final vectorStoreBatchFiles = await OpenAI.instance.vectorStores.vectorStoreFileBatch.list(
  vectorStoreId: "vector_store_id",
  batchId: 'batch_id',
);

📦 容器

容器
// 创建容器
final container = await OpenAI.instance.container.containers.create(
  name: "my special container",
);

// 列出容器
final containers = await OpenAI.instance.container.containers.list(
  limit: 20,
);

// 获取容器
final firstContainer = await OpenAI.instance.container.containers.get(
  containerId: "container_id",
);

// 删除容器
await OpenAI.instance.container.containers.delete(
  containerId: "container_id",
);
容器文件
// 创建容器文件
final containerFile = await OpenAI.instance.container.containerFiles.create(
  file: File("path/to/file"),
  containerId: "container_id",
);

// 获取容器文件
final gotContainerFile = await OpenAI.instance.container.containerFiles.get(
  containerId: "container_id",
  fileId: "file_id",
);

// 获取容器文件内容
final gotContainerFileContent =
    await OpenAI.instance.container.containerFiles.getContent(
  containerId: "container_id",
  fileId: "file_id",
);

// 列出容器文件
final allContainerFiles = await OpenAI.instance.container.containerFiles.list(
  containerId: "container_id",
  limit: 20,
);

// 删除容器文件
await OpenAI.instance.container.containerFiles.delete(
  fileId: "file_id",
  containerId: "container_id",
);

🕛 实时

// (待实现)

💬 聊天补全

// 基本的聊天补全
OpenAIChatCompletionModel chat = await OpenAI.instance.chat.create(
  model: "gpt-3.5-turbo",
  messages: [
    OpenAIChatCompletionChoiceMessageModel(
      role: OpenAIChatMessageRole.user,
      content: "Hello, how can you help me?",
    ),
  ],
  temperature: 0.7,
  maxTokens: 150,
);

// 流式聊天补全
Stream<OpenAIStreamChatCompletionModel> chatStream = OpenAI.instance.chat.createStream(
  model: "gpt-3.5-turbo",
  messages: [
    OpenAIChatCompletionChoiceMessageModel(
      role: OpenAIChatMessageRole.user,
      content: "Tell me a story",
    ),
  ],
);

chatStream.listen((event) {
  print(event.choices.first.delta.content);
});

🤖 管理

// (待实现)


🔧 配置

环境变量

// 使用 envied 包
@Envied(path: ".env")
abstract class Env {
  @EnviedField(varName: 'OPEN_AI_API_KEY')
  static const apiKey = _Env.apiKey;
}

void main() {
  OpenAI.apiKey = Env.apiKey;
  runApp(MyApp());
}

自定义配置

void main() {
  // 设置 API 密钥
  OpenAI.apiKey = "your-api-key";
  
  // 设置组织 ID(可选)
  OpenAI.organization = "your-org-id";
  
  // 设置自定义基础 URL(可选)
  OpenAI.baseUrl = "https://api.openai.com/v1";
  
  // 设置请求超时时间(可选)
  OpenAI.requestsTimeOut = Duration(seconds: 60);
  
  // 启用日志记录(可选)
  OpenAI.showLogs = true;
  OpenAI.showResponsesLogs = true;
  
  runApp(MyApp());
}

🚨 错误处理

try {
  final chat = await OpenAI.instance.chat.create(
    model: "gpt-3.5-turbo",
    messages: [
      OpenAIChatCompletionChoiceMessageModel(
        role: OpenAIChatMessageRole.user,
        content: "Hello",
      ),
    ],
  );
} on RequestFailedException catch (e) {
  print("请求失败: ${e.message}");
  print("状态码: ${e.statusCode}");
} on MissingApiKeyException catch (e) {
  print("未设置 API 密钥: ${e.message}");
} on UnexpectedException catch (e) {
  print("意外错误: ${e.message}");
}

🤝 贡献

我们欢迎贡献!以下是您可以帮助的方式:

🐛 错误报告

  • 使用 GitHub Issues 报告错误
  • 包括复现步骤和环境详情

💡 功能请求

  • 通过 GitHub Issues 提出新功能建议
  • 在创建新问题之前,请先检查现有问题

🔧 代码贡献

  • 分叉仓库
  • 创建特性分支
  • 进行更改
  • 如果适用,添加测试
  • 提交拉取请求

📚 文档

  • 帮助改进文档
  • 为缺失的功能添加示例
  • 修复拼写错误并提高清晰度

💰 赞助


📜 许可证

本项目采用 MIT 许可证授权——详情请参阅 LICENSE 文件。


🙏 致谢

  • 感谢 OpenAI 提供的优秀 AI 模型和 API
  • 感谢帮助维护和改进本包的 贡献者
  • 感谢在经济上支持本项目的 赞助者
  • 感谢提供反馈和建议的 社区

📞 支持


由 Dart OpenAI 社区用心打造

⭐ 给这个仓库点个星🐛 报告 Bug💡 请求功能📖 文档

版本历史

v6.0.02025/11/08
v5.0.02023/11/22
v4.1.52023/11/18
v4.1.22023/11/08
v4.1.12023/11/08
1.9.12023/03/27
1.8.42023/03/22
1.8.02023/03/09
1.6.12023/03/08
1.5.52023/03/02
1.4.82023/02/17
1.4.62023/02/14
1.4.42023/02/12
1.4.02023/02/11
1.3.02023/02/11
releases2023/02/10

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|3天前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|4天前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

146.8k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.1k|★★☆☆☆|昨天
开发框架图像Agent

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|2天前
插件开发框架

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|3天前
语言模型图像Agent