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"}