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