Provider LLM¶
Fairmark è indipendente dal provider. Il motore non chiama mai un modello: espone dei tool, e qualsiasi modello che supporti l'uso dei tool può chiamarli. Una funzione restituisce le definizioni nel formato atteso da ciascun provider; una funzione esegue le chiamate, qualunque sia il provider.
import fairmark as fm
tools = fm.tools.for_provider("ollama") # definizioni per il provider
result = fm.tools.dispatch(name, arguments) # esecuzione, per ogni provider
Provider supportati¶
| Provider | for_provider(...) |
Formato | Schema |
|---|---|---|---|
| Anthropic | anthropic |
tool della Messages API | completo |
| OpenAI, Azure OpenAI | openai, azure-openai |
tool di Chat Completions | completo |
| OpenAI Responses API | openai-responses |
tool di funzione "piatti" | completo |
| Google Gemini | gemini |
function declaration (parametersJsonSchema) |
portabile |
| OpenRouter, LiteLLM, Mistral, Groq | openrouter, litellm, mistral, groq |
compatibile OpenAI | completo |
| Ollama, vLLM, LM Studio (modelli open-weight) | ollama, vllm, lmstudio |
compatibile OpenAI | portabile |
| LangChain, LangGraph | fm.tools.langchain() |
StructuredTool |
completo |
| Qualsiasi client MCP, n8n | fairmark-mcp |
MCP (stdio o HTTP) | completo |
Lo schema portabile scrive i decimali come stringhe ("0.095"), semplifica i valori
opzionali (X or null diventa X, e il campo resta opzionale) e rimuove le parole chiave di
validazione che alcuni provider e modelli open-weight gestiscono male. Non si perde nulla: le
stringhe sono anche la rappresentazione esatta, e il motore valida comunque ogni input. Per
richiederlo in modo esplicito usa fm.tools.openai(portable=True).
API compatibili con OpenAI (Ollama, OpenRouter, LiteLLM, vLLM)¶
Lo stesso codice funziona con ogni endpoint compatibile con OpenAI: cambiano solo
base_url, la chiave e il modello.
import json
from openai import OpenAI
import fairmark as fm
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama") # Ollama
# client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key=OPENROUTER_KEY)
messages = [{"role": "user", "content": "VAN al 7% di -5000, 1200, 1500, 1800, 2100?"}]
response = client.chat.completions.create(
model=MODEL, messages=messages, tools=fm.tools.for_provider("ollama"), # ad es. un modello Qwen o Llama con tool use
)
for call in response.choices[0].message.tool_calls or []:
result = fm.tools.dispatch(call.function.name, call.function.arguments)
messages += [response.choices[0].message,
{"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)}]
Con i modelli open-weight scegli un modello addestrato all'uso dei tool e mantieni breve il prompt di sistema. Le descrizioni dei tool di Fairmark dichiarano le unità in modo esplicito, ed è questo che rende affidabile l'estrazione degli input.
Google Gemini¶
from google import genai
from google.genai import types
import fairmark as fm
client = genai.Client()
config = types.GenerateContentConfig(
tools=[types.Tool(function_declarations=fm.tools.gemini())],
)
response = client.models.generate_content(
model=MODEL, contents="VAN al 7% di -5000, 1200, 1500, 1800, 2100?", config=config,
)
for call in response.function_calls or []:
result = fm.tools.dispatch(call.name, call.args)
Anthropic¶
Vedi Function calling e il tutorial con un agente.
LangChain e LangGraph¶
import fairmark as fm # pip install "fairmark[langchain]"
tools = fm.tools.langchain() # lista di StructuredTool, pronta per bind_tools o un ToolNode
n8n e altre piattaforme di automazione¶
L'AI Agent di n8n si collega ai server MCP via HTTP con l'MCP Client Tool. Avvia il server MCP di Fairmark in modalità HTTP e collega il nodo: vedi Server MCP. Un nodo n8n dedicato è in roadmap.