Skip to content
Blog

Genkit Dart Model-Agnostic API: Switch Between Google, Anthropic, and OpenAI

How Genkit Dart's model-agnostic API lets you integrate and switch between Google Gemini, Anthropic Claude, OpenAI GPT, and compatible providers with minimal code changes.

Published on • September 18, 2026

AI Assistant

One of Genkit Dart’s most powerful features is its model-agnostic API. Instead of coupling your app to a single LLM provider, Genkit provides a unified interface that works across Google Gemini, Anthropic Claude, OpenAI GPT, and any OpenAI API-compatible service. This means you can switch providers with minimal code changes.

Why Model-Agnostic Matters

LLM providers differ in pricing, capabilities, latency, and availability. A model-agnostic approach gives you:

  • Flexibility — Use the best model for each task without rewriting your app
  • Cost optimization — Route requests to cheaper models for simple tasks
  • Resilience — Fall back to an alternate provider if one goes down
  • Future-proofing — Adopt new models as they launch without major refactors

Supported Providers

Genkit Dart ships with first-class plugins for:

ProviderPackageModels
Google AIgenkit_google_genaiGemini 3.1 Pro, Gemini Flash, Gemini Nano
Anthropicgenkit_anthropicClaude Opus 4, Claude Sonnet 4, Claude Haiku
OpenAIgenkit_openaiGPT-4o, GPT-4, GPT-3.5-turbo, o1
Chromegenkit_chromeGemini Nano (on-device)
Firebase AIgenkit_firebase_aiVertex AI models via Firebase
Compatiblegenkit_openaiGroq, DeepSeek, xAI/Grok, Together AI, Ollama

Installation

Add the core package and whichever provider plugins you need:

dependencies:
  genkit: ^0.13.0
  genkit_google_genai: ^0.3.0
  genkit_anthropic: ^0.3.0
  genkit_openai: ^0.3.0

Setting Up Multiple Providers

Initialize Genkit with all the providers you want to use:

import 'dart:io';
import 'package:genkit/genkit.dart';
import 'package:genkit_google_genai/genkit_google_genai.dart';
import 'package:genkit_anthropic/genkit_anthropic.dart';
import 'package:genkit_openai/genkit_openai.dart';

void main() async {
  final ai = Genkit(
    plugins: [
      googleAI(),
      anthropic(apiKey: Platform.environment['ANTHROPIC_API_KEY']!),
      openAI(apiKey: Platform.environment['OPENAI_API_KEY']!),
    ],
  );
}

Each plugin registers its models with Genkit. You reference them by name when calling ai.generate().

Switching Between Models

Once configured, switching between providers is a single-line change:

// Use Gemini
final gemini = await ai.generate(
  model: googleAI.gemini('gemini-3.1-pro-preview'),
  prompt: 'Summarize this document',
);

// Switch to Claude
final claude = await ai.generate(
  model: anthropic.model('claude-opus-4.6'),
  prompt: 'Summarize this document',
);

// Switch to GPT-4o
final gpt = await ai.generate(
  model: openAI.model('gpt-4o'),
  prompt: 'Summarize this document',
);

The prompt parameter stays identical. Only the model reference changes.

OpenAI-Compatible APIs

The genkit_openai plugin works with any service that implements the OpenAI API format. For example, to use Groq or DeepSeek:

// Groq
final ai = Genkit(plugins: [
  openAI(
    name: 'groq',
    apiKey: Platform.environment['GROQ_API_KEY'],
    baseUrl: 'https://api.groq.com/openai/v1',
    models: [
      CustomModelDefinition(
        name: 'llama-3.3-70b-versatile',
        info: ModelInfo(
          label: 'Llama 3.3 70B',
          supports: {
            'multiturn': true,
            'tools': true,
            'systemRole': true,
          },
        ),
      ),
    ],
  ),
]);

final response = await ai.generate(
  model: openAI.model('llama-3.3-70b-versatile', namespace: 'groq'),
  prompt: 'Hello from Groq!',
);

You can register multiple OpenAI-compatible backends side by side by giving each a unique name.

Consistent Features Across Providers

Genkit normalizes behavior across providers. These features work the same regardless of which model you choose:

  • Streaming — Token-by-token output via ai.generateStream()
  • Structured output — Typed Dart objects via outputSchema
  • Tool calling — Models invoke your Dart functions during generation
  • Multi-turn conversations — Message history handled automatically
  • System prompts — Consistent system role support

Some provider-specific features (like Anthropic’s “thinking” mode) are exposed through provider-specific config options:

// Anthropic thinking
final response = await ai.generate(
  model: anthropic.model('claude-sonnet-4-6'),
  prompt: 'Solve this logic puzzle',
  config: AnthropicOptions(
    thinking: ThinkingConfig(budgetTokens: 2048),
  ),
);

Middleware for Resilience

Genkit’s middleware system lets you add retries, model fallback, and tool approval across any provider:

final ai = Genkit(
  plugins: [googleAI(), anthropic(), openAI()],
  middleware: [
    // Retry on failure
    retryMiddleware(maxRetries: 3),
    // Fall back to Claude if Gemini fails
    fallbackMiddleware(
      fallbackModels: [anthropic.model('claude-sonnet-4-6')],
    ),
  ],
);

This means your app degrades gracefully instead of crashing when a provider has issues.

When to Choose Which Provider

Use CaseRecommended ProviderWhy
Rapid prototypingGemini FlashFree tier, fast responses
Complex reasoningClaude OpusStrong multi-step reasoning
Tool-heavy agentsGPT-4oMature function calling
On-device inferenceGemini NanoRuns locally via Chrome
Cost-sensitive tasksGroq/DeepSeekLow-cost API access
Enterprise complianceVertex AI via FirebaseGoogle Cloud security

Conclusion

Genkit Dart’s model-agnostic API eliminates vendor lock-in while keeping your code clean and portable. By abstracting provider differences behind a unified interface, you can focus on building features instead of managing API quirks. Whether you start with Gemini and later add Claude as a fallback, or run GPT-4o for complex tasks and Gemini Flash for simple ones — Genkit makes it a configuration change, not a rewrite.

References: