diff --git a/examples/example-evals-nextjs/package.json b/examples/example-evals-nextjs/package.json index 89d31e8..faea5b1 100644 --- a/examples/example-evals-nextjs/package.json +++ b/examples/example-evals-nextjs/package.json @@ -23,7 +23,6 @@ "@opentelemetry/exporter-jaeger": "^2.0.1", "@opentelemetry/exporter-trace-otlp-http": "^0.202.0", "@opentelemetry/resources": "^2.1.0", - "@opentelemetry/sdk-node": "^0.202.0", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.34.0", "ai": "5.0.0-beta.24", diff --git a/examples/example-evals-nextjs/src/app/generate-text/page.tsx b/examples/example-evals-nextjs/src/app/generate-text/page.tsx index 77823b7..365e9e2 100644 --- a/examples/example-evals-nextjs/src/app/generate-text/page.tsx +++ b/examples/example-evals-nextjs/src/app/generate-text/page.tsx @@ -1,7 +1,7 @@ import { generateText, stepCountIs, tool } from 'ai'; import { z } from 'zod'; import { gpt4oMini } from '@/shared/openai'; -import { withSpan, wrapTool } from 'axiom/ai'; +import { withSpan, wrapTools } from 'axiom/ai'; export const dynamic = 'force-dynamic'; @@ -25,30 +25,27 @@ export default async function Page() { content: 'How do I get from Paris to Berlin?', }, ], - tools: { - findDirections: wrapTool( - 'findDirections', - tool({ - description: 'Find directions to a location', - inputSchema: z.object({ - from: z.string().describe('The location to start from'), - to: z.string().describe('The location to find directions to'), - }), - execute: async (params, _opts) => { - const { from, to } = params; - // Simulate API call delay - await new Promise((resolve) => setTimeout(resolve, 500)); - - // Return mock directions data - return { - from, - to, - directions: `To get from ${from} to ${to}, use a teleporter.`, - }; - }, + tools: wrapTools({ + findDirections: tool({ + description: 'Find directions to a location', + inputSchema: z.object({ + from: z.string().describe('The location to start from'), + to: z.string().describe('The location to find directions to'), }), - ), - }, + execute: async (params, _opts) => { + const { from, to } = params; + // Simulate API call delay + await new Promise((resolve) => setTimeout(resolve, 500)); + + // Return mock directions data + return { + from, + to, + directions: `To get from ${from} to ${to}, use a teleporter.`, + }; + }, + }), + }), }); }); diff --git a/examples/example-evals-nextjs/src/instrumentation.node.ts b/examples/example-evals-nextjs/src/instrumentation.node.ts index 487e688..a8ccac6 100644 --- a/examples/example-evals-nextjs/src/instrumentation.node.ts +++ b/examples/example-evals-nextjs/src/instrumentation.node.ts @@ -1,32 +1,26 @@ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; -import type { Resource } from '@opentelemetry/resources'; import { resourceFromAttributes } from '@opentelemetry/resources'; -import { NodeSDK } from '@opentelemetry/sdk-node'; +import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'; import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; import { initAxiomAI, RedactionPolicy } from 'axiom/ai'; import { tracer } from './tracer'; -const sdk = new NodeSDK({ - resource: resourceFromAttributes( - { - [ATTR_SERVICE_NAME]: 'nextjs-otel-example', - }, - { - schemaUrl: 'https://opentelemetry.io/schemas/1.37.0', - }, - ) as Resource, - spanProcessor: new SimpleSpanProcessor( - new OTLPTraceExporter({ - url: `${process.env.AXIOM_URL}/v1/traces`, - headers: { - Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, - 'X-Axiom-Dataset': process.env.AXIOM_DATASET!, - }, - }), - ), +const exporter = new OTLPTraceExporter({ + url: `${process.env.AXIOM_URL}/v1/traces`, + headers: { + Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, + 'X-Axiom-Dataset': process.env.AXIOM_DATASET!, + }, }); -sdk.start(); +const provider = new NodeTracerProvider({ + resource: resourceFromAttributes({ + [ATTR_SERVICE_NAME]: 'nextjs-otel-example', + }), + spanProcessors: [new SimpleSpanProcessor(exporter)], +}); + +provider.register(); initAxiomAI({ tracer, redactionPolicy: RedactionPolicy.AxiomDefault }); diff --git a/examples/example-instrumentation-express/README.md b/examples/example-instrumentation-express/README.md index 03bd517..fa53100 100644 --- a/examples/example-instrumentation-express/README.md +++ b/examples/example-instrumentation-express/README.md @@ -2,7 +2,7 @@ This is a reference example for using Axiom with the Vercel AI SDK v4 with Express. The example shows steps for: -- Setting up a NodeSDK tracer under `src/instrumentation.ts` that points to Axiom +- Setting up an OpenTelemetry tracer under `src/instrumentation.ts` that points to Axiom - Wrapping AI SDK model under `src/model.ts` - Utilizing `withSpan()` to generate text using Vercel's AI SDK under `src/index.ts` diff --git a/examples/example-instrumentation-nextjs-v4/README.md b/examples/example-instrumentation-nextjs-v4/README.md index e71be0f..7bb64f7 100644 --- a/examples/example-instrumentation-nextjs-v4/README.md +++ b/examples/example-instrumentation-nextjs-v4/README.md @@ -2,9 +2,9 @@ This is a reference example for using Axiom with the Vercel AI SDK v4 with Next.js. The example shows steps for: -- Setting up a NodeSDK tracer under `src/instrumentation.ts` that points to Axiom +- Setting up an OpenTelemetry tracer under `src/instrumentation.ts` that points to Axiom - Wrapping AI SDK model under `src/shared/openai.ts` -- Utilizing `withSpan()` and wrapping a tool with `wrapTool()` to generate text using Vercel's AI SDK under `app/page.tsx` +- Utilizing `withSpan()` and wrapping tools with `wrapTools()` to generate text using Vercel's AI SDK under `app/page.tsx` ## How to use diff --git a/examples/example-instrumentation-nextjs-v4/package.json b/examples/example-instrumentation-nextjs-v4/package.json index a9885a6..5eb856d 100644 --- a/examples/example-instrumentation-nextjs-v4/package.json +++ b/examples/example-instrumentation-nextjs-v4/package.json @@ -19,15 +19,13 @@ "@opentelemetry/exporter-jaeger": "^2.0.1", "@opentelemetry/exporter-trace-otlp-http": "^0.202.0", "@opentelemetry/resources": "^2.0.1", - "@opentelemetry/sdk-node": "^0.202.0", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.34.0", "ai": "^4.3.16", "next": "latest", "react": "^18.2.0", "react-dom": "^18.2.0", - "require-in-the-middle": "^7.5.2", - "zod": "catalog:" + "zod": "^3.25.76" }, "devDependencies": { "@repo/eslint-config": "workspace:*", diff --git a/examples/example-instrumentation-nextjs-v4/src/app/generate-text/page.tsx b/examples/example-instrumentation-nextjs-v4/src/app/generate-text/page.tsx index 9ad69fc..ea56c29 100644 --- a/examples/example-instrumentation-nextjs-v4/src/app/generate-text/page.tsx +++ b/examples/example-instrumentation-nextjs-v4/src/app/generate-text/page.tsx @@ -1,7 +1,7 @@ import { generateText, tool } from 'ai'; import { z } from 'zod'; import { gpt4oMini } from '@/shared/openai'; -import { withSpan, wrapTool } from 'axiom/ai'; +import { withSpan, wrapTools } from 'axiom/ai'; export const dynamic = 'force-dynamic'; @@ -25,29 +25,26 @@ export default async function Page() { content: 'How do I get from Paris to Berlin?', }, ], - tools: { - findDirections: wrapTool( - 'findDirections', - tool({ - description: 'Find directions to a location', - parameters: z.object({ - from: z.string().describe('The location to start from'), - to: z.string().describe('The location to find directions to'), - }), - execute: async ({ from, to }, _opts) => { - // Simulate API call delay - await new Promise((resolve) => setTimeout(resolve, 500)); - - // Return mock directions data - return { - from, - to, - directions: `To get from ${from} to ${to}, use a teleporter.`, - }; - }, + tools: wrapTools({ + findDirections: tool({ + description: 'Find directions to a location', + parameters: z.object({ + from: z.string().describe('The location to start from'), + to: z.string().describe('The location to find directions to'), }), - ), - }, + execute: async ({ from, to }, _opts) => { + // Simulate API call delay + await new Promise((resolve) => setTimeout(resolve, 500)); + + // Return mock directions data + return { + from, + to, + directions: `To get from ${from} to ${to}, use a teleporter.`, + }; + }, + }), + }), }); }); diff --git a/examples/example-instrumentation-nextjs-v4/src/instrumentation.node.ts b/examples/example-instrumentation-nextjs-v4/src/instrumentation.node.ts index 9ae7c09..a8ccac6 100644 --- a/examples/example-instrumentation-nextjs-v4/src/instrumentation.node.ts +++ b/examples/example-instrumentation-nextjs-v4/src/instrumentation.node.ts @@ -1,27 +1,26 @@ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; -import type { Resource } from '@opentelemetry/resources'; import { resourceFromAttributes } from '@opentelemetry/resources'; -import { NodeSDK } from '@opentelemetry/sdk-node'; +import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'; import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; import { initAxiomAI, RedactionPolicy } from 'axiom/ai'; import { tracer } from './tracer'; -const sdk = new NodeSDK({ +const exporter = new OTLPTraceExporter({ + url: `${process.env.AXIOM_URL}/v1/traces`, + headers: { + Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, + 'X-Axiom-Dataset': process.env.AXIOM_DATASET!, + }, +}); + +const provider = new NodeTracerProvider({ resource: resourceFromAttributes({ [ATTR_SERVICE_NAME]: 'nextjs-otel-example', - }) as Resource, - spanProcessor: new SimpleSpanProcessor( - new OTLPTraceExporter({ - url: `${process.env.AXIOM_URL}/v1/traces`, - headers: { - Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, - 'X-Axiom-Dataset': process.env.AXIOM_DATASET!, - }, - }), - ), + }), + spanProcessors: [new SimpleSpanProcessor(exporter)], }); -sdk.start(); +provider.register(); initAxiomAI({ tracer, redactionPolicy: RedactionPolicy.AxiomDefault }); diff --git a/examples/example-instrumentation-nextjs-v5/README.md b/examples/example-instrumentation-nextjs-v5/README.md index ad08369..d5a3ed8 100644 --- a/examples/example-instrumentation-nextjs-v5/README.md +++ b/examples/example-instrumentation-nextjs-v5/README.md @@ -2,9 +2,9 @@ This is a reference example for using Axiom with the Vercel AI SDK v5 with Next.js. The example shows steps for: -- Setting up a NodeSDK tracer under `src/instrumentation.ts` that points to Axiom +- Setting up an OpenTelemetry tracer under `src/instrumentation.ts` that points to Axiom - Wrapping AI SDK model under `src/shared/openai.ts` -- Utilizing `withSpan()` and wrapping a tool with `wrapTool()` to generate text using Vercel's AI SDK under `app/page.tsx` +- Utilizing `withSpan()` and wrapping tools with `wrapTools()` to generate text using Vercel's AI SDK under `app/page.tsx` ## How to use diff --git a/examples/example-instrumentation-nextjs-v5/package.json b/examples/example-instrumentation-nextjs-v5/package.json index e82e981..2e483cd 100644 --- a/examples/example-instrumentation-nextjs-v5/package.json +++ b/examples/example-instrumentation-nextjs-v5/package.json @@ -19,7 +19,6 @@ "@opentelemetry/exporter-jaeger": "^2.0.1", "@opentelemetry/exporter-trace-otlp-http": "^0.202.0", "@opentelemetry/resources": "^2.0.1", - "@opentelemetry/sdk-node": "^0.202.0", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.34.0", "ai": "^5.0.15", diff --git a/examples/example-instrumentation-nextjs-v5/src/app/generate-text/page.tsx b/examples/example-instrumentation-nextjs-v5/src/app/generate-text/page.tsx index 77823b7..365e9e2 100644 --- a/examples/example-instrumentation-nextjs-v5/src/app/generate-text/page.tsx +++ b/examples/example-instrumentation-nextjs-v5/src/app/generate-text/page.tsx @@ -1,7 +1,7 @@ import { generateText, stepCountIs, tool } from 'ai'; import { z } from 'zod'; import { gpt4oMini } from '@/shared/openai'; -import { withSpan, wrapTool } from 'axiom/ai'; +import { withSpan, wrapTools } from 'axiom/ai'; export const dynamic = 'force-dynamic'; @@ -25,30 +25,27 @@ export default async function Page() { content: 'How do I get from Paris to Berlin?', }, ], - tools: { - findDirections: wrapTool( - 'findDirections', - tool({ - description: 'Find directions to a location', - inputSchema: z.object({ - from: z.string().describe('The location to start from'), - to: z.string().describe('The location to find directions to'), - }), - execute: async (params, _opts) => { - const { from, to } = params; - // Simulate API call delay - await new Promise((resolve) => setTimeout(resolve, 500)); - - // Return mock directions data - return { - from, - to, - directions: `To get from ${from} to ${to}, use a teleporter.`, - }; - }, + tools: wrapTools({ + findDirections: tool({ + description: 'Find directions to a location', + inputSchema: z.object({ + from: z.string().describe('The location to start from'), + to: z.string().describe('The location to find directions to'), }), - ), - }, + execute: async (params, _opts) => { + const { from, to } = params; + // Simulate API call delay + await new Promise((resolve) => setTimeout(resolve, 500)); + + // Return mock directions data + return { + from, + to, + directions: `To get from ${from} to ${to}, use a teleporter.`, + }; + }, + }), + }), }); }); diff --git a/examples/example-instrumentation-nextjs-v5/src/instrumentation.node.ts b/examples/example-instrumentation-nextjs-v5/src/instrumentation.node.ts index 9ae7c09..a8ccac6 100644 --- a/examples/example-instrumentation-nextjs-v5/src/instrumentation.node.ts +++ b/examples/example-instrumentation-nextjs-v5/src/instrumentation.node.ts @@ -1,27 +1,26 @@ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; -import type { Resource } from '@opentelemetry/resources'; import { resourceFromAttributes } from '@opentelemetry/resources'; -import { NodeSDK } from '@opentelemetry/sdk-node'; +import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'; import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; import { initAxiomAI, RedactionPolicy } from 'axiom/ai'; import { tracer } from './tracer'; -const sdk = new NodeSDK({ +const exporter = new OTLPTraceExporter({ + url: `${process.env.AXIOM_URL}/v1/traces`, + headers: { + Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, + 'X-Axiom-Dataset': process.env.AXIOM_DATASET!, + }, +}); + +const provider = new NodeTracerProvider({ resource: resourceFromAttributes({ [ATTR_SERVICE_NAME]: 'nextjs-otel-example', - }) as Resource, - spanProcessor: new SimpleSpanProcessor( - new OTLPTraceExporter({ - url: `${process.env.AXIOM_URL}/v1/traces`, - headers: { - Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, - 'X-Axiom-Dataset': process.env.AXIOM_DATASET!, - }, - }), - ), + }), + spanProcessors: [new SimpleSpanProcessor(exporter)], }); -sdk.start(); +provider.register(); initAxiomAI({ tracer, redactionPolicy: RedactionPolicy.AxiomDefault }); diff --git a/packages/ai/package.json b/packages/ai/package.json index a7b0aa3..90a7234 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -66,7 +66,6 @@ "@opentelemetry/context-async-hooks": "^2.0.1", "@opentelemetry/exporter-trace-otlp-http": "^0.202.0", "@opentelemetry/resources": "^2.0.1", - "@opentelemetry/sdk-node": "^0.202.0", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.37.0", "@sinclair/typebox": "^0.34.37", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83b8052..d87b7e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,9 +59,6 @@ importers: '@opentelemetry/resources': specifier: ^2.1.0 version: 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': - specifier: ^0.202.0 - version: 0.202.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': specifier: ^2.0.1 version: 2.0.1(@opentelemetry/api@1.9.0) @@ -180,7 +177,7 @@ importers: dependencies: '@ai-sdk/openai': specifier: ^1.3.23 - version: 1.3.24(zod@4.1.5) + version: 1.3.24(zod@3.25.76) '@opentelemetry/api': specifier: ^1.9.0 version: 1.9.0 @@ -193,9 +190,6 @@ importers: '@opentelemetry/resources': specifier: ^2.0.1 version: 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': - specifier: ^0.202.0 - version: 0.202.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': specifier: ^2.0.1 version: 2.0.1(@opentelemetry/api@1.9.0) @@ -204,7 +198,7 @@ importers: version: 1.36.0 ai: specifier: ^4.3.16 - version: 4.3.19(react@18.3.1)(zod@4.1.5) + version: 4.3.19(react@18.3.1)(zod@3.25.76) axiom: specifier: workspace:* version: link:../../packages/ai @@ -217,12 +211,9 @@ importers: react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) - require-in-the-middle: - specifier: ^7.5.2 - version: 7.5.2 zod: - specifier: 'catalog:' - version: 4.1.5 + specifier: ^3.25.76 + version: 3.25.76 devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -263,9 +254,6 @@ importers: '@opentelemetry/resources': specifier: ^2.0.1 version: 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': - specifier: ^0.202.0 - version: 0.202.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': specifier: ^2.0.1 version: 2.0.1(@opentelemetry/api@1.9.0) @@ -476,9 +464,6 @@ importers: '@opentelemetry/resources': specifier: ^2.0.1 version: 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': - specifier: ^0.202.0 - version: 0.202.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': specifier: ^2.0.1 version: 2.0.1(@opentelemetry/api@1.9.0) @@ -1020,78 +1005,92 @@ packages: resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.0': resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.0': resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.0': resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.0': resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.0': resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.0': resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.3': resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.3': resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.3': resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.3': resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.3': resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.3': resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.3': resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.3': resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} @@ -1169,24 +1168,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@15.5.3': resolution: {integrity: sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@15.5.3': resolution: {integrity: sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@15.5.3': resolution: {integrity: sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@15.5.3': resolution: {integrity: sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==} @@ -1923,56 +1926,67 @@ packages: resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.46.2': resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.46.2': resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.46.2': resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.46.2': resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.46.2': resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.46.2': resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.46.2': resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.46.2': resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.46.2': resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.46.2': resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.46.2': resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} @@ -3966,6 +3980,12 @@ snapshots: '@ai-sdk/provider-utils': 3.0.3(zod@4.1.5) zod: 4.1.5 + '@ai-sdk/openai@1.3.24(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + '@ai-sdk/openai@1.3.24(zod@4.1.5)': dependencies: '@ai-sdk/provider': 1.1.3 @@ -3990,6 +4010,13 @@ snapshots: '@ai-sdk/provider-utils': 3.0.3(zod@4.1.5) zod: 4.1.5 + '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.25.76 + '@ai-sdk/provider-utils@2.2.8(zod@4.1.5)': dependencies: '@ai-sdk/provider': 1.1.3 @@ -4040,6 +4067,16 @@ snapshots: dependencies: json-schema: 0.4.0 + '@ai-sdk/react@1.2.12(react@18.3.1)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + react: 18.3.1 + swr: 2.3.6(react@18.3.1) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.25.76 + '@ai-sdk/react@1.2.12(react@18.3.1)(zod@4.1.5)': dependencies: '@ai-sdk/provider-utils': 2.2.8(zod@4.1.5) @@ -4090,6 +4127,13 @@ snapshots: optionalDependencies: zod: 4.1.5 + '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + '@ai-sdk/ui-utils@1.2.11(zod@4.1.5)': dependencies: '@ai-sdk/provider': 1.1.3 @@ -5704,6 +5748,18 @@ snapshots: dependencies: humanize-ms: 1.2.1 + ai@4.3.19(react@18.3.1)(zod@3.25.76): + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/react': 1.2.12(react@18.3.1)(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod: 3.25.76 + optionalDependencies: + react: 18.3.1 + ai@4.3.19(react@18.3.1)(zod@4.1.5): dependencies: '@ai-sdk/provider': 1.1.3