LLM Adapters#
LLM Adapters provide automatic observability for popular LLM providers. They log every LLM call with model, tokens, latency, and cost — plus optional streaming hooks for real-time monitoring.
Supported Providers#
| Provider | Adapter | Package |
|---|---|---|
| OpenAI | OpenAIAdapter |
openintent[openai] |
| Anthropic | AnthropicAdapter |
openintent[anthropic] |
| Google Gemini | GeminiAdapter |
openintent[gemini] |
| xAI Grok | GrokAdapter |
openintent[grok] |
| DeepSeek | DeepSeekAdapter |
openintent[deepseek] |
| Azure OpenAI | AzureOpenAIAdapter |
openintent[azure] |
| OpenRouter | OpenRouterAdapter |
openintent[openrouter] |
pip install openintent[openai] # Single adapter
pip install openintent[openai,anthropic] # Multiple
pip install openintent[all-adapters] # All adapters
Usage#
from openai import OpenAI
from openintent import OpenIntentClient
from openintent.adapters import OpenAIAdapter
openai_client = OpenAI()
oi_client = OpenIntentClient(base_url="...", agent_id="my-agent")
adapter = OpenAIAdapter(openai_client, oi_client, intent_id)
response = adapter.chat_complete(
model="gpt-4",
messages=[{"role": "user", "content": "Hello"}]
)
from anthropic import Anthropic
from openintent.adapters import AnthropicAdapter
anthropic_client = Anthropic()
adapter = AnthropicAdapter(anthropic_client, oi_client, intent_id)
response = adapter.messages_create(
model="claude-3-sonnet-20240229",
max_tokens=1000,
messages=[{"role": "user", "content": "Hello"}]
)
from openai import AzureOpenAI
from openintent.adapters import AzureOpenAIAdapter
azure_client = AzureOpenAI(
azure_endpoint="https://my-resource.openai.azure.com/",
api_key="...",
api_version="2024-02-01"
)
adapter = AzureOpenAIAdapter(azure_client, oi_client, intent_id)
response = adapter.chat_complete(
model="gpt-4",
messages=[{"role": "user", "content": "Hello"}]
)
Both follow the OpenAI-compatible interface:
from openintent.adapters import GrokAdapter, DeepSeekAdapter
grok = GrokAdapter(grok_client, oi_client, intent_id)
deepseek = DeepSeekAdapter(deepseek_client, oi_client, intent_id)
response = grok.chat_complete(model="grok-1", messages=[...])
response = deepseek.chat_complete(model="deepseek-chat", messages=[...])
Streaming#
All adapters support streaming responses:
for chunk in adapter.chat_complete_stream(
model="gpt-4",
messages=[{"role": "user", "content": "Tell me a story"}]
):
print(chunk.choices[0].delta.content, end="")
Streaming Hooks#
All adapters accept an AdapterConfig with streaming hooks for real-time monitoring:
from openintent.adapters import OpenAIAdapter, AdapterConfig
config = AdapterConfig(
on_stream_start=lambda stream_id, model, provider:
print(f"Stream {stream_id} started: {model}"),
on_token=lambda token, stream_id:
print(token, end=""),
on_stream_end=lambda stream_id, model, total_tokens:
print(f"\nDone: {total_tokens} tokens"),
on_stream_error=lambda error, stream_id:
print(f"Error in {stream_id}: {error}"),
)
adapter = OpenAIAdapter(openai_client, oi_client, intent_id, config=config)
| Hook | Signature | When |
|---|---|---|
on_stream_start |
(stream_id, model, provider) |
Stream begins |
on_token |
(token, stream_id) |
Each content token received |
on_stream_end |
(stream_id, model, total_tokens) |
Stream completes |
on_stream_error |
(error, stream_id) |
Stream fails |
Fail-safe hooks
All hooks use a fail-safe pattern — exceptions in hooks are caught and logged without breaking the main flow.
What Gets Logged#
Each LLM call creates events with full observability data:
Token & Cost Tracking#
| Field | Description |
|---|---|
prompt_tokens |
Input tokens sent to the model |
completion_tokens |
Output tokens generated |
total_tokens |
Sum of prompt + completion |
duration_ms |
Request latency in milliseconds |
cost_per_token = 0.00000015 # $0.15 per 1M tokens
total_cost = event.payload["total_tokens"] * cost_per_token
Using with @Agent#
from openintent.agents import Agent, on_assignment
from openintent.adapters import OpenAIAdapter
from openai import OpenAI
@Agent("smart-agent")
class SmartAgent:
def __init__(self):
self.openai = OpenAI()
@on_assignment
async def handle(self, intent):
adapter = OpenAIAdapter(self.openai, self.client, intent.id)
response = adapter.chat_complete(
model="gpt-4",
messages=[
{"role": "user", "content": intent.description}
]
)
return {"response": response.choices[0].message.content}
Next Steps#
Agent Abstractions
Build agents with decorators, lifecycle hooks, and protocol features.
Build agents