Propagate
Two mechanisms let you attach tags to every instrumented call without adding __weflayr_tags to each one individually: default_tags for static metadata set at startup, and weflayr_propagate for runtime values that change per request.
default_tags
default_tags in weflayr_setup attaches static key-value tags to every instrumented call. Use it for metadata that doesn’t change between calls — app name, deployed version, environment.
const { weflayr_setup, weflayr_instrument } = require('weflayr');
weflayr_setup({
intake_url: process.env.WEFLAYR_INTAKE_URL,
client_id: process.env.WEFLAYR_CLIENT_ID,
client_secret: process.env.WEFLAYR_CLIENT_SECRET,
default_tags: {
app: 'my-app',
version: '1.2.0',
env: 'production',
},
methods: [{ call: 'chat.completions.create' }],
});
const OpenAI = require('openai');
const client = weflayr_instrument(new OpenAI({ apiKey: process.env.OPENAI_API_KEY }));
import os
from openai import OpenAI
from weflayr import weflayr_setup, weflayr_instrument
weflayr_setup({
"intake_url": os.environ["WEFLAYR_INTAKE_URL"],
"client_id": os.environ["WEFLAYR_CLIENT_ID"],
"client_secret": os.environ["WEFLAYR_CLIENT_SECRET"],
"default_tags": {
"app": "my-app",
"version": "1.2.0",
"env": "production",
},
"methods": [{"call": "chat.completions.create"}],
})
client = weflayr_instrument(OpenAI(api_key=os.environ["OPENAI_API_KEY"]))
Every before, after, and error event will carry app, version, and env automatically, with no per-call code.
weflayr_propagate
weflayr_propagate(key, value) adds or overrides a single tag at runtime. Call it anywhere before an LLM call — inside a request handler, middleware, or function — to inject context that varies per request without threading it down as an argument.
const { weflayr_propagate } = require('weflayr');
// In a request handler — tags every LLM call made during this execution
weflayr_propagate('customer_id', 'acme-corp');
await client.chat.completions.create({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: 'Hello!' }],
});
from weflayr import weflayr_propagate
# In a request handler — tags every LLM call made during this execution
weflayr_propagate("customer_id", "acme-corp")
client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hello!"}],
)
weflayr_propagate mutates global state. In a multi-tenant server handling concurrent requests, prefer per-call __weflayr_tags for request-scoped values, or ensure you reset the key between requests.
Tag priority
When the same key is set in multiple places, higher specificity wins:
| Source | Priority | When to use |
|---|---|---|
__weflayr_tags (per-call) |
Highest | One-off tags on a single call |
weflayr_propagate |
Middle | Tags that vary per request or user |
default_tags (setup) |
Lowest | Static metadata: app, version, env |
weflayr_setup({ default_tags: { env: 'production', app: 'my-app' }, ... });
weflayr_propagate('env', 'staging'); // overrides default_tags.env
await client.chat.completions.create({
model: 'gpt-4o-mini',
messages: [...],
__weflayr_tags: { env: 'test' }, // wins over both — final value: 'test'
});
// tags sent: { app: 'my-app', env: 'test' }
weflayr_setup({"default_tags": {"env": "production", "app": "my-app"}, ...})
weflayr_propagate("env", "staging") # overrides default_tags.env
client.chat.completions.create(
model="gpt-4o-mini",
messages=[...],
__weflayr_tags={"env": "test"}, # wins over both — final value: "test"
)
# tags sent: {"app": "my-app", "env": "test"}