axiom 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,7 @@ Axiom AI SDK provides an API to wrap your AI calls with observability instrument
6
6
 
7
7
  ```ts
8
8
  import { createOpenAI } from '@ai-sdk/openai';
9
- import { axiomAIMiddleware } from 'axiom';
9
+ import { axiomAIMiddleware } from 'axiom/ai';
10
10
  import { wrapLanguageModel } from 'ai';
11
11
 
12
12
  const openai = createOpenAI({
@@ -26,7 +26,7 @@ export const gpt4oMini = wrapLanguageModel({
26
26
 
27
27
  ```ts
28
28
  import { tool } from 'ai';
29
- import { wrapTool } from 'axiom';
29
+ import { wrapTool } from 'axiom/ai';
30
30
  import { z } from 'zod';
31
31
 
32
32
  const getWeather = tool({
package/dist/bin.cjs CHANGED
@@ -211,7 +211,7 @@ ${argEntries}
211
211
  }`;
212
212
  }
213
213
  }
214
- return `import { Type } from 'axiom';
214
+ return `import { Type } from 'axiom/ai';
215
215
 
216
216
  export default {
217
217
  name: '${prompt.name}',
@@ -431,12 +431,12 @@ var processor = new import_sdk_trace_node.BatchSpanProcessor(exporter, {
431
431
  var provider = new import_sdk_trace_node.NodeTracerProvider({
432
432
  resource: (0, import_resources.resourceFromAttributes)({
433
433
  ["service.name"]: "axiom-ai",
434
- ["service.version"]: "0.8.0"
434
+ ["service.version"]: "0.10.0"
435
435
  }),
436
436
  spanProcessors: [processor]
437
437
  });
438
438
  provider.register();
439
- var tracer = import_api.trace.getTracer("axiom-ai", "0.8.0");
439
+ var tracer = import_api.trace.getTracer("axiom-ai", "0.10.0");
440
440
  var flush = async () => {
441
441
  await provider.forceFlush();
442
442
  };
@@ -478,7 +478,7 @@ var loadRunCommand = (program2) => {
478
478
  var { loadEnvConfig } = import_env.default;
479
479
  loadEnvConfig(process.cwd());
480
480
  var program = new import_commander4.Command();
481
- program.name("axiom").description("Axiom's CLI to manage your objects and run evals").version("0.8.0");
481
+ program.name("axiom").description("Axiom's CLI to manage your objects and run evals").version("0.10.0");
482
482
  loadPushCommand(program);
483
483
  loadPullCommand(program);
484
484
  loadRunCommand(program);
package/dist/bin.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts","../src/commands/push.ts","../src/transpiler.ts","../src/commands/pull.ts","../src/commands/run.ts","../src/evals/run-vitest.ts","../src/evals/reporter.ts","../src/evals/instrument.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Load environment variables using @next/env\nimport pkg from '@next/env';\nconst { loadEnvConfig } = pkg;\n\n// Load .env files from the current working directory\nloadEnvConfig(process.cwd());\n\nimport { Command } from 'commander';\nimport { loadPushCommand } from './commands/push';\nimport { loadPullCommand } from './commands/pull';\nimport { loadRunCommand } from './commands/run';\n\nconst program = new Command();\n\nprogram\n .name('axiom')\n .description(\"Axiom's CLI to manage your objects and run evals\")\n .version(__SDK_VERSION__);\n\nloadPushCommand(program);\nloadPullCommand(program);\nloadRunCommand(program);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport {\n loadPromptModule,\n extractPromptFromModule,\n generatePromptFileFromApiResponse,\n} from '../transpiler';\nimport type { Prompt } from '../types';\nimport fs from 'node:fs/promises';\nimport readline from 'node:readline';\n\nasync function askConfirmation(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N): `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\nexport const loadPushCommand = (program: Command) => {\n const push = new Command('push')\n .description('Push a new version of an object')\n .argument(\n '<object>',\n 'The object to push, could be a prompt, en eval, a monitor, a dashboard, etc.',\n )\n .option('--prod', 'Adds the production tag to the prompt')\n .option('--yes', 'Automatically confirm overwriting the file with server response')\n .action(async (filePath: string, options: { yes?: boolean; prod?: boolean }) => {\n let content: Prompt | null = null;\n if (!filePath.endsWith('.prompt.ts')) {\n console.error('Prompt files must end with .prompt.ts');\n process.exit(1);\n }\n\n try {\n const moduleContent = await loadPromptModule(filePath);\n const promptData = extractPromptFromModule(moduleContent, filePath);\n\n content = promptData;\n\n console.log(`Transpiled prompt: ${promptData.name} (${promptData.slug})`);\n } catch (error) {\n console.error('Failed to transpile prompt file:', error);\n process.exit(1);\n }\n\n if (!content) {\n console.error('No content found');\n process.exit(1);\n }\n\n let shouldProceed = options.yes;\n if (!shouldProceed) {\n shouldProceed = await askConfirmation(\n `This will push \"${content.name}\" to Axiom and overwrite ${filePath}, are you sure you want to continue?`,\n );\n }\n\n if (!shouldProceed) {\n console.log('Push operation cancelled.');\n process.exit(0);\n }\n\n try {\n const response = await fetch(`${process.env.AXIOM_URL}/v1/prompts`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,\n 'Content-Type': 'application/json',\n 'x-axiom-client': 'axiom-ai-cli',\n 'x-axiom-check': 'good',\n },\n body: JSON.stringify({\n ...content,\n tags: options.yes ? ['production'] : [],\n }),\n });\n\n if (!response.ok) {\n try {\n const errorText = await response.clone().json();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(JSON.stringify(errorText, null, 2));\n process.exit(1);\n } catch (_error) {\n const errorText = await response.clone().text();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(errorText);\n process.exit(1);\n }\n }\n\n const apiResponse = await response.json();\n console.log(\n `Successfully pushed prompt: ${apiResponse.prompt.name} (${apiResponse.prompt.slug})`,\n );\n console.log(`Version: ${apiResponse.version.version}`);\n\n const updatedTsContent = generatePromptFileFromApiResponse(apiResponse);\n\n await fs.writeFile(filePath, updatedTsContent, 'utf-8');\n\n console.log(`Successfully updated ${filePath}`);\n } catch (error) {\n console.error('Failed to push prompt:', error);\n process.exit(1);\n }\n });\n\n program.addCommand(push);\n};\n","import { build } from 'esbuild';\nimport os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { basename } from 'node:path';\nimport type { Prompt } from './types';\n\nexport async function loadPromptModule(filePath: string) {\n const result = await build({\n entryPoints: [filePath],\n bundle: true,\n write: false,\n platform: 'node',\n format: 'esm',\n target: ['node18'],\n sourcemap: false,\n external: [\n // Only Node.js built-ins should be external\n 'fs',\n 'fs/promises',\n 'node:fs',\n 'node:fs/promises',\n 'readline',\n 'node:readline',\n 'path',\n 'node:path',\n 'os',\n 'node:os',\n 'url',\n 'node:url',\n 'util',\n 'node:util',\n 'crypto',\n 'node:crypto',\n 'events',\n 'node:events',\n 'stream',\n 'node:stream',\n 'buffer',\n 'node:buffer',\n 'process',\n 'node:process',\n ],\n });\n\n const code = result.outputFiles[0].text;\n\n // Create a unique temporary file\n const tempDir = os.tmpdir();\n const tempFileName = `axiom-ai-prompt-${Date.now()}-${Math.random().toString(36).substring(2)}.mjs`;\n const tempFilePath = path.join(tempDir, tempFileName);\n\n try {\n // Write the bundled code to temporary file\n await fs.writeFile(tempFilePath, code, 'utf-8');\n\n // Dynamically import the temporary module\n const moduleUrl = `file://${tempFilePath}`;\n const module = await import(moduleUrl);\n\n return module.default || module;\n } finally {\n // Clean up the temporary file\n try {\n await fs.unlink(tempFilePath);\n } catch (error) {\n // Ignore cleanup errors - temp files will be cleaned up by OS eventually\n console.warn(`Failed to clean up temporary file ${tempFilePath}:`, error);\n }\n }\n}\n\n/**\n * Convert TypeBox arguments to JSON Schema format expected by the API\n */\nfunction convertTypeBoxArgumentsToJsonSchema(arguments_: Record<string, any>): any {\n if (!arguments_ || typeof arguments_ !== 'object') {\n return {\n type: 'object',\n properties: {},\n required: [],\n additionalProperties: false,\n };\n }\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(arguments_)) {\n if (value && typeof value === 'object' && value.type) {\n // This is a TypeBox schema object that has been serialized\n properties[key] = {\n type: value.type,\n ...(value.description && { description: value.description }),\n ...(value.enum && { enum: value.enum }),\n ...(value.items && { items: value.items }),\n ...(value.properties && { properties: value.properties }),\n ...(value.required && { required: value.required }),\n };\n\n // For now, treat all arguments as required (this matches the existing behavior)\n // In the future, we could detect Type.Optional() usage\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n };\n}\n\nexport function extractPromptFromModule(moduleContent: any, filePath: string): Prompt {\n // Generate ID from file path if not provided\n const fileBaseName = basename(filePath, '.ts'); // Remove .ts extension\n const defaultId = fileBaseName.toLowerCase().replace(/[^a-z0-9]/g, '-');\n\n // Convert TypeBox arguments to JSON Schema format\n const convertedArguments = convertTypeBoxArgumentsToJsonSchema(moduleContent.arguments);\n\n // Extract and validate required fields from the module content\n const prompt: Prompt = {\n name: moduleContent.name || 'Untitled Prompt',\n slug: moduleContent.slug || defaultId,\n messages: moduleContent.messages || [],\n model: moduleContent.model,\n options: moduleContent.options,\n arguments: convertedArguments,\n id: moduleContent.id || defaultId,\n version: moduleContent.version || '1.0.0',\n // Optional fields from API response\n ...(moduleContent.promptId && { promptId: moduleContent.promptId }),\n ...(moduleContent.description && { description: moduleContent.description }),\n };\n\n // Validate required fields\n if (!prompt.name) {\n throw new Error('Prompt must have a name');\n }\n if (!prompt.slug) {\n throw new Error('Prompt must have a slug');\n }\n if (!Array.isArray(prompt.messages)) {\n throw new Error('Prompt messages must be an array');\n }\n\n if (!prompt.model) {\n throw new Error('Prompt must have a model');\n }\n\n return prompt;\n}\n\n/**\n * Transform JSON Schema to TypeBox/Template validator format\n */\nexport function transformJsonSchemaToTypeBox(schema: any): string {\n if (schema.type === 'string') {\n if (schema.enum && Array.isArray(schema.enum)) {\n // Handle enum as Union of Literals\n const literals = schema.enum.map((value: string) => `Type.Literal('${value}')`).join(', ');\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Union([${literals}]${options})`;\n } else {\n // Regular string\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.String(${options})`;\n }\n }\n\n if (schema.type === 'number' || schema.type === 'integer') {\n const typeMethod = schema.type === 'integer' ? 'Integer' : 'Number';\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.${typeMethod}(${options})`;\n }\n\n if (schema.type === 'boolean') {\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.Boolean(${options})`;\n }\n\n if (schema.type === 'array') {\n const itemsType = schema.items ? transformJsonSchemaToTypeBox(schema.items) : 'Type.String()';\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Array(${itemsType}${options})`;\n }\n\n if (schema.type === 'object') {\n if (schema.properties) {\n const props = Object.entries(schema.properties)\n .map(([key, value]: [string, any]) => {\n const isRequired = schema.required && schema.required.includes(key);\n const propType = transformJsonSchemaToTypeBox(value);\n return ` ${key}: ${isRequired ? propType : `Type.Optional(${propType})`}`;\n })\n .join(',\\n');\n\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Object({\\n${props}\\n }${options})`;\n } else {\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.Object({}${options ? `, ${options}` : ''})`;\n }\n }\n\n // Fallback for unknown types\n return 'Type.String()';\n}\n\n/**\n * Generate TypeScript prompt file content from API response\n */\nexport function generatePromptFileFromApiResponse(apiResponse: any): string {\n const { prompt, version } = apiResponse;\n const { data, options } = version;\n\n // Transform arguments from JSON Schema to TypeBox format\n let argumentsCode = '{}';\n if (data.arguments && data.arguments.properties) {\n const argEntries = Object.entries(data.arguments.properties)\n .map(([key, schema]: [string, any]) => {\n const isRequired = data.arguments.required && data.arguments.required.includes(key);\n const typeCode = transformJsonSchemaToTypeBox(schema);\n return ` ${key}: ${isRequired ? typeCode : `Type.Optional(${typeCode})`}`;\n })\n .join(',\\n');\n\n if (argEntries) {\n argumentsCode = `{\\n${argEntries}\\n }`;\n }\n }\n\n // Generate the TypeScript file content\n return `import { Type } from 'axiom';\n\nexport default {\n name: '${prompt.name}',\n slug: '${prompt.slug}',\n description: '${prompt.description || ''}',\n messages: [${data.messages\n .map(\n (msg: any) => `\n {\n role: '${msg.role}',\n content: '${msg.content.replace(/'/g, \"\\\\'\")}',\n }`,\n )\n .join(',')}\n ],\n model: '${data.model || 'gpt-4'}',\n options: {\n${\n options\n ? Object.entries(options)\n .map(([key, value]) => ` ${key}: ${value}`)\n .join(',\\n')\n : ''\n}\n },\n arguments: ${argumentsCode},\n version: '${version.version}',\n promptId: '${prompt.promptId}',\n};\n`;\n}\n","import { Command } from 'commander';\nimport { generatePromptFileFromApiResponse } from '../transpiler';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport const loadPullCommand = (program: Command) => {\n const pull = new Command('pull')\n .description('Pull a version of an object')\n .argument(\n '<slug>',\n 'The object to pull, could be a prompt, en eval, a monitor, a dashboard, etc.',\n )\n .option('--version <version>', 'The version to pull, default: latest', 'latest')\n .option('--output <path>', 'Output file path (optional, defaults to <slug>.prompt.ts)')\n .action(async (slug: string, options: { version: string; output?: string }) => {\n try {\n console.log(`Pulling prompt: ${slug} (version: ${options.version})`);\n\n const url = `${process.env.AXIOM_URL}/v1/prompts/${slug}`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,\n 'Content-Type': 'application/json',\n 'x-axiom-client': 'axiom-ai-cli',\n 'x-axiom-check': 'good',\n },\n });\n\n if (!response.ok) {\n try {\n const errorText = await response.clone().json();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(JSON.stringify(errorText, null, 2));\n process.exit(1);\n } catch (_error) {\n const errorText = await response.clone().text();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(errorText);\n process.exit(1);\n }\n }\n\n const apiResponse = await response.json();\n\n const tsContent = generatePromptFileFromApiResponse(apiResponse);\n\n const outputPath = options.output || `${slug}.prompt.ts`;\n const fullPath = path.resolve(outputPath);\n\n await fs.writeFile(fullPath, tsContent, 'utf-8');\n\n console.log(`Successfully generated prompt file: ${fullPath}`);\n console.log(`Prompt: ${apiResponse.prompt.name} (${apiResponse.prompt.slug})`);\n console.log(`Version: ${apiResponse.version.version}`);\n } catch (error) {\n console.error('Failed to pull prompt:', error);\n process.exit(1);\n }\n });\n\n program.addCommand(pull);\n};\n","import { Command } from 'commander';\nimport { runVitest } from '../evals/run-vitest';\n\nexport const loadRunCommand = (program: Command) => {\n return program.addCommand(\n new Command('run')\n .description('run evals locally')\n .argument('<path>', 'Path to an eval test file, should be in the form of name.eval.ts')\n .action(async (file: string) => {\n if (!process.env.AXIOM_URL || !process.env.AXIOM_TOKEN || !process.env.AXIOM_DATASET) {\n throw new Error('AXIOM_URL, AXIOM_TOKEN, and AXIOM_DATASET must be set');\n }\n await runVitest(file);\n }),\n );\n};\n","import { createVitest, registerConsoleShortcuts } from 'vitest/node';\nimport { AxiomReporter } from './reporter';\nimport { flush } from './instrument';\n\nexport const runVitest = async (file: string) => {\n const vi = await createVitest('test', {\n // root: process.cwd(),\n mode: 'test',\n include: [file ? file : '**/*.eval.ts'],\n reporters: ['verbose', new AxiomReporter()],\n environment: 'node',\n browser: undefined,\n });\n\n await vi.start();\n\n const dispose = registerConsoleShortcuts(vi, process.stdin, process.stdout);\n\n if (!vi.shouldKeepServer()) {\n dispose();\n await flush();\n await vi.close();\n process.exit(0);\n }\n\n await flush();\n};\n","import type { SerializedError } from 'vitest';\nimport type { Reporter, TestModule, TestRunEndReason, TestSuite } from 'vitest/node.js';\nimport type { TaskMeta } from 'vitest/index.cjs';\nimport type { EvalReport } from './eval';\n\n/**\n * Custom Vitest reporter for Axiom AI evaluations.\n *\n * This reporter collects evaluation results and scores from tests\n * and processes them for further analysis and reporting.\n *\n * @experimental This API is experimental and may change in future versions.\n */\nexport class AxiomReporter implements Reporter {\n onTestSuiteReady(_testSuite: TestSuite) {}\n\n onTestSuiteResult(testSuite: TestSuite) {\n for (const test of testSuite.children.array()) {\n if (test.type !== 'test') continue;\n const testMeta = test.meta() as TaskMeta & { eval: EvalReport };\n\n if (!testMeta.eval) {\n return;\n }\n\n // build scores array\n const scores: { name: string; score: number }[] = [];\n for (const s of Object.entries(testMeta.eval.scores)) {\n scores.push({ name: s[1].name, score: s[1].score });\n }\n }\n }\n\n async onTestRunEnd(\n _testModules: ReadonlyArray<TestModule>,\n _errors: ReadonlyArray<SerializedError>,\n _reason: TestRunEndReason,\n ) {}\n}\n","import { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { trace, type Context, type SpanOptions } from '@opentelemetry/api';\n\nconst collectorOptions = {\n url: process.env.AXIOM_URL\n ? `${process.env.AXIOM_URL}/v1/traces`\n : 'https://api.axiom.co/v1/traces', // Axiom API endpoint for trace data\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, // Replace API_TOKEN with your actual API token\n 'X-Axiom-Dataset': process.env.AXIOM_DATASET || '', // Replace DATASET_NAME with your dataset\n },\n concurrencyLimit: 10, // an optional limit on pending requests\n};\n\n// export const consoleExporter = new ConsoleSpanExporter()\nexport const exporter = new OTLPTraceExporter(collectorOptions);\n\nconst processor = new BatchSpanProcessor(exporter, {\n maxQueueSize: 2048,\n maxExportBatchSize: 512,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: 30000,\n});\n\nconst provider = new NodeTracerProvider({\n resource: resourceFromAttributes({\n ['service.name']: 'axiom-ai',\n ['service.version']: __SDK_VERSION__,\n }),\n spanProcessors: [processor],\n});\n\nprovider.register();\n\n// Create a shared tracer instance\nconst tracer = trace.getTracer('axiom-ai', __SDK_VERSION__);\n\nexport const flush = async () => {\n await provider.forceFlush();\n};\n\nexport const startSpan = (name: string, opts: SpanOptions, context?: Context) => {\n return tracer.startSpan(name, opts, context);\n};\n"],"mappings":"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","names":["import_commander","import_node_path","os","path","fs","module","import_promises","readline","resolve","program","fs","import_commander","fs","path","program","import_commander","program","pkg"]}
1
+ {"version":3,"sources":["../src/bin.ts","../src/commands/push.ts","../src/transpiler.ts","../src/commands/pull.ts","../src/commands/run.ts","../src/evals/run-vitest.ts","../src/evals/reporter.ts","../src/evals/instrument.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Load environment variables using @next/env\nimport pkg from '@next/env';\nconst { loadEnvConfig } = pkg;\n\n// Load .env files from the current working directory\nloadEnvConfig(process.cwd());\n\nimport { Command } from 'commander';\nimport { loadPushCommand } from './commands/push';\nimport { loadPullCommand } from './commands/pull';\nimport { loadRunCommand } from './commands/run';\n\nconst program = new Command();\n\nprogram\n .name('axiom')\n .description(\"Axiom's CLI to manage your objects and run evals\")\n .version(__SDK_VERSION__);\n\nloadPushCommand(program);\nloadPullCommand(program);\nloadRunCommand(program);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport {\n loadPromptModule,\n extractPromptFromModule,\n generatePromptFileFromApiResponse,\n} from '../transpiler';\nimport type { Prompt } from '../types';\nimport fs from 'node:fs/promises';\nimport readline from 'node:readline';\n\nasync function askConfirmation(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N): `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\nexport const loadPushCommand = (program: Command) => {\n const push = new Command('push')\n .description('Push a new version of an object')\n .argument(\n '<object>',\n 'The object to push, could be a prompt, en eval, a monitor, a dashboard, etc.',\n )\n .option('--prod', 'Adds the production tag to the prompt')\n .option('--yes', 'Automatically confirm overwriting the file with server response')\n .action(async (filePath: string, options: { yes?: boolean; prod?: boolean }) => {\n let content: Prompt | null = null;\n if (!filePath.endsWith('.prompt.ts')) {\n console.error('Prompt files must end with .prompt.ts');\n process.exit(1);\n }\n\n try {\n const moduleContent = await loadPromptModule(filePath);\n const promptData = extractPromptFromModule(moduleContent, filePath);\n\n content = promptData;\n\n console.log(`Transpiled prompt: ${promptData.name} (${promptData.slug})`);\n } catch (error) {\n console.error('Failed to transpile prompt file:', error);\n process.exit(1);\n }\n\n if (!content) {\n console.error('No content found');\n process.exit(1);\n }\n\n let shouldProceed = options.yes;\n if (!shouldProceed) {\n shouldProceed = await askConfirmation(\n `This will push \"${content.name}\" to Axiom and overwrite ${filePath}, are you sure you want to continue?`,\n );\n }\n\n if (!shouldProceed) {\n console.log('Push operation cancelled.');\n process.exit(0);\n }\n\n try {\n const response = await fetch(`${process.env.AXIOM_URL}/v1/prompts`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,\n 'Content-Type': 'application/json',\n 'x-axiom-client': 'axiom-ai-cli',\n 'x-axiom-check': 'good',\n },\n body: JSON.stringify({\n ...content,\n tags: options.yes ? ['production'] : [],\n }),\n });\n\n if (!response.ok) {\n try {\n const errorText = await response.clone().json();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(JSON.stringify(errorText, null, 2));\n process.exit(1);\n } catch (_error) {\n const errorText = await response.clone().text();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(errorText);\n process.exit(1);\n }\n }\n\n const apiResponse = await response.json();\n console.log(\n `Successfully pushed prompt: ${apiResponse.prompt.name} (${apiResponse.prompt.slug})`,\n );\n console.log(`Version: ${apiResponse.version.version}`);\n\n const updatedTsContent = generatePromptFileFromApiResponse(apiResponse);\n\n await fs.writeFile(filePath, updatedTsContent, 'utf-8');\n\n console.log(`Successfully updated ${filePath}`);\n } catch (error) {\n console.error('Failed to push prompt:', error);\n process.exit(1);\n }\n });\n\n program.addCommand(push);\n};\n","import { build } from 'esbuild';\nimport os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { basename } from 'node:path';\nimport type { Prompt } from './types';\n\nexport async function loadPromptModule(filePath: string) {\n const result = await build({\n entryPoints: [filePath],\n bundle: true,\n write: false,\n platform: 'node',\n format: 'esm',\n target: ['node18'],\n sourcemap: false,\n external: [\n // Only Node.js built-ins should be external\n 'fs',\n 'fs/promises',\n 'node:fs',\n 'node:fs/promises',\n 'readline',\n 'node:readline',\n 'path',\n 'node:path',\n 'os',\n 'node:os',\n 'url',\n 'node:url',\n 'util',\n 'node:util',\n 'crypto',\n 'node:crypto',\n 'events',\n 'node:events',\n 'stream',\n 'node:stream',\n 'buffer',\n 'node:buffer',\n 'process',\n 'node:process',\n ],\n });\n\n const code = result.outputFiles[0].text;\n\n // Create a unique temporary file\n const tempDir = os.tmpdir();\n const tempFileName = `axiom-ai-prompt-${Date.now()}-${Math.random().toString(36).substring(2)}.mjs`;\n const tempFilePath = path.join(tempDir, tempFileName);\n\n try {\n // Write the bundled code to temporary file\n await fs.writeFile(tempFilePath, code, 'utf-8');\n\n // Dynamically import the temporary module\n const moduleUrl = `file://${tempFilePath}`;\n const module = await import(moduleUrl);\n\n return module.default || module;\n } finally {\n // Clean up the temporary file\n try {\n await fs.unlink(tempFilePath);\n } catch (error) {\n // Ignore cleanup errors - temp files will be cleaned up by OS eventually\n console.warn(`Failed to clean up temporary file ${tempFilePath}:`, error);\n }\n }\n}\n\n/**\n * Convert TypeBox arguments to JSON Schema format expected by the API\n */\nfunction convertTypeBoxArgumentsToJsonSchema(arguments_: Record<string, any>): any {\n if (!arguments_ || typeof arguments_ !== 'object') {\n return {\n type: 'object',\n properties: {},\n required: [],\n additionalProperties: false,\n };\n }\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(arguments_)) {\n if (value && typeof value === 'object' && value.type) {\n // This is a TypeBox schema object that has been serialized\n properties[key] = {\n type: value.type,\n ...(value.description && { description: value.description }),\n ...(value.enum && { enum: value.enum }),\n ...(value.items && { items: value.items }),\n ...(value.properties && { properties: value.properties }),\n ...(value.required && { required: value.required }),\n };\n\n // For now, treat all arguments as required (this matches the existing behavior)\n // In the future, we could detect Type.Optional() usage\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n };\n}\n\nexport function extractPromptFromModule(moduleContent: any, filePath: string): Prompt {\n // Generate ID from file path if not provided\n const fileBaseName = basename(filePath, '.ts'); // Remove .ts extension\n const defaultId = fileBaseName.toLowerCase().replace(/[^a-z0-9]/g, '-');\n\n // Convert TypeBox arguments to JSON Schema format\n const convertedArguments = convertTypeBoxArgumentsToJsonSchema(moduleContent.arguments);\n\n // Extract and validate required fields from the module content\n const prompt: Prompt = {\n name: moduleContent.name || 'Untitled Prompt',\n slug: moduleContent.slug || defaultId,\n messages: moduleContent.messages || [],\n model: moduleContent.model,\n options: moduleContent.options,\n arguments: convertedArguments,\n id: moduleContent.id || defaultId,\n version: moduleContent.version || '1.0.0',\n // Optional fields from API response\n ...(moduleContent.promptId && { promptId: moduleContent.promptId }),\n ...(moduleContent.description && { description: moduleContent.description }),\n };\n\n // Validate required fields\n if (!prompt.name) {\n throw new Error('Prompt must have a name');\n }\n if (!prompt.slug) {\n throw new Error('Prompt must have a slug');\n }\n if (!Array.isArray(prompt.messages)) {\n throw new Error('Prompt messages must be an array');\n }\n\n if (!prompt.model) {\n throw new Error('Prompt must have a model');\n }\n\n return prompt;\n}\n\n/**\n * Transform JSON Schema to TypeBox/Template validator format\n */\nexport function transformJsonSchemaToTypeBox(schema: any): string {\n if (schema.type === 'string') {\n if (schema.enum && Array.isArray(schema.enum)) {\n // Handle enum as Union of Literals\n const literals = schema.enum.map((value: string) => `Type.Literal('${value}')`).join(', ');\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Union([${literals}]${options})`;\n } else {\n // Regular string\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.String(${options})`;\n }\n }\n\n if (schema.type === 'number' || schema.type === 'integer') {\n const typeMethod = schema.type === 'integer' ? 'Integer' : 'Number';\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.${typeMethod}(${options})`;\n }\n\n if (schema.type === 'boolean') {\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.Boolean(${options})`;\n }\n\n if (schema.type === 'array') {\n const itemsType = schema.items ? transformJsonSchemaToTypeBox(schema.items) : 'Type.String()';\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Array(${itemsType}${options})`;\n }\n\n if (schema.type === 'object') {\n if (schema.properties) {\n const props = Object.entries(schema.properties)\n .map(([key, value]: [string, any]) => {\n const isRequired = schema.required && schema.required.includes(key);\n const propType = transformJsonSchemaToTypeBox(value);\n return ` ${key}: ${isRequired ? propType : `Type.Optional(${propType})`}`;\n })\n .join(',\\n');\n\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Object({\\n${props}\\n }${options})`;\n } else {\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.Object({}${options ? `, ${options}` : ''})`;\n }\n }\n\n // Fallback for unknown types\n return 'Type.String()';\n}\n\n/**\n * Generate TypeScript prompt file content from API response\n */\nexport function generatePromptFileFromApiResponse(apiResponse: any): string {\n const { prompt, version } = apiResponse;\n const { data, options } = version;\n\n // Transform arguments from JSON Schema to TypeBox format\n let argumentsCode = '{}';\n if (data.arguments && data.arguments.properties) {\n const argEntries = Object.entries(data.arguments.properties)\n .map(([key, schema]: [string, any]) => {\n const isRequired = data.arguments.required && data.arguments.required.includes(key);\n const typeCode = transformJsonSchemaToTypeBox(schema);\n return ` ${key}: ${isRequired ? typeCode : `Type.Optional(${typeCode})`}`;\n })\n .join(',\\n');\n\n if (argEntries) {\n argumentsCode = `{\\n${argEntries}\\n }`;\n }\n }\n\n // Generate the TypeScript file content\n return `import { Type } from 'axiom/ai';\n\nexport default {\n name: '${prompt.name}',\n slug: '${prompt.slug}',\n description: '${prompt.description || ''}',\n messages: [${data.messages\n .map(\n (msg: any) => `\n {\n role: '${msg.role}',\n content: '${msg.content.replace(/'/g, \"\\\\'\")}',\n }`,\n )\n .join(',')}\n ],\n model: '${data.model || 'gpt-4'}',\n options: {\n${\n options\n ? Object.entries(options)\n .map(([key, value]) => ` ${key}: ${value}`)\n .join(',\\n')\n : ''\n}\n },\n arguments: ${argumentsCode},\n version: '${version.version}',\n promptId: '${prompt.promptId}',\n};\n`;\n}\n","import { Command } from 'commander';\nimport { generatePromptFileFromApiResponse } from '../transpiler';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport const loadPullCommand = (program: Command) => {\n const pull = new Command('pull')\n .description('Pull a version of an object')\n .argument(\n '<slug>',\n 'The object to pull, could be a prompt, en eval, a monitor, a dashboard, etc.',\n )\n .option('--version <version>', 'The version to pull, default: latest', 'latest')\n .option('--output <path>', 'Output file path (optional, defaults to <slug>.prompt.ts)')\n .action(async (slug: string, options: { version: string; output?: string }) => {\n try {\n console.log(`Pulling prompt: ${slug} (version: ${options.version})`);\n\n const url = `${process.env.AXIOM_URL}/v1/prompts/${slug}`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,\n 'Content-Type': 'application/json',\n 'x-axiom-client': 'axiom-ai-cli',\n 'x-axiom-check': 'good',\n },\n });\n\n if (!response.ok) {\n try {\n const errorText = await response.clone().json();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(JSON.stringify(errorText, null, 2));\n process.exit(1);\n } catch (_error) {\n const errorText = await response.clone().text();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(errorText);\n process.exit(1);\n }\n }\n\n const apiResponse = await response.json();\n\n const tsContent = generatePromptFileFromApiResponse(apiResponse);\n\n const outputPath = options.output || `${slug}.prompt.ts`;\n const fullPath = path.resolve(outputPath);\n\n await fs.writeFile(fullPath, tsContent, 'utf-8');\n\n console.log(`Successfully generated prompt file: ${fullPath}`);\n console.log(`Prompt: ${apiResponse.prompt.name} (${apiResponse.prompt.slug})`);\n console.log(`Version: ${apiResponse.version.version}`);\n } catch (error) {\n console.error('Failed to pull prompt:', error);\n process.exit(1);\n }\n });\n\n program.addCommand(pull);\n};\n","import { Command } from 'commander';\nimport { runVitest } from '../evals/run-vitest';\n\nexport const loadRunCommand = (program: Command) => {\n return program.addCommand(\n new Command('run')\n .description('run evals locally')\n .argument('<path>', 'Path to an eval test file, should be in the form of name.eval.ts')\n .action(async (file: string) => {\n if (!process.env.AXIOM_URL || !process.env.AXIOM_TOKEN || !process.env.AXIOM_DATASET) {\n throw new Error('AXIOM_URL, AXIOM_TOKEN, and AXIOM_DATASET must be set');\n }\n await runVitest(file);\n }),\n );\n};\n","import { createVitest, registerConsoleShortcuts } from 'vitest/node';\nimport { AxiomReporter } from './reporter';\nimport { flush } from './instrument';\n\nexport const runVitest = async (file: string) => {\n const vi = await createVitest('test', {\n // root: process.cwd(),\n mode: 'test',\n include: [file ? file : '**/*.eval.ts'],\n reporters: ['verbose', new AxiomReporter()],\n environment: 'node',\n browser: undefined,\n });\n\n await vi.start();\n\n const dispose = registerConsoleShortcuts(vi, process.stdin, process.stdout);\n\n if (!vi.shouldKeepServer()) {\n dispose();\n await flush();\n await vi.close();\n process.exit(0);\n }\n\n await flush();\n};\n","import type { SerializedError } from 'vitest';\nimport type { Reporter, TestModule, TestRunEndReason, TestSuite } from 'vitest/node.js';\nimport type { TaskMeta } from 'vitest/index.cjs';\nimport type { EvalReport } from './eval';\n\n/**\n * Custom Vitest reporter for Axiom AI evaluations.\n *\n * This reporter collects evaluation results and scores from tests\n * and processes them for further analysis and reporting.\n *\n * @experimental This API is experimental and may change in future versions.\n */\nexport class AxiomReporter implements Reporter {\n onTestSuiteReady(_testSuite: TestSuite) {}\n\n onTestSuiteResult(testSuite: TestSuite) {\n for (const test of testSuite.children.array()) {\n if (test.type !== 'test') continue;\n const testMeta = test.meta() as TaskMeta & { eval: EvalReport };\n\n if (!testMeta.eval) {\n return;\n }\n\n // build scores array\n const scores: { name: string; score: number }[] = [];\n for (const s of Object.entries(testMeta.eval.scores)) {\n scores.push({ name: s[1].name, score: s[1].score });\n }\n }\n }\n\n async onTestRunEnd(\n _testModules: ReadonlyArray<TestModule>,\n _errors: ReadonlyArray<SerializedError>,\n _reason: TestRunEndReason,\n ) {}\n}\n","import { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { trace, type Context, type SpanOptions } from '@opentelemetry/api';\n\nconst collectorOptions = {\n url: process.env.AXIOM_URL\n ? `${process.env.AXIOM_URL}/v1/traces`\n : 'https://api.axiom.co/v1/traces', // Axiom API endpoint for trace data\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, // Replace API_TOKEN with your actual API token\n 'X-Axiom-Dataset': process.env.AXIOM_DATASET || '', // Replace DATASET_NAME with your dataset\n },\n concurrencyLimit: 10, // an optional limit on pending requests\n};\n\n// export const consoleExporter = new ConsoleSpanExporter()\nexport const exporter = new OTLPTraceExporter(collectorOptions);\n\nconst processor = new BatchSpanProcessor(exporter, {\n maxQueueSize: 2048,\n maxExportBatchSize: 512,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: 30000,\n});\n\nconst provider = new NodeTracerProvider({\n resource: resourceFromAttributes({\n ['service.name']: 'axiom-ai',\n ['service.version']: __SDK_VERSION__,\n }),\n spanProcessors: [processor],\n});\n\nprovider.register();\n\n// Create a shared tracer instance\nconst tracer = trace.getTracer('axiom-ai', __SDK_VERSION__);\n\nexport const flush = async () => {\n await provider.forceFlush();\n};\n\nexport const startSpan = (name: string, opts: SpanOptions, context?: Context) => {\n return tracer.startSpan(name, opts, context);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,iBAAgB;AAMhB,IAAAA,oBAAwB;;;ACTxB,uBAAwB;;;ACAxB,qBAAsB;AACtB,qBAAe;AACf,sBAAe;AACf,uBAAiB;AACjB,IAAAC,oBAAyB;AAGzB,eAAsB,iBAAiB,UAAkB;AACvD,QAAM,SAAS,UAAM,sBAAM;AAAA,IACzB,aAAa,CAAC,QAAQ;AAAA,IACtB,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ,CAAC,QAAQ;AAAA,IACjB,WAAW;AAAA,IACX,UAAU;AAAA;AAAA,MAER;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,OAAO,OAAO,YAAY,CAAC,EAAE;AAGnC,QAAM,UAAU,eAAAC,QAAG,OAAO;AAC1B,QAAM,eAAe,mBAAmB,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;AAC7F,QAAM,eAAe,iBAAAC,QAAK,KAAK,SAAS,YAAY;AAEpD,MAAI;AAEF,UAAM,gBAAAC,QAAG,UAAU,cAAc,MAAM,OAAO;AAG9C,UAAM,YAAY,UAAU,YAAY;AACxC,UAAMC,UAAS,MAAM,OAAO;AAE5B,WAAOA,QAAO,WAAWA;AAAA,EAC3B,UAAE;AAEA,QAAI;AACF,YAAM,gBAAAD,QAAG,OAAO,YAAY;AAAA,IAC9B,SAAS,OAAO;AAEd,cAAQ,KAAK,qCAAqC,YAAY,KAAK,KAAK;AAAA,IAC1E;AAAA,EACF;AACF;AAKA,SAAS,oCAAoC,YAAsC;AACjF,MAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY,CAAC;AAAA,MACb,UAAU,CAAC;AAAA,MACX,sBAAsB;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,aAAkC,CAAC;AACzC,QAAM,WAAqB,CAAC;AAE5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,QAAI,SAAS,OAAO,UAAU,YAAY,MAAM,MAAM;AAEpD,iBAAW,GAAG,IAAI;AAAA,QAChB,MAAM,MAAM;AAAA,QACZ,GAAI,MAAM,eAAe,EAAE,aAAa,MAAM,YAAY;AAAA,QAC1D,GAAI,MAAM,QAAQ,EAAE,MAAM,MAAM,KAAK;AAAA,QACrC,GAAI,MAAM,SAAS,EAAE,OAAO,MAAM,MAAM;AAAA,QACxC,GAAI,MAAM,cAAc,EAAE,YAAY,MAAM,WAAW;AAAA,QACvD,GAAI,MAAM,YAAY,EAAE,UAAU,MAAM,SAAS;AAAA,MACnD;AAIA,eAAS,KAAK,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,EACxB;AACF;AAEO,SAAS,wBAAwB,eAAoB,UAA0B;AAEpF,QAAM,mBAAe,4BAAS,UAAU,KAAK;AAC7C,QAAM,YAAY,aAAa,YAAY,EAAE,QAAQ,cAAc,GAAG;AAGtE,QAAM,qBAAqB,oCAAoC,cAAc,SAAS;AAGtF,QAAM,SAAiB;AAAA,IACrB,MAAM,cAAc,QAAQ;AAAA,IAC5B,MAAM,cAAc,QAAQ;AAAA,IAC5B,UAAU,cAAc,YAAY,CAAC;AAAA,IACrC,OAAO,cAAc;AAAA,IACrB,SAAS,cAAc;AAAA,IACvB,WAAW;AAAA,IACX,IAAI,cAAc,MAAM;AAAA,IACxB,SAAS,cAAc,WAAW;AAAA;AAAA,IAElC,GAAI,cAAc,YAAY,EAAE,UAAU,cAAc,SAAS;AAAA,IACjE,GAAI,cAAc,eAAe,EAAE,aAAa,cAAc,YAAY;AAAA,EAC5E;AAGA,MAAI,CAAC,OAAO,MAAM;AAChB,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACA,MAAI,CAAC,OAAO,MAAM;AAChB,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACA,MAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACnC,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,SAAO;AACT;AAKO,SAAS,6BAA6B,QAAqB;AAChE,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,IAAI,GAAG;AAE7C,YAAM,WAAW,OAAO,KAAK,IAAI,CAAC,UAAkB,iBAAiB,KAAK,IAAI,EAAE,KAAK,IAAI;AACzF,YAAM,UAAU,OAAO,cAAc,qBAAqB,OAAO,WAAW,QAAQ;AACpF,aAAO,eAAe,QAAQ,IAAI,OAAO;AAAA,IAC3C,OAAO;AAEL,YAAM,UAAU,OAAO,cAAc,mBAAmB,OAAO,WAAW,QAAQ;AAClF,aAAO,eAAe,OAAO;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,WAAW;AACzD,UAAM,aAAa,OAAO,SAAS,YAAY,YAAY;AAC3D,UAAM,UAAU,OAAO,cAAc,mBAAmB,OAAO,WAAW,QAAQ;AAClF,WAAO,QAAQ,UAAU,IAAI,OAAO;AAAA,EACtC;AAEA,MAAI,OAAO,SAAS,WAAW;AAC7B,UAAM,UAAU,OAAO,cAAc,mBAAmB,OAAO,WAAW,QAAQ;AAClF,WAAO,gBAAgB,OAAO;AAAA,EAChC;AAEA,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,YAAY,OAAO,QAAQ,6BAA6B,OAAO,KAAK,IAAI;AAC9E,UAAM,UAAU,OAAO,cAAc,qBAAqB,OAAO,WAAW,QAAQ;AACpF,WAAO,cAAc,SAAS,GAAG,OAAO;AAAA,EAC1C;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,OAAO,YAAY;AACrB,YAAM,QAAQ,OAAO,QAAQ,OAAO,UAAU,EAC3C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAqB;AACpC,cAAM,aAAa,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AAClE,cAAM,WAAW,6BAA6B,KAAK;AACnD,eAAO,OAAO,GAAG,KAAK,aAAa,WAAW,iBAAiB,QAAQ,GAAG;AAAA,MAC5E,CAAC,EACA,KAAK,KAAK;AAEb,YAAM,UAAU,OAAO,cAAc,qBAAqB,OAAO,WAAW,QAAQ;AACpF,aAAO;AAAA,EAAkB,KAAK;AAAA,KAAQ,OAAO;AAAA,IAC/C,OAAO;AACL,YAAM,UAAU,OAAO,cAAc,mBAAmB,OAAO,WAAW,QAAQ;AAClF,aAAO,iBAAiB,UAAU,KAAK,OAAO,KAAK,EAAE;AAAA,IACvD;AAAA,EACF;AAGA,SAAO;AACT;AAKO,SAAS,kCAAkC,aAA0B;AAC1E,QAAM,EAAE,QAAQ,QAAQ,IAAI;AAC5B,QAAM,EAAE,MAAM,QAAQ,IAAI;AAG1B,MAAI,gBAAgB;AACpB,MAAI,KAAK,aAAa,KAAK,UAAU,YAAY;AAC/C,UAAM,aAAa,OAAO,QAAQ,KAAK,UAAU,UAAU,EACxD,IAAI,CAAC,CAAC,KAAK,MAAM,MAAqB;AACrC,YAAM,aAAa,KAAK,UAAU,YAAY,KAAK,UAAU,SAAS,SAAS,GAAG;AAClF,YAAM,WAAW,6BAA6B,MAAM;AACpD,aAAO,OAAO,GAAG,KAAK,aAAa,WAAW,iBAAiB,QAAQ,GAAG;AAAA,IAC5E,CAAC,EACA,KAAK,KAAK;AAEb,QAAI,YAAY;AACd,sBAAgB;AAAA,EAAM,UAAU;AAAA;AAAA,IAClC;AAAA,EACF;AAGA,SAAO;AAAA;AAAA;AAAA,WAGE,OAAO,IAAI;AAAA,WACX,OAAO,IAAI;AAAA,kBACJ,OAAO,eAAe,EAAE;AAAA,eAC3B,KAAK,SACf;AAAA,IACC,CAAC,QAAa;AAAA;AAAA,eAEL,IAAI,IAAI;AAAA,kBACL,IAAI,QAAQ,QAAQ,MAAM,KAAK,CAAC;AAAA;AAAA,EAE9C,EACC,KAAK,GAAG,CAAC;AAAA;AAAA,YAEF,KAAK,SAAS,OAAO;AAAA;AAAA,EAG/B,UACI,OAAO,QAAQ,OAAO,EACnB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,GAAG,KAAK,KAAK,EAAE,EAC5C,KAAK,KAAK,IACb,EACN;AAAA;AAAA,eAEe,aAAa;AAAA,cACd,QAAQ,OAAO;AAAA,eACd,OAAO,QAAQ;AAAA;AAAA;AAG9B;;;ADnQA,IAAAE,mBAAe;AACf,2BAAqB;AAErB,eAAe,gBAAgB,SAAmC;AAChE,QAAM,KAAK,qBAAAC,QAAS,gBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,OAAG,SAAS,GAAG,OAAO,YAAY,CAAC,WAAW;AAC5C,SAAG,MAAM;AACT,MAAAA,SAAQ,OAAO,YAAY,MAAM,OAAO,OAAO,YAAY,MAAM,KAAK;AAAA,IACxE,CAAC;AAAA,EACH,CAAC;AACH;AAEO,IAAM,kBAAkB,CAACC,aAAqB;AACnD,QAAM,OAAO,IAAI,yBAAQ,MAAM,EAC5B,YAAY,iCAAiC,EAC7C;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,UAAU,uCAAuC,EACxD,OAAO,SAAS,iEAAiE,EACjF,OAAO,OAAO,UAAkB,YAA+C;AAC9E,QAAI,UAAyB;AAC7B,QAAI,CAAC,SAAS,SAAS,YAAY,GAAG;AACpC,cAAQ,MAAM,uCAAuC;AACrD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI;AACF,YAAM,gBAAgB,MAAM,iBAAiB,QAAQ;AACrD,YAAM,aAAa,wBAAwB,eAAe,QAAQ;AAElE,gBAAU;AAEV,cAAQ,IAAI,sBAAsB,WAAW,IAAI,KAAK,WAAW,IAAI,GAAG;AAAA,IAC1E,SAAS,OAAO;AACd,cAAQ,MAAM,oCAAoC,KAAK;AACvD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,kBAAkB;AAChC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,gBAAgB,QAAQ;AAC5B,QAAI,CAAC,eAAe;AAClB,sBAAgB,MAAM;AAAA,QACpB,mBAAmB,QAAQ,IAAI,4BAA4B,QAAQ;AAAA,MACrE;AAAA,IACF;AAEA,QAAI,CAAC,eAAe;AAClB,cAAQ,IAAI,2BAA2B;AACvC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,IAAI,SAAS,eAAe;AAAA,QAClE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,QAAQ,IAAI,WAAW;AAAA,UAChD,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,iBAAiB;AAAA,QACnB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,GAAG;AAAA,UACH,MAAM,QAAQ,MAAM,CAAC,YAAY,IAAI,CAAC;AAAA,QACxC,CAAC;AAAA,MACH,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI;AACF,gBAAM,YAAY,MAAM,SAAS,MAAM,EAAE,KAAK;AAC9C,kBAAQ,MAAM,2BAA2B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AACjF,kBAAQ,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAChD,kBAAQ,KAAK,CAAC;AAAA,QAChB,SAAS,QAAQ;AACf,gBAAM,YAAY,MAAM,SAAS,MAAM,EAAE,KAAK;AAC9C,kBAAQ,MAAM,2BAA2B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AACjF,kBAAQ,MAAM,SAAS;AACvB,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAEA,YAAM,cAAc,MAAM,SAAS,KAAK;AACxC,cAAQ;AAAA,QACN,+BAA+B,YAAY,OAAO,IAAI,KAAK,YAAY,OAAO,IAAI;AAAA,MACpF;AACA,cAAQ,IAAI,YAAY,YAAY,QAAQ,OAAO,EAAE;AAErD,YAAM,mBAAmB,kCAAkC,WAAW;AAEtE,YAAM,iBAAAC,QAAG,UAAU,UAAU,kBAAkB,OAAO;AAEtD,cAAQ,IAAI,wBAAwB,QAAQ,EAAE;AAAA,IAChD,SAAS,OAAO;AACd,cAAQ,MAAM,0BAA0B,KAAK;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,EAAAD,SAAQ,WAAW,IAAI;AACzB;;;AEpHA,IAAAE,oBAAwB;AAExB,IAAAC,MAAoB;AACpB,IAAAC,QAAsB;AAEf,IAAM,kBAAkB,CAACC,aAAqB;AACnD,QAAM,OAAO,IAAI,0BAAQ,MAAM,EAC5B,YAAY,6BAA6B,EACzC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,uBAAuB,wCAAwC,QAAQ,EAC9E,OAAO,mBAAmB,2DAA2D,EACrF,OAAO,OAAO,MAAc,YAAkD;AAC7E,QAAI;AACF,cAAQ,IAAI,mBAAmB,IAAI,cAAc,QAAQ,OAAO,GAAG;AAEnE,YAAM,MAAM,GAAG,QAAQ,IAAI,SAAS,eAAe,IAAI;AACvD,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,QAAQ,IAAI,WAAW;AAAA,UAChD,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,iBAAiB;AAAA,QACnB;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI;AACF,gBAAM,YAAY,MAAM,SAAS,MAAM,EAAE,KAAK;AAC9C,kBAAQ,MAAM,2BAA2B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AACjF,kBAAQ,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAChD,kBAAQ,KAAK,CAAC;AAAA,QAChB,SAAS,QAAQ;AACf,gBAAM,YAAY,MAAM,SAAS,MAAM,EAAE,KAAK;AAC9C,kBAAQ,MAAM,2BAA2B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AACjF,kBAAQ,MAAM,SAAS;AACvB,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAEA,YAAM,cAAc,MAAM,SAAS,KAAK;AAExC,YAAM,YAAY,kCAAkC,WAAW;AAE/D,YAAM,aAAa,QAAQ,UAAU,GAAG,IAAI;AAC5C,YAAM,WAAgB,cAAQ,UAAU;AAExC,YAAS,cAAU,UAAU,WAAW,OAAO;AAE/C,cAAQ,IAAI,uCAAuC,QAAQ,EAAE;AAC7D,cAAQ,IAAI,WAAW,YAAY,OAAO,IAAI,KAAK,YAAY,OAAO,IAAI,GAAG;AAC7E,cAAQ,IAAI,YAAY,YAAY,QAAQ,OAAO,EAAE;AAAA,IACvD,SAAS,OAAO;AACd,cAAQ,MAAM,0BAA0B,KAAK;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,EAAAA,SAAQ,WAAW,IAAI;AACzB;;;AC9DA,IAAAC,oBAAwB;;;ACAxB,kBAAuD;;;ACahD,IAAM,gBAAN,MAAwC;AAAA,EAC7C,iBAAiB,YAAuB;AAAA,EAAC;AAAA,EAEzC,kBAAkB,WAAsB;AACtC,eAAW,QAAQ,UAAU,SAAS,MAAM,GAAG;AAC7C,UAAI,KAAK,SAAS,OAAQ;AAC1B,YAAM,WAAW,KAAK,KAAK;AAE3B,UAAI,CAAC,SAAS,MAAM;AAClB;AAAA,MACF;AAGA,YAAM,SAA4C,CAAC;AACnD,iBAAW,KAAK,OAAO,QAAQ,SAAS,KAAK,MAAM,GAAG;AACpD,eAAO,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,cACA,SACA,SACA;AAAA,EAAC;AACL;;;ACtCA,4BAAuD;AACvD,uBAAuC;AACvC,sCAAkC;AAClC,iBAAsD;AAEtD,IAAM,mBAAmB;AAAA,EACvB,KAAK,QAAQ,IAAI,YACb,GAAG,QAAQ,IAAI,SAAS,eACxB;AAAA;AAAA,EACJ,SAAS;AAAA,IACP,eAAe,UAAU,QAAQ,IAAI,WAAW;AAAA;AAAA,IAChD,mBAAmB,QAAQ,IAAI,iBAAiB;AAAA;AAAA,EAClD;AAAA,EACA,kBAAkB;AAAA;AACpB;AAGO,IAAM,WAAW,IAAI,kDAAkB,gBAAgB;AAE9D,IAAM,YAAY,IAAI,yCAAmB,UAAU;AAAA,EACjD,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,qBAAqB;AACvB,CAAC;AAED,IAAM,WAAW,IAAI,yCAAmB;AAAA,EACtC,cAAU,yCAAuB;AAAA,IAC/B,CAAC,cAAc,GAAG;AAAA,IAClB,CAAC,iBAAiB,GAAG;AAAA,EACvB,CAAC;AAAA,EACD,gBAAgB,CAAC,SAAS;AAC5B,CAAC;AAED,SAAS,SAAS;AAGlB,IAAM,SAAS,iBAAM,UAAU,YAAY,QAAe;AAEnD,IAAM,QAAQ,YAAY;AAC/B,QAAM,SAAS,WAAW;AAC5B;;;AFrCO,IAAM,YAAY,OAAO,SAAiB;AAC/C,QAAM,KAAK,UAAM,0BAAa,QAAQ;AAAA;AAAA,IAEpC,MAAM;AAAA,IACN,SAAS,CAAC,OAAO,OAAO,cAAc;AAAA,IACtC,WAAW,CAAC,WAAW,IAAI,cAAc,CAAC;AAAA,IAC1C,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAED,QAAM,GAAG,MAAM;AAEf,QAAM,cAAU,sCAAyB,IAAI,QAAQ,OAAO,QAAQ,MAAM;AAE1E,MAAI,CAAC,GAAG,iBAAiB,GAAG;AAC1B,YAAQ;AACR,UAAM,MAAM;AACZ,UAAM,GAAG,MAAM;AACf,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM;AACd;;;ADvBO,IAAM,iBAAiB,CAACC,aAAqB;AAClD,SAAOA,SAAQ;AAAA,IACb,IAAI,0BAAQ,KAAK,EACd,YAAY,mBAAmB,EAC/B,SAAS,UAAU,kEAAkE,EACrF,OAAO,OAAO,SAAiB;AAC9B,UAAI,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ,IAAI,eAAe,CAAC,QAAQ,IAAI,eAAe;AACpF,cAAM,IAAI,MAAM,uDAAuD;AAAA,MACzE;AACA,YAAM,UAAU,IAAI;AAAA,IACtB,CAAC;AAAA,EACL;AACF;;;AJXA,IAAM,EAAE,cAAc,IAAI,WAAAC;AAG1B,cAAc,QAAQ,IAAI,CAAC;AAO3B,IAAM,UAAU,IAAI,0BAAQ;AAE5B,QACG,KAAK,OAAO,EACZ,YAAY,kDAAkD,EAC9D,QAAQ,QAAe;AAE1B,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;AACvB,eAAe,OAAO;AAEtB,QAAQ,MAAM;","names":["import_commander","import_node_path","os","path","fs","module","import_promises","readline","resolve","program","fs","import_commander","fs","path","program","import_commander","program","pkg"]}
package/dist/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  flush
4
- } from "./chunk-Y2CPJRWO.js";
4
+ } from "./chunk-Z3F75MP5.js";
5
5
  import {
6
6
  AxiomReporter
7
7
  } from "./chunk-CKSTM4QJ.js";
@@ -195,7 +195,7 @@ ${argEntries}
195
195
  }`;
196
196
  }
197
197
  }
198
- return `import { Type } from 'axiom';
198
+ return `import { Type } from 'axiom/ai';
199
199
 
200
200
  export default {
201
201
  name: '${prompt.name}',
@@ -402,7 +402,7 @@ var loadRunCommand = (program2) => {
402
402
  var { loadEnvConfig } = pkg;
403
403
  loadEnvConfig(process.cwd());
404
404
  var program = new Command4();
405
- program.name("axiom").description("Axiom's CLI to manage your objects and run evals").version("0.8.0");
405
+ program.name("axiom").description("Axiom's CLI to manage your objects and run evals").version("0.10.0");
406
406
  loadPushCommand(program);
407
407
  loadPullCommand(program);
408
408
  loadRunCommand(program);
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts","../src/commands/push.ts","../src/transpiler.ts","../src/commands/pull.ts","../src/commands/run.ts","../src/evals/run-vitest.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Load environment variables using @next/env\nimport pkg from '@next/env';\nconst { loadEnvConfig } = pkg;\n\n// Load .env files from the current working directory\nloadEnvConfig(process.cwd());\n\nimport { Command } from 'commander';\nimport { loadPushCommand } from './commands/push';\nimport { loadPullCommand } from './commands/pull';\nimport { loadRunCommand } from './commands/run';\n\nconst program = new Command();\n\nprogram\n .name('axiom')\n .description(\"Axiom's CLI to manage your objects and run evals\")\n .version(__SDK_VERSION__);\n\nloadPushCommand(program);\nloadPullCommand(program);\nloadRunCommand(program);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport {\n loadPromptModule,\n extractPromptFromModule,\n generatePromptFileFromApiResponse,\n} from '../transpiler';\nimport type { Prompt } from '../types';\nimport fs from 'node:fs/promises';\nimport readline from 'node:readline';\n\nasync function askConfirmation(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N): `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\nexport const loadPushCommand = (program: Command) => {\n const push = new Command('push')\n .description('Push a new version of an object')\n .argument(\n '<object>',\n 'The object to push, could be a prompt, en eval, a monitor, a dashboard, etc.',\n )\n .option('--prod', 'Adds the production tag to the prompt')\n .option('--yes', 'Automatically confirm overwriting the file with server response')\n .action(async (filePath: string, options: { yes?: boolean; prod?: boolean }) => {\n let content: Prompt | null = null;\n if (!filePath.endsWith('.prompt.ts')) {\n console.error('Prompt files must end with .prompt.ts');\n process.exit(1);\n }\n\n try {\n const moduleContent = await loadPromptModule(filePath);\n const promptData = extractPromptFromModule(moduleContent, filePath);\n\n content = promptData;\n\n console.log(`Transpiled prompt: ${promptData.name} (${promptData.slug})`);\n } catch (error) {\n console.error('Failed to transpile prompt file:', error);\n process.exit(1);\n }\n\n if (!content) {\n console.error('No content found');\n process.exit(1);\n }\n\n let shouldProceed = options.yes;\n if (!shouldProceed) {\n shouldProceed = await askConfirmation(\n `This will push \"${content.name}\" to Axiom and overwrite ${filePath}, are you sure you want to continue?`,\n );\n }\n\n if (!shouldProceed) {\n console.log('Push operation cancelled.');\n process.exit(0);\n }\n\n try {\n const response = await fetch(`${process.env.AXIOM_URL}/v1/prompts`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,\n 'Content-Type': 'application/json',\n 'x-axiom-client': 'axiom-ai-cli',\n 'x-axiom-check': 'good',\n },\n body: JSON.stringify({\n ...content,\n tags: options.yes ? ['production'] : [],\n }),\n });\n\n if (!response.ok) {\n try {\n const errorText = await response.clone().json();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(JSON.stringify(errorText, null, 2));\n process.exit(1);\n } catch (_error) {\n const errorText = await response.clone().text();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(errorText);\n process.exit(1);\n }\n }\n\n const apiResponse = await response.json();\n console.log(\n `Successfully pushed prompt: ${apiResponse.prompt.name} (${apiResponse.prompt.slug})`,\n );\n console.log(`Version: ${apiResponse.version.version}`);\n\n const updatedTsContent = generatePromptFileFromApiResponse(apiResponse);\n\n await fs.writeFile(filePath, updatedTsContent, 'utf-8');\n\n console.log(`Successfully updated ${filePath}`);\n } catch (error) {\n console.error('Failed to push prompt:', error);\n process.exit(1);\n }\n });\n\n program.addCommand(push);\n};\n","import { build } from 'esbuild';\nimport os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { basename } from 'node:path';\nimport type { Prompt } from './types';\n\nexport async function loadPromptModule(filePath: string) {\n const result = await build({\n entryPoints: [filePath],\n bundle: true,\n write: false,\n platform: 'node',\n format: 'esm',\n target: ['node18'],\n sourcemap: false,\n external: [\n // Only Node.js built-ins should be external\n 'fs',\n 'fs/promises',\n 'node:fs',\n 'node:fs/promises',\n 'readline',\n 'node:readline',\n 'path',\n 'node:path',\n 'os',\n 'node:os',\n 'url',\n 'node:url',\n 'util',\n 'node:util',\n 'crypto',\n 'node:crypto',\n 'events',\n 'node:events',\n 'stream',\n 'node:stream',\n 'buffer',\n 'node:buffer',\n 'process',\n 'node:process',\n ],\n });\n\n const code = result.outputFiles[0].text;\n\n // Create a unique temporary file\n const tempDir = os.tmpdir();\n const tempFileName = `axiom-ai-prompt-${Date.now()}-${Math.random().toString(36).substring(2)}.mjs`;\n const tempFilePath = path.join(tempDir, tempFileName);\n\n try {\n // Write the bundled code to temporary file\n await fs.writeFile(tempFilePath, code, 'utf-8');\n\n // Dynamically import the temporary module\n const moduleUrl = `file://${tempFilePath}`;\n const module = await import(moduleUrl);\n\n return module.default || module;\n } finally {\n // Clean up the temporary file\n try {\n await fs.unlink(tempFilePath);\n } catch (error) {\n // Ignore cleanup errors - temp files will be cleaned up by OS eventually\n console.warn(`Failed to clean up temporary file ${tempFilePath}:`, error);\n }\n }\n}\n\n/**\n * Convert TypeBox arguments to JSON Schema format expected by the API\n */\nfunction convertTypeBoxArgumentsToJsonSchema(arguments_: Record<string, any>): any {\n if (!arguments_ || typeof arguments_ !== 'object') {\n return {\n type: 'object',\n properties: {},\n required: [],\n additionalProperties: false,\n };\n }\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(arguments_)) {\n if (value && typeof value === 'object' && value.type) {\n // This is a TypeBox schema object that has been serialized\n properties[key] = {\n type: value.type,\n ...(value.description && { description: value.description }),\n ...(value.enum && { enum: value.enum }),\n ...(value.items && { items: value.items }),\n ...(value.properties && { properties: value.properties }),\n ...(value.required && { required: value.required }),\n };\n\n // For now, treat all arguments as required (this matches the existing behavior)\n // In the future, we could detect Type.Optional() usage\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n };\n}\n\nexport function extractPromptFromModule(moduleContent: any, filePath: string): Prompt {\n // Generate ID from file path if not provided\n const fileBaseName = basename(filePath, '.ts'); // Remove .ts extension\n const defaultId = fileBaseName.toLowerCase().replace(/[^a-z0-9]/g, '-');\n\n // Convert TypeBox arguments to JSON Schema format\n const convertedArguments = convertTypeBoxArgumentsToJsonSchema(moduleContent.arguments);\n\n // Extract and validate required fields from the module content\n const prompt: Prompt = {\n name: moduleContent.name || 'Untitled Prompt',\n slug: moduleContent.slug || defaultId,\n messages: moduleContent.messages || [],\n model: moduleContent.model,\n options: moduleContent.options,\n arguments: convertedArguments,\n id: moduleContent.id || defaultId,\n version: moduleContent.version || '1.0.0',\n // Optional fields from API response\n ...(moduleContent.promptId && { promptId: moduleContent.promptId }),\n ...(moduleContent.description && { description: moduleContent.description }),\n };\n\n // Validate required fields\n if (!prompt.name) {\n throw new Error('Prompt must have a name');\n }\n if (!prompt.slug) {\n throw new Error('Prompt must have a slug');\n }\n if (!Array.isArray(prompt.messages)) {\n throw new Error('Prompt messages must be an array');\n }\n\n if (!prompt.model) {\n throw new Error('Prompt must have a model');\n }\n\n return prompt;\n}\n\n/**\n * Transform JSON Schema to TypeBox/Template validator format\n */\nexport function transformJsonSchemaToTypeBox(schema: any): string {\n if (schema.type === 'string') {\n if (schema.enum && Array.isArray(schema.enum)) {\n // Handle enum as Union of Literals\n const literals = schema.enum.map((value: string) => `Type.Literal('${value}')`).join(', ');\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Union([${literals}]${options})`;\n } else {\n // Regular string\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.String(${options})`;\n }\n }\n\n if (schema.type === 'number' || schema.type === 'integer') {\n const typeMethod = schema.type === 'integer' ? 'Integer' : 'Number';\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.${typeMethod}(${options})`;\n }\n\n if (schema.type === 'boolean') {\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.Boolean(${options})`;\n }\n\n if (schema.type === 'array') {\n const itemsType = schema.items ? transformJsonSchemaToTypeBox(schema.items) : 'Type.String()';\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Array(${itemsType}${options})`;\n }\n\n if (schema.type === 'object') {\n if (schema.properties) {\n const props = Object.entries(schema.properties)\n .map(([key, value]: [string, any]) => {\n const isRequired = schema.required && schema.required.includes(key);\n const propType = transformJsonSchemaToTypeBox(value);\n return ` ${key}: ${isRequired ? propType : `Type.Optional(${propType})`}`;\n })\n .join(',\\n');\n\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Object({\\n${props}\\n }${options})`;\n } else {\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.Object({}${options ? `, ${options}` : ''})`;\n }\n }\n\n // Fallback for unknown types\n return 'Type.String()';\n}\n\n/**\n * Generate TypeScript prompt file content from API response\n */\nexport function generatePromptFileFromApiResponse(apiResponse: any): string {\n const { prompt, version } = apiResponse;\n const { data, options } = version;\n\n // Transform arguments from JSON Schema to TypeBox format\n let argumentsCode = '{}';\n if (data.arguments && data.arguments.properties) {\n const argEntries = Object.entries(data.arguments.properties)\n .map(([key, schema]: [string, any]) => {\n const isRequired = data.arguments.required && data.arguments.required.includes(key);\n const typeCode = transformJsonSchemaToTypeBox(schema);\n return ` ${key}: ${isRequired ? typeCode : `Type.Optional(${typeCode})`}`;\n })\n .join(',\\n');\n\n if (argEntries) {\n argumentsCode = `{\\n${argEntries}\\n }`;\n }\n }\n\n // Generate the TypeScript file content\n return `import { Type } from 'axiom';\n\nexport default {\n name: '${prompt.name}',\n slug: '${prompt.slug}',\n description: '${prompt.description || ''}',\n messages: [${data.messages\n .map(\n (msg: any) => `\n {\n role: '${msg.role}',\n content: '${msg.content.replace(/'/g, \"\\\\'\")}',\n }`,\n )\n .join(',')}\n ],\n model: '${data.model || 'gpt-4'}',\n options: {\n${\n options\n ? Object.entries(options)\n .map(([key, value]) => ` ${key}: ${value}`)\n .join(',\\n')\n : ''\n}\n },\n arguments: ${argumentsCode},\n version: '${version.version}',\n promptId: '${prompt.promptId}',\n};\n`;\n}\n","import { Command } from 'commander';\nimport { generatePromptFileFromApiResponse } from '../transpiler';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport const loadPullCommand = (program: Command) => {\n const pull = new Command('pull')\n .description('Pull a version of an object')\n .argument(\n '<slug>',\n 'The object to pull, could be a prompt, en eval, a monitor, a dashboard, etc.',\n )\n .option('--version <version>', 'The version to pull, default: latest', 'latest')\n .option('--output <path>', 'Output file path (optional, defaults to <slug>.prompt.ts)')\n .action(async (slug: string, options: { version: string; output?: string }) => {\n try {\n console.log(`Pulling prompt: ${slug} (version: ${options.version})`);\n\n const url = `${process.env.AXIOM_URL}/v1/prompts/${slug}`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,\n 'Content-Type': 'application/json',\n 'x-axiom-client': 'axiom-ai-cli',\n 'x-axiom-check': 'good',\n },\n });\n\n if (!response.ok) {\n try {\n const errorText = await response.clone().json();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(JSON.stringify(errorText, null, 2));\n process.exit(1);\n } catch (_error) {\n const errorText = await response.clone().text();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(errorText);\n process.exit(1);\n }\n }\n\n const apiResponse = await response.json();\n\n const tsContent = generatePromptFileFromApiResponse(apiResponse);\n\n const outputPath = options.output || `${slug}.prompt.ts`;\n const fullPath = path.resolve(outputPath);\n\n await fs.writeFile(fullPath, tsContent, 'utf-8');\n\n console.log(`Successfully generated prompt file: ${fullPath}`);\n console.log(`Prompt: ${apiResponse.prompt.name} (${apiResponse.prompt.slug})`);\n console.log(`Version: ${apiResponse.version.version}`);\n } catch (error) {\n console.error('Failed to pull prompt:', error);\n process.exit(1);\n }\n });\n\n program.addCommand(pull);\n};\n","import { Command } from 'commander';\nimport { runVitest } from '../evals/run-vitest';\n\nexport const loadRunCommand = (program: Command) => {\n return program.addCommand(\n new Command('run')\n .description('run evals locally')\n .argument('<path>', 'Path to an eval test file, should be in the form of name.eval.ts')\n .action(async (file: string) => {\n if (!process.env.AXIOM_URL || !process.env.AXIOM_TOKEN || !process.env.AXIOM_DATASET) {\n throw new Error('AXIOM_URL, AXIOM_TOKEN, and AXIOM_DATASET must be set');\n }\n await runVitest(file);\n }),\n );\n};\n","import { createVitest, registerConsoleShortcuts } from 'vitest/node';\nimport { AxiomReporter } from './reporter';\nimport { flush } from './instrument';\n\nexport const runVitest = async (file: string) => {\n const vi = await createVitest('test', {\n // root: process.cwd(),\n mode: 'test',\n include: [file ? file : '**/*.eval.ts'],\n reporters: ['verbose', new AxiomReporter()],\n environment: 'node',\n browser: undefined,\n });\n\n await vi.start();\n\n const dispose = registerConsoleShortcuts(vi, process.stdin, process.stdout);\n\n if (!vi.shouldKeepServer()) {\n dispose();\n await flush();\n await vi.close();\n process.exit(0);\n }\n\n await flush();\n};\n"],"mappings":"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","names":["Command","fs","resolve","program","Command","fs","path","program","Command","Command","program","Command","Command"]}
1
+ {"version":3,"sources":["../src/bin.ts","../src/commands/push.ts","../src/transpiler.ts","../src/commands/pull.ts","../src/commands/run.ts","../src/evals/run-vitest.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// Load environment variables using @next/env\nimport pkg from '@next/env';\nconst { loadEnvConfig } = pkg;\n\n// Load .env files from the current working directory\nloadEnvConfig(process.cwd());\n\nimport { Command } from 'commander';\nimport { loadPushCommand } from './commands/push';\nimport { loadPullCommand } from './commands/pull';\nimport { loadRunCommand } from './commands/run';\n\nconst program = new Command();\n\nprogram\n .name('axiom')\n .description(\"Axiom's CLI to manage your objects and run evals\")\n .version(__SDK_VERSION__);\n\nloadPushCommand(program);\nloadPullCommand(program);\nloadRunCommand(program);\n\nprogram.parse();\n","import { Command } from 'commander';\nimport {\n loadPromptModule,\n extractPromptFromModule,\n generatePromptFileFromApiResponse,\n} from '../transpiler';\nimport type { Prompt } from '../types';\nimport fs from 'node:fs/promises';\nimport readline from 'node:readline';\n\nasync function askConfirmation(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N): `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\nexport const loadPushCommand = (program: Command) => {\n const push = new Command('push')\n .description('Push a new version of an object')\n .argument(\n '<object>',\n 'The object to push, could be a prompt, en eval, a monitor, a dashboard, etc.',\n )\n .option('--prod', 'Adds the production tag to the prompt')\n .option('--yes', 'Automatically confirm overwriting the file with server response')\n .action(async (filePath: string, options: { yes?: boolean; prod?: boolean }) => {\n let content: Prompt | null = null;\n if (!filePath.endsWith('.prompt.ts')) {\n console.error('Prompt files must end with .prompt.ts');\n process.exit(1);\n }\n\n try {\n const moduleContent = await loadPromptModule(filePath);\n const promptData = extractPromptFromModule(moduleContent, filePath);\n\n content = promptData;\n\n console.log(`Transpiled prompt: ${promptData.name} (${promptData.slug})`);\n } catch (error) {\n console.error('Failed to transpile prompt file:', error);\n process.exit(1);\n }\n\n if (!content) {\n console.error('No content found');\n process.exit(1);\n }\n\n let shouldProceed = options.yes;\n if (!shouldProceed) {\n shouldProceed = await askConfirmation(\n `This will push \"${content.name}\" to Axiom and overwrite ${filePath}, are you sure you want to continue?`,\n );\n }\n\n if (!shouldProceed) {\n console.log('Push operation cancelled.');\n process.exit(0);\n }\n\n try {\n const response = await fetch(`${process.env.AXIOM_URL}/v1/prompts`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,\n 'Content-Type': 'application/json',\n 'x-axiom-client': 'axiom-ai-cli',\n 'x-axiom-check': 'good',\n },\n body: JSON.stringify({\n ...content,\n tags: options.yes ? ['production'] : [],\n }),\n });\n\n if (!response.ok) {\n try {\n const errorText = await response.clone().json();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(JSON.stringify(errorText, null, 2));\n process.exit(1);\n } catch (_error) {\n const errorText = await response.clone().text();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(errorText);\n process.exit(1);\n }\n }\n\n const apiResponse = await response.json();\n console.log(\n `Successfully pushed prompt: ${apiResponse.prompt.name} (${apiResponse.prompt.slug})`,\n );\n console.log(`Version: ${apiResponse.version.version}`);\n\n const updatedTsContent = generatePromptFileFromApiResponse(apiResponse);\n\n await fs.writeFile(filePath, updatedTsContent, 'utf-8');\n\n console.log(`Successfully updated ${filePath}`);\n } catch (error) {\n console.error('Failed to push prompt:', error);\n process.exit(1);\n }\n });\n\n program.addCommand(push);\n};\n","import { build } from 'esbuild';\nimport os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { basename } from 'node:path';\nimport type { Prompt } from './types';\n\nexport async function loadPromptModule(filePath: string) {\n const result = await build({\n entryPoints: [filePath],\n bundle: true,\n write: false,\n platform: 'node',\n format: 'esm',\n target: ['node18'],\n sourcemap: false,\n external: [\n // Only Node.js built-ins should be external\n 'fs',\n 'fs/promises',\n 'node:fs',\n 'node:fs/promises',\n 'readline',\n 'node:readline',\n 'path',\n 'node:path',\n 'os',\n 'node:os',\n 'url',\n 'node:url',\n 'util',\n 'node:util',\n 'crypto',\n 'node:crypto',\n 'events',\n 'node:events',\n 'stream',\n 'node:stream',\n 'buffer',\n 'node:buffer',\n 'process',\n 'node:process',\n ],\n });\n\n const code = result.outputFiles[0].text;\n\n // Create a unique temporary file\n const tempDir = os.tmpdir();\n const tempFileName = `axiom-ai-prompt-${Date.now()}-${Math.random().toString(36).substring(2)}.mjs`;\n const tempFilePath = path.join(tempDir, tempFileName);\n\n try {\n // Write the bundled code to temporary file\n await fs.writeFile(tempFilePath, code, 'utf-8');\n\n // Dynamically import the temporary module\n const moduleUrl = `file://${tempFilePath}`;\n const module = await import(moduleUrl);\n\n return module.default || module;\n } finally {\n // Clean up the temporary file\n try {\n await fs.unlink(tempFilePath);\n } catch (error) {\n // Ignore cleanup errors - temp files will be cleaned up by OS eventually\n console.warn(`Failed to clean up temporary file ${tempFilePath}:`, error);\n }\n }\n}\n\n/**\n * Convert TypeBox arguments to JSON Schema format expected by the API\n */\nfunction convertTypeBoxArgumentsToJsonSchema(arguments_: Record<string, any>): any {\n if (!arguments_ || typeof arguments_ !== 'object') {\n return {\n type: 'object',\n properties: {},\n required: [],\n additionalProperties: false,\n };\n }\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(arguments_)) {\n if (value && typeof value === 'object' && value.type) {\n // This is a TypeBox schema object that has been serialized\n properties[key] = {\n type: value.type,\n ...(value.description && { description: value.description }),\n ...(value.enum && { enum: value.enum }),\n ...(value.items && { items: value.items }),\n ...(value.properties && { properties: value.properties }),\n ...(value.required && { required: value.required }),\n };\n\n // For now, treat all arguments as required (this matches the existing behavior)\n // In the future, we could detect Type.Optional() usage\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n required,\n additionalProperties: false,\n };\n}\n\nexport function extractPromptFromModule(moduleContent: any, filePath: string): Prompt {\n // Generate ID from file path if not provided\n const fileBaseName = basename(filePath, '.ts'); // Remove .ts extension\n const defaultId = fileBaseName.toLowerCase().replace(/[^a-z0-9]/g, '-');\n\n // Convert TypeBox arguments to JSON Schema format\n const convertedArguments = convertTypeBoxArgumentsToJsonSchema(moduleContent.arguments);\n\n // Extract and validate required fields from the module content\n const prompt: Prompt = {\n name: moduleContent.name || 'Untitled Prompt',\n slug: moduleContent.slug || defaultId,\n messages: moduleContent.messages || [],\n model: moduleContent.model,\n options: moduleContent.options,\n arguments: convertedArguments,\n id: moduleContent.id || defaultId,\n version: moduleContent.version || '1.0.0',\n // Optional fields from API response\n ...(moduleContent.promptId && { promptId: moduleContent.promptId }),\n ...(moduleContent.description && { description: moduleContent.description }),\n };\n\n // Validate required fields\n if (!prompt.name) {\n throw new Error('Prompt must have a name');\n }\n if (!prompt.slug) {\n throw new Error('Prompt must have a slug');\n }\n if (!Array.isArray(prompt.messages)) {\n throw new Error('Prompt messages must be an array');\n }\n\n if (!prompt.model) {\n throw new Error('Prompt must have a model');\n }\n\n return prompt;\n}\n\n/**\n * Transform JSON Schema to TypeBox/Template validator format\n */\nexport function transformJsonSchemaToTypeBox(schema: any): string {\n if (schema.type === 'string') {\n if (schema.enum && Array.isArray(schema.enum)) {\n // Handle enum as Union of Literals\n const literals = schema.enum.map((value: string) => `Type.Literal('${value}')`).join(', ');\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Union([${literals}]${options})`;\n } else {\n // Regular string\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.String(${options})`;\n }\n }\n\n if (schema.type === 'number' || schema.type === 'integer') {\n const typeMethod = schema.type === 'integer' ? 'Integer' : 'Number';\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.${typeMethod}(${options})`;\n }\n\n if (schema.type === 'boolean') {\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.Boolean(${options})`;\n }\n\n if (schema.type === 'array') {\n const itemsType = schema.items ? transformJsonSchemaToTypeBox(schema.items) : 'Type.String()';\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Array(${itemsType}${options})`;\n }\n\n if (schema.type === 'object') {\n if (schema.properties) {\n const props = Object.entries(schema.properties)\n .map(([key, value]: [string, any]) => {\n const isRequired = schema.required && schema.required.includes(key);\n const propType = transformJsonSchemaToTypeBox(value);\n return ` ${key}: ${isRequired ? propType : `Type.Optional(${propType})`}`;\n })\n .join(',\\n');\n\n const options = schema.description ? `, { description: '${schema.description}' }` : '';\n return `Type.Object({\\n${props}\\n }${options})`;\n } else {\n const options = schema.description ? `{ description: '${schema.description}' }` : '';\n return `Type.Object({}${options ? `, ${options}` : ''})`;\n }\n }\n\n // Fallback for unknown types\n return 'Type.String()';\n}\n\n/**\n * Generate TypeScript prompt file content from API response\n */\nexport function generatePromptFileFromApiResponse(apiResponse: any): string {\n const { prompt, version } = apiResponse;\n const { data, options } = version;\n\n // Transform arguments from JSON Schema to TypeBox format\n let argumentsCode = '{}';\n if (data.arguments && data.arguments.properties) {\n const argEntries = Object.entries(data.arguments.properties)\n .map(([key, schema]: [string, any]) => {\n const isRequired = data.arguments.required && data.arguments.required.includes(key);\n const typeCode = transformJsonSchemaToTypeBox(schema);\n return ` ${key}: ${isRequired ? typeCode : `Type.Optional(${typeCode})`}`;\n })\n .join(',\\n');\n\n if (argEntries) {\n argumentsCode = `{\\n${argEntries}\\n }`;\n }\n }\n\n // Generate the TypeScript file content\n return `import { Type } from 'axiom/ai';\n\nexport default {\n name: '${prompt.name}',\n slug: '${prompt.slug}',\n description: '${prompt.description || ''}',\n messages: [${data.messages\n .map(\n (msg: any) => `\n {\n role: '${msg.role}',\n content: '${msg.content.replace(/'/g, \"\\\\'\")}',\n }`,\n )\n .join(',')}\n ],\n model: '${data.model || 'gpt-4'}',\n options: {\n${\n options\n ? Object.entries(options)\n .map(([key, value]) => ` ${key}: ${value}`)\n .join(',\\n')\n : ''\n}\n },\n arguments: ${argumentsCode},\n version: '${version.version}',\n promptId: '${prompt.promptId}',\n};\n`;\n}\n","import { Command } from 'commander';\nimport { generatePromptFileFromApiResponse } from '../transpiler';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport const loadPullCommand = (program: Command) => {\n const pull = new Command('pull')\n .description('Pull a version of an object')\n .argument(\n '<slug>',\n 'The object to pull, could be a prompt, en eval, a monitor, a dashboard, etc.',\n )\n .option('--version <version>', 'The version to pull, default: latest', 'latest')\n .option('--output <path>', 'Output file path (optional, defaults to <slug>.prompt.ts)')\n .action(async (slug: string, options: { version: string; output?: string }) => {\n try {\n console.log(`Pulling prompt: ${slug} (version: ${options.version})`);\n\n const url = `${process.env.AXIOM_URL}/v1/prompts/${slug}`;\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,\n 'Content-Type': 'application/json',\n 'x-axiom-client': 'axiom-ai-cli',\n 'x-axiom-check': 'good',\n },\n });\n\n if (!response.ok) {\n try {\n const errorText = await response.clone().json();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(JSON.stringify(errorText, null, 2));\n process.exit(1);\n } catch (_error) {\n const errorText = await response.clone().text();\n console.error(`Failed to fetch prompt: ${response.status} ${response.statusText}`);\n console.error(errorText);\n process.exit(1);\n }\n }\n\n const apiResponse = await response.json();\n\n const tsContent = generatePromptFileFromApiResponse(apiResponse);\n\n const outputPath = options.output || `${slug}.prompt.ts`;\n const fullPath = path.resolve(outputPath);\n\n await fs.writeFile(fullPath, tsContent, 'utf-8');\n\n console.log(`Successfully generated prompt file: ${fullPath}`);\n console.log(`Prompt: ${apiResponse.prompt.name} (${apiResponse.prompt.slug})`);\n console.log(`Version: ${apiResponse.version.version}`);\n } catch (error) {\n console.error('Failed to pull prompt:', error);\n process.exit(1);\n }\n });\n\n program.addCommand(pull);\n};\n","import { Command } from 'commander';\nimport { runVitest } from '../evals/run-vitest';\n\nexport const loadRunCommand = (program: Command) => {\n return program.addCommand(\n new Command('run')\n .description('run evals locally')\n .argument('<path>', 'Path to an eval test file, should be in the form of name.eval.ts')\n .action(async (file: string) => {\n if (!process.env.AXIOM_URL || !process.env.AXIOM_TOKEN || !process.env.AXIOM_DATASET) {\n throw new Error('AXIOM_URL, AXIOM_TOKEN, and AXIOM_DATASET must be set');\n }\n await runVitest(file);\n }),\n );\n};\n","import { createVitest, registerConsoleShortcuts } from 'vitest/node';\nimport { AxiomReporter } from './reporter';\nimport { flush } from './instrument';\n\nexport const runVitest = async (file: string) => {\n const vi = await createVitest('test', {\n // root: process.cwd(),\n mode: 'test',\n include: [file ? file : '**/*.eval.ts'],\n reporters: ['verbose', new AxiomReporter()],\n environment: 'node',\n browser: undefined,\n });\n\n await vi.start();\n\n const dispose = registerConsoleShortcuts(vi, process.stdin, process.stdout);\n\n if (!vi.shouldKeepServer()) {\n dispose();\n await flush();\n await vi.close();\n process.exit(0);\n }\n\n await flush();\n};\n"],"mappings":"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","names":["Command","fs","resolve","program","Command","fs","path","program","Command","Command","program","Command","Command"]}
@@ -25,12 +25,12 @@ var processor = new BatchSpanProcessor(exporter, {
25
25
  var provider = new NodeTracerProvider({
26
26
  resource: resourceFromAttributes({
27
27
  ["service.name"]: "axiom-ai",
28
- ["service.version"]: "0.8.0"
28
+ ["service.version"]: "0.10.0"
29
29
  }),
30
30
  spanProcessors: [processor]
31
31
  });
32
32
  provider.register();
33
- var tracer = trace.getTracer("axiom-ai", "0.8.0");
33
+ var tracer = trace.getTracer("axiom-ai", "0.10.0");
34
34
  var flush = async () => {
35
35
  await provider.forceFlush();
36
36
  };
@@ -42,4 +42,4 @@ export {
42
42
  flush,
43
43
  startSpan
44
44
  };
45
- //# sourceMappingURL=chunk-Y2CPJRWO.js.map
45
+ //# sourceMappingURL=chunk-Z3F75MP5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/evals/instrument.ts"],"sourcesContent":["import { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { trace, type Context, type SpanOptions } from '@opentelemetry/api';\n\nconst collectorOptions = {\n url: process.env.AXIOM_URL\n ? `${process.env.AXIOM_URL}/v1/traces`\n : 'https://api.axiom.co/v1/traces', // Axiom API endpoint for trace data\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, // Replace API_TOKEN with your actual API token\n 'X-Axiom-Dataset': process.env.AXIOM_DATASET || '', // Replace DATASET_NAME with your dataset\n },\n concurrencyLimit: 10, // an optional limit on pending requests\n};\n\n// export const consoleExporter = new ConsoleSpanExporter()\nexport const exporter = new OTLPTraceExporter(collectorOptions);\n\nconst processor = new BatchSpanProcessor(exporter, {\n maxQueueSize: 2048,\n maxExportBatchSize: 512,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: 30000,\n});\n\nconst provider = new NodeTracerProvider({\n resource: resourceFromAttributes({\n ['service.name']: 'axiom-ai',\n ['service.version']: __SDK_VERSION__,\n }),\n spanProcessors: [processor],\n});\n\nprovider.register();\n\n// Create a shared tracer instance\nconst tracer = trace.getTracer('axiom-ai', __SDK_VERSION__);\n\nexport const flush = async () => {\n await provider.forceFlush();\n};\n\nexport const startSpan = (name: string, opts: SpanOptions, context?: Context) => {\n return tracer.startSpan(name, opts, context);\n};\n"],"mappings":";AAAA,SAAS,oBAAoB,0BAA0B;AACvD,SAAS,8BAA8B;AACvC,SAAS,yBAAyB;AAClC,SAAS,aAA6C;AAEtD,IAAM,mBAAmB;AAAA,EACvB,KAAK,QAAQ,IAAI,YACb,GAAG,QAAQ,IAAI,SAAS,eACxB;AAAA;AAAA,EACJ,SAAS;AAAA,IACP,eAAe,UAAU,QAAQ,IAAI,WAAW;AAAA;AAAA,IAChD,mBAAmB,QAAQ,IAAI,iBAAiB;AAAA;AAAA,EAClD;AAAA,EACA,kBAAkB;AAAA;AACpB;AAGO,IAAM,WAAW,IAAI,kBAAkB,gBAAgB;AAE9D,IAAM,YAAY,IAAI,mBAAmB,UAAU;AAAA,EACjD,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,qBAAqB;AACvB,CAAC;AAED,IAAM,WAAW,IAAI,mBAAmB;AAAA,EACtC,UAAU,uBAAuB;AAAA,IAC/B,CAAC,cAAc,GAAG;AAAA,IAClB,CAAC,iBAAiB,GAAG;AAAA,EACvB,CAAC;AAAA,EACD,gBAAgB,CAAC,SAAS;AAC5B,CAAC;AAED,SAAS,SAAS;AAGlB,IAAM,SAAS,MAAM,UAAU,YAAY,OAAe;AAEnD,IAAM,QAAQ,YAAY;AAC/B,QAAM,SAAS,WAAW;AAC5B;AAEO,IAAM,YAAY,CAAC,MAAc,MAAmB,YAAsB;AAC/E,SAAO,OAAO,UAAU,MAAM,MAAM,OAAO;AAC7C;","names":[]}
1
+ {"version":3,"sources":["../src/evals/instrument.ts"],"sourcesContent":["import { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { trace, type Context, type SpanOptions } from '@opentelemetry/api';\n\nconst collectorOptions = {\n url: process.env.AXIOM_URL\n ? `${process.env.AXIOM_URL}/v1/traces`\n : 'https://api.axiom.co/v1/traces', // Axiom API endpoint for trace data\n headers: {\n Authorization: `Bearer ${process.env.AXIOM_TOKEN}`, // Replace API_TOKEN with your actual API token\n 'X-Axiom-Dataset': process.env.AXIOM_DATASET || '', // Replace DATASET_NAME with your dataset\n },\n concurrencyLimit: 10, // an optional limit on pending requests\n};\n\n// export const consoleExporter = new ConsoleSpanExporter()\nexport const exporter = new OTLPTraceExporter(collectorOptions);\n\nconst processor = new BatchSpanProcessor(exporter, {\n maxQueueSize: 2048,\n maxExportBatchSize: 512,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: 30000,\n});\n\nconst provider = new NodeTracerProvider({\n resource: resourceFromAttributes({\n ['service.name']: 'axiom-ai',\n ['service.version']: __SDK_VERSION__,\n }),\n spanProcessors: [processor],\n});\n\nprovider.register();\n\n// Create a shared tracer instance\nconst tracer = trace.getTracer('axiom-ai', __SDK_VERSION__);\n\nexport const flush = async () => {\n await provider.forceFlush();\n};\n\nexport const startSpan = (name: string, opts: SpanOptions, context?: Context) => {\n return tracer.startSpan(name, opts, context);\n};\n"],"mappings":";AAAA,SAAS,oBAAoB,0BAA0B;AACvD,SAAS,8BAA8B;AACvC,SAAS,yBAAyB;AAClC,SAAS,aAA6C;AAEtD,IAAM,mBAAmB;AAAA,EACvB,KAAK,QAAQ,IAAI,YACb,GAAG,QAAQ,IAAI,SAAS,eACxB;AAAA;AAAA,EACJ,SAAS;AAAA,IACP,eAAe,UAAU,QAAQ,IAAI,WAAW;AAAA;AAAA,IAChD,mBAAmB,QAAQ,IAAI,iBAAiB;AAAA;AAAA,EAClD;AAAA,EACA,kBAAkB;AAAA;AACpB;AAGO,IAAM,WAAW,IAAI,kBAAkB,gBAAgB;AAE9D,IAAM,YAAY,IAAI,mBAAmB,UAAU;AAAA,EACjD,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,qBAAqB;AACvB,CAAC;AAED,IAAM,WAAW,IAAI,mBAAmB;AAAA,EACtC,UAAU,uBAAuB;AAAA,IAC/B,CAAC,cAAc,GAAG;AAAA,IAClB,CAAC,iBAAiB,GAAG;AAAA,EACvB,CAAC;AAAA,EACD,gBAAgB,CAAC,SAAS;AAC5B,CAAC;AAED,SAAS,SAAS;AAGlB,IAAM,SAAS,MAAM,UAAU,YAAY,QAAe;AAEnD,IAAM,QAAQ,YAAY;AAC/B,QAAM,SAAS,WAAW;AAC5B;AAEO,IAAM,YAAY,CAAC,MAAc,MAAmB,YAAsB;AAC/E,SAAO,OAAO,UAAU,MAAM,MAAM,OAAO;AAC7C;","names":[]}
package/dist/evals.cjs CHANGED
@@ -356,12 +356,12 @@ var processor = new import_sdk_trace_node.BatchSpanProcessor(exporter, {
356
356
  var provider = new import_sdk_trace_node.NodeTracerProvider({
357
357
  resource: (0, import_resources.resourceFromAttributes)({
358
358
  ["service.name"]: "axiom-ai",
359
- ["service.version"]: "0.8.0"
359
+ ["service.version"]: "0.10.0"
360
360
  }),
361
361
  spanProcessors: [processor]
362
362
  });
363
363
  provider.register();
364
- var tracer = import_api.trace.getTracer("axiom-ai", "0.8.0");
364
+ var tracer = import_api.trace.getTracer("axiom-ai", "0.10.0");
365
365
  var flush = async () => {
366
366
  await provider.forceFlush();
367
367
  };
@@ -381,30 +381,7 @@ async function registerEval(evalName, opts, vitestOpts = {}) {
381
381
  evalName,
382
382
  async () => {
383
383
  const dataset = await datasetPromise;
384
- let id = "";
385
- try {
386
- const resp = await fetch(`${process.env.AXIOM_URL}/api/v1/evaluations`, {
387
- method: "POST",
388
- headers: {
389
- "content-type": "application/json",
390
- authorization: `Bearer ${process.env.AXIOM_TOKEN}`,
391
- "x-axiom-check": "good"
392
- },
393
- body: JSON.stringify({
394
- name: evalName,
395
- type: "regression",
396
- version: "1.0.0"
397
- })
398
- });
399
- const body = await resp.json();
400
- if (resp.status >= 400) {
401
- console.error(body);
402
- return;
403
- }
404
- id = body.data.id;
405
- } catch (err) {
406
- console.error({ error: err });
407
- }
384
+ let id = crypto.randomUUID();
408
385
  const suiteSpan = startSpan(`eval ${evalName}`, {
409
386
  attributes: {
410
387
  [Attr.GenAI.Operation.Name]: "eval",
@@ -430,22 +407,6 @@ async function registerEval(evalName, opts, vitestOpts = {}) {
430
407
  });
431
408
  const suiteContext = import_api2.trace.setSpan(import_api2.context.active(), suiteSpan);
432
409
  (0, import_vitest.afterAll)(async () => {
433
- try {
434
- await fetch(`${process.env.AXIOM_URL}/api/v1/evaluations/${id}`, {
435
- method: "PATCH",
436
- headers: {
437
- "Content-Type": "application/json",
438
- Authorization: `Bearer ${process.env.AXIOM_TOKEN}`,
439
- "x-axiom-check": "good"
440
- },
441
- body: JSON.stringify({
442
- status: "completed",
443
- statusMessage: "-"
444
- })
445
- });
446
- } catch (err) {
447
- console.error(err);
448
- }
449
410
  suiteSpan.setStatus({ code: import_api2.SpanStatusCode.OK });
450
411
  suiteSpan.end();
451
412
  await flush();