[{"data":1,"prerenderedAt":3656},["ShallowReactive",2],{"navigation_docs":3,"-core-concepts-ai-sdk":258,"-core-concepts-ai-sdk-surround":3651},[4,30,115,174,228,244],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Frameworks","\u002Fframeworks","2.frameworks",[35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Fframeworks\u002Foverview","2.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":41,"path":42,"stem":43,"icon":44},"Nuxt","\u002Fframeworks\u002Fnuxt","2.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":46,"path":47,"stem":48,"icon":49},"Next.js","\u002Fframeworks\u002Fnextjs","2.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":51,"path":52,"stem":53,"icon":54},"SvelteKit","\u002Fframeworks\u002Fsveltekit","2.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":56,"path":57,"stem":58,"icon":59},"Nitro","\u002Fframeworks\u002Fnitro","2.frameworks\u002F04.nitro","i-custom-nitro",{"title":61,"path":62,"stem":63,"icon":64},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","2.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":66,"path":67,"stem":68,"icon":69},"NestJS","\u002Fframeworks\u002Fnestjs","2.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":71,"path":72,"stem":73,"icon":74},"Express","\u002Fframeworks\u002Fexpress","2.frameworks\u002F07.express","i-simple-icons-express",{"title":76,"path":77,"stem":78,"icon":79},"Hono","\u002Fframeworks\u002Fhono","2.frameworks\u002F08.hono","i-simple-icons-hono",{"title":81,"path":82,"stem":83,"icon":84},"Fastify","\u002Fframeworks\u002Ffastify","2.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":86,"path":87,"stem":88,"icon":89},"Elysia","\u002Fframeworks\u002Felysia","2.frameworks\u002F10.elysia","i-custom-elysia",{"title":91,"path":92,"stem":93,"icon":94},"React Router","\u002Fframeworks\u002Freact-router","2.frameworks\u002F11.react-router","i-simple-icons-reactrouter",{"title":96,"path":97,"stem":98,"icon":99},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","2.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":101,"path":102,"stem":103,"icon":104},"Standalone","\u002Fframeworks\u002Fstandalone","2.frameworks\u002F13.standalone","i-simple-icons-typescript",{"title":106,"path":107,"stem":108,"icon":109},"Astro","\u002Fframeworks\u002Fastro","2.frameworks\u002F14.astro","i-simple-icons-astro",{"title":111,"path":112,"stem":113,"icon":114},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","2.frameworks\u002F15.custom-integration","i-lucide-puzzle",{"title":116,"path":117,"stem":118,"children":119,"page":29},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[120,125,130,135,140,145,150,154,159,164,169],{"title":121,"path":122,"stem":123,"icon":124},"Request Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":126,"path":127,"stem":128,"icon":129},"Wide Events","\u002Fcore-concepts\u002Fwide-events","3.core-concepts\u002F1.wide-events","i-lucide-layers",{"title":131,"path":132,"stem":133,"icon":134},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F10.vite-plugin","i-custom-vite",{"title":136,"path":137,"stem":138,"icon":139},"AI SDK Integration","\u002Fcore-concepts\u002Fai-sdk","3.core-concepts\u002F11.ai-sdk","i-lucide-scan-eye",{"title":141,"path":142,"stem":143,"icon":144},"Structured Errors","\u002Fcore-concepts\u002Fstructured-errors","3.core-concepts\u002F2.structured-errors","i-lucide-shield-alert",{"title":146,"path":147,"stem":148,"icon":149},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F3.best-practices","i-lucide-shield-check",{"title":151,"path":152,"stem":153,"icon":104},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F4.typed-fields",{"title":155,"path":156,"stem":157,"icon":158},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F5.sampling","i-lucide-filter",{"title":160,"path":161,"stem":162,"icon":163},"Client Logging","\u002Fcore-concepts\u002Fclient-logging","3.core-concepts\u002F6.client-logging","i-lucide-monitor",{"title":165,"path":166,"stem":167,"icon":168},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F7.configuration","i-lucide-settings",{"title":170,"path":171,"stem":172,"icon":173},"Performance","\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F8.performance","i-lucide-gauge",{"title":175,"path":176,"stem":177,"children":178,"page":29},"Adapters","\u002Fadapters","4.adapters",[179,183,188,193,198,203,208,213,218,223],{"title":36,"path":180,"stem":181,"icon":182},"\u002Fadapters\u002Foverview","4.adapters\u002F1.overview","i-custom-plug",{"title":184,"path":185,"stem":186,"icon":187},"Browser","\u002Fadapters\u002Fbrowser","4.adapters\u002F10.browser","i-lucide-globe",{"title":189,"path":190,"stem":191,"icon":192},"Axiom","\u002Fadapters\u002Faxiom","4.adapters\u002F2.axiom","i-custom-axiom",{"title":194,"path":195,"stem":196,"icon":197},"OTLP","\u002Fadapters\u002Fotlp","4.adapters\u002F3.otlp","i-simple-icons-opentelemetry",{"title":199,"path":200,"stem":201,"icon":202},"PostHog","\u002Fadapters\u002Fposthog","4.adapters\u002F4.posthog","i-simple-icons-posthog",{"title":204,"path":205,"stem":206,"icon":207},"Sentry","\u002Fadapters\u002Fsentry","4.adapters\u002F5.sentry","i-simple-icons-sentry",{"title":209,"path":210,"stem":211,"icon":212},"Better Stack","\u002Fadapters\u002Fbetter-stack","4.adapters\u002F6.better-stack","i-simple-icons-betterstack",{"title":214,"path":215,"stem":216,"icon":217},"File System","\u002Fadapters\u002Ffs","4.adapters\u002F7.fs","i-lucide-hard-drive",{"title":219,"path":220,"stem":221,"icon":222},"Custom Adapters","\u002Fadapters\u002Fcustom","4.adapters\u002F8.custom","i-lucide-code",{"title":224,"path":225,"stem":226,"icon":227},"Pipeline","\u002Fadapters\u002Fpipeline","4.adapters\u002F9.pipeline","i-lucide-workflow",{"title":229,"path":230,"stem":231,"children":232,"page":29},"Enrichers","\u002Fenrichers","5.enrichers",[233,236,240],{"title":36,"path":234,"stem":235,"icon":28},"\u002Fenrichers\u002Foverview","5.enrichers\u002F1.overview",{"title":237,"path":238,"stem":239,"icon":114},"Built-in","\u002Fenrichers\u002Fbuilt-in","5.enrichers\u002F2.built-in",{"title":241,"path":242,"stem":243,"icon":222},"Custom","\u002Fenrichers\u002Fcustom","5.enrichers\u002F3.custom",{"title":245,"path":246,"stem":247,"children":248,"page":29},"NuxtHub","\u002Fnuxthub","6.nuxthub",[249,253],{"title":36,"path":250,"stem":251,"icon":252},"\u002Fnuxthub\u002Foverview","6.nuxthub\u002F1.overview","i-lucide-database",{"title":254,"path":255,"stem":256,"icon":257},"Retention","\u002Fnuxthub\u002Fretention","6.nuxthub\u002F2.retention","i-lucide-clock",{"id":259,"title":136,"body":260,"description":3639,"extension":3640,"links":3641,"meta":3647,"navigation":3648,"path":137,"seo":3649,"stem":138,"__hash__":3650},"docs\u002F3.core-concepts\u002F11.ai-sdk.md",{"type":261,"value":262,"toc":3623},"minimark",[263,271,358,363,366,418,421,424,715,718,1026,1030,1040,1113,1116,1120,1124,1127,1423,1426,1429,1625,1629,1632,1877,1880,2121,2125,2132,2452,2456,2466,2778,2782,2788,2847,2851,3118,3122,3125,3241,3244,3248,3253,3619],[264,265,266,270],"p",{},[267,268,269],"code",{},"evlog\u002Fai"," gives you full AI observability by wrapping your model with middleware. Token usage, tool calls, streaming performance, cache hits, reasoning tokens, all captured into the wide event automatically.",[272,273,274],"code-collapse",{},[275,276,282],"pre",{"className":277,"code":278,"filename":279,"language":280,"meta":281,"style":281},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Add AI observability to my app with evlog.\n\n- Install the AI SDK: pnpm add ai\n- Import createAILogger from 'evlog\u002Fai'\n- Create an AI logger with createAILogger(log) where log is your request logger\n- Wrap your model with ai.wrap('anthropic\u002Fclaude-sonnet-4.6') and pass it to generateText, streamText, etc.\n- Token usage, tool calls, streaming metrics, and errors are captured automatically into the wide event\n- For embedding calls, use ai.captureEmbed({ usage }) after embed() or embedMany()\n- Works with all frameworks: Nuxt, Express, Hono, Fastify, NestJS, Elysia, standalone\n\nDocs: https:\u002F\u002Fwww.evlog.dev\u002Fcore-concepts\u002Fai-sdk\nAdapters: https:\u002F\u002Fwww.evlog.dev\u002Fadapters\n","Prompt","txt","",[267,283,284,292,299,305,311,317,323,329,335,341,346,352],{"__ignoreMap":281},[285,286,289],"span",{"class":287,"line":288},"line",1,[285,290,291],{},"Add AI observability to my app with evlog.\n",[285,293,295],{"class":287,"line":294},2,[285,296,298],{"emptyLinePlaceholder":297},true,"\n",[285,300,302],{"class":287,"line":301},3,[285,303,304],{},"- Install the AI SDK: pnpm add ai\n",[285,306,308],{"class":287,"line":307},4,[285,309,310],{},"- Import createAILogger from 'evlog\u002Fai'\n",[285,312,314],{"class":287,"line":313},5,[285,315,316],{},"- Create an AI logger with createAILogger(log) where log is your request logger\n",[285,318,320],{"class":287,"line":319},6,[285,321,322],{},"- Wrap your model with ai.wrap('anthropic\u002Fclaude-sonnet-4.6') and pass it to generateText, streamText, etc.\n",[285,324,326],{"class":287,"line":325},7,[285,327,328],{},"- Token usage, tool calls, streaming metrics, and errors are captured automatically into the wide event\n",[285,330,332],{"class":287,"line":331},8,[285,333,334],{},"- For embedding calls, use ai.captureEmbed({ usage }) after embed() or embedMany()\n",[285,336,338],{"class":287,"line":337},9,[285,339,340],{},"- Works with all frameworks: Nuxt, Express, Hono, Fastify, NestJS, Elysia, standalone\n",[285,342,344],{"class":287,"line":343},10,[285,345,298],{"emptyLinePlaceholder":297},[285,347,349],{"class":287,"line":348},11,[285,350,351],{},"Docs: https:\u002F\u002Fwww.evlog.dev\u002Fcore-concepts\u002Fai-sdk\n",[285,353,355],{"class":287,"line":354},12,[285,356,357],{},"Adapters: https:\u002F\u002Fwww.evlog.dev\u002Fadapters\n",[359,360,362],"h2",{"id":361},"install","Install",[264,364,365],{},"Add the AI SDK as a dependency:",[367,368,369,389,404],"code-group",{},[275,370,375],{"className":371,"code":372,"filename":373,"language":374,"meta":281,"style":281},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install ai\n","npm","bash",[267,376,377],{"__ignoreMap":281},[285,378,379,382,386],{"class":287,"line":288},[285,380,373],{"class":381},"sBMFI",[285,383,385],{"class":384},"sfazB"," install",[285,387,388],{"class":384}," ai\n",[275,390,393],{"className":371,"code":391,"filename":392,"language":374,"meta":281,"style":281},"bun add ai\n","bun",[267,394,395],{"__ignoreMap":281},[285,396,397,399,402],{"class":287,"line":288},[285,398,392],{"class":381},[285,400,401],{"class":384}," add",[285,403,388],{"class":384},[275,405,408],{"className":371,"code":406,"filename":407,"language":374,"meta":281,"style":281},"pnpm add ai\n","pnpm",[267,409,410],{"__ignoreMap":281},[285,411,412,414,416],{"class":287,"line":288},[285,413,407],{"class":381},[285,415,401],{"class":384},[285,417,388],{"class":384},[359,419,20],{"id":420},"quick-start",[264,422,423],{},"Two lines to add, one param to change:",[367,425,426,550],{},[275,427,432],{"className":428,"code":429,"filename":430,"language":431,"meta":281,"style":281},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineEventHandler(async (event) => {\n  const result = streamText({\n    model: 'anthropic\u002Fclaude-sonnet-4.6',\n    messages,\n  })\n  return result.toTextStreamResponse()\n})\n","Before","typescript",[267,433,434,472,492,512,519,527,543],{"__ignoreMap":281},[285,435,436,440,443,447,451,455,459,463,466,469],{"class":287,"line":288},[285,437,439],{"class":438},"s7zQu","export",[285,441,442],{"class":438}," default",[285,444,446],{"class":445},"s2Zo4"," defineEventHandler",[285,448,450],{"class":449},"sTEyZ","(",[285,452,454],{"class":453},"spNyl","async",[285,456,458],{"class":457},"sMK4o"," (",[285,460,462],{"class":461},"sHdIc","event",[285,464,465],{"class":457},")",[285,467,468],{"class":453}," =>",[285,470,471],{"class":457}," {\n",[285,473,474,477,480,483,486,489],{"class":287,"line":294},[285,475,476],{"class":453},"  const",[285,478,479],{"class":449}," result",[285,481,482],{"class":457}," =",[285,484,485],{"class":445}," streamText",[285,487,450],{"class":488},"swJcz",[285,490,491],{"class":457},"{\n",[285,493,494,497,500,503,506,509],{"class":287,"line":301},[285,495,496],{"class":488},"    model",[285,498,499],{"class":457},":",[285,501,502],{"class":457}," '",[285,504,505],{"class":384},"anthropic\u002Fclaude-sonnet-4.6",[285,507,508],{"class":457},"'",[285,510,511],{"class":457},",\n",[285,513,514,517],{"class":287,"line":307},[285,515,516],{"class":449},"    messages",[285,518,511],{"class":457},[285,520,521,524],{"class":287,"line":313},[285,522,523],{"class":457},"  }",[285,525,526],{"class":488},")\n",[285,528,529,532,534,537,540],{"class":287,"line":319},[285,530,531],{"class":438},"  return",[285,533,479],{"class":449},[285,535,536],{"class":457},".",[285,538,539],{"class":445},"toTextStreamResponse",[285,541,542],{"class":488},"()\n",[285,544,545,548],{"class":287,"line":325},[285,546,547],{"class":457},"}",[285,549,526],{"class":449},[275,551,554],{"className":428,"code":552,"filename":553,"language":431,"meta":281,"style":281},"import { createAILogger } from 'evlog\u002Fai'\n\nexport default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const ai = createAILogger(log)\n\n  const result = streamText({\n    model: ai.wrap('anthropic\u002Fclaude-sonnet-4.6'),\n    messages,\n  })\n  return result.toTextStreamResponse()\n})\n","After",[267,555,556,580,584,606,624,642,646,660,685,691,697,709],{"__ignoreMap":281},[285,557,558,561,564,567,570,573,575,577],{"class":287,"line":288},[285,559,560],{"class":438},"import",[285,562,563],{"class":457}," {",[285,565,566],{"class":449}," createAILogger",[285,568,569],{"class":457}," }",[285,571,572],{"class":438}," from",[285,574,502],{"class":457},[285,576,269],{"class":384},[285,578,579],{"class":457},"'\n",[285,581,582],{"class":287,"line":294},[285,583,298],{"emptyLinePlaceholder":297},[285,585,586,588,590,592,594,596,598,600,602,604],{"class":287,"line":301},[285,587,439],{"class":438},[285,589,442],{"class":438},[285,591,446],{"class":445},[285,593,450],{"class":449},[285,595,454],{"class":453},[285,597,458],{"class":457},[285,599,462],{"class":461},[285,601,465],{"class":457},[285,603,468],{"class":453},[285,605,471],{"class":457},[285,607,608,610,613,615,618,620,622],{"class":287,"line":307},[285,609,476],{"class":453},[285,611,612],{"class":449}," log",[285,614,482],{"class":457},[285,616,617],{"class":445}," useLogger",[285,619,450],{"class":488},[285,621,462],{"class":449},[285,623,526],{"class":488},[285,625,626,628,631,633,635,637,640],{"class":287,"line":313},[285,627,476],{"class":453},[285,629,630],{"class":449}," ai",[285,632,482],{"class":457},[285,634,566],{"class":445},[285,636,450],{"class":488},[285,638,639],{"class":449},"log",[285,641,526],{"class":488},[285,643,644],{"class":287,"line":319},[285,645,298],{"emptyLinePlaceholder":297},[285,647,648,650,652,654,656,658],{"class":287,"line":325},[285,649,476],{"class":453},[285,651,479],{"class":449},[285,653,482],{"class":457},[285,655,485],{"class":445},[285,657,450],{"class":488},[285,659,491],{"class":457},[285,661,662,664,666,668,670,673,675,677,679,681,683],{"class":287,"line":331},[285,663,496],{"class":488},[285,665,499],{"class":457},[285,667,630],{"class":449},[285,669,536],{"class":457},[285,671,672],{"class":445},"wrap",[285,674,450],{"class":488},[285,676,508],{"class":457},[285,678,505],{"class":384},[285,680,508],{"class":457},[285,682,465],{"class":488},[285,684,511],{"class":457},[285,686,687,689],{"class":287,"line":337},[285,688,516],{"class":449},[285,690,511],{"class":457},[285,692,693,695],{"class":287,"line":343},[285,694,523],{"class":457},[285,696,526],{"class":488},[285,698,699,701,703,705,707],{"class":287,"line":348},[285,700,531],{"class":438},[285,702,479],{"class":449},[285,704,536],{"class":457},[285,706,539],{"class":445},[285,708,542],{"class":488},[285,710,711,713],{"class":287,"line":354},[285,712,547],{"class":457},[285,714,526],{"class":449},[264,716,717],{},"Your wide event now includes:",[275,719,723],{"className":720,"code":721,"language":722,"meta":281,"style":281},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Fchat\",\n  \"status\": 200,\n  \"duration\": \"4.5s\",\n  \"ai\": {\n    \"calls\": 1,\n    \"model\": \"claude-sonnet-4.6\",\n    \"provider\": \"anthropic\",\n    \"inputTokens\": 3312,\n    \"outputTokens\": 814,\n    \"totalTokens\": 4126,\n    \"reasoningTokens\": 225,\n    \"finishReason\": \"stop\",\n    \"msToFirstChunk\": 234,\n    \"msToFinish\": 4500,\n    \"tokensPerSecond\": 180\n  }\n}\n","json",[267,724,725,729,752,772,789,809,822,839,859,879,895,911,927,944,965,982,999,1014,1020],{"__ignoreMap":281},[285,726,727],{"class":287,"line":288},[285,728,491],{"class":457},[285,730,731,734,737,740,742,745,748,750],{"class":287,"line":294},[285,732,733],{"class":457},"  \"",[285,735,736],{"class":453},"method",[285,738,739],{"class":457},"\"",[285,741,499],{"class":457},[285,743,744],{"class":457}," \"",[285,746,747],{"class":384},"POST",[285,749,739],{"class":457},[285,751,511],{"class":457},[285,753,754,756,759,761,763,765,768,770],{"class":287,"line":301},[285,755,733],{"class":457},[285,757,758],{"class":453},"path",[285,760,739],{"class":457},[285,762,499],{"class":457},[285,764,744],{"class":457},[285,766,767],{"class":384},"\u002Fapi\u002Fchat",[285,769,739],{"class":457},[285,771,511],{"class":457},[285,773,774,776,779,781,783,787],{"class":287,"line":307},[285,775,733],{"class":457},[285,777,778],{"class":453},"status",[285,780,739],{"class":457},[285,782,499],{"class":457},[285,784,786],{"class":785},"sbssI"," 200",[285,788,511],{"class":457},[285,790,791,793,796,798,800,802,805,807],{"class":287,"line":313},[285,792,733],{"class":457},[285,794,795],{"class":453},"duration",[285,797,739],{"class":457},[285,799,499],{"class":457},[285,801,744],{"class":457},[285,803,804],{"class":384},"4.5s",[285,806,739],{"class":457},[285,808,511],{"class":457},[285,810,811,813,816,818,820],{"class":287,"line":319},[285,812,733],{"class":457},[285,814,815],{"class":453},"ai",[285,817,739],{"class":457},[285,819,499],{"class":457},[285,821,471],{"class":457},[285,823,824,827,830,832,834,837],{"class":287,"line":325},[285,825,826],{"class":457},"    \"",[285,828,829],{"class":381},"calls",[285,831,739],{"class":457},[285,833,499],{"class":457},[285,835,836],{"class":785}," 1",[285,838,511],{"class":457},[285,840,841,843,846,848,850,852,855,857],{"class":287,"line":331},[285,842,826],{"class":457},[285,844,845],{"class":381},"model",[285,847,739],{"class":457},[285,849,499],{"class":457},[285,851,744],{"class":457},[285,853,854],{"class":384},"claude-sonnet-4.6",[285,856,739],{"class":457},[285,858,511],{"class":457},[285,860,861,863,866,868,870,872,875,877],{"class":287,"line":337},[285,862,826],{"class":457},[285,864,865],{"class":381},"provider",[285,867,739],{"class":457},[285,869,499],{"class":457},[285,871,744],{"class":457},[285,873,874],{"class":384},"anthropic",[285,876,739],{"class":457},[285,878,511],{"class":457},[285,880,881,883,886,888,890,893],{"class":287,"line":343},[285,882,826],{"class":457},[285,884,885],{"class":381},"inputTokens",[285,887,739],{"class":457},[285,889,499],{"class":457},[285,891,892],{"class":785}," 3312",[285,894,511],{"class":457},[285,896,897,899,902,904,906,909],{"class":287,"line":348},[285,898,826],{"class":457},[285,900,901],{"class":381},"outputTokens",[285,903,739],{"class":457},[285,905,499],{"class":457},[285,907,908],{"class":785}," 814",[285,910,511],{"class":457},[285,912,913,915,918,920,922,925],{"class":287,"line":354},[285,914,826],{"class":457},[285,916,917],{"class":381},"totalTokens",[285,919,739],{"class":457},[285,921,499],{"class":457},[285,923,924],{"class":785}," 4126",[285,926,511],{"class":457},[285,928,930,932,935,937,939,942],{"class":287,"line":929},13,[285,931,826],{"class":457},[285,933,934],{"class":381},"reasoningTokens",[285,936,739],{"class":457},[285,938,499],{"class":457},[285,940,941],{"class":785}," 225",[285,943,511],{"class":457},[285,945,947,949,952,954,956,958,961,963],{"class":287,"line":946},14,[285,948,826],{"class":457},[285,950,951],{"class":381},"finishReason",[285,953,739],{"class":457},[285,955,499],{"class":457},[285,957,744],{"class":457},[285,959,960],{"class":384},"stop",[285,962,739],{"class":457},[285,964,511],{"class":457},[285,966,968,970,973,975,977,980],{"class":287,"line":967},15,[285,969,826],{"class":457},[285,971,972],{"class":381},"msToFirstChunk",[285,974,739],{"class":457},[285,976,499],{"class":457},[285,978,979],{"class":785}," 234",[285,981,511],{"class":457},[285,983,985,987,990,992,994,997],{"class":287,"line":984},16,[285,986,826],{"class":457},[285,988,989],{"class":381},"msToFinish",[285,991,739],{"class":457},[285,993,499],{"class":457},[285,995,996],{"class":785}," 4500",[285,998,511],{"class":457},[285,1000,1002,1004,1007,1009,1011],{"class":287,"line":1001},17,[285,1003,826],{"class":457},[285,1005,1006],{"class":381},"tokensPerSecond",[285,1008,739],{"class":457},[285,1010,499],{"class":457},[285,1012,1013],{"class":785}," 180\n",[285,1015,1017],{"class":287,"line":1016},18,[285,1018,1019],{"class":457},"  }\n",[285,1021,1023],{"class":287,"line":1022},19,[285,1024,1025],{"class":457},"}\n",[359,1027,1029],{"id":1028},"how-it-works","How It Works",[264,1031,1032,1035,1036,1039],{},[267,1033,1034],{},"createAILogger(log)"," returns an ",[267,1037,1038],{},"AILogger"," with two methods:",[1041,1042,1043,1056],"table",{},[1044,1045,1046],"thead",{},[1047,1048,1049,1053],"tr",{},[1050,1051,1052],"th",{},"Method",[1050,1054,1055],{},"Description",[1057,1058,1059,1095],"tbody",{},[1047,1060,1061,1067],{},[1062,1063,1064],"td",{},[267,1065,1066],{},"wrap(model)",[1062,1068,1069,1070,1073,1074,1077,1078,1081,1082,1081,1085,1081,1088,1091,1092,536],{},"Wraps a language model with middleware. Accepts a model string (e.g. ",[267,1071,1072],{},"'anthropic\u002Fclaude-sonnet-4.6'",") or a ",[267,1075,1076],{},"LanguageModelV3"," object. Works with ",[267,1079,1080],{},"generateText",", ",[267,1083,1084],{},"streamText",[267,1086,1087],{},"generateObject",[267,1089,1090],{},"streamObject",", and ",[267,1093,1094],{},"ToolLoopAgent",[1047,1096,1097,1102],{},[1062,1098,1099],{},[267,1100,1101],{},"captureEmbed(result)",[1062,1103,1104,1105,1108,1109,1112],{},"Manually captures token usage from ",[267,1106,1107],{},"embed()"," or ",[267,1110,1111],{},"embedMany()"," results (embedding models use a different type).",[264,1114,1115],{},"The middleware intercepts calls at the provider level. It does not touch your callbacks, prompts, or responses. Captured data flows through the normal evlog pipeline (sampling, enrichers, drains) and ends up in Axiom, Better Stack, or wherever you drain to.",[359,1117,1119],{"id":1118},"usage-patterns","Usage Patterns",[1121,1122,1084],"h3",{"id":1123},"streamtext",[264,1125,1126],{},"The most common pattern, streaming chat with full observability:",[275,1128,1131],{"className":428,"code":1129,"filename":1130,"language":431,"meta":281,"style":281},"import { streamText } from 'ai'\nimport { createAILogger } from 'evlog\u002Fai'\n\nexport default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const ai = createAILogger(log)\n  const { messages } = await readBody(event)\n\n  log.set({ action: 'chat', messagesCount: messages.length })\n\n  const result = streamText({\n    model: ai.wrap('anthropic\u002Fclaude-sonnet-4.6'),\n    messages,\n    onFinish: ({ text }) => {\n      \u002F\u002F Your code, no conflict with evlog\n      saveConversation(text)\n    },\n  })\n\n  return result.toTextStreamResponse()\n})\n","server\u002Fapi\u002Fchat.post.ts",[267,1132,1133,1151,1169,1173,1195,1211,1227,1252,1256,1302,1306,1320,1344,1350,1370,1376,1388,1393,1399,1403,1416],{"__ignoreMap":281},[285,1134,1135,1137,1139,1141,1143,1145,1147,1149],{"class":287,"line":288},[285,1136,560],{"class":438},[285,1138,563],{"class":457},[285,1140,485],{"class":449},[285,1142,569],{"class":457},[285,1144,572],{"class":438},[285,1146,502],{"class":457},[285,1148,815],{"class":384},[285,1150,579],{"class":457},[285,1152,1153,1155,1157,1159,1161,1163,1165,1167],{"class":287,"line":294},[285,1154,560],{"class":438},[285,1156,563],{"class":457},[285,1158,566],{"class":449},[285,1160,569],{"class":457},[285,1162,572],{"class":438},[285,1164,502],{"class":457},[285,1166,269],{"class":384},[285,1168,579],{"class":457},[285,1170,1171],{"class":287,"line":301},[285,1172,298],{"emptyLinePlaceholder":297},[285,1174,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193],{"class":287,"line":307},[285,1176,439],{"class":438},[285,1178,442],{"class":438},[285,1180,446],{"class":445},[285,1182,450],{"class":449},[285,1184,454],{"class":453},[285,1186,458],{"class":457},[285,1188,462],{"class":461},[285,1190,465],{"class":457},[285,1192,468],{"class":453},[285,1194,471],{"class":457},[285,1196,1197,1199,1201,1203,1205,1207,1209],{"class":287,"line":313},[285,1198,476],{"class":453},[285,1200,612],{"class":449},[285,1202,482],{"class":457},[285,1204,617],{"class":445},[285,1206,450],{"class":488},[285,1208,462],{"class":449},[285,1210,526],{"class":488},[285,1212,1213,1215,1217,1219,1221,1223,1225],{"class":287,"line":319},[285,1214,476],{"class":453},[285,1216,630],{"class":449},[285,1218,482],{"class":457},[285,1220,566],{"class":445},[285,1222,450],{"class":488},[285,1224,639],{"class":449},[285,1226,526],{"class":488},[285,1228,1229,1231,1233,1236,1238,1240,1243,1246,1248,1250],{"class":287,"line":325},[285,1230,476],{"class":453},[285,1232,563],{"class":457},[285,1234,1235],{"class":449}," messages",[285,1237,569],{"class":457},[285,1239,482],{"class":457},[285,1241,1242],{"class":438}," await",[285,1244,1245],{"class":445}," readBody",[285,1247,450],{"class":488},[285,1249,462],{"class":449},[285,1251,526],{"class":488},[285,1253,1254],{"class":287,"line":331},[285,1255,298],{"emptyLinePlaceholder":297},[285,1257,1258,1261,1263,1266,1268,1271,1274,1276,1278,1281,1283,1286,1289,1291,1293,1295,1298,1300],{"class":287,"line":337},[285,1259,1260],{"class":449},"  log",[285,1262,536],{"class":457},[285,1264,1265],{"class":445},"set",[285,1267,450],{"class":488},[285,1269,1270],{"class":457},"{",[285,1272,1273],{"class":488}," action",[285,1275,499],{"class":457},[285,1277,502],{"class":457},[285,1279,1280],{"class":384},"chat",[285,1282,508],{"class":457},[285,1284,1285],{"class":457},",",[285,1287,1288],{"class":488}," messagesCount",[285,1290,499],{"class":457},[285,1292,1235],{"class":449},[285,1294,536],{"class":457},[285,1296,1297],{"class":449},"length",[285,1299,569],{"class":457},[285,1301,526],{"class":488},[285,1303,1304],{"class":287,"line":343},[285,1305,298],{"emptyLinePlaceholder":297},[285,1307,1308,1310,1312,1314,1316,1318],{"class":287,"line":348},[285,1309,476],{"class":453},[285,1311,479],{"class":449},[285,1313,482],{"class":457},[285,1315,485],{"class":445},[285,1317,450],{"class":488},[285,1319,491],{"class":457},[285,1321,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342],{"class":287,"line":354},[285,1323,496],{"class":488},[285,1325,499],{"class":457},[285,1327,630],{"class":449},[285,1329,536],{"class":457},[285,1331,672],{"class":445},[285,1333,450],{"class":488},[285,1335,508],{"class":457},[285,1337,505],{"class":384},[285,1339,508],{"class":457},[285,1341,465],{"class":488},[285,1343,511],{"class":457},[285,1345,1346,1348],{"class":287,"line":929},[285,1347,516],{"class":449},[285,1349,511],{"class":457},[285,1351,1352,1355,1357,1360,1363,1366,1368],{"class":287,"line":946},[285,1353,1354],{"class":445},"    onFinish",[285,1356,499],{"class":457},[285,1358,1359],{"class":457}," ({",[285,1361,1362],{"class":461}," text",[285,1364,1365],{"class":457}," })",[285,1367,468],{"class":453},[285,1369,471],{"class":457},[285,1371,1372],{"class":287,"line":967},[285,1373,1375],{"class":1374},"sHwdD","      \u002F\u002F Your code, no conflict with evlog\n",[285,1377,1378,1381,1383,1386],{"class":287,"line":984},[285,1379,1380],{"class":445},"      saveConversation",[285,1382,450],{"class":488},[285,1384,1385],{"class":449},"text",[285,1387,526],{"class":488},[285,1389,1390],{"class":287,"line":1001},[285,1391,1392],{"class":457},"    },\n",[285,1394,1395,1397],{"class":287,"line":1016},[285,1396,523],{"class":457},[285,1398,526],{"class":488},[285,1400,1401],{"class":287,"line":1022},[285,1402,298],{"emptyLinePlaceholder":297},[285,1404,1406,1408,1410,1412,1414],{"class":287,"line":1405},20,[285,1407,531],{"class":438},[285,1409,479],{"class":449},[285,1411,536],{"class":457},[285,1413,539],{"class":445},[285,1415,542],{"class":488},[285,1417,1419,1421],{"class":287,"line":1418},21,[285,1420,547],{"class":457},[285,1422,526],{"class":449},[1121,1424,1080],{"id":1425},"generatetext",[264,1427,1428],{},"Synchronous generation, the middleware captures the result automatically:",[275,1430,1433],{"className":428,"code":1431,"filename":1432,"language":431,"meta":281,"style":281},"import { generateText } from 'ai'\nimport { createAILogger } from 'evlog\u002Fai'\n\nexport default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const ai = createAILogger(log)\n\n  const result = await generateText({\n    model: ai.wrap('anthropic\u002Fclaude-sonnet-4.6'),\n    prompt: 'Summarize this document',\n  })\n\n  return { text: result.text }\n})\n","server\u002Fapi\u002Fsummarize.post.ts",[267,1434,1435,1454,1472,1476,1498,1514,1530,1534,1550,1574,1590,1596,1600,1619],{"__ignoreMap":281},[285,1436,1437,1439,1441,1444,1446,1448,1450,1452],{"class":287,"line":288},[285,1438,560],{"class":438},[285,1440,563],{"class":457},[285,1442,1443],{"class":449}," generateText",[285,1445,569],{"class":457},[285,1447,572],{"class":438},[285,1449,502],{"class":457},[285,1451,815],{"class":384},[285,1453,579],{"class":457},[285,1455,1456,1458,1460,1462,1464,1466,1468,1470],{"class":287,"line":294},[285,1457,560],{"class":438},[285,1459,563],{"class":457},[285,1461,566],{"class":449},[285,1463,569],{"class":457},[285,1465,572],{"class":438},[285,1467,502],{"class":457},[285,1469,269],{"class":384},[285,1471,579],{"class":457},[285,1473,1474],{"class":287,"line":301},[285,1475,298],{"emptyLinePlaceholder":297},[285,1477,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496],{"class":287,"line":307},[285,1479,439],{"class":438},[285,1481,442],{"class":438},[285,1483,446],{"class":445},[285,1485,450],{"class":449},[285,1487,454],{"class":453},[285,1489,458],{"class":457},[285,1491,462],{"class":461},[285,1493,465],{"class":457},[285,1495,468],{"class":453},[285,1497,471],{"class":457},[285,1499,1500,1502,1504,1506,1508,1510,1512],{"class":287,"line":313},[285,1501,476],{"class":453},[285,1503,612],{"class":449},[285,1505,482],{"class":457},[285,1507,617],{"class":445},[285,1509,450],{"class":488},[285,1511,462],{"class":449},[285,1513,526],{"class":488},[285,1515,1516,1518,1520,1522,1524,1526,1528],{"class":287,"line":319},[285,1517,476],{"class":453},[285,1519,630],{"class":449},[285,1521,482],{"class":457},[285,1523,566],{"class":445},[285,1525,450],{"class":488},[285,1527,639],{"class":449},[285,1529,526],{"class":488},[285,1531,1532],{"class":287,"line":325},[285,1533,298],{"emptyLinePlaceholder":297},[285,1535,1536,1538,1540,1542,1544,1546,1548],{"class":287,"line":331},[285,1537,476],{"class":453},[285,1539,479],{"class":449},[285,1541,482],{"class":457},[285,1543,1242],{"class":438},[285,1545,1443],{"class":445},[285,1547,450],{"class":488},[285,1549,491],{"class":457},[285,1551,1552,1554,1556,1558,1560,1562,1564,1566,1568,1570,1572],{"class":287,"line":337},[285,1553,496],{"class":488},[285,1555,499],{"class":457},[285,1557,630],{"class":449},[285,1559,536],{"class":457},[285,1561,672],{"class":445},[285,1563,450],{"class":488},[285,1565,508],{"class":457},[285,1567,505],{"class":384},[285,1569,508],{"class":457},[285,1571,465],{"class":488},[285,1573,511],{"class":457},[285,1575,1576,1579,1581,1583,1586,1588],{"class":287,"line":343},[285,1577,1578],{"class":488},"    prompt",[285,1580,499],{"class":457},[285,1582,502],{"class":457},[285,1584,1585],{"class":384},"Summarize this document",[285,1587,508],{"class":457},[285,1589,511],{"class":457},[285,1591,1592,1594],{"class":287,"line":348},[285,1593,523],{"class":457},[285,1595,526],{"class":488},[285,1597,1598],{"class":287,"line":354},[285,1599,298],{"emptyLinePlaceholder":297},[285,1601,1602,1604,1606,1608,1610,1612,1614,1616],{"class":287,"line":929},[285,1603,531],{"class":438},[285,1605,563],{"class":457},[285,1607,1362],{"class":488},[285,1609,499],{"class":457},[285,1611,479],{"class":449},[285,1613,536],{"class":457},[285,1615,1385],{"class":449},[285,1617,1618],{"class":457}," }\n",[285,1620,1621,1623],{"class":287,"line":946},[285,1622,547],{"class":457},[285,1624,526],{"class":449},[1121,1626,1628],{"id":1627},"multi-step-agents","Multi-step agents",[264,1630,1631],{},"The middleware fires for each step automatically. Steps, tool calls, and tokens are all accumulated across the agent loop:",[275,1633,1636],{"className":428,"code":1634,"filename":1635,"language":431,"meta":281,"style":281},"import { ToolLoopAgent, createAgentUIStreamResponse, stepCountIs } from 'ai'\nimport { createAILogger } from 'evlog\u002Fai'\n\nexport default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const ai = createAILogger(log)\n\n  const agent = new ToolLoopAgent({\n    model: ai.wrap('anthropic\u002Fclaude-sonnet-4.6'),\n    tools: { searchWeb, queryDatabase },\n    stopWhen: stepCountIs(5),\n  })\n\n  return createAgentUIStreamResponse({\n    agent,\n    uiMessages: messages,\n  })\n})\n","server\u002Fapi\u002Fagent.post.ts",[267,1637,1638,1667,1685,1689,1711,1727,1743,1747,1765,1789,1809,1827,1833,1837,1847,1854,1865,1871],{"__ignoreMap":281},[285,1639,1640,1642,1644,1647,1649,1652,1654,1657,1659,1661,1663,1665],{"class":287,"line":288},[285,1641,560],{"class":438},[285,1643,563],{"class":457},[285,1645,1646],{"class":449}," ToolLoopAgent",[285,1648,1285],{"class":457},[285,1650,1651],{"class":449}," createAgentUIStreamResponse",[285,1653,1285],{"class":457},[285,1655,1656],{"class":449}," stepCountIs",[285,1658,569],{"class":457},[285,1660,572],{"class":438},[285,1662,502],{"class":457},[285,1664,815],{"class":384},[285,1666,579],{"class":457},[285,1668,1669,1671,1673,1675,1677,1679,1681,1683],{"class":287,"line":294},[285,1670,560],{"class":438},[285,1672,563],{"class":457},[285,1674,566],{"class":449},[285,1676,569],{"class":457},[285,1678,572],{"class":438},[285,1680,502],{"class":457},[285,1682,269],{"class":384},[285,1684,579],{"class":457},[285,1686,1687],{"class":287,"line":301},[285,1688,298],{"emptyLinePlaceholder":297},[285,1690,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709],{"class":287,"line":307},[285,1692,439],{"class":438},[285,1694,442],{"class":438},[285,1696,446],{"class":445},[285,1698,450],{"class":449},[285,1700,454],{"class":453},[285,1702,458],{"class":457},[285,1704,462],{"class":461},[285,1706,465],{"class":457},[285,1708,468],{"class":453},[285,1710,471],{"class":457},[285,1712,1713,1715,1717,1719,1721,1723,1725],{"class":287,"line":313},[285,1714,476],{"class":453},[285,1716,612],{"class":449},[285,1718,482],{"class":457},[285,1720,617],{"class":445},[285,1722,450],{"class":488},[285,1724,462],{"class":449},[285,1726,526],{"class":488},[285,1728,1729,1731,1733,1735,1737,1739,1741],{"class":287,"line":319},[285,1730,476],{"class":453},[285,1732,630],{"class":449},[285,1734,482],{"class":457},[285,1736,566],{"class":445},[285,1738,450],{"class":488},[285,1740,639],{"class":449},[285,1742,526],{"class":488},[285,1744,1745],{"class":287,"line":325},[285,1746,298],{"emptyLinePlaceholder":297},[285,1748,1749,1751,1754,1756,1759,1761,1763],{"class":287,"line":331},[285,1750,476],{"class":453},[285,1752,1753],{"class":449}," agent",[285,1755,482],{"class":457},[285,1757,1758],{"class":457}," new",[285,1760,1646],{"class":445},[285,1762,450],{"class":488},[285,1764,491],{"class":457},[285,1766,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785,1787],{"class":287,"line":337},[285,1768,496],{"class":488},[285,1770,499],{"class":457},[285,1772,630],{"class":449},[285,1774,536],{"class":457},[285,1776,672],{"class":445},[285,1778,450],{"class":488},[285,1780,508],{"class":457},[285,1782,505],{"class":384},[285,1784,508],{"class":457},[285,1786,465],{"class":488},[285,1788,511],{"class":457},[285,1790,1791,1794,1796,1798,1801,1803,1806],{"class":287,"line":343},[285,1792,1793],{"class":488},"    tools",[285,1795,499],{"class":457},[285,1797,563],{"class":457},[285,1799,1800],{"class":449}," searchWeb",[285,1802,1285],{"class":457},[285,1804,1805],{"class":449}," queryDatabase",[285,1807,1808],{"class":457}," },\n",[285,1810,1811,1814,1816,1818,1820,1823,1825],{"class":287,"line":348},[285,1812,1813],{"class":488},"    stopWhen",[285,1815,499],{"class":457},[285,1817,1656],{"class":445},[285,1819,450],{"class":488},[285,1821,1822],{"class":785},"5",[285,1824,465],{"class":488},[285,1826,511],{"class":457},[285,1828,1829,1831],{"class":287,"line":354},[285,1830,523],{"class":457},[285,1832,526],{"class":488},[285,1834,1835],{"class":287,"line":929},[285,1836,298],{"emptyLinePlaceholder":297},[285,1838,1839,1841,1843,1845],{"class":287,"line":946},[285,1840,531],{"class":438},[285,1842,1651],{"class":445},[285,1844,450],{"class":488},[285,1846,491],{"class":457},[285,1848,1849,1852],{"class":287,"line":967},[285,1850,1851],{"class":449},"    agent",[285,1853,511],{"class":457},[285,1855,1856,1859,1861,1863],{"class":287,"line":984},[285,1857,1858],{"class":488},"    uiMessages",[285,1860,499],{"class":457},[285,1862,1235],{"class":449},[285,1864,511],{"class":457},[285,1866,1867,1869],{"class":287,"line":1001},[285,1868,523],{"class":457},[285,1870,526],{"class":488},[285,1872,1873,1875],{"class":287,"line":1016},[285,1874,547],{"class":457},[285,1876,526],{"class":449},[264,1878,1879],{},"Wide event after a 3-step agent run:",[275,1881,1883],{"className":720,"code":1882,"language":722,"meta":281,"style":281},"{\n  \"ai\": {\n    \"calls\": 3,\n    \"steps\": 3,\n    \"model\": \"claude-sonnet-4.6\",\n    \"provider\": \"anthropic\",\n    \"inputTokens\": 4500,\n    \"outputTokens\": 1200,\n    \"totalTokens\": 5700,\n    \"finishReason\": \"stop\",\n    \"toolCalls\": [\"searchWeb\", \"queryDatabase\", \"searchWeb\"],\n    \"msToFirstChunk\": 312,\n    \"msToFinish\": 8200,\n    \"tokensPerSecond\": 146\n  }\n}\n",[267,1884,1885,1889,1901,1916,1931,1949,1967,1981,1996,2011,2029,2070,2085,2100,2113,2117],{"__ignoreMap":281},[285,1886,1887],{"class":287,"line":288},[285,1888,491],{"class":457},[285,1890,1891,1893,1895,1897,1899],{"class":287,"line":294},[285,1892,733],{"class":457},[285,1894,815],{"class":453},[285,1896,739],{"class":457},[285,1898,499],{"class":457},[285,1900,471],{"class":457},[285,1902,1903,1905,1907,1909,1911,1914],{"class":287,"line":301},[285,1904,826],{"class":457},[285,1906,829],{"class":381},[285,1908,739],{"class":457},[285,1910,499],{"class":457},[285,1912,1913],{"class":785}," 3",[285,1915,511],{"class":457},[285,1917,1918,1920,1923,1925,1927,1929],{"class":287,"line":307},[285,1919,826],{"class":457},[285,1921,1922],{"class":381},"steps",[285,1924,739],{"class":457},[285,1926,499],{"class":457},[285,1928,1913],{"class":785},[285,1930,511],{"class":457},[285,1932,1933,1935,1937,1939,1941,1943,1945,1947],{"class":287,"line":313},[285,1934,826],{"class":457},[285,1936,845],{"class":381},[285,1938,739],{"class":457},[285,1940,499],{"class":457},[285,1942,744],{"class":457},[285,1944,854],{"class":384},[285,1946,739],{"class":457},[285,1948,511],{"class":457},[285,1950,1951,1953,1955,1957,1959,1961,1963,1965],{"class":287,"line":319},[285,1952,826],{"class":457},[285,1954,865],{"class":381},[285,1956,739],{"class":457},[285,1958,499],{"class":457},[285,1960,744],{"class":457},[285,1962,874],{"class":384},[285,1964,739],{"class":457},[285,1966,511],{"class":457},[285,1968,1969,1971,1973,1975,1977,1979],{"class":287,"line":325},[285,1970,826],{"class":457},[285,1972,885],{"class":381},[285,1974,739],{"class":457},[285,1976,499],{"class":457},[285,1978,996],{"class":785},[285,1980,511],{"class":457},[285,1982,1983,1985,1987,1989,1991,1994],{"class":287,"line":331},[285,1984,826],{"class":457},[285,1986,901],{"class":381},[285,1988,739],{"class":457},[285,1990,499],{"class":457},[285,1992,1993],{"class":785}," 1200",[285,1995,511],{"class":457},[285,1997,1998,2000,2002,2004,2006,2009],{"class":287,"line":337},[285,1999,826],{"class":457},[285,2001,917],{"class":381},[285,2003,739],{"class":457},[285,2005,499],{"class":457},[285,2007,2008],{"class":785}," 5700",[285,2010,511],{"class":457},[285,2012,2013,2015,2017,2019,2021,2023,2025,2027],{"class":287,"line":343},[285,2014,826],{"class":457},[285,2016,951],{"class":381},[285,2018,739],{"class":457},[285,2020,499],{"class":457},[285,2022,744],{"class":457},[285,2024,960],{"class":384},[285,2026,739],{"class":457},[285,2028,511],{"class":457},[285,2030,2031,2033,2036,2038,2040,2043,2045,2048,2050,2052,2054,2057,2059,2061,2063,2065,2067],{"class":287,"line":348},[285,2032,826],{"class":457},[285,2034,2035],{"class":381},"toolCalls",[285,2037,739],{"class":457},[285,2039,499],{"class":457},[285,2041,2042],{"class":457}," [",[285,2044,739],{"class":457},[285,2046,2047],{"class":384},"searchWeb",[285,2049,739],{"class":457},[285,2051,1285],{"class":457},[285,2053,744],{"class":457},[285,2055,2056],{"class":384},"queryDatabase",[285,2058,739],{"class":457},[285,2060,1285],{"class":457},[285,2062,744],{"class":457},[285,2064,2047],{"class":384},[285,2066,739],{"class":457},[285,2068,2069],{"class":457},"],\n",[285,2071,2072,2074,2076,2078,2080,2083],{"class":287,"line":354},[285,2073,826],{"class":457},[285,2075,972],{"class":381},[285,2077,739],{"class":457},[285,2079,499],{"class":457},[285,2081,2082],{"class":785}," 312",[285,2084,511],{"class":457},[285,2086,2087,2089,2091,2093,2095,2098],{"class":287,"line":929},[285,2088,826],{"class":457},[285,2090,989],{"class":381},[285,2092,739],{"class":457},[285,2094,499],{"class":457},[285,2096,2097],{"class":785}," 8200",[285,2099,511],{"class":457},[285,2101,2102,2104,2106,2108,2110],{"class":287,"line":946},[285,2103,826],{"class":457},[285,2105,1006],{"class":381},[285,2107,739],{"class":457},[285,2109,499],{"class":457},[285,2111,2112],{"class":785}," 146\n",[285,2114,2115],{"class":287,"line":967},[285,2116,1019],{"class":457},[285,2118,2119],{"class":287,"line":984},[285,2120,1025],{"class":457},[1121,2122,2124],{"id":2123},"rag-embed-generate","RAG (embed + generate)",[264,2126,2127,2128,2131],{},"Use ",[267,2129,2130],{},"captureEmbed"," for embedding calls. They use a different model type that cannot be wrapped with middleware:",[275,2133,2136],{"className":428,"code":2134,"filename":2135,"language":431,"meta":281,"style":281},"import { embed, generateText } from 'ai'\nimport { createAILogger } from 'evlog\u002Fai'\n\nexport default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const ai = createAILogger(log)\n\n  const { embedding, usage } = await embed({\n    model: openai.embedding('text-embedding-3-small'),\n    value: query,\n  })\n  ai.captureEmbed({ usage })\n\n  const docs = await findSimilar(embedding)\n\n  const result = await generateText({\n    model: ai.wrap('anthropic\u002Fclaude-sonnet-4.6'),\n    prompt: buildPrompt(docs),\n  })\n\n  return { text: result.text }\n})\n","server\u002Fapi\u002Frag.post.ts",[267,2137,2138,2161,2179,2183,2205,2221,2237,2241,2267,2294,2306,2312,2331,2335,2355,2359,2375,2399,2417,2423,2427,2445],{"__ignoreMap":281},[285,2139,2140,2142,2144,2147,2149,2151,2153,2155,2157,2159],{"class":287,"line":288},[285,2141,560],{"class":438},[285,2143,563],{"class":457},[285,2145,2146],{"class":449}," embed",[285,2148,1285],{"class":457},[285,2150,1443],{"class":449},[285,2152,569],{"class":457},[285,2154,572],{"class":438},[285,2156,502],{"class":457},[285,2158,815],{"class":384},[285,2160,579],{"class":457},[285,2162,2163,2165,2167,2169,2171,2173,2175,2177],{"class":287,"line":294},[285,2164,560],{"class":438},[285,2166,563],{"class":457},[285,2168,566],{"class":449},[285,2170,569],{"class":457},[285,2172,572],{"class":438},[285,2174,502],{"class":457},[285,2176,269],{"class":384},[285,2178,579],{"class":457},[285,2180,2181],{"class":287,"line":301},[285,2182,298],{"emptyLinePlaceholder":297},[285,2184,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203],{"class":287,"line":307},[285,2186,439],{"class":438},[285,2188,442],{"class":438},[285,2190,446],{"class":445},[285,2192,450],{"class":449},[285,2194,454],{"class":453},[285,2196,458],{"class":457},[285,2198,462],{"class":461},[285,2200,465],{"class":457},[285,2202,468],{"class":453},[285,2204,471],{"class":457},[285,2206,2207,2209,2211,2213,2215,2217,2219],{"class":287,"line":313},[285,2208,476],{"class":453},[285,2210,612],{"class":449},[285,2212,482],{"class":457},[285,2214,617],{"class":445},[285,2216,450],{"class":488},[285,2218,462],{"class":449},[285,2220,526],{"class":488},[285,2222,2223,2225,2227,2229,2231,2233,2235],{"class":287,"line":319},[285,2224,476],{"class":453},[285,2226,630],{"class":449},[285,2228,482],{"class":457},[285,2230,566],{"class":445},[285,2232,450],{"class":488},[285,2234,639],{"class":449},[285,2236,526],{"class":488},[285,2238,2239],{"class":287,"line":325},[285,2240,298],{"emptyLinePlaceholder":297},[285,2242,2243,2245,2247,2250,2252,2255,2257,2259,2261,2263,2265],{"class":287,"line":331},[285,2244,476],{"class":453},[285,2246,563],{"class":457},[285,2248,2249],{"class":449}," embedding",[285,2251,1285],{"class":457},[285,2253,2254],{"class":449}," usage",[285,2256,569],{"class":457},[285,2258,482],{"class":457},[285,2260,1242],{"class":438},[285,2262,2146],{"class":445},[285,2264,450],{"class":488},[285,2266,491],{"class":457},[285,2268,2269,2271,2273,2276,2278,2281,2283,2285,2288,2290,2292],{"class":287,"line":337},[285,2270,496],{"class":488},[285,2272,499],{"class":457},[285,2274,2275],{"class":449}," openai",[285,2277,536],{"class":457},[285,2279,2280],{"class":445},"embedding",[285,2282,450],{"class":488},[285,2284,508],{"class":457},[285,2286,2287],{"class":384},"text-embedding-3-small",[285,2289,508],{"class":457},[285,2291,465],{"class":488},[285,2293,511],{"class":457},[285,2295,2296,2299,2301,2304],{"class":287,"line":343},[285,2297,2298],{"class":488},"    value",[285,2300,499],{"class":457},[285,2302,2303],{"class":449}," query",[285,2305,511],{"class":457},[285,2307,2308,2310],{"class":287,"line":348},[285,2309,523],{"class":457},[285,2311,526],{"class":488},[285,2313,2314,2317,2319,2321,2323,2325,2327,2329],{"class":287,"line":354},[285,2315,2316],{"class":449},"  ai",[285,2318,536],{"class":457},[285,2320,2130],{"class":445},[285,2322,450],{"class":488},[285,2324,1270],{"class":457},[285,2326,2254],{"class":449},[285,2328,569],{"class":457},[285,2330,526],{"class":488},[285,2332,2333],{"class":287,"line":929},[285,2334,298],{"emptyLinePlaceholder":297},[285,2336,2337,2339,2342,2344,2346,2349,2351,2353],{"class":287,"line":946},[285,2338,476],{"class":453},[285,2340,2341],{"class":449}," docs",[285,2343,482],{"class":457},[285,2345,1242],{"class":438},[285,2347,2348],{"class":445}," findSimilar",[285,2350,450],{"class":488},[285,2352,2280],{"class":449},[285,2354,526],{"class":488},[285,2356,2357],{"class":287,"line":967},[285,2358,298],{"emptyLinePlaceholder":297},[285,2360,2361,2363,2365,2367,2369,2371,2373],{"class":287,"line":984},[285,2362,476],{"class":453},[285,2364,479],{"class":449},[285,2366,482],{"class":457},[285,2368,1242],{"class":438},[285,2370,1443],{"class":445},[285,2372,450],{"class":488},[285,2374,491],{"class":457},[285,2376,2377,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397],{"class":287,"line":1001},[285,2378,496],{"class":488},[285,2380,499],{"class":457},[285,2382,630],{"class":449},[285,2384,536],{"class":457},[285,2386,672],{"class":445},[285,2388,450],{"class":488},[285,2390,508],{"class":457},[285,2392,505],{"class":384},[285,2394,508],{"class":457},[285,2396,465],{"class":488},[285,2398,511],{"class":457},[285,2400,2401,2403,2405,2408,2410,2413,2415],{"class":287,"line":1016},[285,2402,1578],{"class":488},[285,2404,499],{"class":457},[285,2406,2407],{"class":445}," buildPrompt",[285,2409,450],{"class":488},[285,2411,2412],{"class":449},"docs",[285,2414,465],{"class":488},[285,2416,511],{"class":457},[285,2418,2419,2421],{"class":287,"line":1022},[285,2420,523],{"class":457},[285,2422,526],{"class":488},[285,2424,2425],{"class":287,"line":1405},[285,2426,298],{"emptyLinePlaceholder":297},[285,2428,2429,2431,2433,2435,2437,2439,2441,2443],{"class":287,"line":1418},[285,2430,531],{"class":438},[285,2432,563],{"class":457},[285,2434,1362],{"class":488},[285,2436,499],{"class":457},[285,2438,479],{"class":449},[285,2440,536],{"class":457},[285,2442,1385],{"class":449},[285,2444,1618],{"class":457},[285,2446,2448,2450],{"class":287,"line":2447},22,[285,2449,547],{"class":457},[285,2451,526],{"class":449},[1121,2453,2455],{"id":2454},"multiple-models","Multiple models",[264,2457,2458,2459,2461,2462,2465],{},"Wrap each model separately, they share the same accumulator. When multiple models are used, the wide event includes both ",[267,2460,845],{}," (last model) and ",[267,2463,2464],{},"models"," (all unique models):",[367,2467,2468,2625],{},[275,2469,2472],{"className":428,"code":2470,"filename":2471,"language":431,"meta":281,"style":281},"const ai = createAILogger(log)\n\nconst fast = ai.wrap('anthropic\u002Fclaude-haiku-4.5')\nconst smart = ai.wrap('anthropic\u002Fclaude-sonnet-4.6')\n\nconst classification = await generateText({ model: fast, prompt: classifyPrompt })\nconst response = await generateText({ model: smart, prompt: detailedPrompt })\n","Code",[267,2473,2474,2490,2494,2520,2545,2549,2588],{"__ignoreMap":281},[285,2475,2476,2479,2482,2485,2487],{"class":287,"line":288},[285,2477,2478],{"class":453},"const",[285,2480,2481],{"class":449}," ai ",[285,2483,2484],{"class":457},"=",[285,2486,566],{"class":445},[285,2488,2489],{"class":449},"(log)\n",[285,2491,2492],{"class":287,"line":294},[285,2493,298],{"emptyLinePlaceholder":297},[285,2495,2496,2498,2501,2503,2505,2507,2509,2511,2513,2516,2518],{"class":287,"line":301},[285,2497,2478],{"class":453},[285,2499,2500],{"class":449}," fast ",[285,2502,2484],{"class":457},[285,2504,630],{"class":449},[285,2506,536],{"class":457},[285,2508,672],{"class":445},[285,2510,450],{"class":449},[285,2512,508],{"class":457},[285,2514,2515],{"class":384},"anthropic\u002Fclaude-haiku-4.5",[285,2517,508],{"class":457},[285,2519,526],{"class":449},[285,2521,2522,2524,2527,2529,2531,2533,2535,2537,2539,2541,2543],{"class":287,"line":307},[285,2523,2478],{"class":453},[285,2525,2526],{"class":449}," smart ",[285,2528,2484],{"class":457},[285,2530,630],{"class":449},[285,2532,536],{"class":457},[285,2534,672],{"class":445},[285,2536,450],{"class":449},[285,2538,508],{"class":457},[285,2540,505],{"class":384},[285,2542,508],{"class":457},[285,2544,526],{"class":449},[285,2546,2547],{"class":287,"line":313},[285,2548,298],{"emptyLinePlaceholder":297},[285,2550,2551,2553,2556,2558,2560,2562,2564,2566,2569,2571,2574,2576,2579,2581,2584,2586],{"class":287,"line":319},[285,2552,2478],{"class":453},[285,2554,2555],{"class":449}," classification ",[285,2557,2484],{"class":457},[285,2559,1242],{"class":438},[285,2561,1443],{"class":445},[285,2563,450],{"class":449},[285,2565,1270],{"class":457},[285,2567,2568],{"class":488}," model",[285,2570,499],{"class":457},[285,2572,2573],{"class":449}," fast",[285,2575,1285],{"class":457},[285,2577,2578],{"class":488}," prompt",[285,2580,499],{"class":457},[285,2582,2583],{"class":449}," classifyPrompt ",[285,2585,547],{"class":457},[285,2587,526],{"class":449},[285,2589,2590,2592,2595,2597,2599,2601,2603,2605,2607,2609,2612,2614,2616,2618,2621,2623],{"class":287,"line":325},[285,2591,2478],{"class":453},[285,2593,2594],{"class":449}," response ",[285,2596,2484],{"class":457},[285,2598,1242],{"class":438},[285,2600,1443],{"class":445},[285,2602,450],{"class":449},[285,2604,1270],{"class":457},[285,2606,2568],{"class":488},[285,2608,499],{"class":457},[285,2610,2611],{"class":449}," smart",[285,2613,1285],{"class":457},[285,2615,2578],{"class":488},[285,2617,499],{"class":457},[285,2619,2620],{"class":449}," detailedPrompt ",[285,2622,547],{"class":457},[285,2624,526],{"class":449},[275,2626,2629],{"className":720,"code":2627,"filename":2628,"language":722,"meta":281,"style":281},"{\n  \"ai\": {\n    \"calls\": 2,\n    \"model\": \"claude-sonnet-4.6\",\n    \"models\": [\"claude-haiku-4.5\", \"claude-sonnet-4.6\"],\n    \"provider\": \"anthropic\",\n    \"inputTokens\": 450,\n    \"outputTokens\": 300,\n    \"totalTokens\": 750\n  }\n}\n","Wide Event",[267,2630,2631,2635,2647,2662,2680,2709,2727,2742,2757,2770,2774],{"__ignoreMap":281},[285,2632,2633],{"class":287,"line":288},[285,2634,491],{"class":457},[285,2636,2637,2639,2641,2643,2645],{"class":287,"line":294},[285,2638,733],{"class":457},[285,2640,815],{"class":453},[285,2642,739],{"class":457},[285,2644,499],{"class":457},[285,2646,471],{"class":457},[285,2648,2649,2651,2653,2655,2657,2660],{"class":287,"line":301},[285,2650,826],{"class":457},[285,2652,829],{"class":381},[285,2654,739],{"class":457},[285,2656,499],{"class":457},[285,2658,2659],{"class":785}," 2",[285,2661,511],{"class":457},[285,2663,2664,2666,2668,2670,2672,2674,2676,2678],{"class":287,"line":307},[285,2665,826],{"class":457},[285,2667,845],{"class":381},[285,2669,739],{"class":457},[285,2671,499],{"class":457},[285,2673,744],{"class":457},[285,2675,854],{"class":384},[285,2677,739],{"class":457},[285,2679,511],{"class":457},[285,2681,2682,2684,2686,2688,2690,2692,2694,2697,2699,2701,2703,2705,2707],{"class":287,"line":313},[285,2683,826],{"class":457},[285,2685,2464],{"class":381},[285,2687,739],{"class":457},[285,2689,499],{"class":457},[285,2691,2042],{"class":457},[285,2693,739],{"class":457},[285,2695,2696],{"class":384},"claude-haiku-4.5",[285,2698,739],{"class":457},[285,2700,1285],{"class":457},[285,2702,744],{"class":457},[285,2704,854],{"class":384},[285,2706,739],{"class":457},[285,2708,2069],{"class":457},[285,2710,2711,2713,2715,2717,2719,2721,2723,2725],{"class":287,"line":319},[285,2712,826],{"class":457},[285,2714,865],{"class":381},[285,2716,739],{"class":457},[285,2718,499],{"class":457},[285,2720,744],{"class":457},[285,2722,874],{"class":384},[285,2724,739],{"class":457},[285,2726,511],{"class":457},[285,2728,2729,2731,2733,2735,2737,2740],{"class":287,"line":325},[285,2730,826],{"class":457},[285,2732,885],{"class":381},[285,2734,739],{"class":457},[285,2736,499],{"class":457},[285,2738,2739],{"class":785}," 450",[285,2741,511],{"class":457},[285,2743,2744,2746,2748,2750,2752,2755],{"class":287,"line":331},[285,2745,826],{"class":457},[285,2747,901],{"class":381},[285,2749,739],{"class":457},[285,2751,499],{"class":457},[285,2753,2754],{"class":785}," 300",[285,2756,511],{"class":457},[285,2758,2759,2761,2763,2765,2767],{"class":287,"line":337},[285,2760,826],{"class":457},[285,2762,917],{"class":381},[285,2764,739],{"class":457},[285,2766,499],{"class":457},[285,2768,2769],{"class":785}," 750\n",[285,2771,2772],{"class":287,"line":343},[285,2773,1019],{"class":457},[285,2775,2776],{"class":287,"line":348},[285,2777,1025],{"class":457},[1121,2779,2781],{"id":2780},"model-object-support","Model object support",[264,2783,2784,2787],{},[267,2785,2786],{},"wrap()"," also accepts model objects from provider SDKs if you prefer explicit imports:",[275,2789,2791],{"className":428,"code":2790,"language":431,"meta":281,"style":281},"import { anthropic } from '@ai-sdk\u002Fanthropic'\n\nconst model = ai.wrap(anthropic('claude-sonnet-4.6'))\n",[267,2792,2793,2813,2817],{"__ignoreMap":281},[285,2794,2795,2797,2799,2802,2804,2806,2808,2811],{"class":287,"line":288},[285,2796,560],{"class":438},[285,2798,563],{"class":457},[285,2800,2801],{"class":449}," anthropic",[285,2803,569],{"class":457},[285,2805,572],{"class":438},[285,2807,502],{"class":457},[285,2809,2810],{"class":384},"@ai-sdk\u002Fanthropic",[285,2812,579],{"class":457},[285,2814,2815],{"class":287,"line":294},[285,2816,298],{"emptyLinePlaceholder":297},[285,2818,2819,2821,2824,2826,2828,2830,2832,2834,2836,2838,2840,2842,2844],{"class":287,"line":301},[285,2820,2478],{"class":453},[285,2822,2823],{"class":449}," model ",[285,2825,2484],{"class":457},[285,2827,630],{"class":449},[285,2829,536],{"class":457},[285,2831,672],{"class":445},[285,2833,450],{"class":449},[285,2835,874],{"class":445},[285,2837,450],{"class":449},[285,2839,508],{"class":457},[285,2841,854],{"class":384},[285,2843,508],{"class":457},[285,2845,2846],{"class":449},"))\n",[359,2848,2850],{"id":2849},"captured-data","Captured Data",[1041,2852,2853,2865],{},[1044,2854,2855],{},[1047,2856,2857,2860,2863],{},[1050,2858,2859],{},"Wide event field",[1050,2861,2862],{},"Source",[1050,2864,1055],{},[1057,2866,2867,2880,2895,2908,2932,2947,2962,2977,2992,3007,3022,3042,3055,3068,3081,3093,3105],{},[1047,2868,2869,2874,2877],{},[1062,2870,2871],{},[267,2872,2873],{},"ai.calls",[1062,2875,2876],{},"Call count",[1062,2878,2879],{},"Number of AI calls in this request",[1047,2881,2882,2887,2892],{},[1062,2883,2884],{},[267,2885,2886],{},"ai.model",[1062,2888,2889],{},[267,2890,2891],{},"response.modelId",[1062,2893,2894],{},"Model that served the response",[1047,2896,2897,2902,2905],{},[1062,2898,2899],{},[267,2900,2901],{},"ai.models",[1062,2903,2904],{},"All model IDs",[1062,2906,2907],{},"Array of all models used (only when > 1)",[1047,2909,2910,2915,2920],{},[1062,2911,2912],{},[267,2913,2914],{},"ai.provider",[1062,2916,2917],{},[267,2918,2919],{},"model.provider",[1062,2921,2922,2923,1081,2925,1081,2928,2931],{},"Provider (",[267,2924,874],{},[267,2926,2927],{},"openai",[267,2929,2930],{},"google",", etc.)",[1047,2933,2934,2939,2944],{},[1062,2935,2936],{},[267,2937,2938],{},"ai.inputTokens",[1062,2940,2941],{},[267,2942,2943],{},"usage.inputTokens.total",[1062,2945,2946],{},"Total input tokens across all calls",[1047,2948,2949,2954,2959],{},[1062,2950,2951],{},[267,2952,2953],{},"ai.outputTokens",[1062,2955,2956],{},[267,2957,2958],{},"usage.outputTokens.total",[1062,2960,2961],{},"Total output tokens across all calls",[1047,2963,2964,2969,2972],{},[1062,2965,2966],{},[267,2967,2968],{},"ai.totalTokens",[1062,2970,2971],{},"Computed",[1062,2973,2974],{},[267,2975,2976],{},"inputTokens + outputTokens",[1047,2978,2979,2984,2989],{},[1062,2980,2981],{},[267,2982,2983],{},"ai.cacheReadTokens",[1062,2985,2986],{},[267,2987,2988],{},"usage.inputTokens.cacheRead",[1062,2990,2991],{},"Tokens served from prompt cache",[1047,2993,2994,2999,3004],{},[1062,2995,2996],{},[267,2997,2998],{},"ai.cacheWriteTokens",[1062,3000,3001],{},[267,3002,3003],{},"usage.inputTokens.cacheWrite",[1062,3005,3006],{},"Tokens written to prompt cache",[1047,3008,3009,3014,3019],{},[1062,3010,3011],{},[267,3012,3013],{},"ai.reasoningTokens",[1062,3015,3016],{},[267,3017,3018],{},"usage.outputTokens.reasoning",[1062,3020,3021],{},"Reasoning tokens (extended thinking)",[1047,3023,3024,3029,3034],{},[1062,3025,3026],{},[267,3027,3028],{},"ai.finishReason",[1062,3030,3031],{},[267,3032,3033],{},"finishReason.unified",[1062,3035,3036,3037,1081,3039,2931],{},"Why generation ended (",[267,3038,960],{},[267,3040,3041],{},"tool-calls",[1047,3043,3044,3049,3052],{},[1062,3045,3046],{},[267,3047,3048],{},"ai.toolCalls",[1062,3050,3051],{},"Content \u002F stream chunks",[1062,3053,3054],{},"List of tool names called",[1047,3056,3057,3062,3065],{},[1062,3058,3059],{},[267,3060,3061],{},"ai.steps",[1062,3063,3064],{},"Step count",[1062,3066,3067],{},"Number of LLM calls (only when > 1)",[1047,3069,3070,3075,3078],{},[1062,3071,3072],{},[267,3073,3074],{},"ai.msToFirstChunk",[1062,3076,3077],{},"Stream timing",[1062,3079,3080],{},"Time to first text chunk (streaming only)",[1047,3082,3083,3088,3090],{},[1062,3084,3085],{},[267,3086,3087],{},"ai.msToFinish",[1062,3089,3077],{},[1062,3091,3092],{},"Total stream duration (streaming only)",[1047,3094,3095,3100,3102],{},[1062,3096,3097],{},[267,3098,3099],{},"ai.tokensPerSecond",[1062,3101,2971],{},[1062,3103,3104],{},"Output tokens per second (streaming only)",[1047,3106,3107,3112,3115],{},[1062,3108,3109],{},[267,3110,3111],{},"ai.error",[1062,3113,3114],{},"Error capture",[1062,3116,3117],{},"Error message if a model call fails",[359,3119,3121],{"id":3120},"error-handling","Error Handling",[264,3123,3124],{},"If a model call fails, the middleware captures the error into the wide event before re-throwing:",[275,3126,3128],{"className":720,"code":3127,"language":722,"meta":281,"style":281},"{\n  \"ai\": {\n    \"calls\": 1,\n    \"model\": \"claude-sonnet-4.6\",\n    \"provider\": \"anthropic\",\n    \"finishReason\": \"error\",\n    \"error\": \"API rate limit exceeded\"\n  }\n}\n",[267,3129,3130,3134,3146,3160,3178,3196,3215,3233,3237],{"__ignoreMap":281},[285,3131,3132],{"class":287,"line":288},[285,3133,491],{"class":457},[285,3135,3136,3138,3140,3142,3144],{"class":287,"line":294},[285,3137,733],{"class":457},[285,3139,815],{"class":453},[285,3141,739],{"class":457},[285,3143,499],{"class":457},[285,3145,471],{"class":457},[285,3147,3148,3150,3152,3154,3156,3158],{"class":287,"line":301},[285,3149,826],{"class":457},[285,3151,829],{"class":381},[285,3153,739],{"class":457},[285,3155,499],{"class":457},[285,3157,836],{"class":785},[285,3159,511],{"class":457},[285,3161,3162,3164,3166,3168,3170,3172,3174,3176],{"class":287,"line":307},[285,3163,826],{"class":457},[285,3165,845],{"class":381},[285,3167,739],{"class":457},[285,3169,499],{"class":457},[285,3171,744],{"class":457},[285,3173,854],{"class":384},[285,3175,739],{"class":457},[285,3177,511],{"class":457},[285,3179,3180,3182,3184,3186,3188,3190,3192,3194],{"class":287,"line":313},[285,3181,826],{"class":457},[285,3183,865],{"class":381},[285,3185,739],{"class":457},[285,3187,499],{"class":457},[285,3189,744],{"class":457},[285,3191,874],{"class":384},[285,3193,739],{"class":457},[285,3195,511],{"class":457},[285,3197,3198,3200,3202,3204,3206,3208,3211,3213],{"class":287,"line":319},[285,3199,826],{"class":457},[285,3201,951],{"class":381},[285,3203,739],{"class":457},[285,3205,499],{"class":457},[285,3207,744],{"class":457},[285,3209,3210],{"class":384},"error",[285,3212,739],{"class":457},[285,3214,511],{"class":457},[285,3216,3217,3219,3221,3223,3225,3227,3230],{"class":287,"line":325},[285,3218,826],{"class":457},[285,3220,3210],{"class":381},[285,3222,739],{"class":457},[285,3224,499],{"class":457},[285,3226,744],{"class":457},[285,3228,3229],{"class":384},"API rate limit exceeded",[285,3231,3232],{"class":457},"\"\n",[285,3234,3235],{"class":287,"line":331},[285,3236,1019],{"class":457},[285,3238,3239],{"class":287,"line":337},[285,3240,1025],{"class":457},[264,3242,3243],{},"Stream errors (e.g. content filter) are also captured from the stream's error chunks.",[359,3245,3247],{"id":3246},"works-with-all-frameworks","Works With All Frameworks",[264,3249,3250,3252],{},[267,3251,269],{}," works with any framework that evlog supports:",[367,3254,3255,3286,3358,3431,3498,3550],{},[275,3256,3258],{"className":428,"code":3257,"filename":41,"language":431,"meta":281,"style":281},"const log = useLogger(event)\nconst ai = createAILogger(log)\n",[267,3259,3260,3274],{"__ignoreMap":281},[285,3261,3262,3264,3267,3269,3271],{"class":287,"line":288},[285,3263,2478],{"class":453},[285,3265,3266],{"class":449}," log ",[285,3268,2484],{"class":457},[285,3270,617],{"class":445},[285,3272,3273],{"class":449},"(event)\n",[285,3275,3276,3278,3280,3282,3284],{"class":287,"line":294},[285,3277,2478],{"class":453},[285,3279,2481],{"class":449},[285,3281,2484],{"class":457},[285,3283,566],{"class":445},[285,3285,2489],{"class":449},[275,3287,3289],{"className":428,"code":3288,"filename":71,"language":431,"meta":281,"style":281},"app.post('\u002Fapi\u002Fchat', (req, res) => {\n  const ai = createAILogger(req.log)\n  \u002F\u002F ...\n})\n",[267,3290,3291,3327,3347,3352],{"__ignoreMap":281},[285,3292,3293,3296,3298,3301,3303,3305,3307,3309,3311,3313,3316,3318,3321,3323,3325],{"class":287,"line":288},[285,3294,3295],{"class":449},"app",[285,3297,536],{"class":457},[285,3299,3300],{"class":445},"post",[285,3302,450],{"class":449},[285,3304,508],{"class":457},[285,3306,767],{"class":384},[285,3308,508],{"class":457},[285,3310,1285],{"class":457},[285,3312,458],{"class":457},[285,3314,3315],{"class":461},"req",[285,3317,1285],{"class":457},[285,3319,3320],{"class":461}," res",[285,3322,465],{"class":457},[285,3324,468],{"class":453},[285,3326,471],{"class":457},[285,3328,3329,3331,3333,3335,3337,3339,3341,3343,3345],{"class":287,"line":294},[285,3330,476],{"class":453},[285,3332,630],{"class":449},[285,3334,482],{"class":457},[285,3336,566],{"class":445},[285,3338,450],{"class":488},[285,3340,3315],{"class":449},[285,3342,536],{"class":457},[285,3344,639],{"class":449},[285,3346,526],{"class":488},[285,3348,3349],{"class":287,"line":301},[285,3350,3351],{"class":1374},"  \u002F\u002F ...\n",[285,3353,3354,3356],{"class":287,"line":307},[285,3355,547],{"class":457},[285,3357,526],{"class":449},[275,3359,3361],{"className":428,"code":3360,"filename":76,"language":431,"meta":281,"style":281},"app.post('\u002Fapi\u002Fchat', (c) => {\n  const ai = createAILogger(c.get('log'))\n  \u002F\u002F ...\n})\n",[267,3362,3363,3392,3421,3425],{"__ignoreMap":281},[285,3364,3365,3367,3369,3371,3373,3375,3377,3379,3381,3383,3386,3388,3390],{"class":287,"line":288},[285,3366,3295],{"class":449},[285,3368,536],{"class":457},[285,3370,3300],{"class":445},[285,3372,450],{"class":449},[285,3374,508],{"class":457},[285,3376,767],{"class":384},[285,3378,508],{"class":457},[285,3380,1285],{"class":457},[285,3382,458],{"class":457},[285,3384,3385],{"class":461},"c",[285,3387,465],{"class":457},[285,3389,468],{"class":453},[285,3391,471],{"class":457},[285,3393,3394,3396,3398,3400,3402,3404,3406,3408,3411,3413,3415,3417,3419],{"class":287,"line":294},[285,3395,476],{"class":453},[285,3397,630],{"class":449},[285,3399,482],{"class":457},[285,3401,566],{"class":445},[285,3403,450],{"class":488},[285,3405,3385],{"class":449},[285,3407,536],{"class":457},[285,3409,3410],{"class":445},"get",[285,3412,450],{"class":488},[285,3414,508],{"class":457},[285,3416,639],{"class":384},[285,3418,508],{"class":457},[285,3420,2846],{"class":488},[285,3422,3423],{"class":287,"line":301},[285,3424,3351],{"class":1374},[285,3426,3427,3429],{"class":287,"line":307},[285,3428,547],{"class":457},[285,3430,526],{"class":449},[275,3432,3434],{"className":428,"code":3433,"filename":81,"language":431,"meta":281,"style":281},"app.post('\u002Fapi\u002Fchat', async (request) => {\n  const ai = createAILogger(request.log)\n  \u002F\u002F ...\n})\n",[267,3435,3436,3468,3488,3492],{"__ignoreMap":281},[285,3437,3438,3440,3442,3444,3446,3448,3450,3452,3454,3457,3459,3462,3464,3466],{"class":287,"line":288},[285,3439,3295],{"class":449},[285,3441,536],{"class":457},[285,3443,3300],{"class":445},[285,3445,450],{"class":449},[285,3447,508],{"class":457},[285,3449,767],{"class":384},[285,3451,508],{"class":457},[285,3453,1285],{"class":457},[285,3455,3456],{"class":453}," async",[285,3458,458],{"class":457},[285,3460,3461],{"class":461},"request",[285,3463,465],{"class":457},[285,3465,468],{"class":453},[285,3467,471],{"class":457},[285,3469,3470,3472,3474,3476,3478,3480,3482,3484,3486],{"class":287,"line":294},[285,3471,476],{"class":453},[285,3473,630],{"class":449},[285,3475,482],{"class":457},[285,3477,566],{"class":445},[285,3479,450],{"class":488},[285,3481,3461],{"class":449},[285,3483,536],{"class":457},[285,3485,639],{"class":449},[285,3487,526],{"class":488},[285,3489,3490],{"class":287,"line":301},[285,3491,3351],{"class":1374},[285,3493,3494,3496],{"class":287,"line":307},[285,3495,547],{"class":457},[285,3497,526],{"class":449},[275,3499,3501],{"className":428,"code":3500,"filename":66,"language":431,"meta":281,"style":281},"import { useLogger } from 'evlog\u002Fnestjs'\n\nconst log = useLogger()\nconst ai = createAILogger(log)\n",[267,3502,3503,3522,3526,3538],{"__ignoreMap":281},[285,3504,3505,3507,3509,3511,3513,3515,3517,3520],{"class":287,"line":288},[285,3506,560],{"class":438},[285,3508,563],{"class":457},[285,3510,617],{"class":449},[285,3512,569],{"class":457},[285,3514,572],{"class":438},[285,3516,502],{"class":457},[285,3518,3519],{"class":384},"evlog\u002Fnestjs",[285,3521,579],{"class":457},[285,3523,3524],{"class":287,"line":294},[285,3525,298],{"emptyLinePlaceholder":297},[285,3527,3528,3530,3532,3534,3536],{"class":287,"line":301},[285,3529,2478],{"class":453},[285,3531,3266],{"class":449},[285,3533,2484],{"class":457},[285,3535,617],{"class":445},[285,3537,542],{"class":449},[285,3539,3540,3542,3544,3546,3548],{"class":287,"line":307},[285,3541,2478],{"class":453},[285,3543,2481],{"class":449},[285,3545,2484],{"class":457},[285,3547,566],{"class":445},[285,3549,2489],{"class":449},[275,3551,3553],{"className":428,"code":3552,"filename":101,"language":431,"meta":281,"style":281},"import { createLogger } from 'evlog'\n\nconst log = createLogger()\nconst ai = createAILogger(log)\n\u002F\u002F ...\nlog.emit()\n",[267,3554,3555,3575,3579,3591,3603,3608],{"__ignoreMap":281},[285,3556,3557,3559,3561,3564,3566,3568,3570,3573],{"class":287,"line":288},[285,3558,560],{"class":438},[285,3560,563],{"class":457},[285,3562,3563],{"class":449}," createLogger",[285,3565,569],{"class":457},[285,3567,572],{"class":438},[285,3569,502],{"class":457},[285,3571,3572],{"class":384},"evlog",[285,3574,579],{"class":457},[285,3576,3577],{"class":287,"line":294},[285,3578,298],{"emptyLinePlaceholder":297},[285,3580,3581,3583,3585,3587,3589],{"class":287,"line":301},[285,3582,2478],{"class":453},[285,3584,3266],{"class":449},[285,3586,2484],{"class":457},[285,3588,3563],{"class":445},[285,3590,542],{"class":449},[285,3592,3593,3595,3597,3599,3601],{"class":287,"line":307},[285,3594,2478],{"class":453},[285,3596,2481],{"class":449},[285,3598,2484],{"class":457},[285,3600,566],{"class":445},[285,3602,2489],{"class":449},[285,3604,3605],{"class":287,"line":313},[285,3606,3607],{"class":1374},"\u002F\u002F ...\n",[285,3609,3610,3612,3614,3617],{"class":287,"line":319},[285,3611,639],{"class":449},[285,3613,536],{"class":457},[285,3615,3616],{"class":445},"emit",[285,3618,542],{"class":449},[3620,3621,3622],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":281,"searchDepth":294,"depth":294,"links":3624},[3625,3626,3627,3628,3636,3637,3638],{"id":361,"depth":294,"text":362},{"id":420,"depth":294,"text":20},{"id":1028,"depth":294,"text":1029},{"id":1118,"depth":294,"text":1119,"children":3629},[3630,3631,3632,3633,3634,3635],{"id":1123,"depth":301,"text":1084},{"id":1425,"depth":301,"text":1080},{"id":1627,"depth":301,"text":1628},{"id":2123,"depth":301,"text":2124},{"id":2454,"depth":301,"text":2455},{"id":2780,"depth":301,"text":2781},{"id":2849,"depth":294,"text":2850},{"id":3120,"depth":294,"text":3121},{"id":3246,"depth":294,"text":3247},"Capture token usage, tool calls, model info, and streaming metrics from the Vercel AI SDK into wide events. Wrap your model and get full AI observability.","md",[3642,3645],{"label":126,"icon":129,"to":127,"color":3643,"variant":3644},"neutral","subtle",{"label":175,"icon":3646,"to":180,"color":3643,"variant":3644},"i-lucide-plug",{},{"icon":139},{"title":136,"description":3639},"Pr2m19vIPzOsDy_I6vjCRuWD_FfvVJL4EccFgp9Khj0",[3652,3654],{"title":131,"path":132,"stem":133,"description":3653,"icon":134,"children":-1},"Build-time optimizations for any Vite-based framework — auto-init, debug stripping, source location injection, and optional auto-imports.",{"title":141,"path":142,"stem":143,"description":3655,"icon":144,"children":-1},"Create errors that explain why they occurred and how to fix them. Add actionable context with why, fix, and link fields for humans and AI agents.",1774103706365]