[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-weights-and-biases-weave-instrument":3,"mdc-dc7nkd-key":36,"related-org-weights-and-biases-weave-instrument":1295,"related-repo-weights-and-biases-weave-instrument":1418},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"weave-instrument","instrument LLM codebases with Weave","Add Weave (Weights & Biases) observability to an LLM or agent codebase. This covers calling `weave.init()`, setting up authentication, and choosing between OTEL auto-instrumentation and the explicit Session SDK agent-logging APIs (Turn, LLM, Tool, SubAgent), based on the libraries the code already uses. Works for Python and TypeScript\u002FNode. Use this whenever the user wants to instrument, trace, or add observability, logging, or monitoring to an agent, chatbot, RAG pipeline, or LLM app. This includes phrasings like \"log my agent to weave\", \"add agent tracing\", \"get my agent into the Weave Agents tab\", \"instrument this with the weave session sdk\", \"trace my tool calls\", or \"set up weave logging\", even when the user does not name a specific API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"weights-and-biases","Weights & Biases","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fweights-and-biases.png","wandb",[13,17,20,22],{"name":14,"slug":15,"type":16},"Observability","observability","tag",{"name":18,"slug":19,"type":16},"LLM","llm",{"name":9,"slug":21,"type":16},"weights-biases",{"name":23,"slug":24,"type":16},"Agents","agents",1104,"https:\u002F\u002Fgithub.com\u002Fwandb\u002Fweave","2026-07-17T06:07:25.81154",null,157,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"Weave is a toolkit for developing AI-powered applications, built by Weights & Biases.","https:\u002F\u002Fgithub.com\u002Fwandb\u002Fweave\u002Ftree\u002FHEAD\u002Fskills\u002Fweave-instrument","---\nname: weave-instrument\ndescription: >-\n  Add Weave (Weights & Biases) observability to an LLM or agent codebase. This covers calling\n  `weave.init()`, setting up authentication, and choosing between OTEL auto-instrumentation and the\n  explicit Session SDK agent-logging APIs (Turn, LLM, Tool, SubAgent), based on the libraries the code\n  already uses. Works for Python and TypeScript\u002FNode. Use this whenever the user wants to instrument,\n  trace, or add observability, logging, or monitoring to an agent, chatbot, RAG pipeline, or LLM app.\n  This includes phrasings like \"log my agent to weave\", \"add agent tracing\", \"get my agent into the\n  Weave Agents tab\", \"instrument this with the weave session sdk\", \"trace my tool calls\", or \"set up\n  weave logging\", even when the user does not name a specific API.\n---\n\n# Weave Instrument\n\nYour job is to add Weave tracing to someone's LLM or agent code so their runs show up in the W&B Weave\nUI. Fit the approach to their codebase instead of applying a one-size-fits-all template.\n\nThis skill works for any agent, whatever libraries it uses or none at all. Choose the approach based\non two things:\n\n- the telemetry *shape* the user wants;\n- the *structure* of their code.\n\nNever choose based on whether you recognize the framework. There are two mechanisms, and one of them\nalways applies.\n\n1. **Session SDK (the agent-logging APIs)** is the universal path. You wrap the agent's own structure\n   with `Turn`, `LLM`, `Tool`, and `SubAgent` spans. It works for any agent, whether a custom loop, an\n   unknown framework, or one that Weave does not map, and it always produces agent-shaped traces. Use\n   it whenever you cannot *prove* that auto-instrumentation emits the shape the user needs.\n2. **OTEL auto-instrumentation** is an optimization for libraries that Weave already recognizes.\n   `weave.init()` alone captures them, with no per-call code. Use it only when the installed version of\n   Weave auto-instruments the user's library *and* the shape it emits is the one they want.\n\nBoth paths produce OTEL spans. Agent-shaped spans land in Weave's **Agents** tab; flat call traces\nland in the **Calls** tab. The choice between the Session SDK and OTEL auto-instrumentation is driven\nby the shape you need and the structure of the code, not by framework identity. See\n`references\u002Fdecision.md` for the full procedure.\n\n## Reference material (read the one you need)\n\nKeep this file in context, and open a reference only when you reach the step that needs it. Each one is\na precise, source-grounded cheat-sheet. Do not reconstruct the API from memory: the surface is new and\neasy to get subtly wrong.\n\n- `references\u002Fdecision.md` is the full decision procedure (shape, then structure, then probe, then\n  strategy) and the coverage examples. Read it during \"Choose a strategy\" below.\n- `references\u002Fsession_sdk_python.md` covers the Python Session SDK: the classes, the context-manager\n  pattern, the batch path, and the data types. Read it when instrumenting Python with the Session SDK.\n- `references\u002Fsession_sdk_typescript.md` covers the TypeScript Session SDK: the `start*` functions, the\n  try\u002Ffinally pattern, async init, and concurrency. Read it when instrumenting TypeScript or Node.\n- `references\u002Fotel_auto.md` covers the OTEL auto path: what `weave.init()` captures on its own, the\n  default-mode gotchas, and the framework caveats. Read it when OTEL auto is the chosen strategy.\n- `references\u002Fotel_endpoint.md` covers exporting OTEL directly to Weave's endpoint (the raw-OTEL\n  path): the environment-variable config, and how to add Weave's exporter to an app's own\n  `TracerProvider`. Read it when the app already emits OTel spans or owns its OTel setup.\n\n## Workflow\n\nWork through these steps in order. Steps 1 and 4 always run. Use your judgement for steps 2 and 3.\n\n### 1. Establish the connection (always; confirm before editing widely)\n\nA user's traces need three things:\n\n1. the package installed;\n2. credentials present;\n3. a `weave.init()` call.\n\nSettle these first. There is no point instrumenting code that cannot authenticate.\n\n- **Install or confirm the package.** In Python, the package is `weave` on PyPI (`pip install weave`,\n  or add it to their manifest). The Session SDK needs `weave>=0.52.42`. `set_attributes` and\n  `add_event` need a newer build, so check the Python reference before relying on those. In Node, run\n  `npm install weave`. The OTEL dependencies ship bundled in both, so the user adds nothing extra.\n- **Authentication is the user's job, not yours, so never handle their key.** A W&B API key is a\n  secret, and it must not enter your context or the repo. Tell the user to authenticate in their own\n  terminal: set `WANDB_API_KEY` (from https:\u002F\u002Fwandb.ai\u002Fauthorize), or run `wandb login` (Python) or\n  `await weave.login(key)` once (Node). You may check *that* a key is reachable (the env var is set,\n  or `~\u002F.netrc` has an `api.wandb.ai` entry), but never read or print its value, and never write it\n  into source code or into a committed `.env`.\n- **Get the project name.** Ask for it as `entity\u002Fproject`, or as just `project` to use their default\n  entity. Show them the URL their traces will land at up front,\n  `https:\u002F\u002Fwandb.ai\u002F\u003Centity>\u002F\u003Cproject>\u002Fweave`, so there are no surprises about where the data goes.\n- **Add `weave.init(\"entity\u002Fproject\")` once** at each real entry point: the `main()` function, the\n  server startup, or the top of a script. Do not put it inside a hot loop. In Python:\n  `import weave; weave.init(\"entity\u002Fproject\")`. In Node: `await weave.init('entity\u002Fproject')`. It is\n  async, so you must await it before any traced work. If the app installs its own global\n  `TracerProvider`, `weave.init()` backs off and will not export to Weave; add Weave's exporter to\n  their provider instead (see `references\u002Fotel_endpoint.md`). The calls are safe no-ops when init or\n  auth is missing, so leaving instrumentation in place never breaks their program.\n\nBefore touching many files, state the plan in a sentence or two (\"I'll use the Session SDK to wrap\nyour agent loop in `agent.py`, and add `weave.init` in `main.py`\") and let the user redirect you.\nInstrumenting edits their source, so a quick checkpoint beats a large surprise diff.\n\n### 2. Survey the codebase\n\nYou cannot choose a strategy without knowing what they run. Find the following.\n\n- **The languages:** Python, TypeScript\u002FNode, or both.\n- **The LLM and agent libraries.** Grep the imports and read the dependency manifest, and note the\n  *exact* package. The names differ by language, so check the manifest that applies. Step 3 is where\n  you resolve whether the installed Weave auto-instruments each one, and whether it emits agent shape\n  or flat calls, so do not assume from the name.\n  - Python (`pyproject.toml` \u002F `requirements.txt`): `openai`, `anthropic`, `langchain`,\n    `openai-agents` (`import agents`), `claude_agent_sdk`, `google.adk`, `crewai`, `llama_index`, and\n    so on.\n  - TypeScript (`package.json`): `openai`, `@anthropic-ai\u002Fsdk`, `@google\u002Fgenai`, `@openai\u002Fagents`,\n    `@anthropic-ai\u002Fclaude-agent-sdk`, `langchain`, `llamaindex`, and so on.\n- **The agent's shape.** Is there a hand-rolled loop (a `while` that calls the model, dispatches\n  tools, and repeats)? Where is each model call? Where are tools dispatched? Is there delegation to\n  sub-agents? These map directly onto `Turn`, `LLM`, `Tool`, and `SubAgent`.\n- **Existing OTel or telemetry.** Look for any `TracerProvider`, `opentelemetry` setup, or a competing\n  tracing vendor. This affects where you place init, and whether auto-capture already flows somewhere.\n\n### 3. Choose a strategy, then instrument\n\nOpen `references\u002Fdecision.md` for the full procedure. The short version is to decide by shape, probe\nfor coverage, and fall back to the universal path.\n\n1. **What shape does the user want?** An agent-shaped tree (the Agents tab), or flat model-call traces\n   (the Calls tab)?\n2. **What is the agent's structure?** The turn boundary, the model calls, tool dispatch, sub-agents,\n   and any streaming or concurrency. This is what you will instrument, and it exists whatever the\n   library is.\n3. **Probe auto-coverage.** Does the *installed* Weave auto-instrument their library (read the\n   registry: `INTEGRATION_MODULE_MAPPING` in Python, `integrations\u002Fhooks.ts` in TypeScript), and does\n   it emit the shape from step 1? Do not trust a memorized framework list.\n4. **Choose.** If auto-coverage emits the wanted shape, use **OTEL auto** (`weave.init()` alone; do\n   not also hand-wrap, or you will double-log). Otherwise, use the **Session SDK** and map the\n   structure from step 2. If the app already emits OTel spans or owns a `TracerProvider`, use **raw\n   OTEL export** (`references\u002Fotel_endpoint.md`). A mixed approach is normal. Apply any caveats that\n   `references\u002Fotel_auto.md` triggers (the gotcha lookup).\n\nWhen you instrument with the Session SDK, the mapping is the heart of the work.\n\n- **`Turn`** is one cycle of the top-level agent loop handling one user input, and it opens its own\n  trace root. Wrap the loop body, not the whole program.\n- **`LLM`** is one model API call. Wrap the call site, and record the input messages, the output, and\n  the token usage when it is available.\n- **`Tool`** is one tool or function execution. Wrap the dispatch, and record the name, the arguments,\n  and the result.\n- **`SubAgent`** is a delegated or nested agent invocation. Wrap the sub-call.\n\nMap to the agent's *real* semantic boundaries. Not every helper function is a `Tool`, and a retry of\none model call is still one `LLM`. Over-instrumenting produces noisy, misleading traces.\n\n**Never change behavior.** This is instrumentation, so the program must do exactly what it did before.\nPreserve return values and exceptions. Keep spans closed on every path. Python context managers and\nTypeScript try\u002Ffinally do this for you, so use them rather than bare `start`\u002F`end` calls, which can\nleak an open span when an exception is raised. Do not reorder the user's logic or gate it on a span. If\nyou cannot wrap cleanly without restructuring their code, prefer the batch path (Python `log_turn` or\n`log_session`; see the reference) or flag it to the user, rather than forcing an invasive rewrite.\n\n### 4. Verify\n\nInstrumentation you cannot see is worthless, so confirm that traces actually arrive.\n\n- If the app is runnable and credentials are present, run a minimal path (their quickstart, a smoke\n  test, or a tiny script that exercises one turn) and confirm a trace shows up at the project URL.\n  Both the Python and Node `weave.init()` print `View Weave data at\n  https:\u002F\u002Fwandb.ai\u002F\u003Centity>\u002F\u003Cproject>\u002Fweave` at startup, so watch for that line. (The env-var OTEL\n  export prints nothing, so open the project URL there.)\n- **The strongest check is the span *shape*, not the presence of code.** Where you can run a smoke\n  path, capture the emitted spans with an in-memory OTel exporter (no credentials needed) and confirm\n  the operations are what you intended: a `gen_ai.operation.name` of `invoke_agent` for turns and\n  sub-agents, `chat` for model calls, and `execute_tool` for tools, with the turn nesting its LLM and\n  tool spans. This is also how you confirm that an *auto* strategy emits agent shape rather than flat\n  calls, since registry membership alone does not prove it.\n- If you cannot run it (because of missing provider keys or heavy setup), give the user an exact\n  copy-paste command to run themselves, and tell them what to look for: the `View Weave data at\n  https:\u002F\u002Fwandb.ai\u002F...\u002Fweave` line that `weave.init()` prints, and a trace in the Agents or Calls tab.\n- If nothing shows up, the usual causes are auth not actually set in the run's environment, the Python\n  plain-`openai` default-mode gotcha, init placed after the work it should wrap, or (in Node ESM) the\n  missing `--import=weave\u002Finstrument` preload. The OTEL reference lists these.\n\n## Hygiene checklist\n\n- The API key is never touched, read, printed, or committed.\n- Behavior is unchanged: the same outputs, the same exceptions, and spans always closed.\n- No double-instrumentation. Do not add Session SDK spans around calls a framework already\n  auto-captures, or you will get duplicate traces.\n- `weave.init()` appears once per entry point, ordered correctly relative to any user OTel setup.\n- The version is pinned high enough for the APIs you used.\n- The user knows the destination URL and how to verify.\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,49,55,60,90,95,173,199,206,211,291,297,302,309,314,339,344,576,605,611,616,863,869,881,994,999,1054,1080,1122,1128,1133,1251,1257],{"type":42,"tag":43,"props":44,"children":45},"element","h1",{"id":4},[46],{"type":47,"value":48},"text","Weave Instrument",{"type":42,"tag":50,"props":51,"children":52},"p",{},[53],{"type":47,"value":54},"Your job is to add Weave tracing to someone's LLM or agent code so their runs show up in the W&B Weave\nUI. Fit the approach to their codebase instead of applying a one-size-fits-all template.",{"type":42,"tag":50,"props":56,"children":57},{},[58],{"type":47,"value":59},"This skill works for any agent, whatever libraries it uses or none at all. Choose the approach based\non two things:",{"type":42,"tag":61,"props":62,"children":63},"ul",{},[64,78],{"type":42,"tag":65,"props":66,"children":67},"li",{},[68,70,76],{"type":47,"value":69},"the telemetry ",{"type":42,"tag":71,"props":72,"children":73},"em",{},[74],{"type":47,"value":75},"shape",{"type":47,"value":77}," the user wants;",{"type":42,"tag":65,"props":79,"children":80},{},[81,83,88],{"type":47,"value":82},"the ",{"type":42,"tag":71,"props":84,"children":85},{},[86],{"type":47,"value":87},"structure",{"type":47,"value":89}," of their code.",{"type":42,"tag":50,"props":91,"children":92},{},[93],{"type":47,"value":94},"Never choose based on whether you recognize the framework. There are two mechanisms, and one of them\nalways applies.",{"type":42,"tag":96,"props":97,"children":98},"ol",{},[99,148],{"type":42,"tag":65,"props":100,"children":101},{},[102,108,110,117,119,124,125,131,133,139,141,146],{"type":42,"tag":103,"props":104,"children":105},"strong",{},[106],{"type":47,"value":107},"Session SDK (the agent-logging APIs)",{"type":47,"value":109}," is the universal path. You wrap the agent's own structure\nwith ",{"type":42,"tag":111,"props":112,"children":114},"code",{"className":113},[],[115],{"type":47,"value":116},"Turn",{"type":47,"value":118},", ",{"type":42,"tag":111,"props":120,"children":122},{"className":121},[],[123],{"type":47,"value":18},{"type":47,"value":118},{"type":42,"tag":111,"props":126,"children":128},{"className":127},[],[129],{"type":47,"value":130},"Tool",{"type":47,"value":132},", and ",{"type":42,"tag":111,"props":134,"children":136},{"className":135},[],[137],{"type":47,"value":138},"SubAgent",{"type":47,"value":140}," spans. It works for any agent, whether a custom loop, an\nunknown framework, or one that Weave does not map, and it always produces agent-shaped traces. Use\nit whenever you cannot ",{"type":42,"tag":71,"props":142,"children":143},{},[144],{"type":47,"value":145},"prove",{"type":47,"value":147}," that auto-instrumentation emits the shape the user needs.",{"type":42,"tag":65,"props":149,"children":150},{},[151,156,158,164,166,171],{"type":42,"tag":103,"props":152,"children":153},{},[154],{"type":47,"value":155},"OTEL auto-instrumentation",{"type":47,"value":157}," is an optimization for libraries that Weave already recognizes.\n",{"type":42,"tag":111,"props":159,"children":161},{"className":160},[],[162],{"type":47,"value":163},"weave.init()",{"type":47,"value":165}," alone captures them, with no per-call code. Use it only when the installed version of\nWeave auto-instruments the user's library ",{"type":42,"tag":71,"props":167,"children":168},{},[169],{"type":47,"value":170},"and",{"type":47,"value":172}," the shape it emits is the one they want.",{"type":42,"tag":50,"props":174,"children":175},{},[176,178,182,184,189,191,197],{"type":47,"value":177},"Both paths produce OTEL spans. Agent-shaped spans land in Weave's ",{"type":42,"tag":103,"props":179,"children":180},{},[181],{"type":47,"value":23},{"type":47,"value":183}," tab; flat call traces\nland in the ",{"type":42,"tag":103,"props":185,"children":186},{},[187],{"type":47,"value":188},"Calls",{"type":47,"value":190}," tab. The choice between the Session SDK and OTEL auto-instrumentation is driven\nby the shape you need and the structure of the code, not by framework identity. See\n",{"type":42,"tag":111,"props":192,"children":194},{"className":193},[],[195],{"type":47,"value":196},"references\u002Fdecision.md",{"type":47,"value":198}," for the full procedure.",{"type":42,"tag":200,"props":201,"children":203},"h2",{"id":202},"reference-material-read-the-one-you-need",[204],{"type":47,"value":205},"Reference material (read the one you need)",{"type":42,"tag":50,"props":207,"children":208},{},[209],{"type":47,"value":210},"Keep this file in context, and open a reference only when you reach the step that needs it. Each one is\na precise, source-grounded cheat-sheet. Do not reconstruct the API from memory: the surface is new and\neasy to get subtly wrong.",{"type":42,"tag":61,"props":212,"children":213},{},[214,224,235,254,272],{"type":42,"tag":65,"props":215,"children":216},{},[217,222],{"type":42,"tag":111,"props":218,"children":220},{"className":219},[],[221],{"type":47,"value":196},{"type":47,"value":223}," is the full decision procedure (shape, then structure, then probe, then\nstrategy) and the coverage examples. Read it during \"Choose a strategy\" below.",{"type":42,"tag":65,"props":225,"children":226},{},[227,233],{"type":42,"tag":111,"props":228,"children":230},{"className":229},[],[231],{"type":47,"value":232},"references\u002Fsession_sdk_python.md",{"type":47,"value":234}," covers the Python Session SDK: the classes, the context-manager\npattern, the batch path, and the data types. Read it when instrumenting Python with the Session SDK.",{"type":42,"tag":65,"props":236,"children":237},{},[238,244,246,252],{"type":42,"tag":111,"props":239,"children":241},{"className":240},[],[242],{"type":47,"value":243},"references\u002Fsession_sdk_typescript.md",{"type":47,"value":245}," covers the TypeScript Session SDK: the ",{"type":42,"tag":111,"props":247,"children":249},{"className":248},[],[250],{"type":47,"value":251},"start*",{"type":47,"value":253}," functions, the\ntry\u002Ffinally pattern, async init, and concurrency. Read it when instrumenting TypeScript or Node.",{"type":42,"tag":65,"props":255,"children":256},{},[257,263,265,270],{"type":42,"tag":111,"props":258,"children":260},{"className":259},[],[261],{"type":47,"value":262},"references\u002Fotel_auto.md",{"type":47,"value":264}," covers the OTEL auto path: what ",{"type":42,"tag":111,"props":266,"children":268},{"className":267},[],[269],{"type":47,"value":163},{"type":47,"value":271}," captures on its own, the\ndefault-mode gotchas, and the framework caveats. Read it when OTEL auto is the chosen strategy.",{"type":42,"tag":65,"props":273,"children":274},{},[275,281,283,289],{"type":42,"tag":111,"props":276,"children":278},{"className":277},[],[279],{"type":47,"value":280},"references\u002Fotel_endpoint.md",{"type":47,"value":282}," covers exporting OTEL directly to Weave's endpoint (the raw-OTEL\npath): the environment-variable config, and how to add Weave's exporter to an app's own\n",{"type":42,"tag":111,"props":284,"children":286},{"className":285},[],[287],{"type":47,"value":288},"TracerProvider",{"type":47,"value":290},". Read it when the app already emits OTel spans or owns its OTel setup.",{"type":42,"tag":200,"props":292,"children":294},{"id":293},"workflow",[295],{"type":47,"value":296},"Workflow",{"type":42,"tag":50,"props":298,"children":299},{},[300],{"type":47,"value":301},"Work through these steps in order. Steps 1 and 4 always run. Use your judgement for steps 2 and 3.",{"type":42,"tag":303,"props":304,"children":306},"h3",{"id":305},"_1-establish-the-connection-always-confirm-before-editing-widely",[307],{"type":47,"value":308},"1. Establish the connection (always; confirm before editing widely)",{"type":42,"tag":50,"props":310,"children":311},{},[312],{"type":47,"value":313},"A user's traces need three things:",{"type":42,"tag":96,"props":315,"children":316},{},[317,322,327],{"type":42,"tag":65,"props":318,"children":319},{},[320],{"type":47,"value":321},"the package installed;",{"type":42,"tag":65,"props":323,"children":324},{},[325],{"type":47,"value":326},"credentials present;",{"type":42,"tag":65,"props":328,"children":329},{},[330,332,337],{"type":47,"value":331},"a ",{"type":42,"tag":111,"props":333,"children":335},{"className":334},[],[336],{"type":47,"value":163},{"type":47,"value":338}," call.",{"type":42,"tag":50,"props":340,"children":341},{},[342],{"type":47,"value":343},"Settle these first. There is no point instrumenting code that cannot authenticate.",{"type":42,"tag":61,"props":345,"children":346},{},[347,405,480,514],{"type":42,"tag":65,"props":348,"children":349},{},[350,355,357,363,365,371,373,379,381,387,389,395,397,403],{"type":42,"tag":103,"props":351,"children":352},{},[353],{"type":47,"value":354},"Install or confirm the package.",{"type":47,"value":356}," In Python, the package is ",{"type":42,"tag":111,"props":358,"children":360},{"className":359},[],[361],{"type":47,"value":362},"weave",{"type":47,"value":364}," on PyPI (",{"type":42,"tag":111,"props":366,"children":368},{"className":367},[],[369],{"type":47,"value":370},"pip install weave",{"type":47,"value":372},",\nor add it to their manifest). The Session SDK needs ",{"type":42,"tag":111,"props":374,"children":376},{"className":375},[],[377],{"type":47,"value":378},"weave>=0.52.42",{"type":47,"value":380},". ",{"type":42,"tag":111,"props":382,"children":384},{"className":383},[],[385],{"type":47,"value":386},"set_attributes",{"type":47,"value":388}," and\n",{"type":42,"tag":111,"props":390,"children":392},{"className":391},[],[393],{"type":47,"value":394},"add_event",{"type":47,"value":396}," need a newer build, so check the Python reference before relying on those. In Node, run\n",{"type":42,"tag":111,"props":398,"children":400},{"className":399},[],[401],{"type":47,"value":402},"npm install weave",{"type":47,"value":404},". The OTEL dependencies ship bundled in both, so the user adds nothing extra.",{"type":42,"tag":65,"props":406,"children":407},{},[408,413,415,421,423,431,433,439,441,447,449,454,456,462,464,470,472,478],{"type":42,"tag":103,"props":409,"children":410},{},[411],{"type":47,"value":412},"Authentication is the user's job, not yours, so never handle their key.",{"type":47,"value":414}," A W&B API key is a\nsecret, and it must not enter your context or the repo. Tell the user to authenticate in their own\nterminal: set ",{"type":42,"tag":111,"props":416,"children":418},{"className":417},[],[419],{"type":47,"value":420},"WANDB_API_KEY",{"type":47,"value":422}," (from ",{"type":42,"tag":424,"props":425,"children":429},"a",{"href":426,"rel":427},"https:\u002F\u002Fwandb.ai\u002Fauthorize",[428],"nofollow",[430],{"type":47,"value":426},{"type":47,"value":432},"), or run ",{"type":42,"tag":111,"props":434,"children":436},{"className":435},[],[437],{"type":47,"value":438},"wandb login",{"type":47,"value":440}," (Python) or\n",{"type":42,"tag":111,"props":442,"children":444},{"className":443},[],[445],{"type":47,"value":446},"await weave.login(key)",{"type":47,"value":448}," once (Node). You may check ",{"type":42,"tag":71,"props":450,"children":451},{},[452],{"type":47,"value":453},"that",{"type":47,"value":455}," a key is reachable (the env var is set,\nor ",{"type":42,"tag":111,"props":457,"children":459},{"className":458},[],[460],{"type":47,"value":461},"~\u002F.netrc",{"type":47,"value":463}," has an ",{"type":42,"tag":111,"props":465,"children":467},{"className":466},[],[468],{"type":47,"value":469},"api.wandb.ai",{"type":47,"value":471}," entry), but never read or print its value, and never write it\ninto source code or into a committed ",{"type":42,"tag":111,"props":473,"children":475},{"className":474},[],[476],{"type":47,"value":477},".env",{"type":47,"value":479},".",{"type":42,"tag":65,"props":481,"children":482},{},[483,488,490,496,498,504,506,512],{"type":42,"tag":103,"props":484,"children":485},{},[486],{"type":47,"value":487},"Get the project name.",{"type":47,"value":489}," Ask for it as ",{"type":42,"tag":111,"props":491,"children":493},{"className":492},[],[494],{"type":47,"value":495},"entity\u002Fproject",{"type":47,"value":497},", or as just ",{"type":42,"tag":111,"props":499,"children":501},{"className":500},[],[502],{"type":47,"value":503},"project",{"type":47,"value":505}," to use their default\nentity. Show them the URL their traces will land at up front,\n",{"type":42,"tag":111,"props":507,"children":509},{"className":508},[],[510],{"type":47,"value":511},"https:\u002F\u002Fwandb.ai\u002F\u003Centity>\u002F\u003Cproject>\u002Fweave",{"type":47,"value":513},", so there are no surprises about where the data goes.",{"type":42,"tag":65,"props":515,"children":516},{},[517,530,532,538,540,546,548,554,556,561,562,567,569,574],{"type":42,"tag":103,"props":518,"children":519},{},[520,522,528],{"type":47,"value":521},"Add ",{"type":42,"tag":111,"props":523,"children":525},{"className":524},[],[526],{"type":47,"value":527},"weave.init(\"entity\u002Fproject\")",{"type":47,"value":529}," once",{"type":47,"value":531}," at each real entry point: the ",{"type":42,"tag":111,"props":533,"children":535},{"className":534},[],[536],{"type":47,"value":537},"main()",{"type":47,"value":539}," function, the\nserver startup, or the top of a script. Do not put it inside a hot loop. In Python:\n",{"type":42,"tag":111,"props":541,"children":543},{"className":542},[],[544],{"type":47,"value":545},"import weave; weave.init(\"entity\u002Fproject\")",{"type":47,"value":547},". In Node: ",{"type":42,"tag":111,"props":549,"children":551},{"className":550},[],[552],{"type":47,"value":553},"await weave.init('entity\u002Fproject')",{"type":47,"value":555},". It is\nasync, so you must await it before any traced work. If the app installs its own global\n",{"type":42,"tag":111,"props":557,"children":559},{"className":558},[],[560],{"type":47,"value":288},{"type":47,"value":118},{"type":42,"tag":111,"props":563,"children":565},{"className":564},[],[566],{"type":47,"value":163},{"type":47,"value":568}," backs off and will not export to Weave; add Weave's exporter to\ntheir provider instead (see ",{"type":42,"tag":111,"props":570,"children":572},{"className":571},[],[573],{"type":47,"value":280},{"type":47,"value":575},"). The calls are safe no-ops when init or\nauth is missing, so leaving instrumentation in place never breaks their program.",{"type":42,"tag":50,"props":577,"children":578},{},[579,581,587,589,595,597,603],{"type":47,"value":580},"Before touching many files, state the plan in a sentence or two (\"I'll use the Session SDK to wrap\nyour agent loop in ",{"type":42,"tag":111,"props":582,"children":584},{"className":583},[],[585],{"type":47,"value":586},"agent.py",{"type":47,"value":588},", and add ",{"type":42,"tag":111,"props":590,"children":592},{"className":591},[],[593],{"type":47,"value":594},"weave.init",{"type":47,"value":596}," in ",{"type":42,"tag":111,"props":598,"children":600},{"className":599},[],[601],{"type":47,"value":602},"main.py",{"type":47,"value":604},"\") and let the user redirect you.\nInstrumenting edits their source, so a quick checkpoint beats a large surprise diff.",{"type":42,"tag":303,"props":606,"children":608},{"id":607},"_2-survey-the-codebase",[609],{"type":47,"value":610},"2. Survey the codebase",{"type":42,"tag":50,"props":612,"children":613},{},[614],{"type":47,"value":615},"You cannot choose a strategy without knowing what they run. Find the following.",{"type":42,"tag":61,"props":617,"children":618},{},[619,629,797,839],{"type":42,"tag":65,"props":620,"children":621},{},[622,627],{"type":42,"tag":103,"props":623,"children":624},{},[625],{"type":47,"value":626},"The languages:",{"type":47,"value":628}," Python, TypeScript\u002FNode, or both.",{"type":42,"tag":65,"props":630,"children":631},{},[632,637,639,644,646],{"type":42,"tag":103,"props":633,"children":634},{},[635],{"type":47,"value":636},"The LLM and agent libraries.",{"type":47,"value":638}," Grep the imports and read the dependency manifest, and note the\n",{"type":42,"tag":71,"props":640,"children":641},{},[642],{"type":47,"value":643},"exact",{"type":47,"value":645}," package. The names differ by language, so check the manifest that applies. Step 3 is where\nyou resolve whether the installed Weave auto-instruments each one, and whether it emits agent shape\nor flat calls, so do not assume from the name.\n",{"type":42,"tag":61,"props":647,"children":648},{},[649,737],{"type":42,"tag":65,"props":650,"children":651},{},[652,654,660,662,668,670,676,677,683,684,690,692,698,700,706,708,714,715,721,722,728,729,735],{"type":47,"value":653},"Python (",{"type":42,"tag":111,"props":655,"children":657},{"className":656},[],[658],{"type":47,"value":659},"pyproject.toml",{"type":47,"value":661}," \u002F ",{"type":42,"tag":111,"props":663,"children":665},{"className":664},[],[666],{"type":47,"value":667},"requirements.txt",{"type":47,"value":669},"): ",{"type":42,"tag":111,"props":671,"children":673},{"className":672},[],[674],{"type":47,"value":675},"openai",{"type":47,"value":118},{"type":42,"tag":111,"props":678,"children":680},{"className":679},[],[681],{"type":47,"value":682},"anthropic",{"type":47,"value":118},{"type":42,"tag":111,"props":685,"children":687},{"className":686},[],[688],{"type":47,"value":689},"langchain",{"type":47,"value":691},",\n",{"type":42,"tag":111,"props":693,"children":695},{"className":694},[],[696],{"type":47,"value":697},"openai-agents",{"type":47,"value":699}," (",{"type":42,"tag":111,"props":701,"children":703},{"className":702},[],[704],{"type":47,"value":705},"import agents",{"type":47,"value":707},"), ",{"type":42,"tag":111,"props":709,"children":711},{"className":710},[],[712],{"type":47,"value":713},"claude_agent_sdk",{"type":47,"value":118},{"type":42,"tag":111,"props":716,"children":718},{"className":717},[],[719],{"type":47,"value":720},"google.adk",{"type":47,"value":118},{"type":42,"tag":111,"props":723,"children":725},{"className":724},[],[726],{"type":47,"value":727},"crewai",{"type":47,"value":118},{"type":42,"tag":111,"props":730,"children":732},{"className":731},[],[733],{"type":47,"value":734},"llama_index",{"type":47,"value":736},", and\nso on.",{"type":42,"tag":65,"props":738,"children":739},{},[740,742,748,749,754,755,761,762,768,769,775,776,782,783,788,789,795],{"type":47,"value":741},"TypeScript (",{"type":42,"tag":111,"props":743,"children":745},{"className":744},[],[746],{"type":47,"value":747},"package.json",{"type":47,"value":669},{"type":42,"tag":111,"props":750,"children":752},{"className":751},[],[753],{"type":47,"value":675},{"type":47,"value":118},{"type":42,"tag":111,"props":756,"children":758},{"className":757},[],[759],{"type":47,"value":760},"@anthropic-ai\u002Fsdk",{"type":47,"value":118},{"type":42,"tag":111,"props":763,"children":765},{"className":764},[],[766],{"type":47,"value":767},"@google\u002Fgenai",{"type":47,"value":118},{"type":42,"tag":111,"props":770,"children":772},{"className":771},[],[773],{"type":47,"value":774},"@openai\u002Fagents",{"type":47,"value":691},{"type":42,"tag":111,"props":777,"children":779},{"className":778},[],[780],{"type":47,"value":781},"@anthropic-ai\u002Fclaude-agent-sdk",{"type":47,"value":118},{"type":42,"tag":111,"props":784,"children":786},{"className":785},[],[787],{"type":47,"value":689},{"type":47,"value":118},{"type":42,"tag":111,"props":790,"children":792},{"className":791},[],[793],{"type":47,"value":794},"llamaindex",{"type":47,"value":796},", and so on.",{"type":42,"tag":65,"props":798,"children":799},{},[800,805,807,813,815,820,821,826,827,832,833,838],{"type":42,"tag":103,"props":801,"children":802},{},[803],{"type":47,"value":804},"The agent's shape.",{"type":47,"value":806}," Is there a hand-rolled loop (a ",{"type":42,"tag":111,"props":808,"children":810},{"className":809},[],[811],{"type":47,"value":812},"while",{"type":47,"value":814}," that calls the model, dispatches\ntools, and repeats)? Where is each model call? Where are tools dispatched? Is there delegation to\nsub-agents? These map directly onto ",{"type":42,"tag":111,"props":816,"children":818},{"className":817},[],[819],{"type":47,"value":116},{"type":47,"value":118},{"type":42,"tag":111,"props":822,"children":824},{"className":823},[],[825],{"type":47,"value":18},{"type":47,"value":118},{"type":42,"tag":111,"props":828,"children":830},{"className":829},[],[831],{"type":47,"value":130},{"type":47,"value":132},{"type":42,"tag":111,"props":834,"children":836},{"className":835},[],[837],{"type":47,"value":138},{"type":47,"value":479},{"type":42,"tag":65,"props":840,"children":841},{},[842,847,849,854,855,861],{"type":42,"tag":103,"props":843,"children":844},{},[845],{"type":47,"value":846},"Existing OTel or telemetry.",{"type":47,"value":848}," Look for any ",{"type":42,"tag":111,"props":850,"children":852},{"className":851},[],[853],{"type":47,"value":288},{"type":47,"value":118},{"type":42,"tag":111,"props":856,"children":858},{"className":857},[],[859],{"type":47,"value":860},"opentelemetry",{"type":47,"value":862}," setup, or a competing\ntracing vendor. This affects where you place init, and whether auto-capture already flows somewhere.",{"type":42,"tag":303,"props":864,"children":866},{"id":865},"_3-choose-a-strategy-then-instrument",[867],{"type":47,"value":868},"3. Choose a strategy, then instrument",{"type":42,"tag":50,"props":870,"children":871},{},[872,874,879],{"type":47,"value":873},"Open ",{"type":42,"tag":111,"props":875,"children":877},{"className":876},[],[878],{"type":47,"value":196},{"type":47,"value":880}," for the full procedure. The short version is to decide by shape, probe\nfor coverage, and fall back to the universal path.",{"type":42,"tag":96,"props":882,"children":883},{},[884,894,904,937],{"type":42,"tag":65,"props":885,"children":886},{},[887,892],{"type":42,"tag":103,"props":888,"children":889},{},[890],{"type":47,"value":891},"What shape does the user want?",{"type":47,"value":893}," An agent-shaped tree (the Agents tab), or flat model-call traces\n(the Calls tab)?",{"type":42,"tag":65,"props":895,"children":896},{},[897,902],{"type":42,"tag":103,"props":898,"children":899},{},[900],{"type":47,"value":901},"What is the agent's structure?",{"type":47,"value":903}," The turn boundary, the model calls, tool dispatch, sub-agents,\nand any streaming or concurrency. This is what you will instrument, and it exists whatever the\nlibrary is.",{"type":42,"tag":65,"props":905,"children":906},{},[907,912,914,919,921,927,929,935],{"type":42,"tag":103,"props":908,"children":909},{},[910],{"type":47,"value":911},"Probe auto-coverage.",{"type":47,"value":913}," Does the ",{"type":42,"tag":71,"props":915,"children":916},{},[917],{"type":47,"value":918},"installed",{"type":47,"value":920}," Weave auto-instrument their library (read the\nregistry: ",{"type":42,"tag":111,"props":922,"children":924},{"className":923},[],[925],{"type":47,"value":926},"INTEGRATION_MODULE_MAPPING",{"type":47,"value":928}," in Python, ",{"type":42,"tag":111,"props":930,"children":932},{"className":931},[],[933],{"type":47,"value":934},"integrations\u002Fhooks.ts",{"type":47,"value":936}," in TypeScript), and does\nit emit the shape from step 1? Do not trust a memorized framework list.",{"type":42,"tag":65,"props":938,"children":939},{},[940,945,947,952,953,958,960,965,967,972,974,979,980,985,987,992],{"type":42,"tag":103,"props":941,"children":942},{},[943],{"type":47,"value":944},"Choose.",{"type":47,"value":946}," If auto-coverage emits the wanted shape, use ",{"type":42,"tag":103,"props":948,"children":949},{},[950],{"type":47,"value":951},"OTEL auto",{"type":47,"value":699},{"type":42,"tag":111,"props":954,"children":956},{"className":955},[],[957],{"type":47,"value":163},{"type":47,"value":959}," alone; do\nnot also hand-wrap, or you will double-log). Otherwise, use the ",{"type":42,"tag":103,"props":961,"children":962},{},[963],{"type":47,"value":964},"Session SDK",{"type":47,"value":966}," and map the\nstructure from step 2. If the app already emits OTel spans or owns a ",{"type":42,"tag":111,"props":968,"children":970},{"className":969},[],[971],{"type":47,"value":288},{"type":47,"value":973},", use ",{"type":42,"tag":103,"props":975,"children":976},{},[977],{"type":47,"value":978},"raw\nOTEL export",{"type":47,"value":699},{"type":42,"tag":111,"props":981,"children":983},{"className":982},[],[984],{"type":47,"value":280},{"type":47,"value":986},"). A mixed approach is normal. Apply any caveats that\n",{"type":42,"tag":111,"props":988,"children":990},{"className":989},[],[991],{"type":47,"value":262},{"type":47,"value":993}," triggers (the gotcha lookup).",{"type":42,"tag":50,"props":995,"children":996},{},[997],{"type":47,"value":998},"When you instrument with the Session SDK, the mapping is the heart of the work.",{"type":42,"tag":61,"props":1000,"children":1001},{},[1002,1015,1028,1041],{"type":42,"tag":65,"props":1003,"children":1004},{},[1005,1013],{"type":42,"tag":103,"props":1006,"children":1007},{},[1008],{"type":42,"tag":111,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":47,"value":116},{"type":47,"value":1014}," is one cycle of the top-level agent loop handling one user input, and it opens its own\ntrace root. Wrap the loop body, not the whole program.",{"type":42,"tag":65,"props":1016,"children":1017},{},[1018,1026],{"type":42,"tag":103,"props":1019,"children":1020},{},[1021],{"type":42,"tag":111,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":47,"value":18},{"type":47,"value":1027}," is one model API call. Wrap the call site, and record the input messages, the output, and\nthe token usage when it is available.",{"type":42,"tag":65,"props":1029,"children":1030},{},[1031,1039],{"type":42,"tag":103,"props":1032,"children":1033},{},[1034],{"type":42,"tag":111,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":47,"value":130},{"type":47,"value":1040}," is one tool or function execution. Wrap the dispatch, and record the name, the arguments,\nand the result.",{"type":42,"tag":65,"props":1042,"children":1043},{},[1044,1052],{"type":42,"tag":103,"props":1045,"children":1046},{},[1047],{"type":42,"tag":111,"props":1048,"children":1050},{"className":1049},[],[1051],{"type":47,"value":138},{"type":47,"value":1053}," is a delegated or nested agent invocation. Wrap the sub-call.",{"type":42,"tag":50,"props":1055,"children":1056},{},[1057,1059,1064,1066,1071,1073,1078],{"type":47,"value":1058},"Map to the agent's ",{"type":42,"tag":71,"props":1060,"children":1061},{},[1062],{"type":47,"value":1063},"real",{"type":47,"value":1065}," semantic boundaries. Not every helper function is a ",{"type":42,"tag":111,"props":1067,"children":1069},{"className":1068},[],[1070],{"type":47,"value":130},{"type":47,"value":1072},", and a retry of\none model call is still one ",{"type":42,"tag":111,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":47,"value":18},{"type":47,"value":1079},". Over-instrumenting produces noisy, misleading traces.",{"type":42,"tag":50,"props":1081,"children":1082},{},[1083,1088,1090,1096,1098,1104,1106,1112,1114,1120],{"type":42,"tag":103,"props":1084,"children":1085},{},[1086],{"type":47,"value":1087},"Never change behavior.",{"type":47,"value":1089}," This is instrumentation, so the program must do exactly what it did before.\nPreserve return values and exceptions. Keep spans closed on every path. Python context managers and\nTypeScript try\u002Ffinally do this for you, so use them rather than bare ",{"type":42,"tag":111,"props":1091,"children":1093},{"className":1092},[],[1094],{"type":47,"value":1095},"start",{"type":47,"value":1097},"\u002F",{"type":42,"tag":111,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":47,"value":1103},"end",{"type":47,"value":1105}," calls, which can\nleak an open span when an exception is raised. Do not reorder the user's logic or gate it on a span. If\nyou cannot wrap cleanly without restructuring their code, prefer the batch path (Python ",{"type":42,"tag":111,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":47,"value":1111},"log_turn",{"type":47,"value":1113}," or\n",{"type":42,"tag":111,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":47,"value":1119},"log_session",{"type":47,"value":1121},"; see the reference) or flag it to the user, rather than forcing an invasive rewrite.",{"type":42,"tag":303,"props":1123,"children":1125},{"id":1124},"_4-verify",[1126],{"type":47,"value":1127},"4. Verify",{"type":42,"tag":50,"props":1129,"children":1130},{},[1131],{"type":47,"value":1132},"Instrumentation you cannot see is worthless, so confirm that traces actually arrive.",{"type":42,"tag":61,"props":1134,"children":1135},{},[1136,1156,1211,1231],{"type":42,"tag":65,"props":1137,"children":1138},{},[1139,1141,1146,1148,1154],{"type":47,"value":1140},"If the app is runnable and credentials are present, run a minimal path (their quickstart, a smoke\ntest, or a tiny script that exercises one turn) and confirm a trace shows up at the project URL.\nBoth the Python and Node ",{"type":42,"tag":111,"props":1142,"children":1144},{"className":1143},[],[1145],{"type":47,"value":163},{"type":47,"value":1147}," print ",{"type":42,"tag":111,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":47,"value":1153},"View Weave data at https:\u002F\u002Fwandb.ai\u002F\u003Centity>\u002F\u003Cproject>\u002Fweave",{"type":47,"value":1155}," at startup, so watch for that line. (The env-var OTEL\nexport prints nothing, so open the project URL there.)",{"type":42,"tag":65,"props":1157,"children":1158},{},[1159,1170,1172,1178,1180,1186,1188,1194,1196,1202,1204,1209],{"type":42,"tag":103,"props":1160,"children":1161},{},[1162,1164,1168],{"type":47,"value":1163},"The strongest check is the span ",{"type":42,"tag":71,"props":1165,"children":1166},{},[1167],{"type":47,"value":75},{"type":47,"value":1169},", not the presence of code.",{"type":47,"value":1171}," Where you can run a smoke\npath, capture the emitted spans with an in-memory OTel exporter (no credentials needed) and confirm\nthe operations are what you intended: a ",{"type":42,"tag":111,"props":1173,"children":1175},{"className":1174},[],[1176],{"type":47,"value":1177},"gen_ai.operation.name",{"type":47,"value":1179}," of ",{"type":42,"tag":111,"props":1181,"children":1183},{"className":1182},[],[1184],{"type":47,"value":1185},"invoke_agent",{"type":47,"value":1187}," for turns and\nsub-agents, ",{"type":42,"tag":111,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":47,"value":1193},"chat",{"type":47,"value":1195}," for model calls, and ",{"type":42,"tag":111,"props":1197,"children":1199},{"className":1198},[],[1200],{"type":47,"value":1201},"execute_tool",{"type":47,"value":1203}," for tools, with the turn nesting its LLM and\ntool spans. This is also how you confirm that an ",{"type":42,"tag":71,"props":1205,"children":1206},{},[1207],{"type":47,"value":1208},"auto",{"type":47,"value":1210}," strategy emits agent shape rather than flat\ncalls, since registry membership alone does not prove it.",{"type":42,"tag":65,"props":1212,"children":1213},{},[1214,1216,1222,1224,1229],{"type":47,"value":1215},"If you cannot run it (because of missing provider keys or heavy setup), give the user an exact\ncopy-paste command to run themselves, and tell them what to look for: the ",{"type":42,"tag":111,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":47,"value":1221},"View Weave data at https:\u002F\u002Fwandb.ai\u002F...\u002Fweave",{"type":47,"value":1223}," line that ",{"type":42,"tag":111,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":47,"value":163},{"type":47,"value":1230}," prints, and a trace in the Agents or Calls tab.",{"type":42,"tag":65,"props":1232,"children":1233},{},[1234,1236,1241,1243,1249],{"type":47,"value":1235},"If nothing shows up, the usual causes are auth not actually set in the run's environment, the Python\nplain-",{"type":42,"tag":111,"props":1237,"children":1239},{"className":1238},[],[1240],{"type":47,"value":675},{"type":47,"value":1242}," default-mode gotcha, init placed after the work it should wrap, or (in Node ESM) the\nmissing ",{"type":42,"tag":111,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":47,"value":1248},"--import=weave\u002Finstrument",{"type":47,"value":1250}," preload. The OTEL reference lists these.",{"type":42,"tag":200,"props":1252,"children":1254},{"id":1253},"hygiene-checklist",[1255],{"type":47,"value":1256},"Hygiene checklist",{"type":42,"tag":61,"props":1258,"children":1259},{},[1260,1265,1270,1275,1285,1290],{"type":42,"tag":65,"props":1261,"children":1262},{},[1263],{"type":47,"value":1264},"The API key is never touched, read, printed, or committed.",{"type":42,"tag":65,"props":1266,"children":1267},{},[1268],{"type":47,"value":1269},"Behavior is unchanged: the same outputs, the same exceptions, and spans always closed.",{"type":42,"tag":65,"props":1271,"children":1272},{},[1273],{"type":47,"value":1274},"No double-instrumentation. Do not add Session SDK spans around calls a framework already\nauto-captures, or you will get duplicate traces.",{"type":42,"tag":65,"props":1276,"children":1277},{},[1278,1283],{"type":42,"tag":111,"props":1279,"children":1281},{"className":1280},[],[1282],{"type":47,"value":163},{"type":47,"value":1284}," appears once per entry point, ordered correctly relative to any user OTel setup.",{"type":42,"tag":65,"props":1286,"children":1287},{},[1288],{"type":47,"value":1289},"The version is pinned high enough for the APIs you used.",{"type":42,"tag":65,"props":1291,"children":1292},{},[1293],{"type":47,"value":1294},"The user knows the destination URL and how to verify.",{"items":1296,"total":1339},[1297,1304,1328,1342,1355,1365,1380,1393,1404],{"slug":4,"name":4,"fn":5,"description":6,"org":1298,"tags":1299,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1300,1301,1302,1303],{"name":23,"slug":24,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":21,"type":16},{"slug":1305,"name":1305,"fn":1306,"description":1307,"org":1308,"tags":1309,"stars":1325,"repoUrl":1326,"updatedAt":1327},"wandb-primary","manage Weights & Biases projects and runs","Primary W&B skill for broad or mixed Weights & Biases work: project overviews, W&B runs and artifacts, Weave traces and evaluations, Reports, and Launch workflows. Use when the task spans multiple W&B surfaces or the user asks generally what is happening in a W&B project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1310,1313,1316,1319,1322],{"name":1311,"slug":1312,"type":16},"Data Analysis","data-analysis",{"name":1314,"slug":1315,"type":16},"Evals","evals",{"name":1317,"slug":1318,"type":16},"MLOps","mlops",{"name":1320,"slug":1321,"type":16},"Monitoring","monitoring",{"name":1323,"slug":1324,"type":16},"Tracing","tracing",60,"https:\u002F\u002Fgithub.com\u002Fwandb\u002Fskills","2026-07-17T06:06:35.194929",{"slug":1329,"name":1329,"fn":1330,"description":1331,"org":1332,"tags":1333,"stars":1339,"repoUrl":1340,"updatedAt":1341},"weave-config","configure Weave project and settings","This skill should be used when the user wants to \"configure weave\", \"set weave project\", \"change weave project\", \"set wandb api key\", \"update weave settings\", \"show weave config\", \"change weave configuration\", \"restart the weave daemon\", \"apply weave config changes\", \"restart weave to pick up changes\", or needs to read or update any Weave Claude Code plugin settings.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1334,1337,1338],{"name":1335,"slug":1336,"type":16},"Configuration","configuration",{"name":14,"slug":15,"type":16},{"name":9,"slug":21,"type":16},9,"https:\u002F\u002Fgithub.com\u002Fwandb\u002Fweave-claude-code","2026-07-17T06:07:38.107392",{"slug":1343,"name":1343,"fn":1344,"description":1345,"org":1346,"tags":1347,"stars":1339,"repoUrl":1340,"updatedAt":1354},"weave-install","install and configure Weave observability","This skill should be used when the user wants to \"install the weave plugin\", \"set up weave\", \"install weave-claude-code\", \"configure weave for the first time\", \"get started with weave tracing\", or needs to complete the initial setup of the Weave Claude Code plugin including dependency installation and project configuration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1348,1351,1352,1353],{"name":1349,"slug":1350,"type":16},"Claude Code","claude-code",{"name":1335,"slug":1336,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":21,"type":16},"2026-07-17T06:06:35.660384",{"slug":1356,"name":1356,"fn":1357,"description":1358,"org":1359,"tags":1360,"stars":1339,"repoUrl":1340,"updatedAt":1364},"weave-status","verify Weave plugin status and health","This skill should be used when the user wants to \"check weave status\", \"verify the weave plugin is running\", \"see if weave is set up correctly\", \"check weave configuration\", \"is weave working\", \"weave is running an older config\", \"the daemon is on an old config\", or needs to diagnose why Claude Code sessions are not appearing in Weave.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1361,1362,1363],{"name":1320,"slug":1321,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":21,"type":16},"2026-07-17T06:07:58.961737",{"slug":1366,"name":1366,"fn":1367,"description":1368,"org":1369,"tags":1370,"stars":1377,"repoUrl":1378,"updatedAt":1379},"annotation-improvement","improve prompts using Weave research traces","Guides coding agents through Discovery Forge prompt improvement after selecting the `wandb-primary` skill. Use `wandb-primary` to fetch W&B Weave research_run traces, human annotations, runnable feedback, and evaluations, then use this workflow when improving researcher.md from annotation queues, reviewed research traces, or human feedback.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1371,1372,1373,1376],{"name":23,"slug":24,"type":16},{"name":1314,"slug":1315,"type":16},{"name":1374,"slug":1375,"type":16},"Prompt Engineering","prompt-engineering",{"name":9,"slug":21,"type":16},2,"https:\u002F\u002Fgithub.com\u002Fwandb\u002Fdiscovery-forge","2026-07-17T06:06:36.008062",{"slug":1381,"name":1381,"fn":1382,"description":1383,"org":1384,"tags":1385,"stars":1377,"repoUrl":1378,"updatedAt":1392},"build-verdict-dataset","build verdict datasets from Weave annotations","Guides coding agents through building the verdict_quality_dataset from W&B Weave research_annotation evidence — querying annotated research_run calls, mapping human QualitySelector verdicts to gold labels, refining row inputs per the rubric, and publishing a new versioned Weave Dataset. Use when the user asks to (re)generate the verdict dataset from annotations, seed a new eval dataset version, or rebuild verdict_quality_dataset.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1386,1387,1390,1391],{"name":1311,"slug":1312,"type":16},{"name":1388,"slug":1389,"type":16},"Datasets","datasets",{"name":1314,"slug":1315,"type":16},{"name":9,"slug":21,"type":16},"2026-07-17T06:07:59.30763",{"slug":1394,"name":1394,"fn":1395,"description":1396,"org":1397,"tags":1398,"stars":1377,"repoUrl":1378,"updatedAt":1403},"offline-eval-improvement","improve prompts using offline evaluation baselines","Guides coding agents through Discovery Forge prompt improvement from a specified Weave offline evaluation baseline. Use `wandb-primary` to fetch evaluation results, failed eval rows, dataset refs, prompt refs, and scorer evidence, then use this workflow when improving researcher.md from failed evaluation rows, comparing eval runs, or iterating on a fixed dataset.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1399,1400,1401,1402],{"name":23,"slug":24,"type":16},{"name":1388,"slug":1389,"type":16},{"name":1314,"slug":1315,"type":16},{"name":9,"slug":21,"type":16},"2026-07-17T06:07:26.501045",{"slug":1405,"name":1405,"fn":1406,"description":1407,"org":1408,"tags":1409,"stars":1377,"repoUrl":1416,"updatedAt":1417},"weave-integration","integrate Weave into applications","Comprehensive skill for adding W&B Weave to existing applications. Covers trace-first instrumentation, evaluation only after trace verification, documentation-first implementation, CLI-based Weave data access, and validation workflows. Activate this skill only when the user explicitly mentions the skill by name, such as `weave-integration`, `@skills weave-integration`, or another direct skill reference. Do not auto-trigger from generic Weave or W&B questions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1410,1413,1414,1415],{"name":1411,"slug":1412,"type":16},"Instrumentation","instrumentation",{"name":14,"slug":15,"type":16},{"name":1323,"slug":1324,"type":16},{"name":9,"slug":21,"type":16},"https:\u002F\u002Fgithub.com\u002Fwandb\u002Fweave-integration-skills","2026-07-17T06:07:59.666449",{"items":1419,"total":1427},[1420],{"slug":4,"name":4,"fn":5,"description":6,"org":1421,"tags":1422,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1423,1424,1425,1426],{"name":23,"slug":24,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":21,"type":16},1]