API Reference

Python SDK v1.4.3 TypeScript SDK v1.3.0

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

ArgumentTypeDescription
goalstr / stringName of the goal (e.g., "extract_company")
pathslist / arrayList of models or path configs

Optional arguments

PythonTypeScriptTypeDefaultDescription
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

ArgumentTypeDescription
messageslist / arrayOpenAI-format messages

Optional arguments

PythonTypeScriptTypeDescription
force_modelforceModelstr / stringOverride routing, use this model
max_tokensmaxTokensint / numberMaximum tokens in response
**kwargsoptionsany / objectPassed to provider (temperature, etc.)

Common mistakes

  • Passing model in kwargs (Kalibr picks the model; use force_model/forceModel to 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

ArgumentTypeDescription
successbool / booleanWhether the task succeeded

Optional arguments

ArgumentTypeDescription
reasonstr / stringFailure reason (for debugging)
scorefloat / numberQuality 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

ArgumentRequiredDescription
goalYesGoal name
constraintsNoObject with max_cost_usd, max_latency_ms, min_quality

Returns

FieldDescription
recommended_modelBest model for this goal
recommended_toolBest tool (if tools are tracked)
recommended_paramsBest parameters (if params are tracked)
outcome_success_rateHistorical success rate for this path
confidenceStatistical confidence (0-1)
alternativesOther 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

VariableRequiredDefaultDescription
KALIBR_API_KEYYes-Your API key from dashboard
KALIBR_TENANT_IDYesdefaultYour tenant ID
KALIBR_AUTO_INSTRUMENTNotrueAuto-instrument OpenAI/Anthropic/Google SDKs
KALIBR_INTELLIGENCE_URLNohttps://kalibr-intelligence.fly.devIntelligence service endpoint
OPENAI_API_KEYFor OpenAI-OpenAI API key
ANTHROPIC_API_KEYFor Anthropic-Anthropic API key
GOOGLE_API_KEYFor 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

ParameterDefaultDescription
exploration_rate0.1 (10%)Percentage of requests that explore non-optimal paths
min_samples20Outcomes needed per path before stable routing
success_whenNoneNo automatic success validation

Next