Skip to main content
Server-side tools run entirely on the provider’s infrastructure. They stream progress events, produce final deliverables, and keep your application logic focused on orchestration instead of implementation.

Provider Support

ProviderTools Available
OpenAI ResponsesWeb Search, File Search, Image Generation, Code Interpreter
GoogleGoogle Search, Code Execution
AnthropicWeb Search, Web Fetch, Code Interpreter

Enabling Tools

Each provider uses its own options class and tool enum:

OpenAI Responses

final agent = Agent(
  'openai-responses',
  chatModelOptions: const OpenAIResponsesChatModelOptions(
    serverSideTools: {
      OpenAIServerSideTool.webSearch,
      OpenAIServerSideTool.codeInterpreter,
    },
  ),
);

Google

final agent = Agent(
  'google',
  chatModelOptions: const GoogleChatModelOptions(
    serverSideTools: {
      GoogleServerSideTool.googleSearch,
      GoogleServerSideTool.codeExecution,
    },
  ),
);

Anthropic

final agent = Agent(
  'anthropic',
  chatModelOptions: const AnthropicChatOptions(
    serverSideTools: {
      AnthropicServerSideTool.webSearch,
      AnthropicServerSideTool.codeInterpreter,
    },
  ),
);
Pick the tools you want per request. Providers default to their own safe configuration if you omit the set.

Streaming Metadata

Each tool streams structured metadata under a predictable key:
ToolMetadata key
Web searchmetadata['web_search']
File searchmetadata['file_search']
Image generationmetadata['image_generation']
Code interpretermetadata['code_interpreter']
Metadata is delivered on every ChatResult during streaming, which you can use to show live progress, log it, or feed it into analytics.
await for (final chunk in agent.sendStream('Recent Dart news?')) {
  final searchEvents = chunk.metadata['web_search'] as List?;
  if (searchEvents != null) {
    for (final event in searchEvents) {
      stdout.writeln('stage: ${event['type']}');
    }
  }
}

Message Content

Final deliverables (images, generated files, synthesized summaries) arrive as normal message parts so you can handle them with the usual ChatMessage APIs.

Configuration Blocks

Each tool exposes an optional configuration object. Configuration objects are provider-specific:
// OpenAI Responses
final agent = Agent(
  'openai-responses',
  chatModelOptions: OpenAIResponsesChatModelOptions(
    serverSideTools: const {OpenAIServerSideTool.webSearch},
    webSearchConfig: const WebSearchConfig(
      contextSize: WebSearchContextSize.high,
      followupQuestions: true,
    ),
  ),
);

OpenAI Responses Tools

Google Tools

Anthropic Tools

Examples