Documentation Index
Fetch the complete documentation index at: https://docs.fenra.io/llms.txt
Use this file to discover all available pages before exploring further.
This guide covers how to send Anthropic usage data to Fenra.
Messages API
import Anthropic from '@anthropic-ai/sdk';
const anthropic = new Anthropic();
async function chat(messages) {
const response = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages
});
// Send to Fenra
await fetch('https://ingest.fenra.io/usage/transactions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Api-Key': process.env.FENRA_API_KEY
},
body: JSON.stringify({
provider: 'anthropic',
model: response.model,
usage: [{
type: 'tokens',
metrics: {
input_tokens: response.usage.input_tokens,
output_tokens: response.usage.output_tokens,
total_tokens: response.usage.input_tokens + response.usage.output_tokens
}
}],
context: {
billable_customer_id: process.env.BILLABLE_CUSTOMER_ID
}
})
});
return response;
}
Prompt Caching
When using prompt caching, include the cache tokens:
usage: [{
type: 'tokens',
metrics: {
input_tokens: response.usage.input_tokens,
output_tokens: response.usage.output_tokens,
total_tokens: response.usage.input_tokens + response.usage.output_tokens,
cache_read_input_tokens: response.usage.cache_read_input_tokens || 0,
cache_creation_input_tokens: response.usage.cache_creation_input_tokens || 0
}
}]
Extended Thinking
When using extended thinking, include thinking tokens:
usage: [{
type: 'tokens',
metrics: {
input_tokens: response.usage.input_tokens,
output_tokens: response.usage.output_tokens,
total_tokens: response.usage.input_tokens + response.usage.output_tokens,
thinking_tokens: response.usage.thinking_tokens || 0
}
}]
Streaming
When streaming, wait for the final message to get usage data:
const stream = await anthropic.messages.stream({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages
});
const response = await stream.finalMessage();
// Now send to Fenra with response.usage
Supported Models
Fenra supports all Anthropic Claude models. Common models include:
| Model | Type |
|---|
claude-3-5-sonnet-20241022 | Latest Sonnet |
claude-3-5-haiku-20241022 | Latest Haiku |
claude-3-opus-20240229 | Opus |
claude-3-sonnet-20240229 | Sonnet (legacy) |
claude-3-haiku-20240307 | Haiku (legacy) |
Model Tiers
For batch processing, specify the tier:
{
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
model_tier: 'batch', // 50% discount
usage: [...]
}
When using server-side tools like web search or code execution, track tool invocations:
const response = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
messages,
tools: [{ type: 'web_search' }]
});
// Extract tool usage from response
const serverToolUse = response.usage.server_tool_use || {};
const webSearchRequests = serverToolUse.web_search_requests || 0;
const codeExecutionHours = serverToolUse.code_execution_hours || 0;
await fetch('https://ingest.fenra.io/usage/transactions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Api-Key': process.env.FENRA_API_KEY
},
body: JSON.stringify({
provider: 'anthropic',
model: response.model,
usage: [
{
type: 'tokens',
metrics: {
input_tokens: response.usage.input_tokens,
output_tokens: response.usage.output_tokens,
total_tokens: response.usage.input_tokens + response.usage.output_tokens
}
},
{
type: 'requests',
metrics: {
count: webSearchRequests,
request_type: 'web_search'
}
}
],
context: {
billable_customer_id: process.env.BILLABLE_CUSTOMER_ID
}
})
});
Next Steps