ai_sdk_openai 3.0.0
ai_sdk_openai: ^3.0.0 copied to clipboard
OpenAI provider for the AI SDK Dart port.
ai_sdk_openai #
OpenAI provider for AI SDK Dart. Supports language models, embeddings, and image generation via the OpenAI API.
Installation #
dependencies:
ai_sdk_dart: ^3.0.0
ai_sdk_openai: ^3.0.0
Usage #
The top-level openai factory reads
const String.fromEnvironment('OPENAI_API_KEY'). Use it with
fvm dart run --define=OPENAI_API_KEY=sk-... bin/app.dart, or read
Platform.environment['OPENAI_API_KEY'] yourself and pass apiKey: to
OpenAIProvider in server and CLI apps.
Language model #
import 'package:ai_sdk_dart/ai_sdk_dart.dart';
import 'package:ai_sdk_openai/ai_sdk_openai.dart';
final result = await generateText(
model: openai('gpt-4.1-mini'),
prompt: 'Say hello!',
);
print(result.text);
Streaming #
import 'dart:io';
final result = await streamText(
model: openai('gpt-4.1'),
prompt: 'Tell me a joke.',
);
await for (final chunk in result.textStream) {
stdout.write(chunk);
}
Embeddings #
final result = await embed(
model: openai.embedding('text-embedding-3-small'),
value: 'Hello, world!',
);
print(result.embedding); // List<double>
Image generation #
import 'package:ai_sdk_dart/ai_sdk_dart.dart';
import 'package:ai_sdk_openai/ai_sdk_openai.dart';
final result = await generateImage(
model: openai.image('dall-e-3'),
prompt: 'A futuristic city at sunset.',
);
Reasoning models (o1, o3, o4-mini) #
import 'package:ai_sdk_dart/ai_sdk_dart.dart';
import 'package:ai_sdk_openai/ai_sdk_openai.dart';
final result = await generateText(
model: openai('o4-mini'),
prompt: 'Solve the Tower of Hanoi for 4 disks.',
providerOptions: {
'openai': OpenAILanguageModelOptions(
reasoningEffort: 'high',
reasoningSummary: 'detailed',
).toMap(),
},
);
print(result.text);
Responses API + hosted tools #
openai.responses(modelId) returns a LanguageModelV4 backed by the OpenAI
Responses API instead of Chat Completions — same generateText/streamText
usage as openai(modelId). It's required for hosted, server-side tools,
passed via providerDefinedTools: (a List<LanguageModelV4ProviderDefinedTool>,
separate from the tools: map):
final result = await generateText(
model: openai.responses('gpt-4.1-mini'),
prompt: 'What happened in the news today?',
providerDefinedTools: [OpenAIWebSearchTool()],
);
OpenAIWebSearchTool, OpenAIFileSearchTool (vector-store search),
OpenAICodeInterpreterTool, and OpenAIMcpTool (a remote MCP server) are all
available — see example/example.md for the full set,
plus runnable file/batch lifecycle examples.
Native structured output #
When using generateObject or Output.object() with generateText, the OpenAI provider
automatically uses response_format: json_schema for schema-validated responses:
final result = await generateObject(
model: openai('gpt-4.1-mini'),
schema: Schema<Map<String, dynamic>>(
jsonSchema: const {
'type': 'object',
'properties': {
'city': {'type': 'string'},
'country': {'type': 'string'},
},
'required': ['city', 'country'],
},
fromJson: (json) => json,
),
prompt: 'Capital of France?',
);
print(result.object); // {city: Paris, country: France}
Computer tool output #
Computer screenshots use a provider-neutral, camelCase result shape at the
public LanguageModelV4 boundary. Supply the screenshot under output and
include safety acknowledgements under acknowledgedSafetyChecks:
import 'package:ai_sdk_provider/ai_sdk_provider.dart';
const computerToolResult = LanguageModelV4ToolResultPart(
toolCallId: 'call-computer',
toolName: 'computer',
output: ToolResultOutputJson({
'output': {
'type': 'computer_screenshot',
'imageUrl': 'https://example.test/screenshot.png',
'detail': 'high',
},
'acknowledgedSafetyChecks': [
{
'id': 'safety-1',
'code': 'external_side_effect',
'message': 'Reviewed by the user',
},
],
}),
);
The OpenAI Responses adapter converts this public shape to the wire shape
(image_url, acknowledged_safety_checks, and related fields) when it sends
the computer result. Older provisional integrations that put type and
image_url directly at the top level should migrate to the wrapper above and
use imageUrl/fileId and acknowledgedSafetyChecks at the public boundary.
Custom API key / base URL #
final myOpenAi = OpenAIProvider(
apiKey: 'sk-...',
baseUrl: 'https://my-proxy.example.com/v1',
);
final result = await generateText(
model: myOpenAi('gpt-4.1-mini'),
prompt: 'Hello!',
);
With provider registry #
final registry = createProviderRegistry({
'openai': RegistrableProvider(
languageModelFactory: openai.call,
embeddingModelFactory: openai.embedding,
),
});
final model = registry.languageModel('openai:gpt-4.1-mini');
License #
MIT