Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion examples/example-evals-nextjs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
45 changes: 21 additions & 24 deletions examples/example-evals-nextjs/src/app/generate-text/page.tsx
Original file line number Diff line number Diff line change
@@ -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';

Expand All @@ -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.`,
};
},
}),
}),
});
});

Expand Down
36 changes: 15 additions & 21 deletions examples/example-evals-nextjs/src/instrumentation.node.ts
Original file line number Diff line number Diff line change
@@ -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 });
2 changes: 1 addition & 1 deletion examples/example-instrumentation-express/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

Expand Down
4 changes: 2 additions & 2 deletions examples/example-instrumentation-nextjs-v4/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 1 addition & 3 deletions examples/example-instrumentation-nextjs-v4/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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:*",
Expand Down
Original file line number Diff line number Diff line change
@@ -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';

Expand All @@ -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.`,
};
},
}),
}),
});
});

Expand Down
Original file line number Diff line number Diff line change
@@ -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 });
4 changes: 2 additions & 2 deletions examples/example-instrumentation-nextjs-v5/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 0 additions & 1 deletion examples/example-instrumentation-nextjs-v5/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
@@ -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';

Expand All @@ -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.`,
};
},
}),
}),
});
});

Expand Down
Original file line number Diff line number Diff line change
@@ -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 });
1 change: 0 additions & 1 deletion packages/ai/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Loading
Loading