# Auto-Instrumentation (TypeScript) Automatically create spans for LLM calls without code changes. ## Supported Frameworks - **LLM SDKs:** OpenAI - **Frameworks:** LangChain - **Install:** `npm install @arizeai/openinference-instrumentation-{name}` ## Setup **CommonJS (automatic):** ```javascript const { register } = require("@arizeai/phoenix-otel"); const OpenAI = require("openai"); register({ projectName: "my-app" }); const client = new OpenAI(); ``` **ESM (manual required):** ```typescript import { register, registerInstrumentations } from "@arizeai/phoenix-otel"; import { OpenAIInstrumentation } from "@arizeai/openinference-instrumentation-openai"; import OpenAI from "openai"; register({ projectName: "my-app" }); const instrumentation = new OpenAIInstrumentation(); instrumentation.manuallyInstrument(OpenAI); registerInstrumentations({ instrumentations: [instrumentation] }); ``` **Why:** ESM imports are hoisted before `register()` runs. ## Limitations **What auto-instrumentation does NOT capture:** ```typescript async function myWorkflow(query: string): Promise { const preprocessed = await preprocess(query); // Not traced const response = await client.chat.completions.create(...); // Traced (auto) const postprocessed = await postprocess(response); // Not traced return postprocessed; } ``` **Solution:** Add manual instrumentation for custom logic: ```typescript import { traceChain } from "@arizeai/openinference-core"; const myWorkflow = traceChain( async (query: string): Promise => { const preprocessed = await preprocess(query); const response = await client.chat.completions.create(...); const postprocessed = await postprocess(response); return postprocessed; }, { name: "my-workflow" } ); ``` ## Combining Auto + Manual ```typescript import { register } from "@arizeai/phoenix-otel"; import { traceChain } from "@arizeai/openinference-core"; register({ projectName: "my-app" }); const client = new OpenAI(); const workflow = traceChain( async (query: string) => { const preprocessed = await preprocess(query); const response = await client.chat.completions.create(...); // Auto-instrumented return postprocess(response); }, { name: "my-workflow" } ); ```