Anthropic Foundry SDK — Example Configuration
Partial support — messages.create is instrumented for both streaming and non-streaming calls. Usage tokens and model are captured automatically via the built-in provider config.
Setup
Import the ready-to-use messagesCreate method config from the Weflayr Anthropic provider:
const { weflayr_setup, weflayr_instrument } = require('weflayr');
const { messagesCreate } = require('weflayr/src/providers/anthropic-ai-sdk');
weflayr_setup({
intake_url: process.env.WEFLAYR_INTAKE_URL,
client_id: process.env.WEFLAYR_CLIENT_ID,
client_secret: process.env.WEFLAYR_CLIENT_SECRET,
event_mode: 'default',
ignore_fields: (data) => {
(data.messages || []).forEach(m => delete m.content);
(data.content || []).forEach(c => delete c.text);
return data;
},
methods: [messagesCreate],
});
const Anthropic = require('@anthropic-ai/sdk');
const client = weflayr_instrument(new Anthropic.default({ apiKey: process.env.ANTHROPIC_API_KEY }));
import os
import anthropic
from weflayr import weflayr_setup, weflayr_instrument
def ignore_fn(data):
for m in (data.get("messages") or []):
m.pop("content", None)
for c in (data.get("content") or []):
c.pop("text", None)
return data
weflayr_setup({
"intake_url": os.environ["WEFLAYR_INTAKE_URL"],
"client_id": os.environ["WEFLAYR_CLIENT_ID"],
"client_secret": os.environ["WEFLAYR_CLIENT_SECRET"],
"event_mode": "default",
"ignore_fields": ignore_fn,
"methods": [{"call": "messages.create"}],
})
client = weflayr_instrument(anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"]))
messagesCreate bundles the call, middleware, and streamMiddleware for messages.create so you don’t need to wire them manually.
Non-streaming call
const response = await client.messages.create({
model: 'claude-haiku-4-5-20251001',
max_tokens: 256,
messages: [{ role: 'user', content: 'Hello!' }],
__weflayr_tags: {
feature: 'chat',
provider: 'anthropic',
customer_id: 'id'
},
});
console.log(response.content[0].text);
response = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=256,
messages=[{"role": "user", "content": "Hello!"}],
__weflayr_tags={
"feature": "chat",
"provider": "anthropic",
"customer_id": "id",
},
)
print(response.content[0].text)
Streaming call
const stream = await client.messages.create({
model: 'claude-haiku-4-5-20251001',
max_tokens: 256,
messages: [{ role: 'user', content: 'Write a haiku about software engineering.' }],
stream: true,
__weflayr_tags: {
feature: 'haiku',
provider: 'anthropic',
customer_id: 'id'
},
});
for await (const chunk of stream) {
if (chunk.type === 'content_block_delta' && chunk.delta.type === 'text_delta') {
process.stdout.write(chunk.delta.text);
}
}
stream = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=256,
messages=[{"role": "user", "content": "Write a haiku about software engineering."}],
stream=True,
__weflayr_tags={
"feature": "haiku",
"provider": "anthropic",
"customer_id": "id",
},
)
for event in stream:
if event.type == "content_block_delta" and event.delta.type == "text_delta":
print(event.delta.text, end="", flush=True)
Weflayr emits two stream_pending events during a streaming response, one after message_start (input tokens) and one after message_delta (output tokens) — then a final event on completion.
Configuration notes
| Setting | Value | Reason |
|---|---|---|
methods |
messagesCreate |
Pre-built config for messages.create; handles streaming token accumulation |
ignore_fields |
messages[].content, content[].text |
Strip prompt and response text; keep token usage and model metadata |
What messagesCreate captures
The built-in middleware extracts the following fields automatically and merges them into every event:
| Field | Source |
|---|---|
model |
response.model |
input_tokens |
message_start chunk on streams, response.usage otherwise |
output_tokens |
message_delta chunk on streams, response.usage otherwise |
cache_creation_input_tokens |
response.usage |
cache_read_input_tokens |
response.usage |