API Reference
Router
What this does: Routes LLM requests to the best model based on learned outcomes.
When to use: Create one Router per goal. Reuse for multiple requests in the same thread/async context.
from kalibr import Router
router = Router(
goal="extract_company", # required
paths=["gpt-4o", "claude-sonnet-4-20250514"], # required
success_when=lambda x: len(x) > 0, # optional
exploration_rate=0.1, # optional
auto_register=True, # optional, default True
)
import { Router } from '@kalibr/sdk';
const router = new Router({
goal: 'extract_company', // required
paths: ['gpt-4o', 'claude-sonnet-4-20250514'], // required
successWhen: (output) => output.length > 0, // optional
explorationRate: 0.1, // optional
autoRegister: true, // optional, default true
});
Required arguments
| Argument | Type | Description |
|---|---|---|
goal | str / string | Name of the goal (e.g., "extract_company") |
paths | list / array | List of models or path configs |
Optional arguments
| Python | TypeScript | Type | Default | Description |
|---|---|---|---|---|
success_when |
successWhen |
callable / function | None | Function that takes output string and returns bool. Auto-calls report(). |
exploration_rate |
explorationRate |
float / number | None | Override exploration rate (0.0-1.0) |
auto_register |
autoRegister |
bool / boolean | True | Register paths on init |
Thread Safety
Router is NOT thread-safe. Internal state (trace_id) will be corrupted if used across threads/async contexts.
- Python: Create one Router instance per thread.
- TypeScript: Create one Router instance per async context (request handler, worker, etc.)
Common mistakes
- Creating new Router per request – Reuse across requests
- Forgetting to call
report() - Using same goal for different tasks
- Using Router across threads/async contexts – Create separate instances
Router.completion()
What this does: Makes a completion request with intelligent routing.
When to call: Every time your agent needs an LLM response for this goal.
Example
response = router.completion(
messages=[
{"role": "system", "content": "Extract company names."},
{"role": "user", "content": "Hi, I'm Sarah from Stripe."}
],
max_tokens=100
)
print(response.choices[0].message.content)
const response = await router.completion(
[
{ role: 'system', content: 'Extract company names.' },
{ role: 'user', content: "Hi, I'm Sarah from Stripe." },
],
{ maxTokens: 100 }
);
console.log(response.choices[0].message.content);
Required arguments
| Argument | Type | Description |
|---|---|---|
messages | list / array | OpenAI-format messages |
Optional arguments
| Python | TypeScript | Type | Description |
|---|---|---|---|
force_model | forceModel | str / string | Override routing, use this model |
max_tokens | maxTokens | int / number | Maximum tokens in response |
**kwargs | options | any / object | Passed to provider (temperature, etc.) |
Common mistakes
- Passing model in kwargs (Kalibr picks the model; use
force_model/forceModelto override) - Not handling exceptions (provider errors still raise)
Exceptions
Provider errors propagate to caller:
- Python:
openai.OpenAIError,anthropic.AnthropicError - TypeScript:
OpenAI.APIError,Anthropic.APIError
Intelligence service failures do NOT raise – Router falls back to first path.
as_langchain()
Returns a LangChain-compatible LLM that uses Kalibr for routing. Use this to integrate with frameworks like CrewAI and LangChain.
from kalibr import Router
router = Router(
goal="my_task",
paths=["gpt-4o", "claude-sonnet-4-20250514"]
)
# Returns a LangChain BaseChatModel
llm = router.as_langchain()
# Use with any LangChain chain or CrewAI agent
from langchain_core.prompts import ChatPromptTemplate
chain = ChatPromptTemplate.from_template("{input}") | llm
Note: You still need to call router.report() after the chain completes to report the outcome.
Router.report()
What this does: Reports outcome for the last completion. This is how Kalibr learns.
When to call: After you know whether the task succeeded or failed.
Example
# Success
router.report(success=True)
# Failure with reason
router.report(success=False, reason="invalid_json")
# Success with quality score
router.report(success=True, score=0.8)
// Success
await router.report(true);
// Failure with reason
await router.report(false, 'invalid_json');
// Success with score
await router.report(true, undefined, 0.8);
Required arguments
| Argument | Type | Description |
|---|---|---|
success | bool / boolean | Whether the task succeeded |
Optional arguments
| Argument | Type | Description |
|---|---|---|
reason | str / string | Failure reason (for debugging) |
score | float / number | Quality score 0-1 (finer-grained than bool) |
Common mistakes
- Calling report() multiple times for one completion (second call is ignored)
- Not calling report() at all (routing never improves)
- Reporting success based on "response exists" instead of "task actually worked"
When to call
- After you know if task succeeded/failed
- Once per completion() call
- For multi-turn, report once at end
Validation
Calling report() without a prior completion() raises an error. Calling report() twice for the same completion logs a warning and ignores the second call.
Router.get_policy()
Get the current routing policy without making an LLM call. Useful when you need to know which model Kalibr would choose.
from kalibr import get_policy
policy = get_policy(goal="book_meeting") # goal is required
print(policy["recommended_model"]) # e.g., "gpt-4o"
print(policy["confidence"]) # e.g., 0.85
print(policy["source"]) # "realtime" or "historical"
import { getPolicy } from '@kalibr/sdk';
const policy = await getPolicy({ goal: 'book_meeting' }); // goal is required
console.log(policy.recommendedModel); // e.g., "gpt-4o"
console.log(policy.confidence); // e.g., 0.85
console.log(policy.source); // "realtime" or "historical"
get_policy()
Get the recommended path for a goal without making a completion call. Useful for inspecting what Kalibr would choose or for custom routing logic.
from kalibr import get_policy
policy = get_policy(goal="book_meeting")
print(policy["recommended_model"]) # "gpt-4o"
print(policy["recommended_tool"]) # "calendar_api"
print(policy["outcome_success_rate"]) # 0.87
print(policy["confidence"]) # 0.92
import { getPolicy } from '@kalibr/sdk';
const policy = await getPolicy({ goal: 'book_meeting' });
console.log(policy.recommendedModel); // "gpt-4o"
console.log(policy.recommendedTool); // "calendar_api"
console.log(policy.outcomeSuccessRate); // 0.87
console.log(policy.confidence); // 0.92
With Constraints
policy = get_policy(
goal="book_meeting",
constraints={
"max_cost_usd": 0.05,
"max_latency_ms": 2000,
"min_quality": 0.8
}
)
const policy = await getPolicy({
goal: 'book_meeting',
constraints: {
maxCostUsd: 0.05,
maxLatencyMs: 2000,
minQuality: 0.8,
},
});
Kalibr will only recommend paths that meet all constraints. If no paths meet the constraints, the response will indicate no recommendation is available.
Parameters
| Argument | Required | Description |
|---|---|---|
goal | Yes | Goal name |
constraints | No | Object with max_cost_usd, max_latency_ms, min_quality |
Returns
| Field | Description |
|---|---|
recommended_model | Best model for this goal |
recommended_tool | Best tool (if tools are tracked) |
recommended_params | Best parameters (if params are tracked) |
outcome_success_rate | Historical success rate for this path |
confidence | Statistical confidence (0-1) |
alternatives | Other viable paths ranked by performance |
Intelligence API (TypeScript)
The TypeScript SDK exports convenience functions for direct access to the Intelligence API.
import {
KalibrIntelligence,
getPolicy,
reportOutcome,
registerPath,
decide,
getRecommendation,
listPaths,
disablePath,
setExplorationConfig,
getExplorationConfig,
} from '@kalibr/sdk';
// Initialize singleton
KalibrIntelligence.init({
apiKey: process.env.KALIBR_API_KEY!,
tenantId: process.env.KALIBR_TENANT_ID!,
});
// Get routing decision
const decision = await decide('extract_company');
console.log(decision.model_id, decision.confidence);
// Report outcome directly
await reportOutcome(traceId, 'extract_company', true, {
score: 0.95,
modelId: 'gpt-4o',
});
// List registered paths
const { paths } = await listPaths({ goal: 'extract_company' });
// Configure exploration
await setExplorationConfig({
goal: 'extract_company',
explorationRate: 0.1,
minSamplesBeforeExploit: 20,
});
Auto-Instrumentation (TypeScript)
Wrap OpenAI or Anthropic clients to automatically trace all LLM calls.
import { createTracedOpenAI, createTracedAnthropic } from '@kalibr/sdk';
// Wrap OpenAI client - all calls auto-traced
const openai = createTracedOpenAI();
const response = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: 'Hello!' }],
});
// Wrap Anthropic client
const anthropic = createTracedAnthropic();
const message = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
messages: [{ role: 'user', content: 'Hello!' }],
});
Context Management (TypeScript)
Run code within goal or trace contexts using async local storage.
import { withGoal, withTraceId, traceContext } from '@kalibr/sdk';
// Run code within a goal context
await withGoal('extract_company', async () => {
// All Kalibr operations inherit this goal
const response = await openai.chat.completions.create({...});
});
// Run code with a specific trace ID
await withTraceId('my-custom-trace-id', async () => {
// All operations use this trace ID
});
// Combined trace context
await traceContext({ traceId: 'my-trace', goal: 'summarize' }, async () => {
// Both trace ID and goal available
});
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
KALIBR_API_KEY | Yes | - | Your API key from dashboard |
KALIBR_TENANT_ID | Yes | default | Your tenant ID |
KALIBR_AUTO_INSTRUMENT | No | true | Auto-instrument OpenAI/Anthropic/Google SDKs |
KALIBR_INTELLIGENCE_URL | No | https://kalibr-intelligence.fly.dev | Intelligence service endpoint |
OPENAI_API_KEY | For OpenAI | - | OpenAI API key |
ANTHROPIC_API_KEY | For Anthropic | - | Anthropic API key |
GOOGLE_API_KEY | For Google | - | Google API key |
REST API Endpoints
Intelligence service: https://kalibr-intelligence.fly.dev
POST /api/v1/routing/decide
Get routing decision for a goal.
curl -X POST https://kalibr-intelligence.fly.dev/api/v1/routing/decide \
-H "X-API-Key: your-key" \
-H "X-Tenant-ID: your-tenant" \
-H "Content-Type: application/json" \
-d '{"goal": "extract_company"}'
POST /api/v1/intelligence/report-outcome
Report execution outcome.
curl -X POST https://kalibr-intelligence.fly.dev/api/v1/intelligence/report-outcome \
-H "X-API-Key: your-key" \
-H "X-Tenant-ID: your-tenant" \
-H "Content-Type: application/json" \
-d '{"trace_id": "abc123", "goal": "extract_company", "success": true}'
POST /api/v1/routing/paths
Register a new path.
curl -X POST https://kalibr-intelligence.fly.dev/api/v1/routing/paths \
-H "X-API-Key: your-key" \
-H "X-Tenant-ID: your-tenant" \
-H "Content-Type: application/json" \
-d '{"goal": "extract_company", "model_id": "gpt-4o"}'
Default Values
| Parameter | Default | Description |
|---|---|---|
exploration_rate | 0.1 (10%) | Percentage of requests that explore non-optimal paths |
min_samples | 20 | Outcomes needed per path before stable routing |
success_when | None | No automatic success validation |
Next
- Production Guide - Exploration, failure modes