Skip to content

Multiple Providers


Provider Flexibility Cloud & Local

Learn how to effectively work with multiple AI providers, switch between them, and choose the right provider for your use case.

Ollama (Local)

Status: ✅ Fully Supported

Best For: Development, privacy, offline use

Models: Gemma, Llama, Phi, Mixtral, CodeLlama

OpenRouter (Cloud)

Status: ✅ Fully Supported

Best For: Production, latest models, scalability

Providers: OpenAI, Anthropic, Google, Meta, and more

Native Providers

Status: 🚧 Coming Soon

Planned: OpenAI, Anthropic, Google

Timeline: Next major release

FeatureOllamaOpenRouterNative (Coming)
CostFreePay-per-useVaries
SetupInstallationAPI keyAPI key
PrivacyCompleteProvider-dependentProvider-dependent
Offline✅ Yes❌ No❌ No
Model Selection50+ models200+ modelsProvider-specific
LatencyLow (local)Network-dependentNetwork-dependent
import { AgentForceAgent } from '@agentforce/adk';
const config = { name: "FlexibleAgent" };
// Local development with Ollama
const devAgent = new AgentForceAgent(config)
.useLLM("ollama", "gemma3:12b")
.systemPrompt("Development mode assistant")
.prompt("Test prompt for development");
// Production with OpenRouter
const prodAgent = new AgentForceAgent(config)
.useLLM("openrouter", "openai/gpt-4")
.systemPrompt("Production assistant")
.prompt("Production query");
const devResponse = await devAgent.output("text");
const prodResponse = await prodAgent.output("text");
function createAgent(name: string) {
const isProd = process.env.NODE_ENV === 'production';
const config = { name };
return new AgentForceAgent(config)
.useLLM(
isProd ? "openrouter" : "ollama",
isProd ? "openai/gpt-4" : "gemma3:12b"
);
}
// Usage
const agent = createAgent("AdaptiveAgent")
.systemPrompt("I adapt to the environment")
.prompt("What environment am I running in?");
interface ProviderConfig {
provider: string;
model: string;
description: string;
}
const providers: Record<string, ProviderConfig> = {
fast: {
provider: "ollama",
model: "phi4-mini:latest",
description: "Fast local inference"
},
balanced: {
provider: "ollama",
model: "gemma3:12b",
description: "Balanced performance and capability"
},
powerful: {
provider: "openrouter",
model: "openai/gpt-4",
description: "Maximum capability"
},
economical: {
provider: "openrouter",
model: "moonshotai/kimi-k2:free",
description: "Free cloud model"
}
};
function createAgentWithProfile(profile: keyof typeof providers) {
const config = providers[profile];
return new AgentForceAgent({
name: `${profile}Agent`
})
.useLLM(config.provider, config.model)
.systemPrompt(`You are running in ${profile} mode: ${config.description}`);
}
// Usage
const fastAgent = createAgentWithProfile("fast");
const powerfulAgent = createAgentWithProfile("powerful");
// Choose model based on hardware
function getOllamaModel() {
const totalRAM = process.memoryUsage().rss / 1024 / 1024; // Rough estimate
if (totalRAM < 8000) {
return "phi4-mini:latest"; // 3.8B params
} else if (totalRAM < 16000) {
return "gemma3:12b"; // 12B params
} else {
return "llama3.1:70b"; // 70B params
}
}
const agent = new AgentForceAgent(config)
.useLLM("ollama", getOllamaModel());
// Cost-aware model selection
const models = {
free: [
"moonshotai/kimi-k2:free",
"google/gemma-2-9b-it:free",
"anthropic/claude-3-haiku:beta"
],
budget: [
"openai/gpt-3.5-turbo",
"meta-llama/llama-3.1-8b-instruct",
"anthropic/claude-3-haiku"
],
premium: [
"openai/gpt-4",
"anthropic/claude-3-opus",
"meta-llama/llama-3.1-405b-instruct"
]
};
function selectOpenRouterModel(budget: 'free' | 'budget' | 'premium') {
const availableModels = models[budget];
return availableModels[0]; // Select first available
}
const agent = new AgentForceAgent(config)
.useLLM("openrouter", selectOpenRouterModel("budget"));
class FallbackAgent {
private providers = [
{ provider: "openrouter", model: "openai/gpt-4" },
{ provider: "openrouter", model: "anthropic/claude-3-sonnet" },
{ provider: "ollama", model: "gemma3:12b" },
{ provider: "ollama", model: "phi4-mini:latest" }
];
async createAgent(config: AgentConfig) {
for (const { provider, model } of this.providers) {
try {
const agent = new AgentForceAgent(config)
.useLLM(provider, model)
.systemPrompt(`Powered by ${provider}/${model}`);
// Test the configuration
await agent.debug().run();
return agent;
} catch (error) {
console.warn(`Provider ${provider}/${model} failed:`, error.message);
continue;
}
}
throw new Error("All providers failed");
}
}
// Usage
const fallback = new FallbackAgent();
const agent = await fallback.createAgent({
name: "ResilientAgent"
});
class LoadBalancedAgent {
private providers = [
{ provider: "ollama", model: "gemma3:12b", weight: 3 },
{ provider: "openrouter", model: "openai/gpt-4", weight: 1 }
];
private requestCount = 0;
selectProvider() {
// Simple weighted round-robin
this.requestCount++;
const totalWeight = this.providers.reduce((sum, p) => sum + p.weight, 0);
const selection = this.requestCount % totalWeight;
let currentWeight = 0;
for (const provider of this.providers) {
currentWeight += provider.weight;
if (selection < currentWeight) {
return provider;
}
}
return this.providers[0]; // Fallback
}
createAgent(config: AgentConfig) {
const selected = this.selectProvider();
return new AgentForceAgent(config)
.useLLM(selected.provider, selected.model)
.systemPrompt(`Load balanced: ${selected.provider}/${selected.model}`);
}
}
// Usage
const balancer = new LoadBalancedAgent();
const agent1 = balancer.createAgent({ name: "BalancedAgent1" });
const agent2 = balancer.createAgent({ name: "BalancedAgent2" });
interface ProviderCapability {
provider: string;
model: string;
capabilities: string[];
cost: 'free' | 'low' | 'medium' | 'high';
speed: 'fast' | 'medium' | 'slow';
}
const providerCapabilities: ProviderCapability[] = [
{
provider: "ollama",
model: "codellama:34b",
capabilities: ["code", "programming", "debugging"],
cost: "free",
speed: "medium"
},
{
provider: "openrouter",
model: "openai/gpt-4",
capabilities: ["reasoning", "analysis", "writing", "code"],
cost: "high",
speed: "medium"
},
{
provider: "ollama",
model: "phi4-mini:latest",
capabilities: ["chat", "simple-tasks"],
cost: "free",
speed: "fast"
}
];
function selectProviderByCapability(
requiredCapability: string,
preferredCost?: 'free' | 'low' | 'medium' | 'high'
) {
let candidates = providerCapabilities.filter(p =>
p.capabilities.includes(requiredCapability)
);
if (preferredCost) {
const costFiltered = candidates.filter(p => p.cost === preferredCost);
if (costFiltered.length > 0) {
candidates = costFiltered;
}
}
// Return fastest option among candidates
return candidates.sort((a, b) => {
const speedOrder = { fast: 0, medium: 1, slow: 2 };
return speedOrder[a.speed] - speedOrder[b.speed];
})[0];
}
// Usage
function createCapabilityAgent(task: string, capability: string) {
const selected = selectProviderByCapability(capability, "free");
return new AgentForceAgent({
name: `${capability}Agent`
})
.useLLM(selected.provider, selected.model)
.systemPrompt(`You specialize in ${capability}. Model: ${selected.model}`)
.prompt(task);
}
// Examples
const codeAgent = createCapabilityAgent("Review this function", "code");
const chatAgent = createCapabilityAgent("Hello, how are you?", "chat");
class ProviderHealthChecker {
async checkOllama(): Promise<boolean> {
try {
const response = await fetch('http://localhost:11434/api/tags');
return response.ok;
} catch {
return false;
}
}
async checkOpenRouter(): Promise<boolean> {
try {
const apiKey = process.env.OPENROUTER_API_KEY;
if (!apiKey) return false;
const response = await fetch('https://openrouter.ai/api/v1/models', {
headers: { 'Authorization': `Bearer ${apiKey}` }
});
return response.ok;
} catch {
return false;
}
}
async getAvailableProviders() {
const results = await Promise.allSettled([
this.checkOllama(),
this.checkOpenRouter()
]);
return {
ollama: results[0].status === 'fulfilled' && results[0].value,
openrouter: results[1].status === 'fulfilled' && results[1].value
};
}
async createHealthyAgent(config: AgentConfig) {
const available = await this.getAvailableProviders();
if (available.openrouter) {
return new AgentForceAgent(config)
.useLLM("openrouter", "openai/gpt-4");
} else if (available.ollama) {
return new AgentForceAgent(config)
.useLLM("ollama", "gemma3:12b");
} else {
throw new Error("No providers available");
}
}
}
// Usage
const healthChecker = new ProviderHealthChecker();
const agent = await healthChecker.createHealthyAgent({
name: "HealthyAgent"
});
class ProviderPerformanceMonitor {
private metrics = new Map<string, {
requests: number;
totalTime: number;
errors: number;
}>();
async measureAgent(
provider: string,
model: string,
prompt: string
) {
const key = `${provider}/${model}`;
const startTime = Date.now();
try {
const agent = new AgentForceAgent({
name: "BenchmarkAgent"
})
.useLLM(provider, model)
.systemPrompt("You are a test assistant")
.prompt(prompt);
const response = await agent.output("text");
const duration = Date.now() - startTime;
this.recordSuccess(key, duration);
return { success: true, response, duration };
} catch (error) {
this.recordError(key);
return { success: false, error: error.message };
}
}
private recordSuccess(key: string, duration: number) {
const current = this.metrics.get(key) || { requests: 0, totalTime: 0, errors: 0 };
this.metrics.set(key, {
requests: current.requests + 1,
totalTime: current.totalTime + duration,
errors: current.errors
});
}
private recordError(key: string) {
const current = this.metrics.get(key) || { requests: 0, totalTime: 0, errors: 0 };
this.metrics.set(key, {
requests: current.requests + 1,
totalTime: current.totalTime,
errors: current.errors + 1
});
}
getMetrics() {
const results = {};
for (const [key, metrics] of this.metrics) {
results[key] = {
averageTime: metrics.totalTime / (metrics.requests - metrics.errors),
errorRate: metrics.errors / metrics.requests,
totalRequests: metrics.requests
};
}
return results;
}
}
// Usage
const monitor = new ProviderPerformanceMonitor();
// Benchmark different providers
await monitor.measureAgent("ollama", "gemma3:12b", "Test prompt");
await monitor.measureAgent("openrouter", "openai/gpt-4", "Test prompt");
console.log(monitor.getMetrics());

Development

Use Ollama for fast iteration and testing

.useLLM("ollama", "phi4-mini:latest")

Production

Use OpenRouter for reliability and latest models

.useLLM("openrouter", "openai/gpt-4")

Cost Optimization

Mix providers based on task complexity

// Simple tasks: free models
// Complex tasks: premium models

Reliability

Implement fallbacks for production systems

// Primary -> Secondary -> Local fallback
// centralized provider configuration
const PROVIDER_CONFIG = {
development: {
provider: "ollama",
model: "phi4-mini:latest",
debug: true
},
testing: {
provider: "ollama",
model: "gemma3:12b",
debug: false
},
production: {
provider: "openrouter",
model: "openai/gpt-4",
debug: false
}
};
function createConfiguredAgent(env: keyof typeof PROVIDER_CONFIG) {
const config = PROVIDER_CONFIG[env];
let agent = new AgentForceAgent({
name: `${env}Agent`
}).useLLM(config.provider, config.model);
if (config.debug) {
agent = agent.debug();
}
return agent;
}

You now have the knowledge to effectively use multiple providers in AgentForce ADK, from simple switching to sophisticated load balancing and fallback strategies!