Anthropic Foundry SDK — Example Configuration

Partial supportmessages.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