Model Providers
Fox Framework v1.3 incluye tres model providers nativos para integrar LLMs en tus agentes. Todos usan fetch nativo — sin SDKs de terceros, zero dependencias extra.
Instalación
# Instala solo el provider que necesitas
npm install @foxframework/model-openai
npm install @foxframework/model-anthropic
npm install @foxframework/model-ollamaOpenAI Provider
Compatible con la API de OpenAI /chat/completions. Soporta tool calls y streaming SSE.
import { OpenAIProvider } from '@foxframework/model-openai';
const model = new OpenAIProvider({
apiKey: process.env.OPENAI_API_KEY,
model: 'gpt-4o', // default: gpt-4o
baseUrl: 'https://api.openai.com/v1', // custom endpoint (Azure, proxies)
organization: 'org-...', // opcional
});Completions
const result = await model.complete([
{ role: 'system', content: 'You are a helpful assistant.' },
{ role: 'user', content: 'What is 2 + 2?' },
]);
console.log(result.content); // "4"
console.log(result.usage); // { promptTokens, completionTokens, totalTokens }Streaming
for await (const chunk of model.stream(messages)) {
process.stdout.write(chunk);
}Tool Calls
const result = await model.complete(messages, {
tools: [myTool],
toolChoice: 'auto',
});
if (result.toolCalls) {
for (const call of result.toolCalls) {
const output = await myTool.execute(call.arguments);
}
}Anthropic Provider
Compatible con la API de Anthropic /messages. Soporta tool_use blocks y streaming.
import { AnthropicProvider } from '@foxframework/model-anthropic';
const model = new AnthropicProvider({
apiKey: process.env.ANTHROPIC_API_KEY,
model: 'claude-opus-4-5', // default: claude-opus-4-5
maxTokens: 4096,
});Uso básico
const result = await model.complete([
{ role: 'user', content: 'Explain quantum entanglement simply.' },
]);System prompt
El sistema extrae automáticamente el mensaje { role: 'system' } y lo envía en el campo system de la API de Anthropic:
const result = await model.complete([
{ role: 'system', content: 'You are a physics professor.' },
{ role: 'user', content: 'Explain quantum entanglement.' },
]);Ollama Provider
Compatible con Ollama local /api/chat. Ideal para desarrollo sin costos ni conexión externa.
import { OllamaProvider } from '@foxframework/model-ollama';
const model = new OllamaProvider({
baseUrl: 'http://localhost:11434', // default
model: 'llama3.2',
keepAlive: '5m', // tiempo que el modelo permanece cargado
options: {
temperature: 0.7,
num_predict: 512,
},
});Setup Ollama
# Instalar Ollama
curl -fsSL https://ollama.ai/install.sh | sh
# Descargar un modelo
ollama pull llama3.2
ollama pull mistral
ollama pull codellamaStreaming ndjson
Ollama usa newline-delimited JSON. El provider lo maneja automáticamente:
for await (const chunk of model.stream(messages)) {
process.stdout.write(chunk);
}Usar con ReActAgent
Todos los providers implementan IModelProvider y son intercambiables:
import { ReActAgent } from '@foxframework/core/agents';
import { OpenAIProvider } from '@foxframework/model-openai';
// o: import { AnthropicProvider } from '@foxframework/model-anthropic';
// o: import { OllamaProvider } from '@foxframework/model-ollama';
const agent = new ReActAgent({
model: new OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }),
tools: [myTool],
});Comparación
| Feature | OpenAI | Anthropic | Ollama |
|---|---|---|---|
| Tool calls | ✅ | ✅ | ✅ |
| Streaming | ✅ SSE | ✅ SSE | ✅ ndjson |
| Local/offline | ❌ | ❌ | ✅ |
| Cost | Paid | Paid | Free |
| Best model | gpt-4o | claude-opus | llama3.2 |
| SDK dependency | ❌ (fetch) | ❌ (fetch) | ❌ (fetch) |
Crear un Provider Custom
Implementa IModelProvider para cualquier API compatible:
import { IModelProvider, Message, CompletionResult } from '@foxframework/core/agents';
class MyCustomProvider implements IModelProvider {
async complete(messages: Message[]): Promise<CompletionResult> {
const response = await fetch('https://my-llm-api.com/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ messages }),
});
const data = await response.json();
return {
content: data.text,
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
};
}
async *stream(messages: Message[]): AsyncGenerator<string> {
// implementación opcional
}
}Vector Store Providers (v1.4)
Three vector store packages implement IVectorSearchProvider for use with createVectorSearchTool. All use native fetch — no vendor SDKs.
npm install @foxframework/vector-pinecone # Pinecone
npm install @foxframework/vector-weaviate # Weaviate
npm install @foxframework/vector-chroma # ChromaDBPinecone
import { PineconeProvider } from '@foxframework/vector-pinecone';
const provider = new PineconeProvider({
apiKey: process.env.PINECONE_API_KEY!,
indexHost: process.env.PINECONE_INDEX_HOST!, // from Pinecone console
embed: async (text) => myEmbeddingFn(text), // optional: auto-embed on search/upsert
});
// Search
const results = await provider.search('climate change solutions', { topK: 5 });
// Upsert (requires embed function)
await provider.upsert('doc-1', 'Fox Framework is a TypeScript web framework.', {
source: 'docs',
version: '1.4',
});Weaviate
import { WeaviateProvider } from '@foxframework/vector-weaviate';
const provider = new WeaviateProvider({
url: 'https://my-cluster.weaviate.network',
className: 'Document', // Weaviate class/collection
apiKey: process.env.WEAVIATE_API_KEY,
textProperty: 'text', // property holding document content (default: 'text')
});
const results = await provider.search('renewable energy', { topK: 3, minScore: 0.7 });ChromaDB
import { ChromaProvider } from '@foxframework/vector-chroma';
const provider = new ChromaProvider({
url: 'http://localhost:8000',
collection: 'my-docs',
embed: async (texts) => myBatchEmbedFn(texts), // required for search + upsert
});
const results = await provider.search('Fox Framework routing', { topK: 5 });Comparison
| Feature | Pinecone | Weaviate | ChromaDB |
|---|---|---|---|
| Hosting | Cloud (managed) | Cloud + self-hosted | Self-hosted |
| Embedding | Client-side (optional) | Server-side or client | Client-side (required) |
| Filter | ✅ metadata filter | ✅ where clause | ✅ where filter |
| Namespaces | ✅ | ✅ (via className) | ✅ (via collection) |
| Upsert / Delete | ✅ | ✅ | ✅ |
| SDK dependency | ❌ (fetch) | ❌ (fetch) | ❌ (fetch) |
Use with an agent
import { createVectorSearchTool } from '@foxframework/core/agents/tools';
import { PineconeProvider } from '@foxframework/vector-pinecone';
import { ReActAgent } from '@foxframework/core/agents';
const tool = createVectorSearchTool(
new PineconeProvider({ apiKey: '...', indexHost: '...' }),
{ label: 'knowledge_base', defaultTopK: 5 },
);
const agent = new ReActAgent({ model, tools: [tool] });
const result = await agent.run('What does Fox Framework say about middleware?');