@ax-llm/ax 11.0.29 → 11.0.31

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../ai/base.ts","../trace/trace.ts","../util/apicall.ts","../util/sse.ts","../util/stream.ts","../util/transform.ts","../util/log.ts","../ai/debug.ts","../ai/google-vertex/auth.ts","../ai/anthropic/types.ts","../ai/anthropic/info.ts","../ai/anthropic/api.ts","../ai/openai/types.ts","../ai/openai/info.ts","../ai/openai/api.ts","../ai/azure-openai/api.ts","../ai/cohere/types.ts","../ai/cohere/info.ts","../ai/cohere/api.ts","../ai/deepseek/types.ts","../ai/deepseek/info.ts","../ai/deepseek/api.ts","../ai/google-gemini/types.ts","../ai/google-gemini/info.ts","../ai/google-gemini/api.ts","../util/rate-limit.ts","../ai/groq/types.ts","../ai/groq/info.ts","../ai/groq/api.ts","../ai/huggingface/info.ts","../ai/huggingface/types.ts","../ai/huggingface/api.ts","../ai/mistral/types.ts","../ai/mistral/info.ts","../ai/mistral/api.ts","../ai/ollama/api.ts","../ai/reka/types.ts","../ai/reka/info.ts","../ai/reka/api.ts","../ai/together/info.ts","../ai/together/api.ts","../ai/wrap.ts","../dsp/generate.ts","../ai/util.ts","../mem/memory.ts","../dsp/asserts.ts","../dsp/datetime.ts","../dsp/registry.ts","../dsp/sig.ts","../dsp/parser.ts","../dsp/util.ts","../dsp/program.ts","../dsp/prompt.ts","../dsp/validate.ts","../dsp/extract.ts","../dsp/fieldProcessor.ts","../dsp/jsonschema.ts","../dsp/functions.ts","../prompts/agent.ts","../docs/tika.ts","../ai/balance.ts","../dsp/optimize.ts","../db/base.ts","../db/cloudflare.ts","../db/memory.ts","../db/pinecone.ts","../db/weaviate.ts","../db/wrap.ts","../docs/manager.ts","../funcs/docker.ts","../dsp/loader.ts","../funcs/code.ts","../dsp/mipro.ts","../ai/mock/api.ts","../dsp/router.ts","../dsp/evaluate.ts","../prompts/cot.ts","../docs/rewriter.ts","../dsp/strutil.ts","../docs/reranker.ts","../funcs/embed.ts","../dsp/stopwords.ts","../dsp/eval.ts","../../../node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/uuid/dist/esm-node/native.js","../../../node_modules/uuid/dist/esm-node/v4.js","../mcp/client.ts","../mcp/httpTransport.ts","../mcp/stdioTransport.ts","../ai/multiservice.ts","../prompts/rag.ts"],"sourcesContent":["import type { ReadableStream } from 'stream/web'\n\nimport { type Span, SpanKind } from '@opentelemetry/api'\n\nimport { axSpanAttributes } from '../trace/trace.js'\nimport { apiCall } from '../util/apicall.js'\nimport { RespTransformStream } from '../util/transform.js'\n\nimport { logChatRequest, logResponse } from './debug.js'\nimport type {\n AxAIInputModelList,\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceImpl,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n AxModelConfig,\n AxModelInfo,\n AxTokenUsage,\n} from './types.js'\n\nexport interface AxAIFeatures {\n functions: boolean\n streaming: boolean\n functionCot?: boolean\n}\n\nexport interface AxBaseAIArgs<TModel, TEmbedModel> {\n name: string\n apiURL: string\n headers: () => Promise<Record<string, string>>\n modelInfo: Readonly<AxModelInfo[]>\n defaults: Readonly<{ model: TModel; embedModel?: TEmbedModel }>\n options?: Readonly<AxAIServiceOptions>\n supportFor: AxAIFeatures | ((model: TModel) => AxAIFeatures)\n models?: AxAIInputModelList<TModel>\n}\n\nexport const axBaseAIDefaultConfig = (): AxModelConfig =>\n structuredClone({\n maxTokens: 2000,\n temperature: 0,\n topK: 40,\n topP: 0.9,\n })\n\nexport const axBaseAIDefaultCreativeConfig = (): AxModelConfig =>\n structuredClone({\n maxTokens: 2000,\n temperature: 0.4,\n topP: 0.7,\n frequencyPenalty: 0.2,\n })\n\nexport class AxBaseAI<\n TModel,\n TEmbedModel,\n TChatRequest,\n TEmbedRequest,\n TChatResponse,\n TChatResponseDelta,\n TEmbedResponse,\n> implements AxAIService<TModel, TEmbedModel>\n{\n private debug = false\n\n private rt?: AxAIServiceOptions['rateLimiter']\n private fetch?: AxAIServiceOptions['fetch']\n private tracer?: AxAIServiceOptions['tracer']\n private models?: (AxAIModelList[number] & {\n model: TModel\n isInternal?: boolean\n })[]\n\n private modelInfo: readonly AxModelInfo[]\n private modelUsage?: AxTokenUsage\n private embedModelUsage?: AxTokenUsage\n private defaults: AxBaseAIArgs<TModel, TEmbedModel>['defaults']\n\n protected apiURL: string\n protected name: string\n protected id: string\n protected headers: () => Promise<Record<string, string>>\n protected supportFor: AxAIFeatures | ((model: TModel) => AxAIFeatures)\n\n // Add private metrics tracking properties\n private metrics: AxAIServiceMetrics = {\n latency: {\n chat: {\n mean: 0,\n p95: 0,\n p99: 0,\n samples: [],\n },\n embed: {\n mean: 0,\n p95: 0,\n p99: 0,\n samples: [],\n },\n },\n errors: {\n chat: {\n count: 0,\n rate: 0,\n total: 0,\n },\n embed: {\n count: 0,\n rate: 0,\n total: 0,\n },\n },\n }\n\n constructor(\n private readonly aiImpl: Readonly<\n AxAIServiceImpl<\n TModel,\n TEmbedModel,\n TChatRequest,\n TEmbedRequest,\n TChatResponse,\n TChatResponseDelta,\n TEmbedResponse\n >\n >,\n {\n name,\n apiURL,\n headers,\n modelInfo,\n defaults,\n options = {},\n supportFor,\n models,\n }: Readonly<AxBaseAIArgs<TModel, TEmbedModel>>\n ) {\n this.name = name\n this.apiURL = apiURL\n this.headers = headers\n this.supportFor = supportFor\n this.tracer = options.tracer\n this.modelInfo = modelInfo\n this.models = models\n this.id = crypto.randomUUID()\n\n const model =\n this.models?.find((v) => v.key === defaults.model)?.model ??\n defaults.model\n\n const embedModel = defaults.embedModel\n\n this.defaults = { model, embedModel }\n\n if (\n !defaults.model ||\n typeof defaults.model !== 'string' ||\n defaults.model === ''\n ) {\n throw new Error('No model defined')\n }\n\n this.setOptions(options)\n\n if (models) {\n validateModels(models)\n }\n }\n\n public setName(name: string): void {\n this.name = name\n }\n\n public getId(): string {\n return this.id\n }\n\n public setAPIURL(apiURL: string): void {\n this.apiURL = apiURL\n }\n\n public setHeaders(headers: () => Promise<Record<string, string>>): void {\n this.headers = headers\n }\n\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n if (options.debug) {\n this.debug = options.debug\n }\n\n if (options.rateLimiter) {\n this.rt = options.rateLimiter\n }\n\n if (options.fetch) {\n this.fetch = options.fetch\n }\n\n if (options.tracer) {\n this.tracer = options.tracer\n }\n }\n\n getOptions(): Readonly<AxAIServiceOptions> {\n return {\n debug: this.debug,\n rateLimiter: this.rt,\n fetch: this.fetch,\n tracer: this.tracer,\n }\n }\n\n getModelList(): AxAIModelList | undefined {\n return this.models\n ?.filter((model) => !model.isInternal)\n ?.map((model) => ({\n key: model.key,\n description: model.description,\n model: model.model as string,\n }))\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n return {\n model: this.defaults.model as string,\n embedModel: this.defaults.embedModel as string | undefined,\n }\n }\n\n getName(): string {\n return this.name\n }\n\n getFeatures(model?: TModel): AxAIFeatures {\n return typeof this.supportFor === 'function'\n ? this.supportFor(model ?? this.defaults.model)\n : this.supportFor\n }\n\n // Method to calculate percentiles\n private calculatePercentile(\n samples: readonly number[],\n percentile: number\n ): number {\n if (samples.length === 0) return 0\n const sorted = [...samples].sort((a, b) => a - b)\n const index = Math.ceil((percentile / 100) * sorted.length) - 1\n return sorted[index] ?? 0\n }\n\n // Method to update latency metrics\n private updateLatencyMetrics(type: 'chat' | 'embed', duration: number): void {\n const metrics = this.metrics.latency[type]\n metrics.samples.push(duration)\n\n // Keep only last 1000 samples to prevent memory issues\n if (metrics.samples.length > 1000) {\n metrics.samples.shift()\n }\n\n // Update statistics\n metrics.mean =\n metrics.samples.reduce((a, b) => a + b, 0) / metrics.samples.length\n metrics.p95 = this.calculatePercentile(metrics.samples, 95)\n metrics.p99 = this.calculatePercentile(metrics.samples, 99)\n }\n\n // Method to update error metrics\n private updateErrorMetrics(type: 'chat' | 'embed', isError: boolean): void {\n const metrics = this.metrics.errors[type]\n metrics.total++\n if (isError) {\n metrics.count++\n }\n metrics.rate = metrics.count / metrics.total\n }\n\n // Public method to get metrics\n public getMetrics(): AxAIServiceMetrics {\n return structuredClone(this.metrics)\n }\n\n async chat(\n req: Readonly<AxChatRequest<TModel>>,\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<TModel, TEmbedModel>\n >\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n const startTime = performance.now()\n let isError = false\n\n try {\n const result = await this._chat1(req, options)\n return result\n } catch (error) {\n isError = true\n throw error\n } finally {\n const duration = performance.now() - startTime\n this.updateLatencyMetrics('chat', duration)\n this.updateErrorMetrics('chat', isError)\n }\n }\n\n private async _chat1(\n req: Readonly<AxChatRequest<TModel>>,\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<TModel, TEmbedModel>\n >\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n const model = req.model\n ? (this.models?.find((v) => v.key === req.model)?.model ?? req.model)\n : this.defaults.model\n\n const modelConfig = {\n ...this.aiImpl.getModelConfig(),\n ...req.modelConfig,\n }\n\n // stream is true by default unless explicitly set to false\n modelConfig.stream =\n (options?.stream !== undefined ? options.stream : modelConfig.stream) ??\n true\n\n const canStream = this.getFeatures(model).streaming\n if (!canStream) {\n modelConfig.stream = false\n }\n\n if (this.tracer) {\n return await this.tracer?.startActiveSpan(\n 'Chat Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.LLM_SYSTEM]: this.name,\n [axSpanAttributes.LLM_REQUEST_MODEL]: model as string,\n [axSpanAttributes.LLM_REQUEST_MAX_TOKENS]: modelConfig.maxTokens,\n [axSpanAttributes.LLM_REQUEST_TEMPERATURE]: modelConfig.temperature,\n [axSpanAttributes.LLM_REQUEST_TOP_P]: modelConfig.topP,\n [axSpanAttributes.LLM_REQUEST_TOP_K]: modelConfig.topK,\n [axSpanAttributes.LLM_REQUEST_FREQUENCY_PENALTY]:\n modelConfig.frequencyPenalty,\n [axSpanAttributes.LLM_REQUEST_PRESENCE_PENALTY]:\n modelConfig.presencePenalty,\n [axSpanAttributes.LLM_REQUEST_STOP_SEQUENCES]:\n modelConfig.stopSequences?.join(', '),\n [axSpanAttributes.LLM_REQUEST_LLM_IS_STREAMING]: modelConfig.stream,\n // [AxSpanAttributes.LLM_PROMPTS]: _req.chatPrompt\n // ?.map((v) => v.content)\n // .join('\\n')\n },\n },\n async (span) => {\n try {\n return await this._chat2(model, modelConfig, req, options, span)\n } finally {\n span.end()\n }\n }\n )\n }\n return await this._chat2(model, modelConfig, req, options)\n }\n\n private cleanupFunctionSchema(\n fn: Readonly<NonNullable<AxChatRequest['functions']>[number]>\n ): NonNullable<AxChatRequest['functions']>[number] {\n const cleanFn = { ...fn }\n if (cleanFn.parameters) {\n const cleanParams = { ...cleanFn.parameters }\n\n // Remove empty required array\n if (\n Array.isArray(cleanParams.required) &&\n cleanParams.required.length === 0\n ) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete cleanParams.required\n }\n\n // Remove empty properties object\n if (\n cleanParams.properties &&\n Object.keys(cleanParams.properties).length === 0\n ) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete cleanParams.properties\n }\n\n // After cleaning, remove the entire parameters object if it's effectively empty\n // i.e., either no keys left or just { type: 'object' } remaining.\n if (\n Object.keys(cleanParams).length === 0 ||\n (Object.keys(cleanParams).length === 1 && cleanParams.type === 'object')\n ) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete cleanFn.parameters\n } else {\n cleanFn.parameters = cleanParams\n }\n }\n return cleanFn\n }\n\n private async _chat2(\n model: TModel,\n modelConfig: Readonly<AxModelConfig>,\n chatReq: Readonly<Omit<AxChatRequest<TModel>, 'modelConfig'>>,\n options?: Readonly<AxAIServiceActionOptions<TModel, TEmbedModel>>,\n span?: Span\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n if (!this.aiImpl.createChatReq) {\n throw new Error('generateChatReq not implemented')\n }\n\n let functions: NonNullable<AxChatRequest['functions']> | undefined\n\n if (chatReq.functions && chatReq.functions.length > 0) {\n functions = chatReq.functions.map((fn) => this.cleanupFunctionSchema(fn))\n }\n\n const req = {\n ...chatReq,\n model,\n functions,\n modelConfig,\n }\n\n const fn = async () => {\n const [apiConfig, reqValue] = this.aiImpl.createChatReq(\n req,\n options as AxAIPromptConfig\n )\n\n const res = await apiCall(\n {\n name: apiConfig.name,\n url: this.apiURL,\n headers: await this.buildHeaders(apiConfig.headers),\n stream: modelConfig.stream,\n debug: this.debug,\n fetch: this.fetch,\n span,\n },\n reqValue\n )\n return res\n }\n\n if (options?.debug ?? this.debug) {\n logChatRequest(req.chatPrompt)\n }\n\n const rt = options?.rateLimiter ?? this.rt\n const rv = rt ? await rt(fn, { modelUsage: this.modelUsage }) : await fn()\n\n if (modelConfig.stream) {\n if (!this.aiImpl.createChatStreamResp) {\n throw new Error('generateChatResp not implemented')\n }\n\n const respFn = this.aiImpl.createChatStreamResp\n const wrappedRespFn =\n (state: object) => (resp: Readonly<TChatResponseDelta>) => {\n const res = respFn(resp, state)\n res.sessionId = options?.sessionId\n\n if (res.modelUsage) {\n this.modelUsage = res.modelUsage\n }\n\n if (span?.isRecording()) {\n setResponseAttr(res, span)\n }\n\n if (options?.debug ?? this.debug) {\n logResponse(res)\n }\n return res\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const doneCb = async (_values: readonly AxChatResponse[]) => {\n if (options?.debug ?? this.debug) {\n process.stdout.write('\\n')\n }\n }\n\n const st = (rv as ReadableStream<TChatResponseDelta>).pipeThrough(\n new RespTransformStream<TChatResponseDelta, AxChatResponse>(\n wrappedRespFn({}),\n doneCb\n )\n )\n return st\n }\n\n if (!this.aiImpl.createChatResp) {\n throw new Error('generateChatResp not implemented')\n }\n const res = this.aiImpl.createChatResp(rv as TChatResponse)\n res.sessionId = options?.sessionId\n\n if (res.modelUsage) {\n this.modelUsage = res.modelUsage\n }\n\n if (span?.isRecording()) {\n setResponseAttr(res, span)\n }\n\n if (options?.debug ?? this.debug) {\n logResponse(res)\n }\n\n span?.end()\n return res\n }\n\n async embed(\n req: Readonly<AxEmbedRequest<TEmbedModel>>,\n options?: Readonly<AxAIServiceActionOptions<TModel, TEmbedModel>>\n ): Promise<AxEmbedResponse> {\n const startTime = performance.now()\n let isError = false\n\n try {\n return this._embed1(req, options)\n } catch (error) {\n isError = true\n throw error\n } finally {\n const duration = performance.now() - startTime\n this.updateLatencyMetrics('embed', duration)\n this.updateErrorMetrics('embed', isError)\n }\n }\n\n private async _embed1(\n req: Readonly<AxEmbedRequest<TEmbedModel>>,\n options?: Readonly<AxAIServiceActionOptions<TModel, TEmbedModel>>\n ): Promise<AxEmbedResponse> {\n const embedModel = req.embedModel ?? this.defaults.embedModel\n\n if (!embedModel) {\n throw new Error('No embed model defined')\n }\n\n if (this.tracer) {\n await this.tracer?.startActiveSpan(\n 'Embed Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.LLM_SYSTEM]: this.name,\n [axSpanAttributes.LLM_REQUEST_MODEL]: embedModel as string,\n },\n },\n async (span) => {\n try {\n return await this._embed2(embedModel, req, options, span)\n } finally {\n span.end()\n }\n }\n )\n }\n return this._embed2(embedModel, req, options)\n }\n\n private async _embed2(\n embedModel: TEmbedModel,\n embedReq: Readonly<AxEmbedRequest<TEmbedModel>>,\n options?: Readonly<AxAIServiceActionOptions<TModel, TEmbedModel>>,\n span?: Span\n ): Promise<AxEmbedResponse> {\n if (!this.aiImpl.createEmbedReq) {\n throw new Error('generateEmbedReq not implemented')\n }\n if (!this.aiImpl.createEmbedResp) {\n throw new Error('generateEmbedResp not implemented')\n }\n\n const req = {\n ...embedReq,\n embedModel,\n }\n\n const fn = async () => {\n const [apiConfig, reqValue] = this.aiImpl.createEmbedReq!(req)\n\n const res = await apiCall(\n {\n name: apiConfig.name,\n url: this.apiURL,\n headers: await this.buildHeaders(apiConfig.headers),\n debug: this.debug,\n fetch: this.fetch,\n span,\n },\n reqValue\n )\n\n return res\n }\n\n const resValue = this.rt\n ? await this.rt(fn, { embedModelUsage: this.embedModelUsage })\n : await fn()\n const res = this.aiImpl.createEmbedResp!(resValue as TEmbedResponse)\n\n res.sessionId = options?.sessionId\n\n if (span?.isRecording()) {\n if (res.modelUsage) {\n this.embedModelUsage = res.modelUsage\n span.setAttributes({\n [axSpanAttributes.LLM_USAGE_COMPLETION_TOKENS]:\n res.modelUsage.completionTokens ?? 0,\n [axSpanAttributes.LLM_USAGE_PROMPT_TOKENS]:\n res.modelUsage.promptTokens,\n })\n }\n }\n\n span?.end()\n return res\n }\n\n private async buildHeaders(\n headers: Record<string, string> = {}\n ): Promise<Record<string, string>> {\n return { ...headers, ...(await this.headers()) }\n }\n}\n\nfunction setResponseAttr(res: Readonly<AxChatResponse>, span: Span) {\n if (res.modelUsage) {\n span.setAttributes({\n [axSpanAttributes.LLM_USAGE_COMPLETION_TOKENS]:\n res.modelUsage.completionTokens ?? 0,\n [axSpanAttributes.LLM_USAGE_PROMPT_TOKENS]: res.modelUsage.promptTokens,\n })\n }\n}\n\nfunction validateModels<TModel>(\n models: Readonly<AxAIInputModelList<TModel>>\n): void {\n // Validate duplicate keys in models.\n const keys = new Set<string>()\n for (const model of models) {\n if (keys.has(model.key)) {\n throw new Error(\n `Duplicate model key detected: \"${model.key}\". Each model key must be unique.`\n )\n }\n keys.add(model.key)\n }\n}\n","export const axSpanAttributes = {\n // LLM\n LLM_SYSTEM: 'gen_ai.system',\n LLM_REQUEST_MODEL: 'gen_ai.request.model',\n LLM_REQUEST_MAX_TOKENS: 'gen_ai.request.max_tokens',\n LLM_REQUEST_TEMPERATURE: 'gen_ai.request.temperature',\n LLM_REQUEST_TOP_K: 'gen_ai.request.top_k',\n LLM_REQUEST_FREQUENCY_PENALTY: 'gen_ai.request.frequency_penalty',\n LLM_REQUEST_PRESENCE_PENALTY: 'gen_ai.request.presence_penalty',\n LLM_REQUEST_STOP_SEQUENCES: 'gen_ai.request.stop_sequences',\n LLM_REQUEST_LLM_IS_STREAMING: 'gen_ai.request.llm_is_streaming',\n LLM_REQUEST_TOP_P: 'gen_ai.request.top_p',\n\n LLM_USAGE_PROMPT_TOKENS: 'gen_ai.usage.prompt_tokens',\n LLM_USAGE_COMPLETION_TOKENS: 'gen_ai.usage.completion_tokens',\n\n // Vector DB\n DB_SYSTEM: 'db.system',\n DB_TABLE: 'db.table',\n DB_NAMESPACE: 'db.namespace',\n DB_ID: 'db.id',\n DB_QUERY_TEXT: 'db.query.text',\n DB_VECTOR: 'db.vector',\n DB_OPERATION_NAME: 'db.operation.name',\n DB_VECTOR_QUERY_TOP_K: 'db.vector.query.top_k',\n\n DB_QUERY_EMBEDDINGS: 'db.query.embeddings',\n DB_QUERY_RESULT: 'db.query.result',\n\n // Query Embeddings\n DB_QUERY_EMBEDDINGS_VECTOR: 'db.query.embeddings.vector',\n\n // Query Result (canonical format)\n DB_QUERY_RESULT_ID: 'db.query.result.id',\n DB_QUERY_RESULT_SCORE: 'db.query.result.score',\n DB_QUERY_RESULT_DISTANCE: 'db.query.result.distance',\n DB_QUERY_RESULT_METADATA: 'db.query.result.metadata',\n DB_QUERY_RESULT_VECTOR: 'db.query.result.vector',\n DB_QUERY_RESULT_DOCUMENT: 'db.query.result.document',\n}\n\nexport const axSpanEvents = {\n LLM_PROMPT: 'gen_ai.prompt',\n}\n\nexport enum AxLLMRequestTypeValues {\n COMPLETION = 'completion',\n CHAT = 'chat',\n RERANK = 'rerank',\n UNKNOWN = 'unknown',\n}\n\nexport enum AxSpanKindValues {\n WORKFLOW = 'workflow',\n TASK = 'task',\n AGENT = 'agent',\n TOOL = 'tool',\n UNKNOWN = 'unknown',\n}\n","import {\n ReadableStream,\n TextDecoderStream as TextDecoderStreamNative,\n TransformStream,\n} from 'stream/web'\n\nimport { type Span } from '@opentelemetry/api'\n\nimport { SSEParser } from './sse.js'\nimport { TextDecoderStreamPolyfill } from './stream.js'\n\n// Configuration Types\nexport interface RetryConfig {\n maxRetries: number\n initialDelayMs: number\n maxDelayMs: number\n backoffFactor: number\n retryableStatusCodes: number[]\n}\n\nexport interface RequestMetrics {\n startTime: number\n retryCount: number\n lastRetryTime?: number\n streamChunks?: number\n lastChunkTime?: number\n streamDuration?: number\n errorTime?: number\n}\n\n// Validation Interfaces\ninterface RequestValidation {\n validateRequest?: (request: unknown) => boolean | Promise<boolean>\n}\n\ninterface ResponseValidation {\n validateResponse?: (response: unknown) => boolean | Promise<boolean>\n}\n\n// API Base Types\nexport interface AxAPI {\n name?: string\n headers?: Record<string, string>\n put?: boolean\n}\n\n// Enhanced API Configuration\nexport interface AxAPIConfig\n extends AxAPI,\n RequestValidation,\n ResponseValidation {\n url: string | URL\n stream?: boolean\n debug?: boolean\n fetch?: typeof fetch\n span?: Span\n timeout?: number\n retry?: Partial<RetryConfig>\n}\n\n// Default Configurations\nexport const defaultRetryConfig: RetryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 60000,\n backoffFactor: 2,\n retryableStatusCodes: [500, 408, 429, 502, 503, 504],\n}\n\nconst defaultTimeoutMs = 30000\nconst textDecoderStream = TextDecoderStreamNative ?? TextDecoderStreamPolyfill\n\n// Error Classes\nexport class AxAIServiceError extends Error {\n public readonly timestamp: string\n public readonly errorId: string\n public readonly context: Record<string, unknown>\n\n constructor(\n message: string,\n public readonly url: string,\n public readonly requestBody?: unknown,\n context: Record<string, unknown> = {}\n ) {\n super(message)\n this.name = this.constructor.name\n this.timestamp = new Date().toISOString()\n this.errorId = crypto.randomUUID()\n this.context = context\n\n this.stack = this.toString()\n }\n\n override toString(): string {\n return [\n `${this.name}: ${this.message}`,\n `URL: ${this.url}`,\n `Request Body: ${JSON.stringify(this.requestBody, null, 2)}`,\n `Context: ${JSON.stringify(this.context, null, 2)}`,\n `Timestamp: ${this.timestamp}`,\n `Error ID: ${this.errorId}`,\n ].join('\\n')\n }\n\n // For Node.js, override the custom inspect method so console.log shows our custom string.\n [Symbol.for('nodejs.util.inspect.custom')](\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _depth: number,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options: Record<string, unknown>\n ) {\n return this.toString()\n }\n}\n\nexport class AxAIServiceStatusError extends AxAIServiceError {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n url: string,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super(`HTTP ${status} - ${statusText}`, url, requestBody, {\n httpStatus: status,\n httpStatusText: statusText,\n ...context,\n })\n this.name = this.constructor.name\n }\n}\n\nexport class AxAIServiceNetworkError extends AxAIServiceError {\n constructor(\n public readonly originalError: Error,\n url: string,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super(`Network Error: ${originalError.message}`, url, requestBody, {\n originalErrorName: originalError.name,\n originalErrorStack: originalError.stack,\n ...context,\n })\n this.name = this.constructor.name\n this.stack = originalError.stack\n }\n}\n\nexport class AxAIServiceResponseError extends AxAIServiceError {\n constructor(\n message: string,\n url: string,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super(message, url, requestBody, context)\n this.name = this.constructor.name\n }\n}\n\nexport class AxAIServiceStreamTerminatedError extends AxAIServiceError {\n constructor(\n url: string,\n requestBody?: unknown,\n public readonly lastChunk?: unknown,\n context?: Record<string, unknown>\n ) {\n super('Stream terminated unexpectedly by remote host', url, requestBody, {\n lastChunk,\n ...context,\n })\n this.name = this.constructor.name\n }\n}\n\nexport class AxAIServiceTimeoutError extends AxAIServiceError {\n constructor(\n url: string,\n timeoutMs: number,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super(`Request timeout after ${timeoutMs}ms`, url, requestBody, {\n timeoutMs,\n ...context,\n })\n this.name = this.constructor.name\n }\n}\n\nexport class AxAIServiceAuthenticationError extends AxAIServiceError {\n constructor(\n url: string,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super('Authentication failed', url, requestBody, context)\n this.name = this.constructor.name\n }\n}\n\n// Utility Functions\nfunction calculateRetryDelay(\n attempt: number,\n config: Readonly<RetryConfig>\n): number {\n const delay = Math.min(\n config.maxDelayMs,\n config.initialDelayMs * Math.pow(config.backoffFactor, attempt)\n )\n return delay * (0.75 + Math.random() * 0.5)\n}\n\nfunction createRequestMetrics(): RequestMetrics {\n return {\n startTime: Date.now(),\n retryCount: 0,\n }\n}\n\n// eslint-disable-next-line functional/prefer-immutable-types\nfunction updateRetryMetrics(metrics: RequestMetrics): void {\n metrics.retryCount++\n metrics.lastRetryTime = Date.now()\n}\n\nfunction shouldRetry(\n error: Error,\n status: number | undefined,\n attempt: number,\n config: Readonly<RetryConfig>\n): boolean {\n if (attempt >= config.maxRetries) return false\n if (status && config.retryableStatusCodes.includes(status)) return true\n\n return (\n error instanceof AxAIServiceNetworkError &&\n !(error instanceof AxAIServiceAuthenticationError)\n )\n}\n\n// Enhanced API Call Function\nexport const apiCall = async <TRequest = unknown, TResponse = unknown>(\n api: Readonly<AxAPIConfig>,\n json: TRequest\n): Promise<TResponse | ReadableStream<TResponse>> => {\n const retryConfig: RetryConfig = { ...defaultRetryConfig, ...api.retry }\n const timeoutMs = api.timeout ?? defaultTimeoutMs\n const metrics = createRequestMetrics()\n let timeoutId: NodeJS.Timeout\n\n const baseUrl = new URL(process.env['PROXY'] ?? api.url)\n const apiPath = `${[baseUrl.pathname, api.name]\n .filter(Boolean)\n .join('/')\n .replace(/\\/+/g, '/')}${baseUrl.search}`\n const apiUrl = new URL(apiPath, baseUrl)\n\n const requestId = crypto.randomUUID()\n\n // Validate request if validator is provided\n if (api.validateRequest) {\n const isValid = await api.validateRequest(json)\n if (!isValid) {\n throw new AxAIServiceResponseError(\n 'Invalid request data',\n apiUrl.href,\n json,\n { validation: 'request' }\n )\n }\n }\n\n // Set up telemetry\n if (api.span?.isRecording()) {\n api.span.setAttributes({\n 'http.request.method': api.put ? 'PUT' : 'POST',\n 'url.full': apiUrl.href,\n 'request.id': requestId,\n 'request.startTime': metrics.startTime,\n })\n }\n\n let attempt = 0\n\n while (true) {\n const controller = new AbortController()\n\n timeoutId = setTimeout(() => {\n controller.abort('Request timeout')\n }, timeoutMs)\n\n try {\n // Set up timeout with proper cleanup\n\n const res = await (api.fetch ?? fetch)(apiUrl, {\n method: api.put ? 'PUT' : 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-ID': requestId,\n 'X-Retry-Count': attempt.toString(),\n ...api.headers,\n },\n body: JSON.stringify(json),\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Handle authentication errors\n if (res.status === 401 || res.status === 403) {\n throw new AxAIServiceAuthenticationError(apiUrl.href, json, { metrics })\n }\n\n // Handle retryable status codes\n if (\n res.status >= 400 &&\n shouldRetry(new Error(), res.status, attempt, retryConfig)\n ) {\n const delay = calculateRetryDelay(attempt, retryConfig)\n attempt++\n updateRetryMetrics(metrics)\n\n if (api.span?.isRecording()) {\n api.span.addEvent('retry', {\n attempt,\n delay,\n status: res.status,\n 'metrics.startTime': metrics.startTime,\n 'metrics.retryCount': metrics.retryCount,\n 'metrics.lastRetryTime': metrics.lastRetryTime,\n })\n }\n\n await new Promise((resolve) => setTimeout(resolve, delay))\n continue\n }\n\n if (res.status >= 400) {\n throw new AxAIServiceStatusError(\n res.status,\n res.statusText,\n apiUrl.href,\n json,\n { metrics }\n )\n }\n\n // Handle non-streaming response\n if (!api.stream) {\n const resJson = await res.json()\n\n // Validate response if validator is provided\n if (api.validateResponse) {\n const isValid = await api.validateResponse(resJson)\n if (!isValid) {\n throw new AxAIServiceResponseError(\n 'Invalid response data',\n apiUrl.href,\n json,\n { validation: 'response' }\n )\n }\n }\n\n if (api.span?.isRecording()) {\n api.span.setAttributes({\n 'response.time': Date.now() - metrics.startTime,\n 'response.retries': metrics.retryCount,\n })\n }\n\n return resJson as TResponse\n }\n\n // Handle streaming response\n if (!res.body) {\n throw new AxAIServiceResponseError(\n 'Response body is null',\n apiUrl.href,\n json,\n { metrics }\n )\n }\n\n let lastChunk: TResponse | undefined\n let chunkCount = 0\n\n // Enhanced tracking stream\n const trackingStream = new TransformStream<TResponse, TResponse>({\n transform(chunk, controller) {\n lastChunk = chunk\n chunkCount++\n metrics.streamChunks = chunkCount\n metrics.lastChunkTime = Date.now()\n controller.enqueue(chunk)\n },\n flush() {\n if (api.span?.isRecording()) {\n api.span.setAttributes({\n 'stream.chunks': chunkCount,\n 'stream.duration': Date.now() - metrics.startTime,\n 'response.retries': metrics.retryCount,\n })\n }\n },\n })\n\n // Flag to track if the controller is closed.\n let closed = false\n\n // Enhanced wrapped stream\n return new ReadableStream<TResponse>({\n start(controller) {\n const reader = res\n .body!.pipeThrough(new textDecoderStream())\n .pipeThrough(new SSEParser<TResponse>())\n .pipeThrough(trackingStream)\n .getReader()\n\n async function read() {\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n if (!closed) {\n closed = true\n controller.close()\n }\n break\n }\n\n // Check if the controller is already closed before enqueuing.\n if (closed) break\n controller.enqueue(value)\n }\n } catch (e) {\n const error = e as Error\n const streamMetrics = {\n ...metrics,\n streamDuration: Date.now() - metrics.startTime,\n }\n\n if (\n error.name === 'AbortError' ||\n error.message?.includes('aborted')\n ) {\n controller.error(\n new AxAIServiceStreamTerminatedError(\n apiUrl.href,\n json,\n lastChunk,\n { streamMetrics }\n )\n )\n } else if (\n error instanceof TypeError &&\n error.message.includes('cancelled')\n ) {\n controller.error(\n new AxAIServiceStreamTerminatedError(\n apiUrl.href,\n json,\n lastChunk,\n {\n streamMetrics,\n cancelReason: 'Stream cancelled by client',\n }\n )\n )\n } else {\n controller.error(\n new AxAIServiceNetworkError(error, apiUrl.href, json, {\n streamMetrics,\n })\n )\n }\n throw error\n } finally {\n clearTimeout(timeoutId)\n reader.releaseLock()\n if (api.span?.isRecording()) {\n api.span.end()\n }\n }\n }\n\n read()\n },\n // When the consumer cancels the stream, set our flag to stop processing further.\n cancel() {\n closed = true\n },\n })\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new AxAIServiceTimeoutError(apiUrl.href, timeoutMs, json, {\n metrics,\n })\n }\n\n if (api.span?.isRecording()) {\n api.span.recordException(error as Error)\n api.span.setAttributes({\n 'error.time': Date.now() - metrics.startTime,\n 'error.retries': metrics.retryCount,\n })\n }\n\n // Handle retryable network errors\n if (\n error instanceof AxAIServiceNetworkError &&\n shouldRetry(error, undefined, attempt, retryConfig)\n ) {\n const delay = calculateRetryDelay(attempt, retryConfig)\n attempt++\n updateRetryMetrics(metrics)\n\n if (api.span?.isRecording()) {\n api.span.addEvent('retry', {\n attempt,\n delay,\n error: error.message,\n 'metrics.startTime': metrics.startTime,\n 'metrics.retryCount': metrics.retryCount,\n 'metrics.lastRetryTime': metrics.lastRetryTime,\n })\n }\n\n await new Promise((resolve) => setTimeout(resolve, delay))\n continue\n }\n\n if (error instanceof AxAIServiceError) {\n error.context['metrics'] = metrics\n }\n\n throw error\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId)\n }\n\n if (api.span?.isRecording()) {\n api.span.end()\n }\n }\n }\n}\n\nexport function createApiConfig(\n config: Readonly<Partial<AxAPIConfig>>\n): AxAPIConfig {\n return {\n timeout: defaultTimeoutMs,\n retry: defaultRetryConfig,\n ...config,\n url: config.url!, // URL is required\n }\n}\n","import { TransformStream, TransformStreamDefaultController } from 'stream/web'\n\ninterface CurrentEventState {\n event?: string\n rawData: string\n id?: string\n retry?: number\n}\n\ninterface SSEParserOptions<T> {\n dataParser?: (data: string) => T\n onError?: (error: Error, rawData: string) => void\n}\n\nexport class SSEParser<T = unknown> extends TransformStream<string, T> {\n private buffer: string = ''\n private currentEvent: CurrentEventState = { rawData: '' }\n private dataParser: (data: string) => T\n private onError: (error: Error, rawData: string) => void\n\n constructor(options: SSEParserOptions<T> = {}) {\n super({\n transform: (chunk, controller) => this.handleChunk(chunk, controller),\n flush: (controller) => this.handleFlush(controller),\n })\n\n this.dataParser = options.dataParser || JSON.parse\n this.onError =\n options.onError ||\n ((error, rawData) => {\n console.warn('Failed to parse event data:', error)\n console.log('Raw data that failed to parse:', rawData)\n })\n }\n\n private handleChunk(\n chunk: string,\n controller: TransformStreamDefaultController<T>\n ): void {\n this.buffer += chunk\n this.processBuffer(controller)\n }\n\n private handleFlush(controller: TransformStreamDefaultController<T>): void {\n this.processBuffer(controller)\n if (this.currentEvent.rawData) {\n this.processEvent(controller)\n }\n }\n\n private processBuffer(controller: TransformStreamDefaultController<T>): void {\n // Normalize newlines to \\n\n const normalizedBuffer = this.buffer.replace(/\\r\\n|\\r/g, '\\n')\n const lines = normalizedBuffer.split('\\n')\n this.buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (line === '') {\n this.processEvent(controller)\n } else {\n this.parseLine(line)\n }\n }\n }\n\n private parseLine(line: string): void {\n if (line.startsWith(':')) {\n return // Ignore comment lines\n }\n\n const colonIndex = line.indexOf(':')\n if (colonIndex === -1) {\n this.currentEvent.rawData +=\n (this.currentEvent.rawData && !this.currentEvent.rawData.endsWith('\\n')\n ? '\\n'\n : '') + line.trim()\n return\n }\n\n const field = line.slice(0, colonIndex).trim()\n const value = line.slice(colonIndex + 1).trim()\n\n switch (field) {\n case 'event':\n this.currentEvent.event = value\n break\n case 'data':\n this.currentEvent.rawData +=\n (this.currentEvent.rawData &&\n !this.currentEvent.rawData.endsWith('\\n')\n ? '\\n'\n : '') + value\n break\n case 'id':\n this.currentEvent.id = value\n break\n case 'retry': {\n const retryValue = parseInt(value, 10)\n if (!isNaN(retryValue)) {\n this.currentEvent.retry = retryValue\n }\n break\n }\n }\n }\n\n private processEvent(controller: TransformStreamDefaultController<T>): void {\n if (this.currentEvent.rawData) {\n if (!this.currentEvent.event) {\n this.currentEvent.event = 'message'\n }\n\n if (this.currentEvent.rawData.trim() === '[DONE]') {\n // maybe we want to emit [DONE] to signal the end of the stream\n // controller.enqueue('[DONE]' as any)\n // Reset the current event\n this.currentEvent = { rawData: '' }\n return\n }\n\n try {\n const parsedData: T = this.dataParser(this.currentEvent.rawData)\n controller.enqueue(parsedData)\n } catch (e) {\n this.onError(e as Error, this.currentEvent.rawData)\n }\n\n this.currentEvent = { rawData: '' }\n }\n }\n}\n","import {\n type Transformer,\n TransformStream,\n type TransformStreamDefaultController,\n} from 'stream/web'\n\nexport interface TextDecoderCommon {\n readonly encoding: string\n readonly fatal: boolean\n readonly ignoreBOM: boolean\n}\n\nclass TextDecodeTransformer\n implements Transformer<ArrayBuffer | Uint8Array, string>\n{\n private decoder\n\n constructor() {\n this.decoder = new TextDecoder()\n }\n\n transform(\n chunk: ArrayBuffer | Uint8Array,\n controller: TransformStreamDefaultController<string>\n ) {\n if (!(chunk instanceof ArrayBuffer || ArrayBuffer.isView(chunk))) {\n throw new TypeError('Input data must be a BufferSource')\n }\n const text = this.decoder.decode(chunk, { stream: true })\n if (text.length !== 0) {\n controller.enqueue(text)\n }\n }\n\n flush(controller: TransformStreamDefaultController<string>) {\n const text = this.decoder.decode()\n if (text.length !== 0) {\n controller.enqueue(text)\n }\n }\n}\n\nexport class TextDecoderStreamPolyfill extends TransformStream<\n ArrayBuffer | Uint8Array,\n string\n> {\n constructor() {\n super(new TextDecodeTransformer())\n }\n}\n","import {\n type Transformer,\n TransformStream,\n type TransformStreamDefaultController,\n} from 'stream/web'\n\nclass TypeTransformer<I, O> implements Transformer<I, O> {\n private buffer?: O[]\n private doneCallback?: (args0: readonly O[]) => Promise<void>\n private transformFn: (arg0: I) => O\n\n constructor(\n transformFn: (arg0: I) => O,\n doneCallback?: (args0: readonly O[]) => Promise<void>\n ) {\n this.transformFn = transformFn\n this.doneCallback = doneCallback\n this.buffer = doneCallback ? [] : undefined\n }\n\n async transform(obj: I, controller: TransformStreamDefaultController<O>) {\n const val = this.transformFn(obj)\n if (val) {\n controller.enqueue(val)\n this.buffer?.push(val)\n }\n }\n\n async flush(controller: TransformStreamDefaultController<O>) {\n await this.doneCallback?.(this.buffer ?? [])\n controller.terminate()\n }\n}\n\nexport class RespTransformStream<I, O> extends TransformStream<I, O> {\n constructor(\n transformFn: (arg0: I) => O,\n doneCallback?: (args0: readonly O[]) => Promise<void>\n ) {\n super(new TypeTransformer<I, O>(transformFn, doneCallback))\n }\n}\n","export class ColorLog {\n // ANSI escape codes for different colors\n private readonly ANSI_WHITE_BRIGHT = '\\x1b[97m'\n private readonly ANSI_GREEN_BRIGHT = '\\x1b[92m'\n private readonly ANSI_BLUE_BRIGHT = '\\x1b[94m'\n private readonly ANSI_YELLOW = '\\x1b[93m'\n private readonly ANSI_RED = '\\x1b[91m'\n private readonly ANSI_RESET = '\\x1b[0m'\n\n // Method to wrap text with the specified ANSI color code\n private colorize(text: string, colorCode: string): string {\n return `${colorCode}${text}${this.ANSI_RESET}`\n }\n\n // Public methods to colorize text in various colors\n public whiteBright(text: string): string {\n return this.colorize(text, this.ANSI_WHITE_BRIGHT)\n }\n\n public greenBright(text: string): string {\n return this.colorize(text, this.ANSI_GREEN_BRIGHT)\n }\n\n public blueBright(text: string): string {\n return this.colorize(text, this.ANSI_BLUE_BRIGHT)\n }\n\n public yellow(text: string): string {\n return this.colorize(text, this.ANSI_YELLOW)\n }\n\n public red(text: string): string {\n return this.colorize(text, this.ANSI_RED)\n }\n}\n","import { ColorLog } from '../util/log.js'\n\nimport type { AxChatRequest, AxChatResponse } from './types.js'\n\nconst colorLog = new ColorLog()\n\nconst formatChatMessage = (\n msg: AxChatRequest['chatPrompt'][number],\n hideContent?: boolean\n) => {\n switch (msg.role) {\n case 'system':\n return `\\n${colorLog.blueBright('System:')}\\n${colorLog.whiteBright(msg.content)}`\n case 'function':\n return `\\n${colorLog.blueBright('Function Result:')}\\n${colorLog.whiteBright(msg.result)}`\n case 'user': {\n if (typeof msg.content === 'string') {\n return `\\n${colorLog.blueBright('User:')}\\n${colorLog.whiteBright(msg.content)}`\n }\n const items = msg.content.map((v) => {\n switch (v.type) {\n case 'text':\n return `${colorLog.whiteBright(v.text)}`\n case 'image':\n return `(Image, ${v.mimeType}) ${colorLog.whiteBright(v.image.substring(0, 10))}`\n default:\n throw new Error('Invalid content type')\n }\n })\n return `\\n${colorLog.blueBright('User:')}\\n${items.join('\\n')}`\n }\n case 'assistant': {\n if (msg.functionCalls) {\n const fns = msg.functionCalls?.map(({ function: fn }) => {\n const args =\n typeof fn.params !== 'string'\n ? JSON.stringify(fn.params, null, 2)\n : fn.params\n return `${fn.name}(${args})`\n })\n return `\\n${colorLog.blueBright('\\nFunctions:')}\\n${colorLog.whiteBright(fns.join('\\n'))}`\n }\n return `\\n${colorLog.blueBright('\\nAssistant:')}\\n${hideContent ? '' : colorLog.whiteBright(msg.content ?? '<empty>')}`\n }\n default:\n throw new Error('Invalid role')\n }\n}\n\nexport const logChatRequestMessage = (\n msg: AxChatRequest['chatPrompt'][number]\n) => {\n process.stdout.write(`${formatChatMessage(msg)}\\n`)\n process.stdout.write(colorLog.blueBright('\\nAssistant:\\n'))\n}\n\nexport const logChatRequest = (\n chatPrompt: Readonly<AxChatRequest['chatPrompt']>\n) => {\n const items = chatPrompt?.map((msg) => formatChatMessage(msg))\n\n if (items) {\n process.stdout.write(items.join('\\n'))\n process.stdout.write(colorLog.blueBright('\\nAssistant:\\n'))\n }\n}\n\nexport const logResponseResult = (\n r: Readonly<AxChatResponse['results'][number]>\n) => {\n if (r.content) {\n process.stdout.write(colorLog.greenBright(r.content))\n }\n if (r.functionCalls) {\n for (const [i, f] of r.functionCalls.entries()) {\n if (f.function.name) {\n if (i > 0) {\n process.stdout.write('\\n')\n }\n process.stdout.write(\n `Function ${i + 1} -> ${colorLog.greenBright(f.function.name)}`\n )\n }\n if (f.function.params) {\n const params =\n typeof f.function.params === 'string'\n ? f.function.params\n : JSON.stringify(f.function.params, null, 2)\n process.stdout.write(`${colorLog.greenBright(params)}`)\n }\n }\n }\n}\n\nexport const logResponse = (resp: Readonly<AxChatResponse>) => {\n if (!resp.results) {\n return\n }\n for (const r of resp.results) {\n logResponseResult(r)\n }\n}\n\nexport const logResponseDelta = (delta: string) => {\n process.stdout.write(colorLog.greenBright(delta))\n}\n","import { GoogleAuth } from 'google-auth-library'\nimport type {\n GoogleAuthOptions,\n JSONClient,\n} from 'google-auth-library/build/src/auth/googleauth.js'\n\n/**\n * This class is used to authenticate with the Google Vertex AI API.\n */\nexport class GoogleVertexAuth {\n private auth: GoogleAuth\n private client?: JSONClient\n\n constructor(config: GoogleAuthOptions = {}) {\n this.auth = new GoogleAuth({\n scopes: ['https://www.googleapis.com/auth/cloud-platform'],\n ...config,\n })\n }\n\n async getAuthenticatedClient() {\n if (!this.client) {\n this.client = (await this.auth.getClient()) as JSONClient\n }\n return this.client\n }\n\n async getAccessToken() {\n const client = await this.getAuthenticatedClient()\n const response = await client.getAccessToken()\n if (!response.token) {\n throw new Error('Failed to obtain access token')\n }\n return response.token\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIAnthropicModel {\n Claude37Sonnet = 'claude-3-7-sonnet-latest',\n\n Claude35Sonnet = 'claude-3-5-sonnet-latest',\n Claude35Haiku = 'claude-3-5-haiku-latest',\n\n Claude3Opus = 'claude-3-opus-latest',\n Claude3Sonnet = 'claude-3-sonnet-20240229',\n Claude3Haiku = 'claude-3-haiku-20240307',\n\n Claude21 = 'claude-2.1',\n ClaudeInstant12 = 'claude-instant-1.2',\n}\n\nexport enum AxAIAnthropicVertexModel {\n Claude37Sonnet = 'claude-3-7-sonnet',\n Claude35Haiku = 'claude-3-5-haiku',\n Claude35Sonnet = 'claude-3-5-sonnet',\n Claude35SonnetV2 = 'claude-3-5-sonnet-v2',\n Claude3Haiku = 'claude-3-haiku',\n Claude3Opus = 'claude-3-opus',\n}\n\nexport type AxAIAnthropicConfig = AxModelConfig & {\n model: AxAIAnthropicModel | AxAIAnthropicVertexModel\n}\n\nexport type AxAIAnthropicChatRequestCacheParam = {\n cache_control?: { type: 'ephemeral' }\n}\n\n// Type for the request to create a message using Anthropic's Messages API\nexport type AxAIAnthropicChatRequest = {\n model?: string\n anthropic_version?: string\n messages: (\n | {\n role: 'user'\n content:\n | string\n | (\n | ({\n type: 'text'\n text: string\n } & AxAIAnthropicChatRequestCacheParam)\n | ({\n type: 'image'\n source: { type: 'base64'; media_type: string; data: string }\n } & AxAIAnthropicChatRequestCacheParam)\n | {\n type: 'tool_result'\n is_error?: boolean\n tool_use_id: string\n content:\n | string\n | (\n | ({\n type: 'text'\n text: string\n } & AxAIAnthropicChatRequestCacheParam)\n | ({\n type: 'image'\n source: {\n type: 'base64'\n media_type: string\n data: string\n }\n } & AxAIAnthropicChatRequestCacheParam)\n )[]\n }\n )[]\n }\n | {\n role: 'assistant'\n content:\n | string\n | (\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: object }\n )[]\n }\n )[]\n tools?: ({\n name: string\n description: string\n input_schema?: object\n } & AxAIAnthropicChatRequestCacheParam)[]\n tool_choice?: { type: 'auto' | 'any' } | { type: 'tool'; name?: string }\n max_tokens?: number // Maximum number of tokens to generate\n // Optional metadata about the request\n stop_sequences?: string[] // Custom sequences that trigger the end of generation\n stream?: boolean // Whether to stream the response incrementally\n system?:\n | string\n | ({\n type: 'text'\n text: string\n } & AxAIAnthropicChatRequestCacheParam)[] // system prompt\n temperature?: number // Randomness of the response\n top_p?: number // Nucleus sampling probability\n top_k?: number // Sample from the top K options\n metadata?: {\n user_id: string\n }\n}\n\nexport type AxAIAnthropicChatResponse = {\n id: string // Unique identifier for the response\n type: 'message' // Object type, always 'message' for this API\n role: 'assistant' // Conversational role of the generated message, always 'assistant'\n content: (\n | {\n type: 'text'\n text: string\n }\n | {\n id: string\n name: string\n type: 'tool_use'\n input?: string\n }\n )[]\n model: string\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use'\n stop_sequence?: string\n usage: {\n input_tokens: number\n output_tokens: number\n }\n}\n\nexport type AxAIAnthropicChatError = {\n type: 'error'\n error: {\n type: 'authentication_error'\n message: string\n }\n}\n\n// Represents the start of a message with an empty content array\nexport interface AxAIAnthropicMessageStartEvent {\n type: 'message_start'\n message: {\n id: string\n type: 'message'\n role: 'assistant'\n content: []\n model: string\n stop_reason: null | string\n stop_sequence: null | string\n usage: {\n input_tokens: number\n output_tokens: number\n }\n }\n}\n\n// Indicates the start of a content block within a message\nexport interface AxAIAnthropicContentBlockStartEvent {\n index: number\n type: 'content_block_start'\n content_block:\n | {\n type: 'text'\n text: string\n }\n | {\n type: 'tool_use'\n id: string\n name: string\n input: object\n }\n}\n\n// Represents incremental updates to a content block\nexport interface AxAIAnthropicContentBlockDeltaEvent {\n index: number\n type: 'content_block_delta'\n delta:\n | {\n type: 'text_delta'\n text: string\n }\n | {\n type: 'input_json_delta'\n partial_json: string\n }\n}\n\n// Marks the end of a content block within a message\nexport interface AxAIAnthropicContentBlockStopEvent {\n type: 'content_block_stop'\n index: number\n}\n\n// Indicates top-level changes to the final message object\nexport interface AxAIAnthropicMessageDeltaEvent {\n type: 'message_delta'\n delta: {\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence' | null\n stop_sequence: string | null\n }\n usage: {\n output_tokens: number\n }\n}\n\n// Marks the end of a message\nexport interface AxAIAnthropicMessageStopEvent {\n type: 'message_stop'\n}\n\n// Represents a ping event, which can occur any number of times\nexport interface AxAIAnthropicPingEvent {\n type: 'ping'\n}\n\n// Represents an error event\nexport interface AxAIAnthropicErrorEvent {\n type: 'error'\n error: {\n type: 'overloaded_error'\n message: string\n }\n}\n\n// Union type for all possible event types in the stream\nexport type AxAIAnthropicChatResponseDelta =\n | AxAIAnthropicMessageStartEvent\n | AxAIAnthropicContentBlockStartEvent\n | AxAIAnthropicContentBlockDeltaEvent\n | AxAIAnthropicContentBlockStopEvent\n | AxAIAnthropicMessageDeltaEvent\n | AxAIAnthropicMessageStopEvent\n | AxAIAnthropicPingEvent\n | AxAIAnthropicErrorEvent\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIAnthropicModel } from './types.js'\n\nexport const axModelInfoAnthropic: AxModelInfo[] = [\n // 35\n {\n name: AxAIAnthropicModel.Claude35Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n },\n {\n name: AxAIAnthropicModel.Claude35Haiku,\n currency: 'usd',\n promptTokenCostPer1M: 0.8,\n completionTokenCostPer1M: 4.0,\n },\n // 3\n {\n name: AxAIAnthropicModel.Claude3Opus,\n currency: 'usd',\n promptTokenCostPer1M: 15.0,\n completionTokenCostPer1M: 75.0,\n },\n {\n name: AxAIAnthropicModel.Claude3Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n },\n {\n name: AxAIAnthropicModel.Claude3Haiku,\n currency: 'usd',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 1.25,\n },\n // 21\n {\n name: AxAIAnthropicModel.Claude21,\n currency: 'usd',\n promptTokenCostPer1M: 8.0,\n completionTokenCostPer1M: 25,\n },\n {\n name: AxAIAnthropicModel.ClaudeInstant12,\n currency: 'usd',\n promptTokenCostPer1M: 0.8,\n completionTokenCostPer1M: 2.24,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport { AxBaseAI, axBaseAIDefaultConfig } from '../base.js'\nimport { GoogleVertexAuth } from '../google-vertex/auth.js'\nimport type {\n AxAIInputModelList,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxInternalChatRequest,\n AxModelConfig,\n} from '../types.js'\n\nimport { axModelInfoAnthropic } from './info.js'\nimport {\n type AxAIAnthropicChatError,\n type AxAIAnthropicChatRequest,\n type AxAIAnthropicChatResponse,\n type AxAIAnthropicChatResponseDelta,\n type AxAIAnthropicConfig,\n type AxAIAnthropicContentBlockDeltaEvent,\n type AxAIAnthropicContentBlockStartEvent,\n type AxAIAnthropicErrorEvent,\n type AxAIAnthropicMessageDeltaEvent,\n type AxAIAnthropicMessageStartEvent,\n AxAIAnthropicModel,\n AxAIAnthropicVertexModel,\n} from './types.js'\n\nexport const axAIAnthropicDefaultConfig = (): AxAIAnthropicConfig =>\n structuredClone({\n model: AxAIAnthropicModel.Claude35Sonnet,\n ...axBaseAIDefaultConfig(),\n })\n\nexport interface AxAIAnthropicArgs {\n name: 'anthropic'\n apiKey?: string\n projectId?: string\n region?: string\n config?: Readonly<Partial<AxAIAnthropicConfig>>\n options?: Readonly<AxAIServiceOptions>\n models?: AxAIInputModelList<AxAIAnthropicModel | AxAIAnthropicVertexModel>\n}\n\nclass AxAIAnthropicImpl\n implements\n AxAIServiceImpl<\n AxAIAnthropicModel | AxAIAnthropicVertexModel,\n unknown,\n AxAIAnthropicChatRequest,\n unknown,\n AxAIAnthropicChatResponse,\n AxAIAnthropicChatResponseDelta,\n unknown\n >\n{\n constructor(\n private config: AxAIAnthropicConfig,\n private isVertex: boolean\n ) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n topK: config.topK,\n stream: config.stream,\n stopSequences: config.stopSequences,\n endSequences: config.endSequences,\n presencePenalty: config.presencePenalty,\n frequencyPenalty: config.frequencyPenalty,\n n: config.n,\n } as AxModelConfig\n }\n\n createChatReq = (\n req: Readonly<\n AxInternalChatRequest<AxAIAnthropicModel | AxAIAnthropicVertexModel>\n >\n ): [AxAPI, AxAIAnthropicChatRequest] => {\n const model = req.model\n const stream = req.modelConfig?.stream ?? this.config.stream\n\n let apiConfig\n if (this.isVertex) {\n apiConfig = {\n name: stream\n ? `/models/${model}:streamRawPredict?alt=sse`\n : `/models/${model}:rawPredict`,\n }\n } else {\n apiConfig = {\n name: '/messages',\n }\n }\n\n let toolsChoice\n\n if (req.functionCall && req.functions && req.functions.length > 0) {\n if (typeof req.functionCall === 'string') {\n switch (req.functionCall) {\n case 'auto':\n toolsChoice = { tool_choice: { type: 'auto' as const } }\n break\n case 'required':\n toolsChoice = { tool_choice: { type: 'any' as const } }\n break\n case 'none':\n throw new Error('functionCall none not supported')\n }\n } else if ('function' in req.functionCall) {\n toolsChoice = {\n tool_choice: {\n type: 'tool' as const,\n name: req.functionCall.function.name,\n },\n }\n } else {\n throw new Error('Invalid function call type, must be string or object')\n }\n }\n\n const system = req.chatPrompt\n .filter((msg) => msg.role === 'system')\n .map((msg) => ({\n type: 'text' as const,\n text: msg.content,\n ...(msg.cache ? { cache: { type: 'ephemeral' } } : {}),\n }))\n\n const otherMessages = req.chatPrompt.filter((msg) => msg.role !== 'system')\n\n const messages = createMessages(otherMessages)\n\n const tools: AxAIAnthropicChatRequest['tools'] = req.functions?.map(\n (v) => ({\n name: v.name,\n description: v.description,\n input_schema: v.parameters,\n })\n )\n\n const reqValue: AxAIAnthropicChatRequest = {\n ...(this.isVertex\n ? { anthropic_version: 'vertex-2023-10-16' }\n : { model }),\n max_tokens: req.modelConfig?.maxTokens ?? this.config.maxTokens,\n stop_sequences:\n req.modelConfig?.stopSequences ?? this.config.stopSequences,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n top_p: req.modelConfig?.topP ?? this.config.topP,\n top_k: req.modelConfig?.topK ?? this.config.topK,\n ...toolsChoice,\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(stream ? { stream: true } : {}),\n ...(system ? { system } : {}),\n messages,\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (\n resp: Readonly<AxAIAnthropicChatResponse | AxAIAnthropicChatError>\n ): AxChatResponse => {\n if (resp.type === 'error') {\n throw new Error(`Anthropic Chat API Error: ${resp.error.message}`)\n }\n\n const finishReason = mapFinishReason(resp.stop_reason)\n\n const results = resp.content.map((msg): AxChatResponseResult => {\n if (msg.type === 'tool_use') {\n return {\n id: msg.id,\n functionCalls: [\n {\n id: msg.id,\n type: 'function' as const,\n function: {\n name: msg.name,\n params: msg.input,\n },\n },\n ],\n finishReason,\n }\n }\n return {\n content: msg.type === 'text' ? msg.text : '',\n id: resp.id,\n finishReason,\n }\n })\n\n const modelUsage = {\n promptTokens: resp.usage.input_tokens,\n completionTokens: resp.usage.output_tokens,\n totalTokens: resp.usage.input_tokens + resp.usage.output_tokens,\n }\n\n return {\n results,\n modelUsage,\n remoteId: resp.id,\n }\n }\n\n createChatStreamResp = (\n resp: Readonly<AxAIAnthropicChatResponseDelta>,\n state: object\n ): AxChatResponse => {\n if (!('type' in resp)) {\n throw new Error('Invalid Anthropic streaming event')\n }\n\n const sstate = state as {\n indexIdMap: Record<number, string>\n }\n\n if (!sstate.indexIdMap) {\n sstate.indexIdMap = {}\n }\n\n if (resp.type === 'error') {\n const { error } = resp as unknown as AxAIAnthropicErrorEvent\n throw new Error(error.message)\n }\n\n if (resp.type === 'message_start') {\n const { message } = resp as unknown as AxAIAnthropicMessageStartEvent\n const results = [{ content: '', id: message.id }]\n const modelUsage = {\n promptTokens: message.usage?.input_tokens ?? 0,\n completionTokens: message.usage?.output_tokens ?? 0,\n totalTokens:\n (message.usage?.input_tokens ?? 0) +\n (message.usage?.output_tokens ?? 0),\n }\n return {\n results,\n modelUsage,\n }\n }\n\n if (resp.type === 'content_block_start') {\n const { content_block: contentBlock } =\n resp as unknown as AxAIAnthropicContentBlockStartEvent\n\n if (contentBlock.type === 'text') {\n return {\n results: [{ content: contentBlock.text }],\n }\n }\n if (contentBlock.type === 'tool_use') {\n if (\n typeof contentBlock.id === 'string' &&\n typeof resp.index === 'number' &&\n !sstate.indexIdMap[resp.index]\n ) {\n sstate.indexIdMap[resp.index] = contentBlock.id\n const functionCalls = [\n {\n id: contentBlock.id,\n type: 'function' as const,\n function: {\n name: contentBlock.name,\n params: '',\n },\n },\n ]\n return {\n results: [{ functionCalls }],\n }\n }\n }\n }\n\n if (resp.type === 'content_block_delta') {\n const { delta } = resp as unknown as AxAIAnthropicContentBlockDeltaEvent\n if (delta.type === 'text_delta') {\n return {\n results: [{ content: delta.text }],\n }\n }\n if (delta.type === 'input_json_delta') {\n const id = sstate.indexIdMap[resp.index]\n if (!id) {\n throw new Error('invalid streaming index no id found: ' + resp.index)\n }\n const functionCalls = [\n {\n id,\n type: 'function' as const,\n function: {\n name: '',\n params: delta.partial_json,\n },\n },\n ]\n return {\n results: [{ functionCalls }],\n }\n }\n }\n\n if (resp.type === 'message_delta') {\n const { delta, usage } = resp as unknown as AxAIAnthropicMessageDeltaEvent\n return {\n results: [\n {\n content: '',\n finishReason: mapFinishReason(delta.stop_reason),\n },\n ],\n modelUsage: {\n promptTokens: 0,\n completionTokens: usage.output_tokens,\n totalTokens: usage.output_tokens,\n },\n }\n }\n\n return {\n results: [{ content: '' }],\n }\n }\n}\n\nexport class AxAIAnthropic extends AxBaseAI<\n AxAIAnthropicModel | AxAIAnthropicVertexModel,\n unknown,\n AxAIAnthropicChatRequest,\n unknown,\n AxAIAnthropicChatResponse,\n AxAIAnthropicChatResponseDelta,\n unknown\n> {\n constructor({\n apiKey,\n projectId,\n region,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIAnthropicArgs, 'name'>>) {\n const isVertex = projectId !== undefined && region !== undefined\n\n let apiURL\n let headers\n\n if (isVertex) {\n apiURL = `https://${region}-aiplatform.googleapis.com/v1/projects/${projectId}/locations/${region}/publishers/anthropic/`\n if (apiKey) {\n headers = async () => ({ Authorization: `Bearer ${apiKey}` })\n } else {\n const vertexAuth = new GoogleVertexAuth()\n headers = async () => ({\n Authorization: `Bearer ${await vertexAuth.getAccessToken()}`,\n })\n }\n } else {\n if (!apiKey) {\n throw new Error('Anthropic API key not set')\n }\n apiURL = 'https://api.anthropic.com/v1'\n headers = async () => ({\n 'anthropic-version': '2023-06-01',\n 'anthropic-beta': 'prompt-caching-2024-07-31',\n 'x-api-key': apiKey,\n })\n }\n\n const _config = {\n ...axAIAnthropicDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAIAnthropicImpl(_config, isVertex)\n\n super(aiImpl, {\n name: 'Anthropic',\n apiURL,\n headers,\n modelInfo: axModelInfoAnthropic,\n defaults: { model: _config.model },\n options,\n supportFor: { functions: true, streaming: true, functionCot: true },\n models,\n })\n }\n}\n\ntype AnthropicMsg = AxAIAnthropicChatRequest['messages'][0]\ntype AnthropicMsgRoleUser = Extract<AnthropicMsg, { role: 'user' }>\ntype AnthropicMsgRoleUserToolResult = Extract<\n AnthropicMsgRoleUser['content'][0],\n { type: 'tool_result' }\n>\n\nfunction createMessages(\n chatPrompt: Readonly<AxChatRequest['chatPrompt']>\n): AxAIAnthropicChatRequest['messages'] {\n const items: AxAIAnthropicChatRequest['messages'] = chatPrompt.map((msg) => {\n switch (msg.role) {\n case 'function':\n const content: AnthropicMsgRoleUserToolResult[] = [\n {\n type: 'tool_result' as const,\n content: msg.result,\n tool_use_id: msg.functionId,\n ...(msg.isError ? { is_error: true } : {}),\n ...(msg.cache ? { cache: { type: 'ephemeral' } } : {}),\n },\n ]\n\n return {\n role: 'user' as const,\n content,\n }\n case 'user': {\n if (typeof msg.content === 'string') {\n return {\n role: 'user' as const,\n content: msg.content,\n }\n }\n const content = msg.content.map((v) => {\n switch (v.type) {\n case 'text':\n return {\n type: 'text' as const,\n text: v.text,\n ...(v.cache ? { cache: { type: 'ephemeral' } } : {}),\n }\n case 'image':\n return {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: v.mimeType,\n data: v.image,\n },\n ...(v.cache ? { cache: { type: 'ephemeral' } } : {}),\n }\n default:\n throw new Error('Invalid content type')\n }\n })\n return {\n role: 'user' as const,\n content,\n }\n }\n case 'assistant': {\n let content: Extract<\n AxAIAnthropicChatRequest['messages'][0],\n { role: 'assistant' }\n >['content'] = ''\n\n if (typeof msg.content === 'string') {\n content = msg.content\n }\n if (typeof msg.functionCalls !== 'undefined') {\n content = msg.functionCalls.map((v) => {\n let input\n if (typeof v.function.params === 'string') {\n input = JSON.parse(v.function.params)\n } else if (typeof v.function.params === 'object') {\n input = v.function.params\n }\n return {\n type: 'tool_use' as const,\n id: v.id,\n name: v.function.name,\n input,\n ...(msg.cache ? { cache: { type: 'ephemeral' } } : {}),\n }\n })\n }\n return {\n role: 'assistant' as const,\n content,\n }\n }\n default:\n throw new Error('Invalid role')\n }\n })\n\n return mergeAssistantMessages(items)\n}\n\n// Anthropic and some others need this in non-streaming mode\nfunction mergeAssistantMessages(\n messages: Readonly<AxAIAnthropicChatRequest['messages']>\n): AxAIAnthropicChatRequest['messages'] {\n const mergedMessages: AxAIAnthropicChatRequest['messages'] = []\n\n for (const [i, cur] of messages.entries()) {\n // Continue if not an assistant message or first message\n if (cur.role !== 'assistant') {\n mergedMessages.push(cur)\n continue\n }\n\n // Merge current message with the previous one if both are from the assistant\n if (i > 0 && messages.at(i - 1)?.role === 'assistant') {\n const lastMessage = mergedMessages.pop()\n\n mergedMessages.push({\n ...(lastMessage ? lastMessage : {}),\n ...cur,\n })\n } else {\n mergedMessages.push(cur)\n }\n }\n\n return mergedMessages\n}\n\nfunction mapFinishReason(\n stopReason?: AxAIAnthropicChatResponse['stop_reason'] | null\n): AxChatResponse['results'][0]['finishReason'] | undefined {\n if (!stopReason) {\n return undefined\n }\n switch (stopReason) {\n case 'stop_sequence':\n return 'stop'\n break\n case 'max_tokens':\n return 'length'\n break\n case 'tool_use':\n return 'function_call'\n break\n case 'end_turn':\n return 'stop'\n break\n default:\n return 'stop'\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIOpenAIModel {\n O1 = 'o1',\n O1Mini = 'o1-mini',\n O3Mini = 'o3-mini',\n GPT4 = 'gpt-4',\n GPT45 = 'gpt-4.5-preview',\n GPT4O = 'gpt-4o',\n GPT4OMini = 'gpt-4o-mini',\n GPT4ChatGPT4O = 'chatgpt-4o-latest',\n GPT4Turbo = 'gpt-4-turbo',\n GPT35Turbo = 'gpt-3.5-turbo',\n GPT35TurboInstruct = 'gpt-3.5-turbo-instruct',\n GPT35TextDavinci002 = 'text-davinci-002',\n GPT3TextBabbage002 = 'text-babbage-002',\n GPT3TextAda001 = 'text-ada-001',\n}\n\nexport enum AxAIOpenAIEmbedModel {\n TextEmbeddingAda002 = 'text-embedding-ada-002',\n TextEmbedding3Small = 'text-embedding-3-small',\n TextEmbedding3Large = 'text-embedding-3-large',\n}\n\nexport type AxAIOpenAIConfig<TModel, TEmbedModel> = Omit<\n AxModelConfig,\n 'topK'\n> & {\n model: TModel\n embedModel?: TEmbedModel\n user?: string\n responseFormat?: 'json_object'\n bestOf?: number\n logitBias?: Map<string, number>\n suffix?: string | null\n stop?: string[]\n logprobs?: number\n echo?: boolean\n dimensions?: number\n reasoningEffort?: 'low' | 'medium' | 'high'\n store?: boolean\n}\n\nexport type AxAIOpenAILogprob = {\n tokens: string[]\n token_logprobs: number[]\n top_logprobs: Map<string, number>\n text_offset: number[]\n}\n\nexport type AxAIOpenAIUsage = {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n}\n\nexport interface AxAIOpenAIResponseDelta<T> {\n id: string\n object: string\n created: number\n model: string\n choices: {\n index: number\n delta: T\n finish_reason: 'stop' | 'length' | 'content_filter' | 'tool_calls'\n }[]\n usage?: AxAIOpenAIUsage\n system_fingerprint: string\n}\n\nexport type AxAIOpenAIChatRequest<TModel> = {\n model: TModel\n reasoning_effort?: 'low' | 'medium' | 'high'\n store?: boolean\n messages: (\n | { role: 'system'; content: string }\n | {\n role: 'user'\n content:\n | string\n | (\n | {\n type: 'text'\n text: string\n }\n | {\n type: 'image_url'\n image_url: { url: string; details?: 'high' | 'low' | 'auto' }\n }\n | {\n type: 'input_audio'\n input_audio: { data: string; format?: 'wav' }\n }\n )[]\n name?: string\n }\n | {\n role: 'assistant'\n content: string\n name?: string\n tool_calls?: {\n type: 'function'\n function: {\n name: string\n // eslint-disable-next-line functional/functional-parameters\n arguments?: string\n }\n }[]\n }\n | { role: 'tool'; content: string; tool_call_id: string }\n )[]\n tools?: {\n type: 'function'\n function: {\n name: string\n description: string\n parameters?: object\n }\n }[]\n tool_choice?:\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; function: { name: string } }\n response_format?: { type: string }\n max_completion_tokens: number\n temperature?: number\n top_p?: number\n n?: number\n stream?: boolean\n stop?: readonly string[]\n presence_penalty?: number\n frequency_penalty?: number\n logit_bias?: Map<string, number>\n user?: string\n organization?: string\n}\n\nexport type AxAIOpenAIChatResponse = {\n id: string\n object: 'chat.completion'\n created: number\n model: string\n choices: {\n index: number\n message: {\n role: string\n content: string\n tool_calls?: {\n id: string\n type: 'function'\n // eslint-disable-next-line functional/functional-parameters\n function: { name: string; arguments: string }\n }[]\n }\n finish_reason: 'stop' | 'length' | 'content_filter' | 'tool_calls'\n }[]\n usage?: AxAIOpenAIUsage\n error?: {\n message: string\n type: string\n param: string\n code: number\n }\n system_fingerprint: string\n}\n\nexport type AxAIOpenAIChatResponseDelta = AxAIOpenAIResponseDelta<{\n content: string\n role?: string\n tool_calls?: (NonNullable<\n AxAIOpenAIChatResponse['choices'][0]['message']['tool_calls']\n >[0] & {\n index: number\n })[]\n}>\n\nexport type AxAIOpenAIEmbedRequest<TEmbedModel> = {\n input: readonly string[]\n model: TEmbedModel\n dimensions?: number\n user?: string\n}\n\nexport type AxAIOpenAIEmbedResponse = {\n model: string\n data: {\n embedding: readonly number[]\n index: number\n }[]\n usage: AxAIOpenAIUsage\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIOpenAIEmbedModel, AxAIOpenAIModel } from './types.js'\n\n/**\n * OpenAI: Model information\n */\nexport const axModelInfoOpenAI: AxModelInfo[] = [\n {\n name: AxAIOpenAIModel.GPT45,\n currency: 'usd',\n promptTokenCostPer1M: 75,\n completionTokenCostPer1M: 150,\n },\n {\n name: AxAIOpenAIModel.O1,\n currency: 'usd',\n promptTokenCostPer1M: 15,\n completionTokenCostPer1M: 60,\n },\n {\n name: AxAIOpenAIModel.O1Mini,\n currency: 'usd',\n promptTokenCostPer1M: 1.1,\n completionTokenCostPer1M: 14.4,\n },\n {\n name: AxAIOpenAIModel.O3Mini,\n currency: 'usd',\n promptTokenCostPer1M: 1.1,\n completionTokenCostPer1M: 4.4,\n },\n {\n name: AxAIOpenAIModel.GPT4,\n currency: 'usd',\n promptTokenCostPer1M: 30,\n completionTokenCostPer1M: 60,\n },\n {\n name: AxAIOpenAIModel.GPT4O,\n currency: 'usd',\n promptTokenCostPer1M: 5,\n completionTokenCostPer1M: 15,\n },\n {\n name: AxAIOpenAIModel.GPT4OMini,\n currency: 'usd',\n promptTokenCostPer1M: 0.15,\n completionTokenCostPer1M: 0.6,\n },\n {\n name: AxAIOpenAIModel.GPT4ChatGPT4O,\n currency: 'usd',\n promptTokenCostPer1M: 5,\n completionTokenCostPer1M: 15,\n },\n {\n name: AxAIOpenAIModel.GPT4Turbo,\n currency: 'usd',\n promptTokenCostPer1M: 10,\n completionTokenCostPer1M: 30,\n },\n {\n name: AxAIOpenAIModel.GPT35Turbo,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n },\n {\n name: AxAIOpenAIEmbedModel.TextEmbeddingAda002,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n {\n name: AxAIOpenAIEmbedModel.TextEmbedding3Small,\n currency: 'usd',\n promptTokenCostPer1M: 0.02,\n completionTokenCostPer1M: 0.02,\n },\n {\n name: AxAIOpenAIEmbedModel.TextEmbedding3Large,\n currency: 'usd',\n promptTokenCostPer1M: 0.13,\n completionTokenCostPer1M: 0.13,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport type {\n AxAIInputModelList,\n AxAIPromptConfig,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatResponse,\n AxChatResponseResult,\n AxEmbedResponse,\n AxInternalChatRequest,\n AxInternalEmbedRequest,\n AxModelConfig,\n AxModelInfo,\n} from '../types.js'\n\nimport { axModelInfoOpenAI } from './info.js'\nimport {\n type AxAIOpenAIChatRequest,\n type AxAIOpenAIChatResponse,\n type AxAIOpenAIChatResponseDelta,\n type AxAIOpenAIConfig,\n AxAIOpenAIEmbedModel,\n type AxAIOpenAIEmbedRequest,\n type AxAIOpenAIEmbedResponse,\n AxAIOpenAIModel,\n} from './types.js'\n\nexport const axAIOpenAIDefaultConfig = (): AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> =>\n structuredClone({\n model: AxAIOpenAIModel.GPT4O,\n embedModel: AxAIOpenAIEmbedModel.TextEmbedding3Small,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIOpenAIBestConfig = (): AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> =>\n structuredClone({\n ...axAIOpenAIDefaultConfig(),\n model: AxAIOpenAIModel.GPT4O,\n })\n\nexport const axAIOpenAICreativeConfig = (): AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> =>\n structuredClone({\n model: AxAIOpenAIModel.GPT4O,\n embedModel: AxAIOpenAIEmbedModel.TextEmbedding3Small,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport const axAIOpenAIFastConfig = (): AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> => ({\n ...axAIOpenAIDefaultConfig(),\n model: AxAIOpenAIModel.GPT4OMini,\n})\n\nexport interface AxAIOpenAIArgs<\n TName = 'openai',\n TModel = AxAIOpenAIModel,\n TEmbedModel = AxAIOpenAIEmbedModel,\n> extends Omit<\n AxAIOpenAIBaseArgs<TModel, TEmbedModel>,\n 'config' | 'modelInfo'\n > {\n name: TName\n config?: Partial<AxAIOpenAIBaseArgs<TModel, TEmbedModel>['config']>\n}\n\nexport interface AxAIOpenAIBaseArgs<TModel, TEmbedModel> {\n apiKey: string\n apiURL?: string\n config: Readonly<AxAIOpenAIConfig<TModel, TEmbedModel>>\n options?: Readonly<AxAIServiceOptions & { streamingUsage?: boolean }>\n modelInfo: Readonly<AxModelInfo[]>\n models?: AxAIInputModelList<TModel>\n}\n\nclass AxAIOpenAIImpl<TModel, TEmbedModel>\n implements\n AxAIServiceImpl<\n TModel,\n TEmbedModel,\n AxAIOpenAIChatRequest<TModel>,\n AxAIOpenAIEmbedRequest<TEmbedModel>,\n AxAIOpenAIChatResponse,\n AxAIOpenAIChatResponseDelta,\n AxAIOpenAIEmbedResponse\n >\n{\n constructor(\n private readonly config: Readonly<AxAIOpenAIConfig<TModel, TEmbedModel>>,\n private streamingUsage: boolean,\n private dimensions?: number\n ) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n presencePenalty: config.presencePenalty,\n frequencyPenalty: config.frequencyPenalty,\n stopSequences: config.stopSequences,\n endSequences: config.endSequences,\n topP: config.topP,\n n: config.n,\n stream: config.stream,\n }\n }\n\n createChatReq(\n req: Readonly<AxInternalChatRequest<TModel>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _config: Readonly<AxAIPromptConfig>\n ): [AxAPI, AxAIOpenAIChatRequest<TModel>] {\n const model = req.model\n\n if (!req.chatPrompt || req.chatPrompt.length === 0) {\n throw new Error('Chat prompt is empty')\n }\n\n const apiConfig = {\n name: '/chat/completions',\n }\n\n const tools = req.functions?.map((v) => ({\n type: 'function' as const,\n function: {\n name: v.name,\n description: v.description,\n parameters: v.parameters,\n },\n }))\n\n const toolsChoice =\n !req.functionCall && req.functions && req.functions.length > 0\n ? 'auto'\n : req.functionCall\n\n const messages = createMessages(req)\n\n const frequencyPenalty =\n req.modelConfig?.frequencyPenalty ?? this.config.frequencyPenalty\n\n const stream = req.modelConfig?.stream ?? this.config.stream\n\n const reasoningEffort = isReasoningModel<TModel>(model)\n ? this.config.reasoningEffort\n : undefined\n\n const store = this.config.store\n\n const reqValue: AxAIOpenAIChatRequest<TModel> = {\n model,\n messages,\n response_format: this.config?.responseFormat\n ? { type: this.config?.responseFormat }\n : undefined,\n tools,\n tool_choice: toolsChoice,\n max_completion_tokens:\n req.modelConfig?.maxTokens ?? this.config.maxTokens ?? 500,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n top_p: req.modelConfig?.topP ?? this.config.topP ?? 1,\n n: req.modelConfig?.n ?? this.config.n,\n stop: req.modelConfig?.stopSequences ?? this.config.stop,\n presence_penalty:\n req.modelConfig?.presencePenalty ?? this.config.presencePenalty,\n logit_bias: this.config.logitBias,\n ...(frequencyPenalty ? { frequency_penalty: frequencyPenalty } : {}),\n ...(stream && this.streamingUsage\n ? { stream: true, stream_options: { include_usage: true } }\n : {}),\n ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),\n ...(store ? { store: store } : {}),\n }\n\n return [apiConfig, reqValue]\n }\n\n createEmbedReq(\n req: Readonly<AxInternalEmbedRequest<TEmbedModel>>\n ): [AxAPI, AxAIOpenAIEmbedRequest<TEmbedModel>] {\n const model = req.embedModel\n\n if (!model) {\n throw new Error('Embed model not set')\n }\n\n if (!req.texts || req.texts.length === 0) {\n throw new Error('Embed texts is empty')\n }\n\n const apiConfig = {\n name: '/embeddings',\n }\n\n const reqValue = {\n model: model,\n input: req.texts,\n dimensions: this.dimensions,\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp(resp: Readonly<AxAIOpenAIChatResponse>): AxChatResponse {\n const { id, usage, choices, error } = resp\n\n if (error) {\n throw error\n }\n\n const modelUsage = usage\n ? {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n }\n : undefined\n\n const results = choices.map((choice) => {\n const finishReason = mapFinishReason(choice.finish_reason)\n\n const functionCalls = choice.message.tool_calls?.map(\n ({ id, function: { arguments: params, name } }) => ({\n id: id,\n type: 'function' as const,\n function: { name, params },\n })\n )\n\n return {\n id: `${choice.index}`,\n content: choice.message.content,\n functionCalls,\n finishReason,\n }\n })\n\n return {\n modelUsage,\n results,\n remoteId: id,\n }\n }\n\n createChatStreamResp(\n resp: Readonly<AxAIOpenAIChatResponseDelta>,\n state: object\n ): AxChatResponse {\n const { id, usage, choices } = resp\n\n const modelUsage = usage\n ? {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n }\n : undefined\n\n const sstate = state as {\n indexIdMap: Record<number, string>\n }\n\n if (!sstate.indexIdMap) {\n sstate.indexIdMap = {}\n }\n\n const results = choices.map(\n ({\n delta: { content, role, tool_calls: toolCalls },\n finish_reason: oaiFinishReason,\n }) => {\n const finishReason = mapFinishReason(oaiFinishReason)\n\n const functionCalls = toolCalls\n ?.map(({ id: _id, index, function: { name, arguments: params } }) => {\n if (\n typeof _id === 'string' &&\n typeof index === 'number' &&\n !sstate.indexIdMap[index]\n ) {\n sstate.indexIdMap[index] = _id\n }\n\n const id = sstate.indexIdMap[index]\n if (!id) {\n return null\n }\n\n return {\n id,\n type: 'function' as const,\n function: { name, params },\n }\n })\n .filter((v) => v !== null)\n\n return {\n content,\n role: role,\n functionCalls,\n finishReason,\n id,\n }\n }\n )\n\n return {\n results,\n modelUsage,\n }\n }\n\n createEmbedResp(resp: Readonly<AxAIOpenAIEmbedResponse>): AxEmbedResponse {\n const { data, usage } = resp\n\n const modelUsage = usage\n ? {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n }\n : undefined\n\n return {\n embeddings: data.map((v) => v.embedding),\n modelUsage,\n }\n }\n}\n\nconst mapFinishReason = (\n finishReason: AxAIOpenAIChatResponse['choices'][0]['finish_reason']\n): AxChatResponseResult['finishReason'] => {\n switch (finishReason) {\n case 'stop':\n return 'stop' as const\n case 'length':\n return 'length' as const\n case 'content_filter':\n return 'error' as const\n case 'tool_calls':\n return 'function_call' as const\n }\n}\n\nfunction createMessages<TModel>(\n req: Readonly<AxInternalChatRequest<TModel>>\n): AxAIOpenAIChatRequest<TModel>['messages'] {\n return req.chatPrompt.map((msg) => {\n switch (msg.role) {\n case 'system':\n return { role: 'system' as const, content: msg.content }\n case 'user':\n if (Array.isArray(msg.content)) {\n return {\n role: 'user' as const,\n name: msg.name,\n content: msg.content.map((c) => {\n switch (c.type) {\n case 'text':\n return { type: 'text' as const, text: c.text }\n case 'image': {\n const url = `data:${c.mimeType};base64,` + c.image\n return {\n type: 'image_url' as const,\n image_url: { url, details: c.details ?? 'auto' },\n }\n }\n case 'audio': {\n const data = c.data\n return {\n type: 'input_audio' as const,\n input_audio: { data, format: c.format ?? 'wav' },\n }\n }\n default:\n throw new Error('Invalid content type')\n }\n }),\n }\n }\n return { role: 'user' as const, content: msg.content, name: msg.name }\n case 'assistant':\n return {\n role: 'assistant' as const,\n content: msg.content as string,\n name: msg.name,\n tool_calls: msg.functionCalls?.map((v) => ({\n id: v.id,\n type: 'function' as const,\n function: {\n name: v.function.name,\n arguments:\n typeof v.function.params === 'object'\n ? JSON.stringify(v.function.params)\n : v.function.params,\n },\n })),\n }\n case 'function':\n return {\n role: 'tool' as const,\n content: msg.result,\n tool_call_id: msg.functionId,\n }\n default:\n throw new Error('Invalid role')\n }\n })\n}\n\nexport class AxAIOpenAIBase<TModel, TEmbedModel> extends AxBaseAI<\n TModel,\n TEmbedModel,\n AxAIOpenAIChatRequest<TModel>,\n AxAIOpenAIEmbedRequest<TEmbedModel>,\n AxAIOpenAIChatResponse,\n AxAIOpenAIChatResponseDelta,\n AxAIOpenAIEmbedResponse\n> {\n constructor({\n apiKey,\n config,\n options,\n apiURL,\n modelInfo,\n models,\n }: Readonly<Omit<AxAIOpenAIBaseArgs<TModel, TEmbedModel>, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('OpenAI API key not set')\n }\n\n const aiImpl = new AxAIOpenAIImpl<TModel, TEmbedModel>(\n config,\n options?.streamingUsage ?? true,\n config.dimensions\n )\n\n super(aiImpl, {\n name: 'OpenAI',\n apiURL: apiURL ? apiURL : 'https://api.openai.com/v1',\n headers: async () => ({ Authorization: `Bearer ${apiKey}` }),\n modelInfo,\n defaults: {\n model: config.model,\n embedModel: config.embedModel,\n },\n options,\n supportFor: () => {\n return { functions: true, streaming: true }\n },\n models,\n })\n }\n}\n\nconst isReasoningModel = <TModel>(model: TModel): boolean =>\n [AxAIOpenAIModel.O1Mini, AxAIOpenAIModel.O1, AxAIOpenAIModel.O3Mini].includes(\n model as AxAIOpenAIModel\n )\n\nexport class AxAIOpenAI extends AxAIOpenAIBase<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIOpenAIArgs, 'name' | 'modelInfo'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('OpenAI API key not set')\n }\n\n super({\n apiKey,\n config: {\n ...axAIOpenAIDefaultConfig(),\n ...config,\n },\n options,\n modelInfo: axModelInfoOpenAI,\n models,\n })\n\n super.setName('OpenAI')\n }\n}\n","import {\n type AxAIOpenAIArgs,\n AxAIOpenAIBase,\n axAIOpenAIBestConfig,\n axAIOpenAICreativeConfig,\n axAIOpenAIDefaultConfig,\n axAIOpenAIFastConfig,\n} from '../openai/api.js'\nimport { axModelInfoOpenAI } from '../openai/info.js'\nimport type {\n AxAIOpenAIConfig,\n AxAIOpenAIEmbedModel,\n AxAIOpenAIModel,\n} from '../openai/types.js'\n\nexport const axAIAzureOpenAIDefaultConfig = axAIOpenAIDefaultConfig\n\nexport const axAIAzureOpenAICreativeConfig = axAIOpenAICreativeConfig\n\nexport const axAIAzureOpenAIFastConfig = axAIOpenAIFastConfig\n\nexport const axAIAzureOpenAIBestConfig = axAIOpenAIBestConfig\n\nexport type AxAIAzureOpenAIConfig = AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n>\nexport type AxAIAzureOpenAIArgs = AxAIOpenAIArgs<\n 'azure-openai',\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> & {\n resourceName: string\n deploymentName: string\n version?: string\n}\n\nexport class AxAIAzureOpenAI extends AxAIOpenAIBase<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> {\n constructor({\n apiKey,\n resourceName,\n deploymentName,\n version = 'api-version=2024-02-15-preview',\n config,\n options,\n models,\n }: Readonly<Omit<AxAIAzureOpenAIArgs, 'name' | 'modelInfo'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Azure OpenAPI API key not set')\n }\n if (!resourceName || resourceName === '') {\n throw new Error('Azure OpenAPI resource name not set')\n }\n if (!deploymentName || deploymentName === '') {\n throw new Error('Azure OpenAPI deployment id not set')\n }\n const _config = {\n ...axAIAzureOpenAIDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n config: _config,\n options,\n models,\n modelInfo: axModelInfoOpenAI,\n })\n\n const host = resourceName.includes('://')\n ? resourceName\n : `https://${resourceName}.openai.azure.com/`\n\n super.setName('Azure OpenAI')\n\n super.setAPIURL(\n new URL(\n `/openai/deployments/${deploymentName}?api-version=${version}`,\n host\n ).href\n )\n\n super.setHeaders(async () => ({ 'api-key': apiKey }))\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\n/**\n * Cohere: Models for text generation\n */\nexport enum AxAICohereModel {\n CommandRPlus = 'command-r-plus',\n CommandR = 'command-r',\n Command = 'command',\n CommandLight = 'command-light',\n}\n\n/**\n * Cohere: Models for use in embeddings\n */\nexport enum AxAICohereEmbedModel {\n EmbedEnglishV30 = 'embed-english-v3.0',\n EmbedEnglishLightV30 = 'embed-english-light-v3.0',\n EmbedMultiLingualV30 = 'embed-multilingual-v3.0',\n EmbedMultiLingualLightV30 = 'embed-multilingual-light-v3.0',\n}\n\n/**\n * Cohere: Model options for text generation\n */\nexport type AxAICohereConfig = AxModelConfig & {\n model: AxAICohereModel\n embedModel?: AxAICohereEmbedModel\n}\n\nexport type AxAICohereChatResponseToolCalls = {\n name: string\n parameters?: object\n}[]\n\nexport type AxAICohereChatRequestToolResults = {\n call: AxAICohereChatResponseToolCalls[0]\n outputs: object[]\n}[]\n\nexport type AxAICohereChatRequest = {\n message?: string\n preamble?: string\n chat_history: (\n | {\n role: 'CHATBOT'\n message: string\n tool_calls?: AxAICohereChatResponseToolCalls\n }\n | {\n role: 'SYSTEM'\n message: string\n }\n | {\n role: 'USER'\n message: string\n }\n | {\n role: 'TOOL'\n message?: string\n tool_results: AxAICohereChatRequestToolResults\n }\n )[]\n\n model: AxAICohereModel\n max_tokens?: number\n temperature?: number\n k?: number\n p?: number\n frequency_penalty?: number\n presence_penalty?: number\n end_sequences?: readonly string[]\n stop_sequences?: string[]\n tools?: {\n name: string\n description: string\n parameter_definitions: Record<\n string,\n {\n description: string\n type: string\n required: boolean\n }\n >\n }[]\n tool_results?: AxAICohereChatRequestToolResults\n}\n\nexport type AxAICohereChatResponse = {\n response_id: string\n meta: {\n billed_units: {\n input_tokens: number\n output_tokens: number\n }\n }\n generation_id: string\n text: string\n finish_reason:\n | 'COMPLETE'\n | 'ERROR'\n | 'ERROR_TOXIC'\n | 'ERROR_LIMIT'\n | 'USER_CANCEL'\n | 'MAX_TOKENS'\n tool_calls: AxAICohereChatResponseToolCalls\n}\n\nexport type AxAICohereChatResponseDelta = AxAICohereChatResponse & {\n event_type:\n | 'stream-start'\n | 'text-generation'\n | 'tool-calls-generation'\n | 'stream-end'\n}\n\nexport type AxAICohereEmbedRequest = {\n texts: readonly string[]\n model: AxAICohereEmbedModel\n truncate: string\n}\n\nexport type AxAICohereEmbedResponse = {\n id: string\n texts: string[]\n model: AxAICohereEmbedModel\n embeddings: number[][]\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAICohereEmbedModel, AxAICohereModel } from './types.js'\n\nexport const axModelInfoCohere: AxModelInfo[] = [\n {\n name: AxAICohereModel.CommandRPlus,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15,\n },\n {\n name: AxAICohereModel.CommandR,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n },\n {\n name: AxAICohereModel.Command,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n },\n {\n name: AxAICohereModel.CommandLight,\n currency: 'usd',\n promptTokenCostPer1M: 0.3,\n completionTokenCostPer1M: 0.6,\n },\n {\n name: AxAICohereEmbedModel.EmbedEnglishLightV30,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n {\n name: AxAICohereEmbedModel.EmbedEnglishV30,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n {\n name: AxAICohereEmbedModel.EmbedMultiLingualV30,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n {\n name: AxAICohereEmbedModel.EmbedMultiLingualLightV30,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport type {\n AxAIInputModelList,\n AxAIPromptConfig,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedResponse,\n AxInternalChatRequest,\n AxInternalEmbedRequest,\n AxModelConfig,\n} from '../types.js'\n\nimport { axModelInfoCohere } from './info.js'\nimport {\n type AxAICohereChatRequest,\n type AxAICohereChatResponse,\n type AxAICohereChatResponseDelta,\n type AxAICohereConfig,\n AxAICohereEmbedModel,\n type AxAICohereEmbedRequest,\n type AxAICohereEmbedResponse,\n AxAICohereModel,\n} from './types.js'\n\nexport const axAICohereDefaultConfig = (): AxAICohereConfig =>\n structuredClone({\n model: AxAICohereModel.CommandRPlus,\n embedModel: AxAICohereEmbedModel.EmbedEnglishV30,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAICohereCreativeConfig = (): AxAICohereConfig =>\n structuredClone({\n model: AxAICohereModel.CommandR,\n embedModel: AxAICohereEmbedModel.EmbedEnglishV30,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport interface AxAICohereArgs {\n name: 'cohere'\n apiKey: string\n config?: Readonly<Partial<AxAICohereConfig>>\n options?: Readonly<AxAIServiceOptions>\n models?: AxAIInputModelList<AxAICohereModel>\n}\n\nclass AxAICohereImpl\n implements\n AxAIServiceImpl<\n AxAICohereModel,\n AxAICohereEmbedModel,\n AxAICohereChatRequest,\n AxAICohereEmbedRequest,\n AxAICohereChatResponse,\n AxAICohereChatResponseDelta,\n AxAICohereEmbedResponse\n >\n{\n constructor(private config: AxAICohereConfig) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n topK: config.topK,\n frequencyPenalty: config.frequencyPenalty,\n presencePenalty: config.presencePenalty,\n endSequences: config.endSequences,\n stopSequences: config.stopSequences,\n stream: config.stream,\n n: config.n,\n } as AxModelConfig\n }\n\n createChatReq(\n req: Readonly<AxInternalChatRequest<AxAICohereModel>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _config: Readonly<AxAIPromptConfig>\n ): [AxAPI, AxAICohereChatRequest] {\n const model = req.model\n\n const lastChatMsg = req.chatPrompt.at(-1)\n const restOfChat = req.chatPrompt.slice(0, -1)\n\n let message: AxAICohereChatRequest['message'] | undefined\n\n if (\n lastChatMsg &&\n lastChatMsg.role === 'user' &&\n typeof lastChatMsg.content === 'string'\n ) {\n message = lastChatMsg?.content\n }\n\n const chatHistory = createHistory(restOfChat)\n\n type PropValue = NonNullable<\n AxAICohereChatRequest['tools']\n >[0]['parameter_definitions'][0]\n\n const tools: AxAICohereChatRequest['tools'] = req.functions?.map((v) => {\n const props: Record<string, PropValue> = {}\n if (v.parameters?.properties) {\n for (const [key, value] of Object.entries(v.parameters.properties)) {\n props[key] = {\n description: value.description,\n type: value.type,\n required: v.parameters.required?.includes(key) ?? false,\n }\n }\n }\n\n return {\n name: v.name,\n description: v.description,\n parameter_definitions: props,\n }\n })\n\n type FnType = Extract<AxChatRequest['chatPrompt'][0], { role: 'function' }>\n\n const toolResults: AxAICohereChatRequest['tool_results'] = (\n req.chatPrompt as FnType[]\n )\n .filter((chat) => chat.role === 'function')\n .map((chat) => {\n const fn = tools?.find((t) => t.name === chat.functionId)\n if (!fn) {\n throw new Error('Function not found')\n }\n return {\n call: { name: fn.name, parameters: fn.parameter_definitions },\n outputs: [{ result: chat.result ?? '' }],\n }\n })\n\n const apiConfig = {\n name: '/chat',\n }\n\n const reqValue: AxAICohereChatRequest = {\n message,\n model,\n tools,\n ...(toolResults && !message ? { tool_results: toolResults } : {}),\n chat_history: chatHistory,\n max_tokens: req.modelConfig?.maxTokens ?? this.config.maxTokens,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n k: req.modelConfig?.topK ?? this.config.topK,\n p: req.modelConfig?.topP ?? this.config.topP,\n frequency_penalty:\n req.modelConfig?.frequencyPenalty ?? this.config.frequencyPenalty,\n presence_penalty:\n req.modelConfig?.presencePenalty ?? this.config.presencePenalty,\n end_sequences: this.config.endSequences,\n stop_sequences:\n req.modelConfig?.stopSequences ?? this.config.stopSequences,\n }\n\n return [apiConfig, reqValue]\n }\n\n createEmbedReq = (\n req: Readonly<AxInternalEmbedRequest<AxAICohereEmbedModel>>\n ): [AxAPI, AxAICohereEmbedRequest] => {\n const model = req.embedModel\n\n if (!model) {\n throw new Error('Embed model not set')\n }\n\n if (!req.texts || req.texts.length === 0) {\n throw new Error('Embed texts is empty')\n }\n\n const apiConfig = {\n name: '/embed',\n }\n\n const reqValue = {\n model,\n texts: req.texts ?? [],\n input_type: 'classification',\n truncate: '',\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (resp: Readonly<AxAICohereChatResponse>): AxChatResponse => {\n const modelUsage = resp.meta.billed_units\n ? {\n promptTokens: resp.meta.billed_units.input_tokens,\n completionTokens: resp.meta.billed_units.output_tokens,\n totalTokens:\n resp.meta.billed_units.input_tokens +\n resp.meta.billed_units.output_tokens,\n }\n : undefined\n\n let finishReason: AxChatResponse['results'][0]['finishReason']\n if ('finish_reason' in resp) {\n switch (resp.finish_reason) {\n case 'COMPLETE':\n finishReason = 'stop'\n break\n case 'MAX_TOKENS':\n finishReason = 'length'\n break\n case 'ERROR':\n throw new Error('Finish reason: ERROR')\n case 'ERROR_TOXIC':\n throw new Error('Finish reason: CONTENT_FILTER')\n default:\n finishReason = 'stop'\n break\n }\n }\n\n let functionCalls: AxChatResponse['results'][0]['functionCalls']\n\n if ('tool_calls' in resp) {\n functionCalls = resp.tool_calls?.map(\n (v): NonNullable<AxChatResponse['results'][0]['functionCalls']>[0] => {\n return {\n id: v.name,\n type: 'function' as const,\n function: { name: v.name, params: v.parameters },\n }\n }\n )\n }\n\n const results: AxChatResponse['results'] = [\n {\n id: resp.generation_id,\n content: resp.text,\n functionCalls,\n finishReason,\n },\n ]\n\n return {\n results,\n modelUsage,\n remoteId: resp.response_id,\n }\n }\n\n createChatStreamResp = (\n resp: Readonly<AxAICohereChatResponseDelta>,\n state: object\n ): AxChatResponse => {\n const ss = state as {\n generation_id?: string\n }\n\n if (resp.event_type === 'stream-start') {\n ss.generation_id = resp.generation_id\n }\n\n const { results } = this.createChatResp(resp)\n const result = results[0]\n if (!result) {\n throw new Error('No result')\n }\n\n result.id = ss.generation_id ?? ''\n return { results }\n }\n\n createEmbedResp(resp: Readonly<AxAICohereEmbedResponse>): AxEmbedResponse {\n return {\n remoteId: resp.id,\n embeddings: resp.embeddings,\n }\n }\n}\n\nexport class AxAICohere extends AxBaseAI<\n AxAICohereModel,\n AxAICohereEmbedModel,\n AxAICohereChatRequest,\n AxAICohereEmbedRequest,\n AxAICohereChatResponse,\n AxAICohereChatResponseDelta,\n AxAICohereEmbedResponse\n> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAICohereArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Cohere API key not set')\n }\n const _config = {\n ...axAICohereDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAICohereImpl(_config)\n\n super(aiImpl, {\n name: 'Cohere',\n apiURL: 'https://api.cohere.ai/v1',\n headers: async () => ({ Authorization: `Bearer ${apiKey}` }),\n modelInfo: axModelInfoCohere,\n defaults: { model: _config.model },\n supportFor: { functions: true, streaming: true },\n options,\n models,\n })\n }\n}\nfunction createHistory(\n chatPrompt: Readonly<AxChatRequest['chatPrompt']>\n): AxAICohereChatRequest['chat_history'] {\n return chatPrompt.map((chat) => {\n let message: string = ''\n\n if (\n chat.role === 'system' ||\n chat.role === 'assistant' ||\n chat.role === 'user'\n ) {\n if (typeof chat.content === 'string') {\n message = chat.content\n } else {\n throw new Error('Multi-modal content not supported')\n }\n }\n\n switch (chat.role) {\n case 'user':\n return { role: 'USER' as const, message }\n case 'system':\n return { role: 'SYSTEM' as const, message }\n case 'assistant': {\n const toolCalls = createToolCall(chat.functionCalls)\n return {\n role: 'CHATBOT' as const,\n message,\n tool_calls: toolCalls,\n }\n }\n case 'function': {\n const functionCalls = chatPrompt\n .map((v) => {\n if (v.role === 'assistant') {\n return v.functionCalls?.find((f) => f.id === chat.functionId)\n }\n return undefined\n })\n .filter((v) => v !== undefined)\n\n const call = createToolCall(functionCalls)?.at(0)\n\n if (!call) {\n throw new Error('Function call not found')\n }\n\n const outputs = [{ result: chat.result }]\n return {\n role: 'TOOL' as const,\n tool_results: [\n {\n call,\n outputs,\n },\n ],\n }\n }\n default:\n throw new Error('Unknown role')\n }\n })\n}\nfunction createToolCall(\n functionCalls: Readonly<\n Extract<\n AxChatRequest['chatPrompt'][0],\n { role: 'assistant' }\n >['functionCalls']\n >\n) {\n return functionCalls?.map((v) => {\n const parameters =\n typeof v.function.params === 'string'\n ? JSON.parse(v.function.params)\n : v.function.params\n return { name: v.function.name, parameters }\n })\n}\n","/**\n * DeepSeek: Models for text generation\n */\nexport enum AxAIDeepSeekModel {\n DeepSeekChat = 'deepseek-chat',\n DeepSeekCoder = 'deepseek-coder',\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIDeepSeekModel } from './types.js'\n\nexport const axModelInfoDeepSeek: AxModelInfo[] = [\n {\n name: AxAIDeepSeekModel.DeepSeekChat,\n currency: 'USD',\n promptTokenCostPer1M: 0.14,\n completionTokenCostPer1M: 0.28,\n },\n {\n name: AxAIDeepSeekModel.DeepSeekCoder,\n currency: 'USD',\n promptTokenCostPer1M: 0.14,\n completionTokenCostPer1M: 0.28,\n },\n]\n","import {\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\n\nimport { axModelInfoDeepSeek } from './info.js'\nimport { AxAIDeepSeekModel } from './types.js'\n\ntype DeepSeekConfig = AxAIOpenAIConfig<AxAIDeepSeekModel, undefined>\n\nexport const axAIDeepSeekDefaultConfig = (): DeepSeekConfig =>\n structuredClone({\n model: AxAIDeepSeekModel.DeepSeekChat,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIDeepSeekCodeConfig = (): DeepSeekConfig =>\n structuredClone({\n model: AxAIDeepSeekModel.DeepSeekCoder,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport type AxAIDeepSeekArgs = AxAIOpenAIArgs<\n 'deepseek',\n AxAIDeepSeekModel,\n undefined\n>\n\nexport class AxAIDeepSeek extends AxAIOpenAIBase<AxAIDeepSeekModel, undefined> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIDeepSeekArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('DeepSeek API key not set')\n }\n const _config = {\n ...axAIDeepSeekDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n config: _config,\n options,\n apiURL: 'https://api.deepseek.com',\n modelInfo: axModelInfoDeepSeek,\n models,\n })\n\n super.setName('DeepSeek')\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIGoogleGeminiModel {\n Gemini20Pro = 'gemini-2.0-pro-exp-02-05',\n Gemini20Flash = 'gemini-2.0-flash',\n Gemini20FlashLite = 'gemini-2.0-flash-lite-preview-02-05',\n Gemini20FlashThinking = 'gemini-2.0-flash-thinking-exp-01-21',\n Gemini1Pro = 'gemini-1.0-pro',\n Gemini15Flash = 'gemini-1.5-flash',\n Gemini15Flash002 = 'gemini-1.5-flash-002',\n Gemini15Flash8B = 'gemini-1.5-flash-8b',\n Gemini15Pro = 'gemini-1.5-pro',\n Gemma2 = 'gemma-2-27b-it',\n AQA = 'aqa',\n}\n\nexport enum AxAIGoogleGeminiEmbedModel {\n TextEmbedding004 = 'text-embedding-004',\n TextEmbedding005 = 'text-embedding-005',\n}\n\nexport enum AxAIGoogleGeminiSafetyCategory {\n HarmCategoryHarassment = 'HARM_CATEGORY_HARASSMENT',\n HarmCategoryHateSpeech = 'HARM_CATEGORY_HATE_SPEECH',\n HarmCategorySexuallyExplicit = 'HARM_CATEGORY_SEXUALLY_EXPLICIT',\n HarmCategoryDangerousContent = 'HARM_CATEGORY_DANGEROUS_CONTENT',\n}\n\nexport enum AxAIGoogleGeminiSafetyThreshold {\n BlockNone = 'BLOCK_NONE',\n BlockOnlyHigh = 'BLOCK_ONLY_HIGH',\n BlockMediumAndAbove = 'BLOCK_MEDIUM_AND_ABOVE',\n BlockLowAndAbove = 'BLOCK_LOW_AND_ABOVE',\n BlockDefault = 'HARM_BLOCK_THRESHOLD_UNSPECIFIED',\n}\n\nexport type AxAIGoogleGeminiContent =\n | {\n role: 'user'\n parts: (\n | {\n text: string\n }\n | {\n inlineData: {\n mimeType: string\n data: string\n }\n }\n | {\n fileData: {\n mimeType: string\n fileUri: string\n }\n }\n )[]\n }\n | {\n role: 'model'\n parts:\n | {\n text: string\n }[]\n | {\n functionCall: {\n name: string\n args: object\n }\n }[]\n }\n | {\n role: 'function'\n parts: {\n functionResponse: {\n name: string\n response: object\n }\n }[]\n }\n\nexport type AxAIGoogleGeminiToolFunctionDeclaration = {\n name: string\n description?: string\n parameters?: object\n}\n\nexport type AxAIGoogleGeminiToolGoogleSearchRetrieval = {\n dynamic_retrieval_config: {\n mode?: 'MODE_DYNAMIC'\n dynamic_threshold?: number\n }\n}\n\nexport type AxAIGoogleGeminiTool = {\n function_declarations?: AxAIGoogleGeminiToolFunctionDeclaration[]\n code_execution?: object\n google_search_retrieval?: AxAIGoogleGeminiToolGoogleSearchRetrieval\n}\n\nexport type AxAIGoogleGeminiToolConfig = {\n function_calling_config: {\n mode: 'ANY' | 'NONE' | 'AUTO'\n allowed_function_names?: string[]\n }\n}\n\nexport type AxAIGoogleGeminiGenerationConfig = {\n temperature?: number\n topP?: number\n topK?: number\n candidateCount?: number\n maxOutputTokens?: number\n stopSequences?: readonly string[]\n}\n\nexport type AxAIGoogleGeminiSafetySettings = {\n category: AxAIGoogleGeminiSafetyCategory\n threshold: AxAIGoogleGeminiSafetyThreshold\n}[]\n\nexport type AxAIGoogleGeminiChatRequest = {\n contents: AxAIGoogleGeminiContent[]\n tools?: AxAIGoogleGeminiTool[]\n toolConfig?: AxAIGoogleGeminiToolConfig\n systemInstruction?: AxAIGoogleGeminiContent\n generationConfig: AxAIGoogleGeminiGenerationConfig\n safetySettings?: AxAIGoogleGeminiSafetySettings\n}\n\nexport type AxAIGoogleGeminiChatResponse = {\n candidates: {\n content: AxAIGoogleGeminiContent\n\n finishReason:\n | 'STOP'\n | 'MAX_TOKENS'\n | 'SAFETY'\n | 'RECITATION'\n | 'OTHER'\n | 'MALFORMED_FUNCTION_CALL'\n citationMetadata: {\n citations: {\n startIndex: number\n endIndex: number\n uri: string\n title: string\n license: string\n publicationDate: {\n year: number\n month: number\n day: number\n }\n }[]\n }\n }[]\n usageMetadata: {\n promptTokenCount: number\n candidatesTokenCount: number\n totalTokenCount: number\n }\n}\n\nexport type AxAIGoogleGeminiChatResponseDelta = AxAIGoogleGeminiChatResponse\n\n/**\n * AxAIGoogleGeminiConfig: Configuration options for Google Gemini API\n */\nexport type AxAIGoogleGeminiConfig = AxModelConfig & {\n model: AxAIGoogleGeminiModel\n embedModel?: AxAIGoogleGeminiEmbedModel\n safetySettings?: AxAIGoogleGeminiSafetySettings\n}\n\n/**\n * AxAIGoogleGeminiEmbedRequest: Structure for making an embedding request to the Google Gemini API.\n */\nexport type AxAIGoogleGeminiBatchEmbedRequest = {\n requests: {\n model: string\n content: {\n parts: { text: string }[]\n }\n }[]\n}\n\n/**\n * AxAIGoogleGeminiEmbedResponse: Structure for handling responses from the Google Gemini API embedding requests.\n */\nexport type AxAIGoogleGeminiBatchEmbedResponse = {\n embeddings: {\n values: number[]\n }[]\n}\n\n/**\n * AxAIGoogleVertexBatchEmbedRequest: Structure for making an embedding request to the Google Vertex API.\n */\nexport type AxAIGoogleVertexBatchEmbedRequest = {\n instances: {\n content: string\n }[]\n}\n\n/**\n * AxAIGoogleVertexBatchEmbedResponse: Structure for handling responses from the Google Vertex API embedding requests.\n */\nexport type AxAIGoogleVertexBatchEmbedResponse = {\n predictions: {\n embeddings: {\n values: number[]\n }\n }[]\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIGoogleGeminiModel } from './types.js'\n\n/**\n * AxAIGoogleGemini: Model information\n */\nexport const axModelInfoGoogleGemini: AxModelInfo[] = [\n {\n name: AxAIGoogleGeminiModel.Gemini20Pro,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.0,\n completionTokenCostPer1M: 0.0,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini20Flash,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.01,\n completionTokenCostPer1M: 0.4,\n },\n\n {\n name: AxAIGoogleGeminiModel.Gemini20FlashLite,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.0,\n completionTokenCostPer1M: 0.0,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini20FlashThinking,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.0,\n completionTokenCostPer1M: 0.0,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini15Flash,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.075,\n completionTokenCostPer1M: 0.3,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini15Flash8B,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.0375,\n completionTokenCostPer1M: 0.15,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini15Pro,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 1.25,\n completionTokenCostPer1M: 5.0,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini1Pro,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport { GoogleVertexAuth } from '../google-vertex/auth.js'\nimport type {\n AxAIInputModelList,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatResponse,\n AxChatResponseResult,\n AxEmbedResponse,\n AxInternalChatRequest,\n AxInternalEmbedRequest,\n AxModelConfig,\n AxTokenUsage,\n} from '../types.js'\n\nimport { axModelInfoGoogleGemini } from './info.js'\nimport {\n type AxAIGoogleGeminiBatchEmbedRequest,\n type AxAIGoogleGeminiBatchEmbedResponse,\n type AxAIGoogleGeminiChatRequest,\n type AxAIGoogleGeminiChatResponse,\n type AxAIGoogleGeminiChatResponseDelta,\n type AxAIGoogleGeminiConfig,\n AxAIGoogleGeminiEmbedModel,\n AxAIGoogleGeminiModel,\n AxAIGoogleGeminiSafetyCategory,\n type AxAIGoogleGeminiSafetySettings,\n AxAIGoogleGeminiSafetyThreshold,\n type AxAIGoogleVertexBatchEmbedRequest,\n type AxAIGoogleVertexBatchEmbedResponse,\n} from './types.js'\n\nconst safetySettings: AxAIGoogleGeminiSafetySettings = [\n {\n category: AxAIGoogleGeminiSafetyCategory.HarmCategoryHarassment,\n threshold: AxAIGoogleGeminiSafetyThreshold.BlockNone,\n },\n {\n category: AxAIGoogleGeminiSafetyCategory.HarmCategoryHateSpeech,\n threshold: AxAIGoogleGeminiSafetyThreshold.BlockNone,\n },\n {\n category: AxAIGoogleGeminiSafetyCategory.HarmCategorySexuallyExplicit,\n threshold: AxAIGoogleGeminiSafetyThreshold.BlockNone,\n },\n {\n category: AxAIGoogleGeminiSafetyCategory.HarmCategoryDangerousContent,\n threshold: AxAIGoogleGeminiSafetyThreshold.BlockNone,\n },\n]\n\n/**\n * AxAIGoogleGemini: Default Model options for text generation\n */\nexport const axAIGoogleGeminiDefaultConfig = (): AxAIGoogleGeminiConfig =>\n structuredClone({\n model: AxAIGoogleGeminiModel.Gemini20Flash,\n embedModel: AxAIGoogleGeminiEmbedModel.TextEmbedding004,\n safetySettings,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIGoogleGeminiDefaultCreativeConfig =\n (): AxAIGoogleGeminiConfig =>\n structuredClone({\n model: AxAIGoogleGeminiModel.Gemini20Flash,\n embedModel: AxAIGoogleGeminiEmbedModel.TextEmbedding004,\n safetySettings,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport interface AxAIGoogleGeminiOptionsTools {\n codeExecution?: boolean\n googleSearchRetrieval?: {\n mode?: 'MODE_DYNAMIC'\n dynamicThreshold?: number\n }\n googleSearch?: boolean\n}\n\nexport interface AxAIGoogleGeminiArgs {\n name: 'google-gemini'\n apiKey?: string\n projectId?: string\n region?: string\n endpointId?: string\n config?: Readonly<Partial<AxAIGoogleGeminiConfig>>\n options?: Readonly<AxAIServiceOptions & AxAIGoogleGeminiOptionsTools>\n models?: AxAIInputModelList<AxAIGoogleGeminiModel>\n}\n\nclass AxAIGoogleGeminiImpl\n implements\n AxAIServiceImpl<\n AxAIGoogleGeminiModel,\n AxAIGoogleGeminiEmbedModel,\n AxAIGoogleGeminiChatRequest,\n AxAIGoogleGeminiBatchEmbedRequest | AxAIGoogleVertexBatchEmbedRequest,\n AxAIGoogleGeminiChatResponse,\n AxAIGoogleGeminiChatResponseDelta,\n AxAIGoogleGeminiBatchEmbedResponse | AxAIGoogleVertexBatchEmbedResponse\n >\n{\n constructor(\n private config: AxAIGoogleGeminiConfig,\n private isVertex: boolean,\n private endpointId?: string,\n private apiKey?: string,\n private options?: AxAIGoogleGeminiArgs['options']\n ) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n topK: config.topK,\n presencePenalty: config.presencePenalty,\n frequencyPenalty: config.frequencyPenalty,\n stopSequences: config.stopSequences,\n endSequences: config.endSequences,\n stream: config.stream,\n n: config.n,\n } as AxModelConfig\n }\n\n createChatReq = (\n req: Readonly<AxInternalChatRequest<AxAIGoogleGeminiModel>>\n ): [AxAPI, AxAIGoogleGeminiChatRequest] => {\n const model = req.model\n const stream = req.modelConfig?.stream ?? this.config.stream\n\n if (!req.chatPrompt || req.chatPrompt.length === 0) {\n throw new Error('Chat prompt is empty')\n }\n\n let apiConfig\n if (this.endpointId) {\n apiConfig = {\n name: stream\n ? `/${this.endpointId}:streamGenerateContent?alt=sse`\n : `/${this.endpointId}:generateContent`,\n }\n } else {\n apiConfig = {\n name: stream\n ? `/models/${model}:streamGenerateContent?alt=sse`\n : `/models/${model}:generateContent`,\n }\n }\n\n if (!this.isVertex) {\n const pf = stream ? '&' : '?'\n apiConfig.name += `${pf}key=${this.apiKey}`\n }\n\n const systemPrompts = req.chatPrompt\n .filter((p) => p.role === 'system')\n .map((p) => p.content)\n\n const systemInstruction =\n systemPrompts.length > 0\n ? {\n role: 'user' as const,\n parts: [{ text: systemPrompts.join(' ') }],\n }\n : undefined\n\n const contents: AxAIGoogleGeminiChatRequest['contents'] = req.chatPrompt\n .filter((p) => p.role !== 'system')\n .map((msg, i) => {\n switch (msg.role) {\n case 'user': {\n const parts: Extract<\n AxAIGoogleGeminiChatRequest['contents'][0],\n { role: 'user' }\n >['parts'] = Array.isArray(msg.content)\n ? msg.content.map((c, i) => {\n switch (c.type) {\n case 'text':\n return { text: c.text }\n case 'image':\n return {\n inlineData: { mimeType: c.mimeType, data: c.image },\n }\n default:\n throw new Error(\n `Chat prompt content type not supported (index: ${i})`\n )\n }\n })\n : [{ text: msg.content }]\n return {\n role: 'user' as const,\n parts,\n }\n }\n\n case 'assistant': {\n let parts: Extract<\n AxAIGoogleGeminiChatRequest['contents'][0],\n { role: 'model' }\n >['parts'] = []\n\n if (msg.functionCalls) {\n parts = msg.functionCalls.map((f) => {\n const args =\n typeof f.function.params === 'string'\n ? JSON.parse(f.function.params)\n : f.function.params\n return {\n functionCall: {\n name: f.function.name,\n args: args,\n },\n }\n })\n\n if (!parts) {\n throw new Error('Function call is empty')\n }\n\n return {\n role: 'model' as const,\n parts,\n }\n }\n\n if (!msg.content) {\n throw new Error('Assistant content is empty')\n }\n\n parts = [{ text: msg.content }]\n return {\n role: 'model' as const,\n parts,\n }\n }\n\n case 'function': {\n if (!('functionId' in msg)) {\n throw new Error(`Chat prompt functionId is empty (index: ${i})`)\n }\n const parts: Extract<\n AxAIGoogleGeminiChatRequest['contents'][0],\n { role: 'function' }\n >['parts'] = [\n {\n functionResponse: {\n name: msg.functionId,\n response: { result: msg.result },\n },\n },\n ]\n\n return {\n role: 'function' as const,\n parts,\n }\n }\n\n default:\n throw new Error('Invalid role')\n }\n })\n\n let tools: AxAIGoogleGeminiChatRequest['tools'] | undefined = []\n\n if (req.functions && req.functions.length > 0) {\n tools.push({ function_declarations: req.functions })\n }\n\n if (this.options?.codeExecution) {\n tools.push({ code_execution: {} })\n }\n\n if (this.options?.googleSearchRetrieval) {\n tools.push({\n google_search_retrieval: {\n dynamic_retrieval_config: this.options.googleSearchRetrieval,\n },\n })\n }\n\n if (tools.length === 0) {\n tools = undefined\n }\n\n let toolConfig\n\n if (req.functionCall) {\n if (req.functionCall === 'none') {\n toolConfig = { function_calling_config: { mode: 'NONE' as const } }\n } else if (req.functionCall === 'auto') {\n toolConfig = { function_calling_config: { mode: 'AUTO' as const } }\n } else if (req.functionCall === 'required') {\n toolConfig = {\n function_calling_config: { mode: 'ANY' as const },\n }\n } else {\n const allowedFunctionNames = req.functionCall.function?.name\n ? {\n allowedFunctionNames: [req.functionCall.function.name],\n }\n : {}\n toolConfig = {\n function_calling_config: { mode: 'ANY' as const },\n ...allowedFunctionNames,\n }\n }\n } else if (tools && tools.length > 0) {\n toolConfig = { function_calling_config: { mode: 'AUTO' as const } }\n }\n\n const generationConfig = {\n maxOutputTokens: req.modelConfig?.maxTokens ?? this.config.maxTokens,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n topP: req.modelConfig?.topP ?? this.config.topP,\n topK: req.modelConfig?.topK ?? this.config.topK,\n frequencyPenalty:\n req.modelConfig?.frequencyPenalty ?? this.config.frequencyPenalty,\n candidateCount: 1,\n stopSequences:\n req.modelConfig?.stopSequences ?? this.config.stopSequences,\n responseMimeType: 'text/plain',\n }\n\n const safetySettings = this.config.safetySettings\n\n const reqValue: AxAIGoogleGeminiChatRequest = {\n contents,\n tools,\n toolConfig,\n systemInstruction,\n generationConfig,\n safetySettings,\n }\n\n return [apiConfig, reqValue]\n }\n\n createEmbedReq = (\n req: Readonly<AxInternalEmbedRequest<AxAIGoogleGeminiEmbedModel>>\n ): [\n AxAPI,\n AxAIGoogleGeminiBatchEmbedRequest | AxAIGoogleVertexBatchEmbedRequest,\n ] => {\n const model = req.embedModel\n\n if (!model) {\n throw new Error('Embed model not set')\n }\n\n if (!req.texts || req.texts.length === 0) {\n throw new Error('Embed texts is empty')\n }\n\n let apiConfig\n let reqValue:\n | AxAIGoogleGeminiBatchEmbedRequest\n | AxAIGoogleVertexBatchEmbedRequest\n\n if (this.isVertex) {\n if (this.endpointId) {\n apiConfig = {\n name: `/${this.endpointId}:predict`,\n }\n } else {\n apiConfig = {\n name: `/models/${model}:predict`,\n }\n }\n\n reqValue = {\n instances: req.texts.map((text) => ({\n content: text,\n })),\n }\n } else {\n apiConfig = {\n name: `/models/${model}:batchEmbedContents?key=${this.apiKey}`,\n }\n\n reqValue = {\n requests: req.texts.map((text) => ({\n model: 'models/' + model,\n content: { parts: [{ text }] },\n })),\n }\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (\n resp: Readonly<AxAIGoogleGeminiChatResponse>\n ): AxChatResponse => {\n const results: AxChatResponseResult[] = resp.candidates?.map(\n (candidate) => {\n const result: AxChatResponseResult = {}\n\n switch (candidate.finishReason) {\n case 'MAX_TOKENS':\n result.finishReason = 'length'\n break\n case 'STOP':\n result.finishReason = 'stop'\n break\n case 'SAFETY':\n throw new Error('Finish reason: SAFETY')\n case 'RECITATION':\n throw new Error('Finish reason: RECITATION')\n case 'MALFORMED_FUNCTION_CALL':\n throw new Error('Finish reason: MALFORMED_FUNCTION_CALL')\n }\n\n if (!candidate.content || !candidate.content.parts) {\n return result\n }\n\n for (const part of candidate.content.parts) {\n if ('text' in part) {\n result.content = part.text\n continue\n }\n if ('functionCall' in part) {\n result.functionCalls = [\n {\n id: part.functionCall.name,\n type: 'function',\n function: {\n name: part.functionCall.name,\n params: part.functionCall.args,\n },\n },\n ]\n }\n }\n return result\n }\n )\n\n let modelUsage: AxTokenUsage | undefined\n if (resp.usageMetadata) {\n modelUsage = {\n totalTokens: resp.usageMetadata.totalTokenCount,\n promptTokens: resp.usageMetadata.promptTokenCount,\n completionTokens: resp.usageMetadata.candidatesTokenCount,\n }\n }\n return {\n results,\n modelUsage,\n }\n }\n\n createChatStreamResp = (\n resp: Readonly<AxAIGoogleGeminiChatResponseDelta>\n ): AxChatResponse => {\n return this.createChatResp(resp)\n }\n\n createEmbedResp = (\n resp: Readonly<\n AxAIGoogleGeminiBatchEmbedResponse | AxAIGoogleVertexBatchEmbedResponse\n >\n ): AxEmbedResponse => {\n let embeddings: number[][]\n if (this.isVertex) {\n embeddings = (resp as AxAIGoogleVertexBatchEmbedResponse).predictions.map(\n (prediction) => prediction.embeddings.values\n )\n } else {\n embeddings = (resp as AxAIGoogleGeminiBatchEmbedResponse).embeddings.map(\n (embedding) => embedding.values\n )\n }\n\n return {\n embeddings,\n }\n }\n}\n\n/**\n * AxAIGoogleGemini: AI Service\n */\nexport class AxAIGoogleGemini extends AxBaseAI<\n AxAIGoogleGeminiModel,\n AxAIGoogleGeminiEmbedModel,\n AxAIGoogleGeminiChatRequest,\n AxAIGoogleGeminiBatchEmbedRequest | AxAIGoogleVertexBatchEmbedRequest,\n AxAIGoogleGeminiChatResponse,\n AxAIGoogleGeminiChatResponseDelta,\n AxAIGoogleGeminiBatchEmbedResponse | AxAIGoogleVertexBatchEmbedResponse\n> {\n constructor({\n apiKey,\n projectId,\n region,\n endpointId,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIGoogleGeminiArgs, 'name'>>) {\n const isVertex = projectId !== undefined && region !== undefined\n\n let apiURL\n let headers\n\n if (isVertex) {\n let path\n if (endpointId) {\n path = 'endpoints'\n } else {\n path = 'publishers/google'\n }\n\n apiURL = `https://${region}-aiplatform.googleapis.com/v1/projects/${projectId}/locations/${region}/${path}`\n if (apiKey) {\n headers = async () => ({ Authorization: `Bearer ${apiKey}` })\n } else {\n const vertexAuth = new GoogleVertexAuth()\n headers = async () => ({\n Authorization: `Bearer ${await vertexAuth.getAccessToken()}`,\n })\n }\n } else {\n if (!apiKey) {\n throw new Error('GoogleGemini AI API key not set')\n }\n apiURL = 'https://generativelanguage.googleapis.com/v1beta'\n headers = async () => ({})\n }\n\n const _config = {\n ...axAIGoogleGeminiDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAIGoogleGeminiImpl(\n _config,\n isVertex,\n endpointId,\n apiKey,\n options\n )\n\n super(aiImpl, {\n name: 'GoogleGeminiAI',\n apiURL,\n headers,\n modelInfo: axModelInfoGoogleGemini,\n defaults: {\n model: _config.model as AxAIGoogleGeminiModel,\n embedModel: _config.embedModel as AxAIGoogleGeminiEmbedModel,\n },\n options,\n supportFor: { functions: true, streaming: true },\n models,\n })\n }\n}\n","import { ColorLog } from './log.js'\n\nconst colorLog = new ColorLog()\n\nexport interface AxRateLimiterTokenUsageOptions {\n debug?: boolean\n}\n\nexport class AxRateLimiterTokenUsage {\n private options?: Readonly<AxRateLimiterTokenUsageOptions>\n private maxTokens: number\n private refillRate: number\n private currentTokens: number\n private lastRefillTime: number\n\n constructor(\n maxTokens: number,\n refillRate: number,\n options?: Readonly<AxRateLimiterTokenUsageOptions>\n ) {\n this.maxTokens = maxTokens\n this.refillRate = refillRate\n this.currentTokens = maxTokens\n this.lastRefillTime = Date.now()\n this.options = options\n }\n\n private refillTokens() {\n const now = Date.now()\n const timeElapsed = (now - this.lastRefillTime) / 1000 // Convert ms to seconds\n const tokensToAdd = timeElapsed * this.refillRate\n this.currentTokens = Math.min(\n this.maxTokens,\n this.currentTokens + tokensToAdd\n )\n this.lastRefillTime = now\n }\n\n private async waitUntilTokensAvailable(tokens: number): Promise<void> {\n this.refillTokens()\n if (this.currentTokens >= tokens) {\n this.currentTokens -= tokens\n return\n }\n if (this.options?.debug) {\n console.log(\n colorLog.red(\n `Rate limiter: Waiting for ${tokens - this.currentTokens} tokens`\n )\n )\n }\n await new Promise((resolve) => setTimeout(resolve, 100)) // Wait for 100ms before checking again\n return this.waitUntilTokensAvailable(tokens) // Recursive call\n }\n\n public async acquire(tokens: number): Promise<void> {\n await this.waitUntilTokensAvailable(tokens)\n }\n}\n\n/**\n * Example usage of the rate limiter. Limits to 5800 tokens per minute.\nconst rateLimiter = new AxRateLimiterTokenUsage(5800, 5800 / 60);\n\nconst axRateLimiterFunction = async (func, info) => {\n const totalTokens = info.modelUsage?.totalTokens || 0;\n await rateLimiter.acquire(totalTokens);\n return func();\n};\n**/\n","export enum AxAIGroqModel {\n Llama3_8B = 'llama3-8b-8192',\n Llama33_70B = 'llama-3.3-70b-versatile',\n Mixtral_8x7B = 'mixtral-8x7b-32768',\n Gemma2_9B = 'gemma2-9b-it',\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIGroqModel } from './types.js'\n\n/**\n * AxAIGroq: Model information\n */\nexport const axModelInfoGroq: AxModelInfo[] = [\n {\n name: AxAIGroqModel.Gemma2_9B,\n currency: 'usd',\n characterIsToken: true,\n promptTokenCostPer1M: 0.2,\n completionTokenCostPer1M: 0.2,\n },\n {\n name: AxAIGroqModel.Llama33_70B,\n currency: 'usd',\n characterIsToken: true,\n promptTokenCostPer1M: 0.59,\n completionTokenCostPer1M: 0.79,\n },\n {\n name: AxAIGroqModel.Llama3_8B,\n currency: 'usd',\n characterIsToken: true,\n promptTokenCostPer1M: 0.05,\n completionTokenCostPer1M: 0.08,\n },\n {\n name: AxAIGroqModel.Mixtral_8x7B,\n currency: 'usd',\n characterIsToken: true,\n promptTokenCostPer1M: 0.24,\n completionTokenCostPer1M: 0.24,\n },\n]\n","import { AxRateLimiterTokenUsage } from '../../util/rate-limit.js'\nimport { axBaseAIDefaultConfig } from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\nimport type { AxAIServiceOptions, AxRateLimiterFunction } from '../types.js'\n\nimport { axModelInfoGroq } from './info.js'\nimport { AxAIGroqModel } from './types.js'\n\ntype AxAIGroqAIConfig = AxAIOpenAIConfig<AxAIGroqModel, undefined>\n\nconst axAIGroqDefaultConfig = (): AxAIGroqAIConfig =>\n structuredClone({\n model: AxAIGroqModel.Llama33_70B,\n ...axBaseAIDefaultConfig(),\n })\n\nexport type AxAIGroqArgs = AxAIOpenAIArgs<'groq', AxAIGroqModel, undefined> & {\n options?: Readonly<AxAIServiceOptions> & { tokensPerMinute?: number }\n}\n\nexport class AxAIGroq extends AxAIOpenAIBase<AxAIGroqModel, undefined> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIGroqArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Groq API key not set')\n }\n const _config = {\n ...axAIGroqDefaultConfig(),\n ...config,\n }\n\n const _options = {\n ...options,\n streamingUsage: false,\n }\n\n super({\n apiKey,\n config: _config,\n options: _options,\n modelInfo: axModelInfoGroq,\n apiURL: 'https://api.groq.com/openai/v1',\n models,\n })\n\n super.setName('Groq')\n this.setOptions(_options)\n }\n\n override setOptions = (options: Readonly<AxAIServiceOptions>) => {\n const rateLimiter = this.newRateLimiter(options)\n super.setOptions({ ...options, rateLimiter })\n }\n\n private newRateLimiter = (options: Readonly<AxAIGroqArgs['options']>) => {\n if (options?.rateLimiter) {\n return options.rateLimiter\n }\n\n const tokensPerMin = options?.tokensPerMinute ?? 4800\n const rt = new AxRateLimiterTokenUsage(tokensPerMin, tokensPerMin / 60, {\n debug: options?.debug,\n })\n\n const rtFunc: AxRateLimiterFunction = async (func, info) => {\n const totalTokens = info.modelUsage?.totalTokens || 0\n await rt.acquire(totalTokens)\n return await func()\n }\n\n return rtFunc\n }\n}\n","import type { AxModelInfo } from '../types.js'\n\n/**\n * HuggingFace: Model information\n */\nexport const axModelInfoHuggingFace: AxModelInfo[] = []\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIHuggingFaceModel {\n MetaLlama270BChatHF = 'meta-llama/Llama-2-70b-chat-hf',\n}\n\nexport type AxAIHuggingFaceConfig = AxModelConfig & {\n model: AxAIHuggingFaceModel\n returnFullText?: boolean\n doSample?: boolean\n maxTime?: number\n useCache?: boolean\n waitForModel?: boolean\n}\n\nexport type AxAIHuggingFaceRequest = {\n model: AxAIHuggingFaceModel\n inputs: string\n parameters: {\n max_new_tokens?: number\n repetition_penalty?: number\n temperature?: number\n top_p?: number\n top_k?: number\n return_full_text?: boolean\n num_return_sequences?: number\n do_sample?: boolean\n max_time?: number\n }\n options?: {\n use_cache?: boolean\n wait_for_model?: boolean\n }\n}\n\nexport type AxAIHuggingFaceResponse = {\n generated_text: string\n}\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport type {\n AxAIInputModelList,\n AxAIPromptConfig,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatResponse,\n AxInternalChatRequest,\n AxModelConfig,\n} from '../types.js'\n\nimport { axModelInfoHuggingFace } from './info.js'\nimport {\n type AxAIHuggingFaceConfig,\n AxAIHuggingFaceModel,\n type AxAIHuggingFaceRequest,\n type AxAIHuggingFaceResponse,\n} from './types.js'\n\nexport const axAIHuggingFaceDefaultConfig = (): AxAIHuggingFaceConfig =>\n structuredClone({\n model: AxAIHuggingFaceModel.MetaLlama270BChatHF,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIHuggingFaceCreativeConfig = (): AxAIHuggingFaceConfig =>\n structuredClone({\n model: AxAIHuggingFaceModel.MetaLlama270BChatHF,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport interface AxAIHuggingFaceArgs {\n name: 'huggingface'\n apiKey: string\n config?: Readonly<Partial<AxAIHuggingFaceConfig>>\n options?: Readonly<AxAIServiceOptions>\n models?: AxAIInputModelList<AxAIHuggingFaceModel>\n}\n\nclass AxAIHuggingFaceImpl\n implements\n AxAIServiceImpl<\n AxAIHuggingFaceModel,\n unknown,\n AxAIHuggingFaceRequest,\n unknown,\n AxAIHuggingFaceResponse,\n unknown,\n unknown\n >\n{\n constructor(private config: AxAIHuggingFaceConfig) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n topK: config.topK,\n n: config.n,\n presencePenalty: config.presencePenalty,\n } as AxModelConfig\n }\n\n createChatReq = (\n req: Readonly<AxInternalChatRequest<AxAIHuggingFaceModel>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _config: Readonly<AxAIPromptConfig>\n ): [AxAPI, AxAIHuggingFaceRequest] => {\n const model = req.model\n\n const functionsList = req.functions\n ? `Functions:\\n${JSON.stringify(req.functions, null, 2)}\\n`\n : ''\n\n const prompt = req.chatPrompt\n ?.map((msg) => {\n switch (msg.role) {\n case 'user':\n return `User: ${msg.content}`\n case 'system':\n return `System: ${msg.content}`\n case 'function':\n return `Function Result: ${msg.result}`\n case 'assistant': {\n const fc = msg.functionCalls\n ?.map((fc) => {\n const args =\n typeof fc.function.params === 'string'\n ? fc.function.params\n : JSON.stringify(fc.function.params)\n\n return `${fc.function.name}(${args})`\n })\n .join('\\n')\n if (fc) {\n return `Assistant: ${msg.content}\\n Functions:\\n${fc}`\n }\n return `Assistant: ${msg.content}`\n }\n default:\n throw new Error(`Unknown role`)\n }\n\n //return `${msg.role}: ${msg.content}`;\n })\n .join('\\n')\n\n const inputs = `${functionsList} ${prompt}`.trim()\n\n const apiConfig = {\n name: '/models',\n }\n\n const reqValue: AxAIHuggingFaceRequest = {\n model,\n inputs,\n parameters: {\n max_new_tokens: req.modelConfig?.maxTokens ?? this.config.maxTokens,\n repetition_penalty:\n req.modelConfig?.presencePenalty ?? this.config.presencePenalty,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n top_p: req.modelConfig?.topP ?? this.config.topP,\n top_k: req.modelConfig?.topK ?? this.config.topK,\n return_full_text: this.config.returnFullText,\n num_return_sequences: this.config.n,\n do_sample: this.config.doSample,\n max_time: this.config.maxTime,\n },\n options: {\n use_cache: this.config.useCache,\n wait_for_model: this.config.waitForModel,\n },\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (\n resp: Readonly<AxAIHuggingFaceResponse>\n ): AxChatResponse => {\n return {\n results: [\n {\n content: resp.generated_text,\n },\n ],\n }\n }\n}\n\nexport class AxAIHuggingFace extends AxBaseAI<\n AxAIHuggingFaceModel,\n unknown,\n AxAIHuggingFaceRequest,\n unknown,\n AxAIHuggingFaceResponse,\n unknown,\n unknown\n> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIHuggingFaceArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('HuggingFace API key not set')\n }\n const _config = {\n ...axAIHuggingFaceDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAIHuggingFaceImpl(_config)\n\n super(aiImpl, {\n name: 'HuggingFace',\n apiURL: 'https://api-inference.huggingface.co',\n headers: async () => ({ Authorization: `Bearer ${apiKey}` }),\n modelInfo: axModelInfoHuggingFace,\n defaults: { model: _config.model },\n options,\n supportFor: { functions: false, streaming: false },\n models,\n })\n }\n}\n","// cspell:ignore mistral, mixtral, codestral, nemo\n\nexport enum AxAIMistralModel {\n Mistral7B = 'open-mistral-7b',\n Mistral8x7B = 'open-mixtral-8x7b',\n MistralSmall = 'mistral-small-latest',\n MistralNemo = 'mistral-nemo-latest',\n MistralLarge = 'mistral-large-latest',\n Codestral = 'codestral-latest',\n OpenCodestralMamba = 'open-codestral-mamba',\n OpenMistralNemo = 'open-mistral-nemo-latest',\n}\n\nexport enum AxAIMistralEmbedModels {\n MistralEmbed = 'mistral-embed',\n}\n","// cspell:ignore mistral, mixtral, codestral, nemo\n\nimport type { AxModelInfo } from '../types.js'\n\nimport { AxAIMistralModel } from './types.js'\n\nexport const axModelInfoMistral: AxModelInfo[] = [\n {\n name: AxAIMistralModel.Mistral7B,\n currency: 'USD',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 0.25,\n },\n {\n name: AxAIMistralModel.Mistral8x7B,\n currency: 'USD',\n promptTokenCostPer1M: 0.7,\n completionTokenCostPer1M: 0.7,\n },\n {\n name: AxAIMistralModel.MistralNemo,\n currency: 'USD',\n promptTokenCostPer1M: 0.15,\n completionTokenCostPer1M: 0.15,\n },\n {\n name: AxAIMistralModel.MistralSmall,\n currency: 'USD',\n promptTokenCostPer1M: 0.2,\n completionTokenCostPer1M: 0.6,\n },\n {\n name: AxAIMistralModel.MistralLarge,\n currency: 'USD',\n promptTokenCostPer1M: 2,\n completionTokenCostPer1M: 6,\n },\n {\n name: AxAIMistralModel.Codestral,\n currency: 'USD',\n promptTokenCostPer1M: 0.2,\n completionTokenCostPer1M: 0.6,\n },\n {\n name: AxAIMistralModel.OpenCodestralMamba,\n currency: 'USD',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 0.25,\n },\n {\n name: AxAIMistralModel.OpenMistralNemo,\n currency: 'USD',\n promptTokenCostPer1M: 0.3,\n completionTokenCostPer1M: 0.3,\n },\n]\n","import { axBaseAIDefaultConfig } from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\nimport type { AxAIServiceOptions } from '../types.js'\n\nimport { axModelInfoMistral } from './info.js'\nimport { AxAIMistralEmbedModels, AxAIMistralModel } from './types.js'\n\ntype AxAIMistralConfig = AxAIOpenAIConfig<\n AxAIMistralModel,\n AxAIMistralEmbedModels\n>\n\nexport const axAIMistralDefaultConfig = (): AxAIMistralConfig =>\n structuredClone({\n model: AxAIMistralModel.MistralSmall,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIMistralBestConfig = (): AxAIMistralConfig =>\n structuredClone({\n ...axAIMistralDefaultConfig(),\n model: AxAIMistralModel.MistralLarge,\n })\n\nexport type AxAIMistralArgs = AxAIOpenAIArgs<\n 'mistral',\n AxAIMistralModel,\n AxAIMistralEmbedModels\n> & {\n options?: Readonly<AxAIServiceOptions> & { tokensPerMinute?: number }\n}\n\nexport class AxAIMistral extends AxAIOpenAIBase<\n AxAIMistralModel,\n AxAIMistralEmbedModels\n> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIMistralArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Mistral API key not set')\n }\n const _config = {\n ...axAIMistralDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n config: _config,\n options,\n apiURL: 'https://api.mistral.ai/v1',\n modelInfo: axModelInfoMistral,\n models,\n })\n\n super.setName('Mistral')\n }\n}\n","import {\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\n\nexport type AxAIOllamaAIConfig = AxAIOpenAIConfig<string, string>\n\nexport const axAIOllamaDefaultConfig = (): AxAIOllamaAIConfig =>\n structuredClone({\n ...axBaseAIDefaultConfig(),\n model: 'nous-hermes2',\n embedModel: 'all-minilm',\n })\n\nexport const axAIOllamaDefaultCreativeConfig = (): AxAIOllamaAIConfig =>\n structuredClone({\n ...axBaseAIDefaultCreativeConfig(),\n model: 'nous-hermes2',\n embedModel: 'all-minilm',\n })\n\nexport type AxAIOllamaArgs = AxAIOpenAIArgs<'ollama', string, string> & {\n model?: string\n embedModel?: string\n url?: string\n}\n\n/**\n * OllamaAI: AI Service\n */\nexport class AxAIOllama extends AxAIOpenAIBase<string, string> {\n constructor({\n apiKey = 'not-set',\n url = 'http://localhost:11434/v1',\n config,\n options,\n models,\n }: Readonly<Omit<AxAIOllamaArgs, 'name'>>) {\n const _config = {\n ...axAIOllamaDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n options,\n config: _config,\n apiURL: url,\n models,\n modelInfo: [],\n })\n\n super.setName('Ollama')\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIRekaModel {\n RekaCore = 'reka-core',\n RekaFlash = 'reka-flash',\n RekaEdge = 'reka-edge',\n}\n\nexport type AxAIRekaConfig = Omit<AxModelConfig, 'topK'> & {\n model: AxAIRekaModel\n stop?: readonly string[]\n useSearchEngine?: boolean\n}\n\nexport type AxAIRekaUsage = {\n input_tokens: number\n output_tokens: number\n}\n\nexport type AxAIRekaChatRequest = {\n model: string\n messages: (\n | {\n role: 'user'\n content:\n | string\n | {\n type: 'text'\n text: string\n }[]\n }\n | {\n role: 'assistant'\n content:\n | string\n | {\n type: 'text'\n text: string\n }[]\n }\n )[]\n usage?: AxAIRekaUsage\n response_format?: { type: string }\n max_tokens: number\n temperature?: number\n top_p?: number\n top_k?: number\n stream?: boolean\n stop?: readonly string[]\n presence_penalty?: number\n frequency_penalty?: number\n use_search_engine?: boolean\n}\n\nexport type AxAIRekaChatResponse = {\n id: string\n model: string\n responses: {\n message: {\n content:\n | string\n | {\n type: 'text'\n text: string\n }\n }\n finish_reason: 'stop' | 'length' | 'context'\n }[]\n usage?: AxAIRekaUsage\n}\n\nexport type AxAIRekaChatResponseDelta = {\n id: string\n model: string\n responses: {\n chunk: AxAIRekaChatResponse['responses'][0]['message']\n finish_reason: AxAIRekaChatResponse['responses'][0]['finish_reason']\n }[]\n usage?: AxAIRekaUsage\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIRekaModel } from './types.js'\n/**\n * OpenAI: Model information\n */\nexport const axModelInfoReka: AxModelInfo[] = [\n {\n name: AxAIRekaModel.RekaCore,\n currency: 'usd',\n promptTokenCostPer1M: 3,\n completionTokenCostPer1M: 15,\n },\n {\n name: AxAIRekaModel.RekaFlash,\n currency: 'usd',\n promptTokenCostPer1M: 0.8,\n completionTokenCostPer1M: 2,\n },\n {\n name: AxAIRekaModel.RekaEdge,\n currency: 'usd',\n promptTokenCostPer1M: 0.4,\n completionTokenCostPer1M: 1,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport type {\n AxAIInputModelList,\n AxAIPromptConfig,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxInternalChatRequest,\n AxModelConfig,\n AxModelInfo,\n} from '../types.js'\n\nimport { axModelInfoReka } from './info.js'\nimport {\n type AxAIRekaChatRequest,\n type AxAIRekaChatResponse,\n type AxAIRekaChatResponseDelta,\n type AxAIRekaConfig,\n AxAIRekaModel,\n} from './types.js'\n\nexport const axAIRekaDefaultConfig = (): AxAIRekaConfig =>\n structuredClone({\n model: AxAIRekaModel.RekaCore,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIRekaBestConfig = (): AxAIRekaConfig =>\n structuredClone({\n ...axAIRekaDefaultConfig(),\n model: AxAIRekaModel.RekaCore,\n })\n\nexport const axAIRekaCreativeConfig = (): AxAIRekaConfig =>\n structuredClone({\n model: AxAIRekaModel.RekaCore,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport const axAIRekaFastConfig = (): AxAIRekaConfig => ({\n ...axAIRekaDefaultConfig(),\n model: AxAIRekaModel.RekaFlash,\n})\n\nexport interface AxAIRekaArgs {\n name: 'reka'\n apiKey: string\n apiURL?: string\n config?: Readonly<Partial<AxAIRekaConfig>>\n options?: Readonly<AxAIServiceOptions & { streamingUsage?: boolean }>\n modelInfo?: Readonly<AxModelInfo[]>\n models?: AxAIInputModelList<AxAIRekaModel>\n}\n\nclass AxAIRekaImpl\n implements\n AxAIServiceImpl<\n AxAIRekaModel,\n undefined,\n AxAIRekaChatRequest,\n unknown,\n AxAIRekaChatResponse,\n AxAIRekaChatResponseDelta,\n unknown\n >\n{\n constructor(private config: AxAIRekaConfig) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n presencePenalty: config.presencePenalty,\n frequencyPenalty: config.frequencyPenalty,\n stopSequences: config.stopSequences,\n topP: config.topP,\n n: config.n,\n stream: config.stream,\n }\n }\n\n createChatReq = (\n req: Readonly<AxInternalChatRequest<AxAIRekaModel>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _config: Readonly<AxAIPromptConfig>\n ): [AxAPI, AxAIRekaChatRequest] => {\n const model = req.model\n\n if (!req.chatPrompt || req.chatPrompt.length === 0) {\n throw new Error('Chat prompt is empty')\n }\n\n const apiConfig = {\n name: '/chat/completions',\n }\n\n const messages = createMessages(req)\n\n const frequencyPenalty =\n req.modelConfig?.frequencyPenalty ?? this.config.frequencyPenalty\n\n const stream = req.modelConfig?.stream ?? this.config.stream\n\n const reqValue: AxAIRekaChatRequest = {\n model,\n messages,\n max_tokens: req.modelConfig?.maxTokens ?? this.config.maxTokens ?? 500,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n top_k: req.modelConfig?.n ?? this.config.n,\n top_p: req.modelConfig?.topP ?? this.config.topP ?? 1,\n stop: req.modelConfig?.stopSequences ?? this.config.stop,\n presence_penalty:\n req.modelConfig?.presencePenalty ?? this.config.presencePenalty,\n ...(frequencyPenalty ? { frequency_penalty: frequencyPenalty } : {}),\n ...(stream ? { stream: true } : {}),\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (resp: Readonly<AxAIRekaChatResponse>): AxChatResponse => {\n const { id, usage, responses } = resp\n\n const modelUsage = usage\n ? {\n promptTokens: usage.input_tokens,\n completionTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n }\n : undefined\n\n const results = responses.map((res) => {\n const finishReason = mapFinishReason(res.finish_reason)\n let content\n if (typeof res.message.content === 'string') {\n content = res.message.content\n } else {\n content = res.message.content.text\n }\n\n return {\n id: `${id}`,\n content,\n finishReason,\n }\n })\n\n return {\n modelUsage,\n results,\n remoteId: id,\n }\n }\n\n createChatStreamResp = (\n resp: Readonly<AxAIRekaChatResponseDelta>\n ): AxChatResponse => {\n const { id, usage, responses } = resp\n\n const modelUsage = usage\n ? {\n promptTokens: usage.input_tokens,\n completionTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n }\n : undefined\n\n const results = responses.map((res) => {\n const finishReason = mapFinishReason(res.finish_reason)\n let content\n if (typeof res.chunk.content === 'string') {\n content = res.chunk.content\n } else {\n content = res.chunk.content.text\n }\n\n return {\n id: `${id}`,\n content,\n finishReason,\n }\n })\n\n return {\n results,\n modelUsage,\n }\n }\n}\n\nconst mapFinishReason = (\n finishReason: AxAIRekaChatResponse['responses'][0]['finish_reason']\n): AxChatResponseResult['finishReason'] => {\n switch (finishReason) {\n case 'stop':\n return 'stop' as const\n case 'context':\n return 'length' as const\n case 'length':\n return 'length' as const\n }\n}\n\nfunction createMessages(\n req: Readonly<AxChatRequest>\n): AxAIRekaChatRequest['messages'] {\n return req.chatPrompt.map((msg) => {\n switch (msg.role) {\n case 'system':\n return { role: 'user' as const, content: msg.content }\n\n case 'user':\n if (Array.isArray(msg.content)) {\n return {\n role: 'user' as const,\n content: msg.content.map((c) => {\n switch (c.type) {\n case 'text':\n return { type: 'text' as const, text: c.text }\n case 'image': {\n throw new Error('Image type not supported')\n }\n default:\n throw new Error('Invalid content type')\n }\n }),\n }\n }\n return { role: 'user' as const, content: msg.content }\n\n case 'assistant':\n if (Array.isArray(msg.content)) {\n return {\n role: 'assistant' as const,\n content: msg.content.map((c) => {\n switch (c.type) {\n case 'text':\n return { type: 'text' as const, text: c.text }\n case 'image': {\n throw new Error('Image type not supported')\n }\n default:\n throw new Error('Invalid content type')\n }\n }),\n }\n }\n if (!msg.content) {\n throw new Error('Assistant content is empty')\n }\n return { role: 'user' as const, content: msg.content }\n default:\n throw new Error('Invalid role')\n }\n })\n}\n\nexport class AxAIReka extends AxBaseAI<\n AxAIRekaModel,\n undefined,\n AxAIRekaChatRequest,\n unknown,\n AxAIRekaChatResponse,\n AxAIRekaChatResponseDelta,\n unknown\n> {\n constructor({\n apiKey,\n config,\n options,\n apiURL,\n modelInfo = axModelInfoReka,\n models,\n }: Readonly<Omit<AxAIRekaArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Reka API key not set')\n }\n const _config = {\n ...axAIRekaDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAIRekaImpl(_config)\n\n super(aiImpl, {\n name: 'Reka',\n apiURL: apiURL ? apiURL : 'https://api.reka.ai/v1/chat',\n headers: async () => ({ 'X-Api-Key': apiKey }),\n modelInfo,\n defaults: {\n model: _config.model,\n },\n options,\n supportFor: { functions: true, streaming: true },\n models,\n })\n }\n}\n","import type { AxModelInfo } from '../types.js'\n\nexport const axModelInfoTogether: AxModelInfo[] = []\n","import { axBaseAIDefaultConfig } from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\n\nimport { axModelInfoTogether } from './info.js'\n\ntype TogetherAIConfig = AxAIOpenAIConfig<string, unknown>\n\nexport const axAITogetherDefaultConfig = (): TogetherAIConfig =>\n structuredClone({\n // cspell:disable-next-line\n model: 'mistralai/Mixtral-8x7B-Instruct-v0.1',\n ...axBaseAIDefaultConfig(),\n })\n\nexport type AxAITogetherArgs = AxAIOpenAIArgs<'together', string, unknown>\n\nexport class AxAITogether extends AxAIOpenAIBase<string, unknown> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAITogetherArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Together API key not set')\n }\n const _config = {\n ...axAITogetherDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n config: _config,\n options,\n apiURL: 'https://api.together.xyz/v1',\n modelInfo: axModelInfoTogether,\n models,\n })\n\n super.setName('Together')\n }\n}\n","import type { ReadableStream } from 'stream/web'\n\nimport { AxAIAnthropic, type AxAIAnthropicArgs } from './anthropic/api.js'\nimport type { AxAIAnthropicModel } from './anthropic/types.js'\nimport {\n AxAIAzureOpenAI,\n type AxAIAzureOpenAIArgs,\n} from './azure-openai/api.js'\nimport { AxAICohere, type AxAICohereArgs } from './cohere/api.js'\nimport type { AxAICohereEmbedModel, AxAICohereModel } from './cohere/types.js'\nimport { AxAIDeepSeek, type AxAIDeepSeekArgs } from './deepseek/api.js'\nimport type { AxAIDeepSeekModel } from './deepseek/types.js'\nimport {\n AxAIGoogleGemini,\n type AxAIGoogleGeminiArgs,\n} from './google-gemini/api.js'\nimport type {\n AxAIGoogleGeminiEmbedModel,\n AxAIGoogleGeminiModel,\n} from './google-gemini/types.js'\nimport { AxAIGroq, type AxAIGroqArgs } from './groq/api.js'\nimport type { AxAIGroqModel } from './groq/types.js'\nimport { AxAIHuggingFace, type AxAIHuggingFaceArgs } from './huggingface/api.js'\nimport type { AxAIHuggingFaceModel } from './huggingface/types.js'\nimport { AxAIMistral, type AxAIMistralArgs } from './mistral/api.js'\nimport type { AxAIMistralModel } from './mistral/types.js'\nimport { AxAIOllama, type AxAIOllamaArgs } from './ollama/api.js'\nimport {\n AxAIOpenAI,\n type AxAIOpenAIArgs as AxAIOpenAIArgs,\n} from './openai/api.js'\nimport type { AxAIOpenAIEmbedModel, AxAIOpenAIModel } from './openai/types.js'\nimport { AxAIReka, type AxAIRekaArgs } from './reka/api.js'\nimport { AxAITogether, type AxAITogetherArgs } from './together/api.js'\nimport type {\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n} from './types.js'\n\nexport type AxAIArgs =\n | AxAIOpenAIArgs\n | AxAIAzureOpenAIArgs\n | AxAITogetherArgs\n | AxAIAnthropicArgs\n | AxAIGroqArgs\n | AxAIGoogleGeminiArgs\n | AxAICohereArgs\n | AxAIHuggingFaceArgs\n | AxAIMistralArgs\n | AxAIDeepSeekArgs\n | AxAIOllamaArgs\n | AxAIRekaArgs\n\nexport type AxAIModels =\n | AxAIOpenAIModel\n | AxAIAnthropicModel\n | AxAIGroqModel\n | AxAIGoogleGeminiModel\n | AxAICohereModel\n | AxAIHuggingFaceModel\n | AxAIMistralModel\n | AxAIDeepSeekModel\n\nexport type AxAIEmbedModels =\n | AxAIOpenAIEmbedModel\n | AxAIGoogleGeminiEmbedModel\n | AxAICohereEmbedModel\n\nexport class AxAI implements AxAIService {\n private ai: AxAIService\n\n constructor(options: Readonly<AxAIArgs>) {\n switch (options.name) {\n case 'openai':\n this.ai = new AxAIOpenAI(options)\n break\n case 'azure-openai':\n this.ai = new AxAIAzureOpenAI(options)\n break\n case 'huggingface':\n this.ai = new AxAIHuggingFace(options)\n break\n case 'groq':\n this.ai = new AxAIGroq(options)\n break\n case 'together':\n this.ai = new AxAITogether(options)\n break\n case 'cohere':\n this.ai = new AxAICohere(options)\n break\n case 'google-gemini':\n this.ai = new AxAIGoogleGemini(options)\n break\n case 'anthropic':\n this.ai = new AxAIAnthropic(options)\n break\n case 'mistral':\n this.ai = new AxAIMistral(options)\n break\n case 'deepseek':\n this.ai = new AxAIDeepSeek(options)\n break\n case 'ollama':\n this.ai = new AxAIOllama(options)\n break\n case 'reka':\n this.ai = new AxAIReka(options)\n break\n default:\n throw new Error(`Unknown AI`)\n }\n }\n\n getName(): string {\n return this.ai.getName()\n }\n\n getId(): string {\n return this.ai.getId()\n }\n\n getFeatures(model?: string): { functions: boolean; streaming: boolean } {\n return this.ai.getFeatures(model)\n }\n getModelList(): AxAIModelList | undefined {\n return this.ai.getModelList() as AxAIModelList | undefined\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n return this.ai.getDefaultModels()\n }\n\n getMetrics(): AxAIServiceMetrics {\n return this.ai.getMetrics()\n }\n\n async chat(\n req: Readonly<AxChatRequest>,\n options?: Readonly<AxAIPromptConfig & AxAIServiceActionOptions>\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n return await this.ai.chat(req, options)\n }\n\n async embed(\n req: Readonly<AxEmbedRequest>,\n options?: Readonly<AxAIServiceActionOptions & AxAIServiceActionOptions>\n ): Promise<AxEmbedResponse> {\n return await this.ai.embed(req, options)\n }\n\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n this.ai.setOptions(options)\n }\n\n getOptions(): Readonly<AxAIServiceOptions> {\n return this.ai.getOptions()\n }\n}\n","import { ReadableStream } from 'node:stream/web'\n\nimport { type Span, SpanKind, type Tracer } from '@opentelemetry/api'\n\nimport type {\n AxAIService,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxFunction,\n AxRateLimiterFunction,\n} from '../ai/types.js'\nimport { mergeFunctionCalls } from '../ai/util.js'\nimport { AxMemory } from '../mem/memory.js'\nimport type { AxAIMemory } from '../mem/types.js'\nimport { AxAIServiceStreamTerminatedError } from '../util/apicall.js'\n\nimport {\n assertAssertions,\n assertStreamingAssertions,\n type AxAssertion,\n AxAssertionError,\n type AxStreamingAssertion,\n} from './asserts.js'\nimport {\n type extractionState,\n extractValues,\n streamingExtractFinalValue,\n streamingExtractValues,\n streamValues,\n} from './extract.js'\nimport {\n type AxFieldProcessor,\n processFieldProcessors,\n processStreamingFieldProcessors,\n} from './fieldProcessor.js'\nimport {\n type AxChatResponseFunctionCall,\n type AxInputFunctionType,\n parseFunctionCalls,\n parseFunctions,\n processFunctions,\n} from './functions.js'\nimport {\n type AxGenIn,\n type AxGenOut,\n type AxProgramForwardOptions,\n type AxProgramStreamingForwardOptions,\n AxProgramWithSignature,\n} from './program.js'\nimport { AxPromptTemplate } from './prompt.js'\nimport type { AxIField, AxSignature } from './sig.js'\nimport { mergeDeltas } from './util.js'\nimport { handleValidationError, ValidationError } from './validate.js'\n\nexport interface AxGenOptions {\n maxRetries?: number\n maxSteps?: number\n mem?: AxAIMemory\n tracer?: Tracer\n rateLimiter?: AxRateLimiterFunction\n stream?: boolean\n description?: string\n\n functions?: AxInputFunctionType\n functionCall?: AxChatRequest['functionCall']\n stopFunction?: string\n promptTemplate?: typeof AxPromptTemplate\n asserts?: AxAssertion[]\n streamingAsserts?: AxStreamingAssertion[]\n fastFail?: boolean\n}\n\nexport type AxGenerateResult<OUT extends AxGenOut> = OUT & {\n functions?: AxChatResponseFunctionCall[]\n}\n\nexport interface AxResponseHandlerArgs<T> {\n ai: Readonly<AxAIService>\n model?: string\n res: T\n usageInfo: { ai: string; model: string }\n mem: AxAIMemory\n sessionId?: string\n traceId?: string\n functions?: Readonly<AxFunction[]>\n fastFail?: boolean\n}\n\nexport interface AxStreamingEvent<T> {\n event: 'delta' | 'done' | 'error'\n data: {\n contentDelta?: string\n partialValues?: Partial<T>\n error?: string\n functions?: AxChatResponseFunctionCall[]\n }\n}\n\nexport class AxGen<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenerateResult<AxGenOut> = AxGenerateResult<AxGenOut>,\n> extends AxProgramWithSignature<IN, OUT> {\n private promptTemplate: AxPromptTemplate\n private asserts: AxAssertion[]\n private streamingAsserts: AxStreamingAssertion[]\n private options?: Omit<AxGenOptions, 'functions'>\n private functions?: AxFunction[]\n private functionsExecuted: Set<string> = new Set<string>()\n private fieldProcessors: AxFieldProcessor[] = []\n private streamingFieldProcessors: AxFieldProcessor[] = []\n\n constructor(\n signature: Readonly<AxSignature | string>,\n options?: Readonly<AxGenOptions>\n ) {\n super(signature, { description: options?.description })\n\n this.options = options\n this.promptTemplate = new (options?.promptTemplate ?? AxPromptTemplate)(\n this.signature,\n options?.functions\n )\n this.asserts = this.options?.asserts ?? []\n this.streamingAsserts = this.options?.streamingAsserts ?? []\n this.usage = []\n\n if (options?.functions) {\n this.functions = parseFunctions(options.functions)\n }\n }\n\n public addAssert = (fn: AxAssertion['fn'], message?: string) => {\n this.asserts.push({ fn, message })\n }\n\n public addStreamingAssert = (\n fieldName: string,\n fn: AxStreamingAssertion['fn'],\n message?: string\n ) => {\n this.streamingAsserts.push({ fieldName, fn, message })\n }\n\n private addFieldProcessorInternal = (\n fieldName: string,\n fn: AxFieldProcessor['process'],\n streaming = false\n ) => {\n const field = this.signature\n .getOutputFields()\n .find((f) => f.name === fieldName)\n\n if (!field) {\n throw new Error(`addFieldProcessor: field ${fieldName} not found`)\n }\n\n if (streaming) {\n const ft = field.type?.name\n const isText = !ft || ft === 'string' || ft === 'code'\n\n if (!isText) {\n throw new Error(\n `addFieldProcessor: field ${fieldName} is must be a text field`\n )\n }\n this.streamingFieldProcessors.push({ field, process: fn })\n } else {\n this.fieldProcessors.push({ field, process: fn })\n }\n }\n\n public addStreamingFieldProcessor = (\n fieldName: string,\n fn: AxFieldProcessor['process']\n ) => {\n this.addFieldProcessorInternal(fieldName, fn, true)\n }\n\n public addFieldProcessor = (\n fieldName: string,\n fn: AxFieldProcessor['process']\n ) => {\n this.addFieldProcessorInternal(fieldName, fn, false)\n }\n\n private async forwardSendRequest({\n ai,\n mem,\n options,\n }: Readonly<{\n ai: Readonly<AxAIService>\n mem: AxAIMemory\n options?: Omit<AxProgramForwardOptions, 'ai' | 'mem'>\n }>) {\n const {\n sessionId,\n traceId,\n modelConfig,\n model,\n rateLimiter,\n stream,\n functions: _functions,\n functionCall: _functionCall,\n } = options ?? {}\n\n const chatPrompt = mem?.history(sessionId) ?? []\n\n if (chatPrompt.length === 0) {\n throw new Error('No chat prompt found')\n }\n\n // biome-ignore lint/complexity/useFlatMap: you cannot use flatMap here\n const functions = _functions\n ?.map((f) => ('toFunction' in f ? f.toFunction() : f))\n ?.flat()\n\n const functionCall = _functionCall ?? this.options?.functionCall\n\n const res = await ai.chat(\n {\n chatPrompt,\n functions,\n functionCall,\n modelConfig,\n model,\n },\n {\n sessionId,\n traceId,\n rateLimiter,\n stream,\n debug: false,\n }\n )\n\n return res\n }\n\n private async *forwardCore({\n ai,\n mem,\n options,\n }: Readonly<{\n ai: Readonly<AxAIService>\n mem: AxAIMemory\n options: Omit<AxProgramForwardOptions, 'ai' | 'mem'>\n }>) {\n const { sessionId, traceId, model, functions: _functions } = options ?? {}\n const fastFail = options?.fastFail ?? this.options?.fastFail\n\n const modelName = model ?? ai.getDefaultModels().model\n const usageInfo = {\n ai: ai.getName(),\n model: modelName,\n }\n\n // biome-ignore lint/complexity/useFlatMap: you cannot use flatMap here\n const functions = _functions\n ?.map((f) => ('toFunction' in f ? f.toFunction() : f))\n ?.flat()\n\n const res = await this.forwardSendRequest({\n ai,\n mem,\n options,\n })\n\n if (res instanceof ReadableStream) {\n yield* this.processStreamingResponse({\n ai,\n model,\n res,\n usageInfo,\n mem,\n traceId,\n sessionId,\n functions,\n fastFail,\n })\n } else {\n yield await this.processResponse({\n ai,\n model,\n res,\n usageInfo,\n mem,\n traceId,\n sessionId,\n functions,\n })\n }\n }\n\n private async *processStreamingResponse({\n ai,\n model,\n res,\n usageInfo,\n mem,\n sessionId,\n traceId,\n functions,\n fastFail,\n }: Readonly<AxResponseHandlerArgs<ReadableStream<AxChatResponse>>>) {\n const streamingValidation =\n fastFail ?? ai.getFeatures().functionCot !== true\n const functionCalls: NonNullable<AxChatResponseResult['functionCalls']> = []\n const values = {}\n const xstate: extractionState = {\n extractedFields: [],\n streamedIndex: {},\n s: -1,\n }\n\n let content = ''\n\n for await (const v of res) {\n const result = v.results[0]\n if (!result) {\n continue\n }\n\n if (v.modelUsage) {\n this.usage.push({ ...usageInfo, ...v.modelUsage })\n }\n\n if (result.functionCalls) {\n mergeFunctionCalls(functionCalls, result.functionCalls)\n mem.updateResult(\n {\n name: result.name,\n content,\n functionCalls,\n delta: result.functionCalls?.[0]?.function?.params as string,\n },\n sessionId\n )\n } else if (result.content) {\n content += result.content\n mem.updateResult(\n { name: result.name, content, delta: result.content },\n sessionId\n )\n\n const skip = streamingExtractValues(\n this.signature,\n values,\n xstate,\n content,\n streamingValidation\n )\n\n if (skip) {\n continue\n }\n\n if (this.streamingAsserts.length !== 0) {\n await assertStreamingAssertions(\n this.streamingAsserts,\n xstate,\n content\n )\n }\n\n if (this.streamingFieldProcessors.length !== 0) {\n await processStreamingFieldProcessors(\n this.streamingFieldProcessors,\n content,\n xstate,\n mem,\n values,\n sessionId\n )\n }\n\n yield* streamValues<OUT>(this.signature, content, values, xstate)\n\n await assertAssertions(this.asserts, values)\n }\n\n if (result.finishReason === 'length') {\n throw new Error('Max tokens reached before completion')\n }\n }\n\n const funcs = parseFunctionCalls(ai, functionCalls, values, model)\n if (funcs) {\n if (!functions) {\n throw new Error('Functions are not defined')\n }\n const fx = await processFunctions(\n ai,\n functions,\n funcs,\n mem,\n sessionId,\n traceId\n )\n this.functionsExecuted = new Set([...this.functionsExecuted, ...fx])\n } else {\n streamingExtractFinalValue(this.signature, values, xstate, content)\n\n await assertStreamingAssertions(\n this.streamingAsserts,\n xstate,\n content,\n true\n )\n await assertAssertions(this.asserts, values)\n\n if (this.fieldProcessors.length) {\n await processFieldProcessors(\n this.fieldProcessors,\n values,\n mem,\n sessionId\n )\n }\n\n if (this.streamingFieldProcessors.length !== 0) {\n await processStreamingFieldProcessors(\n this.streamingFieldProcessors,\n content,\n xstate,\n mem,\n values,\n sessionId,\n true\n )\n }\n\n yield* streamValues<OUT>(this.signature, content, values, xstate)\n }\n }\n\n private async processResponse({\n ai,\n res,\n usageInfo,\n mem,\n sessionId,\n traceId,\n functions,\n }: Readonly<AxResponseHandlerArgs<AxChatResponse>>): Promise<OUT> {\n const values = {}\n\n let results = res.results ?? []\n\n if (results.length > 1) {\n results = results.filter((r) => r.functionCalls)\n }\n\n for (const result of results) {\n if (res.modelUsage) {\n this.usage.push({ ...usageInfo, ...res.modelUsage })\n }\n\n mem.addResult(result, sessionId)\n\n if (result.functionCalls?.length) {\n const funcs = parseFunctionCalls(ai, result.functionCalls, values)\n if (funcs) {\n if (!functions) {\n throw new Error('Functions are not defined')\n }\n const fx = await processFunctions(\n ai,\n functions,\n funcs,\n mem,\n sessionId,\n traceId\n )\n this.functionsExecuted = new Set([...this.functionsExecuted, ...fx])\n }\n } else if (result.content) {\n extractValues(this.signature, values, result.content)\n await assertAssertions(this.asserts, values)\n\n if (this.fieldProcessors.length) {\n await processFieldProcessors(\n this.fieldProcessors,\n values,\n mem,\n sessionId\n )\n }\n }\n\n if (result.finishReason === 'length') {\n throw new Error('Max tokens reached before completion')\n }\n }\n\n // Strip out values whose signature fields have isInternal: true\n const publicValues: AxGenOut = { ...values }\n for (const field of this.signature.getOutputFields()) {\n if (field.isInternal) {\n delete publicValues[field.name]\n }\n }\n\n return { ...values } as unknown as OUT\n }\n\n private async *_forward2(\n ai: Readonly<AxAIService>,\n values: IN,\n options: Readonly<AxProgramForwardOptions>,\n span?: Span\n ) {\n const stopFunction = (\n options?.stopFunction ?? this.options?.stopFunction\n )?.toLowerCase()\n\n const maxRetries = options.maxRetries ?? this.options?.maxRetries ?? 10\n const maxSteps = options.maxSteps ?? this.options?.maxSteps ?? 10\n const debug = options.debug ?? ai.getOptions().debug\n const mem = options.mem ?? this.options?.mem ?? new AxMemory(10000, debug)\n\n let err: ValidationError | AxAssertionError | undefined\n\n if (options?.functions && options.functions.length > 0) {\n const promptTemplate = this.options?.promptTemplate ?? AxPromptTemplate\n this.promptTemplate = new promptTemplate(\n this.signature,\n options.functions\n )\n }\n\n const prompt = this.promptTemplate.render<IN>(values, {\n examples: this.examples,\n demos: this.demos,\n })\n\n mem.add(prompt, options?.sessionId)\n\n multiStepLoop: for (let n = 0; n < maxSteps; n++) {\n for (let errCount = 0; errCount < maxRetries; errCount++) {\n try {\n const generator = this.forwardCore({ options, ai, mem })\n for await (const delta of generator) {\n if (delta !== undefined) {\n yield { version: errCount, delta }\n }\n }\n\n const lastMemItem = mem.getLast(options?.sessionId)\n const shouldContinue = this.shouldContinueSteps(\n lastMemItem,\n stopFunction\n )\n\n if (shouldContinue) {\n continue multiStepLoop\n }\n\n if (debug) {\n process.stdout.write('\\n')\n }\n\n return\n } catch (e) {\n let errorFields: AxIField[] | undefined\n\n span?.recordException(e as Error)\n\n if (e instanceof ValidationError) {\n errorFields = e.getFixingInstructions()\n err = e\n } else if (e instanceof AxAssertionError) {\n const e1 = e as AxAssertionError\n errorFields = e1.getFixingInstructions()\n err = e\n } else if (e instanceof AxAIServiceStreamTerminatedError) {\n // Do nothing allow error correction to happen\n } else {\n throw e\n }\n\n if (errorFields) {\n handleValidationError(\n mem,\n errorFields,\n ai,\n this.promptTemplate,\n options.sessionId\n )\n }\n }\n }\n\n throw new Error(`Unable to fix validation error: ${err?.message}`)\n }\n\n throw new Error(`Max steps reached: ${maxSteps}`)\n }\n\n private shouldContinueSteps(\n lastMemItem: ReturnType<AxAIMemory['getLast']>,\n stopFunction: string | undefined\n ) {\n const stopFunctionExecuted =\n stopFunction && this.functionsExecuted.has(stopFunction)\n\n const isFunction = lastMemItem?.chat?.role === 'function'\n const isProcessor = lastMemItem?.tags\n ? lastMemItem.tags.some((tag) => tag === 'processor')\n : false\n\n if (isFunction && stopFunction && stopFunctionExecuted) {\n return false\n }\n\n if (isFunction || isProcessor) {\n return true\n }\n\n return false\n }\n\n public async *_forward1(\n ai: Readonly<AxAIService>,\n values: IN,\n options: Readonly<AxProgramForwardOptions>\n ) {\n const tracer = this.options?.tracer ?? options?.tracer\n\n let functions: AxFunction[] | undefined = this.functions\n\n if (options?.functions) {\n functions = parseFunctions(options.functions, this.functions)\n }\n\n if (!tracer) {\n yield* this._forward2(ai, values, {\n ...options,\n functions,\n })\n return\n }\n\n const funcNames = functions?.map((f) => f.name).join(',')\n\n const attributes = {\n 'generate.signature': this.signature.toString(),\n 'generate.functions': funcNames ?? '',\n }\n\n const span = tracer.startSpan('Generate', {\n kind: SpanKind.SERVER,\n attributes,\n })\n\n try {\n yield* this._forward2(\n ai,\n values,\n {\n ...options,\n functions,\n },\n span\n )\n } finally {\n span.end()\n }\n }\n\n public override async forward(\n ai: Readonly<AxAIService>,\n values: IN,\n options?: Readonly<AxProgramForwardOptions>\n ): Promise<OUT> {\n const generator = this._forward1(ai, values, {\n ...options,\n })\n\n let buffer = {} as Partial<OUT>\n let currentVersion = 0\n\n for await (const item of generator) {\n if (item.version !== currentVersion) {\n buffer = {}\n }\n currentVersion = item.version\n buffer = mergeDeltas(buffer, item.delta)\n }\n\n this.trace = { ...values, ...buffer }\n return buffer as OUT\n }\n\n override async *streamingForward(\n ai: Readonly<AxAIService>,\n values: IN,\n options?: Readonly<AxProgramStreamingForwardOptions>\n ) {\n yield* this._forward1(ai, values, {\n ...options,\n stream: true,\n })\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { createHash } from 'crypto'\n\nimport type { AxChatResponseResult, AxModelInfo } from './types.js'\n\nexport const findItemByNameOrAlias = (\n list: readonly AxModelInfo[],\n name: string\n): AxModelInfo | undefined => {\n for (const item of list) {\n if (item.name === name || item.aliases?.includes(name)) {\n return item\n }\n }\n return undefined\n}\n\nexport const uniqBy = <T>(\n array: readonly T[],\n uniqueField: (value: T) => unknown\n): T[] => {\n const uniqueValues = new Map()\n\n array.forEach((value: T) => {\n const field = uniqueField(value)\n\n if (!uniqueValues.has(field)) {\n uniqueValues.set(field, value)\n }\n })\n\n return Array.from(uniqueValues.values())\n}\n\nconst functionCallRe = /(\\w+)\\((.*)\\)/s\n\nexport const parseFunction = (\n value: string\n): { name: string; args?: string } | undefined => {\n let v: string[] | null\n\n // extract function calls\n if ((v = functionCallRe.exec(value)) !== null) {\n const name = v.at(1)?.trim()\n const args = v.at(2)?.trim()\n if (!name || name.length === 0) {\n throw new Error(`Invalid function format: ${value}`)\n }\n return { name, args }\n }\n return\n}\n\nexport interface mergeFunctionsState {\n lastId?: string\n}\n\nexport function mergeFunctionCalls(\n functionCalls: NonNullable<AxChatResponseResult['functionCalls']>,\n functionCallDeltas: Readonly<\n NonNullable<AxChatResponseResult['functionCalls']>\n >\n) {\n for (const _fc of functionCallDeltas) {\n const fc = functionCalls.find((fc) => fc.id === _fc.id)\n\n if (fc) {\n if (\n typeof _fc.function.name == 'string' &&\n _fc.function.name.length > 0\n ) {\n fc.function.name += _fc.function.name\n }\n\n if (\n typeof _fc.function.params == 'string' &&\n _fc.function.params.length > 0\n ) {\n fc.function.params += _fc.function.params\n }\n\n if (typeof _fc.function.params == 'object') {\n fc.function.params = _fc.function.params\n }\n } else {\n functionCalls.push(_fc)\n }\n }\n}\n\nexport const hashObject = (obj: object) => {\n const hash = createHash('sha256')\n hash.update(JSON.stringify(obj))\n return hash.digest('hex')\n}\n","import {\n logChatRequest,\n logChatRequestMessage,\n logResponseDelta,\n logResponseResult,\n} from '../ai/debug.js'\nimport type { AxChatRequest, AxChatResponseResult } from '../ai/types.js'\n\nimport type { AxAIMemory } from './types.js'\n\ntype MemoryData = {\n tags?: string[]\n chat: AxChatRequest['chatPrompt'][number]\n}[]\n\nconst defaultLimit = 10000\n\nexport class MemoryImpl {\n private data: MemoryData = []\n\n constructor(\n private limit = defaultLimit,\n private debug = false\n ) {\n if (limit <= 0) {\n throw Error(\"argument 'limit' must be greater than 0\")\n }\n }\n\n private addMemory(\n value: AxChatRequest['chatPrompt'][number] | AxChatRequest['chatPrompt']\n ): void {\n if (Array.isArray(value)) {\n this.data.push(...value.map((chat) => ({ chat: structuredClone(chat) })))\n } else {\n this.data.push({\n chat: structuredClone(value),\n })\n }\n\n if (this.data.length > this.limit) {\n const removeCount = this.data.length - this.limit\n this.data.splice(0, removeCount)\n }\n }\n\n add(\n value: AxChatRequest['chatPrompt'][number] | AxChatRequest['chatPrompt']\n ): void {\n this.addMemory(value)\n\n if (this.debug) {\n debugRequest(value)\n }\n }\n\n private addResultMessage({\n content,\n name,\n functionCalls,\n }: Readonly<AxChatResponseResult>): void {\n if (!content && (!functionCalls || functionCalls.length === 0)) {\n return\n }\n this.addMemory({ content, name, role: 'assistant', functionCalls })\n }\n\n addResult({\n content,\n name,\n functionCalls,\n }: Readonly<AxChatResponseResult>): void {\n this.addResultMessage({ content, name, functionCalls })\n\n if (this.debug) {\n debugResponse({ content, name, functionCalls })\n }\n }\n\n updateResult({\n content,\n name,\n functionCalls,\n delta,\n }: Readonly<AxChatResponseResult & { delta?: string }>): void {\n const lastItem = this.data.at(-1)\n\n if (!lastItem || lastItem.chat.role !== 'assistant') {\n this.addResultMessage({ content, name, functionCalls })\n } else {\n if ('content' in lastItem.chat && content) {\n lastItem.chat.content = content\n }\n if ('name' in lastItem.chat && name) {\n lastItem.chat.name = name\n }\n if ('functionCalls' in lastItem.chat && functionCalls) {\n lastItem.chat.functionCalls = functionCalls\n }\n }\n\n if (this.debug) {\n if (delta && typeof delta === 'string') {\n debugResponseDelta(delta)\n } else if (lastItem) {\n debugResponse({ content, name, functionCalls })\n }\n }\n }\n\n addTag(name: string): void {\n const lastItem = this.data.at(-1)\n if (!lastItem) {\n return\n }\n\n if (!lastItem.tags) {\n lastItem.tags = []\n }\n\n if (!lastItem.tags.includes(name)) {\n lastItem.tags.push(name)\n }\n }\n\n rewindToTag(name: string): AxChatRequest['chatPrompt'] {\n const tagIndex = this.data.findIndex((item) => item.tags?.includes(name))\n if (tagIndex === -1) {\n throw new Error(`Tag \"${name}\" not found`)\n }\n\n // Remove and return the tagged item and everything after it\n const removedItems = this.data.splice(tagIndex)\n return removedItems.map((item) => item.chat)\n }\n\n removeByTag(name: string): AxChatRequest['chatPrompt'] {\n const indices = this.data.reduce<number[]>((acc, item, index) => {\n if (item.tags?.includes(name)) {\n acc.push(index)\n }\n return acc\n }, [])\n\n if (indices.length === 0) {\n throw new Error(`No items found with tag \"${name}\"`)\n }\n\n return indices\n .reverse()\n .map((index) => this.data.splice(index, 1).at(0)?.chat)\n .filter(Boolean)\n .reverse() as AxChatRequest['chatPrompt']\n }\n\n history(): AxChatRequest['chatPrompt'] {\n return this.data.map((item) => item.chat)\n }\n\n getLast():\n | { chat: AxChatRequest['chatPrompt'][number]; tags?: string[] }\n | undefined {\n const lastItem = this.data.at(-1)\n if (!lastItem) return undefined\n // Merge the tags into the chat object so that consumers can inspect them.\n return {\n chat: lastItem.chat,\n tags: lastItem.tags,\n }\n }\n\n reset(): void {\n this.data = []\n }\n}\n\nexport class AxMemory implements AxAIMemory {\n private memories = new Map<string, MemoryImpl>()\n private defaultMemory: MemoryImpl\n\n constructor(\n private limit = defaultLimit,\n private debug = false\n ) {\n this.defaultMemory = new MemoryImpl(limit, debug)\n }\n\n private getMemory(sessionId?: string): MemoryImpl {\n if (!sessionId) {\n return this.defaultMemory\n }\n\n if (!this.memories.has(sessionId)) {\n this.memories.set(sessionId, new MemoryImpl(this.limit))\n }\n\n return this.memories.get(sessionId) as MemoryImpl\n }\n\n add(\n value: AxChatRequest['chatPrompt'][number] | AxChatRequest['chatPrompt'],\n sessionId?: string\n ): void {\n this.getMemory(sessionId).add(value)\n }\n\n addResult(result: Readonly<AxChatResponseResult>, sessionId?: string): void {\n this.getMemory(sessionId).addResult(result)\n }\n\n updateResult(\n result: Readonly<AxChatResponseResult>,\n sessionId?: string\n ): void {\n this.getMemory(sessionId).updateResult(result)\n }\n\n addTag(name: string, sessionId?: string) {\n this.getMemory(sessionId).addTag(name)\n }\n\n rewindToTag(name: string, sessionId?: string) {\n return this.getMemory(sessionId).rewindToTag(name)\n }\n\n history(sessionId?: string) {\n return this.getMemory(sessionId).history()\n }\n\n getLast(sessionId?: string) {\n return this.getMemory(sessionId).getLast()\n }\n\n reset(sessionId?: string): void {\n if (!sessionId) {\n this.defaultMemory.reset()\n } else {\n this.memories.set(sessionId, new MemoryImpl(this.limit))\n }\n }\n}\n\nfunction debugRequest(\n value: AxChatRequest['chatPrompt'][number] | AxChatRequest['chatPrompt']\n) {\n if (Array.isArray(value)) {\n logChatRequest(value)\n } else {\n logChatRequestMessage(value)\n }\n}\n\nfunction debugResponse(value: Readonly<AxChatResponseResult>) {\n logResponseResult(value)\n}\n\nfunction debugResponseDelta(delta: string) {\n logResponseDelta(delta)\n}\n","import type { extractionState } from './extract.js'\n\nexport interface AxAssertion {\n fn(\n values: Record<string, unknown>\n ): Promise<boolean | undefined> | boolean | undefined\n message?: string\n}\n\nexport interface AxStreamingAssertion {\n fieldName: string\n fn(content: string, done?: boolean): boolean | undefined\n message?: string\n}\n\nexport class AxAssertionError extends Error {\n constructor({\n message,\n }: Readonly<{\n message: string\n }>) {\n super(message)\n this.name = this.constructor.name\n }\n\n public getFixingInstructions = () => {\n const extraFields = []\n const message = this.message.trim()\n\n extraFields.push({\n name: 'error',\n title: 'Follow these instructions',\n description: message + (message.endsWith('.') ? '' : '.'),\n })\n\n return extraFields\n }\n}\n\nexport const assertAssertions = async (\n asserts: readonly AxAssertion[],\n values: Record<string, unknown>\n) => {\n for (const assert of asserts) {\n const { fn, message } = assert\n\n const res = await fn(values)\n if (res === undefined) {\n continue\n }\n\n if (!res) {\n if (!message) {\n throw new Error(`Assertion Failed: No message provided for assertion`)\n }\n throw new AxAssertionError({ message })\n }\n }\n}\n\nexport const assertStreamingAssertions = async (\n asserts: readonly AxStreamingAssertion[],\n xstate: Readonly<extractionState>,\n content: string,\n final: boolean = false\n) => {\n if (\n !xstate.currField ||\n xstate.s === -1 ||\n !asserts ||\n asserts.length === 0\n ) {\n return\n }\n\n const fieldAsserts = asserts.filter(\n (a) => a.fieldName === xstate.currField?.name\n )\n\n if (fieldAsserts.length === 0) {\n return\n }\n\n const currValue = content.substring(xstate.s)\n\n for (const assert of fieldAsserts) {\n const { message, fn } = assert\n\n const res = await fn(currValue, final)\n if (res === undefined) {\n continue\n }\n\n if (!res && message) {\n throw new AxAssertionError({ message })\n }\n }\n}\n","import moment from 'moment-timezone'\n\nimport type { AxField } from './sig.js'\nimport { ValidationError } from './validate.js'\n\nexport function parseLLMFriendlyDate(\n field: Readonly<AxField>,\n dateStr: string\n) {\n try {\n return _parseLLMFriendlyDate(dateStr)\n } catch (err) {\n const message = (err as Error).message\n throw new ValidationError({ fields: [field], message, value: dateStr })\n }\n}\n\nfunction _parseLLMFriendlyDate(dateStr: string) {\n // Validate the date string format\n if (!moment(dateStr, 'YYYY-MM-DD', true).isValid()) {\n throw new Error(\n 'Invalid date format. Please provide the date in \"YYYY-MM-DD\" format.'\n )\n }\n\n // Parse the date and create a UTC moment object at midnight\n const date = moment.utc(dateStr, 'YYYY-MM-DD').startOf('day')\n\n return date.toDate()\n}\n\nexport function parseLLMFriendlyDateTime(\n field: Readonly<AxField>,\n dateStr: string\n) {\n try {\n return _parseLLMFriendlyDateTime(dateStr)\n } catch (err) {\n const message = (err as Error).message\n throw new ValidationError({ fields: [field], message, value: dateStr })\n }\n}\n\nfunction _parseLLMFriendlyDateTime(dateTimeStr: string) {\n // Validate the date and time string format\n const dateTimeRegex = /^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}(?::\\d{2})?) (.+)$/\n const match = dateTimeStr.match(dateTimeRegex)\n if (!match) {\n throw new Error(\n 'Invalid date and time format. Please provide the date and time in \"YYYY-MM-DD HH:mm\" or \"YYYY-MM-DD HH:mm:ss\" format, followed by the timezone.'\n )\n }\n\n const [, dateTime, timeZone] = match\n\n if (!dateTime || !timeZone) {\n throw new Error(\n 'Invalid date and time format. Please provide the date and time in \"YYYY-MM-DD HH:mm\" or \"YYYY-MM-DD HH:mm:ss\" format, followed by the timezone.'\n )\n }\n\n // Try to parse the timezone\n const zone = moment.tz.zone(timeZone)\n\n // If still not found, throw an error\n if (!zone) {\n throw new Error(\n `Unrecognized time zone ${timeZone}. Please provide a valid time zone name, abbreviation, or offset. For example, \"America/New_York\", or \"EST\".`\n )\n }\n\n // Parse the date and time in the specified time zone\n const date = moment.tz(\n dateTime,\n ['YYYY-MM-DD HH:mm', 'YYYY-MM-DD HH:mm:ss'],\n zone.name\n )\n\n // Check if the date and time are valid\n if (!date.isValid()) {\n throw new Error(\n 'Invalid date and time values. Please ensure all components are correct.'\n )\n }\n\n // Convert to UTC\n return date.utc().toDate()\n}\n\nexport const formatDateWithTimezone = (date: Readonly<Date>) => {\n const momentDate = moment(date).utc()\n return momentDate.format(`YYYY-MM-DD HH:mm:ss UTC`)\n}\n","export class AxInstanceRegistry<T> {\n private reg: Set<T> // To track keys for iteration\n\n constructor() {\n this.reg = new Set()\n }\n\n register(instance: T): void {\n this.reg.add(instance)\n }\n\n *[Symbol.iterator]() {\n for (const key of this.reg) {\n yield key\n }\n }\n}\n","import { createHash } from 'crypto'\n\nimport type { AxFunctionJSONSchema } from '../ai/types.js'\n\nimport {\n type InputParsedField,\n type OutputParsedField,\n type ParsedSignature,\n parseSignature,\n} from './parser.js'\n\nexport interface AxField {\n name: string\n title?: string\n description?: string\n type?: {\n name:\n | 'string'\n | 'number'\n | 'boolean'\n | 'json'\n | 'image'\n | 'audio'\n | 'date'\n | 'datetime'\n | 'class'\n | 'code'\n isArray: boolean\n classes?: string[]\n }\n isOptional?: boolean\n isInternal?: boolean\n}\n\nexport type AxIField = Omit<AxField, 'title'> & { title: string }\n\nexport class AxSignature {\n private description?: string\n private inputFields: AxIField[]\n private outputFields: AxIField[]\n\n private sigHash: string\n private sigString: string\n\n constructor(signature?: Readonly<AxSignature | string>) {\n if (!signature) {\n this.inputFields = []\n this.outputFields = []\n this.sigHash = ''\n this.sigString = ''\n return\n }\n\n if (typeof signature === 'string') {\n let sig: ParsedSignature\n try {\n sig = parseSignature(signature)\n } catch (e) {\n throw new Error(\n `Invalid Signature: ${(e as Error).message} (${signature})`\n )\n }\n this.description = sig.desc\n this.inputFields = sig.inputs.map((v) => this.parseParsedField(v))\n this.outputFields = sig.outputs.map((v) => this.parseParsedField(v))\n ;[this.sigHash, this.sigString] = this.updateHash()\n } else if (signature instanceof AxSignature) {\n this.description = signature.getDescription()\n this.inputFields = structuredClone(\n signature.getInputFields()\n ) as AxIField[]\n this.outputFields = structuredClone(\n signature.getOutputFields()\n ) as AxIField[]\n this.sigHash = signature.hash()\n this.sigString = signature.toString()\n } else {\n throw new Error('invalid signature argument: ' + signature)\n }\n }\n\n private parseParsedField = (\n field: Readonly<InputParsedField | OutputParsedField>\n ): AxIField => {\n if (!field.name || field.name.length === 0) {\n throw new Error('Field name is required.')\n }\n\n const title = this.toTitle(field.name)\n return {\n name: field.name,\n title,\n description: 'desc' in field ? field.desc : undefined,\n type: field.type ?? { name: 'string', isArray: false },\n ...('isInternal' in field ? { isInternal: field.isInternal } : {}),\n ...('isOptional' in field ? { isOptional: field.isOptional } : {}),\n }\n }\n\n private parseField = (field: Readonly<AxField>): AxIField => {\n const title =\n !field.title || field.title.length === 0\n ? this.toTitle(field.name)\n : field.title\n\n if (field.type && (!field.type.name || field.type.name.length === 0)) {\n throw new Error('Field type name is required: ' + field.name)\n }\n\n return { ...field, title }\n }\n\n public setDescription = (desc: string) => {\n this.description = desc\n this.updateHash()\n }\n\n public addInputField = (field: Readonly<AxField>) => {\n this.inputFields.push(this.parseField(field))\n this.updateHash()\n }\n\n public addOutputField = (field: Readonly<AxField>) => {\n this.outputFields.push(this.parseField(field))\n this.updateHash()\n }\n\n public setInputFields = (fields: readonly AxField[]) => {\n this.inputFields = fields.map((v) => this.parseField(v))\n this.updateHash()\n }\n\n public setOutputFields = (fields: readonly AxField[]) => {\n this.outputFields = fields.map((v) => this.parseField(v))\n this.updateHash()\n }\n\n public getInputFields = (): Readonly<AxIField[]> => this.inputFields\n public getOutputFields = (): Readonly<AxIField[]> => this.outputFields\n public getDescription = () => this.description\n\n private toTitle = (name: string) => {\n let result = name.replace(/_/g, ' ')\n result = result.replace(/([A-Z]|[0-9]+)/g, ' $1').trim()\n return result.charAt(0).toUpperCase() + result.slice(1)\n }\n\n public toJSONSchema = (): AxFunctionJSONSchema => {\n const properties: Record<string, unknown> = {}\n const required: Array<string> = []\n\n for (const f of this.inputFields) {\n const type = f.type ? f.type.name : 'string'\n if (f.type?.isArray) {\n properties[f.name] = {\n description: f.description,\n type: 'array' as const,\n items: {\n type: type,\n description: f.description,\n },\n }\n } else {\n properties[f.name] = {\n description: f.description,\n type: type,\n }\n }\n\n if (!f.isOptional) {\n required.push(f.name)\n }\n }\n\n const schema = {\n type: 'object',\n properties: properties,\n required: required,\n }\n\n return schema as AxFunctionJSONSchema\n }\n\n private updateHash = (): [string, string] => {\n this.getInputFields().forEach((field) => {\n validateField(field)\n })\n this.getOutputFields().forEach((field) => {\n validateField(field)\n if (field.type?.name === 'image') {\n throw new Error('Image type is not supported in output fields.')\n }\n })\n\n this.sigHash = createHash('sha256')\n .update(this.description ?? '')\n .update(JSON.stringify(this.inputFields))\n .update(JSON.stringify(this.outputFields))\n .digest('hex')\n\n this.sigString = renderSignature(\n this.description,\n this.inputFields,\n this.outputFields\n )\n\n return [this.sigHash, this.sigString]\n }\n\n public hash = () => this.sigHash\n\n public toString = () => this.sigString\n}\n\nfunction renderField(field: Readonly<AxField>): string {\n let result = field.name\n if (field.isOptional) {\n result += '?'\n }\n if (field.type) {\n result += ':' + field.type.name\n if (field.type.isArray) {\n result += '[]'\n }\n }\n // Check if description exists and append it.\n if (field.description) {\n result += ` \"${field.description}\"`\n }\n return result\n}\n\nfunction renderSignature(\n description: string | undefined,\n inputFields: readonly AxField[],\n outputFields: readonly AxField[]\n): string {\n // Prepare the description part of the signature.\n const descriptionPart = description ? `\"${description}\"` : ''\n\n // Render each input field into a comma-separated list.\n const inputFieldsRendered = inputFields.map(renderField).join(', ')\n\n // Render each output field into a comma-separated list.\n const outputFieldsRendered = outputFields.map(renderField).join(', ')\n\n // Combine all parts into the final signature.\n return `${descriptionPart} ${inputFieldsRendered} -> ${outputFieldsRendered}`\n}\n\nfunction isValidCase(inputString: string): boolean {\n const camelCaseRegex = /^[a-z][a-zA-Z0-9]*$/\n const snakeCaseRegex = /^[a-z]+(_[a-z0-9]+)*$/\n\n return camelCaseRegex.test(inputString) || snakeCaseRegex.test(inputString)\n}\n\nfunction validateField(field: Readonly<AxField>): void {\n if (!field.name || field.name.length === 0) {\n throw new Error('Field name cannot be blank')\n }\n\n if (!isValidCase(field.name)) {\n throw new Error(\n `Invalid field name '${field.name}', it must be camel case or snake case: `\n )\n }\n\n if (\n [\n 'text',\n 'object',\n 'image',\n 'string',\n 'number',\n 'boolean',\n 'json',\n 'array',\n 'datetime',\n 'date',\n 'time',\n 'type',\n 'class',\n ].includes(field.name)\n ) {\n throw new Error(\n `Invalid field name '${field.name}', please make it more descriptive (eg. companyDescription)`\n )\n }\n}\n","// Updated type definitions\n\nexport type TypeNotClass =\n | 'string'\n | 'number'\n | 'boolean'\n | 'json'\n | 'image'\n | 'audio'\n | 'datetime'\n | 'date'\n | 'code'\nexport type Type = TypeNotClass | 'class'\nexport type ParsedIdentifier = string\nexport type ParsedString = string\n\nexport type ParsedSignature = {\n desc?: string\n inputs: InputParsedField[]\n outputs: OutputParsedField[]\n}\n\nexport type InputParsedField = {\n name: ParsedIdentifier\n desc?: string\n type?: { name: TypeNotClass; isArray: boolean }\n isOptional?: boolean\n}\n\nexport type OutputParsedField = {\n name: ParsedIdentifier\n desc?: string\n type?:\n | { name: TypeNotClass; isArray: boolean }\n | { name: 'class'; isArray: boolean; classes: string[] }\n isOptional?: boolean\n isInternal?: boolean\n}\n\nclass SignatureParser {\n private input: string\n private position: number\n private currentFieldName: string | null = null\n\n constructor(input: string) {\n this.input = input\n this.position = 0\n }\n\n parse(): ParsedSignature {\n try {\n this.skipWhitespace()\n const optionalDesc = this.parseParsedString()\n this.skipWhitespace()\n\n // Use the specialized input field parser\n const inputs = this.parseFieldList(\n this.parseInputField.bind(this),\n 'input'\n )\n this.skipWhitespace()\n\n if (this.position >= this.input.length) {\n throw new Error(\n 'Incomplete signature: Missing output section. Expected \"->\" followed by output fields'\n )\n }\n\n this.expect('->')\n this.skipWhitespace()\n\n if (this.position >= this.input.length) {\n throw new Error(\n 'Incomplete signature: No output fields specified after \"->\"'\n )\n }\n\n // Use the specialized output field parser\n const outputs = this.parseFieldList(\n this.parseOutputField.bind(this),\n 'output'\n )\n\n return {\n desc: optionalDesc?.trim(),\n inputs,\n outputs,\n }\n } catch (error) {\n // Add context about the position where the error occurred\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n const context = this.getErrorContext()\n throw new Error(`${errorMessage}\\n${context}`)\n }\n }\n\n private getErrorContext(): string {\n const start = Math.max(0, this.position - 20)\n const end = Math.min(this.input.length, this.position + 20)\n const before = this.input.slice(start, this.position)\n const after = this.input.slice(this.position, end)\n const pointer = ' '.repeat(before.length) + '^'\n\n return `Near position ${this.position}:\\n${before}${after}\\n${pointer}`\n }\n\n private parseFieldList<T extends InputParsedField | OutputParsedField>(\n parseFieldFn: () => T,\n section: 'input' | 'output'\n ): T[] {\n const fields: T[] = []\n this.skipWhitespace()\n\n if (this.position >= this.input.length) {\n throw new Error(`Empty ${section} section: Expected at least one field`)\n }\n\n // Parse first field\n try {\n fields.push(parseFieldFn())\n } catch (error) {\n throw new Error(\n `Invalid first ${section} field: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n )\n }\n\n this.skipWhitespace()\n\n // Parse remaining fields\n while (this.position < this.input.length) {\n if (\n this.input[this.position] === '-' &&\n this.input[this.position + 1] === '>'\n ) {\n break\n }\n\n if (this.match(',')) {\n this.skipWhitespace()\n if (this.position >= this.input.length) {\n throw new Error(\n `Unexpected end of input after comma in ${section} section`\n )\n }\n try {\n fields.push(parseFieldFn())\n } catch (error) {\n throw new Error(\n `Invalid ${section} field after comma: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n )\n }\n this.skipWhitespace()\n } else {\n break\n }\n }\n\n return fields\n }\n\n // -------------------------------\n // Parse input fields (no \"class\" type and no internal flag)\n // -------------------------------\n private parseInputField(): InputParsedField {\n this.skipWhitespace()\n const name = this.parseParsedIdentifier()\n this.currentFieldName = name\n\n // Only the optional marker is allowed\n let isOptional = undefined\n while (true) {\n if (this.match('?')) {\n isOptional = true\n continue\n }\n if (this.match('!')) {\n throw new Error(\n `Input field \"${name}\" does not support the internal marker \"!\"`\n )\n }\n break\n }\n\n let type: { name: TypeNotClass; isArray: boolean } | undefined\n this.skipWhitespace()\n if (this.match(':')) {\n this.skipWhitespace()\n // Disallow the \"class\" type in input fields\n if (/^class\\b/.test(this.input.slice(this.position))) {\n throw new Error(\n `Input field \"${name}\" does not support the \"class\" type`\n )\n } else {\n try {\n const typeName = this.parseTypeNotClass()\n const isArray = this.match('[]')\n type = { name: typeName, isArray }\n } catch (error) {\n throw new Error(\n `Input field \"${name}\": ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n )\n }\n }\n }\n\n this.skipWhitespace()\n const desc = this.parseParsedString()\n\n return {\n name,\n desc: desc?.trim(),\n type,\n isOptional,\n }\n }\n\n // -------------------------------\n // Parse output fields (supports both \"class\" type and the internal marker)\n // -------------------------------\n private parseOutputField(): OutputParsedField {\n this.skipWhitespace()\n const name = this.parseParsedIdentifier()\n this.currentFieldName = name\n\n let isOptional = false\n let isInternal = false\n while (true) {\n if (this.match('?')) {\n isOptional = true\n continue\n }\n if (this.match('!')) {\n isInternal = true\n continue\n }\n break\n }\n\n let type:\n | { name: TypeNotClass; isArray: boolean }\n | { name: 'class'; isArray: boolean; classes: string[] }\n | undefined\n this.skipWhitespace()\n if (this.match(':')) {\n this.skipWhitespace()\n if (this.match('class')) {\n const isArray = this.match('[]')\n this.skipWhitespace()\n const classNamesString = this.parseParsedString()\n if (!classNamesString) {\n throw new Error(\n `Output field \"${name}\": Expected class names in quotes after \"class\" type. Example: class \"MyClass1, MyClass2\"`\n )\n }\n const classes = classNamesString\n .split(/[,\\s]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n\n if (classes.length === 0) {\n throw new Error(\n `Output field \"${name}\": Empty class list provided. At least one class name is required`\n )\n }\n\n type = { name: 'class', isArray, classes }\n } else {\n try {\n const typeName = this.parseTypeNotClass()\n const isArray = this.match('[]')\n type = { name: typeName, isArray }\n } catch (error) {\n throw new Error(\n `Output field \"${name}\": ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n )\n }\n }\n }\n\n this.skipWhitespace()\n const desc = this.parseParsedString()\n\n return {\n name,\n desc: desc?.trim(),\n type,\n isOptional,\n isInternal,\n }\n }\n\n private parseTypeNotClass(): TypeNotClass {\n const types: TypeNotClass[] = [\n 'string',\n 'number',\n 'boolean',\n 'json',\n 'image',\n 'audio',\n 'datetime',\n 'date',\n 'code',\n ]\n\n const foundType = types.find((type) => this.match(type))\n if (!foundType) {\n const currentWord =\n this.input.slice(this.position).match(/^\\w+/)?.[0] || 'empty'\n throw new Error(\n `Invalid type \"${currentWord}\". Expected one of: ${types.join(', ')}`\n )\n }\n return foundType\n }\n\n private parseParsedIdentifier(): ParsedIdentifier {\n this.skipWhitespace()\n const match = /^[a-zA-Z_][a-zA-Z_0-9]*/.exec(\n this.input.slice(this.position)\n )\n if (match) {\n this.position += match[0].length\n return match[0]\n }\n\n const invalidMatch = /^\\S+/.exec(this.input.slice(this.position))\n const invalidId = invalidMatch ? invalidMatch[0] : 'empty'\n\n throw new Error(\n `Invalid identifier \"${invalidId}\". Identifiers must start with a letter or underscore and contain only letters, numbers, or underscores`\n )\n }\n\n private parseParsedString(): string | undefined {\n const quoteChars = [\"'\", '\"']\n for (const quoteChar of quoteChars) {\n if (this.match(quoteChar)) {\n let content = ''\n let escaped = false\n let startPos = this.position\n\n while (this.position < this.input.length) {\n const char = this.input[this.position]\n this.position++\n if (escaped) {\n content += char\n escaped = false\n } else if (char === '\\\\') {\n escaped = true\n } else if (char === quoteChar) {\n return content\n } else {\n content += char\n }\n }\n\n const partialString = this.input.slice(startPos, this.position)\n throw new Error(\n `Unterminated string starting at position ${startPos}: \"${partialString}...\"`\n )\n }\n }\n return undefined\n }\n\n private skipWhitespace() {\n const match = /^[\\s\\t\\r\\n]+/.exec(this.input.slice(this.position))\n if (match) {\n this.position += match[0].length\n }\n }\n\n private match(strOrRegex: string | RegExp): boolean {\n let match\n if (typeof strOrRegex === 'string') {\n if (this.input.startsWith(strOrRegex, this.position)) {\n this.position += strOrRegex.length\n return true\n }\n } else {\n match = strOrRegex.exec(this.input.slice(this.position))\n if (match) {\n this.position += match[0].length\n return true\n }\n }\n return false\n }\n\n private expect(str: string) {\n if (!this.match(str)) {\n const found = this.input.slice(this.position, this.position + 10)\n throw new Error(\n `Expected \"${str}\" but found \"${found}...\" at position ${this.position}`\n )\n }\n }\n}\n\nexport function parseSignature(input: string): ParsedSignature {\n const parser = new SignatureParser(input)\n return parser.parse()\n}\n","import { ColorLog } from '../util/log.js'\n\nimport type { AxExample, AxOptimizationStats } from './optimize.js'\nimport type { AxFieldValue, AxGenOut, AxProgramUsage } from './program.js'\nimport type { AxField } from './sig.js'\n\nconst colorLog = new ColorLog()\n\nexport const updateProgressBar = (\n current: number,\n total: number,\n success: number,\n elapsedTime: number, // in seconds\n msg: string,\n progressBarWidth = 20 // Default width of the progress bar\n): void => {\n const percentage = ((current / total) * 100).toFixed(1)\n const filledBarLength = Math.round((progressBarWidth * current) / total)\n const emptyBarLength = progressBarWidth - filledBarLength\n const filledBar = colorLog.blueBright('█'.repeat(filledBarLength))\n const emptyBar = ' '.repeat(emptyBarLength)\n const itemsPerSecond =\n elapsedTime > 0 ? (current / elapsedTime).toFixed(2) : '0.00'\n\n process.stdout.write(\n `\\r${msg}: ${current} / ${total} (${colorLog.yellow(percentage)}%): 100%|${filledBar}${emptyBar}| Success: ${success}/${total} [${colorLog.red(elapsedTime.toFixed(2))}, ${itemsPerSecond}it/s]`\n )\n}\n\nexport const validateValue = (\n field: Readonly<AxField>,\n value: Readonly<AxFieldValue>\n): void => {\n const ft = field.type ?? { name: 'string', isArray: false }\n\n const validateSingleValue = (\n expectedType: string,\n val: Readonly<AxFieldValue>\n ): boolean => {\n switch (expectedType) {\n case 'code':\n return typeof val === 'string'\n case 'string':\n return typeof val === 'string'\n case 'number':\n return typeof val === 'number'\n case 'boolean':\n return typeof val === 'boolean'\n case 'date':\n return val instanceof Date || typeof val === 'string'\n case 'datetime':\n return val instanceof Date || typeof val === 'string'\n case 'json':\n return typeof val === 'object' || typeof val === 'string'\n default:\n return false // Unknown or unsupported type\n }\n }\n\n const validImage = (val: Readonly<AxFieldValue>): boolean => {\n if (\n !val ||\n typeof val !== 'object' ||\n !('mimeType' in val) ||\n !('data' in val)\n ) {\n return false\n }\n return true\n }\n\n if (field.type?.name === 'image') {\n let msg: string | undefined\n if (Array.isArray(value)) {\n for (const item of value) {\n if (!validImage(item)) {\n msg = 'object ({ mimeType: string; data: string })'\n break\n }\n }\n } else if (!validImage(value)) {\n msg = 'object ({ mimeType: string; data: string })'\n }\n\n if (msg) {\n throw new Error(\n `Validation failed: Expected '${field.name}' to be a ${msg} instead got '${value}'`\n )\n }\n return\n }\n\n const validAudio = (val: Readonly<AxFieldValue>): boolean => {\n if (!val || typeof val !== 'object' || !('data' in val)) {\n return false\n }\n return true\n }\n\n if (field.type?.name === 'audio') {\n let msg: string | undefined\n if (Array.isArray(value)) {\n for (const item of value) {\n if (!validAudio(item)) {\n msg = 'object ({ data: string; format?: string })'\n break\n }\n }\n } else if (!validAudio(value)) {\n msg = 'object ({ data: string; format?: string })'\n }\n\n if (msg) {\n throw new Error(\n `Validation failed: Expected '${field.name}' to be a ${msg} instead got '${value}'`\n )\n }\n return\n }\n\n let isValid = true\n\n if (ft.isArray) {\n if (!Array.isArray(value)) {\n isValid = false\n } else {\n for (const item of value) {\n if (!validateSingleValue(ft.name, item)) {\n isValid = false\n break\n }\n }\n }\n } else {\n isValid = validateSingleValue(ft.name, value)\n }\n\n if (!isValid) {\n throw new Error(\n `Validation failed: Expected '${field.name}' to be a ${field.type?.isArray ? 'an array of ' : ''}${ft.name} instead got '${typeof value}' (${value})`\n )\n }\n}\n\nexport function mergeProgramUsage(\n usages: readonly AxProgramUsage[]\n): AxProgramUsage[] {\n const usageMap: { [key: string]: AxProgramUsage } = {}\n\n for (const usage of usages) {\n const key = `${usage.ai}:${usage.model}`\n\n if (!usageMap[key]) {\n usageMap[key] = { ...usage }\n continue\n }\n\n const currentUsage = usageMap[key]\n if (currentUsage) {\n currentUsage.promptTokens += usage.promptTokens\n currentUsage.completionTokens += usage.completionTokens\n currentUsage.totalTokens += usage.totalTokens\n }\n }\n\n return Object.values(usageMap)\n}\n\n/**\n * Parses a markdown list from a string. This is a very forgiving parser that\n * will try to handle anything that looks vaguely like a markdown list.\n */\nexport const parseMarkdownList = (input: string): string[] => {\n // Handle empty input\n if (!input.trim()) {\n return []\n }\n\n const listBullets = new Set(['-', '*', '+'])\n const numberedListRegex = /^\\d+[\\s]*[.)\\]]\\s*/\n\n const lines = input.split('\\n')\n const list = []\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n // Skip empty lines\n if (!trimmedLine) {\n continue\n }\n\n // Check for bullet points\n if (trimmedLine[0] && listBullets.has(trimmedLine[0])) {\n list.push(trimmedLine.slice(1).trim())\n }\n // Check for numbered lists (e.g., \"1.\", \"2.\", etc.)\n else if (numberedListRegex.test(trimmedLine)) {\n list.push(trimmedLine.replace(numberedListRegex, '').trim())\n }\n // If it's not a list item and we haven't collected any items yet, do nothing\n else if (list.length === 0) {\n // Skip non-list lines at the beginning\n }\n // If we've already started collecting list items, then this non-list line\n //is an error\n else {\n throw new Error('Could not parse markdown list: mixed content detected')\n }\n }\n\n // If we didn't find any list items, throw error\n if (list.length === 0) {\n throw new Error('Could not parse markdown list: no valid list items found')\n }\n\n return list\n}\n\nexport function mergeDeltas<OUT>(\n base: Partial<AxGenOut>,\n delta: Partial<AxGenOut>\n) {\n for (const key of Object.keys(delta)) {\n const baseValue = base[key]\n const deltaValue = delta[key]\n\n if (baseValue === undefined && Array.isArray(deltaValue)) {\n base[key] = [...deltaValue]\n } else if (Array.isArray(baseValue) && Array.isArray(deltaValue)) {\n // Concatenate arrays\n base[key] = [...(baseValue ?? []), ...deltaValue]\n } else if (\n (baseValue === undefined || typeof baseValue === 'string') &&\n typeof deltaValue === 'string'\n ) {\n // Concatenate strings\n base[key] = (baseValue ?? '') + deltaValue\n } else {\n // For all other types, overwrite with the new value\n base[key] = deltaValue\n }\n }\n return base as OUT\n}\n\nexport class LRUCache<K, V> {\n private cache = new Map<K, V>()\n private readonly maxSize: number\n\n constructor(maxSize: number) {\n this.maxSize = maxSize\n }\n\n get(key: K): V | undefined {\n const value = this.cache.get(key)\n if (value) {\n // Refresh position by deleting and re-adding\n this.cache.delete(key)\n this.cache.set(key, value)\n }\n return value\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n this.cache.delete(key)\n } else if (this.cache.size >= this.maxSize) {\n // Remove oldest entry (first item in map)\n const firstKey = this.cache.keys().next().value\n if (firstKey) {\n this.cache.delete(firstKey)\n }\n }\n this.cache.set(key, value)\n }\n}\n\nconst globalPrefixCache = new LRUCache<string, string[]>(500)\n\n/**\n * Checks if a streaming string matches a prefix, either fully or partially from the end.\n * For streaming content, partial matches are checked from shortest to longest since\n * the content grows at the end and we want to detect partial prefixes as they form.\n * @param content The string to check (potentially streaming)\n * @param prefix The prefix to look for\n * @param startIndex Optional starting index for the search\n * @returns\n * - index >= 0: Position of full match\n * - -1: No match found\n * - -2: Partial match from the end\n * - -3: String is only whitespace\n */\nexport function matchesContent(\n content: string,\n prefix: string,\n startIndex = 0,\n prefixCache: LRUCache<string, string[]> = globalPrefixCache\n): number {\n // Check if string starts with a markdown block with optional language\n if (/^```[a-zA-Z]*\\s*$/.test(content)) {\n return -4\n }\n\n // Check if string is only whitespace\n if (/^[\\s`]*$/.test(content)) {\n return -3\n }\n\n // First check if the complete prefix exists anywhere after startIndex\n const exactMatchIndex = content.indexOf(prefix, startIndex)\n if (exactMatchIndex !== -1) {\n return exactMatchIndex\n }\n\n // Get or create cached prefixes\n const prefixes =\n prefixCache.get(prefix) ??\n Array.from({ length: prefix.length }, (_, i) => prefix.slice(0, i + 1))\n\n // Set in cache if it wasn't there\n if (!prefixCache.get(prefix)) {\n prefixCache.set(prefix, prefixes)\n }\n\n // Get the content slice we'll check for partial matches\n const contentEnd = content.slice(\n Math.max(startIndex, content.length - prefix.length)\n )\n\n // Check for partial matches at the end, starting from shortest to longest\n // Skip the full prefix as it was already checked\n for (let i = 0; i < prefixes.length - 1; i++) {\n const partialPrefix = prefixes[i]\n if (partialPrefix && contentEnd.endsWith(partialPrefix)) {\n return -2\n }\n }\n\n return -1\n}\n\nexport const formatTime = (ms: number): string => {\n const seconds = Math.floor(ms / 1000)\n if (seconds < 60) return `${seconds}s`\n\n const minutes = Math.floor(seconds / 60)\n const remainingSeconds = seconds % 60\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`\n\n const hours = Math.floor(minutes / 60)\n const remainingMinutes = minutes % 60\n return `${hours}h ${remainingMinutes}m ${remainingSeconds}s`\n}\n\nexport const calculateETA = (\n current: number,\n total: number,\n elapsedMs: number\n): string => {\n if (current === 0) return 'calculating...'\n\n const msPerItem = elapsedMs / current\n const remainingItems = total - current\n const etaMs = msPerItem * remainingItems\n\n return formatTime(etaMs)\n}\n\ninterface ProgressConfigInfo {\n maxRounds: number\n batchSize: number\n earlyStoppingPatience: number\n costMonitoring: boolean\n verboseMode: boolean\n debugMode: boolean\n}\n\nexport const updateDetailedProgress = <T extends AxGenOut = AxGenOut>(\n roundIndex: number,\n current: number,\n total: number,\n elapsedTime: number,\n example: Readonly<AxExample>,\n stats: Readonly<AxOptimizationStats>,\n configInfo: Readonly<ProgressConfigInfo>,\n result?: T,\n error?: Error\n): void => {\n // Clear line and create a formatted output\n process.stdout.write('\\r\\x1b[K')\n\n const percentage = ((current / total) * 100).toFixed(1)\n const formattedTime = formatTime(elapsedTime)\n const itemsPerSecond =\n elapsedTime > 0 ? ((current / elapsedTime) * 1000).toFixed(2) : '0.00'\n const eta = calculateETA(current, total, elapsedTime)\n\n // Basic progress info (always shown)\n let output = `Round ${roundIndex + 1}/${configInfo.maxRounds}: ${current}/${total} (${percentage}%) [${formattedTime}, ${itemsPerSecond} it/s, ETA: ${eta}]`\n\n // Add success stats\n const successRate =\n stats.totalCalls > 0 ? (stats.successfulDemos / stats.totalCalls) * 100 : 0\n output += ` | Success: ${stats.successfulDemos}/${stats.totalCalls} (${successRate.toFixed(1)}%)`\n\n // Additional info for verbose mode\n if (configInfo.verboseMode || configInfo.debugMode) {\n if (configInfo.costMonitoring) {\n output += `\\n Tokens: ~${stats.estimatedTokenUsage.toLocaleString()} total`\n }\n\n output += `\\n Batch: ${Math.floor(current / configInfo.batchSize) + 1}/${Math.ceil(total / configInfo.batchSize)}`\n\n if (configInfo.earlyStoppingPatience > 0 && stats.earlyStopping) {\n output += `\\n Best round: ${stats.earlyStopping.bestScoreRound + 1}, Patience: ${configInfo.earlyStoppingPatience}`\n }\n }\n\n // Debug mode gets even more info\n if (configInfo.debugMode) {\n // Truncate example keys for display\n const exampleKeys = Object.keys(example)\n .map((k) => {\n const valueStr = JSON.stringify(example[k])\n const truncated =\n valueStr.length > 30 ? `${valueStr.substring(0, 30)}...` : valueStr\n return `${k}: ${truncated}`\n })\n .join(', ')\n\n output += `\\n Example: {${exampleKeys}}`\n\n if (error) {\n output += `\\n ERROR: ${error.message}`\n } else if (result) {\n // Truncate result for display\n const resultStr = JSON.stringify(result)\n const truncatedResult =\n resultStr.length > 50 ? `${resultStr.substring(0, 50)}...` : resultStr\n output += `\\n Result: ${truncatedResult}`\n }\n\n // Add temperature info\n output += `\\n Temperature: ${(0.7 + 0.001 * current).toFixed(3)}`\n }\n\n console.log(output)\n}\n","import type { Tracer } from '@opentelemetry/api'\n\nimport type {\n AxAIService,\n AxChatRequest,\n AxChatResponse,\n AxModelConfig,\n AxRateLimiterFunction,\n} from '../ai/types.js'\nimport type { AxAIMemory } from '../mem/types.js'\n\nimport type { AxInputFunctionType } from './functions.js'\nimport { AxInstanceRegistry } from './registry.js'\nimport { AxSignature } from './sig.js'\nimport { mergeProgramUsage, validateValue } from './util.js'\n\nexport type AxFieldValue =\n | string\n | string[]\n | number\n | boolean\n | object\n | null\n | undefined\n | { mimeType: string; data: string }\n | { mimeType: string; data: string }[]\n | { format?: 'wav'; data: string }\n | { format?: 'wav'; data: string }[]\n\nexport type AxGenIn = { [key: symbol]: AxFieldValue }\n\nexport type AxGenOut = Record<string, AxFieldValue>\n\nexport type AxProgramTrace = {\n // examples: Record<string, Value>[];\n trace: Record<string, AxFieldValue>\n programId: string\n}\n\nexport type AxProgramDemos = {\n // examples: Record<string, Value>[];\n traces: Record<string, AxFieldValue>[]\n programId: string\n}\n\nexport type AxProgramExamples = AxProgramDemos | AxProgramDemos['traces']\n\nexport type AxProgramForwardOptions = {\n maxRetries?: number\n maxSteps?: number\n mem?: AxAIMemory\n ai?: AxAIService\n modelConfig?: AxModelConfig\n model?: string\n sessionId?: string\n traceId?: string | undefined\n tracer?: Tracer\n rateLimiter?: AxRateLimiterFunction\n stream?: boolean\n functions?: AxInputFunctionType\n functionCall?: AxChatRequest['functionCall']\n stopFunction?: string\n fastFail?: boolean\n debug?: boolean\n}\n\nexport type AxProgramStreamingForwardOptions = Omit<\n AxProgramForwardOptions,\n 'stream'\n>\n\nexport type AxGenDeltaOut<OUT> = {\n version: number\n delta: Partial<OUT>\n}\n\nexport type AxGenStreamingOut<OUT> = AsyncGenerator<\n AxGenDeltaOut<OUT>,\n // biome-ignore lint/suspicious/noConfusingVoidType: just cause\n void | OUT,\n unknown\n>\n\nexport interface AxTunable {\n setExamples: (examples: Readonly<AxProgramExamples>) => void\n setId: (id: string) => void\n setParentId: (parentId: string) => void\n getTraces: () => AxProgramTrace[]\n setDemos: (demos: readonly AxProgramDemos[]) => void\n}\n\nexport interface AxUsable {\n getUsage: () => AxProgramUsage[]\n resetUsage: () => void\n}\n\nexport type AxProgramUsage = AxChatResponse['modelUsage'] & {\n ai: string\n model: string\n}\n\nexport interface AxProgramWithSignatureOptions {\n description?: string\n}\n\nexport class AxProgramWithSignature<IN extends AxGenIn, OUT extends AxGenOut>\n implements AxTunable, AxUsable\n{\n protected signature: AxSignature\n protected sigHash: string\n\n protected examples?: Record<string, AxFieldValue>[]\n protected demos?: Record<string, AxFieldValue>[]\n protected trace?: Record<string, AxFieldValue>\n protected usage: AxProgramUsage[] = []\n\n private key: { id: string; custom?: boolean }\n private children: AxInstanceRegistry<Readonly<AxTunable & AxUsable>>\n\n constructor(\n signature: Readonly<AxSignature | string>,\n options?: Readonly<AxProgramWithSignatureOptions>\n ) {\n this.signature = new AxSignature(signature)\n this.sigHash = this.signature?.hash()\n this.children = new AxInstanceRegistry()\n this.key = { id: this.constructor.name }\n\n if (options?.description) {\n this.signature.setDescription(options.description)\n }\n }\n\n public getSignature() {\n return this.signature\n }\n\n public register(prog: Readonly<AxTunable & AxUsable>) {\n if (this.key) {\n prog.setParentId(this.key.id)\n }\n this.children.register(prog)\n }\n\n public async forward(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _ai: Readonly<AxAIService>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _values: IN,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxProgramForwardOptions>\n ): Promise<OUT> {\n throw new Error('forward() not implemented')\n }\n\n // biome-ignore lint/correctness/useYield: just a placeholder\n public async *streamingForward(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _ai: Readonly<AxAIService>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _values: IN,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxProgramStreamingForwardOptions>\n ): AxGenStreamingOut<OUT> {\n throw new Error('streamingForward() not implemented')\n }\n\n public setId(id: string) {\n this.key = { id, custom: true }\n for (const child of this.children) {\n child.setParentId(id)\n }\n }\n\n public setParentId(parentId: string) {\n if (!this.key.custom) {\n this.key.id = [parentId, this.key.id].join('/')\n }\n }\n\n public setExamples(examples: Readonly<AxProgramExamples>) {\n this._setExamples(examples)\n\n if (!('programId' in examples)) {\n return\n }\n\n for (const child of this.children) {\n child.setExamples(examples)\n }\n }\n\n private _setExamples(examples: Readonly<AxProgramExamples>) {\n let traces: Record<string, AxFieldValue>[] = []\n\n if ('programId' in examples && examples.programId === this.key.id) {\n traces = examples.traces\n }\n\n if (Array.isArray(examples)) {\n traces = examples\n }\n\n if (traces) {\n const sig = this.signature\n const fields = [...sig.getInputFields(), ...sig.getOutputFields()]\n\n this.examples = traces.map((e) => {\n const res: Record<string, AxFieldValue> = {}\n for (const f of fields) {\n const value = e[f.name]\n if (value) {\n validateValue(f, value)\n res[f.name] = value\n }\n }\n return res\n })\n }\n }\n\n public getTraces(): AxProgramTrace[] {\n let traces: AxProgramTrace[] = []\n\n if (this.trace) {\n traces.push({ trace: this.trace, programId: this.key.id })\n }\n\n for (const child of this.children) {\n const _traces = child.getTraces()\n traces = [...traces, ..._traces]\n }\n return traces\n }\n\n public getUsage(): AxProgramUsage[] {\n let usage: AxProgramUsage[] = [...(this.usage ?? [])]\n\n for (const child of this.children) {\n const cu = child.getUsage()\n usage = [...usage, ...cu]\n }\n return mergeProgramUsage(usage)\n }\n\n public resetUsage() {\n this.usage = []\n for (const child of this.children) {\n child.resetUsage()\n }\n }\n\n public setDemos(demos: readonly AxProgramDemos[]) {\n // biome-ignore lint/complexity/useFlatMap: it can't\n this.demos = demos\n .filter((v) => v.programId === this.key.id)\n .map((v) => v.traces)\n .flat()\n\n for (const child of this.children) {\n child.setDemos(demos)\n }\n }\n}\n\nexport class AxProgram<IN extends AxGenIn, OUT extends AxGenOut>\n implements AxTunable, AxUsable\n{\n protected trace?: Record<string, AxFieldValue>\n protected usage: AxProgramUsage[] = []\n\n private key: { id: string; custom?: boolean }\n private children: AxInstanceRegistry<Readonly<AxTunable & AxUsable>>\n\n constructor() {\n this.children = new AxInstanceRegistry()\n this.key = { id: this.constructor.name }\n }\n\n public register(prog: Readonly<AxTunable & AxUsable>) {\n if (this.key) {\n prog.setParentId(this.key.id)\n }\n this.children.register(prog)\n }\n\n public async forward(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _ai: Readonly<AxAIService>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _values: IN,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxProgramForwardOptions>\n ): Promise<OUT> {\n throw new Error('forward() not implemented')\n }\n\n // biome-ignore lint/correctness/useYield: just a placeholder\n public async *streamingForward(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _ai: Readonly<AxAIService>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _values: IN,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxProgramStreamingForwardOptions>\n ): AxGenStreamingOut<OUT> {\n throw new Error('streamingForward() not implemented')\n }\n\n public setId(id: string) {\n this.key = { id, custom: true }\n for (const child of this.children) {\n child.setParentId(id)\n }\n }\n\n public setParentId(parentId: string) {\n if (!this.key.custom) {\n this.key.id = [parentId, this.key.id].join('/')\n }\n }\n\n public setExamples(examples: Readonly<AxProgramExamples>) {\n if (!('programId' in examples)) {\n return\n }\n\n for (const child of this.children) {\n child.setExamples(examples)\n }\n }\n\n public getTraces(): AxProgramTrace[] {\n let traces: AxProgramTrace[] = []\n\n if (this.trace) {\n traces.push({ trace: this.trace, programId: this.key.id })\n }\n\n for (const child of this.children) {\n const _traces = child.getTraces()\n traces = [...traces, ..._traces]\n }\n return traces\n }\n\n public getUsage(): AxProgramUsage[] {\n let usage: AxProgramUsage[] = [...(this.usage ?? [])]\n\n for (const child of this.children) {\n const cu = child.getUsage()\n usage = [...usage, ...cu]\n }\n return mergeProgramUsage(usage)\n }\n\n public resetUsage() {\n this.usage = []\n for (const child of this.children) {\n child.resetUsage()\n }\n }\n\n public setDemos(demos: readonly AxProgramDemos[]) {\n for (const child of this.children) {\n child.setDemos(demos)\n }\n }\n}\n","import type { AxChatRequest } from '../ai/types.js'\n\nimport { formatDateWithTimezone } from './datetime.js'\nimport type { AxInputFunctionType } from './functions.js'\nimport { type AxFieldValue } from './program.js'\nimport type { AxField, AxIField, AxSignature } from './sig.js'\nimport { validateValue } from './util.js'\n\ntype Writeable<T> = { -readonly [P in keyof T]: T[P] }\ntype AxChatRequestChatPrompt = Writeable<AxChatRequest['chatPrompt'][0]>\n\ntype ChatRequestUserMessage = Exclude<\n Extract<AxChatRequestChatPrompt, { role: 'user' }>['content'],\n string\n>\n\nconst functionCallInstructions = `\n## Function Call Instructions\n- Complete the task, using the functions defined earlier in this prompt. \n- Call functions step-by-step, using the output of one function as input to the next.\n- Use the function results to generate the output fields.`\n\nconst formattingRules = `\n## Strict Output Formatting Rules\n- Output must strictly follow the defined plain-text \\`field name: value\\` field format.\n- Output field, values must strictly adhere to the specified output field formatting rules.\n- Do not add any text before or after the output fields, just the field name and value.\n- Do not use code blocks.`\n\nexport type AxFieldTemplateFn = (\n field: Readonly<AxField>,\n value: Readonly<AxFieldValue>\n) => ChatRequestUserMessage\n\nexport class AxPromptTemplate {\n private sig: Readonly<AxSignature>\n private fieldTemplates?: Record<string, AxFieldTemplateFn>\n private task: { type: 'text'; text: string }\n\n constructor(\n sig: Readonly<AxSignature>,\n functions?: Readonly<AxInputFunctionType>,\n fieldTemplates?: Record<string, AxFieldTemplateFn>\n ) {\n this.sig = sig\n this.fieldTemplates = fieldTemplates\n\n const task = []\n\n const inArgs = renderDescFields(this.sig.getInputFields())\n const outArgs = renderDescFields(this.sig.getOutputFields())\n task.push(\n `You will be provided with the following fields: ${inArgs}. Your task is to generate new fields: ${outArgs}.`\n )\n\n // biome-ignore lint/complexity/useFlatMap: you cannot use flatMap here\n const funcs = functions\n ?.map((f) => ('toFunction' in f ? f.toFunction() : f))\n ?.flat()\n\n const funcList = funcs\n ?.map((fn) => `- \\`${fn.name}\\`: ${formatDescription(fn.description)}`)\n .join('\\n')\n\n if (funcList && funcList.length > 0) {\n task.push(`## Available Functions\\n${funcList}`)\n }\n\n const inputFields = renderInputFields(this.sig.getInputFields())\n task.push(`## Input Fields\\n${inputFields}`)\n\n const outputFields = renderOutputFields(this.sig.getOutputFields())\n task.push(`## Output Fields\\n${outputFields}`)\n\n if (funcList && funcList.length > 0) {\n task.push(functionCallInstructions.trim())\n }\n\n task.push(formattingRules.trim())\n\n const desc = this.sig.getDescription()\n if (desc) {\n const text = formatDescription(desc)\n task.push(text)\n }\n\n this.task = {\n type: 'text' as const,\n text: task.join('\\n\\n'),\n }\n }\n\n public render = <T extends Record<string, AxFieldValue>>(\n values: T,\n {\n examples,\n demos,\n }: Readonly<{\n skipSystemPrompt?: boolean\n examples?: Record<string, AxFieldValue>[]\n demos?: Record<string, AxFieldValue>[]\n }>\n ): AxChatRequest['chatPrompt'] => {\n const renderedExamples = examples\n ? [\n { type: 'text' as const, text: '\\n\\n## Examples\\n' },\n ...this.renderExamples(examples),\n ]\n : []\n\n const renderedDemos = demos ? this.renderDemos(demos) : []\n\n const completion = this.renderInputFields(values)\n\n // Check if demos and examples are all text type\n const allTextExamples = renderedExamples.every((v) => v.type === 'text')\n const allTextDemos = renderedDemos.every((v) => v.type === 'text')\n const examplesInSystemPrompt = allTextExamples && allTextDemos\n\n let systemContent = this.task.text\n\n if (examplesInSystemPrompt) {\n const combinedItems = [\n { type: 'text' as const, text: systemContent },\n ...renderedExamples,\n ...renderedDemos,\n ]\n combinedItems.reduce(combineConsecutiveStrings(''), [])\n\n if (combinedItems && combinedItems[0]) {\n systemContent = combinedItems[0].text\n }\n }\n\n const systemPrompt = {\n role: 'system' as const,\n content: systemContent,\n }\n\n const promptList: ChatRequestUserMessage = examplesInSystemPrompt\n ? completion\n : [...renderedExamples, ...renderedDemos, ...completion]\n\n const prompt = promptList.filter((v) => v !== undefined)\n\n const userContent = prompt.every((v) => v.type === 'text')\n ? prompt.map((v) => v.text).join('\\n')\n : prompt.reduce(combineConsecutiveStrings('\\n'), [])\n\n const userPrompt = {\n role: 'user' as const,\n content: userContent,\n }\n\n return [systemPrompt, userPrompt]\n }\n\n public renderExtraFields = (extraFields: readonly AxIField[]) => {\n const prompt: ChatRequestUserMessage = []\n\n if (!extraFields || extraFields.length === 0) {\n return prompt\n }\n\n // First, group fields by title\n const groupedFields = extraFields.reduce(\n (acc, field) => {\n const title = field.title\n if (!acc[title]) {\n acc[title] = []\n }\n acc[title].push(field)\n return acc\n },\n {} as Record<string, AxIField[]>\n )\n\n // Convert grouped fields into formatted data\n const formattedGroupedFields = Object.entries(groupedFields)\n .map(([title, fields]) => {\n if (fields.length === 1) {\n // Single field case\n const field = fields[0]!\n return {\n title,\n name: field.name,\n description: field.description,\n }\n } else if (fields.length > 1) {\n // Multiple fields case - format as markdown list\n const valuesList = fields\n .map((field) => `- ${field.description}`)\n .join('\\n')\n return {\n title,\n name: fields[0]!.name,\n description: valuesList,\n }\n }\n })\n .filter(Boolean) as AxIField[]\n\n // Now render each formatted group using the appropriate template\n formattedGroupedFields.forEach((field) => {\n const fn = this.fieldTemplates?.[field.name] ?? this.defaultRenderInField\n prompt.push(...fn(field, field.description))\n })\n\n return prompt\n }\n\n private renderExamples = (data: Readonly<Record<string, AxFieldValue>[]>) => {\n const list: ChatRequestUserMessage = []\n\n for (const [index, item] of data.entries()) {\n const renderedInputItem = this.sig\n .getInputFields()\n .map((field) => this.renderInField(field, item, true))\n .filter((v) => v !== undefined)\n .flat()\n\n const renderedOutputItem = this.sig\n .getOutputFields()\n .map((field) => this.renderInField(field, item, true))\n .filter((v) => v !== undefined)\n .flat()\n\n if (renderedOutputItem.length === 0) {\n throw new Error(\n `Output fields are required in examples: index: ${index}, data: ${JSON.stringify(item)}`\n )\n }\n\n const renderedItem = [...renderedInputItem, ...renderedOutputItem]\n\n if (\n index > 0 &&\n renderedItem.length > 0 &&\n renderedItem[0]?.type === 'text'\n ) {\n list.push({ type: 'text' as const, text: '---\\n\\n' })\n }\n\n renderedItem.forEach((v) => {\n if ('text' in v) {\n v.text = v.text + '\\n'\n }\n if ('image' in v) {\n v.image = v.image\n }\n list.push(v)\n })\n }\n\n return list\n }\n\n private renderDemos = (data: Readonly<Record<string, AxFieldValue>[]>) => {\n const list: ChatRequestUserMessage = []\n\n const fields = [...this.sig.getInputFields(), ...this.sig.getOutputFields()]\n\n for (const item of data) {\n const renderedItem = fields\n .map((field) => this.renderInField(field, item, true))\n .filter((v) => v !== undefined)\n .flat()\n\n renderedItem.slice(0, -1).forEach((v) => {\n if ('text' in v) {\n v.text = v.text + '\\n'\n }\n if ('image' in v) {\n v.image = v.image\n }\n list.push(v)\n })\n }\n\n return list\n }\n\n private renderInputFields = <T extends Record<string, AxFieldValue>>(\n values: T\n ) => {\n const renderedItems = this.sig\n .getInputFields()\n .map((field) => this.renderInField(field, values))\n .filter((v) => v !== undefined)\n .flat()\n\n renderedItems\n .filter((v) => v.type === 'text')\n .forEach((v) => {\n v.text = v.text + '\\n'\n })\n\n return renderedItems\n }\n\n private renderInField = (\n field: Readonly<AxField>,\n values: Readonly<Record<string, AxFieldValue>>,\n skipMissing?: boolean\n ) => {\n const value = values[field.name]\n\n if (skipMissing && !value) {\n return\n }\n\n if (isEmptyValue(field, value)) {\n return\n }\n\n if (field.type) {\n validateValue(field, value!)\n }\n\n const processedValue = processValue(field, value!)\n\n const textFieldFn: AxFieldTemplateFn =\n this.fieldTemplates?.[field.name] ?? this.defaultRenderInField\n\n return textFieldFn(field, processedValue)\n }\n\n private defaultRenderInField = (\n field: Readonly<AxField>,\n value: Readonly<AxFieldValue>\n ): ChatRequestUserMessage => {\n if (field.type?.name === 'image') {\n const validateImage = (\n value: Readonly<AxFieldValue>\n ): { mimeType: string; data: string } => {\n if (!value) {\n throw new Error('Image field value is required.')\n }\n\n if (typeof value !== 'object') {\n throw new Error('Image field value must be an object.')\n }\n if (!('mimeType' in value)) {\n throw new Error('Image field must have mimeType')\n }\n if (!('data' in value)) {\n throw new Error('Image field must have data')\n }\n return value\n }\n\n let result: ChatRequestUserMessage = [\n { type: 'text', text: `${field.title}: ` as string },\n ]\n\n if (field.type.isArray) {\n if (!Array.isArray(value)) {\n throw new Error('Image field value must be an array.')\n }\n result = result.concat(\n value.map((v) => {\n v = validateImage(v)\n return {\n type: 'image',\n mimeType: v.mimeType,\n image: v.data,\n }\n })\n )\n } else {\n const v = validateImage(value)\n result.push({\n type: 'image',\n mimeType: v.mimeType,\n image: v.data,\n })\n }\n return result\n }\n\n if (field.type?.name === 'audio') {\n const validateAudio = (\n value: Readonly<AxFieldValue>\n ): { format?: 'wav'; data: string } => {\n if (!value) {\n throw new Error('Audio field value is required.')\n }\n\n if (typeof value !== 'object') {\n throw new Error('Audio field value must be an object.')\n }\n if (!('data' in value)) {\n throw new Error('Audio field must have data')\n }\n return value\n }\n\n let result: ChatRequestUserMessage = [\n { type: 'text', text: `${field.title}: ` as string },\n ]\n\n if (field.type.isArray) {\n if (!Array.isArray(value)) {\n throw new Error('Image field value must be an array.')\n }\n result = result.concat(\n value.map((v) => {\n v = validateAudio(v)\n return {\n type: 'audio',\n format: v.format ?? 'wav',\n data: v.data,\n }\n })\n )\n } else {\n const v = validateAudio(value)\n result.push({\n type: 'audio',\n format: v.format ?? 'wav',\n data: v.data,\n })\n }\n return result\n }\n\n const text = [field.title, ': ']\n\n if (Array.isArray(value)) {\n text.push('\\n')\n text.push(value.map((v) => `- ${v}`).join('\\n'))\n } else {\n text.push(value as string)\n }\n return [{ type: 'text', text: text.join('') }]\n }\n}\n\nconst renderDescFields = (list: readonly AxField[]) =>\n list.map((v) => `\\`${v.title}\\``).join(', ')\n\nconst renderInputFields = (fields: readonly AxField[]) => {\n // Transform each field into table row\n const rows = fields.map((field) => {\n const name = field.title\n const type = field.type?.name ? toFieldType(field.type) : 'string'\n\n const requiredMsg = field.isOptional\n ? `This optional ${type} field may be omitted`\n : `A ${type} field`\n\n const description = field.description\n ? ` ${formatDescription(field.description)}`\n : ''\n\n return `${name}: (${requiredMsg})${description}`.trim()\n })\n\n return rows.join('\\n')\n}\n\nconst renderOutputFields = (fields: readonly AxField[]) => {\n // Transform each field into table row\n const rows = fields.map((field) => {\n const name = field.title\n const type = field.type?.name ? toFieldType(field.type) : 'string'\n\n const requiredMsg = field.isOptional\n ? `Only include this ${type} field if its value is available`\n : `This ${type} field must be included`\n\n const description = field.description\n ? ` ${formatDescription(field.description)}`\n : ''\n\n return `${name}: (${requiredMsg})${description}`.trim()\n })\n\n return rows.join('\\n')\n}\n\nconst processValue = (\n field: Readonly<AxField>,\n value: Readonly<AxFieldValue>\n): AxFieldValue => {\n if (field.type?.name === 'date' && value instanceof Date) {\n const v = value.toISOString()\n return v.slice(0, v.indexOf('T'))\n }\n if (field.type?.name === 'datetime' && value instanceof Date) {\n return formatDateWithTimezone(value)\n }\n if (field.type?.name === 'image' && typeof value === 'object') {\n return value\n }\n if (field.type?.name === 'audio' && typeof value === 'object') {\n return value\n }\n if (typeof value === 'string') {\n return value\n }\n return JSON.stringify(value, null, 2)\n}\n\n// const toVar = (name: string, type?: Readonly<Field['type']>) => {\n// const fmt = type ? type.name + (type.isArray ? '[]' : '') : undefined;\n\n// return '${' + name + (fmt ? `:${fmt}` : '') + '}';\n// };\n\nexport const toFieldType = (type: Readonly<AxField['type']>) => {\n const baseType = (() => {\n switch (type?.name) {\n case 'string':\n return 'string'\n case 'number':\n return 'number'\n case 'boolean':\n return 'boolean'\n case 'date':\n return 'date (\"YYYY-MM-DD\" format)'\n case 'datetime':\n return 'date time (\"YYYY-MM-DD HH:mm Timezone\" format)'\n case 'json':\n return 'JSON object'\n case 'class':\n return `classification class (allowed classes: ${type.classes?.join(', ')})`\n case 'code':\n return 'code'\n default:\n return 'string'\n }\n })()\n\n return type?.isArray ? `json array of ${baseType} items` : baseType\n}\n\nfunction combineConsecutiveStrings(separator: string) {\n return (\n acc: ChatRequestUserMessage,\n\n current: ChatRequestUserMessage[0]\n ) => {\n if (current.type === 'text') {\n const previous = acc.length > 0 ? acc[acc.length - 1] : null\n if (previous && previous.type === 'text') {\n // If the last item in the accumulator is a string, append the current string to it with the separator\n previous.text += separator + current.text\n } else {\n // Otherwise, push the current string into the accumulator\n acc.push(current)\n }\n } else {\n // If current is not of type 'text', just add it to the accumulator\n acc.push(current)\n }\n return acc\n }\n}\n\nconst isEmptyValue = (\n field: Readonly<AxField>,\n value?: Readonly<AxFieldValue>\n) => {\n // Boolean type can't be empty\n if (typeof value === 'boolean') {\n return false\n }\n\n if (\n !value ||\n ((Array.isArray(value) || typeof value === 'string') && value.length === 0)\n ) {\n if (field.isOptional) {\n return true\n }\n throw new Error(`Value for input field '${field.name}' is required.`)\n }\n return false\n}\n\nfunction formatDescription(str: string) {\n const value = str.trim()\n return value.length > 0\n ? `${value.charAt(0).toUpperCase()}${value.slice(1)}${value.endsWith('.') ? '' : '.'}`\n : ''\n}\n","import type { AxAIService } from '../ai/types.js'\nimport type { AxAIMemory } from '../mem/types.js'\nimport { ColorLog } from '../util/log.js'\n\nimport { AxPromptTemplate, toFieldType } from './prompt.js'\nimport type { AxField, AxIField } from './sig.js'\n\nconst colorLog = new ColorLog()\n\nexport class ValidationError extends Error {\n private fields: AxField[]\n\n constructor({\n message,\n fields,\n }: Readonly<{\n message: string\n fields: AxField[]\n value?: string\n }>) {\n super(message)\n this.fields = fields\n this.name = this.constructor.name\n }\n\n public getFixingInstructions = () => {\n return this.fields.map((field) => ({\n name: 'outputError',\n title: 'Output Correction Required',\n description: `The section labeled '${field.title}' either was not generated by the LLM or does not match the expected format of '${toFieldType(field.type)}'. ${this.message} Please revise your response to ensure it conforms to the specified format.`,\n }))\n }\n}\n\nexport function handleValidationError(\n mem: AxAIMemory,\n errorFields: AxIField[],\n ai: Readonly<AxAIService>,\n promptTemplate: Readonly<AxPromptTemplate>,\n sessionId?: string\n) {\n mem.add(\n {\n role: 'user' as const,\n content: promptTemplate.renderExtraFields(errorFields),\n },\n sessionId\n )\n mem.addTag('error')\n\n if (ai.getOptions().debug) {\n const errors = errorFields\n .map((field) => `- ${field.title}: ${field.description}`)\n .join('\\n')\n\n process.stdout.write(colorLog.red(`\\n❌ Error Correction:\\n${errors}\\n`))\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nimport { parseLLMFriendlyDate, parseLLMFriendlyDateTime } from './datetime.js'\nimport type { AxField, AxSignature } from './sig.js'\nimport { matchesContent, parseMarkdownList } from './util.js'\nimport { ValidationError } from './validate.js'\n\nexport const extractValues = (\n sig: Readonly<AxSignature>,\n values: Record<string, unknown>,\n content: string\n) => {\n const xstate = { extractedFields: [], streamedIndex: {}, s: -1 }\n streamingExtractValues(sig, values, xstate, content)\n streamingExtractFinalValue(sig, values, xstate, content)\n}\n\nexport interface extractionState {\n prevField?: { field: AxField; s: number; e: number }\n currField?: AxField\n currFieldIndex?: number\n extractedFields: AxField[]\n streamedIndex: Record<string, number>\n s: number\n inBlock?: boolean\n}\n\n// Helper function to check for missing required fields\nconst checkMissingRequiredFields = (\n xstate: Readonly<extractionState>,\n values: Record<string, unknown>,\n currentIndex: number\n) => {\n const missingFields: AxField[] = []\n\n // Check all fields up to the current index\n for (let i = 0; i < currentIndex; i++) {\n const field = xstate.extractedFields[i]\n if (field && !field.isOptional && values[field.name] === undefined) {\n missingFields.push(field)\n }\n }\n\n if (missingFields.length > 0) {\n throw new ValidationError({\n message: `Required ${missingFields.length === 1 ? 'field' : 'fields'} not found`,\n fields: missingFields,\n })\n }\n}\n\nexport const streamingExtractValues = (\n sig: Readonly<AxSignature>,\n values: Record<string, unknown>,\n // eslint-disable-next-line functional/prefer-immutable-types\n xstate: extractionState,\n content: string,\n streamingValidation: boolean = false\n) => {\n const fields = sig.getOutputFields()\n\n for (const [index, field] of fields.entries()) {\n if (field.name in values) {\n continue\n }\n\n const prefix = field.title + ':'\n let e = matchesContent(content, prefix, xstate.s + 1)\n\n switch (e) {\n case -1:\n if (streamingValidation && values.length == 0 && !field.isOptional) {\n throw new ValidationError({\n message: 'Required field not found',\n fields: [field],\n })\n }\n continue // Field is not found, continue to the next field\n case -2:\n return true // Partial match at end, skip and gather more content\n case -3:\n return true // String is only whitespace, skip and gather more content\n case -4:\n xstate.inBlock = true\n return true // String is only backticks, skip and gather more content\n }\n // We found the next field!!!\n\n let prefixLen = prefix.length\n\n // Lets wrap up the last field which is still the current field\n if (xstate.currField) {\n const val = content.substring(xstate.s, e).trim()\n const parsedValue = validateAndParseFieldValue(xstate.currField, val)\n if (parsedValue !== undefined) {\n values[xstate.currField.name] = parsedValue\n }\n xstate.prevField = { field: xstate.currField, s: xstate.s, e }\n }\n\n checkMissingRequiredFields(xstate, values, index)\n\n // Lets update the state for the new current field\n xstate.s = e + prefixLen\n xstate.currField = field\n xstate.currFieldIndex = index\n\n if (!xstate.extractedFields.includes(field)) {\n xstate.extractedFields.push(field)\n }\n\n if (xstate.streamedIndex[field.name] === undefined) {\n xstate.streamedIndex[field.name] = 0\n }\n }\n}\n\nexport const streamingExtractFinalValue = (\n sig: Readonly<AxSignature>,\n values: Record<string, unknown>,\n // eslint-disable-next-line functional/prefer-immutable-types\n xstate: extractionState,\n content: string\n) => {\n if (xstate.currField) {\n let val = content.substring(xstate.s).trim()\n\n const parsedValue = validateAndParseFieldValue(xstate.currField, val)\n if (parsedValue !== undefined) {\n values[xstate.currField.name] = parsedValue\n }\n }\n const sigFields = sig.getOutputFields()\n\n // Check all previous required fields before processing current field\n checkMissingRequiredFields(xstate, values, sigFields.length)\n}\n\nconst convertValueToType = (field: Readonly<AxField>, val: string) => {\n switch (field.type?.name) {\n case 'code':\n return extractBlock(val)\n\n case 'string':\n return val\n\n case 'number': {\n const v = Number(val)\n if (Number.isNaN(v)) {\n throw new Error('Invalid number')\n }\n return v\n }\n\n case 'boolean': {\n if (typeof val === 'boolean') {\n return val\n }\n const v = val.toLowerCase()\n if (v === 'true') {\n return true\n } else if (v === 'false') {\n return false\n } else {\n throw new Error('Invalid boolean')\n }\n }\n case 'date':\n return parseLLMFriendlyDate(field, val)\n\n case 'datetime':\n return parseLLMFriendlyDateTime(field, val)\n\n case 'class':\n const className = val\n if (field.type.classes && !field.type.classes.includes(className)) {\n throw new Error(\n `Invalid class '${val}', expected one of the following: ${field.type.classes.join(', ')}`\n )\n }\n return className as string\n\n default:\n return val as string // Unknown type\n }\n}\n\nexport function* yieldDelta<OUT>(\n content: string,\n field: Readonly<AxField>,\n s: number,\n e: number,\n // eslint-disable-next-line functional/prefer-immutable-types\n xstate: extractionState\n) {\n const { name: fieldName, isInternal } = field\n const { isArray: fieldIsArray, name: fieldTypeName } = field.type ?? {}\n\n if (\n isInternal ||\n fieldIsArray ||\n (fieldTypeName && fieldTypeName !== 'string' && fieldTypeName !== 'code')\n ) {\n return\n }\n\n const pos = xstate.streamedIndex[fieldName] ?? 0\n const isFirstChunk = pos === 0\n\n const d1 = content.substring(s + pos, e)\n if (d1.length === 0) {\n return\n }\n\n // Remove trailing whitespace, tabs, and newlines\n let d2 = d1.replace(/\\s+$/, '')\n\n // If this field is a \"code\" type, remove trailing backticks\n if (xstate.currField?.type?.name === 'code') {\n d2 = d2.replace(/\\s*```\\s*$/, '')\n }\n\n // Only trim start for the first chunk\n let d3 = isFirstChunk ? d2.trimStart() : d2\n\n if (xstate.currField?.type?.name === 'code') {\n // Remove any leading triple-backtick fences (with optional language specifier)\n d3 = d3.replace(/^[ ]*```[a-zA-Z0-9]*\\n\\s*/, '')\n }\n\n if (d3.length > 0) {\n yield { [fieldName]: d3 } as Partial<OUT>\n xstate.streamedIndex[fieldName] = pos + d2.length\n }\n}\n\n// export function getStreamingDelta(\n// values: Record<string, unknown>,\n// // eslint-disable-next-line functional/prefer-immutable-types\n// xstate: extractionState\n// ) {\n// return processStreamingDelta(values, xstate)\n// }\n\nexport function* streamValues<OUT>(\n sig: Readonly<AxSignature>,\n content: string,\n values: Readonly<Record<string, OUT>>,\n // eslint-disable-next-line functional/prefer-immutable-types\n xstate: extractionState\n) {\n if (xstate.prevField && !xstate.prevField.field.isInternal) {\n const { field, s, e } = xstate.prevField\n yield* yieldDelta<OUT>(content, field, s, e, xstate)\n xstate.prevField = undefined\n }\n\n if (!xstate.currField || xstate.currField.isInternal) {\n return\n }\n\n yield* yieldDelta<OUT>(\n content,\n xstate.currField,\n xstate.s,\n content.length,\n xstate\n )\n\n const outputFields = sig.getOutputFields()\n\n for (const key of Object.keys(values)) {\n const field = outputFields.find((f) => f.name === key)\n if (!field || field.isInternal) {\n continue\n }\n\n const value = values[key]\n\n if (Array.isArray(value)) {\n const s = xstate.streamedIndex?.[key] ?? 0\n const v = value.slice(s)\n if (v && v.length > 0) {\n yield { [key]: v } as Partial<OUT>\n xstate.streamedIndex[key] = s + 1\n }\n continue\n }\n\n if (!xstate.streamedIndex[key]) {\n yield { [key]: value } as Partial<OUT>\n xstate.streamedIndex[key] = 1\n }\n }\n}\n\nfunction validateAndParseFieldValue(\n field: Readonly<AxField>,\n fieldValue: string | undefined\n): unknown {\n if (\n !fieldValue ||\n fieldValue === '' ||\n /^(null|undefined)\\s*$/i.test(fieldValue)\n ) {\n if (field.isOptional) {\n return\n }\n throw new ValidationError({\n message: 'Required field is missing',\n fields: [field],\n value: fieldValue,\n })\n }\n\n let value: unknown | undefined\n\n if (field.type?.name === 'json') {\n try {\n const text = extractBlock(fieldValue)\n value = JSON.parse(text)\n return value\n } catch (e) {\n throw new ValidationError({\n message: 'Invalid JSON: ' + (e as Error).message,\n fields: [field],\n value: fieldValue,\n })\n }\n }\n\n if (field.type?.isArray) {\n try {\n try {\n value = JSON.parse(fieldValue)\n } catch {\n // If JSON parsing fails, try markdown parsing\n value = parseMarkdownList(fieldValue)\n }\n if (!Array.isArray(value)) {\n throw new Error('Expected an array')\n }\n } catch (e) {\n throw new ValidationError({\n message: 'Invalid Array: ' + (e as Error).message,\n fields: [field],\n value: fieldValue,\n })\n }\n }\n\n try {\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) {\n if (item !== undefined) {\n const v = typeof item === 'string' ? item.trim() : item\n value[index] = convertValueToType(field, v)\n }\n }\n } else {\n value = convertValueToType(field, fieldValue)\n }\n } catch (e) {\n throw new ValidationError({\n message: (e as Error).message,\n fields: [field],\n value: fieldValue,\n })\n }\n\n if (typeof value === 'string' && value === '') {\n return undefined\n }\n\n return value\n}\n\nexport const extractBlock = (input: string): string => {\n const markdownBlockPattern = /```([A-Za-z]*)\\n([\\s\\S]*?)\\n```/g\n const match = markdownBlockPattern.exec(input)\n if (!match) {\n return input\n }\n if (match.length === 3) {\n return match[2] as string\n }\n if (match.length === 2) {\n return match[1] as string\n }\n return input\n}\n","import type { AxAIMemory } from '../mem/types.js'\n\nimport type { extractionState } from './extract.js'\nimport type { AxFieldValue, AxGenOut } from './program.js'\nimport type { AxField } from './sig.js'\n\nexport type AxFieldProcessorProcess = (\n value: AxFieldValue,\n context?: Readonly<{\n values?: AxGenOut\n sessionId?: string\n done?: boolean\n }>\n) => unknown | Promise<unknown>\n\nexport type AxStreamingFieldProcessorProcess = (\n value: string,\n context?: Readonly<{\n values?: AxGenOut\n sessionId?: string\n done?: boolean\n }>\n) => unknown | Promise<unknown>\nexport interface AxFieldProcessor {\n field: Readonly<AxField>\n\n /**\n * Process the field value and return a new value (or undefined if no update is needed).\n * The returned value may be merged back into memory.\n * @param value - The current field value.\n * @param context - Additional context (e.g. memory and session id).\n */\n process: AxFieldProcessorProcess | AxStreamingFieldProcessorProcess\n}\n\n/**\n * For synchronous responses: iterates over registered field processors,\n * passing in the current values. If a processor returns a new value,\n * that value is merged into memory with a special role ('processor').\n */\nexport async function processFieldProcessors(\n fieldProcessors: AxFieldProcessor[],\n values: AxGenOut,\n mem: AxAIMemory,\n sessionId?: string\n) {\n for (const processor of fieldProcessors) {\n if (values[processor.field.name] === undefined) {\n continue\n }\n\n const processFn = processor.process as AxFieldProcessorProcess\n const result = await processFn(values[processor.field.name], {\n sessionId,\n values,\n done: true,\n })\n addToMemory(processor.field, mem, result, sessionId)\n }\n}\n\n/**\n * For streaming responses: processes each streaming field processor\n * and yields delta updates if they return new values.\n */\nexport async function processStreamingFieldProcessors(\n fieldProcessors: AxFieldProcessor[],\n content: string,\n xstate: Readonly<extractionState>,\n mem: AxAIMemory,\n values: AxGenOut,\n sessionId: string | undefined,\n done: boolean = false\n): Promise<void> {\n for (const processor of fieldProcessors) {\n if (xstate.currField?.name !== processor.field.name) {\n continue\n }\n\n let value = content.substring(xstate.s)\n\n if (xstate.currField?.type?.name === 'code') {\n // remove markdown block\n value = value.replace(/^[ ]*```[a-zA-Z0-9]*\\n\\s*/, '')\n value = value.replace(/\\s*```\\s*$/, '')\n }\n const processFn = processor.process as AxStreamingFieldProcessorProcess\n const result = await processFn(value, {\n sessionId,\n values,\n done,\n })\n\n addToMemory(xstate.currField, mem, result, sessionId)\n }\n}\n\nconst addToMemory = (\n field: Readonly<AxField>,\n mem: AxAIMemory,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n result: any | any[],\n sessionId?: string\n) => {\n if (\n result === undefined ||\n (typeof result === 'string' &&\n (result === '' || /^(null|undefined)\\s*$/i.test(result)))\n ) {\n return\n }\n\n let resultText = JSON.stringify(\n result,\n (key, value) => (typeof value === 'bigint' ? Number(value) : value),\n 2\n )\n\n const text = getFieldProcessingMessage(field, resultText)\n mem.add({ role: 'user', content: [{ type: 'text', text }] }, sessionId)\n mem.addTag(`processor`, sessionId)\n}\n\nfunction getFieldProcessingMessage(\n field: Readonly<AxField>,\n resultText: string\n) {\n const isCodeField = field.type?.name === 'code'\n const fieldTitle = field.title\n\n if (isCodeField) {\n return `Code in the field \"${fieldTitle}\" was executed. The code execution produced the following output: ${resultText}`\n } else {\n return `The field \"${fieldTitle}\" was processed. The field contents were transformed into the following output: ${resultText}`\n }\n}\n","import type { AxFunctionJSONSchema } from '../ai/types.js'\n\nexport const validateJSONSchema = (\n schema: Readonly<AxFunctionJSONSchema>\n): void => {\n const errors: string[] = []\n\n const validateSchemaObject = (\n schema: Readonly<AxFunctionJSONSchema>,\n path: string = ''\n ): void => {\n const validTypes = [\n 'array',\n 'integer',\n 'number',\n 'string',\n 'boolean',\n 'null',\n 'object',\n ]\n\n if (!validTypes.includes(schema.type)) {\n errors.push(`Invalid type '${schema.type}' at ${path || 'root'}`)\n return\n }\n\n if (schema.type === 'object' && schema.properties) {\n if (\n typeof schema.properties !== 'object' ||\n Array.isArray(schema.properties)\n ) {\n errors.push(`Invalid properties object at ${path || 'root'}`)\n } else {\n for (const key in schema.properties) {\n const value = schema.properties[key]\n if (typeof value !== 'object') {\n errors.push(`Invalid schema object at ${path}${key}`)\n continue\n }\n validateSchemaObject(value, `${path}${key}.`)\n }\n }\n\n if (schema.required && !Array.isArray(schema.required)) {\n errors.push(`'required' should be an array at ${path || 'root'}`)\n }\n }\n\n if (schema.type === 'array' && schema.items) {\n if (typeof schema.items !== 'object') {\n errors.push(`Invalid items schema at ${path || 'root'}`)\n } else {\n validateSchemaObject(schema.items, `${path}items.`)\n }\n }\n }\n\n validateSchemaObject(schema)\n\n if (errors.length > 0) {\n throw new Error(errors.join('; '))\n }\n}\n\n// Example Usage:\n\n/*\nconst validSchema: AxFunctionJSONSchema = {\n type: 'object',\n properties: {\n id: { type: 'integer' },\n name: { type: 'string' },\n email: { type: 'string' },\n isActive: { type: 'boolean' },\n tags: {\n type: 'array',\n items: { type: 'string' }\n }\n },\n required: ['id', 'name', 'email']\n};\n\nconst invalidSchema: any = {\n type: 'object',\n properties: {\n id: { type: 'integer' },\n name: { type: 'string' },\n email: { type: 'unknownType' }, // Invalid type\n isActive: { type: 'boolean' },\n tags: {\n type: 'array',\n items: { type: 'string' }\n }\n },\n required: 'id,name,email' // Invalid 'required' field\n};\n\ntry {\n validateSchemaStructure(validSchema);\n} catch (error) {\n console.error('Schema validation failed:', error.message);\n}\n\ntry {\n validateSchemaStructure(invalidSchema);\n} catch (error) {\n console.error('Schema validation failed:', error.message);\n}\n*/\n","import type {\n AxAIService,\n AxAIServiceActionOptions,\n AxChatRequest,\n AxChatResponseResult,\n AxFunction,\n} from '../ai/types.js'\nimport type { AxMemory } from '../mem/memory.js'\nimport { ColorLog } from '../util/log.js'\n\nimport { validateJSONSchema } from './jsonschema.js'\n\nconst colorLog = new ColorLog()\n\nexport class AxFunctionError extends Error {\n constructor(\n private fields: {\n field: string\n message: string\n }[]\n ) {\n super()\n this.name = this.constructor.name\n }\n\n getFields = () => this.fields\n}\n\ntype FunctionFieldErrors = ConstructorParameters<typeof AxFunctionError>[0]\n\nexport class FunctionError extends Error {\n constructor(\n private readonly fields: FunctionFieldErrors,\n private readonly func: Readonly<AxFunction>,\n private readonly funcId?: string\n ) {\n super()\n }\n\n getFunctionId = () => this.funcId\n\n private getFieldDescription(fieldName: string): string {\n if (!this.func.parameters?.properties?.[fieldName]) {\n return ''\n }\n\n const fieldSchema = this.func.parameters.properties[fieldName]\n let description = fieldSchema.description\n\n if (fieldSchema.enum?.length) {\n description += ` Allowed values are: ${fieldSchema.enum.join(', ')}`\n }\n\n return description\n }\n\n public getFixingInstructions = () => {\n const bulletPoints = this.fields.map((fieldError) => {\n const schemaDescription = this.getFieldDescription(fieldError.field) || ''\n return `- \\`${fieldError.field}\\` - ${fieldError.message} (${schemaDescription}).`\n })\n\n return `Errors In Function Arguments: Fix the following invalid arguments to '${this.func.name}'\\n${bulletPoints.join('\\n')}`\n }\n}\n\nexport type AxChatResponseFunctionCall = {\n id: string\n name: string\n args: string\n}\n\nexport class AxFunctionProcessor {\n private funcList: Readonly<AxFunction[]> = []\n\n constructor(funcList: Readonly<AxFunction[]>) {\n this.funcList = funcList\n }\n\n private executeFunction = async (\n fnSpec: Readonly<AxFunction>,\n func: Readonly<AxChatResponseFunctionCall>,\n options?: Readonly<AxAIServiceActionOptions>\n ) => {\n let args: unknown\n\n if (typeof func.args === 'string' && func.args.length > 0) {\n args = JSON.parse(func.args)\n } else {\n args = func.args\n }\n\n const opt = options\n ? {\n sessionId: options.sessionId,\n traceId: options.traceId,\n ai: options.ai,\n }\n : undefined\n\n if (!fnSpec.parameters) {\n const res =\n fnSpec.func.length === 1 ? await fnSpec.func(opt) : await fnSpec.func()\n\n return typeof res === 'string' ? res : JSON.stringify(res, null, 2)\n }\n\n const res =\n fnSpec.func.length === 2\n ? await fnSpec.func(args, opt)\n : await fnSpec.func(args)\n\n return typeof res === 'string' ? res : JSON.stringify(res, null, 2)\n }\n\n public execute = async (\n func: Readonly<AxChatResponseFunctionCall>,\n options?: Readonly<AxAIServiceActionOptions>\n ) => {\n const fnSpec = this.funcList.find(\n (v) => v.name.localeCompare(func.name) === 0\n )\n if (!fnSpec) {\n throw new Error(`Function not found: ${func.name}`)\n }\n if (!fnSpec.func) {\n throw new Error(`No handler for function: ${func.name}`)\n }\n\n // execute value function calls\n try {\n return await this.executeFunction(fnSpec, func, options)\n } catch (e) {\n if (e instanceof AxFunctionError) {\n throw new FunctionError(e.getFields(), fnSpec, func.id)\n }\n throw e\n }\n }\n}\n\nexport type AxInputFunctionType = (\n | AxFunction\n | {\n toFunction: () => AxFunction | AxFunction[]\n }\n)[]\n\nexport const parseFunctions = (\n newFuncs: Readonly<AxInputFunctionType>,\n existingFuncs?: readonly AxFunction[]\n): AxFunction[] => {\n if (newFuncs.length === 0) {\n return [...(existingFuncs ?? [])]\n }\n\n // biome-ignore lint/complexity/useFlatMap: cannot use flatMap here\n const functions = newFuncs\n .map((f) => {\n if ('toFunction' in f) {\n return f.toFunction()\n }\n return f\n })\n .flat()\n\n for (const fn of functions.filter((v) => v.parameters)) {\n if (fn.parameters) {\n validateJSONSchema(fn.parameters)\n }\n }\n\n return [...(existingFuncs ?? []), ...functions]\n}\n\ntype FunctionPromise =\n | undefined\n | Promise<Extract<AxChatRequest['chatPrompt'][number], { role: 'function' }>>\n\nexport const processFunctions = async (\n ai: Readonly<AxAIService>,\n functionList: Readonly<AxFunction[]>,\n functionCalls: readonly AxChatResponseFunctionCall[],\n mem: Readonly<AxMemory>,\n sessionId?: string,\n traceId?: string\n) => {\n const funcProc = new AxFunctionProcessor(functionList)\n const functionsExecuted = new Set<string>()\n\n // Map each function call to a promise that resolves to the function result or null\n const promises = functionCalls.map((func) => {\n if (!func.id) {\n throw new Error(`Function ${func.name} did not return an ID`)\n }\n\n const promise: FunctionPromise = funcProc\n .execute(func, { sessionId, traceId, ai })\n .then((functionResult) => {\n functionsExecuted.add(func.name.toLowerCase())\n\n return {\n role: 'function' as const,\n result: functionResult ?? '',\n functionId: func.id,\n }\n })\n .catch((e) => {\n if (e instanceof FunctionError) {\n const result = e.getFixingInstructions()\n mem.add(\n {\n role: 'function' as const,\n functionId: func.id,\n isError: true,\n result,\n },\n sessionId\n )\n mem.addTag('error')\n\n if (ai.getOptions().debug) {\n process.stdout.write(\n colorLog.red(`\\n❌ Function Error Correction:\\n${result}\\n`)\n )\n }\n } else {\n throw e\n }\n }) as FunctionPromise\n\n return promise\n })\n\n // Wait for all promises to resolve\n const results = await Promise.all(promises)\n\n for (const result of results) {\n if (result) {\n mem.add(result, sessionId)\n }\n }\n\n return functionsExecuted\n}\n\nexport function parseFunctionCalls(\n ai: Readonly<AxAIService>,\n functionCalls: Readonly<AxChatResponseResult['functionCalls']>,\n values: Record<string, unknown>,\n model?: string\n): AxChatResponseFunctionCall[] | undefined {\n if (!functionCalls || functionCalls.length === 0) {\n return\n }\n if (!ai.getFeatures(model).functions) {\n throw new Error('Functions are not supported by the AI service')\n }\n\n const funcs: AxChatResponseFunctionCall[] = functionCalls.map((f) => ({\n id: f.id,\n name: f.function.name,\n args: f.function.params as string,\n }))\n\n // for (const [i, f] of funcs.entries()) {\n // values['functionName' + i] = f.name;\n // values['functionArguments' + i] =\n // typeof f.args === 'object' ? JSON.stringify(f.args) : f.args;\n // }\n return funcs\n}\n","import type {\n AxAIModelList,\n AxAIService,\n AxFunction,\n AxFunctionHandler,\n AxFunctionJSONSchema,\n} from '../ai/types.js'\nimport type { AxInputFunctionType } from '../dsp/functions.js'\nimport { AxGen, type AxGenOptions } from '../dsp/generate.js'\nimport type {\n AxGenIn,\n AxGenOut,\n AxGenStreamingOut,\n AxProgramDemos,\n AxProgramExamples,\n AxProgramForwardOptions,\n AxProgramStreamingForwardOptions,\n AxProgramWithSignature,\n AxTunable,\n AxUsable,\n} from '../dsp/program.js'\nimport type { AxSignature } from '../dsp/sig.js'\n\n/**\n * Interface for agents that can be used as child agents.\n * Provides methods to get the agent's function definition and features.\n */\nexport interface AxAgentic extends AxTunable, AxUsable {\n getFunction(): AxFunction\n getFeatures(): AxAgentFeatures\n}\n\nexport type AxAgentOptions = Omit<AxGenOptions, 'functions'> & {\n disableSmartModelRouting?: boolean\n /** List of field names that should not be automatically passed from parent to child agents */\n excludeFieldsFromPassthrough?: string[]\n debug?: boolean\n}\n\nexport interface AxAgentFeatures {\n /** Whether this agent can use smart model routing (requires an AI service) */\n canConfigureSmartModelRouting: boolean\n /** List of fields that this agent excludes from parent->child value passing */\n excludeFieldsFromPassthrough: string[]\n}\n\n/**\n * Processes a child agent's function, applying model routing and input injection as needed.\n * Handles both the schema modifications and function wrapping.\n */\nfunction processChildAgentFunction<IN extends AxGenIn>(\n childFunction: Readonly<AxFunction>,\n parentValues: IN,\n parentInputKeys: string[],\n modelList: AxAIModelList | undefined,\n options: Readonly<{\n debug: boolean\n disableSmartModelRouting: boolean\n excludeFieldsFromPassthrough: string[]\n canConfigureSmartModelRouting: boolean\n }>\n): AxFunction {\n const processedFunction = { ...childFunction }\n\n // Process input field injection\n if (processedFunction.parameters) {\n const childKeys = processedFunction.parameters.properties\n ? Object.keys(processedFunction.parameters.properties)\n : []\n\n // Find common keys between parent and child, excluding 'model' and specified exclusions\n const commonKeys = parentInputKeys\n .filter((key) => childKeys.includes(key))\n .filter((key) => key !== 'model')\n const injectionKeys = commonKeys.filter(\n (key) => !options.excludeFieldsFromPassthrough.includes(key)\n )\n\n if (injectionKeys.length > 0) {\n // Remove injected fields from child schema\n processedFunction.parameters = removePropertiesFromSchema(\n processedFunction.parameters,\n injectionKeys\n )\n\n // Wrap function to inject parent values\n const originalFunc = processedFunction.func\n // add debug logging if enabled\n processedFunction.func = async (childArgs, funcOptions) => {\n const updatedChildArgs = {\n ...childArgs,\n ...pick(parentValues, injectionKeys as (keyof IN)[]),\n }\n\n if (options.debug && injectionKeys.length > 0) {\n process.stdout.write(\n `\\nFunction Params: ${JSON.stringify(updatedChildArgs, null, 2)}`\n )\n }\n\n return await originalFunc(updatedChildArgs, funcOptions)\n }\n }\n\n return processedFunction\n }\n\n // Apply smart model routing if enabled\n if (\n modelList &&\n !options.disableSmartModelRouting &&\n options.canConfigureSmartModelRouting\n ) {\n processedFunction.parameters = addModelParameter(\n processedFunction.parameters,\n modelList\n )\n }\n\n return processedFunction\n}\n\nconst descriptionError = new Error(\n 'Agent description must be at least 20 characters (explain in detail what the agent does)'\n)\n\nconst definitionError = new Error(\n 'Agent definition is the prompt you give to the LLM for the agent. It must be detailed and at least 100 characters'\n)\n\n/**\n * An AI agent that can process inputs using an AI service and coordinate with child agents.\n * Supports features like smart model routing and automatic input field passing to child agents.\n */\nexport class AxAgent<IN extends AxGenIn, OUT extends AxGenOut = AxGenOut>\n implements AxAgentic\n{\n private ai?: AxAIService\n private program: AxProgramWithSignature<IN, OUT>\n private functions?: AxInputFunctionType\n private agents?: AxAgentic[]\n private disableSmartModelRouting?: boolean\n private excludeFieldsFromPassthrough: string[]\n private debug?: boolean\n\n private name: string\n // private subAgentList?: string\n private func: AxFunction\n\n constructor(\n {\n ai,\n name,\n description,\n definition,\n signature,\n agents,\n functions,\n }: Readonly<{\n ai?: Readonly<AxAIService>\n name: string\n description: string\n definition?: string\n signature: AxSignature | string\n agents?: AxAgentic[]\n functions?: AxInputFunctionType\n }>,\n options?: Readonly<AxAgentOptions>\n ) {\n const { disableSmartModelRouting, excludeFieldsFromPassthrough, debug } =\n options ?? {}\n\n this.ai = ai\n this.agents = agents\n this.functions = functions\n this.disableSmartModelRouting = disableSmartModelRouting\n this.excludeFieldsFromPassthrough = excludeFieldsFromPassthrough ?? []\n this.debug = debug\n\n if (!name || name.length < 5) {\n throw new Error(\n 'Agent name must be at least 10 characters (more descriptive)'\n )\n }\n\n if (!description || description.length < 20) {\n throw descriptionError\n }\n\n if (definition && definition.length < 100) {\n throw definitionError\n }\n\n this.program = new AxGen<IN, OUT>(signature, {\n ...options,\n description: definition ?? description,\n })\n\n for (const agent of agents ?? []) {\n this.program.register(agent)\n }\n\n this.name = name\n // this.subAgentList = agents?.map((a) => a.getFunction().name).join(', ')\n\n this.func = {\n name: toCamelCase(this.name),\n description,\n parameters: this.program.getSignature().toJSONSchema(),\n func: () => this.forward,\n }\n\n const mm = ai?.getModelList()\n // Only add model parameter if smart routing is enabled and model list exists\n if (mm && !this.disableSmartModelRouting) {\n this.func.parameters = addModelParameter(this.func.parameters, mm)\n }\n }\n\n public setExamples(examples: Readonly<AxProgramExamples>) {\n this.program.setExamples(examples)\n }\n\n public setId(id: string) {\n this.program.setId(id)\n }\n\n public setParentId(parentId: string) {\n this.program.setParentId(parentId)\n }\n\n public getTraces() {\n return this.program.getTraces()\n }\n\n public setDemos(demos: readonly AxProgramDemos[]) {\n this.program.setDemos(demos)\n }\n\n public getUsage() {\n return this.program.getUsage()\n }\n\n public resetUsage() {\n this.program.resetUsage()\n }\n\n public getFunction(): AxFunction {\n const boundFunc = this.forward.bind(this)\n\n // Create a wrapper function that excludes the 'ai' parameter\n const wrappedFunc: AxFunctionHandler = async (\n valuesAndModel: IN & { model: string },\n options?\n ): Promise<string> => {\n const { model, ...values } = valuesAndModel\n\n const ai = this.ai ?? options?.ai\n if (!ai) {\n throw new Error('AI service is required to run the agent')\n }\n const debug = this.getDebug(ai, options)\n\n if (debug) {\n process.stdout.write(`\\n--- Agent Engaged: ${this.name} ---\\n`)\n }\n\n const ret = await boundFunc(ai, values as unknown as IN, {\n ...options,\n model,\n })\n\n if (debug) {\n process.stdout.write(`\\n--- Agent Done: ${this.name} ---\\n`)\n }\n\n const sig = this.program.getSignature()\n const outFields = sig.getOutputFields()\n const result = Object.keys(ret)\n .map((k) => {\n const field = outFields.find((f) => f.name === k)\n if (field) {\n return `${field.title}: ${ret[k]}`\n }\n return `${k}: ${ret[k]}`\n })\n .join('\\n')\n\n return result\n }\n\n return {\n ...this.func,\n func: wrappedFunc,\n }\n }\n\n public getFeatures(): AxAgentFeatures {\n return {\n canConfigureSmartModelRouting: this.ai === undefined,\n excludeFieldsFromPassthrough: this.excludeFieldsFromPassthrough,\n }\n }\n\n /**\n * Initializes the agent's execution context, processing child agents and their functions.\n */\n private init(\n parentAi: Readonly<AxAIService>,\n values: IN,\n options: Readonly<AxProgramForwardOptions> | undefined\n ) {\n const ai = this.ai ?? parentAi\n const mm = ai?.getModelList()\n\n // Get parent's input schema and keys\n const parentSchema = this.program.getSignature().getInputFields()\n const parentKeys = parentSchema.map((p) => p.name)\n const debug = this.getDebug(ai, options)\n\n // Process each child agent's function\n const agentFuncs = this.agents?.map((agent) => {\n const f = agent.getFeatures()\n\n const processOptions = {\n debug,\n disableSmartModelRouting: !!this.disableSmartModelRouting,\n excludeFieldsFromPassthrough: f.excludeFieldsFromPassthrough,\n canConfigureSmartModelRouting: f.canConfigureSmartModelRouting,\n }\n\n return processChildAgentFunction(\n agent.getFunction(),\n values,\n parentKeys,\n mm,\n processOptions\n )\n })\n\n // Combine all functions\n const functions: AxInputFunctionType = [\n ...(options?.functions ?? this.functions ?? []),\n ...(agentFuncs ?? []),\n ]\n\n return { ai, functions, debug }\n }\n\n public async forward(\n parentAi: Readonly<AxAIService>,\n values: IN,\n options?: Readonly<AxProgramForwardOptions>\n ): Promise<OUT> {\n const { ai, functions, debug } = this.init(parentAi, values, options)\n return await this.program.forward(ai, values, {\n ...options,\n debug,\n functions,\n })\n }\n\n public async *streamingForward(\n parentAi: Readonly<AxAIService>,\n values: IN,\n options?: Readonly<AxProgramStreamingForwardOptions>\n ): AxGenStreamingOut<OUT> {\n const { ai, functions, debug } = this.init(parentAi, values, options)\n return yield* this.program.streamingForward(ai, values, {\n ...options,\n debug,\n functions,\n })\n }\n\n /**\n * Updates the agent's description.\n * This updates both the stored description and the function's description.\n *\n * @param description - New description for the agent (must be at least 20 characters)\n * @throws Error if description is too short\n */\n public setDescription(description: string): void {\n if (!description || description.length < 20) {\n throw descriptionError\n }\n\n this.program.getSignature().setDescription(description)\n this.func.description = description\n }\n\n public setDefinition(definition: string): void {\n if (!definition || definition.length < 100) {\n throw definitionError\n }\n\n this.program.getSignature().setDescription(definition)\n }\n\n private getDebug(\n ai: AxAIService,\n options?: Readonly<AxProgramForwardOptions>\n ): boolean {\n return options?.debug ?? this.debug ?? ai?.getOptions()?.debug ?? false\n }\n}\n\nfunction toCamelCase(inputString: string): string {\n // Split the string by any non-alphanumeric character (including underscores, spaces, hyphens)\n const words = inputString.split(/[^a-zA-Z0-9]/)\n\n // Map through each word, capitalize the first letter of each word except the first word\n const camelCaseString = words\n .map((word, index) => {\n // Lowercase the word to handle cases like uppercase letters in input\n const lowerWord = word.toLowerCase()\n\n // Capitalize the first letter of each word except the first one\n if (index > 0 && lowerWord && lowerWord[0]) {\n return lowerWord[0].toUpperCase() + lowerWord.slice(1)\n }\n\n return lowerWord\n })\n .join('')\n\n return camelCaseString\n}\n\n/**\n * Adds a required model parameter to a JSON Schema definition based on provided model mappings.\n * The model parameter will be an enum with values from the model map keys.\n *\n * @param parameters - The original JSON Schema parameters definition (optional)\n * @param models - Array of model mappings containing keys, model names and descriptions\n * @returns Updated JSON Schema with added model parameter\n */\nexport function addModelParameter(\n parameters: AxFunctionJSONSchema | undefined,\n models: AxAIModelList\n): AxFunctionJSONSchema {\n // If parameters is undefined, create a base schema\n const baseSchema: AxFunctionJSONSchema = parameters\n ? structuredClone(parameters)\n : {\n type: 'object',\n properties: {},\n required: [],\n }\n\n // Check if model parameter already exists\n if (baseSchema.properties?.model) {\n return baseSchema\n }\n\n // Create the model property schema\n const modelProperty: AxFunctionJSONSchema & {\n enum: string[]\n description: string\n } = {\n type: 'string',\n enum: models.map((m) => m.key),\n description: `The AI model to use for this function call. Available options: ${models\n .map((m) => `\\`${m.key}\\` ${m.description}`)\n .join(', ')}`,\n }\n\n // Create new properties object with model parameter\n const newProperties = {\n ...(baseSchema.properties ?? {}),\n model: modelProperty,\n }\n\n // Add model to required fields\n const newRequired = [...(baseSchema.required ?? []), 'model']\n\n // Return updated schema\n return {\n ...baseSchema,\n properties: newProperties,\n required: newRequired,\n }\n}\n\n// New helper: removePropertiesFromSchema\n// Clones a JSON schema and removes properties and required fields matching the provided keys.\nfunction removePropertiesFromSchema(\n schema: Readonly<AxFunctionJSONSchema>,\n keys: string[]\n): AxFunctionJSONSchema {\n const newSchema = structuredClone(schema)\n if (newSchema.properties) {\n for (const key of keys) {\n delete newSchema.properties[key]\n }\n }\n if (Array.isArray(newSchema.required)) {\n const filteredRequired = newSchema.required.filter(\n (r: string) => !keys.includes(r)\n )\n Object.defineProperty(newSchema, 'required', {\n value: filteredRequired,\n writable: true,\n configurable: true,\n })\n }\n return newSchema\n}\n\n// New helper: pick\n// Returns an object composed of the picked object properties.\nfunction pick<T extends object, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key]\n }\n }\n return result\n}\n","import { createReadStream } from 'node:fs'\n\nexport interface AxApacheTikaArgs {\n url?: string | URL\n fetch?: typeof fetch\n}\n\nexport interface AxApacheTikaConvertOptions {\n format?: 'text' | 'html'\n}\n\nexport class AxApacheTika {\n private tikaUrl: URL\n private fetch?: typeof fetch\n\n constructor(args?: Readonly<AxApacheTikaArgs>) {\n const _args = args ?? { url: 'http://localhost:9998/' }\n this.tikaUrl = new URL('/tika', _args.url)\n this.fetch = _args.fetch\n }\n\n private async _convert(\n file: string | Blob,\n options?: Readonly<AxApacheTikaConvertOptions>\n ): Promise<string> {\n const fileData =\n typeof file === 'string' ? createReadStream(file) : file.stream()\n\n if (!fileData) {\n throw new Error('Failed to read file data')\n }\n\n const acceptValue = options?.format === 'html' ? 'text/html' : 'text/plain'\n\n try {\n const res = await (this.fetch ?? fetch)(this.tikaUrl, {\n body: fileData,\n headers: { Accept: acceptValue },\n duplex: 'half',\n method: 'PUT',\n })\n\n if (!res.ok) {\n throw new Error(`Failed to upload file: ${res.statusText}`)\n }\n\n const text = await res.text()\n return text\n } catch (error) {\n throw new Error(`Error converting file: ${error}`)\n }\n }\n\n public async convert(\n files: Readonly<string[] | Blob[]>,\n options?: Readonly<{ batchSize?: number; format?: 'html' | 'text' }>\n ): Promise<string[]> {\n const results: string[] = []\n const bs = options?.batchSize ?? 10\n\n for (let i = 0; i < files.length; i += bs) {\n const batch = files.slice(i, i + bs)\n const uploadPromises = batch.map((files) =>\n this._convert(files, { format: options?.format })\n )\n const batchResults = await Promise.all(uploadPromises)\n results.push(...batchResults)\n }\n\n return results\n }\n}\nexport default AxApacheTika\n","import type { ReadableStream } from 'stream/web'\n\nimport {\n AxAIServiceAuthenticationError,\n AxAIServiceError,\n AxAIServiceNetworkError,\n AxAIServiceResponseError,\n AxAIServiceStatusError,\n AxAIServiceStreamTerminatedError,\n AxAIServiceTimeoutError,\n} from '../util/apicall.js'\n\nimport type {\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n} from './types.js'\n\n/**\n * Options for the balancer.\n */\nexport type AxBalancerOptions = {\n comparator?: (a: AxAIService, b: AxAIService) => number\n debug?: boolean\n initialBackoffMs?: number\n maxBackoffMs?: number\n maxRetries?: number\n}\n\n/**\n * Balancer that rotates through services.\n */\nexport class AxBalancer implements AxAIService<unknown, unknown> {\n private services: AxAIService[]\n private currentServiceIndex: number = 0\n private currentService: AxAIService\n private debug: boolean\n private initialBackoffMs: number\n private maxBackoffMs: number\n private maxRetries: number\n private serviceFailures: Map<\n string,\n { retries: number; lastFailureTime: number }\n > = new Map()\n\n constructor(services: readonly AxAIService[], options?: AxBalancerOptions) {\n if (services.length === 0) {\n throw new Error('No AI services provided.')\n }\n\n validateModels(services)\n\n this.services = [...services].sort(\n options?.comparator ?? AxBalancer.metricComparator\n )\n\n const cs = this.services[this.currentServiceIndex]\n if (cs === undefined) {\n throw new Error('Error initializing the AI services.') // More specific error message\n }\n this.currentService = cs\n this.debug = options?.debug ?? true\n this.initialBackoffMs = options?.initialBackoffMs ?? 1000\n this.maxBackoffMs = options?.maxBackoffMs ?? 32000\n this.maxRetries = options?.maxRetries ?? 3\n }\n\n /**\n * Service comparator that respects the input order of services.\n */\n public static inputOrderComparator = () => 0\n\n /**\n * Service comparator that sorts services by cost.\n */\n\n // Requires a rethink\n /*\n public static costComparator = (a: AxAIService, b: AxAIService) => {\n const aInfo = a.getModelInfo()\n const bInfo = b.getModelInfo()\n const aTotalCost =\n (aInfo.promptTokenCostPer1M || Infinity) +\n (aInfo.completionTokenCostPer1M || Infinity)\n const bTotalCost =\n (bInfo.promptTokenCostPer1M || Infinity) +\n (bInfo.completionTokenCostPer1M || Infinity)\n return aTotalCost - bTotalCost\n }\n */\n\n public static metricComparator = (a: AxAIService, b: AxAIService) => {\n const aMetrics = a.getMetrics()\n const bMetrics = b.getMetrics()\n // Compare mean chat latency between services\n return aMetrics.latency.chat.mean - bMetrics.latency.chat.mean\n }\n\n getModelList(): AxAIModelList | undefined {\n return this.currentService.getModelList()\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n return this.currentService.getDefaultModels()\n }\n\n private getNextService(): boolean {\n const cs = this.services[++this.currentServiceIndex]\n if (cs === undefined) {\n return false\n }\n this.currentService = cs\n return true\n }\n\n private reset(): void {\n this.currentServiceIndex = 0\n const cs = this.services[this.currentServiceIndex]\n if (cs === undefined) {\n throw new Error('No AI services provided.')\n }\n this.currentService = cs\n }\n\n getName(): string {\n return this.currentService.getName()\n }\n\n getId(): string {\n return this.currentService.getId()\n }\n\n getFeatures(model?: string) {\n return this.currentService.getFeatures(model)\n }\n\n getMetrics(): AxAIServiceMetrics {\n return this.currentService.getMetrics()\n }\n\n private canRetryService(): boolean {\n const failure = this.serviceFailures.get(this.currentService.getId())\n if (!failure) return true\n\n const { retries, lastFailureTime } = failure\n const timeSinceLastFailure = Date.now() - lastFailureTime\n\n const backoffMs = Math.min(\n this.initialBackoffMs * Math.pow(2, retries),\n this.maxBackoffMs\n )\n return timeSinceLastFailure >= backoffMs\n }\n\n private handleFailure(): boolean {\n const failure = this.serviceFailures.get(this.currentService.getId())\n const retries = (failure?.retries ?? 0) + 1\n\n this.serviceFailures.set(this.currentService.getId(), {\n retries,\n lastFailureTime: Date.now(),\n })\n\n if (this.debug) {\n console.warn(\n `AxBalancer: Service ${this.currentService.getName()} failed (retry ${retries}/${this.maxRetries})`\n )\n }\n\n if (retries >= this.maxRetries) {\n const gotNextService = this.getNextService()\n if (this.debug) {\n console.warn(\n `AxBalancer: Switching to service ${this.currentService.getName()}`\n )\n }\n return gotNextService\n }\n\n return true\n }\n\n private handleSuccess(): void {\n this.serviceFailures.delete(this.currentService.getId())\n }\n\n async chat(\n req: Readonly<AxChatRequest>,\n options?: Readonly<AxAIPromptConfig & AxAIServiceActionOptions> | undefined\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n this.reset()\n\n while (true) {\n if (!this.canRetryService()) {\n if (!this.getNextService()) {\n throw new Error('All services exhausted')\n }\n continue\n }\n\n try {\n const response = await this.currentService.chat(req, options)\n this.handleSuccess()\n return response\n } catch (e) {\n if (!(e instanceof AxAIServiceError)) {\n throw e\n }\n\n switch (e.constructor) {\n case AxAIServiceAuthenticationError:\n // Handle authentication failure, e.g., refresh token, prompt user to re-login\n throw e\n\n case AxAIServiceStatusError:\n // Handle specific HTTP error codes, e.g., display a user-friendly message for a 404 Not Found\n break\n\n case AxAIServiceNetworkError:\n // Handle network issues, e.g., display a message about checking network connectivity\n break\n\n case AxAIServiceResponseError:\n // Handle errors related to processing the response, e.g., log the error and retry the request\n break\n\n case AxAIServiceStreamTerminatedError:\n // Handle unexpected stream termination, e.g., retry the request or display an error message\n break\n\n case AxAIServiceTimeoutError:\n // Handle request timeouts, e.g., increase timeout, retry, or display an error message\n break\n\n default:\n throw e\n // Handle unexpected AxAIServiceErrors\n }\n\n if (!this.handleFailure()) {\n throw e\n }\n }\n }\n }\n\n async embed(\n req: Readonly<AxEmbedRequest>,\n options?: Readonly<AxAIServiceActionOptions> | undefined\n ): Promise<AxEmbedResponse> {\n this.reset()\n\n while (true) {\n if (!this.canRetryService()) {\n if (!this.getNextService()) {\n throw new Error('All services exhausted')\n }\n continue\n }\n\n try {\n const response = await this.currentService.embed(req, options)\n this.handleSuccess()\n return response\n } catch (e) {\n if (!this.handleFailure()) {\n throw e\n }\n }\n }\n }\n\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n this.currentService.setOptions(options)\n }\n\n getOptions(): Readonly<AxAIServiceOptions> {\n return this.currentService.getOptions()\n }\n}\n\nfunction validateModels(services: readonly AxAIService[]) {\n // Check if any service has a model list.\n const serviceWithModel = services.find(\n (service) => service.getModelList() !== undefined\n )\n if (!serviceWithModel) {\n // No service provides a model list; no validation needed.\n return\n }\n\n // Use the first service with a model list as the reference.\n const referenceModelList = serviceWithModel.getModelList()\n if (!referenceModelList) {\n throw new Error('No model list found in any service.')\n }\n const referenceKeys = new Set(referenceModelList.map((model) => model.key))\n\n // Validate that all services provide a model list with the same keys.\n for (let i = 0; i < services.length; i++) {\n const service = services[i]\n if (!service) {\n throw new Error(`Service at index ${i} is undefined`)\n }\n const modelList = service.getModelList()\n if (!modelList) {\n throw new Error(\n `Service at index ${i} (${service.getName()}) has no model list while another service does.`\n )\n }\n\n const serviceKeys = new Set(modelList.map((model) => model.key))\n\n // Check for missing keys compared to the reference\n for (const key of referenceKeys) {\n if (!serviceKeys.has(key)) {\n throw new Error(\n `Service at index ${i} (${service.getName()}) is missing model \"${key}\"`\n )\n }\n }\n // Check for extra keys not in the reference\n for (const key of serviceKeys) {\n if (!referenceKeys.has(key)) {\n throw new Error(\n `Service at index ${i} (${service.getName()}) has extra model \"${key}\"`\n )\n }\n }\n }\n}\n","import type { AxAIService } from '../ai/types.js'\n\nimport type {\n AxFieldValue,\n AxGenIn,\n AxGenOut,\n AxProgram,\n AxProgramDemos,\n AxProgramTrace,\n} from './program.js'\nimport { updateDetailedProgress, updateProgressBar } from './util.js'\n\n// Define model config interface\ninterface ModelConfig {\n temperature: number\n max_tokens?: number\n [key: string]: number | string | boolean | undefined\n}\n\nexport type AxExample = Record<string, AxFieldValue>\n\nexport type AxMetricFn = <T extends AxGenOut = AxGenOut>(\n arg0: Readonly<{ prediction: T; example: AxExample }>\n) => boolean\n\nexport type AxMetricFnArgs = Parameters<AxMetricFn>[0]\n\nexport type AxOptimizerArgs<IN extends AxGenIn, OUT extends AxGenOut> = {\n ai: AxAIService\n program: Readonly<AxProgram<IN, OUT>>\n examples: Readonly<AxExample[]>\n options?: {\n maxRounds?: number\n maxExamples?: number\n maxDemos?: number\n batchSize?: number\n earlyStoppingPatience?: number\n teacherAI?: AxAIService\n costMonitoring?: boolean\n maxTokensPerGeneration?: number\n verboseMode?: boolean\n debugMode?: boolean\n }\n}\n\nexport interface AxOptimizationStats {\n totalCalls: number\n successfulDemos: number\n estimatedTokenUsage: number\n earlyStopped: boolean\n earlyStopping?: {\n bestScoreRound: number\n patienceExhausted: boolean\n }\n}\n\nexport class AxBootstrapFewShot<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenOut = AxGenOut,\n> {\n private ai: AxAIService\n private teacherAI?: AxAIService\n private program: Readonly<AxProgram<IN, OUT>>\n private examples: Readonly<AxExample[]>\n private maxRounds: number\n private maxDemos: number\n private maxExamples: number\n private batchSize: number\n private earlyStoppingPatience: number\n private costMonitoring: boolean\n private maxTokensPerGeneration: number\n private verboseMode: boolean\n private debugMode: boolean\n private traces: AxProgramTrace[] = []\n private stats: AxOptimizationStats = {\n totalCalls: 0,\n successfulDemos: 0,\n estimatedTokenUsage: 0,\n earlyStopped: false,\n }\n\n constructor({\n ai,\n program,\n examples = [],\n options,\n }: Readonly<AxOptimizerArgs<IN, OUT>>) {\n if (examples.length === 0) {\n throw new Error('No examples found')\n }\n this.maxRounds = options?.maxRounds ?? 3\n this.maxDemos = options?.maxDemos ?? 4\n this.maxExamples = options?.maxExamples ?? 16\n this.batchSize = options?.batchSize ?? 1\n this.earlyStoppingPatience = options?.earlyStoppingPatience ?? 0\n this.costMonitoring = options?.costMonitoring ?? false\n this.maxTokensPerGeneration = options?.maxTokensPerGeneration ?? 0\n this.verboseMode = options?.verboseMode ?? true\n this.debugMode = options?.debugMode ?? false\n\n this.ai = ai\n this.teacherAI = options?.teacherAI\n this.program = program\n this.examples = examples\n }\n\n private async compileRound(\n roundIndex: number,\n metricFn: AxMetricFn,\n options?: Readonly<AxOptimizerArgs<IN, OUT>['options']>\n ) {\n const st = new Date().getTime()\n const maxDemos = options?.maxDemos ?? this.maxDemos\n const aiOpt = {\n modelConfig: {\n temperature: 0.7,\n } as ModelConfig,\n }\n\n // Apply token limit if specified\n if (this.maxTokensPerGeneration > 0) {\n aiOpt.modelConfig.max_tokens = this.maxTokensPerGeneration\n }\n\n const examples = randomSample(this.examples, this.maxExamples)\n const previousSuccessCount = this.traces.length\n\n // Process examples in batches if batch size > 1\n for (let i = 0; i < examples.length; i += this.batchSize) {\n if (i > 0) {\n aiOpt.modelConfig.temperature = 0.7 + 0.001 * i\n }\n\n const batch = examples.slice(i, i + this.batchSize)\n\n // Process batch sequentially for now (could be parallelized if AI service supports it)\n for (const ex of batch) {\n if (!ex) {\n continue\n }\n\n // Use remaining examples as demonstration examples (excluding current one)\n const exList = examples.filter((e) => e !== ex)\n this.program.setExamples(exList)\n\n // Use teacher AI if provided, otherwise use student AI\n const aiService = this.teacherAI || this.ai\n\n this.stats.totalCalls++\n let res: OUT\n let error: Error | undefined\n\n try {\n res = await this.program.forward(aiService, ex as IN, aiOpt)\n\n // Estimate token usage if cost monitoring is enabled\n if (this.costMonitoring) {\n // Very rough estimate - replace with actual token counting from your AI service\n this.stats.estimatedTokenUsage +=\n JSON.stringify(ex).length / 4 + JSON.stringify(res).length / 4\n }\n\n const success = metricFn({ prediction: res, example: ex })\n if (success) {\n this.traces = [...this.traces, ...this.program.getTraces()]\n this.stats.successfulDemos++\n }\n } catch (err) {\n error = err as Error\n res = {} as OUT\n }\n\n const current =\n i + examples.length * roundIndex + (batch.indexOf(ex) + 1)\n const total = examples.length * this.maxRounds\n const et = new Date().getTime() - st\n\n // Use enhanced progress reporting if verbose or debug mode is enabled\n if (this.verboseMode || this.debugMode) {\n // Create a configuration object to pass to updateDetailedProgress\n const configInfo = {\n maxRounds: this.maxRounds,\n batchSize: this.batchSize,\n earlyStoppingPatience: this.earlyStoppingPatience,\n costMonitoring: this.costMonitoring,\n verboseMode: this.verboseMode,\n debugMode: this.debugMode,\n }\n\n updateDetailedProgress(\n roundIndex,\n current,\n total,\n et,\n ex,\n this.stats,\n configInfo,\n res,\n error\n )\n } else {\n // Use the standard progress bar for normal mode\n updateProgressBar(\n current,\n total,\n this.traces.length,\n et,\n 'Tuning Prompt',\n 30\n )\n }\n\n if (this.traces.length >= maxDemos) {\n return\n }\n }\n }\n\n // Check if we should early stop based on no improvement\n if (this.earlyStoppingPatience > 0) {\n const newSuccessCount = this.traces.length\n const improvement = newSuccessCount - previousSuccessCount\n\n if (!this.stats.earlyStopping) {\n this.stats.earlyStopping = {\n bestScoreRound: improvement > 0 ? roundIndex : 0,\n patienceExhausted: false,\n }\n } else if (improvement > 0) {\n this.stats.earlyStopping.bestScoreRound = roundIndex\n } else if (\n roundIndex - this.stats.earlyStopping.bestScoreRound >=\n this.earlyStoppingPatience\n ) {\n this.stats.earlyStopping.patienceExhausted = true\n this.stats.earlyStopped = true\n\n if (this.verboseMode || this.debugMode) {\n console.log(\n `\\nEarly stopping triggered after ${roundIndex + 1} rounds. No improvement for ${this.earlyStoppingPatience} rounds.`\n )\n }\n\n return\n }\n }\n }\n\n public async compile(\n metricFn: AxMetricFn,\n options?: Readonly<AxOptimizerArgs<IN, OUT>['options']>\n ): Promise<{ demos: AxProgramDemos[]; stats: AxOptimizationStats }> {\n const maxRounds = options?.maxRounds ?? this.maxRounds\n this.traces = []\n this.stats = {\n totalCalls: 0,\n successfulDemos: 0,\n estimatedTokenUsage: 0,\n earlyStopped: false,\n }\n\n for (let i = 0; i < maxRounds; i++) {\n await this.compileRound(i, metricFn, options)\n\n // Break early if early stopping was triggered\n if (this.stats.earlyStopped) {\n break\n }\n }\n\n if (this.traces.length === 0) {\n throw new Error(\n 'No demonstrations found. Either provider more examples or improve the existing ones.'\n )\n }\n\n const demos: AxProgramDemos[] = groupTracesByKeys(this.traces)\n\n return {\n demos,\n stats: this.stats,\n }\n }\n\n // Get optimization statistics\n public getStats(): AxOptimizationStats {\n return this.stats\n }\n}\n\nfunction groupTracesByKeys(\n programTraces: readonly AxProgramTrace[]\n): AxProgramDemos[] {\n const groupedTraces = new Map<string, Record<string, AxFieldValue>[]>()\n\n // Group all traces by their keys\n for (const programTrace of programTraces) {\n if (groupedTraces.has(programTrace.programId)) {\n const traces = groupedTraces.get(programTrace.programId)\n if (traces) {\n traces.push(programTrace.trace)\n }\n } else {\n groupedTraces.set(programTrace.programId, [programTrace.trace])\n }\n }\n\n // Convert the Map into an array of ProgramDemos\n const programDemosArray: AxProgramDemos[] = []\n for (const [programId, traces] of groupedTraces.entries()) {\n programDemosArray.push({ traces, programId })\n }\n\n return programDemosArray\n}\n\nconst randomSample = <T>(array: readonly T[], n: number): T[] => {\n // Clone the array to avoid modifying the original array\n const clonedArray = [...array]\n // Shuffle the cloned array\n for (let i = clonedArray.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n const caI = clonedArray[i]\n const caJ = clonedArray[j]\n\n if (!caI || !caJ) {\n throw new Error('Invalid array elements')\n }\n\n ;[clonedArray[i], clonedArray[j]] = [caJ, caI]\n }\n // Return the first `n` items of the shuffled array\n return clonedArray.slice(0, n)\n}\n","import { type Span, SpanKind, type Tracer } from '@opentelemetry/api'\n\nimport { axSpanAttributes } from '../trace/trace.js'\n\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBService,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nexport interface AxDBBaseArgs {\n fetch?: typeof fetch\n tracer?: Tracer\n}\n\nexport interface AxDBBaseOpOptions {\n span?: Span\n}\n\nexport class AxDBBase implements AxDBService {\n protected name: string\n protected fetch?: typeof fetch\n private tracer?: Tracer\n\n _upsert?: (\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean,\n options?: Readonly<AxDBBaseOpOptions>\n ) => Promise<AxDBUpsertResponse>\n\n _batchUpsert?: (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean,\n options?: Readonly<AxDBBaseOpOptions>\n ) => Promise<AxDBUpsertResponse>\n\n _query?: (\n req: Readonly<AxDBQueryRequest>,\n options?: Readonly<AxDBBaseOpOptions>\n ) => Promise<AxDBQueryResponse>\n\n constructor({\n name,\n fetch,\n tracer,\n }: Readonly<AxDBBaseArgs & { name: string }>) {\n this.name = name\n this.fetch = fetch\n this.tracer = tracer\n }\n\n async upsert(\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean\n ): Promise<AxDBUpsertResponse> {\n if (!this._upsert) {\n throw new Error('upsert() not implemented')\n }\n\n if (!this.tracer) {\n return await this._upsert(req, update)\n }\n\n return await this.tracer?.startActiveSpan(\n 'DB Upsert Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.DB_SYSTEM]: this.name,\n [axSpanAttributes.DB_OPERATION_NAME]: 'upsert',\n [axSpanAttributes.DB_TABLE]: req.table,\n [axSpanAttributes.DB_NAMESPACE]: req.namespace,\n [axSpanAttributes.DB_OPERATION_NAME]: update ? 'update' : 'insert',\n },\n },\n async (span) => {\n try {\n return await this._upsert!(req, update, { span })\n } finally {\n span.end()\n }\n }\n )\n }\n\n async batchUpsert(\n req: Readonly<AxDBUpsertRequest[]>,\n update?: boolean\n ): Promise<AxDBUpsertResponse> {\n if (!this._batchUpsert) {\n throw new Error('batchUpsert() not implemented')\n }\n if (req.length == 0) {\n throw new Error('Batch request is empty')\n }\n if (!req[0]) {\n throw new Error('Batch request is invalid first element is undefined')\n }\n\n if (!this.tracer) {\n return await this._batchUpsert(req, update)\n }\n\n return await this.tracer?.startActiveSpan(\n 'DB Batch Upsert Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.DB_SYSTEM]: this.name,\n [axSpanAttributes.DB_OPERATION_NAME]: 'upsert',\n [axSpanAttributes.DB_TABLE]: req[0].table,\n [axSpanAttributes.DB_NAMESPACE]: req[0].namespace,\n [axSpanAttributes.DB_OPERATION_NAME]: update ? 'update' : 'insert',\n },\n },\n async (span) => {\n try {\n return await this._batchUpsert!(req, update, { span })\n } finally {\n span.end()\n }\n }\n )\n }\n\n async query(req: Readonly<AxDBQueryRequest>): Promise<AxDBQueryResponse> {\n if (!this._query) {\n throw new Error('query() not implemented')\n }\n if (!this.tracer) {\n return await this._query(req)\n }\n\n return await this.tracer?.startActiveSpan(\n 'DB Query Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.DB_SYSTEM]: this.name,\n [axSpanAttributes.DB_OPERATION_NAME]: 'upsert',\n [axSpanAttributes.DB_TABLE]: req.table,\n [axSpanAttributes.DB_NAMESPACE]: req.namespace,\n [axSpanAttributes.DB_OPERATION_NAME]: 'query',\n },\n },\n async (span) => {\n try {\n return await this._query!(req, { span })\n } finally {\n span.end()\n }\n }\n )\n }\n}\n","import { apiCall } from '../util/apicall.js'\n\nimport { AxDBBase, type AxDBBaseArgs, type AxDBBaseOpOptions } from './base.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nconst baseURL = 'https://api.cloudflare.com/client/v4/accounts/'\n\nexport type AxDBCloudflareOpOptions = AxDBBaseOpOptions\n\ntype AxCloudflareUpsertResponse = {\n success: boolean\n errors?: { message: string }[]\n result: { ids: string[] }\n}\n\ntype AxCloudflareQueryResponse = {\n success: boolean\n errors?: { message: string }[]\n result: {\n matches: {\n id: string\n score: number\n values: number[]\n metadata: object\n }[]\n }\n}\n\nexport interface AxDBCloudflareArgs extends AxDBBaseArgs {\n name: 'cloudflare'\n apiKey: string\n accountId: string\n fetch?: typeof fetch\n}\n\n/**\n * Cloudflare: DB Service\n */\nexport class AxDBCloudflare extends AxDBBase {\n private apiKey: string\n private accountId: string\n\n constructor({\n apiKey,\n accountId,\n fetch,\n tracer,\n }: Readonly<Omit<AxDBCloudflareArgs, 'name'>>) {\n if (!apiKey || !accountId) {\n throw new Error('Cloudflare credentials not set')\n }\n super({ name: 'Cloudflare', fetch, tracer })\n this.apiKey = apiKey\n this.accountId = accountId\n }\n\n override _upsert = async (\n req: Readonly<AxDBUpsertRequest>,\n _update?: boolean,\n options?: Readonly<AxDBCloudflareOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n const res = (await apiCall(\n {\n url: new URL(\n `${this.accountId}/vectorize/indexes/${req.table}/upsert`,\n baseURL\n ),\n headers: {\n 'X-Auth-Key': this.apiKey,\n },\n fetch: this.fetch,\n span: options?.span,\n },\n {\n id: req.id,\n values: req.values,\n namespace: req.namespace,\n metadata: req.metadata,\n }\n )) as AxCloudflareUpsertResponse\n\n if (res.errors) {\n throw new Error(\n `Cloudflare upsert failed: ${res.errors.map(({ message }) => message).join(', ')}`\n )\n }\n\n return {\n ids: res.result.ids,\n }\n }\n\n override batchUpsert = async (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean,\n options?: Readonly<AxDBCloudflareOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n if (update) {\n throw new Error('Weaviate does not support batch update')\n }\n if (batchReq.length < 1) {\n throw new Error('Batch request is empty')\n }\n if (!batchReq[0] || !batchReq[0].table) {\n throw new Error('Table name is empty')\n }\n const table = batchReq[0].table\n\n const res = (await apiCall(\n {\n url: new URL(\n `${this.accountId}/vectorize/indexes/${table}/upsert`,\n baseURL\n ),\n headers: {\n 'X-Auth-Key': this.apiKey,\n },\n fetch: this.fetch,\n span: options?.span,\n },\n batchReq.map((req) => ({\n id: req.id,\n values: req.values,\n namespace: req.namespace,\n metadata: req.metadata,\n }))\n )) as AxCloudflareUpsertResponse\n\n if (res.errors) {\n throw new Error(\n `Cloudflare batch upsert failed: ${res.errors\n .map(({ message }) => message)\n .join(', ')}`\n )\n }\n\n return {\n ids: res.result.ids,\n }\n }\n\n override query = async (\n req: Readonly<AxDBQueryRequest>,\n options?: Readonly<AxDBCloudflareOpOptions>\n ): Promise<AxDBQueryResponse> => {\n const res = (await apiCall(\n {\n url: new URL(\n `${this.accountId}/vectorize/indexes/${req.table}/query`,\n baseURL\n ),\n headers: {\n 'X-Auth-Key': this.apiKey,\n },\n fetch: this.fetch,\n span: options?.span,\n },\n {\n vector: req.values,\n topK: req.limit || 10,\n returnValues: true,\n }\n )) as AxCloudflareQueryResponse\n\n if (res.errors) {\n throw new Error(\n `Cloudflare query failed: ${res.errors.map(({ message }) => message).join(', ')}`\n )\n }\n\n const matches = res.result.matches.map(\n ({ id, score, values, metadata }) => ({\n id,\n score,\n values,\n metadata,\n })\n )\n return { matches } as AxDBQueryResponse\n }\n}\n","import { AxDBBase, type AxDBBaseArgs, type AxDBBaseOpOptions } from './base.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nexport type AxDBMemoryOpOptions = AxDBBaseOpOptions\n\nexport interface AxDBMemoryArgs extends AxDBBaseArgs {\n name: 'memory'\n}\n\nexport type AxDBState = Record<string, Record<string, AxDBUpsertRequest>>\n\n/**\n * MemoryDB: DB Service\n */\nexport class AxDBMemory extends AxDBBase {\n private state: AxDBState\n\n constructor({ tracer }: Readonly<Omit<AxDBMemoryArgs, 'name'>> = {}) {\n super({ name: 'Memory', tracer })\n this.state = {}\n }\n\n override _upsert = async (\n req: Readonly<AxDBUpsertRequest>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _update?: boolean,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxDBMemoryOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n if (!this.state[req.table]) {\n this.state[req.table] = {\n [req.id]: req,\n }\n } else {\n const obj = this.state[req.table]\n if (!obj) {\n throw new Error('Table not found: ' + req.table)\n }\n obj[req.id] = req\n }\n\n return { ids: [req.id] }\n }\n\n override _batchUpsert = async (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxDBMemoryOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n const ids: string[] = []\n for (const req of batchReq) {\n const res = await this.upsert(req, update)\n ids.push(...res.ids)\n }\n\n return { ids }\n }\n\n override _query = async (\n req: Readonly<AxDBQueryRequest>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxDBMemoryOpOptions>\n ): Promise<AxDBQueryResponse> => {\n const table = this.state[req.table]\n if (!table) {\n return { matches: [] }\n }\n\n const matches: AxDBQueryResponse['matches'] = []\n\n Object.entries(table).forEach(([id, data]) => {\n if (req.values && data.values) {\n const score = distance(req.values, data.values)\n matches.push({ id: id, score: score, metadata: data.metadata })\n }\n })\n\n matches.sort((a, b) => a.score - b.score)\n if (req.limit) {\n matches.length = req.limit\n }\n\n return { matches }\n }\n\n public getDB = () => {\n return structuredClone(this.state)\n }\n\n public setDB = (state: AxDBState) => {\n this.state = structuredClone(state)\n }\n\n public clearDB = () => {\n this.state = {}\n }\n}\n\nconst distance = (a: readonly number[], b: readonly number[]): number => {\n if (a.length !== b.length) {\n throw new Error('Vectors must be of the same length.')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n let zeroVectorA = true\n let zeroVectorB = true\n\n const vectorA = new Float64Array(a)\n const vectorB = new Float64Array(b)\n\n for (let i = 0; i < vectorA.length; i++) {\n dotProduct += vectorA[i]! * vectorB[i]!\n normA += vectorA[i]! * vectorA[i]!\n normB += vectorB[i]! * vectorB[i]!\n if (vectorA[i] !== 0) zeroVectorA = false\n if (vectorB[i] !== 0) zeroVectorB = false\n }\n\n if (zeroVectorA || zeroVectorB) {\n return 1 // Return maximum distance if one vector is zero\n }\n\n const sqrtNormA = Math.sqrt(normA)\n const sqrtNormB = Math.sqrt(normB)\n const similarity = dotProduct / (sqrtNormA * sqrtNormB)\n return 1 - similarity // Returning distance as 1 - cosine similarity.\n}\n","import { apiCall } from '../util/apicall.js'\n\nimport { AxDBBase, type AxDBBaseArgs, type AxDBBaseOpOptions } from './base.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nexport type AxDBPineconeOpOptions = AxDBBaseOpOptions\n\ntype AxPineconeQueryRequest = {\n namespace?: string\n topK: number\n filter?: Record<string, string>\n includeValues: boolean\n includeMetadata: boolean\n vector: readonly number[]\n id?: string\n}\n\ntype AxPineconeQueryResponse = {\n matches: {\n id: string\n score: number\n values: number[]\n metadata?: Record<string, string>\n }[]\n}\n\nconst createPineconeQueryRequest = (\n req: Readonly<AxDBQueryRequest>\n): AxPineconeQueryRequest => {\n const pineconeQueryRequest: AxPineconeQueryRequest = {\n namespace: req.namespace,\n topK: req.limit || 10,\n filter: {},\n includeValues: true,\n includeMetadata: true,\n vector: req.values ?? [],\n id: req.id,\n }\n\n return pineconeQueryRequest\n}\n\nexport interface AxDBPineconeArgs extends AxDBBaseArgs {\n name: 'pinecone'\n apiKey: string\n host: string\n fetch?: typeof fetch\n}\n\n/**\n * Pinecone: DB Service\n */\nexport class AxDBPinecone extends AxDBBase {\n private apiKey: string\n private apiURL: string\n\n constructor({\n apiKey,\n host,\n fetch,\n tracer,\n }: Readonly<Omit<AxDBPineconeArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Pinecone API key not set')\n }\n super({ name: 'Pinecone', fetch, tracer })\n this.apiKey = apiKey\n this.apiURL = host\n }\n\n override _upsert = async (\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean,\n options?: Readonly<AxDBPineconeOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n await this._batchUpsert([req], update, options)\n return { ids: [req.id] }\n }\n\n override _batchUpsert = async (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n _update?: boolean,\n options?: Readonly<AxDBPineconeOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n if (batchReq.length === 0) {\n throw new Error('Batch request is empty')\n }\n await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: '/vectors/upsert',\n fetch: this.fetch,\n span: options?.span,\n },\n batchReq.map(({ id, values = [], metadata }) => ({\n id,\n values,\n metadata,\n }))\n )\n\n return { ids: batchReq.map(({ id }) => id) }\n }\n\n override query = async (\n req: Readonly<AxDBQueryRequest>,\n options?: Readonly<AxDBPineconeOpOptions>\n ): Promise<AxDBQueryResponse> => {\n if (req.text) {\n throw new Error('Pinecone does not support text')\n }\n\n const res = (await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: '/query',\n fetch: this.fetch,\n span: options?.span,\n },\n createPineconeQueryRequest(req)\n )) as AxPineconeQueryResponse\n\n const matches = res.matches.map(({ id, score, values, metadata }) => ({\n id,\n score,\n metadata,\n values,\n }))\n\n return { matches }\n }\n}\n","import { apiCall } from '../util/apicall.js'\n\nimport { AxDBBase, type AxDBBaseArgs, type AxDBBaseOpOptions } from './base.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nexport type AxDBWeaviateOpOptions = AxDBBaseOpOptions\n\ntype AxWeaviateUpsertResponse = {\n id: string\n result?: { errors?: { error: { message: string }[] } }\n}\n\ntype AxWeaviateQueryResponse = {\n errors?: { location: string; message: string; path: string }[]\n data: {\n Get: {\n [key: string]: {\n [key: string]: unknown\n }[]\n }\n }\n}\n\nexport interface AxDBWeaviateArgs extends AxDBBaseArgs {\n name: 'weaviate'\n apiKey: string\n host: string\n fetch?: typeof fetch\n}\n\n/**\n * Weaviate: DB Service\n */\nexport class AxDBWeaviate extends AxDBBase {\n private apiKey: string\n private apiURL: string\n\n constructor({\n apiKey,\n host,\n fetch,\n tracer,\n }: Readonly<Omit<AxDBWeaviateArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Weaviate API key not set')\n }\n super({ name: 'Weaviate', fetch, tracer })\n this.apiKey = apiKey\n this.apiURL = host\n }\n\n override _upsert = async (\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean,\n options?: Readonly<AxDBWeaviateOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n const res = (await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: `/v1/objects/${req.table}/${req.id}`,\n put: update ? true : false,\n fetch: this.fetch,\n span: options?.span,\n },\n {\n id: req.id,\n class: req.table,\n tenant: req.namespace,\n vector: req.values,\n properties: req.metadata ?? {},\n }\n )) as AxWeaviateUpsertResponse\n\n if (res?.result?.errors) {\n throw new Error(\n `Weaviate upsert failed: ${res.result.errors.error\n .map(({ message }) => message)\n .join(', ')}`\n )\n }\n\n return {\n ids: [res.id],\n }\n }\n\n override _batchUpsert = async (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean,\n options?: Readonly<AxDBWeaviateOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n if (update) {\n throw new Error('Weaviate does not support batch update')\n }\n if (batchReq.length === 0) {\n throw new Error('Batch request is empty')\n }\n const objects = batchReq.map((req) => ({\n id: req.id,\n class: req.table,\n tenant: req.namespace,\n vector: req.values,\n properties: req.metadata ?? {},\n }))\n\n const res = (await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: '/v1/batch/objects',\n fetch: this.fetch,\n span: options?.span,\n },\n { objects }\n )) as AxWeaviateUpsertResponse[]\n\n if (res?.some(({ result }) => result?.errors)) {\n throw new Error(\n `Weaviate batch upsert failed: ${res\n .map(({ result }) =>\n result?.errors?.error.map(({ message }) => message).join(', ')\n )\n .join(', ')}`\n )\n }\n\n return {\n ids: res.map(({ id }) => id),\n }\n }\n\n override _query = async (\n req: Readonly<AxDBQueryRequest>,\n options?: Readonly<AxDBWeaviateOpOptions>\n ): Promise<AxDBQueryResponse> => {\n let filter = ''\n\n if (req.columns && req.columns.length === 0) {\n throw new Error('Weaviate requires at least one column')\n }\n\n if (req.values) {\n filter = `nearVector: {\n vector: [${req.values.join(',')}],\n }`\n } else if (req.text) {\n filter = `nearText: {\n concepts: ['${req.text}'],\n }`\n } else {\n throw new Error('Weaviate requires either text or values')\n }\n\n const res = (await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: '/v1/graphql',\n fetch: this.fetch,\n span: options?.span,\n },\n {\n query: `{\n Get {\n ${req.table} (\n limit: ${req.limit || 10},\n ${filter}\n ) {\n ${req.columns?.join('\\n')}\n }\n }\n }`,\n }\n )) as AxWeaviateQueryResponse\n\n if (res.errors) {\n throw new Error(\n `Weaviate query failed: ${res.errors\n .map(({ message }) => message)\n .join(', ')}`\n )\n }\n\n const resMatches = res.data.Get[req.table]\n\n if (!resMatches) {\n return { matches: [] }\n }\n\n const matches = resMatches.map((match) => {\n return {\n id: match['id'] as string,\n score: 1,\n metadata: match,\n }\n })\n return { matches } as AxDBQueryResponse\n }\n}\n","import { AxDBCloudflare, type AxDBCloudflareArgs } from './cloudflare.js'\nimport { AxDBMemory, type AxDBMemoryArgs } from './memory.js'\nimport { AxDBPinecone, type AxDBPineconeArgs } from './pinecone.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBService,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\nimport { AxDBWeaviate, type AxDBWeaviateArgs } from './weaviate.js'\n\nexport type AxDBArgs =\n | AxDBCloudflareArgs\n | AxDBPineconeArgs\n | AxDBWeaviateArgs\n | AxDBMemoryArgs\n\nexport class AxDB implements AxDBService {\n private db: AxDBService\n constructor(args: Readonly<AxDBArgs>) {\n switch (args.name) {\n case 'weaviate':\n this.db = new AxDBWeaviate(args)\n break\n case 'pinecone':\n this.db = new AxDBPinecone(args)\n break\n case 'cloudflare':\n this.db = new AxDBCloudflare(args)\n break\n case 'memory':\n this.db = new AxDBMemory(args)\n break\n default:\n throw new Error(`Unknown DB`)\n }\n }\n async upsert(\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean\n ): Promise<AxDBUpsertResponse> {\n return await this.db.upsert(req, update)\n }\n\n async batchUpsert(\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean\n ): Promise<AxDBUpsertResponse> {\n return await this.db.batchUpsert(batchReq, update)\n }\n\n async query(req: Readonly<AxDBQueryRequest>): Promise<AxDBQueryResponse> {\n return await this.db.query(req)\n }\n}\n","import {\n type AxAIService,\n type AxDBQueryResponse,\n type AxDBService,\n type AxProgram,\n} from '../index.js'\n\nexport type AxRewriteIn = { query: string }\nexport type AxRewriteOut = { rewrittenQuery: string }\n\nexport type AxRerankerIn = { query: string; items: string[] }\nexport type AxRerankerOut = { rankedItems: string[] }\n\nexport interface AxDBLoaderOptions {\n chunker?: (text: string) => string[]\n rewriter?: AxProgram<AxRewriteIn, AxRewriteOut>\n reranker?: AxProgram<AxRerankerIn, AxRerankerOut>\n}\n\nexport interface AxDBManagerArgs {\n ai: AxAIService\n db: AxDBService\n config?: AxDBLoaderOptions\n}\n\nexport interface AxDBMatch {\n score: number\n text: string\n}\n\nconst table = '_internal'\n\nexport class AxDBManager {\n private ai: AxAIService\n private db: AxDBService\n private chunker: (text: string) => string[]\n private rewriter?: AxProgram<AxRewriteIn, AxRewriteOut>\n private reranker?: AxProgram<AxRerankerIn, AxRerankerOut>\n\n constructor({ ai, db, config }: Readonly<AxDBManagerArgs>) {\n this.ai = ai\n this.db = db\n this.chunker = config?.chunker ?? this.defaultChunker\n this.reranker = config?.reranker\n this.rewriter = config?.rewriter\n }\n\n private defaultChunker = (text: string): string[] => {\n // Default chunking by paragraphs\n return text.split(/\\n\\n+/)\n }\n\n insert = async (\n text: Readonly<string | string[]>,\n options?: Readonly<{\n batchSize?: number\n maxWordsPerChunk?: number\n minWordsPerChunk?: number\n }>\n ): Promise<void> => {\n try {\n const chunkerInput = Array.isArray(text)\n ? text.join('\\n\\n')\n : (text as string)\n\n // Chunk the text using the specified or default chunking function\n const initialChunks = this.chunker(chunkerInput).filter(\n (chunk) => chunk.length > 0\n )\n\n const maxWordsPerChunk = options?.maxWordsPerChunk\n const minWordsPerChunk = options?.minWordsPerChunk\n\n const chunks = processChunks({\n initialChunks,\n minWordsPerChunk,\n maxWordsPerChunk,\n })\n\n const bs = options?.batchSize ?? 10\n\n // Process chunks in batches of 10\n for (let i = 0; i < chunks.length; i += bs) {\n const batch = chunks.slice(i, i + bs)\n\n // Get embeddings for the whole batch from the AI service in one call\n const ret = await this.ai.embed({ texts: batch })\n\n // Prepare batch for bulk upsert\n const embeddings = ret.embeddings\n .map((embedding, index) => ({\n id: `chunk_${Date.now() + index}`, // Unique ID for each chunk, adjusted by index\n table,\n values: embedding,\n metadata: { text: batch[index] ?? '' },\n }))\n .filter(\n (v) => v.metadata?.['text'] && v.metadata?.['text'].length > 0\n )\n\n // Batch upsert embeddings\n await this.db.batchUpsert(embeddings)\n }\n } catch (error) {\n throw new Error(`Error processing text: ${error}`)\n }\n }\n\n query = async (\n query: Readonly<string | string[] | number | number[]>,\n { topPercent }: Readonly<{ topPercent?: number }> | undefined = {}\n ): Promise<AxDBMatch[][]> => {\n const texts = Array.isArray(query) ? query : [query]\n\n if (typeof texts[0] === 'string' && this.rewriter) {\n for (const [i, text] of texts.entries()) {\n const { rewrittenQuery } = await this.rewriter.forward(this.ai, {\n query: text,\n })\n texts[i] = rewrittenQuery\n }\n }\n\n let queries: Promise<AxDBQueryResponse>[]\n\n if (typeof texts[0] === 'string') {\n const embedResults = await this.ai.embed({ texts })\n queries = embedResults.embeddings.map((values) =>\n this.db.query({ table, values })\n )\n } else {\n queries = texts.map((values) => this.db.query({ table, values }))\n }\n\n const queryResults = await Promise.all(queries)\n const res: AxDBMatch[][] = []\n\n for (const { matches } of queryResults) {\n const m = matches\n .filter((v) => v.metadata?.['text'] && v.metadata?.['text'].length > 0)\n .map(({ score, metadata }) => ({\n score,\n text: metadata?.['text'] ?? '',\n }))\n\n const tp = topPercent && topPercent > 1 ? topPercent / 100 : topPercent\n const resultItems = tp ? getTopInPercent(m, tp) : m\n\n if (this.reranker) {\n const { rankedItems } = await this.reranker.forward(this.ai, {\n query: texts[0] as string,\n items: resultItems.map((item) => item.text),\n })\n\n const items = rankedItems\n .map((item) => resultItems.find((r) => r.text === item))\n .filter((v) => v !== undefined) as AxDBMatch[]\n\n res.push(items)\n } else {\n res.push(resultItems)\n }\n }\n\n return res\n }\n}\n\nconst processChunks = ({\n initialChunks,\n maxWordsPerChunk = 350,\n minWordsPerChunk = 250,\n}: Readonly<{\n initialChunks: readonly string[]\n maxWordsPerChunk?: number\n minWordsPerChunk?: number\n}>): string[] => {\n const chunks: string[] = []\n\n let currentChunk = ''\n let currentWordCount = 0\n\n initialChunks.forEach((chunk) => {\n const words = chunk.split(/\\s+/) // Split the chunk into words\n const wordCount = words.length // Count words in the current chunk\n\n if (currentWordCount + wordCount <= maxWordsPerChunk) {\n // Add to the current chunk if within the max size limit\n currentChunk += chunk + '\\n\\n'\n currentWordCount += wordCount\n } else if (\n currentWordCount > 0 &&\n currentWordCount + wordCount <= maxWordsPerChunk * 1.5\n ) {\n // If the total word count exceeds the limit but is less than 150% of the maxWordsPerChunk\n currentChunk += chunk + '\\n\\n'\n currentWordCount += wordCount\n } else {\n // If the current chunk is not empty and adding the new chunk exceeds the adjusted limit\n if (currentWordCount > minWordsPerChunk) {\n chunks.push(currentChunk.trim())\n currentChunk = ''\n currentWordCount = 0\n }\n // Handle the case where the chunk itself is larger than the limit\n if (wordCount > maxWordsPerChunk) {\n const remainingWords = words\n while (remainingWords.length > maxWordsPerChunk * 1.5) {\n const slice = remainingWords.splice(0, maxWordsPerChunk)\n chunks.push(slice.join(' '))\n }\n // Add the last portion if it fits the condition of being within 150% of maxWordsPerChunk\n if (remainingWords.length > 0) {\n currentChunk += remainingWords.join(' ') + '\\n\\n'\n currentWordCount += remainingWords.length\n }\n } else {\n // If the new chunk is smaller than the maximum words per chunk\n currentChunk = chunk + '\\n\\n'\n currentWordCount = wordCount\n }\n }\n })\n\n // Push the last chunk if it exists and meets the minimum words condition\n if (currentWordCount > minWordsPerChunk || chunks.length === 0) {\n chunks.push(currentChunk.trim())\n }\n return chunks\n}\n\nconst getTopInPercent = (\n entries: readonly AxDBMatch[],\n percent: number = 0.1\n): AxDBMatch[] => {\n // Sort entries by score in ascending order\n const sortedEntries = [...entries].sort((a, b) => a.score - b.score)\n\n // Calculate the number of entries to take (top 10%)\n const topTenPercentCount = Math.ceil(sortedEntries.length * percent)\n\n // Return the top 10% of entries\n return sortedEntries.slice(0, topTenPercentCount)\n}\n","import type { AxFunction } from '../ai/types.js'\n\nexport interface AxDockerContainer {\n Id: string\n Names: string[]\n Image: string\n ImageID: string\n Command: string\n Created: number\n State: {\n Status: string\n Running: boolean\n Paused: boolean\n Restarting: boolean\n OOMKilled: boolean\n Dead: boolean\n Pid: number\n ExitCode: number\n Error: string\n StartedAt: Date\n FinishedAt: Date\n }\n Status: string\n Ports: Array<{\n IP: string\n PrivatePort: number\n PublicPort: number\n Type: string\n }>\n Labels: { [key: string]: string }\n SizeRw: number\n SizeRootFs: number\n HostConfig: {\n NetworkMode: string\n }\n NetworkSettings: {\n Networks: {\n [key: string]: {\n IPAddress: string\n IPPrefixLen: number\n Gateway: string\n MacAddress: string\n }\n }\n }\n Mounts: Array<{\n Type: string\n Source: string\n Destination: string\n Mode: string\n RW: boolean\n Propagation: string\n }>\n}\n\nexport class AxDockerSession {\n private readonly apiUrl: string\n private containerId: string | null = null\n\n constructor(apiUrl: string = 'http://localhost:2375') {\n this.apiUrl = apiUrl\n }\n\n async pullImage(imageName: string): Promise<void> {\n const response = await this.fetchDockerAPI(\n `/images/create?fromImage=${encodeURIComponent(imageName)}`,\n {\n method: 'POST',\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to pull image: ${response.statusText}`)\n }\n\n // Wait for the pull to complete\n await response.text()\n }\n\n async createContainer({\n imageName,\n volumes = [],\n doNotPullImage,\n tag,\n }: Readonly<{\n imageName: string\n volumes?: Array<{ hostPath: string; containerPath: string }>\n doNotPullImage?: boolean\n tag?: string\n }>) {\n const binds = volumes.map((v) => `${v.hostPath}:${v.containerPath}`)\n\n if (!doNotPullImage) {\n await this.pullImage(imageName)\n }\n\n const containerConfig = {\n Image: imageName,\n Tty: true,\n OpenStdin: false,\n AttachStdin: false,\n AttachStdout: false,\n AttachStderr: false,\n HostConfig: { Binds: binds },\n Labels: {} as Record<string, string>,\n }\n\n if (tag) {\n containerConfig.Labels['com.example.tag'] = tag\n }\n\n const response = await this.fetchDockerAPI(`/containers/create`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(containerConfig),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to create container: ${response.statusText}`)\n }\n\n const data = (await response.json()) as { Id: string }\n this.containerId = data.Id\n\n return data\n }\n\n async findOrCreateContainer({\n imageName,\n volumes = [],\n doNotPullImage,\n tag,\n }: Readonly<{\n imageName: string\n volumes?: Array<{ hostPath: string; containerPath: string }>\n doNotPullImage?: boolean\n tag: string\n }>): Promise<{ Id: string; isNew: boolean }> {\n // First, try to find existing containers with the given tag\n const existingContainers = await this.listContainers(true)\n const matchingContainers = existingContainers.filter(\n (container) =>\n container.Labels && container.Labels['com.example.tag'] === tag\n )\n\n if (matchingContainers && matchingContainers.length > 0) {\n // Randomly select a container from the matching ones\n const randomIndex = Math.floor(Math.random() * matchingContainers.length)\n const selectedContainer = matchingContainers[randomIndex]\n\n if (selectedContainer) {\n // Connect to the selected container\n await this.connectToContainer(selectedContainer.Id)\n return { Id: selectedContainer.Id, isNew: false }\n }\n }\n\n // If no container with the tag exists, create a new one\n const newContainer = await this.createContainer({\n imageName,\n volumes,\n doNotPullImage,\n tag,\n })\n\n return { Id: newContainer.Id, isNew: true }\n }\n\n async startContainer(): Promise<void> {\n if (!this.containerId) {\n throw new Error('No container created or connected')\n }\n\n const response = await this.fetchDockerAPI(\n `/containers/${this.containerId}/start`,\n {\n method: 'POST',\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to start container: ${response.statusText}`)\n }\n }\n\n async connectToContainer(containerId: string): Promise<void> {\n const response = await this.fetchDockerAPI(\n `/containers/${containerId}/json`\n )\n\n if (!response.ok) {\n throw new Error(`Failed to connect to container: ${response.statusText}`)\n }\n\n this.containerId = containerId\n }\n\n async stopContainers({\n tag,\n remove,\n timeout = 10,\n }: Readonly<{ tag?: string; remove?: boolean; timeout?: number }>): Promise<\n Array<{ Id: string; Action: 'stopped' | 'removed' }>\n > {\n const results: Array<{ Id: string; Action: 'stopped' | 'removed' }> = []\n\n // List all containers\n const containers = await this.listContainers(true)\n\n // Filter containers by tag if provided\n const targetContainers = tag\n ? containers.filter(\n (container) => container.Labels['com.example.tag'] === tag\n )\n : containers\n\n for (const container of targetContainers) {\n // Stop the container if it's running\n if (container.State.Status === 'running') {\n const stopResponse = await this.fetchDockerAPI(\n `/containers/${container.Id}/stop?t=${timeout}`,\n { method: 'POST' }\n )\n\n if (!stopResponse.ok) {\n console.warn(\n `Failed to stop container ${container.Id}: ${stopResponse.statusText}`\n )\n continue\n }\n\n results.push({ Id: container.Id, Action: 'stopped' })\n }\n\n // Remove the container if the remove flag is set\n if (remove) {\n const removeResponse = await this.fetchDockerAPI(\n `/containers/${container.Id}`,\n { method: 'DELETE' }\n )\n\n if (!removeResponse.ok) {\n console.warn(\n `Failed to remove container ${container.Id}: ${removeResponse.statusText}`\n )\n continue\n }\n\n results.push({ Id: container.Id, Action: 'removed' })\n }\n }\n\n return results\n }\n\n async listContainers(all: boolean = false): Promise<AxDockerContainer[]> {\n const response = await this.fetchDockerAPI(`/containers/json?all=${all}`, {\n method: 'GET',\n })\n return response.json() as Promise<AxDockerContainer[]>\n }\n\n async getContainerLogs(): Promise<string> {\n if (!this.containerId) {\n throw new Error('No container created or connected')\n }\n const response = await this.fetchDockerAPI(\n `/containers/${this.containerId}/logs?stdout=true&stderr=true`,\n { method: 'GET' }\n )\n return response.text()\n }\n\n async executeCommand(command: string) {\n console.log('Executing command:', command)\n\n if (!this.containerId) {\n throw new Error('No container created or connected')\n }\n\n // Check container state\n const containerInfo = await this.getContainerInfo(this.containerId)\n\n if (containerInfo.State.Status !== 'running') {\n await this.startContainer()\n\n // Wait for the container to be in the \"running\" state\n await this.waitForContainerToBeRunning(this.containerId)\n }\n\n // Create exec instance\n const createResponse = await this.fetchDockerAPI(\n `/containers/${this.containerId}/exec`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n Cmd: ['sh', '-c', command],\n AttachStdout: true,\n AttachStderr: true,\n }),\n }\n )\n\n if (!createResponse.ok) {\n throw new Error(\n `Failed to create exec instance: ${createResponse.statusText}`\n )\n }\n\n const execData = (await createResponse.json()) as { Id: string }\n\n // Start exec instance\n const startResponse = await this.fetchDockerAPI(\n `/exec/${execData.Id}/start`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n Detach: false,\n Tty: false,\n }),\n }\n )\n\n if (!startResponse.ok) {\n throw new Error(\n `Failed to start exec instance: ${startResponse.statusText}`\n )\n }\n\n // Return the output\n return await startResponse.text()\n }\n\n // Add these new methods to the class:\n\n private async getContainerInfo(\n containerId: string\n ): Promise<AxDockerContainer> {\n const response = await this.fetchDockerAPI(\n `/containers/${containerId}/json`\n )\n if (!response.ok) {\n throw new Error(`Failed to get container info: ${response.statusText}`)\n }\n return response.json() as Promise<AxDockerContainer>\n }\n\n private async waitForContainerToBeRunning(\n containerId: string,\n timeout: number = 30000\n ): Promise<void> {\n const startTime = Date.now()\n while (Date.now() - startTime < timeout) {\n const containerInfo = await this.getContainerInfo(containerId)\n if (containerInfo.State.Status === 'running') {\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 1000)) // Wait for 1 second before checking again\n }\n throw new Error('Timeout waiting for container to start')\n }\n\n private async fetchDockerAPI(\n endpoint: string,\n options?: Readonly<RequestInit>\n ): Promise<Response> {\n const url = new URL(endpoint, this.apiUrl).toString()\n return await fetch(url, options)\n }\n\n public toFunction(): AxFunction {\n return {\n name: 'commandExecution',\n description:\n 'Use this function to execute shell commands, scripts, and programs. This function enables interaction with the file system, running system utilities, and performing tasks that require a shell interface.',\n parameters: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description:\n 'Shell command to execute. eg. `ls -l` or `echo \"Hello, World!\"`.',\n },\n },\n required: ['command'],\n },\n\n func: async ({ command }: Readonly<{ command: string }>) =>\n await this.executeCommand(command),\n }\n }\n}\n","import type { AxFieldValue } from './program.js'\n\nexport type AxDataRow = { row: Record<string, AxFieldValue> }\n\nexport class AxHFDataLoader {\n private rows: AxDataRow[] = []\n private baseUrl: string\n\n private dataset: string\n private split: string\n private config: string\n private options?: Readonly<{ offset?: number; length?: number }>\n\n constructor({\n dataset,\n split,\n config,\n options,\n }: Readonly<{\n dataset: string\n split: string\n config: string\n options?: Readonly<{ offset?: number; length?: number }>\n }>) {\n this.baseUrl = 'https://datasets-server.huggingface.co/rows'\n this.dataset = dataset\n this.split = split\n this.config = config\n this.options = options\n }\n\n private async fetchDataFromAPI(url: string): Promise<AxDataRow[]> {\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Error fetching data: ${response.statusText}`)\n }\n const data = (await response.json()) as { rows: AxDataRow[] }\n if (!data?.rows) {\n throw new Error('Invalid data format')\n }\n return data.rows\n } catch (error) {\n console.error('Error fetching data from API:', error)\n throw error\n }\n }\n\n // https://datasets-server.huggingface.co/rows?dataset=hotpot_qa&config=distractor&split=train&offset=0&length=100\n\n public async loadData() {\n const offset = this.options?.offset ?? 0\n const length = this.options?.length ?? 100\n const ds = encodeURIComponent(this.dataset)\n\n const url = `${this.baseUrl}?dataset=${ds}&config=${this.config}&split=${this.split}&offset=${offset}&length=${length}`\n\n console.log('Downloading data from API.')\n this.rows = (await this.fetchDataFromAPI(url)) as AxDataRow[]\n return this.rows\n }\n\n public setData(rows: AxDataRow[]) {\n this.rows = rows\n }\n\n public getData() {\n return this.rows\n }\n\n public async getRows<T>({\n count,\n fields,\n renameMap,\n }: Readonly<{\n count: number\n fields: readonly string[]\n renameMap?: Record<string, string>\n }>): Promise<T[]> {\n if (this.rows.length === 0) {\n throw new Error('No data loaded, call loadData or setData first.')\n }\n const dataRows = this.rows.slice(0, count)\n\n return dataRows\n .map((item) => {\n const result: Record<string, AxFieldValue> = {}\n\n fields.forEach((field) => {\n const keys = field.split('.')\n // Initial value should match the type of the rows, and be indexable by string\n let value: AxFieldValue | unknown = item.row\n for (const key of keys) {\n // Use type assertion to tell TypeScript that value will always be an object that can be indexed with string keys\n if (\n Object.prototype.hasOwnProperty.call(\n value as Record<string, unknown>,\n key\n )\n ) {\n value = (value as Record<string, unknown>)[key]\n }\n }\n if (!value) {\n return\n }\n const resultFieldName =\n renameMap && field in renameMap ? renameMap[field] : field\n if (!resultFieldName) {\n throw new Error(`Invalid field name: ${field}`)\n }\n result[resultFieldName] = value as AxFieldValue\n })\n\n return result\n })\n .filter((v) => Object.keys(v).length !== 0) as T[]\n }\n}\n","import * as _crypto from 'node:crypto'\nimport * as _fs from 'node:fs'\nimport * as _http from 'node:http'\nimport * as _https from 'node:https'\nimport * as _os from 'node:os'\nimport * as _process from 'node:process'\nimport { runInNewContext } from 'node:vm'\n\nimport type { AxFunction } from '../ai/types.js'\n\nexport enum AxJSInterpreterPermission {\n FS = 'node:fs',\n NET = 'net',\n OS = 'os',\n CRYPTO = 'crypto',\n PROCESS = 'process',\n}\n\ntype Context = {\n console: Console\n fs: unknown\n http: unknown\n https: unknown\n os: unknown\n crypto: unknown\n process: unknown\n}\n\nexport class AxJSInterpreter {\n private permissions: readonly AxJSInterpreterPermission[]\n\n constructor({\n permissions = [],\n }:\n | Readonly<{ permissions?: readonly AxJSInterpreterPermission[] }>\n | undefined = {}) {\n this.permissions = permissions ?? []\n }\n\n private codeInterpreterJavascript(code: string): unknown {\n const context: Partial<Context> = { console }\n\n if (this.permissions.includes(AxJSInterpreterPermission.FS)) {\n context.fs = _fs\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.NET)) {\n context.http = _http\n context.https = _https\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.OS)) {\n context.os = _os\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.CRYPTO)) {\n context.crypto = _crypto\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.PROCESS)) {\n context.process = _process\n }\n\n return runInNewContext(`(function() { ${code} })()`, context)\n }\n\n public toFunction(): AxFunction {\n return {\n name: 'javascriptInterpreter',\n description:\n 'Use this function to run Javascript code and get any expected return value',\n parameters: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'JS code with a return value in the end.',\n },\n },\n required: ['code'],\n },\n\n func: ({ code }: Readonly<{ code: string }>) =>\n this.codeInterpreterJavascript(code),\n }\n }\n}\n","import type { AxAIService } from '../ai/types.js'\n\nimport {\n AxBootstrapFewShot,\n type AxExample,\n type AxMetricFn,\n type AxOptimizerArgs,\n} from './optimize.js'\nimport type { AxGenIn, AxGenOut, AxProgram, AxProgramDemos } from './program.js'\nimport { updateProgressBar } from './util.js'\n\nexport interface AxMiPROOptions {\n numCandidates?: number\n initTemperature?: number\n maxBootstrappedDemos?: number\n maxLabeledDemos?: number\n numTrials?: number\n minibatch?: boolean\n minibatchSize?: number\n minibatchFullEvalSteps?: number\n programAwareProposer?: boolean\n dataAwareProposer?: boolean\n viewDataBatchSize?: number\n tipAwareProposer?: boolean\n fewshotAwareProposer?: boolean\n seed?: number\n verbose?: boolean\n earlyStoppingTrials?: number\n minImprovementThreshold?: number\n}\n\ninterface ConfigType {\n instruction: string\n bootstrappedDemos: number\n labeledExamples: number\n}\n\ninterface ConfigPoint {\n config: ConfigType\n score: number\n}\n\nexport class AxMiPRO<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenOut = AxGenOut,\n> {\n private ai: AxAIService\n private program: Readonly<AxProgram<IN, OUT>>\n private examples: readonly AxExample[]\n private maxBootstrappedDemos: number\n private maxLabeledDemos: number\n private numCandidates: number\n private initTemperature: number\n private numTrials: number\n private minibatch: boolean\n private minibatchSize: number\n private minibatchFullEvalSteps: number\n private programAwareProposer: boolean\n private dataAwareProposer: boolean\n private viewDataBatchSize: number\n private tipAwareProposer: boolean\n private fewshotAwareProposer: boolean\n private seed?: number\n private verbose: boolean\n private bootstrapper: AxBootstrapFewShot<IN, OUT>\n private earlyStoppingTrials: number\n private minImprovementThreshold: number\n\n constructor({\n ai,\n program,\n examples = [],\n options,\n }: Readonly<AxOptimizerArgs<IN, OUT>> & { options?: AxMiPROOptions }) {\n if (examples.length === 0) {\n throw new Error('No examples found')\n }\n\n const miproOptions = (options as AxMiPROOptions) || {}\n\n this.numCandidates = miproOptions.numCandidates ?? 5\n this.initTemperature = miproOptions.initTemperature ?? 0.7\n this.maxBootstrappedDemos = miproOptions.maxBootstrappedDemos ?? 3\n this.maxLabeledDemos = miproOptions.maxLabeledDemos ?? 4\n this.numTrials = miproOptions.numTrials ?? 30\n this.minibatch = miproOptions.minibatch ?? true\n this.minibatchSize = miproOptions.minibatchSize ?? 25\n this.minibatchFullEvalSteps = miproOptions.minibatchFullEvalSteps ?? 10\n this.programAwareProposer = miproOptions.programAwareProposer ?? true\n this.dataAwareProposer = miproOptions.dataAwareProposer ?? true\n this.viewDataBatchSize = miproOptions.viewDataBatchSize ?? 10\n this.tipAwareProposer = miproOptions.tipAwareProposer ?? true\n this.fewshotAwareProposer = miproOptions.fewshotAwareProposer ?? true\n this.seed = miproOptions.seed\n this.verbose = miproOptions.verbose ?? false\n this.earlyStoppingTrials = miproOptions.earlyStoppingTrials ?? 5\n this.minImprovementThreshold = miproOptions.minImprovementThreshold ?? 0.01\n\n this.ai = ai\n this.program = program\n this.examples = examples\n\n // Initialize the bootstrapper to handle few-shot example generation\n this.bootstrapper = new AxBootstrapFewShot<IN, OUT>({\n ai,\n program,\n examples,\n options: {\n maxDemos: this.maxBootstrappedDemos,\n maxRounds: 3, // Default, or adjust based on your needs\n verboseMode: this.verbose,\n },\n })\n }\n\n /**\n * Configures the optimizer for light, medium, or heavy optimization\n * @param level The optimization level: \"light\", \"medium\", or \"heavy\"\n */\n public configureAuto(level: 'light' | 'medium' | 'heavy'): void {\n switch (level) {\n case 'light':\n this.numCandidates = 3\n this.numTrials = 10\n this.minibatch = true\n this.minibatchSize = 20\n break\n case 'medium':\n this.numCandidates = 5\n this.numTrials = 20\n this.minibatch = true\n this.minibatchSize = 25\n break\n case 'heavy':\n this.numCandidates = 7\n this.numTrials = 30\n this.minibatch = true\n this.minibatchSize = 30\n break\n }\n }\n\n /**\n * Generates creative tips for instruction generation\n */\n private generateTips(): string[] {\n return [\n 'Be very specific and detailed in your instructions.',\n 'Focus on step-by-step reasoning in your instructions.',\n 'Provide clear constraints and guidelines in your instructions.',\n 'Keep your instructions concise and to the point.',\n 'Emphasize accuracy and precision in your instructions.',\n 'Include examples of good outputs in your instructions.',\n 'Focus on handling edge cases in your instructions.',\n 'Explicitly outline the reasoning process in your instructions.',\n ]\n }\n\n /**\n * Generates instruction candidates for each predictor in the program\n * @returns Array of generated instruction candidates\n */\n private async proposeInstructionCandidates(): Promise<string[]> {\n const instructions: string[] = []\n\n // Get a summary of the program for program-aware proposing\n let programContext = ''\n if (this.programAwareProposer) {\n programContext = await this.generateProgramSummary()\n }\n\n // Get a summary of the dataset for data-aware proposing\n let dataContext = ''\n if (this.dataAwareProposer) {\n dataContext = await this.generateDataSummary()\n }\n\n // Generate random tips for tip-aware proposing\n const tips = this.tipAwareProposer ? this.generateTips() : []\n\n // Generate instructions for each candidate\n for (let i = 0; i < this.numCandidates; i++) {\n const tipIndex = tips.length > 0 ? i % tips.length : -1\n const tipToUse = tipIndex >= 0 ? tips[tipIndex] : ''\n\n const instruction = await this.generateInstruction({\n programContext,\n dataContext,\n tip: tipToUse,\n candidateIndex: i,\n })\n\n instructions.push(instruction)\n }\n\n return instructions\n }\n\n /**\n * Generates a summary of the program structure for instruction proposal\n */\n private async generateProgramSummary(): Promise<string> {\n // In a real implementation, this would analyze the program's structure\n // and generate a summary of its components, signatures, etc.\n const prompt = `Summarize the following program structure. Focus on the signatures, \n input/output fields, and the purpose of each component. Identify key components \n that might benefit from better instructions.`\n\n const programStr = JSON.stringify(this.program)\n\n const response = await this.ai.chat({\n chatPrompt: [\n { role: 'system', content: prompt },\n { role: 'user', content: programStr },\n ],\n modelConfig: { temperature: 0.2 },\n })\n\n // Handle both sync and async responses\n if (response instanceof ReadableStream) {\n return ''\n }\n\n return response.results[0]?.content || ''\n }\n\n /**\n * Generates a summary of the dataset for instruction proposal\n */\n private async generateDataSummary(): Promise<string> {\n // Sample a subset of examples for analysis\n const sampleSize = Math.min(this.viewDataBatchSize, this.examples.length)\n const sample = this.examples.slice(0, sampleSize)\n\n const prompt = `Analyze the following dataset examples and provide a summary \n of key patterns, input-output relationships, and any specific challenges \n the data presents. Focus on what makes a good answer and what patterns should\n be followed.`\n\n const dataStr = JSON.stringify(sample)\n\n const response = await this.ai.chat({\n chatPrompt: [\n { role: 'system', content: prompt },\n { role: 'user', content: dataStr },\n ],\n modelConfig: { temperature: 0.2 },\n })\n\n // Handle both sync and async responses\n if (response instanceof ReadableStream) {\n return ''\n }\n\n return response.results[0]?.content || ''\n }\n\n /**\n * Generates a specific instruction candidate\n */\n private async generateInstruction({\n programContext,\n dataContext,\n tip,\n candidateIndex,\n }: Readonly<{\n programContext: string\n dataContext: string\n tip: string | undefined\n candidateIndex: number\n }>): Promise<string> {\n const prompt = `Create a high-quality instruction for an AI model performing the task described below.\n \n ${programContext ? `PROGRAM CONTEXT:\\n${programContext}\\n\\n` : ''}\n ${dataContext ? `DATA CONTEXT:\\n${dataContext}\\n\\n` : ''}\n ${tip ? `STYLE TIP: ${tip}\\n\\n` : ''}\n \n Your task is to craft a clear, effective instruction that will help the AI model generate\n accurate outputs for this task. Instruction #${candidateIndex + 1}/${this.numCandidates}.\n \n The instruction should be detailed enough to guide the model but not overly prescriptive\n or restrictive. Focus on what makes a good response rather than listing exact steps.\n \n INSTRUCTION:`\n\n const response = await this.ai.chat({\n chatPrompt: [{ role: 'user', content: prompt }],\n modelConfig: { temperature: 0.7 + 0.1 * candidateIndex },\n })\n\n // Handle both sync and async responses\n if (response instanceof ReadableStream) {\n return ''\n }\n\n return response.results[0]?.content || ''\n }\n\n /**\n * Bootstraps few-shot examples for the program\n */\n private async bootstrapFewShotExamples(\n metricFn: AxMetricFn\n ): Promise<AxProgramDemos[]> {\n if (this.verbose) {\n console.log('Bootstrapping few-shot examples...')\n }\n\n const result = await this.bootstrapper.compile(metricFn, {\n maxDemos: this.maxBootstrappedDemos,\n })\n\n return result.demos\n }\n\n /**\n * Selects labeled examples directly from the training set\n */\n private selectLabeledExamples(): AxExample[] {\n const selectedExamples: AxExample[] = []\n\n // Random sampling from the training set\n const indices = new Set<number>()\n while (\n indices.size < this.maxLabeledDemos &&\n indices.size < this.examples.length\n ) {\n const idx = Math.floor(Math.random() * this.examples.length)\n if (!indices.has(idx)) {\n indices.add(idx)\n const example = this.examples[idx]\n if (example) {\n selectedExamples.push(example)\n }\n }\n }\n\n return selectedExamples\n }\n\n /**\n * Runs Bayesian optimization to find the best combination of few-shot examples and instructions\n */\n private async runBayesianOptimization(\n bootstrappedDemos: readonly AxProgramDemos[],\n labeledExamples: readonly AxExample[],\n instructions: readonly string[],\n valset: readonly AxExample[],\n metricFn: AxMetricFn\n ): Promise<{ bestConfig: ConfigType; bestScore: number }> {\n let bestConfig: ConfigType | null = null\n let bestScore = Number.NEGATIVE_INFINITY\n\n // Track all evaluated configurations for Bayesian optimization\n const evaluatedConfigs: ConfigPoint[] = []\n\n // Add a default fallback configuration in case all evaluations fail\n const defaultConfig: ConfigType = {\n instruction: instructions[0] || '',\n bootstrappedDemos: Math.min(1, bootstrappedDemos.length),\n labeledExamples: Math.min(1, labeledExamples.length),\n }\n\n // Track early stopping conditions\n let trialsWithoutImprovement = 0\n let lastBestScore = Number.NEGATIVE_INFINITY\n\n // Initial random exploration phase (to build a model)\n const initialExplorationTrials = Math.min(\n 10,\n Math.floor(this.numTrials / 3)\n )\n\n const configs: ConfigType[] = []\n\n // Initial exploration - generate random configurations\n for (let i = 0; i < initialExplorationTrials; i++) {\n const instructionIndex = Math.floor(Math.random() * instructions.length)\n const instructionValue = instructions[instructionIndex] || ''\n\n const config: ConfigType = {\n instruction: instructionValue,\n bootstrappedDemos: Math.floor(\n Math.random() * (bootstrappedDemos.length + 1)\n ),\n labeledExamples: Math.floor(\n Math.random() * (labeledExamples.length + 1)\n ),\n }\n configs.push(config)\n }\n\n // Evaluate initial configurations\n for (let i = 0; i < configs.length; i++) {\n const config = configs[i]\n if (!config) continue\n\n const score = await this.evaluateConfig(\n config,\n bootstrappedDemos,\n labeledExamples,\n valset,\n metricFn,\n i\n )\n\n evaluatedConfigs.push({ config, score })\n\n if (score > bestScore) {\n bestScore = score\n bestConfig = config\n\n if (this.verbose) {\n console.log(\n `New best configuration found with score ${bestScore} (exploration phase)`\n )\n }\n }\n\n // Update progress\n updateProgressBar(\n i + 1,\n this.numTrials,\n Math.round(bestScore * 100),\n 0,\n 'Running MIPROv2 optimization',\n 30\n )\n }\n\n // Exploitation phase - use Bayesian optimization\n for (let i = configs.length; i < this.numTrials; i++) {\n // Generate a new configuration using acquisition function\n const nextConfig = this.selectNextConfiguration(\n evaluatedConfigs,\n bootstrappedDemos.length,\n labeledExamples.length,\n instructions\n )\n\n // Evaluate the configuration\n const score = await this.evaluateConfig(\n nextConfig,\n bootstrappedDemos,\n labeledExamples,\n valset,\n metricFn,\n i\n )\n\n evaluatedConfigs.push({ config: nextConfig, score })\n\n // Check if this is a new best configuration\n if (score > bestScore) {\n bestScore = score\n bestConfig = nextConfig\n\n if (this.verbose) {\n console.log(\n `New best configuration found with score ${bestScore} (exploitation phase)`\n )\n }\n\n // Reset early stopping counter\n trialsWithoutImprovement = 0\n lastBestScore = bestScore\n } else {\n // Check early stopping condition\n if (bestScore - lastBestScore < this.minImprovementThreshold) {\n trialsWithoutImprovement++\n\n if (trialsWithoutImprovement >= this.earlyStoppingTrials) {\n if (this.verbose) {\n console.log(\n `Early stopping triggered after ${i + 1} trials. No improvement for ${trialsWithoutImprovement} trials.`\n )\n }\n break\n }\n } else {\n // There was some improvement, but not enough to be the best\n lastBestScore = bestScore\n trialsWithoutImprovement = 0\n }\n }\n\n // Update progress\n updateProgressBar(\n i + 1,\n this.numTrials,\n Math.round(bestScore * 100),\n 0,\n 'Running MIPROv2 optimization',\n 30\n )\n\n // Run full evaluation on best config periodically\n if (\n this.minibatch &&\n i > 0 &&\n (i + 1) % this.minibatchFullEvalSteps === 0 &&\n bestConfig\n ) {\n if (this.verbose) {\n console.log(\n `Running full evaluation on best configuration at trial ${i + 1}`\n )\n }\n\n const fullScore = await this.fullEvaluation(\n bestConfig,\n bootstrappedDemos,\n labeledExamples,\n valset,\n metricFn\n )\n\n if (this.verbose) {\n console.log(`Full evaluation score: ${fullScore}`)\n }\n\n // Update best score based on full evaluation\n bestScore = fullScore\n }\n }\n\n if (!bestConfig) {\n if (this.verbose) {\n console.warn(\n 'Optimization failed to find any valid configurations, using default fallback configuration'\n )\n }\n bestConfig = defaultConfig\n\n // Try to evaluate the default config as a last resort\n try {\n bestScore = await this.evaluateConfig(\n bestConfig,\n bootstrappedDemos,\n labeledExamples,\n valset,\n metricFn,\n this.numTrials - 1\n )\n } catch (err) {\n if (this.verbose) {\n console.error('Error evaluating default configuration:', err)\n }\n bestScore = 0 // Set a minimal score as fallback\n }\n }\n\n return { bestConfig, bestScore }\n }\n\n /**\n * Evaluates a configuration on the validation set\n */\n private async evaluateConfig(\n config: Readonly<ConfigType>,\n bootstrappedDemos: readonly AxProgramDemos[],\n labeledExamples: readonly AxExample[],\n valset: readonly AxExample[],\n metricFn: AxMetricFn,\n trialIndex: number\n ): Promise<number> {\n // Create a new instance for evaluation with proper cloning\n\n // Apply configuration to program\n this.applyConfigToProgram(\n this.program,\n config,\n bootstrappedDemos,\n labeledExamples\n )\n\n // Determine which examples to use for evaluation\n let evalSet: readonly AxExample[] = valset\n if (this.minibatch) {\n // Use minibatch for faster evaluation during trials\n const startIdx = (trialIndex * this.minibatchSize) % valset.length\n const minibatchEvalSet: AxExample[] = []\n for (let j = 0; j < this.minibatchSize; j++) {\n const idx = (startIdx + j) % valset.length\n const example = valset[idx]\n if (example) {\n minibatchEvalSet.push(example)\n }\n }\n evalSet = minibatchEvalSet\n }\n\n // Evaluate the configuration\n let correctCount = 0\n for (const example of evalSet) {\n try {\n const prediction = await this.program.forward(this.ai, example as IN)\n const correct = metricFn({ prediction, example })\n if (correct) correctCount++\n } catch (err) {\n if (this.verbose) {\n console.error('Error evaluating example:', err)\n }\n }\n }\n\n return correctCount / evalSet.length\n }\n\n /**\n * Run full evaluation on the entire validation set\n */\n private async fullEvaluation(\n config: Readonly<ConfigType>,\n bootstrappedDemos: readonly AxProgramDemos[],\n labeledExamples: readonly AxExample[],\n valset: readonly AxExample[],\n metricFn: AxMetricFn\n ): Promise<number> {\n this.applyConfigToProgram(\n this.program,\n config,\n bootstrappedDemos,\n labeledExamples\n )\n\n let fullCorrectCount = 0\n for (const example of valset) {\n try {\n const prediction = await this.program.forward(this.ai, example as IN)\n const correct = metricFn({ prediction, example })\n if (correct) fullCorrectCount++\n } catch (err) {\n if (this.verbose) {\n console.error('Error evaluating example:', err)\n }\n }\n }\n\n return fullCorrectCount / valset.length\n }\n\n /**\n * Implements a Bayesian-inspired selection of the next configuration to try\n * This is a simplified version using Upper Confidence Bound (UCB) strategy\n */\n private selectNextConfiguration(\n evaluatedConfigs: ConfigPoint[],\n maxBootstrappedDemos: number,\n maxLabeledExamples: number,\n instructions: readonly string[]\n ): ConfigType {\n // If we don't have many evaluations yet, use random exploration with a bias towards good configs\n if (evaluatedConfigs.length < 5) {\n const instructionIndex = Math.floor(Math.random() * instructions.length)\n return {\n instruction: instructions[instructionIndex] || '',\n bootstrappedDemos: Math.floor(\n Math.random() * (maxBootstrappedDemos + 1)\n ),\n labeledExamples: Math.floor(Math.random() * (maxLabeledExamples + 1)),\n }\n }\n\n // Sort configurations by score\n const sortedConfigs = [...evaluatedConfigs].sort(\n (a, b) => b.score - a.score\n )\n\n // Top performing configurations to learn from\n const topConfigs = sortedConfigs.slice(0, Math.min(3, sortedConfigs.length))\n\n // Calculate mean and variance of parameters in top configurations\n const meanBootstrappedDemos =\n topConfigs.reduce((sum, c) => sum + c.config.bootstrappedDemos, 0) /\n topConfigs.length\n const meanLabeledExamples =\n topConfigs.reduce((sum, c) => sum + c.config.labeledExamples, 0) /\n topConfigs.length\n\n // Get popular instructions among top performers\n const popularInstructions = topConfigs.map((c) => c.config.instruction)\n\n // Exploration factor decreases over time\n const explorationFactor = Math.max(\n 0.2,\n 1.0 - evaluatedConfigs.length / this.numTrials\n )\n\n // Generate a new configuration with exploitation (using learned info) + exploration (random variations)\n let newBootstrappedDemos: number\n let newLabeledExamples: number\n let newInstruction: string\n\n // Decide whether to exploit or explore for bootstrapped demos\n if (Math.random() < 0.7) {\n // 70% chance to exploit\n // Sample around the mean of top configs with some noise\n newBootstrappedDemos = Math.min(\n maxBootstrappedDemos,\n Math.max(\n 0,\n Math.round(\n meanBootstrappedDemos +\n (Math.random() * 2 - 1) * explorationFactor * 2\n )\n )\n )\n } else {\n // Random exploration\n newBootstrappedDemos = Math.floor(\n Math.random() * (maxBootstrappedDemos + 1)\n )\n }\n\n // Same for labeled examples\n if (Math.random() < 0.7) {\n newLabeledExamples = Math.min(\n maxLabeledExamples,\n Math.max(\n 0,\n Math.round(\n meanLabeledExamples +\n (Math.random() * 2 - 1) * explorationFactor * 2\n )\n )\n )\n } else {\n newLabeledExamples = Math.floor(Math.random() * (maxLabeledExamples + 1))\n }\n\n // For instructions, either pick from top performers or try a new one\n if (Math.random() < 0.7 && popularInstructions.length > 0) {\n const idx = Math.floor(Math.random() * popularInstructions.length)\n newInstruction = popularInstructions[idx] || ''\n } else {\n const idx = Math.floor(Math.random() * instructions.length)\n newInstruction = instructions[idx] || ''\n }\n\n return {\n instruction: newInstruction,\n bootstrappedDemos: newBootstrappedDemos,\n labeledExamples: newLabeledExamples,\n }\n }\n\n /**\n * Applies a configuration to a program instance\n */\n private applyConfigToProgram(\n program: Readonly<AxProgram<IN, OUT>>,\n config: Readonly<ConfigType>,\n bootstrappedDemos: readonly AxProgramDemos[],\n labeledExamples: readonly AxExample[]\n ): void {\n // Set instruction\n this.setInstructionToProgram(program, config.instruction)\n\n // Set demos if needed\n if (config.bootstrappedDemos > 0) {\n program.setDemos(bootstrappedDemos.slice(0, config.bootstrappedDemos))\n }\n\n // Set examples if needed\n if (config.labeledExamples > 0) {\n program.setExamples(labeledExamples.slice(0, config.labeledExamples))\n }\n }\n\n /**\n * Sets instruction to a program\n * Note: Workaround since setInstruction may not be available directly\n */\n private setInstructionToProgram(\n program: Readonly<AxProgram<IN, OUT>>,\n instruction: string\n ): void {\n // This is a simplification - in real use, you need the actual method signature\n // For demonstration purposes only\n // Usually would be: program.setInstruction(instruction)\n const programWithInstruction = program as Readonly<\n AxProgram<IN, OUT> & { setInstruction: (instr: string) => void }\n >\n programWithInstruction.setInstruction?.(instruction)\n }\n\n /**\n * The main compile method to run MIPROv2 optimization\n * @param metricFn Evaluation metric function\n * @param options Optional configuration options\n * @returns The optimized program\n */\n public async compile(\n metricFn: AxMetricFn,\n options?: Readonly<{\n valset?: readonly AxExample[]\n teacher?: Readonly<AxProgram<IN, OUT>>\n auto?: 'light' | 'medium' | 'heavy'\n }>\n ): Promise<Readonly<AxProgram<IN, OUT>>> {\n // Configure auto settings if provided\n if (options?.auto) {\n this.configureAuto(options.auto)\n }\n\n // Split data into train and validation sets if valset not provided\n const trainset = this.examples\n const valset =\n options?.valset ||\n this.examples.slice(0, Math.floor(this.examples.length * 0.8))\n\n if (this.verbose) {\n console.log(`Starting MIPROv2 optimization with ${this.numTrials} trials`)\n console.log(\n `Using ${trainset.length} examples for training and ${valset.length} for validation`\n )\n }\n\n // If teacher is provided, use it to help bootstrap examples\n if (options?.teacher) {\n if (this.verbose) {\n console.log('Using provided teacher to assist with bootstrapping')\n }\n\n // Create a copy of the bootstrapper with the teacher AI\n const bootstrapperWithTeacher = new AxBootstrapFewShot<IN, OUT>({\n ai: this.ai,\n program: this.program,\n examples: this.examples,\n options: {\n maxDemos: this.maxBootstrappedDemos,\n maxRounds: 3,\n verboseMode: this.verbose,\n teacherAI: this.ai, // Use the same AI but with the teacher program\n },\n })\n\n // Replace the existing bootstrapper\n this.bootstrapper = bootstrapperWithTeacher\n }\n\n // Step 1: Bootstrap few-shot examples\n let bootstrappedDemos: AxProgramDemos[] = []\n if (this.maxBootstrappedDemos > 0) {\n bootstrappedDemos = await this.bootstrapFewShotExamples(metricFn)\n\n if (this.verbose) {\n console.log(\n `Generated ${bootstrappedDemos.length} bootstrapped demonstrations`\n )\n }\n }\n\n // Step 2: Select labeled examples from training set\n let labeledExamples: AxExample[] = []\n if (this.maxLabeledDemos > 0) {\n labeledExamples = this.selectLabeledExamples()\n\n if (this.verbose) {\n console.log(\n `Selected ${labeledExamples.length} labeled examples from training set`\n )\n }\n }\n\n // Step 3: Generate instruction candidates\n const instructions = await this.proposeInstructionCandidates()\n\n if (this.verbose) {\n console.log(`Generated ${instructions.length} instruction candidates`)\n }\n\n // Step 4: Run Bayesian optimization to find the best configuration\n const { bestConfig, bestScore } = await this.runBayesianOptimization(\n bootstrappedDemos,\n labeledExamples,\n instructions,\n valset,\n metricFn\n )\n\n if (this.verbose) {\n console.log(`Optimization complete. Best score: ${bestScore}`)\n console.log(`Best configuration: ${JSON.stringify(bestConfig)}`)\n }\n\n // Apply the best configuration to a fresh copy of the program\n this.applyConfigToProgram(\n this.program,\n bestConfig,\n bootstrappedDemos,\n labeledExamples\n )\n\n return this.program\n }\n}\n","import type { ReadableStream } from 'stream/web'\n\nimport type {\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n AxModelInfoWithProvider,\n} from '../types.js'\n\nexport type AxMockAIServiceConfig = {\n name?: string\n id?: string\n modelInfo?: Partial<AxModelInfoWithProvider>\n embedModelInfo?: AxModelInfoWithProvider\n features?: { functions?: boolean; streaming?: boolean }\n models?: AxAIModelList\n options?: AxAIServiceOptions\n chatResponse?:\n | AxChatResponse\n | ReadableStream<AxChatResponse>\n | (() => Promise<AxChatResponse | ReadableStream<AxChatResponse>>)\n | ((\n req: Readonly<AxChatRequest<unknown>>,\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<unknown, unknown>\n >\n ) => Promise<AxChatResponse | ReadableStream<AxChatResponse>>)\n\n embedResponse?:\n | AxEmbedResponse\n | ((\n req: Readonly<AxEmbedRequest>\n ) => AxEmbedResponse | Promise<AxEmbedResponse>)\n shouldError?: boolean\n errorMessage?: string\n latencyMs?: number\n}\n\nexport class AxMockAIService implements AxAIService {\n private metrics: AxAIServiceMetrics = {\n latency: {\n chat: { mean: 0, p95: 0, p99: 0, samples: [] },\n embed: { mean: 0, p95: 0, p99: 0, samples: [] },\n },\n errors: {\n chat: { count: 0, rate: 0, total: 0 },\n embed: { count: 0, rate: 0, total: 0 },\n },\n }\n\n constructor(private readonly config: AxMockAIServiceConfig = {}) {\n this.config.id = this.config.id ?? crypto.randomUUID()\n }\n\n getName(): string {\n return this.config.name ?? 'mock-ai-service'\n }\n\n getId(): string {\n return this.config.id ?? 'mock-ai-service-id'\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getFeatures(_model?: string): { functions: boolean; streaming: boolean } {\n return {\n functions: this.config.features?.functions ?? false,\n streaming: this.config.features?.streaming ?? false,\n }\n }\n\n getModelList(): AxAIModelList | undefined {\n return this.config.models\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n return {\n model: this.config.modelInfo?.name ?? 'mock-model',\n embedModel: this.config.embedModelInfo?.name,\n }\n }\n\n getMetrics(): AxAIServiceMetrics {\n return this.metrics\n }\n\n async chat(\n req: Readonly<AxChatRequest<unknown>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<unknown, unknown>\n >\n ) {\n if (this.config.latencyMs) {\n await new Promise((resolve) => setTimeout(resolve, this.config.latencyMs))\n }\n\n if (this.config.shouldError) {\n throw new Error(this.config.errorMessage ?? 'Mock chat error')\n }\n\n this.updateMetrics('chat')\n\n if (typeof this.config.chatResponse === 'function') {\n return await this.config.chatResponse(req)\n }\n\n return (\n this.config.chatResponse ?? {\n results: [\n {\n content: 'Mock response',\n finishReason: 'stop',\n },\n ],\n modelUsage: {\n promptTokens: 10,\n completionTokens: 5,\n totalTokens: 15,\n },\n }\n )\n }\n\n async embed(\n req: Readonly<AxEmbedRequest>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxAIServiceActionOptions>\n ): Promise<AxEmbedResponse> {\n if (this.config.latencyMs) {\n await new Promise((resolve) => setTimeout(resolve, this.config.latencyMs))\n }\n\n if (this.config.shouldError) {\n throw new Error(this.config.errorMessage ?? 'Mock embed error')\n }\n\n this.updateMetrics('embed')\n\n if (typeof this.config.embedResponse === 'function') {\n return this.config.embedResponse(req)\n }\n\n return (\n this.config.embedResponse ?? {\n embeddings: [[0.1, 0.2, 0.3]],\n modelUsage: {\n promptTokens: 5,\n completionTokens: 0,\n totalTokens: 5,\n },\n }\n )\n }\n\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n this.config.options = options\n }\n\n getOptions(): Readonly<AxAIServiceOptions> {\n return this.config.options ?? {}\n }\n\n private updateMetrics(type: 'chat' | 'embed'): void {\n const latency = this.config.latencyMs ?? 0\n this.metrics.latency[type].samples.push(latency)\n const samples = this.metrics.latency[type].samples\n\n // Update mean\n this.metrics.latency[type].mean =\n samples.reduce((a, b) => a + b, 0) / samples.length\n\n // Calculate percentiles only if we have enough samples\n if (samples.length > 0) {\n const sortedSamples = [...samples].sort((a, b) => a - b)\n\n // For p95, we need at least 20 samples for meaningful calculation (1/0.05)\n const p95Index = Math.max(0, Math.floor(sortedSamples.length * 0.95) - 1)\n this.metrics.latency[type].p95 = sortedSamples[p95Index] ?? latency\n\n // For p99, we need at least 100 samples for meaningful calculation (1/0.01)\n const p99Index = Math.max(0, Math.floor(sortedSamples.length * 0.99) - 1)\n this.metrics.latency[type].p99 = sortedSamples[p99Index] ?? latency\n }\n\n if (this.config.shouldError) {\n this.metrics.errors[type].count++\n this.metrics.errors[type].total++\n\n // Calculate error rate against total requests, not just samples\n const totalRequests = this.metrics.latency[type].samples.length\n this.metrics.errors[type].rate =\n totalRequests > 0 ? this.metrics.errors[type].count / totalRequests : 0\n }\n }\n}\n\n// Example usage:\n/*\nconst mockService = new MockAIService({\n name: 'test-service',\n modelInfo: {\n name: 'test-model',\n provider: 'test-provider',\n promptTokenCostPer1M: 200,\n completionTokenCostPer1M: 150,\n },\n features: {\n functions: true,\n streaming: true,\n },\n chatResponse: async (req) => ({\n results: [\n {\n content: `Processed request with ${req.chatPrompt.length} messages`,\n finishReason: 'stop',\n },\n ],\n modelUsage: {\n promptTokens: 20,\n completionTokens: 10,\n totalTokens: 30,\n },\n }),\n latencyMs: 100,\n})\n*/\n","import type { AxAIService } from '../ai/types.js'\nimport { AxDBMemory, type AxDBState } from '../db/memory.js'\nimport { ColorLog } from '../util/log.js'\n\nconst colorLog = new ColorLog()\n\nexport interface AxSimpleClassifierForwardOptions {\n cutoff?: number\n}\n\nexport class AxSimpleClassifierClass {\n private readonly name: string\n private readonly context: readonly string[]\n\n constructor(name: string, context: readonly string[]) {\n this.name = name\n this.context = context\n }\n\n public getName(): string {\n return this.name\n }\n\n public getContext(): readonly string[] {\n return this.context\n }\n}\n\nexport class AxSimpleClassifier {\n private readonly ai: AxAIService\n\n private db: AxDBMemory\n private debug?: boolean\n\n public constructor(ai: AxAIService) {\n this.db = new AxDBMemory()\n this.ai = ai\n }\n\n public getState(): AxDBState | undefined {\n return this.db.getDB()\n }\n\n public setState(state: AxDBState) {\n this.db.setDB(state)\n }\n\n public setClasses = async (\n classes: readonly AxSimpleClassifierClass[]\n ): Promise<void> => {\n for (const c of classes) {\n const ret = await this.ai.embed({ texts: c.getContext() })\n await this.db.upsert({\n id: c.getName(),\n table: 'classes',\n values: ret.embeddings[0],\n })\n }\n }\n\n public async forward(\n text: string,\n options?: Readonly<AxSimpleClassifierForwardOptions>\n ): Promise<string> {\n const { embeddings } = await this.ai.embed({ texts: [text] })\n\n const matches = await this.db.query({\n table: 'classes',\n values: embeddings[0],\n })\n\n let m = matches.matches\n if (typeof options?.cutoff === 'number') {\n const { cutoff } = options\n m = m.filter((m) => m.score <= cutoff)\n }\n\n if (this.debug) {\n console.log(\n colorLog.whiteBright(`query: ${text}`) +\n '\\n' +\n colorLog.greenBright(\n JSON.stringify(m.map((m) => `${m.id}, ${m.score}`))\n )\n )\n }\n\n const matchedClass = m.at(0)\n if (!matchedClass) {\n return ''\n }\n\n return matchedClass.id\n }\n\n public setOptions(options: Readonly<{ debug?: boolean }>): void {\n if (typeof options.debug === 'boolean') {\n this.debug = options.debug\n }\n }\n}\n","import type { AxAIService } from '../ai/types.js'\n\nimport type { AxExample, AxMetricFn } from './optimize.js'\nimport type { AxGenIn, AxGenOut, AxProgram } from './program.js'\nimport { updateProgressBar } from './util.js'\n\nexport type AxEvaluateArgs<IN extends AxGenIn, OUT extends AxGenOut> = {\n ai: AxAIService\n program: Readonly<AxProgram<IN, OUT>>\n examples: Readonly<AxExample[]>\n}\n\nexport class AxTestPrompt<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenOut = AxGenOut,\n> {\n private ai: AxAIService\n private program: Readonly<AxProgram<IN, OUT>>\n private examples: Readonly<AxExample[]>\n\n constructor({\n ai,\n program,\n examples = [],\n }: Readonly<AxEvaluateArgs<IN, OUT>>) {\n if (examples.length == 0) {\n throw new Error('No examples found')\n }\n this.ai = ai\n this.program = program\n this.examples = examples\n }\n\n public async run(metricFn: AxMetricFn) {\n const st = new Date().getTime()\n const total = this.examples.length\n let successCount = 0\n\n for (let i = 0; i < total; i++) {\n const ex = this.examples[i]\n if (!ex) {\n throw new Error('Invalid example')\n }\n\n const res = await this.program.forward(this.ai, ex as IN)\n const success = metricFn({ prediction: res, example: ex })\n if (success) {\n successCount++\n }\n\n const et = new Date().getTime() - st\n updateProgressBar(i, total, successCount, et, 'Testing Prompt', 30)\n }\n\n console.log(\n '\\nPerformance: ',\n successCount,\n '/',\n total,\n 'Accuracy: ',\n successCount / total,\n '\\n'\n )\n }\n}\n","import { AxGen, type AxGenOptions } from '../dsp/generate.js'\nimport type { AxGenIn, AxGenOut } from '../dsp/program.js'\nimport { AxSignature } from '../dsp/sig.js'\n\nexport class AxChainOfThought<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenOut = AxGenOut,\n> extends AxGen<IN, OUT & { reason: string }> {\n constructor(\n signature: Readonly<AxSignature | string>,\n options?: Readonly<AxGenOptions>\n ) {\n const sig = new AxSignature(signature)\n const description = `Let's work this out in a step by step way in order to ensure we have the right answer.`\n\n sig.setOutputFields([\n {\n name: 'reason',\n description,\n },\n ...sig.getOutputFields(),\n ])\n\n super(sig, options)\n }\n}\n","import {\n AxGen,\n type AxGenOptions,\n type AxRewriteIn,\n type AxRewriteOut,\n} from '../index.js'\n\nexport class AxDefaultQueryRewriter extends AxGen<AxRewriteIn, AxRewriteOut> {\n constructor(options?: Readonly<AxGenOptions>) {\n const signature = `\"You are a query rewriter assistant tasked with rewriting a given query to improve its clarity, specificity, and relevance. Your role involves analyzing the query to identify any ambiguities, generalizations, or irrelevant information and then rephrasing it to make it more focused and precise. The rewritten query should be concise, easy to understand, and directly related to the original query. Output only the rewritten query.\"\n query: string -> rewrittenQuery: string`\n\n super(signature, options)\n }\n}\n","const trimNonAlphaNum = (str: string) => {\n return str.replace(/^\\W+|\\W+$/g, '')\n}\n\nconst splitIntoTwo = (\n str: string,\n separator: Readonly<RegExp | string>\n): string[] => {\n const index = str.search(separator)\n if (index === -1) {\n return [str] // No separator found, return the original string as the only part\n }\n const matchResult = str.match(separator)\n if (!matchResult) {\n throw new Error('Match failed unexpectedly.')\n }\n const firstPart = str.substring(0, index)\n const secondPart = str.substring(index + matchResult[0].length)\n return [firstPart, secondPart]\n}\n\nconst dedup = (seq: readonly string[]): string[] => {\n const seen = new Set<string>()\n const result: string[] = []\n\n for (const x of seq) {\n if (!seen.has(x)) {\n seen.add(x)\n result.push(x)\n }\n }\n\n return result\n}\n\nconst extractIdAndText = (input: string): { id: number; text: string } => {\n const match = input.match(/^(\\d+)[.,\\s]+(.*)$/)\n if (!match || match.length < 3) {\n throw new Error(\n 'line must start with a number, a dot and then text. e.g. \"1. hello\"'\n )\n }\n\n const id = parseInt(match[1] as string, 10)\n const text = (match[2] as string).trim()\n return { id, text }\n}\n\nconst extractIndexPrefixedText = (input: string): string => {\n const match = input.match(/^(\\d+)[.,\\s]+(.*)$/)\n // Check if match is not null and if the second capturing group is present\n if (match && match[2] !== undefined) {\n return match[2].trim()\n }\n return input\n}\n\nconst batchArray = <T>(arr: readonly T[], size: number): T[][] => {\n const chunkedArr: T[][] = []\n for (let i = 0; i < arr.length; i += size) {\n chunkedArr.push(arr.slice(i, i + size))\n }\n return chunkedArr\n}\n\nexport const AxStringUtil = {\n trimNonAlphaNum,\n splitIntoTwo,\n dedup,\n extractIdAndText,\n extractIndexPrefixedText,\n batchArray,\n}\n","import type { AxAIService } from '../ai/types.js'\nimport { AxGen, type AxGenOptions } from '../dsp/generate.js'\nimport type { AxProgramForwardOptions } from '../dsp/program.js'\nimport { AxStringUtil } from '../dsp/strutil.js'\n\nimport type { AxRerankerIn, AxRerankerOut } from './manager.js'\n\nexport class AxDefaultResultReranker extends AxGen<\n AxRerankerIn,\n AxRerankerOut\n> {\n constructor(options?: Readonly<AxGenOptions>) {\n const signature = `\"You are a re-ranker assistant tasked with evaluating a set of content items in relation to a specific question. Your role involves critically analyzing each content item to determine its relevance to the question and re-ranking them accordingly. This process includes assigning a relevance score from 0 to 10 to each content item based on how well it answers the question, its coverage of the topic, and the reliability of its information. This re-ranked list should start with the content item that is most relevant to the question and end with the least relevant. Output only the list.\"\n query: string, items: string[] -> rankedItems: string[] \"list of id, 5-words Rationale, relevance score\"`\n\n super(signature, options)\n }\n\n public override forward = async (\n ai: Readonly<AxAIService>,\n input: Readonly<AxRerankerIn>,\n options?: Readonly<AxProgramForwardOptions>\n ): Promise<AxRerankerOut> => {\n const { rankedItems } = await super.forward(ai, input, options)\n\n const sortedIndexes: number[] = rankedItems.map((item) => {\n const { id: index } = AxStringUtil.extractIdAndText(item)\n return index\n })\n\n // Ensure all elements are strings and filter out null or undefined\n const sortedItems = input.items\n .map((_, index) => {\n const originalIndex = sortedIndexes[index]\n return originalIndex !== undefined\n ? input.items[originalIndex]\n : undefined\n })\n .filter((item): item is string => item !== undefined)\n\n return { rankedItems: sortedItems }\n }\n}\n","import type {\n AxAIService,\n AxAIServiceActionOptions,\n AxFunction,\n} from '../ai/types.js'\n\nexport class AxEmbeddingAdapter {\n private aiService: AxAIService\n private info: {\n name: string\n description: string\n argumentDescription: string\n }\n private func: (\n args: readonly number[],\n extra?: Readonly<AxAIServiceActionOptions>\n ) => Promise<unknown>\n\n constructor({\n ai,\n info,\n func,\n }: Readonly<{\n ai: AxAIService\n info: Readonly<{\n name: string\n description: string\n argumentDescription: string\n }>\n func: (\n args: readonly number[],\n extra?: Readonly<AxAIServiceActionOptions>\n ) => Promise<unknown>\n }>) {\n this.aiService = ai\n this.info = info\n this.func = func\n }\n\n private async embedAdapter(\n text: string,\n extra?: Readonly<AxAIServiceActionOptions>\n ): Promise<unknown> {\n const embedRes = await this.aiService.embed(\n { texts: [text] },\n { sessionId: extra?.sessionId }\n )\n const embeds = embedRes.embeddings.at(0)\n\n if (!embeds) {\n throw new Error('Failed to embed text')\n }\n\n return this.func.length === 2 ? this.func(embeds, extra) : this.func(embeds)\n }\n\n public toFunction(): AxFunction {\n return {\n name: this.info.name,\n description: this.info.description,\n parameters: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description: this.info.argumentDescription,\n },\n },\n required: ['text'],\n },\n func: ({ text }: Readonly<{ text: string }>, options) =>\n this.embedAdapter(text, options),\n }\n }\n}\n","export const stopwords = new Set([\n '0o',\n '0s',\n '3a',\n '3b',\n '3d',\n '6b',\n '6o',\n 'a',\n 'a1',\n 'a2',\n 'a3',\n 'a4',\n 'ab',\n 'able',\n 'about',\n 'above',\n 'abst',\n 'ac',\n 'accordance',\n 'according',\n 'accordingly',\n 'across',\n 'act',\n 'actually',\n 'ad',\n 'added',\n 'adj',\n 'ae',\n 'af',\n 'affected',\n 'affecting',\n 'affects',\n 'after',\n 'afterwards',\n 'ag',\n 'again',\n 'against',\n 'ah',\n 'ain',\n \"ain't\",\n 'aj',\n 'al',\n 'all',\n 'allow',\n 'allows',\n 'almost',\n 'alone',\n 'along',\n 'already',\n 'also',\n 'although',\n 'always',\n 'am',\n 'among',\n 'amongst',\n 'amoungst',\n 'amount',\n 'an',\n 'and',\n 'announce',\n 'another',\n 'any',\n 'anybody',\n 'anyhow',\n 'anymore',\n 'anyone',\n 'anything',\n 'anyway',\n 'anyways',\n 'anywhere',\n 'ao',\n 'ap',\n 'apart',\n 'apparently',\n 'appear',\n 'appreciate',\n 'appropriate',\n 'approximately',\n 'ar',\n 'are',\n 'aren',\n 'arent',\n \"aren't\",\n 'arise',\n 'around',\n 'as',\n \"a's\",\n 'aside',\n 'ask',\n 'asking',\n 'associated',\n 'at',\n 'au',\n 'auth',\n 'av',\n 'available',\n 'aw',\n 'away',\n 'awfully',\n 'ax',\n 'ay',\n 'az',\n 'b',\n 'b1',\n 'b2',\n 'b3',\n 'ba',\n 'back',\n 'bc',\n 'bd',\n 'be',\n 'became',\n 'because',\n 'become',\n 'becomes',\n 'becoming',\n 'been',\n 'before',\n 'beforehand',\n 'begin',\n 'beginning',\n 'beginnings',\n 'begins',\n 'behind',\n 'being',\n 'believe',\n 'below',\n 'beside',\n 'besides',\n 'best',\n 'better',\n 'between',\n 'beyond',\n 'bi',\n 'bill',\n 'biol',\n 'bj',\n 'bk',\n 'bl',\n 'bn',\n 'both',\n 'bottom',\n 'bp',\n 'br',\n 'brief',\n 'briefly',\n 'bs',\n 'bt',\n 'bu',\n 'but',\n 'bx',\n 'by',\n 'c',\n 'c1',\n 'c2',\n 'c3',\n 'ca',\n 'call',\n 'came',\n 'can',\n 'cannot',\n 'cant',\n \"can't\",\n 'cause',\n 'causes',\n 'cc',\n 'cd',\n 'ce',\n 'certain',\n 'certainly',\n 'cf',\n 'cg',\n 'ch',\n 'changes',\n 'ci',\n 'cit',\n 'cj',\n 'cl',\n 'clearly',\n 'cm',\n \"c'mon\",\n 'cn',\n 'co',\n 'com',\n 'come',\n 'comes',\n 'con',\n 'concerning',\n 'consequently',\n 'consider',\n 'considering',\n 'contain',\n 'containing',\n 'contains',\n 'corresponding',\n 'could',\n 'couldn',\n 'couldnt',\n \"couldn't\",\n 'course',\n 'cp',\n 'cq',\n 'cr',\n 'cry',\n 'cs',\n \"c's\",\n 'ct',\n 'cu',\n 'currently',\n 'cv',\n 'cx',\n 'cy',\n 'cz',\n 'd',\n 'd2',\n 'da',\n 'date',\n 'dc',\n 'dd',\n 'de',\n 'definitely',\n 'describe',\n 'described',\n 'despite',\n 'detail',\n 'df',\n 'di',\n 'did',\n 'didn',\n \"didn't\",\n 'different',\n 'dj',\n 'dk',\n 'dl',\n 'do',\n 'does',\n 'doesn',\n \"doesn't\",\n 'doing',\n 'don',\n 'done',\n \"don't\",\n 'down',\n 'downwards',\n 'dp',\n 'dr',\n 'ds',\n 'dt',\n 'du',\n 'due',\n 'during',\n 'dx',\n 'dy',\n 'e',\n 'e2',\n 'e3',\n 'ea',\n 'each',\n 'ec',\n 'ed',\n 'edu',\n 'ee',\n 'ef',\n 'effect',\n 'eg',\n 'ei',\n 'eight',\n 'eighty',\n 'either',\n 'ej',\n 'el',\n 'eleven',\n 'else',\n 'elsewhere',\n 'em',\n 'empty',\n 'en',\n 'end',\n 'ending',\n 'enough',\n 'entirely',\n 'eo',\n 'ep',\n 'eq',\n 'er',\n 'es',\n 'especially',\n 'est',\n 'et',\n 'et-al',\n 'etc',\n 'eu',\n 'ev',\n 'even',\n 'ever',\n 'every',\n 'everybody',\n 'everyone',\n 'everything',\n 'everywhere',\n 'ex',\n 'exactly',\n 'example',\n 'except',\n 'ey',\n 'f',\n 'f2',\n 'fa',\n 'far',\n 'fc',\n 'few',\n 'ff',\n 'fi',\n 'fifteen',\n 'fifth',\n 'fify',\n 'fill',\n 'find',\n 'fire',\n 'first',\n 'five',\n 'fix',\n 'fj',\n 'fl',\n 'fn',\n 'fo',\n 'followed',\n 'following',\n 'follows',\n 'for',\n 'former',\n 'formerly',\n 'forth',\n 'forty',\n 'found',\n 'four',\n 'fr',\n 'from',\n 'front',\n 'node:fs',\n 'ft',\n 'fu',\n 'full',\n 'further',\n 'furthermore',\n 'fy',\n 'g',\n 'ga',\n 'gave',\n 'ge',\n 'get',\n 'gets',\n 'getting',\n 'gi',\n 'give',\n 'given',\n 'gives',\n 'giving',\n 'gj',\n 'gl',\n 'go',\n 'goes',\n 'going',\n 'gone',\n 'got',\n 'gotten',\n 'gr',\n 'greetings',\n 'gs',\n 'gy',\n 'h',\n 'h2',\n 'h3',\n 'had',\n 'hadn',\n \"hadn't\",\n 'happens',\n 'hardly',\n 'has',\n 'hasn',\n 'hasnt',\n \"hasn't\",\n 'have',\n 'haven',\n \"haven't\",\n 'having',\n 'he',\n 'hed',\n \"he'd\",\n \"he'll\",\n 'hello',\n 'help',\n 'hence',\n 'her',\n 'here',\n 'hereafter',\n 'hereby',\n 'herein',\n 'heres',\n \"here's\",\n 'hereupon',\n 'hers',\n 'herself',\n 'hes',\n \"he's\",\n 'hh',\n 'hi',\n 'hid',\n 'him',\n 'himself',\n 'his',\n 'hither',\n 'hj',\n 'ho',\n 'home',\n 'hopefully',\n 'how',\n 'howbeit',\n 'however',\n \"how's\",\n 'hr',\n 'hs',\n 'http',\n 'hu',\n 'hundred',\n 'hy',\n 'i',\n 'i2',\n 'i3',\n 'i4',\n 'i6',\n 'i7',\n 'i8',\n 'ia',\n 'ib',\n 'ibid',\n 'ic',\n 'id',\n \"i'd\",\n 'ie',\n 'if',\n 'ig',\n 'ignored',\n 'ih',\n 'ii',\n 'ij',\n 'il',\n \"i'll\",\n 'im',\n \"i'm\",\n 'immediate',\n 'immediately',\n 'importance',\n 'important',\n 'in',\n 'inasmuch',\n 'inc',\n 'indeed',\n 'index',\n 'indicate',\n 'indicated',\n 'indicates',\n 'information',\n 'inner',\n 'insofar',\n 'instead',\n 'interest',\n 'into',\n 'invention',\n 'inward',\n 'io',\n 'ip',\n 'iq',\n 'ir',\n 'is',\n 'isn',\n \"isn't\",\n 'it',\n 'itd',\n \"it'd\",\n \"it'll\",\n 'its',\n \"it's\",\n 'itself',\n 'iv',\n \"i've\",\n 'ix',\n 'iy',\n 'iz',\n 'j',\n 'jj',\n 'jr',\n 'js',\n 'jt',\n 'ju',\n 'just',\n 'k',\n 'ke',\n 'keep',\n 'keeps',\n 'kept',\n 'kg',\n 'kj',\n 'km',\n 'know',\n 'known',\n 'knows',\n 'ko',\n 'l',\n 'l2',\n 'la',\n 'largely',\n 'last',\n 'lately',\n 'later',\n 'latter',\n 'latterly',\n 'lb',\n 'lc',\n 'le',\n 'least',\n 'les',\n 'less',\n 'lest',\n 'let',\n 'lets',\n \"let's\",\n 'lf',\n 'like',\n 'liked',\n 'likely',\n 'line',\n 'little',\n 'lj',\n 'll',\n 'll',\n 'ln',\n 'lo',\n 'look',\n 'looking',\n 'looks',\n 'los',\n 'lr',\n 'ls',\n 'lt',\n 'ltd',\n 'm',\n 'm2',\n 'ma',\n 'made',\n 'mainly',\n 'make',\n 'makes',\n 'many',\n 'may',\n 'maybe',\n 'me',\n 'mean',\n 'means',\n 'meantime',\n 'meanwhile',\n 'merely',\n 'mg',\n 'might',\n 'mightn',\n \"mightn't\",\n 'mill',\n 'million',\n 'mine',\n 'miss',\n 'ml',\n 'mn',\n 'mo',\n 'more',\n 'moreover',\n 'most',\n 'mostly',\n 'move',\n 'mr',\n 'mrs',\n 'ms',\n 'mt',\n 'mu',\n 'much',\n 'mug',\n 'must',\n 'mustn',\n \"mustn't\",\n 'my',\n 'myself',\n 'model',\n 'n',\n 'n2',\n 'na',\n 'name',\n 'namely',\n 'nay',\n 'nc',\n 'nd',\n 'ne',\n 'near',\n 'nearly',\n 'necessarily',\n 'necessary',\n 'need',\n 'needn',\n \"needn't\",\n 'needs',\n 'neither',\n 'never',\n 'nevertheless',\n 'new',\n 'next',\n 'ng',\n 'ni',\n 'nine',\n 'ninety',\n 'nj',\n 'nl',\n 'nn',\n 'no',\n 'nobody',\n 'non',\n 'none',\n 'nonetheless',\n 'noone',\n 'nor',\n 'normally',\n 'nos',\n 'not',\n 'noted',\n 'nothing',\n 'novel',\n 'now',\n 'nowhere',\n 'nr',\n 'ns',\n 'nt',\n 'ny',\n 'o',\n 'oa',\n 'ob',\n 'obtain',\n 'obtained',\n 'obviously',\n 'oc',\n 'od',\n 'of',\n 'off',\n 'often',\n 'og',\n 'oh',\n 'oi',\n 'oj',\n 'ok',\n 'okay',\n 'ol',\n 'old',\n 'om',\n 'omitted',\n 'on',\n 'once',\n 'one',\n 'ones',\n 'only',\n 'onto',\n 'oo',\n 'op',\n 'oq',\n 'or',\n 'ord',\n 'os',\n 'ot',\n 'other',\n 'others',\n 'otherwise',\n 'ou',\n 'ought',\n 'our',\n 'ours',\n 'ourselves',\n 'out',\n 'outside',\n 'over',\n 'overall',\n 'ow',\n 'owing',\n 'own',\n 'ox',\n 'oz',\n 'p',\n 'p1',\n 'p2',\n 'p3',\n 'page',\n 'pagecount',\n 'pages',\n 'par',\n 'part',\n 'particular',\n 'particularly',\n 'pas',\n 'past',\n 'pc',\n 'pd',\n 'pe',\n 'per',\n 'perhaps',\n 'pf',\n 'ph',\n 'pi',\n 'pj',\n 'pk',\n 'pl',\n 'placed',\n 'please',\n 'plus',\n 'pm',\n 'pn',\n 'po',\n 'poorly',\n 'possible',\n 'possibly',\n 'potentially',\n 'pp',\n 'pq',\n 'pr',\n 'predominantly',\n 'present',\n 'presumably',\n 'previously',\n 'primarily',\n 'probably',\n 'promptly',\n 'proud',\n 'provides',\n 'ps',\n 'pt',\n 'pu',\n 'put',\n 'py',\n 'q',\n 'qj',\n 'qu',\n 'que',\n 'quickly',\n 'quite',\n 'qv',\n 'r',\n 'r2',\n 'ra',\n 'ran',\n 'rather',\n 'rc',\n 'rd',\n 're',\n 'readily',\n 'really',\n 'reasonably',\n 'recent',\n 'recently',\n 'ref',\n 'refs',\n 'regarding',\n 'regardless',\n 'regards',\n 'related',\n 'relatively',\n 'research',\n 'research-articl',\n 'respectively',\n 'resulted',\n 'resulting',\n 'results',\n 'rf',\n 'rh',\n 'ri',\n 'right',\n 'rj',\n 'rl',\n 'rm',\n 'rn',\n 'ro',\n 'rq',\n 'rr',\n 'rs',\n 'rt',\n 'ru',\n 'run',\n 'rv',\n 'ry',\n 's',\n 's2',\n 'sa',\n 'said',\n 'same',\n 'saw',\n 'say',\n 'saying',\n 'says',\n 'sc',\n 'sd',\n 'se',\n 'sec',\n 'second',\n 'secondly',\n 'section',\n 'see',\n 'seeing',\n 'seem',\n 'seemed',\n 'seeming',\n 'seems',\n 'seen',\n 'self',\n 'selves',\n 'sensible',\n 'sent',\n 'serious',\n 'seriously',\n 'seven',\n 'several',\n 'sf',\n 'shall',\n 'shan',\n \"shan't\",\n 'she',\n 'shed',\n \"she'd\",\n \"she'll\",\n 'shes',\n \"she's\",\n 'should',\n 'shouldn',\n \"shouldn't\",\n \"should've\",\n 'show',\n 'showed',\n 'shown',\n 'showns',\n 'shows',\n 'si',\n 'side',\n 'significant',\n 'significantly',\n 'similar',\n 'similarly',\n 'since',\n 'sincere',\n 'six',\n 'sixty',\n 'sj',\n 'sl',\n 'slightly',\n 'sm',\n 'sn',\n 'so',\n 'some',\n 'somebody',\n 'somehow',\n 'someone',\n 'somethan',\n 'something',\n 'sometime',\n 'sometimes',\n 'somewhat',\n 'somewhere',\n 'soon',\n 'sorry',\n 'sp',\n 'specifically',\n 'specified',\n 'specify',\n 'specifying',\n 'sq',\n 'sr',\n 'ss',\n 'st',\n 'still',\n 'stop',\n 'strongly',\n 'sub',\n 'substantially',\n 'successfully',\n 'such',\n 'sufficiently',\n 'suggest',\n 'sup',\n 'sure',\n 'sy',\n 'system',\n 'sz',\n 't',\n 't1',\n 't2',\n 't3',\n 'take',\n 'taken',\n 'taking',\n 'tb',\n 'tc',\n 'td',\n 'te',\n 'tell',\n 'ten',\n 'tends',\n 'tf',\n 'th',\n 'than',\n 'thank',\n 'thanks',\n 'thanx',\n 'that',\n \"that'll\",\n 'thats',\n \"that's\",\n \"that've\",\n 'the',\n 'their',\n 'theirs',\n 'them',\n 'themselves',\n 'then',\n 'thence',\n 'there',\n 'thereafter',\n 'thereby',\n 'thered',\n 'therefore',\n 'therein',\n \"there'll\",\n 'thereof',\n 'therere',\n 'theres',\n \"there's\",\n 'thereto',\n 'thereupon',\n \"there've\",\n 'these',\n 'they',\n 'theyd',\n \"they'd\",\n \"they'll\",\n 'theyre',\n \"they're\",\n \"they've\",\n 'thickv',\n 'thin',\n 'think',\n 'third',\n 'this',\n 'thorough',\n 'thoroughly',\n 'those',\n 'thou',\n 'though',\n 'thoughh',\n 'thousand',\n 'three',\n 'throug',\n 'through',\n 'throughout',\n 'thru',\n 'thus',\n 'ti',\n 'til',\n 'tip',\n 'tj',\n 'tl',\n 'tm',\n 'tn',\n 'to',\n 'together',\n 'too',\n 'took',\n 'top',\n 'toward',\n 'towards',\n 'tp',\n 'tq',\n 'tr',\n 'tried',\n 'tries',\n 'truly',\n 'try',\n 'trying',\n 'ts',\n \"t's\",\n 'tt',\n 'tv',\n 'twelve',\n 'twenty',\n 'twice',\n 'two',\n 'tx',\n 'u',\n 'u201d',\n 'ue',\n 'ui',\n 'uj',\n 'uk',\n 'um',\n 'un',\n 'under',\n 'unfortunately',\n 'unless',\n 'unlike',\n 'unlikely',\n 'until',\n 'unto',\n 'uo',\n 'up',\n 'upon',\n 'ups',\n 'ur',\n 'us',\n 'use',\n 'used',\n 'useful',\n 'usefully',\n 'usefulness',\n 'uses',\n 'using',\n 'usually',\n 'ut',\n 'v',\n 'va',\n 'value',\n 'various',\n 'vd',\n 've',\n 've',\n 'very',\n 'via',\n 'viz',\n 'vj',\n 'vo',\n 'vol',\n 'vols',\n 'volumtype',\n 'vq',\n 'vs',\n 'vt',\n 'vu',\n 'w',\n 'wa',\n 'want',\n 'wants',\n 'was',\n 'wasn',\n 'wasnt',\n \"wasn't\",\n 'way',\n 'we',\n 'wed',\n \"we'd\",\n 'welcome',\n 'well',\n \"we'll\",\n 'well-b',\n 'went',\n 'were',\n \"we're\",\n 'weren',\n 'werent',\n \"weren't\",\n \"we've\",\n 'what',\n 'whatever',\n \"what'll\",\n 'whats',\n \"what's\",\n 'when',\n 'whence',\n 'whenever',\n \"when's\",\n 'where',\n 'whereafter',\n 'whereas',\n 'whereby',\n 'wherein',\n 'wheres',\n \"where's\",\n 'whereupon',\n 'wherever',\n 'whether',\n 'which',\n 'while',\n 'whim',\n 'whither',\n 'who',\n 'whod',\n 'whoever',\n 'whole',\n \"who'll\",\n 'whom',\n 'whomever',\n 'whos',\n \"who's\",\n 'whose',\n 'why',\n \"why's\",\n 'wi',\n 'widely',\n 'will',\n 'willing',\n 'wish',\n 'with',\n 'within',\n 'without',\n 'wo',\n 'won',\n 'wonder',\n 'wont',\n \"won't\",\n 'words',\n 'world',\n 'would',\n 'wouldn',\n 'wouldnt',\n \"wouldn't\",\n 'www',\n 'x',\n 'x1',\n 'x2',\n 'x3',\n 'xf',\n 'xi',\n 'xj',\n 'xk',\n 'xl',\n 'xn',\n 'xo',\n 'xs',\n 'xt',\n 'xv',\n 'xx',\n 'y',\n 'y2',\n 'yes',\n 'yet',\n 'yj',\n 'yl',\n 'you',\n 'youd',\n \"you'd\",\n \"you'll\",\n 'your',\n 'youre',\n \"you're\",\n 'yours',\n 'yourself',\n 'yourselves',\n \"you've\",\n 'yr',\n 'ys',\n 'yt',\n 'z',\n 'zero',\n 'zi',\n 'zz',\n 'task',\n])\n","import { stopwords } from './stopwords.js'\n\n/**\n * Filters out tokens based on a set of exclusion tokens.\n *\n * @param tokens The array of tokens to filter.\n * @param exclusions A set containing tokens to exclude.\n * @returns An array of filtered tokens.\n */\nfunction filterTokens(\n tokens: readonly string[],\n exclusions: ReadonlySet<string>\n): string[] {\n return tokens.filter((token) => !exclusions.has(token))\n}\n\n/**\n * Counts the occurrences of each token in an array of tokens.\n *\n * This function supports the preprocessing step for NLP tasks like text similarity\n * and classification by transforming text into a bag-of-words model, facilitating\n * the comparison of different texts based on their content.\n *\n * @param tokens An array of string tokens.\n * @returns A Counter object mapping each token to its count.\n */\nfunction countTokens(tokens: readonly string[]): Record<string, number> {\n const counter: Record<string, number> = {}\n for (const token of tokens) {\n counter[token] = (counter[token] || 0) + 1\n }\n return counter\n}\n\n/**\n * Normalizes text by lowercasing, removing punctuation, and squashing multiple spaces.\n *\n * This normalization is crucial in NLP for reducing the complexity of the text data,\n * minimizing the variance between words that should be considered the same for analysis\n * purposes (e.g., \"Dog!\" and \"dog\" are treated as the same word).\n *\n * @param s A string to be normalized.\n * @returns A normalized string.\n */\nfunction normalizeText(s: string): string {\n s = s.normalize('NFD')\n s = s.replace(/\\b(a|an|the)\\b/g, ' ')\n s = s.split(/\\s+/).join(' ')\n s = s.replace(/[!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/g, '')\n return s.toLowerCase()\n}\n\n/**\n * Calculates the Exact Match (EM) score between a prediction and ground truth.\n *\n * The EM score is a strict metric used in machine learning to assess if the predicted\n * answer matches the ground truth exactly, commonly used in tasks like question answering.\n *\n * @param prediction The predicted text.\n * @param groundTruth The actual correct text.\n * @returns A boolean indicating if the prediction exactly matches the ground truth.\n */\nfunction emScore(prediction: string, groundTruth: string): boolean {\n return normalizeText(prediction) === normalizeText(groundTruth)\n}\n\n/**\n * Calculates the F1 score between a prediction and ground truth.\n *\n * The F1 score is a harmonic mean of precision and recall, widely used in NLP to measure\n * a model's accuracy in considering both false positives and false negatives, offering a\n * balance for evaluating classification models.\n *\n * @param prediction The predicted text.\n * @param groundTruth The actual correct text.\n * @returns The F1 score as a number.\n */\nfunction f1Score(prediction: string, groundTruth: string): number {\n const predictionTokens = normalizeText(prediction).split(' ')\n const groundTruthTokens = normalizeText(groundTruth).split(' ')\n\n // Calculate the intersection of common tokens between prediction and ground truth\n const predictionCounts = countTokens(predictionTokens)\n const groundTruthCounts = countTokens(groundTruthTokens)\n\n let numSame = 0\n for (const token in predictionCounts) {\n const v1 = predictionCounts[token] ?? 0\n const v2 = groundTruthCounts[token] ?? 0\n numSame += Math.min(v1, v2)\n }\n if (numSame === 0) {\n return 0\n }\n\n const precision = numSame / predictionTokens.length\n const recall = numSame / groundTruthTokens.length\n return (2 * precision * recall) / (precision + recall)\n}\n\n/**\n * Calculates a novel F1 score, taking into account a history of interaction and excluding stopwords.\n *\n * This metric extends the F1 score by considering contextual relevance and filtering out common words\n * that might skew the assessment of the prediction's quality, especially in conversational models or\n * when historical context is relevant.\n *\n * @param history The historical context or preceding interactions.\n * @param prediction The predicted text.\n * @param groundTruth The actual correct text.\n * @param returnRecall Optionally return the recall score instead of F1.\n * @returns The novel F1 or recall score as a number.\n */\nfunction novelF1ScoreOptimized(\n history: string,\n prediction: string,\n groundTruth: string,\n returnRecall: boolean = false\n): number {\n // Normalize and split the input texts into tokens\n const historyTokens = normalizeText(history).split(' ')\n let predictionTokens = normalizeText(prediction).split(' ')\n let groundTruthTokens = normalizeText(groundTruth).split(' ')\n\n // Combine stopwords and history tokens for exclusion\n const exclusions = new Set([...stopwords, ...historyTokens])\n\n // Filter prediction and ground truth tokens against the exclusions\n predictionTokens = filterTokens(predictionTokens, exclusions)\n groundTruthTokens = filterTokens(groundTruthTokens, exclusions)\n\n // Proceed with calculating common tokens, precision, recall, and F1 score as previously outlined\n\n // Placeholder for the calculation logic\n const numSame = 0 // This should be calculated as before\n const precision = numSame / predictionTokens.length\n const recall = numSame / groundTruthTokens.length\n const f1 = (2 * precision * recall) / (precision + recall)\n\n return returnRecall ? recall : f1\n}\n\nexport const AxEvalUtil = {\n emScore,\n f1Score,\n novelF1ScoreOptimized,\n}\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from 'uuid'\n\nimport type { AxFunction } from '../ai/types.js'\nimport { ColorLog } from '../util/log.js'\n\nimport type { AxMCPTransport } from './transport.js'\nimport type {\n JSONRPCNotification,\n JSONRPCRequest,\n MCPInitializeParams,\n MCPInitializeResult,\n MCPToolsListResult,\n} from './types.js'\n\nconst colorLog = new ColorLog()\n\n/**\n * Configuration for overriding function properties\n */\ninterface FunctionOverride {\n /** Original function name to override */\n name: string\n /** Updates to apply to the function */\n updates: {\n /** Alternative name for the function */\n name?: string\n /** Alternative description for the function */\n description?: string\n }\n}\n\n/**\n * Options for the MCP client\n */\ninterface AxMCPClientOptions {\n /** Enable debug logging */\n debug?: boolean\n /**\n * List of function overrides\n * Use this to provide alternative names and descriptions for functions\n * while preserving their original functionality\n *\n * Example:\n * ```\n * functionOverrides: [\n * {\n * name: \"original-function-name\",\n * updates: {\n * name: \"new-function-name\",\n * description: \"New function description\"\n * }\n * }\n * ]\n * ```\n */\n functionOverrides?: FunctionOverride[]\n}\n\nexport class AxMCPClient {\n private functions: AxFunction[] = []\n private activeRequests: Map<string, { reject: (reason: unknown) => void }> =\n new Map()\n private capabilities: {\n tools?: boolean\n resources?: boolean\n prompts?: boolean\n } = {}\n\n constructor(\n private readonly transport: AxMCPTransport,\n private readonly options: Readonly<AxMCPClientOptions> = {}\n ) {}\n\n async init(): Promise<void> {\n if ('connect' in this.transport) {\n await this.transport.connect?.()\n }\n\n const { result: res } = await this.sendRequest<\n MCPInitializeParams,\n MCPInitializeResult\n >('initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {\n roots: { listChanged: true },\n sampling: {},\n },\n clientInfo: {\n name: 'AxMCPClient',\n version: '1.0.0',\n },\n })\n\n const expectedProtocolVersion = '2024-11-05'\n if (res.protocolVersion !== expectedProtocolVersion) {\n throw new Error(\n `Protocol version mismatch. Expected ${expectedProtocolVersion} but got ${res.protocolVersion}`\n )\n }\n\n if (res.capabilities.tools) {\n this.capabilities.tools = true\n }\n\n if (res.capabilities.resources) {\n this.capabilities.resources = true\n }\n\n if (res.capabilities.prompts) {\n this.capabilities.prompts = true\n }\n\n await this.sendNotification('notifications/initialized')\n\n await this.discoverFunctions()\n }\n\n private async discoverFunctions(): Promise<void> {\n if (!this.capabilities.tools) {\n throw new Error('Tools are not supported')\n }\n\n const { result: res } = await this.sendRequest<\n undefined,\n MCPToolsListResult\n >('tools/list')\n\n this.functions = res.tools.map((fn): AxFunction => {\n // Check if there's an override for this function\n const override = this.options.functionOverrides?.find(\n (o) => o.name === fn.name\n )\n\n const parameters = fn.inputSchema.properties\n ? {\n properties: fn.inputSchema.properties,\n required: fn.inputSchema.required ?? [],\n type: fn.inputSchema.type,\n }\n : undefined\n\n return {\n name: override?.updates.name ?? fn.name,\n description: override?.updates.description ?? fn.description,\n parameters,\n func: async (args) => {\n // Always use original name when calling the function\n const { result } = await this.sendRequest<{\n name: string\n // eslint-disable-next-line functional/functional-parameters\n arguments: unknown\n }>('tools/call', { name: fn.name, arguments: args })\n return result\n },\n }\n })\n\n if (this.options.debug) {\n console.log(\n colorLog.yellow(`> Discovered ${this.functions.length} functions:`)\n )\n for (const fn of this.functions) {\n console.log(colorLog.yellow(` - ${fn.name}: ${fn.description}`))\n }\n }\n }\n\n async ping(timeout = 3000): Promise<void> {\n const pingPromise = this.sendRequest('ping')\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(\n () => reject(new Error('Ping response timeout exceeded')),\n timeout\n )\n )\n const response = (await Promise.race([pingPromise, timeoutPromise])) as {\n result: unknown\n }\n const { result } = response\n if (\n typeof result !== 'object' ||\n result === null ||\n Object.keys(result).length !== 0\n ) {\n throw new Error(`Unexpected ping response: ${JSON.stringify(result)}`)\n }\n }\n\n toFunction(): AxFunction[] {\n return this.functions\n }\n\n cancelRequest(id: string): void {\n if (this.activeRequests.has(id)) {\n this.sendNotification('notifications/cancelled', {\n requestId: id,\n reason: 'Client cancelled request',\n })\n const entry = this.activeRequests.get(id)\n if (entry) {\n entry.reject(new Error(`Request ${id} cancelled`))\n }\n this.activeRequests.delete(id)\n }\n }\n\n private async sendRequest<T = unknown, R = unknown>(\n method: string,\n params: T = {} as T\n ): Promise<{ id: string; result: R }> {\n const requestId = uuidv4()\n const request: JSONRPCRequest<T> = {\n jsonrpc: '2.0',\n id: requestId,\n method,\n params,\n }\n\n if (this.options.debug) {\n console.log(\n colorLog.blueBright(\n `> Sending request ${requestId}:\\n${JSON.stringify(request, null, 2)}`\n )\n )\n }\n\n const responsePromise = new Promise<{ result: R }>((resolve, reject) => {\n this.activeRequests.set(requestId, { reject })\n this.transport\n .send(request)\n .then((res: unknown) => {\n this.activeRequests.delete(requestId)\n if (this.options.debug) {\n console.log(\n colorLog.greenBright(\n `> Received response for request ${requestId}:\\n${JSON.stringify(res, null, 2)}`\n )\n )\n }\n if (res !== null && typeof res === 'object' && 'error' in res) {\n const errorObj = res as { error: { code: number; message: string } }\n reject(\n new Error(\n `RPC Error ${errorObj.error.code}: ${errorObj.error.message}`\n )\n )\n } else if (\n res !== null &&\n typeof res === 'object' &&\n 'result' in res\n ) {\n resolve({ result: (res as { result: R }).result })\n } else {\n reject(new Error('Invalid response no result or error'))\n }\n })\n .catch((err: unknown) => {\n this.activeRequests.delete(requestId)\n reject(err)\n })\n })\n\n const { result } = await responsePromise\n return { id: requestId, result }\n }\n\n private async sendNotification(\n method: string,\n params: Record<string, unknown> = {}\n ): Promise<void> {\n const notification: JSONRPCNotification = {\n jsonrpc: '2.0',\n method,\n params,\n }\n\n if (this.options.debug) {\n console.log(\n '➡️ Sending notification:',\n JSON.stringify(notification, null, 2)\n )\n }\n\n await this.transport.sendNotification(notification)\n }\n}\n","import type { AxMCPTransport } from './transport.js'\nimport type {\n JSONRPCNotification,\n JSONRPCRequest,\n JSONRPCResponse,\n} from './types.js'\n\nexport class AxMCPHTTPTransport implements AxMCPTransport {\n private endpoint: string | null = null\n private sseUrl: string\n private eventSource?: EventSource\n\n constructor(sseUrl: string) {\n this.sseUrl = sseUrl\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.eventSource = new EventSource(this.sseUrl)\n\n this.eventSource.addEventListener('endpoint', (event: Event) => {\n try {\n const messageEvent = event as MessageEvent\n const data = JSON.parse(messageEvent.data)\n if (!data.uri) {\n throw new Error('Endpoint URI missing in SSE event data')\n }\n this.endpoint = data.uri\n resolve()\n } catch (error) {\n reject(error)\n }\n })\n\n this.eventSource.onerror = () => {\n reject(new Error('Failed to establish SSE connection'))\n }\n })\n }\n\n async send(\n message: JSONRPCRequest<unknown> | JSONRPCNotification\n ): Promise<JSONRPCResponse<unknown>> {\n if (!this.endpoint) {\n throw new Error(\n 'HTTPTransport endpoint is not initialized. Call connect() first.'\n )\n }\n\n const res = await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(message),\n })\n\n if (!res.ok) {\n throw new Error(`HTTP error ${res.status}: ${res.statusText}`)\n }\n\n return res.json() as Promise<JSONRPCResponse<unknown>>\n }\n\n async sendNotification(\n message: Readonly<JSONRPCNotification>\n ): Promise<void> {\n if (!this.endpoint) {\n throw new Error(\n 'HTTPTransport endpoint is not initialized. Call connect() first.'\n )\n }\n await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(message),\n })\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process'\nimport readline from 'node:readline'\n\nimport type { AxMCPTransport } from './transport.js'\nimport type {\n JSONRPCNotification,\n JSONRPCRequest,\n JSONRPCResponse,\n} from './types.js'\n\ninterface StdioTransportConfig {\n command: string\n args?: string[]\n env?: NodeJS.ProcessEnv\n}\n\nexport class AxMCPStdioTransport implements AxMCPTransport {\n private process: ChildProcessWithoutNullStreams\n private rl: readline.Interface\n private pendingResponses = new Map<\n string | number,\n (res: JSONRPCResponse) => void\n >()\n\n constructor(config: Readonly<StdioTransportConfig>) {\n this.process = spawn(config.command, config.args ?? [], {\n env: config.env ? { ...process.env, ...config.env } : process.env,\n })\n this.rl = readline.createInterface({ input: this.process.stdout })\n this.rl.on('line', (line) => {\n const response: JSONRPCResponse = JSON.parse(line)\n const resolver = this.pendingResponses.get(response.id)\n if (resolver) {\n resolver(response)\n this.pendingResponses.delete(response.id)\n }\n })\n }\n\n async send(\n message: Readonly<JSONRPCRequest<unknown>>\n ): Promise<JSONRPCResponse<unknown>> {\n return new Promise<JSONRPCResponse<unknown>>((resolve) => {\n this.pendingResponses.set(message.id, (res: JSONRPCResponse) => {\n resolve(res as JSONRPCResponse<unknown>)\n })\n this.process.stdin.write(`${JSON.stringify(message)}\\n`)\n })\n }\n\n async sendNotification(\n message: Readonly<JSONRPCNotification>\n ): Promise<void> {\n this.process.stdin.write(`${JSON.stringify(message)}\\n`)\n }\n\n async connect(): Promise<void> {\n // Existing implementation\n }\n}\n","import type { ReadableStream } from 'stream/web'\n\nimport type {\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n} from './types.js'\n\ntype AxAIServiceListItem = {\n key: string\n service: AxAIService\n description: string\n isInternal?: boolean\n}\n\nexport class AxMultiServiceRouter implements AxAIService<string, string> {\n private services: Map<\n string,\n {\n useDefaultModel?: boolean\n isInternal?: boolean\n description: string\n model: string\n service: AxAIService\n }\n > = new Map()\n /**\n * Constructs a new multi-service router.\n * It validates that each service provides a unique set of model keys,\n * then builds a lookup (map) for routing the chat/embed requests.\n */\n constructor(services: (AxAIServiceListItem | AxAIService)[]) {\n if (services.length === 0) {\n throw new Error('No AI services provided.')\n }\n\n // Determine input type based on first element (assuming homogeneous array)\n\n for (const [index, item] of services.entries()) {\n const isKeyBased = 'key' in item\n\n if (isKeyBased) {\n if (this.services.has(item.key)) {\n throw new Error(`Duplicate model key: ${item.key}`)\n }\n\n const { service, description, isInternal } = item\n\n this.services.set(item.key, {\n service,\n description,\n isInternal,\n model: item.service.getDefaultModels().model,\n useDefaultModel: true,\n })\n } else {\n const modelList = item.getModelList() as AxAIModelList | undefined\n\n if (!modelList) {\n throw new Error(\n `Service ${index} \\`${item.getName()}\\` has no model list.`\n )\n }\n\n for (const { key, description, model } of modelList ?? []) {\n if (this.services.has(key)) {\n const otherService = this.services.get(key)?.service\n throw new Error(\n `Service ${index} \\`${item.getName()}\\` has duplicate model key: ${key} as service ${otherService?.getName()}`\n )\n }\n\n this.services.set(key, {\n description,\n service: item,\n model,\n })\n }\n }\n }\n }\n\n /**\n * Delegates the chat call to the service matching the provided model key.\n */\n async chat(\n req: Readonly<AxChatRequest<string>>,\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<string, string>\n >\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n const modelKey = req.model\n if (!modelKey) {\n throw new Error('Model key must be specified for multi-service')\n }\n\n const item = this.services.get(modelKey)\n if (!item) {\n throw new Error(`No service found for model key: ${modelKey}`)\n }\n\n const service = item.service\n const model = item.useDefaultModel ? req.model : modelKey\n return await service.chat({ model, ...req }, options)\n }\n\n /**\n * Delegates the embed call to the service matching the provided embed model key.\n */\n async embed(\n req: Readonly<AxEmbedRequest<string>>,\n options?: Readonly<AxAIServiceActionOptions<string, string>>\n ): Promise<AxEmbedResponse> {\n const modelKey = req.embedModel\n if (!modelKey) {\n throw new Error('Embed model key must be specified for multi-service')\n }\n\n const item = this.services.get(modelKey)\n if (!item) {\n throw new Error(`No service found for embed model key: ${modelKey}`)\n }\n\n // Remove embedModel from request as service should use its default\n const service = item.service\n const embedModel = item.useDefaultModel ? req.embedModel : modelKey\n return await service.embed({ embedModel, ...req }, options)\n }\n\n /**\n * Returns a composite ID built from the IDs of the underlying services.\n */\n getId(): string {\n return (\n 'MultiServiceRouter:' +\n Array.from(this.services.values())\n .map((s) => s.service.getId())\n .join(',')\n )\n }\n\n /**\n * Returns the name of this router.\n */\n getName(): string {\n return 'MultiServiceRouter'\n }\n\n /**\n * Aggregates all available models across the underlying services.\n */\n getModelList(): AxAIModelList {\n return Array.from(this.services)\n .filter(([, value]) => !value.isInternal)\n .map(([key, { description, model }]) => ({\n key,\n description,\n model,\n }))\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n throw new Error(\n 'getDefaultModels is not supported for multi-service router.'\n )\n }\n\n /**\n * If a model key is provided, delegate to the corresponding service's features.\n * Otherwise, returns a default feature set.\n */\n getFeatures(model?: string): {\n functions: boolean\n streaming: boolean\n functionCot?: boolean\n } {\n if (model) {\n const service = this.services.get(model)\n if (service) {\n return service.service.getFeatures(model)\n }\n }\n return { functions: false, streaming: false }\n }\n\n /**\n * Returns aggregated metrics from the underlying service.\n * Uses the metrics from the last service that was used,\n * or falls back to the first service if none has been used.\n */\n getMetrics(): AxAIServiceMetrics {\n const service = this.services.values().next().value\n if (!service) {\n throw new Error('No service available to get metrics.')\n }\n return service.service.getMetrics()\n }\n\n /**\n * Sets options on all underlying services.\n */\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n for (const service of this.services.values()) {\n service.service.setOptions(options)\n }\n }\n\n /**\n * Returns the options from the last used service,\n * or falls back to the first service if none has been used.\n */\n getOptions(): Readonly<AxAIServiceOptions> {\n const service = this.services.values().next().value\n if (!service) {\n throw new Error('No service available to get options.')\n }\n return service.service.getOptions()\n }\n}\n","import { type AxProgramForwardOptions } from '../dsp/program.js'\nimport { AxStringUtil } from '../dsp/strutil.js'\nimport {\n type AxAIService,\n AxGen,\n type AxGenOptions,\n AxSignature,\n} from '../index.js'\n\nimport { AxChainOfThought } from './cot.js'\n\nexport class AxRAG extends AxChainOfThought<\n { context: string[]; question: string },\n { answer: string }\n> {\n private genQuery: AxGen<\n { context: string[]; question: string },\n { query: string }\n >\n private queryFn: (query: string) => Promise<string>\n private maxHops: number\n\n constructor(\n queryFn: (query: string) => Promise<string>,\n options: Readonly<AxGenOptions & { maxHops?: number }>\n ) {\n const sig =\n '\"Answer questions with short factoid answers.\" context:string[] \"may contain relevant facts\", question -> answer'\n super(sig, options)\n\n this.maxHops = options?.maxHops ?? 3\n\n const qsig = new AxSignature(\n '\"Write a simple search query that will help answer a complex question.\" context?:string[] \"may contain relevant facts\", question -> query \"question to further our understanding\"'\n )\n this.genQuery = new AxGen<\n { context: string[]; question: string },\n { query: string }\n >(qsig)\n this.queryFn = queryFn\n this.register(this.genQuery)\n }\n\n public override async forward(\n ai: Readonly<AxAIService>,\n { question }: Readonly<{ question: string }>,\n options?: Readonly<AxProgramForwardOptions>\n ): Promise<{ answer: string; reason: string }> {\n let context: string[] = []\n\n for (let i = 0; i < this.maxHops; i++) {\n const { query } = await this.genQuery.forward(\n ai,\n {\n context,\n question,\n },\n options\n )\n const val = await this.queryFn(query)\n context = AxStringUtil.dedup([...context, val])\n }\n\n return super.forward(ai, { context, question }, options)\n }\n}\n"],"mappings":"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EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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","names":["AxLLMRequestTypeValues","AxSpanKindValues","ReadableStream","TransformStream","TransformStream","TransformStream","controller","ReadableStream","TransformStream","fn","res","AxAIAnthropicModel","AxAIAnthropicVertexModel","content","AxAIOpenAIModel","AxAIOpenAIEmbedModel","createMessages","mapFinishReason","id","AxAICohereModel","AxAICohereEmbedModel","AxAIDeepSeekModel","AxAIGoogleGeminiModel","AxAIGoogleGeminiEmbedModel","AxAIGoogleGeminiSafetyCategory","AxAIGoogleGeminiSafetyThreshold","i","safetySettings","colorLog","AxAIGroqModel","AxAIHuggingFaceModel","fc","AxAIMistralModel","AxAIMistralEmbedModels","AxAIRekaModel","createMessages","mapFinishReason","ReadableStream","SpanKind","fc","colorLog","value","colorLog","schema","colorLog","res","ReadableStream","SpanKind","files","validateModels","SpanKind","fetch","SpanKind","fetch","table","table","fetch","fetch","AxJSInterpreterPermission","colorLog","m","crypto","crypto","colorLog"]}
1
+ {"version":3,"sources":["../ai/base.ts","../trace/trace.ts","../util/apicall.ts","../util/sse.ts","../util/stream.ts","../util/transform.ts","../util/log.ts","../ai/debug.ts","../ai/google-vertex/auth.ts","../ai/anthropic/types.ts","../ai/anthropic/info.ts","../ai/anthropic/api.ts","../ai/openai/types.ts","../ai/openai/info.ts","../ai/openai/api.ts","../ai/azure-openai/api.ts","../ai/cohere/types.ts","../ai/cohere/info.ts","../ai/cohere/api.ts","../ai/deepseek/types.ts","../ai/deepseek/info.ts","../ai/deepseek/api.ts","../ai/google-gemini/types.ts","../ai/google-gemini/info.ts","../ai/google-gemini/api.ts","../util/rate-limit.ts","../ai/groq/types.ts","../ai/groq/info.ts","../ai/groq/api.ts","../ai/huggingface/info.ts","../ai/huggingface/types.ts","../ai/huggingface/api.ts","../ai/mistral/types.ts","../ai/mistral/info.ts","../ai/mistral/api.ts","../ai/ollama/api.ts","../ai/reka/types.ts","../ai/reka/info.ts","../ai/reka/api.ts","../ai/together/info.ts","../ai/together/api.ts","../ai/wrap.ts","../dsp/generate.ts","../ai/util.ts","../mem/memory.ts","../dsp/asserts.ts","../dsp/datetime.ts","../dsp/registry.ts","../dsp/sig.ts","../dsp/parser.ts","../dsp/util.ts","../dsp/program.ts","../dsp/prompt.ts","../dsp/validate.ts","../dsp/extract.ts","../dsp/fieldProcessor.ts","../dsp/jsonschema.ts","../dsp/functions.ts","../prompts/agent.ts","../docs/tika.ts","../ai/balance.ts","../dsp/optimize.ts","../db/base.ts","../db/cloudflare.ts","../db/memory.ts","../db/pinecone.ts","../db/weaviate.ts","../db/wrap.ts","../docs/manager.ts","../funcs/docker.ts","../dsp/loader.ts","../funcs/code.ts","../dsp/mipro.ts","../ai/mock/api.ts","../dsp/router.ts","../dsp/evaluate.ts","../prompts/cot.ts","../docs/rewriter.ts","../dsp/strutil.ts","../docs/reranker.ts","../funcs/embed.ts","../dsp/stopwords.ts","../dsp/eval.ts","../../../node_modules/uuid/dist/esm-node/rng.js","../../../node_modules/uuid/dist/esm-node/stringify.js","../../../node_modules/uuid/dist/esm-node/native.js","../../../node_modules/uuid/dist/esm-node/v4.js","../mcp/client.ts","../mcp/httpTransport.ts","../mcp/stdioTransport.ts","../ai/multiservice.ts","../prompts/rag.ts"],"sourcesContent":["import type { ReadableStream } from 'stream/web'\n\nimport { type Span, SpanKind } from '@opentelemetry/api'\n\nimport { axSpanAttributes } from '../trace/trace.js'\nimport { apiCall } from '../util/apicall.js'\nimport { RespTransformStream } from '../util/transform.js'\n\nimport { logChatRequest, logResponse } from './debug.js'\nimport type {\n AxAIInputModelList,\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceImpl,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n AxModelConfig,\n AxModelInfo,\n AxTokenUsage,\n} from './types.js'\n\nexport interface AxAIFeatures {\n functions: boolean\n streaming: boolean\n functionCot?: boolean\n}\n\nexport interface AxBaseAIArgs<TModel, TEmbedModel> {\n name: string\n apiURL: string\n headers: () => Promise<Record<string, string>>\n modelInfo: Readonly<AxModelInfo[]>\n defaults: Readonly<{ model: TModel; embedModel?: TEmbedModel }>\n options?: Readonly<AxAIServiceOptions>\n supportFor: AxAIFeatures | ((model: TModel) => AxAIFeatures)\n models?: AxAIInputModelList<TModel>\n}\n\nexport const axBaseAIDefaultConfig = (): AxModelConfig =>\n structuredClone({\n maxTokens: 2000,\n temperature: 0,\n topK: 40,\n topP: 0.9,\n })\n\nexport const axBaseAIDefaultCreativeConfig = (): AxModelConfig =>\n structuredClone({\n maxTokens: 2000,\n temperature: 0.4,\n topP: 0.7,\n frequencyPenalty: 0.2,\n })\n\nexport class AxBaseAI<\n TModel,\n TEmbedModel,\n TChatRequest,\n TEmbedRequest,\n TChatResponse,\n TChatResponseDelta,\n TEmbedResponse,\n> implements AxAIService<TModel, TEmbedModel>\n{\n private debug = false\n\n private rt?: AxAIServiceOptions['rateLimiter']\n private fetch?: AxAIServiceOptions['fetch']\n private tracer?: AxAIServiceOptions['tracer']\n private models?: (AxAIModelList[number] & {\n model: TModel\n isInternal?: boolean\n })[]\n\n private modelInfo: readonly AxModelInfo[]\n private modelUsage?: AxTokenUsage\n private embedModelUsage?: AxTokenUsage\n private defaults: AxBaseAIArgs<TModel, TEmbedModel>['defaults']\n\n protected apiURL: string\n protected name: string\n protected id: string\n protected headers: () => Promise<Record<string, string>>\n protected supportFor: AxAIFeatures | ((model: TModel) => AxAIFeatures)\n\n // Add private metrics tracking properties\n private metrics: AxAIServiceMetrics = {\n latency: {\n chat: {\n mean: 0,\n p95: 0,\n p99: 0,\n samples: [],\n },\n embed: {\n mean: 0,\n p95: 0,\n p99: 0,\n samples: [],\n },\n },\n errors: {\n chat: {\n count: 0,\n rate: 0,\n total: 0,\n },\n embed: {\n count: 0,\n rate: 0,\n total: 0,\n },\n },\n }\n\n constructor(\n private readonly aiImpl: Readonly<\n AxAIServiceImpl<\n TModel,\n TEmbedModel,\n TChatRequest,\n TEmbedRequest,\n TChatResponse,\n TChatResponseDelta,\n TEmbedResponse\n >\n >,\n {\n name,\n apiURL,\n headers,\n modelInfo,\n defaults,\n options = {},\n supportFor,\n models,\n }: Readonly<AxBaseAIArgs<TModel, TEmbedModel>>\n ) {\n this.name = name\n this.apiURL = apiURL\n this.headers = headers\n this.supportFor = supportFor\n this.tracer = options.tracer\n this.modelInfo = modelInfo\n this.models = models\n this.id = crypto.randomUUID()\n\n const model =\n this.models?.find((v) => v.key === defaults.model)?.model ??\n defaults.model\n\n const embedModel = defaults.embedModel\n\n this.defaults = { model, embedModel }\n\n if (\n !defaults.model ||\n typeof defaults.model !== 'string' ||\n defaults.model === ''\n ) {\n throw new Error('No model defined')\n }\n\n this.setOptions(options)\n\n if (models) {\n validateModels(models)\n }\n }\n\n public setName(name: string): void {\n this.name = name\n }\n\n public getId(): string {\n return this.id\n }\n\n public setAPIURL(apiURL: string): void {\n this.apiURL = apiURL\n }\n\n public setHeaders(headers: () => Promise<Record<string, string>>): void {\n this.headers = headers\n }\n\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n if (options.debug) {\n this.debug = options.debug\n }\n\n if (options.rateLimiter) {\n this.rt = options.rateLimiter\n }\n\n if (options.fetch) {\n this.fetch = options.fetch\n }\n\n if (options.tracer) {\n this.tracer = options.tracer\n }\n }\n\n getOptions(): Readonly<AxAIServiceOptions> {\n return {\n debug: this.debug,\n rateLimiter: this.rt,\n fetch: this.fetch,\n tracer: this.tracer,\n }\n }\n\n getModelList(): AxAIModelList | undefined {\n return this.models\n ?.filter((model) => !model.isInternal)\n ?.map((model) => ({\n key: model.key,\n description: model.description,\n model: model.model as string,\n }))\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n return {\n model: this.defaults.model as string,\n embedModel: this.defaults.embedModel as string | undefined,\n }\n }\n\n getName(): string {\n return this.name\n }\n\n getFeatures(model?: TModel): AxAIFeatures {\n return typeof this.supportFor === 'function'\n ? this.supportFor(model ?? this.defaults.model)\n : this.supportFor\n }\n\n // Method to calculate percentiles\n private calculatePercentile(\n samples: readonly number[],\n percentile: number\n ): number {\n if (samples.length === 0) return 0\n const sorted = [...samples].sort((a, b) => a - b)\n const index = Math.ceil((percentile / 100) * sorted.length) - 1\n return sorted[index] ?? 0\n }\n\n // Method to update latency metrics\n private updateLatencyMetrics(type: 'chat' | 'embed', duration: number): void {\n const metrics = this.metrics.latency[type]\n metrics.samples.push(duration)\n\n // Keep only last 1000 samples to prevent memory issues\n if (metrics.samples.length > 1000) {\n metrics.samples.shift()\n }\n\n // Update statistics\n metrics.mean =\n metrics.samples.reduce((a, b) => a + b, 0) / metrics.samples.length\n metrics.p95 = this.calculatePercentile(metrics.samples, 95)\n metrics.p99 = this.calculatePercentile(metrics.samples, 99)\n }\n\n // Method to update error metrics\n private updateErrorMetrics(type: 'chat' | 'embed', isError: boolean): void {\n const metrics = this.metrics.errors[type]\n metrics.total++\n if (isError) {\n metrics.count++\n }\n metrics.rate = metrics.count / metrics.total\n }\n\n // Public method to get metrics\n public getMetrics(): AxAIServiceMetrics {\n return structuredClone(this.metrics)\n }\n\n async chat(\n req: Readonly<AxChatRequest<TModel>>,\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<TModel, TEmbedModel>\n >\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n const startTime = performance.now()\n let isError = false\n\n try {\n const result = await this._chat1(req, options)\n return result\n } catch (error) {\n isError = true\n throw error\n } finally {\n const duration = performance.now() - startTime\n this.updateLatencyMetrics('chat', duration)\n this.updateErrorMetrics('chat', isError)\n }\n }\n\n private async _chat1(\n req: Readonly<AxChatRequest<TModel>>,\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<TModel, TEmbedModel>\n >\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n const model = req.model\n ? (this.models?.find((v) => v.key === req.model)?.model ?? req.model)\n : this.defaults.model\n\n const modelConfig = {\n ...this.aiImpl.getModelConfig(),\n ...req.modelConfig,\n }\n\n // stream is true by default unless explicitly set to false\n modelConfig.stream =\n (options?.stream !== undefined ? options.stream : modelConfig.stream) ??\n true\n\n const canStream = this.getFeatures(model).streaming\n if (!canStream) {\n modelConfig.stream = false\n }\n\n if (this.tracer) {\n return await this.tracer?.startActiveSpan(\n 'Chat Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.LLM_SYSTEM]: this.name,\n [axSpanAttributes.LLM_REQUEST_MODEL]: model as string,\n [axSpanAttributes.LLM_REQUEST_MAX_TOKENS]: modelConfig.maxTokens,\n [axSpanAttributes.LLM_REQUEST_TEMPERATURE]: modelConfig.temperature,\n [axSpanAttributes.LLM_REQUEST_TOP_P]: modelConfig.topP,\n [axSpanAttributes.LLM_REQUEST_TOP_K]: modelConfig.topK,\n [axSpanAttributes.LLM_REQUEST_FREQUENCY_PENALTY]:\n modelConfig.frequencyPenalty,\n [axSpanAttributes.LLM_REQUEST_PRESENCE_PENALTY]:\n modelConfig.presencePenalty,\n [axSpanAttributes.LLM_REQUEST_STOP_SEQUENCES]:\n modelConfig.stopSequences?.join(', '),\n [axSpanAttributes.LLM_REQUEST_LLM_IS_STREAMING]: modelConfig.stream,\n // [AxSpanAttributes.LLM_PROMPTS]: _req.chatPrompt\n // ?.map((v) => v.content)\n // .join('\\n')\n },\n },\n async (span) => {\n try {\n return await this._chat2(model, modelConfig, req, options, span)\n } finally {\n span.end()\n }\n }\n )\n }\n return await this._chat2(model, modelConfig, req, options)\n }\n\n private cleanupFunctionSchema(\n fn: Readonly<NonNullable<AxChatRequest['functions']>[number]>\n ): NonNullable<AxChatRequest['functions']>[number] {\n const cleanFn = { ...fn }\n if (cleanFn.parameters) {\n const cleanParams = { ...cleanFn.parameters }\n\n // Remove empty required array\n if (\n Array.isArray(cleanParams.required) &&\n cleanParams.required.length === 0\n ) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete cleanParams.required\n }\n\n // Remove empty properties object\n if (\n cleanParams.properties &&\n Object.keys(cleanParams.properties).length === 0\n ) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete cleanParams.properties\n }\n\n // After cleaning, remove the entire parameters object if it's effectively empty\n // i.e., either no keys left or just { type: 'object' } remaining.\n if (\n Object.keys(cleanParams).length === 0 ||\n (Object.keys(cleanParams).length === 1 && cleanParams.type === 'object')\n ) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete cleanFn.parameters\n } else {\n cleanFn.parameters = cleanParams\n }\n }\n return cleanFn\n }\n\n private async _chat2(\n model: TModel,\n modelConfig: Readonly<AxModelConfig>,\n chatReq: Readonly<Omit<AxChatRequest<TModel>, 'modelConfig'>>,\n options?: Readonly<AxAIServiceActionOptions<TModel, TEmbedModel>>,\n span?: Span\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n if (!this.aiImpl.createChatReq) {\n throw new Error('generateChatReq not implemented')\n }\n\n let functions: NonNullable<AxChatRequest['functions']> | undefined\n\n if (chatReq.functions && chatReq.functions.length > 0) {\n functions = chatReq.functions.map((fn) => this.cleanupFunctionSchema(fn))\n }\n\n const req = {\n ...chatReq,\n model,\n functions,\n modelConfig,\n }\n\n const fn = async () => {\n const [apiConfig, reqValue] = this.aiImpl.createChatReq(\n req,\n options as AxAIPromptConfig\n )\n\n const res = await apiCall(\n {\n name: apiConfig.name,\n url: this.apiURL,\n headers: await this.buildHeaders(apiConfig.headers),\n stream: modelConfig.stream,\n debug: this.debug,\n fetch: this.fetch,\n span,\n },\n reqValue\n )\n return res\n }\n\n if (options?.debug ?? this.debug) {\n logChatRequest(req.chatPrompt, options?.debugHideSystemPrompt)\n }\n\n const rt = options?.rateLimiter ?? this.rt\n const rv = rt ? await rt(fn, { modelUsage: this.modelUsage }) : await fn()\n\n if (modelConfig.stream) {\n if (!this.aiImpl.createChatStreamResp) {\n throw new Error('generateChatResp not implemented')\n }\n\n const respFn = this.aiImpl.createChatStreamResp\n const wrappedRespFn =\n (state: object) => (resp: Readonly<TChatResponseDelta>) => {\n const res = respFn(resp, state)\n res.sessionId = options?.sessionId\n\n if (res.modelUsage) {\n this.modelUsage = res.modelUsage\n }\n\n if (span?.isRecording()) {\n setResponseAttr(res, span)\n }\n\n if (options?.debug ?? this.debug) {\n logResponse(res)\n }\n return res\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const doneCb = async (_values: readonly AxChatResponse[]) => {\n if (options?.debug ?? this.debug) {\n process.stdout.write('\\n')\n }\n }\n\n const st = (rv as ReadableStream<TChatResponseDelta>).pipeThrough(\n new RespTransformStream<TChatResponseDelta, AxChatResponse>(\n wrappedRespFn({}),\n doneCb\n )\n )\n return st\n }\n\n if (!this.aiImpl.createChatResp) {\n throw new Error('generateChatResp not implemented')\n }\n const res = this.aiImpl.createChatResp(rv as TChatResponse)\n res.sessionId = options?.sessionId\n\n if (res.modelUsage) {\n this.modelUsage = res.modelUsage\n }\n\n if (span?.isRecording()) {\n setResponseAttr(res, span)\n }\n\n if (options?.debug ?? this.debug) {\n logResponse(res)\n }\n\n span?.end()\n return res\n }\n\n async embed(\n req: Readonly<AxEmbedRequest<TEmbedModel>>,\n options?: Readonly<AxAIServiceActionOptions<TModel, TEmbedModel>>\n ): Promise<AxEmbedResponse> {\n const startTime = performance.now()\n let isError = false\n\n try {\n return this._embed1(req, options)\n } catch (error) {\n isError = true\n throw error\n } finally {\n const duration = performance.now() - startTime\n this.updateLatencyMetrics('embed', duration)\n this.updateErrorMetrics('embed', isError)\n }\n }\n\n private async _embed1(\n req: Readonly<AxEmbedRequest<TEmbedModel>>,\n options?: Readonly<AxAIServiceActionOptions<TModel, TEmbedModel>>\n ): Promise<AxEmbedResponse> {\n const embedModel = req.embedModel ?? this.defaults.embedModel\n\n if (!embedModel) {\n throw new Error('No embed model defined')\n }\n\n if (this.tracer) {\n await this.tracer?.startActiveSpan(\n 'Embed Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.LLM_SYSTEM]: this.name,\n [axSpanAttributes.LLM_REQUEST_MODEL]: embedModel as string,\n },\n },\n async (span) => {\n try {\n return await this._embed2(embedModel, req, options, span)\n } finally {\n span.end()\n }\n }\n )\n }\n return this._embed2(embedModel, req, options)\n }\n\n private async _embed2(\n embedModel: TEmbedModel,\n embedReq: Readonly<AxEmbedRequest<TEmbedModel>>,\n options?: Readonly<AxAIServiceActionOptions<TModel, TEmbedModel>>,\n span?: Span\n ): Promise<AxEmbedResponse> {\n if (!this.aiImpl.createEmbedReq) {\n throw new Error('generateEmbedReq not implemented')\n }\n if (!this.aiImpl.createEmbedResp) {\n throw new Error('generateEmbedResp not implemented')\n }\n\n const req = {\n ...embedReq,\n embedModel,\n }\n\n const fn = async () => {\n const [apiConfig, reqValue] = this.aiImpl.createEmbedReq!(req)\n\n const res = await apiCall(\n {\n name: apiConfig.name,\n url: this.apiURL,\n headers: await this.buildHeaders(apiConfig.headers),\n debug: this.debug,\n fetch: this.fetch,\n span,\n },\n reqValue\n )\n\n return res\n }\n\n const resValue = this.rt\n ? await this.rt(fn, { embedModelUsage: this.embedModelUsage })\n : await fn()\n const res = this.aiImpl.createEmbedResp!(resValue as TEmbedResponse)\n\n res.sessionId = options?.sessionId\n\n if (span?.isRecording()) {\n if (res.modelUsage) {\n this.embedModelUsage = res.modelUsage\n span.setAttributes({\n [axSpanAttributes.LLM_USAGE_COMPLETION_TOKENS]:\n res.modelUsage.completionTokens ?? 0,\n [axSpanAttributes.LLM_USAGE_PROMPT_TOKENS]:\n res.modelUsage.promptTokens,\n })\n }\n }\n\n span?.end()\n return res\n }\n\n private async buildHeaders(\n headers: Record<string, string> = {}\n ): Promise<Record<string, string>> {\n return { ...headers, ...(await this.headers()) }\n }\n}\n\nfunction setResponseAttr(res: Readonly<AxChatResponse>, span: Span) {\n if (res.modelUsage) {\n span.setAttributes({\n [axSpanAttributes.LLM_USAGE_COMPLETION_TOKENS]:\n res.modelUsage.completionTokens ?? 0,\n [axSpanAttributes.LLM_USAGE_PROMPT_TOKENS]: res.modelUsage.promptTokens,\n })\n }\n}\n\nfunction validateModels<TModel>(\n models: Readonly<AxAIInputModelList<TModel>>\n): void {\n // Validate duplicate keys in models.\n const keys = new Set<string>()\n for (const model of models) {\n if (keys.has(model.key)) {\n throw new Error(\n `Duplicate model key detected: \"${model.key}\". Each model key must be unique.`\n )\n }\n keys.add(model.key)\n }\n}\n","export const axSpanAttributes = {\n // LLM\n LLM_SYSTEM: 'gen_ai.system',\n LLM_REQUEST_MODEL: 'gen_ai.request.model',\n LLM_REQUEST_MAX_TOKENS: 'gen_ai.request.max_tokens',\n LLM_REQUEST_TEMPERATURE: 'gen_ai.request.temperature',\n LLM_REQUEST_TOP_K: 'gen_ai.request.top_k',\n LLM_REQUEST_FREQUENCY_PENALTY: 'gen_ai.request.frequency_penalty',\n LLM_REQUEST_PRESENCE_PENALTY: 'gen_ai.request.presence_penalty',\n LLM_REQUEST_STOP_SEQUENCES: 'gen_ai.request.stop_sequences',\n LLM_REQUEST_LLM_IS_STREAMING: 'gen_ai.request.llm_is_streaming',\n LLM_REQUEST_TOP_P: 'gen_ai.request.top_p',\n\n LLM_USAGE_PROMPT_TOKENS: 'gen_ai.usage.prompt_tokens',\n LLM_USAGE_COMPLETION_TOKENS: 'gen_ai.usage.completion_tokens',\n\n // Vector DB\n DB_SYSTEM: 'db.system',\n DB_TABLE: 'db.table',\n DB_NAMESPACE: 'db.namespace',\n DB_ID: 'db.id',\n DB_QUERY_TEXT: 'db.query.text',\n DB_VECTOR: 'db.vector',\n DB_OPERATION_NAME: 'db.operation.name',\n DB_VECTOR_QUERY_TOP_K: 'db.vector.query.top_k',\n\n DB_QUERY_EMBEDDINGS: 'db.query.embeddings',\n DB_QUERY_RESULT: 'db.query.result',\n\n // Query Embeddings\n DB_QUERY_EMBEDDINGS_VECTOR: 'db.query.embeddings.vector',\n\n // Query Result (canonical format)\n DB_QUERY_RESULT_ID: 'db.query.result.id',\n DB_QUERY_RESULT_SCORE: 'db.query.result.score',\n DB_QUERY_RESULT_DISTANCE: 'db.query.result.distance',\n DB_QUERY_RESULT_METADATA: 'db.query.result.metadata',\n DB_QUERY_RESULT_VECTOR: 'db.query.result.vector',\n DB_QUERY_RESULT_DOCUMENT: 'db.query.result.document',\n}\n\nexport const axSpanEvents = {\n LLM_PROMPT: 'gen_ai.prompt',\n}\n\nexport enum AxLLMRequestTypeValues {\n COMPLETION = 'completion',\n CHAT = 'chat',\n RERANK = 'rerank',\n UNKNOWN = 'unknown',\n}\n\nexport enum AxSpanKindValues {\n WORKFLOW = 'workflow',\n TASK = 'task',\n AGENT = 'agent',\n TOOL = 'tool',\n UNKNOWN = 'unknown',\n}\n","import {\n ReadableStream,\n TextDecoderStream as TextDecoderStreamNative,\n TransformStream,\n} from 'stream/web'\n\nimport { type Span } from '@opentelemetry/api'\n\nimport { SSEParser } from './sse.js'\nimport { TextDecoderStreamPolyfill } from './stream.js'\n\n// Configuration Types\nexport interface RetryConfig {\n maxRetries: number\n initialDelayMs: number\n maxDelayMs: number\n backoffFactor: number\n retryableStatusCodes: number[]\n}\n\nexport interface RequestMetrics {\n startTime: number\n retryCount: number\n lastRetryTime?: number\n streamChunks?: number\n lastChunkTime?: number\n streamDuration?: number\n errorTime?: number\n}\n\n// Validation Interfaces\ninterface RequestValidation {\n validateRequest?: (request: unknown) => boolean | Promise<boolean>\n}\n\ninterface ResponseValidation {\n validateResponse?: (response: unknown) => boolean | Promise<boolean>\n}\n\n// API Base Types\nexport interface AxAPI {\n name?: string\n headers?: Record<string, string>\n put?: boolean\n}\n\n// Enhanced API Configuration\nexport interface AxAPIConfig\n extends AxAPI,\n RequestValidation,\n ResponseValidation {\n url: string | URL\n stream?: boolean\n debug?: boolean\n fetch?: typeof fetch\n span?: Span\n timeout?: number\n retry?: Partial<RetryConfig>\n}\n\n// Default Configurations\nexport const defaultRetryConfig: RetryConfig = {\n maxRetries: 3,\n initialDelayMs: 1000,\n maxDelayMs: 60000,\n backoffFactor: 2,\n retryableStatusCodes: [500, 408, 429, 502, 503, 504],\n}\n\nconst defaultTimeoutMs = 30000\nconst textDecoderStream = TextDecoderStreamNative ?? TextDecoderStreamPolyfill\n\n// Error Classes\nexport class AxAIServiceError extends Error {\n public readonly timestamp: string\n public readonly errorId: string\n public readonly context: Record<string, unknown>\n\n constructor(\n message: string,\n public readonly url: string,\n public readonly requestBody?: unknown,\n context: Record<string, unknown> = {}\n ) {\n super(message)\n this.name = this.constructor.name\n this.timestamp = new Date().toISOString()\n this.errorId = crypto.randomUUID()\n this.context = context\n\n this.stack = this.toString()\n }\n\n override toString(): string {\n return [\n `${this.name}: ${this.message}`,\n `URL: ${this.url}`,\n `Request Body: ${JSON.stringify(this.requestBody, null, 2)}`,\n `Context: ${JSON.stringify(this.context, null, 2)}`,\n `Timestamp: ${this.timestamp}`,\n `Error ID: ${this.errorId}`,\n ].join('\\n')\n }\n\n // For Node.js, override the custom inspect method so console.log shows our custom string.\n [Symbol.for('nodejs.util.inspect.custom')](\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _depth: number,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options: Record<string, unknown>\n ) {\n return this.toString()\n }\n}\n\nexport class AxAIServiceStatusError extends AxAIServiceError {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n url: string,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super(`HTTP ${status} - ${statusText}`, url, requestBody, {\n httpStatus: status,\n httpStatusText: statusText,\n ...context,\n })\n this.name = this.constructor.name\n }\n}\n\nexport class AxAIServiceNetworkError extends AxAIServiceError {\n constructor(\n public readonly originalError: Error,\n url: string,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super(`Network Error: ${originalError.message}`, url, requestBody, {\n originalErrorName: originalError.name,\n originalErrorStack: originalError.stack,\n ...context,\n })\n this.name = this.constructor.name\n this.stack = originalError.stack\n }\n}\n\nexport class AxAIServiceResponseError extends AxAIServiceError {\n constructor(\n message: string,\n url: string,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super(message, url, requestBody, context)\n this.name = this.constructor.name\n }\n}\n\nexport class AxAIServiceStreamTerminatedError extends AxAIServiceError {\n constructor(\n url: string,\n requestBody?: unknown,\n public readonly lastChunk?: unknown,\n context?: Record<string, unknown>\n ) {\n super('Stream terminated unexpectedly by remote host', url, requestBody, {\n lastChunk,\n ...context,\n })\n this.name = this.constructor.name\n }\n}\n\nexport class AxAIServiceTimeoutError extends AxAIServiceError {\n constructor(\n url: string,\n timeoutMs: number,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super(`Request timeout after ${timeoutMs}ms`, url, requestBody, {\n timeoutMs,\n ...context,\n })\n this.name = this.constructor.name\n }\n}\n\nexport class AxAIServiceAuthenticationError extends AxAIServiceError {\n constructor(\n url: string,\n requestBody?: unknown,\n context?: Record<string, unknown>\n ) {\n super('Authentication failed', url, requestBody, context)\n this.name = this.constructor.name\n }\n}\n\n// Utility Functions\nfunction calculateRetryDelay(\n attempt: number,\n config: Readonly<RetryConfig>\n): number {\n const delay = Math.min(\n config.maxDelayMs,\n config.initialDelayMs * Math.pow(config.backoffFactor, attempt)\n )\n return delay * (0.75 + Math.random() * 0.5)\n}\n\nfunction createRequestMetrics(): RequestMetrics {\n return {\n startTime: Date.now(),\n retryCount: 0,\n }\n}\n\n// eslint-disable-next-line functional/prefer-immutable-types\nfunction updateRetryMetrics(metrics: RequestMetrics): void {\n metrics.retryCount++\n metrics.lastRetryTime = Date.now()\n}\n\nfunction shouldRetry(\n error: Error,\n status: number | undefined,\n attempt: number,\n config: Readonly<RetryConfig>\n): boolean {\n if (attempt >= config.maxRetries) return false\n if (status && config.retryableStatusCodes.includes(status)) return true\n\n return (\n error instanceof AxAIServiceNetworkError &&\n !(error instanceof AxAIServiceAuthenticationError)\n )\n}\n\n// Enhanced API Call Function\nexport const apiCall = async <TRequest = unknown, TResponse = unknown>(\n api: Readonly<AxAPIConfig>,\n json: TRequest\n): Promise<TResponse | ReadableStream<TResponse>> => {\n const retryConfig: RetryConfig = { ...defaultRetryConfig, ...api.retry }\n const timeoutMs = api.timeout ?? defaultTimeoutMs\n const metrics = createRequestMetrics()\n let timeoutId: NodeJS.Timeout\n\n const baseUrl = new URL(process.env['PROXY'] ?? api.url)\n const apiPath = `${[baseUrl.pathname, api.name]\n .filter(Boolean)\n .join('/')\n .replace(/\\/+/g, '/')}${baseUrl.search}`\n const apiUrl = new URL(apiPath, baseUrl)\n\n const requestId = crypto.randomUUID()\n\n // Validate request if validator is provided\n if (api.validateRequest) {\n const isValid = await api.validateRequest(json)\n if (!isValid) {\n throw new AxAIServiceResponseError(\n 'Invalid request data',\n apiUrl.href,\n json,\n { validation: 'request' }\n )\n }\n }\n\n // Set up telemetry\n if (api.span?.isRecording()) {\n api.span.setAttributes({\n 'http.request.method': api.put ? 'PUT' : 'POST',\n 'url.full': apiUrl.href,\n 'request.id': requestId,\n 'request.startTime': metrics.startTime,\n })\n }\n\n let attempt = 0\n\n while (true) {\n const controller = new AbortController()\n\n timeoutId = setTimeout(() => {\n controller.abort('Request timeout')\n }, timeoutMs)\n\n try {\n // Set up timeout with proper cleanup\n\n const res = await (api.fetch ?? fetch)(apiUrl, {\n method: api.put ? 'PUT' : 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Request-ID': requestId,\n 'X-Retry-Count': attempt.toString(),\n ...api.headers,\n },\n body: JSON.stringify(json),\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Handle authentication errors\n if (res.status === 401 || res.status === 403) {\n throw new AxAIServiceAuthenticationError(apiUrl.href, json, { metrics })\n }\n\n // Handle retryable status codes\n if (\n res.status >= 400 &&\n shouldRetry(new Error(), res.status, attempt, retryConfig)\n ) {\n const delay = calculateRetryDelay(attempt, retryConfig)\n attempt++\n updateRetryMetrics(metrics)\n\n if (api.span?.isRecording()) {\n api.span.addEvent('retry', {\n attempt,\n delay,\n status: res.status,\n 'metrics.startTime': metrics.startTime,\n 'metrics.retryCount': metrics.retryCount,\n 'metrics.lastRetryTime': metrics.lastRetryTime,\n })\n }\n\n await new Promise((resolve) => setTimeout(resolve, delay))\n continue\n }\n\n if (res.status >= 400) {\n throw new AxAIServiceStatusError(\n res.status,\n res.statusText,\n apiUrl.href,\n json,\n { metrics }\n )\n }\n\n // Handle non-streaming response\n if (!api.stream) {\n const resJson = await res.json()\n\n // Validate response if validator is provided\n if (api.validateResponse) {\n const isValid = await api.validateResponse(resJson)\n if (!isValid) {\n throw new AxAIServiceResponseError(\n 'Invalid response data',\n apiUrl.href,\n json,\n { validation: 'response' }\n )\n }\n }\n\n if (api.span?.isRecording()) {\n api.span.setAttributes({\n 'response.time': Date.now() - metrics.startTime,\n 'response.retries': metrics.retryCount,\n })\n }\n\n return resJson as TResponse\n }\n\n // Handle streaming response\n if (!res.body) {\n throw new AxAIServiceResponseError(\n 'Response body is null',\n apiUrl.href,\n json,\n { metrics }\n )\n }\n\n let lastChunk: TResponse | undefined\n let chunkCount = 0\n\n // Enhanced tracking stream\n const trackingStream = new TransformStream<TResponse, TResponse>({\n transform(chunk, controller) {\n lastChunk = chunk\n chunkCount++\n metrics.streamChunks = chunkCount\n metrics.lastChunkTime = Date.now()\n controller.enqueue(chunk)\n },\n flush() {\n if (api.span?.isRecording()) {\n api.span.setAttributes({\n 'stream.chunks': chunkCount,\n 'stream.duration': Date.now() - metrics.startTime,\n 'response.retries': metrics.retryCount,\n })\n }\n },\n })\n\n // Flag to track if the controller is closed.\n let closed = false\n\n // Enhanced wrapped stream\n return new ReadableStream<TResponse>({\n start(controller) {\n const reader = res\n .body!.pipeThrough(new textDecoderStream())\n .pipeThrough(new SSEParser<TResponse>())\n .pipeThrough(trackingStream)\n .getReader()\n\n async function read() {\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n if (!closed) {\n closed = true\n controller.close()\n }\n break\n }\n\n // Check if the controller is already closed before enqueuing.\n if (closed) break\n controller.enqueue(value)\n }\n } catch (e) {\n const error = e as Error\n const streamMetrics = {\n ...metrics,\n streamDuration: Date.now() - metrics.startTime,\n }\n\n if (\n error.name === 'AbortError' ||\n error.message?.includes('aborted')\n ) {\n controller.error(\n new AxAIServiceStreamTerminatedError(\n apiUrl.href,\n json,\n lastChunk,\n { streamMetrics }\n )\n )\n } else if (\n error instanceof TypeError &&\n error.message.includes('cancelled')\n ) {\n controller.error(\n new AxAIServiceStreamTerminatedError(\n apiUrl.href,\n json,\n lastChunk,\n {\n streamMetrics,\n cancelReason: 'Stream cancelled by client',\n }\n )\n )\n } else {\n controller.error(\n new AxAIServiceNetworkError(error, apiUrl.href, json, {\n streamMetrics,\n })\n )\n }\n throw error\n } finally {\n clearTimeout(timeoutId)\n reader.releaseLock()\n if (api.span?.isRecording()) {\n api.span.end()\n }\n }\n }\n\n read()\n },\n // When the consumer cancels the stream, set our flag to stop processing further.\n cancel() {\n closed = true\n },\n })\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new AxAIServiceTimeoutError(apiUrl.href, timeoutMs, json, {\n metrics,\n })\n }\n\n if (api.span?.isRecording()) {\n api.span.recordException(error as Error)\n api.span.setAttributes({\n 'error.time': Date.now() - metrics.startTime,\n 'error.retries': metrics.retryCount,\n })\n }\n\n // Handle retryable network errors\n if (\n error instanceof AxAIServiceNetworkError &&\n shouldRetry(error, undefined, attempt, retryConfig)\n ) {\n const delay = calculateRetryDelay(attempt, retryConfig)\n attempt++\n updateRetryMetrics(metrics)\n\n if (api.span?.isRecording()) {\n api.span.addEvent('retry', {\n attempt,\n delay,\n error: error.message,\n 'metrics.startTime': metrics.startTime,\n 'metrics.retryCount': metrics.retryCount,\n 'metrics.lastRetryTime': metrics.lastRetryTime,\n })\n }\n\n await new Promise((resolve) => setTimeout(resolve, delay))\n continue\n }\n\n if (error instanceof AxAIServiceError) {\n error.context['metrics'] = metrics\n }\n\n throw error\n } finally {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId)\n }\n\n if (api.span?.isRecording()) {\n api.span.end()\n }\n }\n }\n}\n\nexport function createApiConfig(\n config: Readonly<Partial<AxAPIConfig>>\n): AxAPIConfig {\n return {\n timeout: defaultTimeoutMs,\n retry: defaultRetryConfig,\n ...config,\n url: config.url!, // URL is required\n }\n}\n","import { TransformStream, TransformStreamDefaultController } from 'stream/web'\n\ninterface CurrentEventState {\n event?: string\n rawData: string\n id?: string\n retry?: number\n}\n\ninterface SSEParserOptions<T> {\n dataParser?: (data: string) => T\n onError?: (error: Error, rawData: string) => void\n}\n\nexport class SSEParser<T = unknown> extends TransformStream<string, T> {\n private buffer: string = ''\n private currentEvent: CurrentEventState = { rawData: '' }\n private dataParser: (data: string) => T\n private onError: (error: Error, rawData: string) => void\n\n constructor(options: SSEParserOptions<T> = {}) {\n super({\n transform: (chunk, controller) => this.handleChunk(chunk, controller),\n flush: (controller) => this.handleFlush(controller),\n })\n\n this.dataParser = options.dataParser || JSON.parse\n this.onError =\n options.onError ||\n ((error, rawData) => {\n console.warn('Failed to parse event data:', error)\n console.log('Raw data that failed to parse:', rawData)\n })\n }\n\n private handleChunk(\n chunk: string,\n controller: TransformStreamDefaultController<T>\n ): void {\n this.buffer += chunk\n this.processBuffer(controller)\n }\n\n private handleFlush(controller: TransformStreamDefaultController<T>): void {\n this.processBuffer(controller)\n if (this.currentEvent.rawData) {\n this.processEvent(controller)\n }\n }\n\n private processBuffer(controller: TransformStreamDefaultController<T>): void {\n // Normalize newlines to \\n\n const normalizedBuffer = this.buffer.replace(/\\r\\n|\\r/g, '\\n')\n const lines = normalizedBuffer.split('\\n')\n this.buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (line === '') {\n this.processEvent(controller)\n } else {\n this.parseLine(line)\n }\n }\n }\n\n private parseLine(line: string): void {\n if (line.startsWith(':')) {\n return // Ignore comment lines\n }\n\n const colonIndex = line.indexOf(':')\n if (colonIndex === -1) {\n this.currentEvent.rawData +=\n (this.currentEvent.rawData && !this.currentEvent.rawData.endsWith('\\n')\n ? '\\n'\n : '') + line.trim()\n return\n }\n\n const field = line.slice(0, colonIndex).trim()\n const value = line.slice(colonIndex + 1).trim()\n\n switch (field) {\n case 'event':\n this.currentEvent.event = value\n break\n case 'data':\n this.currentEvent.rawData +=\n (this.currentEvent.rawData &&\n !this.currentEvent.rawData.endsWith('\\n')\n ? '\\n'\n : '') + value\n break\n case 'id':\n this.currentEvent.id = value\n break\n case 'retry': {\n const retryValue = parseInt(value, 10)\n if (!isNaN(retryValue)) {\n this.currentEvent.retry = retryValue\n }\n break\n }\n }\n }\n\n private processEvent(controller: TransformStreamDefaultController<T>): void {\n if (this.currentEvent.rawData) {\n if (!this.currentEvent.event) {\n this.currentEvent.event = 'message'\n }\n\n if (this.currentEvent.rawData.trim() === '[DONE]') {\n // maybe we want to emit [DONE] to signal the end of the stream\n // controller.enqueue('[DONE]' as any)\n // Reset the current event\n this.currentEvent = { rawData: '' }\n return\n }\n\n try {\n const parsedData: T = this.dataParser(this.currentEvent.rawData)\n controller.enqueue(parsedData)\n } catch (e) {\n this.onError(e as Error, this.currentEvent.rawData)\n }\n\n this.currentEvent = { rawData: '' }\n }\n }\n}\n","import {\n type Transformer,\n TransformStream,\n type TransformStreamDefaultController,\n} from 'stream/web'\n\nexport interface TextDecoderCommon {\n readonly encoding: string\n readonly fatal: boolean\n readonly ignoreBOM: boolean\n}\n\nclass TextDecodeTransformer\n implements Transformer<ArrayBuffer | Uint8Array, string>\n{\n private decoder\n\n constructor() {\n this.decoder = new TextDecoder()\n }\n\n transform(\n chunk: ArrayBuffer | Uint8Array,\n controller: TransformStreamDefaultController<string>\n ) {\n if (!(chunk instanceof ArrayBuffer || ArrayBuffer.isView(chunk))) {\n throw new TypeError('Input data must be a BufferSource')\n }\n const text = this.decoder.decode(chunk, { stream: true })\n if (text.length !== 0) {\n controller.enqueue(text)\n }\n }\n\n flush(controller: TransformStreamDefaultController<string>) {\n const text = this.decoder.decode()\n if (text.length !== 0) {\n controller.enqueue(text)\n }\n }\n}\n\nexport class TextDecoderStreamPolyfill extends TransformStream<\n ArrayBuffer | Uint8Array,\n string\n> {\n constructor() {\n super(new TextDecodeTransformer())\n }\n}\n","import {\n type Transformer,\n TransformStream,\n type TransformStreamDefaultController,\n} from 'stream/web'\n\nclass TypeTransformer<I, O> implements Transformer<I, O> {\n private buffer?: O[]\n private doneCallback?: (args0: readonly O[]) => Promise<void>\n private transformFn: (arg0: I) => O\n\n constructor(\n transformFn: (arg0: I) => O,\n doneCallback?: (args0: readonly O[]) => Promise<void>\n ) {\n this.transformFn = transformFn\n this.doneCallback = doneCallback\n this.buffer = doneCallback ? [] : undefined\n }\n\n async transform(obj: I, controller: TransformStreamDefaultController<O>) {\n const val = this.transformFn(obj)\n if (val) {\n controller.enqueue(val)\n this.buffer?.push(val)\n }\n }\n\n async flush(controller: TransformStreamDefaultController<O>) {\n await this.doneCallback?.(this.buffer ?? [])\n controller.terminate()\n }\n}\n\nexport class RespTransformStream<I, O> extends TransformStream<I, O> {\n constructor(\n transformFn: (arg0: I) => O,\n doneCallback?: (args0: readonly O[]) => Promise<void>\n ) {\n super(new TypeTransformer<I, O>(transformFn, doneCallback))\n }\n}\n","export class ColorLog {\n // ANSI escape codes for different colors\n private readonly ANSI_WHITE_BRIGHT = '\\x1b[97m'\n private readonly ANSI_GREEN_BRIGHT = '\\x1b[92m'\n private readonly ANSI_BLUE_BRIGHT = '\\x1b[94m'\n private readonly ANSI_YELLOW = '\\x1b[93m'\n private readonly ANSI_RED = '\\x1b[91m'\n private readonly ANSI_RESET = '\\x1b[0m'\n\n // Method to wrap text with the specified ANSI color code\n private colorize(text: string, colorCode: string): string {\n return `${colorCode}${text}${this.ANSI_RESET}`\n }\n\n // Public methods to colorize text in various colors\n public whiteBright(text: string): string {\n return this.colorize(text, this.ANSI_WHITE_BRIGHT)\n }\n\n public greenBright(text: string): string {\n return this.colorize(text, this.ANSI_GREEN_BRIGHT)\n }\n\n public blueBright(text: string): string {\n return this.colorize(text, this.ANSI_BLUE_BRIGHT)\n }\n\n public yellow(text: string): string {\n return this.colorize(text, this.ANSI_YELLOW)\n }\n\n public red(text: string): string {\n return this.colorize(text, this.ANSI_RED)\n }\n}\n","import { ColorLog } from '../util/log.js'\n\nimport type { AxChatRequest, AxChatResponse } from './types.js'\n\nconst colorLog = new ColorLog()\n\nconst formatChatMessage = (\n msg: AxChatRequest['chatPrompt'][number],\n hideContent?: boolean,\n hideSystemPrompt?: boolean\n) => {\n switch (msg.role) {\n case 'system':\n if (hideSystemPrompt) {\n return ''\n }\n return `\\n${colorLog.blueBright('System:')}\\n${colorLog.whiteBright(msg.content)}`\n case 'function':\n return `\\n${colorLog.blueBright('Function Result:')}\\n${colorLog.whiteBright(msg.result)}`\n case 'user': {\n if (typeof msg.content === 'string') {\n return `\\n${colorLog.blueBright('User:')}\\n${colorLog.whiteBright(msg.content)}`\n }\n const items = msg.content.map((v) => {\n switch (v.type) {\n case 'text':\n return `${colorLog.whiteBright(v.text)}`\n case 'image':\n return `(Image, ${v.mimeType}) ${colorLog.whiteBright(v.image.substring(0, 10))}`\n default:\n throw new Error('Invalid content type')\n }\n })\n return `\\n${colorLog.blueBright('User:')}\\n${items.join('\\n')}`\n }\n case 'assistant': {\n if (msg.functionCalls) {\n const fns = msg.functionCalls?.map(({ function: fn }) => {\n const args =\n typeof fn.params !== 'string'\n ? JSON.stringify(fn.params, null, 2)\n : fn.params\n return `${fn.name}(${args})`\n })\n return `\\n${colorLog.blueBright('\\nFunctions:')}\\n${colorLog.whiteBright(fns.join('\\n'))}`\n }\n return `\\n${colorLog.blueBright('\\nAssistant:')}\\n${hideContent ? '' : colorLog.whiteBright(msg.content ?? '<empty>')}`\n }\n default:\n throw new Error('Invalid role')\n }\n}\n\nexport const logChatRequestMessage = (\n msg: AxChatRequest['chatPrompt'][number],\n hideSystemPrompt?: boolean\n) => {\n process.stdout.write(`${formatChatMessage(msg, hideSystemPrompt)}\\n`)\n process.stdout.write(colorLog.blueBright('\\nAssistant:\\n'))\n}\n\nexport const logChatRequest = (\n chatPrompt: Readonly<AxChatRequest['chatPrompt']>,\n hideSystemPrompt?: boolean\n) => {\n const items = chatPrompt?.map((msg) =>\n formatChatMessage(msg, hideSystemPrompt)\n )\n\n if (items) {\n process.stdout.write(items.join('\\n'))\n process.stdout.write(colorLog.blueBright('\\nAssistant:\\n'))\n }\n}\n\nexport const logResponseResult = (\n r: Readonly<AxChatResponse['results'][number]>\n) => {\n if (r.content) {\n process.stdout.write(colorLog.greenBright(r.content))\n }\n if (r.functionCalls) {\n for (const [i, f] of r.functionCalls.entries()) {\n if (f.function.name) {\n if (i > 0) {\n process.stdout.write('\\n')\n }\n process.stdout.write(\n `Function ${i + 1} -> ${colorLog.greenBright(f.function.name)}`\n )\n }\n if (f.function.params) {\n const params =\n typeof f.function.params === 'string'\n ? f.function.params\n : JSON.stringify(f.function.params, null, 2)\n process.stdout.write(`${colorLog.greenBright(params)}`)\n }\n }\n }\n}\n\nexport const logResponse = (resp: Readonly<AxChatResponse>) => {\n if (!resp.results) {\n return\n }\n for (const r of resp.results) {\n logResponseResult(r)\n }\n}\n\nexport const logResponseDelta = (delta: string) => {\n process.stdout.write(colorLog.greenBright(delta))\n}\n","import { GoogleAuth } from 'google-auth-library'\nimport type {\n GoogleAuthOptions,\n JSONClient,\n} from 'google-auth-library/build/src/auth/googleauth.js'\n\n/**\n * This class is used to authenticate with the Google Vertex AI API.\n */\nexport class GoogleVertexAuth {\n private auth: GoogleAuth\n private client?: JSONClient\n\n constructor(config: GoogleAuthOptions = {}) {\n this.auth = new GoogleAuth({\n scopes: ['https://www.googleapis.com/auth/cloud-platform'],\n ...config,\n })\n }\n\n async getAuthenticatedClient() {\n if (!this.client) {\n this.client = (await this.auth.getClient()) as JSONClient\n }\n return this.client\n }\n\n async getAccessToken() {\n const client = await this.getAuthenticatedClient()\n const response = await client.getAccessToken()\n if (!response.token) {\n throw new Error('Failed to obtain access token')\n }\n return response.token\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIAnthropicModel {\n Claude37Sonnet = 'claude-3-7-sonnet-latest',\n\n Claude35Sonnet = 'claude-3-5-sonnet-latest',\n Claude35Haiku = 'claude-3-5-haiku-latest',\n\n Claude3Opus = 'claude-3-opus-latest',\n Claude3Sonnet = 'claude-3-sonnet-20240229',\n Claude3Haiku = 'claude-3-haiku-20240307',\n\n Claude21 = 'claude-2.1',\n ClaudeInstant12 = 'claude-instant-1.2',\n}\n\nexport enum AxAIAnthropicVertexModel {\n Claude37Sonnet = 'claude-3-7-sonnet',\n Claude35Haiku = 'claude-3-5-haiku',\n Claude35Sonnet = 'claude-3-5-sonnet',\n Claude35SonnetV2 = 'claude-3-5-sonnet-v2',\n Claude3Haiku = 'claude-3-haiku',\n Claude3Opus = 'claude-3-opus',\n}\n\nexport type AxAIAnthropicConfig = AxModelConfig & {\n model: AxAIAnthropicModel | AxAIAnthropicVertexModel\n}\n\nexport type AxAIAnthropicChatRequestCacheParam = {\n cache_control?: { type: 'ephemeral' }\n}\n\n// Type for the request to create a message using Anthropic's Messages API\nexport type AxAIAnthropicChatRequest = {\n model?: string\n anthropic_version?: string\n messages: (\n | {\n role: 'user'\n content:\n | string\n | (\n | ({\n type: 'text'\n text: string\n } & AxAIAnthropicChatRequestCacheParam)\n | ({\n type: 'image'\n source: { type: 'base64'; media_type: string; data: string }\n } & AxAIAnthropicChatRequestCacheParam)\n | {\n type: 'tool_result'\n is_error?: boolean\n tool_use_id: string\n content:\n | string\n | (\n | ({\n type: 'text'\n text: string\n } & AxAIAnthropicChatRequestCacheParam)\n | ({\n type: 'image'\n source: {\n type: 'base64'\n media_type: string\n data: string\n }\n } & AxAIAnthropicChatRequestCacheParam)\n )[]\n }\n )[]\n }\n | {\n role: 'assistant'\n content:\n | string\n | (\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: object }\n )[]\n }\n )[]\n tools?: ({\n name: string\n description: string\n input_schema?: object\n } & AxAIAnthropicChatRequestCacheParam)[]\n tool_choice?: { type: 'auto' | 'any' } | { type: 'tool'; name?: string }\n max_tokens?: number // Maximum number of tokens to generate\n // Optional metadata about the request\n stop_sequences?: string[] // Custom sequences that trigger the end of generation\n stream?: boolean // Whether to stream the response incrementally\n system?:\n | string\n | ({\n type: 'text'\n text: string\n } & AxAIAnthropicChatRequestCacheParam)[] // system prompt\n temperature?: number // Randomness of the response\n top_p?: number // Nucleus sampling probability\n top_k?: number // Sample from the top K options\n metadata?: {\n user_id: string\n }\n}\n\nexport type AxAIAnthropicChatResponse = {\n id: string // Unique identifier for the response\n type: 'message' // Object type, always 'message' for this API\n role: 'assistant' // Conversational role of the generated message, always 'assistant'\n content: (\n | {\n type: 'text'\n text: string\n }\n | {\n id: string\n name: string\n type: 'tool_use'\n input?: string\n }\n )[]\n model: string\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use'\n stop_sequence?: string\n usage: {\n input_tokens: number\n output_tokens: number\n }\n}\n\nexport type AxAIAnthropicChatError = {\n type: 'error'\n error: {\n type: 'authentication_error'\n message: string\n }\n}\n\n// Represents the start of a message with an empty content array\nexport interface AxAIAnthropicMessageStartEvent {\n type: 'message_start'\n message: {\n id: string\n type: 'message'\n role: 'assistant'\n content: []\n model: string\n stop_reason: null | string\n stop_sequence: null | string\n usage: {\n input_tokens: number\n output_tokens: number\n }\n }\n}\n\n// Indicates the start of a content block within a message\nexport interface AxAIAnthropicContentBlockStartEvent {\n index: number\n type: 'content_block_start'\n content_block:\n | {\n type: 'text'\n text: string\n }\n | {\n type: 'tool_use'\n id: string\n name: string\n input: object\n }\n}\n\n// Represents incremental updates to a content block\nexport interface AxAIAnthropicContentBlockDeltaEvent {\n index: number\n type: 'content_block_delta'\n delta:\n | {\n type: 'text_delta'\n text: string\n }\n | {\n type: 'input_json_delta'\n partial_json: string\n }\n}\n\n// Marks the end of a content block within a message\nexport interface AxAIAnthropicContentBlockStopEvent {\n type: 'content_block_stop'\n index: number\n}\n\n// Indicates top-level changes to the final message object\nexport interface AxAIAnthropicMessageDeltaEvent {\n type: 'message_delta'\n delta: {\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence' | null\n stop_sequence: string | null\n }\n usage: {\n output_tokens: number\n }\n}\n\n// Marks the end of a message\nexport interface AxAIAnthropicMessageStopEvent {\n type: 'message_stop'\n}\n\n// Represents a ping event, which can occur any number of times\nexport interface AxAIAnthropicPingEvent {\n type: 'ping'\n}\n\n// Represents an error event\nexport interface AxAIAnthropicErrorEvent {\n type: 'error'\n error: {\n type: 'overloaded_error'\n message: string\n }\n}\n\n// Union type for all possible event types in the stream\nexport type AxAIAnthropicChatResponseDelta =\n | AxAIAnthropicMessageStartEvent\n | AxAIAnthropicContentBlockStartEvent\n | AxAIAnthropicContentBlockDeltaEvent\n | AxAIAnthropicContentBlockStopEvent\n | AxAIAnthropicMessageDeltaEvent\n | AxAIAnthropicMessageStopEvent\n | AxAIAnthropicPingEvent\n | AxAIAnthropicErrorEvent\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIAnthropicModel } from './types.js'\n\nexport const axModelInfoAnthropic: AxModelInfo[] = [\n // 35\n {\n name: AxAIAnthropicModel.Claude35Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n },\n {\n name: AxAIAnthropicModel.Claude35Haiku,\n currency: 'usd',\n promptTokenCostPer1M: 0.8,\n completionTokenCostPer1M: 4.0,\n },\n // 3\n {\n name: AxAIAnthropicModel.Claude3Opus,\n currency: 'usd',\n promptTokenCostPer1M: 15.0,\n completionTokenCostPer1M: 75.0,\n },\n {\n name: AxAIAnthropicModel.Claude3Sonnet,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15.0,\n },\n {\n name: AxAIAnthropicModel.Claude3Haiku,\n currency: 'usd',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 1.25,\n },\n // 21\n {\n name: AxAIAnthropicModel.Claude21,\n currency: 'usd',\n promptTokenCostPer1M: 8.0,\n completionTokenCostPer1M: 25,\n },\n {\n name: AxAIAnthropicModel.ClaudeInstant12,\n currency: 'usd',\n promptTokenCostPer1M: 0.8,\n completionTokenCostPer1M: 2.24,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport { AxBaseAI, axBaseAIDefaultConfig } from '../base.js'\nimport { GoogleVertexAuth } from '../google-vertex/auth.js'\nimport type {\n AxAIInputModelList,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxInternalChatRequest,\n AxModelConfig,\n} from '../types.js'\n\nimport { axModelInfoAnthropic } from './info.js'\nimport {\n type AxAIAnthropicChatError,\n type AxAIAnthropicChatRequest,\n type AxAIAnthropicChatResponse,\n type AxAIAnthropicChatResponseDelta,\n type AxAIAnthropicConfig,\n type AxAIAnthropicContentBlockDeltaEvent,\n type AxAIAnthropicContentBlockStartEvent,\n type AxAIAnthropicErrorEvent,\n type AxAIAnthropicMessageDeltaEvent,\n type AxAIAnthropicMessageStartEvent,\n AxAIAnthropicModel,\n AxAIAnthropicVertexModel,\n} from './types.js'\n\nexport const axAIAnthropicDefaultConfig = (): AxAIAnthropicConfig =>\n structuredClone({\n model: AxAIAnthropicModel.Claude35Sonnet,\n ...axBaseAIDefaultConfig(),\n })\n\nexport interface AxAIAnthropicArgs {\n name: 'anthropic'\n apiKey?: string\n projectId?: string\n region?: string\n config?: Readonly<Partial<AxAIAnthropicConfig>>\n options?: Readonly<AxAIServiceOptions>\n models?: AxAIInputModelList<AxAIAnthropicModel | AxAIAnthropicVertexModel>\n}\n\nclass AxAIAnthropicImpl\n implements\n AxAIServiceImpl<\n AxAIAnthropicModel | AxAIAnthropicVertexModel,\n unknown,\n AxAIAnthropicChatRequest,\n unknown,\n AxAIAnthropicChatResponse,\n AxAIAnthropicChatResponseDelta,\n unknown\n >\n{\n constructor(\n private config: AxAIAnthropicConfig,\n private isVertex: boolean\n ) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n topK: config.topK,\n stream: config.stream,\n stopSequences: config.stopSequences,\n endSequences: config.endSequences,\n presencePenalty: config.presencePenalty,\n frequencyPenalty: config.frequencyPenalty,\n n: config.n,\n } as AxModelConfig\n }\n\n createChatReq = (\n req: Readonly<\n AxInternalChatRequest<AxAIAnthropicModel | AxAIAnthropicVertexModel>\n >\n ): [AxAPI, AxAIAnthropicChatRequest] => {\n const model = req.model\n const stream = req.modelConfig?.stream ?? this.config.stream\n\n let apiConfig\n if (this.isVertex) {\n apiConfig = {\n name: stream\n ? `/models/${model}:streamRawPredict?alt=sse`\n : `/models/${model}:rawPredict`,\n }\n } else {\n apiConfig = {\n name: '/messages',\n }\n }\n\n let toolsChoice\n\n if (req.functionCall && req.functions && req.functions.length > 0) {\n if (typeof req.functionCall === 'string') {\n switch (req.functionCall) {\n case 'auto':\n toolsChoice = { tool_choice: { type: 'auto' as const } }\n break\n case 'required':\n toolsChoice = { tool_choice: { type: 'any' as const } }\n break\n case 'none':\n throw new Error('functionCall none not supported')\n }\n } else if ('function' in req.functionCall) {\n toolsChoice = {\n tool_choice: {\n type: 'tool' as const,\n name: req.functionCall.function.name,\n },\n }\n } else {\n throw new Error('Invalid function call type, must be string or object')\n }\n }\n\n const system = req.chatPrompt\n .filter((msg) => msg.role === 'system')\n .map((msg) => ({\n type: 'text' as const,\n text: msg.content,\n ...(msg.cache ? { cache: { type: 'ephemeral' } } : {}),\n }))\n\n const otherMessages = req.chatPrompt.filter((msg) => msg.role !== 'system')\n\n const messages = createMessages(otherMessages)\n\n const tools: AxAIAnthropicChatRequest['tools'] = req.functions?.map(\n (v) => ({\n name: v.name,\n description: v.description,\n input_schema: v.parameters,\n })\n )\n\n const reqValue: AxAIAnthropicChatRequest = {\n ...(this.isVertex\n ? { anthropic_version: 'vertex-2023-10-16' }\n : { model }),\n max_tokens: req.modelConfig?.maxTokens ?? this.config.maxTokens,\n stop_sequences:\n req.modelConfig?.stopSequences ?? this.config.stopSequences,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n top_p: req.modelConfig?.topP ?? this.config.topP,\n top_k: req.modelConfig?.topK ?? this.config.topK,\n ...toolsChoice,\n ...(tools && tools.length > 0 ? { tools } : {}),\n ...(stream ? { stream: true } : {}),\n ...(system ? { system } : {}),\n messages,\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (\n resp: Readonly<AxAIAnthropicChatResponse | AxAIAnthropicChatError>\n ): AxChatResponse => {\n if (resp.type === 'error') {\n throw new Error(`Anthropic Chat API Error: ${resp.error.message}`)\n }\n\n const finishReason = mapFinishReason(resp.stop_reason)\n\n const results = resp.content.map((msg): AxChatResponseResult => {\n if (msg.type === 'tool_use') {\n return {\n id: msg.id,\n functionCalls: [\n {\n id: msg.id,\n type: 'function' as const,\n function: {\n name: msg.name,\n params: msg.input,\n },\n },\n ],\n finishReason,\n }\n }\n return {\n content: msg.type === 'text' ? msg.text : '',\n id: resp.id,\n finishReason,\n }\n })\n\n const modelUsage = {\n promptTokens: resp.usage.input_tokens,\n completionTokens: resp.usage.output_tokens,\n totalTokens: resp.usage.input_tokens + resp.usage.output_tokens,\n }\n\n return {\n results,\n modelUsage,\n remoteId: resp.id,\n }\n }\n\n createChatStreamResp = (\n resp: Readonly<AxAIAnthropicChatResponseDelta>,\n state: object\n ): AxChatResponse => {\n if (!('type' in resp)) {\n throw new Error('Invalid Anthropic streaming event')\n }\n\n const sstate = state as {\n indexIdMap: Record<number, string>\n }\n\n if (!sstate.indexIdMap) {\n sstate.indexIdMap = {}\n }\n\n if (resp.type === 'error') {\n const { error } = resp as unknown as AxAIAnthropicErrorEvent\n throw new Error(error.message)\n }\n\n if (resp.type === 'message_start') {\n const { message } = resp as unknown as AxAIAnthropicMessageStartEvent\n const results = [{ content: '', id: message.id }]\n const modelUsage = {\n promptTokens: message.usage?.input_tokens ?? 0,\n completionTokens: message.usage?.output_tokens ?? 0,\n totalTokens:\n (message.usage?.input_tokens ?? 0) +\n (message.usage?.output_tokens ?? 0),\n }\n return {\n results,\n modelUsage,\n }\n }\n\n if (resp.type === 'content_block_start') {\n const { content_block: contentBlock } =\n resp as unknown as AxAIAnthropicContentBlockStartEvent\n\n if (contentBlock.type === 'text') {\n return {\n results: [{ content: contentBlock.text }],\n }\n }\n if (contentBlock.type === 'tool_use') {\n if (\n typeof contentBlock.id === 'string' &&\n typeof resp.index === 'number' &&\n !sstate.indexIdMap[resp.index]\n ) {\n sstate.indexIdMap[resp.index] = contentBlock.id\n const functionCalls = [\n {\n id: contentBlock.id,\n type: 'function' as const,\n function: {\n name: contentBlock.name,\n params: '',\n },\n },\n ]\n return {\n results: [{ functionCalls }],\n }\n }\n }\n }\n\n if (resp.type === 'content_block_delta') {\n const { delta } = resp as unknown as AxAIAnthropicContentBlockDeltaEvent\n if (delta.type === 'text_delta') {\n return {\n results: [{ content: delta.text }],\n }\n }\n if (delta.type === 'input_json_delta') {\n const id = sstate.indexIdMap[resp.index]\n if (!id) {\n throw new Error('invalid streaming index no id found: ' + resp.index)\n }\n const functionCalls = [\n {\n id,\n type: 'function' as const,\n function: {\n name: '',\n params: delta.partial_json,\n },\n },\n ]\n return {\n results: [{ functionCalls }],\n }\n }\n }\n\n if (resp.type === 'message_delta') {\n const { delta, usage } = resp as unknown as AxAIAnthropicMessageDeltaEvent\n return {\n results: [\n {\n content: '',\n finishReason: mapFinishReason(delta.stop_reason),\n },\n ],\n modelUsage: {\n promptTokens: 0,\n completionTokens: usage.output_tokens,\n totalTokens: usage.output_tokens,\n },\n }\n }\n\n return {\n results: [{ content: '' }],\n }\n }\n}\n\nexport class AxAIAnthropic extends AxBaseAI<\n AxAIAnthropicModel | AxAIAnthropicVertexModel,\n unknown,\n AxAIAnthropicChatRequest,\n unknown,\n AxAIAnthropicChatResponse,\n AxAIAnthropicChatResponseDelta,\n unknown\n> {\n constructor({\n apiKey,\n projectId,\n region,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIAnthropicArgs, 'name'>>) {\n const isVertex = projectId !== undefined && region !== undefined\n\n let apiURL\n let headers\n\n if (isVertex) {\n apiURL = `https://${region}-aiplatform.googleapis.com/v1/projects/${projectId}/locations/${region}/publishers/anthropic/`\n if (apiKey) {\n headers = async () => ({ Authorization: `Bearer ${apiKey}` })\n } else {\n const vertexAuth = new GoogleVertexAuth()\n headers = async () => ({\n Authorization: `Bearer ${await vertexAuth.getAccessToken()}`,\n })\n }\n } else {\n if (!apiKey) {\n throw new Error('Anthropic API key not set')\n }\n apiURL = 'https://api.anthropic.com/v1'\n headers = async () => ({\n 'anthropic-version': '2023-06-01',\n 'anthropic-beta': 'prompt-caching-2024-07-31',\n 'x-api-key': apiKey,\n })\n }\n\n const _config = {\n ...axAIAnthropicDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAIAnthropicImpl(_config, isVertex)\n\n super(aiImpl, {\n name: 'Anthropic',\n apiURL,\n headers,\n modelInfo: axModelInfoAnthropic,\n defaults: { model: _config.model },\n options,\n supportFor: { functions: true, streaming: true, functionCot: true },\n models,\n })\n }\n}\n\ntype AnthropicMsg = AxAIAnthropicChatRequest['messages'][0]\ntype AnthropicMsgRoleUser = Extract<AnthropicMsg, { role: 'user' }>\ntype AnthropicMsgRoleUserToolResult = Extract<\n AnthropicMsgRoleUser['content'][0],\n { type: 'tool_result' }\n>\n\nfunction createMessages(\n chatPrompt: Readonly<AxChatRequest['chatPrompt']>\n): AxAIAnthropicChatRequest['messages'] {\n const items: AxAIAnthropicChatRequest['messages'] = chatPrompt.map((msg) => {\n switch (msg.role) {\n case 'function':\n const content: AnthropicMsgRoleUserToolResult[] = [\n {\n type: 'tool_result' as const,\n content: msg.result,\n tool_use_id: msg.functionId,\n ...(msg.isError ? { is_error: true } : {}),\n ...(msg.cache ? { cache: { type: 'ephemeral' } } : {}),\n },\n ]\n\n return {\n role: 'user' as const,\n content,\n }\n case 'user': {\n if (typeof msg.content === 'string') {\n return {\n role: 'user' as const,\n content: msg.content,\n }\n }\n const content = msg.content.map((v) => {\n switch (v.type) {\n case 'text':\n return {\n type: 'text' as const,\n text: v.text,\n ...(v.cache ? { cache: { type: 'ephemeral' } } : {}),\n }\n case 'image':\n return {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: v.mimeType,\n data: v.image,\n },\n ...(v.cache ? { cache: { type: 'ephemeral' } } : {}),\n }\n default:\n throw new Error('Invalid content type')\n }\n })\n return {\n role: 'user' as const,\n content,\n }\n }\n case 'assistant': {\n let content: Extract<\n AxAIAnthropicChatRequest['messages'][0],\n { role: 'assistant' }\n >['content'] = ''\n\n if (typeof msg.content === 'string') {\n content = msg.content\n }\n if (typeof msg.functionCalls !== 'undefined') {\n content = msg.functionCalls.map((v) => {\n let input\n if (typeof v.function.params === 'string') {\n input = JSON.parse(v.function.params)\n } else if (typeof v.function.params === 'object') {\n input = v.function.params\n }\n return {\n type: 'tool_use' as const,\n id: v.id,\n name: v.function.name,\n input,\n ...(msg.cache ? { cache: { type: 'ephemeral' } } : {}),\n }\n })\n }\n return {\n role: 'assistant' as const,\n content,\n }\n }\n default:\n throw new Error('Invalid role')\n }\n })\n\n return mergeAssistantMessages(items)\n}\n\n// Anthropic and some others need this in non-streaming mode\nfunction mergeAssistantMessages(\n messages: Readonly<AxAIAnthropicChatRequest['messages']>\n): AxAIAnthropicChatRequest['messages'] {\n const mergedMessages: AxAIAnthropicChatRequest['messages'] = []\n\n for (const [i, cur] of messages.entries()) {\n // Continue if not an assistant message or first message\n if (cur.role !== 'assistant') {\n mergedMessages.push(cur)\n continue\n }\n\n // Merge current message with the previous one if both are from the assistant\n if (i > 0 && messages.at(i - 1)?.role === 'assistant') {\n const lastMessage = mergedMessages.pop()\n\n mergedMessages.push({\n ...(lastMessage ? lastMessage : {}),\n ...cur,\n })\n } else {\n mergedMessages.push(cur)\n }\n }\n\n return mergedMessages\n}\n\nfunction mapFinishReason(\n stopReason?: AxAIAnthropicChatResponse['stop_reason'] | null\n): AxChatResponse['results'][0]['finishReason'] | undefined {\n if (!stopReason) {\n return undefined\n }\n switch (stopReason) {\n case 'stop_sequence':\n return 'stop'\n break\n case 'max_tokens':\n return 'length'\n break\n case 'tool_use':\n return 'function_call'\n break\n case 'end_turn':\n return 'stop'\n break\n default:\n return 'stop'\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIOpenAIModel {\n O1 = 'o1',\n O1Mini = 'o1-mini',\n O3Mini = 'o3-mini',\n GPT4 = 'gpt-4',\n GPT45 = 'gpt-4.5-preview',\n GPT4O = 'gpt-4o',\n GPT4OMini = 'gpt-4o-mini',\n GPT4ChatGPT4O = 'chatgpt-4o-latest',\n GPT4Turbo = 'gpt-4-turbo',\n GPT35Turbo = 'gpt-3.5-turbo',\n GPT35TurboInstruct = 'gpt-3.5-turbo-instruct',\n GPT35TextDavinci002 = 'text-davinci-002',\n GPT3TextBabbage002 = 'text-babbage-002',\n GPT3TextAda001 = 'text-ada-001',\n}\n\nexport enum AxAIOpenAIEmbedModel {\n TextEmbeddingAda002 = 'text-embedding-ada-002',\n TextEmbedding3Small = 'text-embedding-3-small',\n TextEmbedding3Large = 'text-embedding-3-large',\n}\n\nexport type AxAIOpenAIConfig<TModel, TEmbedModel> = Omit<\n AxModelConfig,\n 'topK'\n> & {\n model: TModel\n embedModel?: TEmbedModel\n user?: string\n responseFormat?: 'json_object'\n bestOf?: number\n logitBias?: Map<string, number>\n suffix?: string | null\n stop?: string[]\n logprobs?: number\n echo?: boolean\n dimensions?: number\n reasoningEffort?: 'low' | 'medium' | 'high'\n store?: boolean\n}\n\nexport type AxAIOpenAILogprob = {\n tokens: string[]\n token_logprobs: number[]\n top_logprobs: Map<string, number>\n text_offset: number[]\n}\n\nexport type AxAIOpenAIUsage = {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n}\n\nexport interface AxAIOpenAIResponseDelta<T> {\n id: string\n object: string\n created: number\n model: string\n choices: {\n index: number\n delta: T\n finish_reason: 'stop' | 'length' | 'content_filter' | 'tool_calls'\n }[]\n usage?: AxAIOpenAIUsage\n system_fingerprint: string\n}\n\nexport type AxAIOpenAIChatRequest<TModel> = {\n model: TModel\n reasoning_effort?: 'low' | 'medium' | 'high'\n store?: boolean\n messages: (\n | { role: 'system'; content: string }\n | {\n role: 'user'\n content:\n | string\n | (\n | {\n type: 'text'\n text: string\n }\n | {\n type: 'image_url'\n image_url: { url: string; details?: 'high' | 'low' | 'auto' }\n }\n | {\n type: 'input_audio'\n input_audio: { data: string; format?: 'wav' }\n }\n )[]\n name?: string\n }\n | {\n role: 'assistant'\n content: string\n name?: string\n tool_calls?: {\n type: 'function'\n function: {\n name: string\n // eslint-disable-next-line functional/functional-parameters\n arguments?: string\n }\n }[]\n }\n | { role: 'tool'; content: string; tool_call_id: string }\n )[]\n tools?: {\n type: 'function'\n function: {\n name: string\n description: string\n parameters?: object\n }\n }[]\n tool_choice?:\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; function: { name: string } }\n response_format?: { type: string }\n max_completion_tokens: number\n temperature?: number\n top_p?: number\n n?: number\n stream?: boolean\n stop?: readonly string[]\n presence_penalty?: number\n frequency_penalty?: number\n logit_bias?: Map<string, number>\n user?: string\n organization?: string\n}\n\nexport type AxAIOpenAIChatResponse = {\n id: string\n object: 'chat.completion'\n created: number\n model: string\n choices: {\n index: number\n message: {\n role: string\n content: string\n tool_calls?: {\n id: string\n type: 'function'\n // eslint-disable-next-line functional/functional-parameters\n function: { name: string; arguments: string }\n }[]\n }\n finish_reason: 'stop' | 'length' | 'content_filter' | 'tool_calls'\n }[]\n usage?: AxAIOpenAIUsage\n error?: {\n message: string\n type: string\n param: string\n code: number\n }\n system_fingerprint: string\n}\n\nexport type AxAIOpenAIChatResponseDelta = AxAIOpenAIResponseDelta<{\n content: string\n role?: string\n tool_calls?: (NonNullable<\n AxAIOpenAIChatResponse['choices'][0]['message']['tool_calls']\n >[0] & {\n index: number\n })[]\n}>\n\nexport type AxAIOpenAIEmbedRequest<TEmbedModel> = {\n input: readonly string[]\n model: TEmbedModel\n dimensions?: number\n user?: string\n}\n\nexport type AxAIOpenAIEmbedResponse = {\n model: string\n data: {\n embedding: readonly number[]\n index: number\n }[]\n usage: AxAIOpenAIUsage\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIOpenAIEmbedModel, AxAIOpenAIModel } from './types.js'\n\n/**\n * OpenAI: Model information\n */\nexport const axModelInfoOpenAI: AxModelInfo[] = [\n {\n name: AxAIOpenAIModel.GPT45,\n currency: 'usd',\n promptTokenCostPer1M: 75,\n completionTokenCostPer1M: 150,\n },\n {\n name: AxAIOpenAIModel.O1,\n currency: 'usd',\n promptTokenCostPer1M: 15,\n completionTokenCostPer1M: 60,\n },\n {\n name: AxAIOpenAIModel.O1Mini,\n currency: 'usd',\n promptTokenCostPer1M: 1.1,\n completionTokenCostPer1M: 14.4,\n },\n {\n name: AxAIOpenAIModel.O3Mini,\n currency: 'usd',\n promptTokenCostPer1M: 1.1,\n completionTokenCostPer1M: 4.4,\n },\n {\n name: AxAIOpenAIModel.GPT4,\n currency: 'usd',\n promptTokenCostPer1M: 30,\n completionTokenCostPer1M: 60,\n },\n {\n name: AxAIOpenAIModel.GPT4O,\n currency: 'usd',\n promptTokenCostPer1M: 5,\n completionTokenCostPer1M: 15,\n },\n {\n name: AxAIOpenAIModel.GPT4OMini,\n currency: 'usd',\n promptTokenCostPer1M: 0.15,\n completionTokenCostPer1M: 0.6,\n },\n {\n name: AxAIOpenAIModel.GPT4ChatGPT4O,\n currency: 'usd',\n promptTokenCostPer1M: 5,\n completionTokenCostPer1M: 15,\n },\n {\n name: AxAIOpenAIModel.GPT4Turbo,\n currency: 'usd',\n promptTokenCostPer1M: 10,\n completionTokenCostPer1M: 30,\n },\n {\n name: AxAIOpenAIModel.GPT35Turbo,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n },\n {\n name: AxAIOpenAIEmbedModel.TextEmbeddingAda002,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n {\n name: AxAIOpenAIEmbedModel.TextEmbedding3Small,\n currency: 'usd',\n promptTokenCostPer1M: 0.02,\n completionTokenCostPer1M: 0.02,\n },\n {\n name: AxAIOpenAIEmbedModel.TextEmbedding3Large,\n currency: 'usd',\n promptTokenCostPer1M: 0.13,\n completionTokenCostPer1M: 0.13,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport type {\n AxAIInputModelList,\n AxAIPromptConfig,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatResponse,\n AxChatResponseResult,\n AxEmbedResponse,\n AxInternalChatRequest,\n AxInternalEmbedRequest,\n AxModelConfig,\n AxModelInfo,\n} from '../types.js'\n\nimport { axModelInfoOpenAI } from './info.js'\nimport {\n type AxAIOpenAIChatRequest,\n type AxAIOpenAIChatResponse,\n type AxAIOpenAIChatResponseDelta,\n type AxAIOpenAIConfig,\n AxAIOpenAIEmbedModel,\n type AxAIOpenAIEmbedRequest,\n type AxAIOpenAIEmbedResponse,\n AxAIOpenAIModel,\n} from './types.js'\n\nexport const axAIOpenAIDefaultConfig = (): AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> =>\n structuredClone({\n model: AxAIOpenAIModel.GPT4O,\n embedModel: AxAIOpenAIEmbedModel.TextEmbedding3Small,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIOpenAIBestConfig = (): AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> =>\n structuredClone({\n ...axAIOpenAIDefaultConfig(),\n model: AxAIOpenAIModel.GPT4O,\n })\n\nexport const axAIOpenAICreativeConfig = (): AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> =>\n structuredClone({\n model: AxAIOpenAIModel.GPT4O,\n embedModel: AxAIOpenAIEmbedModel.TextEmbedding3Small,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport const axAIOpenAIFastConfig = (): AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> => ({\n ...axAIOpenAIDefaultConfig(),\n model: AxAIOpenAIModel.GPT4OMini,\n})\n\nexport interface AxAIOpenAIArgs<\n TName = 'openai',\n TModel = AxAIOpenAIModel,\n TEmbedModel = AxAIOpenAIEmbedModel,\n> extends Omit<\n AxAIOpenAIBaseArgs<TModel, TEmbedModel>,\n 'config' | 'modelInfo'\n > {\n name: TName\n config?: Partial<AxAIOpenAIBaseArgs<TModel, TEmbedModel>['config']>\n}\n\nexport interface AxAIOpenAIBaseArgs<TModel, TEmbedModel> {\n apiKey: string\n apiURL?: string\n config: Readonly<AxAIOpenAIConfig<TModel, TEmbedModel>>\n options?: Readonly<AxAIServiceOptions & { streamingUsage?: boolean }>\n modelInfo: Readonly<AxModelInfo[]>\n models?: AxAIInputModelList<TModel>\n}\n\nclass AxAIOpenAIImpl<TModel, TEmbedModel>\n implements\n AxAIServiceImpl<\n TModel,\n TEmbedModel,\n AxAIOpenAIChatRequest<TModel>,\n AxAIOpenAIEmbedRequest<TEmbedModel>,\n AxAIOpenAIChatResponse,\n AxAIOpenAIChatResponseDelta,\n AxAIOpenAIEmbedResponse\n >\n{\n constructor(\n private readonly config: Readonly<AxAIOpenAIConfig<TModel, TEmbedModel>>,\n private streamingUsage: boolean\n ) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n presencePenalty: config.presencePenalty,\n frequencyPenalty: config.frequencyPenalty,\n stopSequences: config.stopSequences,\n endSequences: config.endSequences,\n topP: config.topP,\n n: config.n,\n stream: config.stream,\n }\n }\n\n createChatReq(\n req: Readonly<AxInternalChatRequest<TModel>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _config: Readonly<AxAIPromptConfig>\n ): [AxAPI, AxAIOpenAIChatRequest<TModel>] {\n const model = req.model\n\n if (!req.chatPrompt || req.chatPrompt.length === 0) {\n throw new Error('Chat prompt is empty')\n }\n\n const apiConfig = {\n name: '/chat/completions',\n }\n\n const tools = req.functions?.map((v) => ({\n type: 'function' as const,\n function: {\n name: v.name,\n description: v.description,\n parameters: v.parameters,\n },\n }))\n\n const toolsChoice =\n !req.functionCall && req.functions && req.functions.length > 0\n ? 'auto'\n : req.functionCall\n\n const messages = createMessages(req)\n\n const frequencyPenalty =\n req.modelConfig?.frequencyPenalty ?? this.config.frequencyPenalty\n\n const stream = req.modelConfig?.stream ?? this.config.stream\n\n const reasoningEffort = isReasoningModel<TModel>(model)\n ? this.config.reasoningEffort\n : undefined\n\n const store = this.config.store\n\n const reqValue: AxAIOpenAIChatRequest<TModel> = {\n model,\n messages,\n response_format: this.config?.responseFormat\n ? { type: this.config?.responseFormat }\n : undefined,\n tools,\n tool_choice: toolsChoice,\n max_completion_tokens:\n req.modelConfig?.maxTokens ?? this.config.maxTokens ?? 500,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n top_p: req.modelConfig?.topP ?? this.config.topP ?? 1,\n n: req.modelConfig?.n ?? this.config.n,\n stop: req.modelConfig?.stopSequences ?? this.config.stop,\n presence_penalty:\n req.modelConfig?.presencePenalty ?? this.config.presencePenalty,\n logit_bias: this.config.logitBias,\n ...(frequencyPenalty ? { frequency_penalty: frequencyPenalty } : {}),\n ...(stream && this.streamingUsage\n ? { stream: true, stream_options: { include_usage: true } }\n : {}),\n ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),\n ...(store ? { store: store } : {}),\n }\n\n return [apiConfig, reqValue]\n }\n\n createEmbedReq(\n req: Readonly<AxInternalEmbedRequest<TEmbedModel>>\n ): [AxAPI, AxAIOpenAIEmbedRequest<TEmbedModel>] {\n const model = req.embedModel\n\n if (!model) {\n throw new Error('Embed model not set')\n }\n\n if (!req.texts || req.texts.length === 0) {\n throw new Error('Embed texts is empty')\n }\n\n const apiConfig = {\n name: '/embeddings',\n }\n\n const reqValue = {\n model: model,\n input: req.texts,\n dimensions: this.config.dimensions,\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp(resp: Readonly<AxAIOpenAIChatResponse>): AxChatResponse {\n const { id, usage, choices, error } = resp\n\n if (error) {\n throw error\n }\n\n const modelUsage = usage\n ? {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n }\n : undefined\n\n const results = choices.map((choice) => {\n const finishReason = mapFinishReason(choice.finish_reason)\n\n const functionCalls = choice.message.tool_calls?.map(\n ({ id, function: { arguments: params, name } }) => ({\n id: id,\n type: 'function' as const,\n function: { name, params },\n })\n )\n\n return {\n id: `${choice.index}`,\n content: choice.message.content,\n functionCalls,\n finishReason,\n }\n })\n\n return {\n modelUsage,\n results,\n remoteId: id,\n }\n }\n\n createChatStreamResp(\n resp: Readonly<AxAIOpenAIChatResponseDelta>,\n state: object\n ): AxChatResponse {\n const { id, usage, choices } = resp\n\n const modelUsage = usage\n ? {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n }\n : undefined\n\n const sstate = state as {\n indexIdMap: Record<number, string>\n }\n\n if (!sstate.indexIdMap) {\n sstate.indexIdMap = {}\n }\n\n const results = choices.map(\n ({\n delta: { content, role, tool_calls: toolCalls },\n finish_reason: oaiFinishReason,\n }) => {\n const finishReason = mapFinishReason(oaiFinishReason)\n\n const functionCalls = toolCalls\n ?.map(({ id: _id, index, function: { name, arguments: params } }) => {\n if (\n typeof _id === 'string' &&\n typeof index === 'number' &&\n !sstate.indexIdMap[index]\n ) {\n sstate.indexIdMap[index] = _id\n }\n\n const id = sstate.indexIdMap[index]\n if (!id) {\n return null\n }\n\n return {\n id,\n type: 'function' as const,\n function: { name, params },\n }\n })\n .filter((v) => v !== null)\n\n return {\n content,\n role: role,\n functionCalls,\n finishReason,\n id,\n }\n }\n )\n\n return {\n results,\n modelUsage,\n }\n }\n\n createEmbedResp(resp: Readonly<AxAIOpenAIEmbedResponse>): AxEmbedResponse {\n const { data, usage } = resp\n\n const modelUsage = usage\n ? {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n }\n : undefined\n\n return {\n embeddings: data.map((v) => v.embedding),\n modelUsage,\n }\n }\n}\n\nconst mapFinishReason = (\n finishReason: AxAIOpenAIChatResponse['choices'][0]['finish_reason']\n): AxChatResponseResult['finishReason'] => {\n switch (finishReason) {\n case 'stop':\n return 'stop' as const\n case 'length':\n return 'length' as const\n case 'content_filter':\n return 'error' as const\n case 'tool_calls':\n return 'function_call' as const\n }\n}\n\nfunction createMessages<TModel>(\n req: Readonly<AxInternalChatRequest<TModel>>\n): AxAIOpenAIChatRequest<TModel>['messages'] {\n return req.chatPrompt.map((msg) => {\n switch (msg.role) {\n case 'system':\n return { role: 'system' as const, content: msg.content }\n case 'user':\n if (Array.isArray(msg.content)) {\n return {\n role: 'user' as const,\n name: msg.name,\n content: msg.content.map((c) => {\n switch (c.type) {\n case 'text':\n return { type: 'text' as const, text: c.text }\n case 'image': {\n const url = `data:${c.mimeType};base64,` + c.image\n return {\n type: 'image_url' as const,\n image_url: { url, details: c.details ?? 'auto' },\n }\n }\n case 'audio': {\n const data = c.data\n return {\n type: 'input_audio' as const,\n input_audio: { data, format: c.format ?? 'wav' },\n }\n }\n default:\n throw new Error('Invalid content type')\n }\n }),\n }\n }\n return { role: 'user' as const, content: msg.content, name: msg.name }\n case 'assistant':\n return {\n role: 'assistant' as const,\n content: msg.content as string,\n name: msg.name,\n tool_calls: msg.functionCalls?.map((v) => ({\n id: v.id,\n type: 'function' as const,\n function: {\n name: v.function.name,\n arguments:\n typeof v.function.params === 'object'\n ? JSON.stringify(v.function.params)\n : v.function.params,\n },\n })),\n }\n case 'function':\n return {\n role: 'tool' as const,\n content: msg.result,\n tool_call_id: msg.functionId,\n }\n default:\n throw new Error('Invalid role')\n }\n })\n}\n\nexport class AxAIOpenAIBase<TModel, TEmbedModel> extends AxBaseAI<\n TModel,\n TEmbedModel,\n AxAIOpenAIChatRequest<TModel>,\n AxAIOpenAIEmbedRequest<TEmbedModel>,\n AxAIOpenAIChatResponse,\n AxAIOpenAIChatResponseDelta,\n AxAIOpenAIEmbedResponse\n> {\n constructor({\n apiKey,\n config,\n options,\n apiURL,\n modelInfo,\n models,\n }: Readonly<Omit<AxAIOpenAIBaseArgs<TModel, TEmbedModel>, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('OpenAI API key not set')\n }\n\n const aiImpl = new AxAIOpenAIImpl<TModel, TEmbedModel>(\n config,\n options?.streamingUsage ?? true\n )\n\n super(aiImpl, {\n name: 'OpenAI',\n apiURL: apiURL ? apiURL : 'https://api.openai.com/v1',\n headers: async () => ({ Authorization: `Bearer ${apiKey}` }),\n modelInfo,\n defaults: {\n model: config.model,\n embedModel: config.embedModel,\n },\n options,\n supportFor: () => {\n return { functions: true, streaming: true }\n },\n models,\n })\n }\n}\n\nconst isReasoningModel = <TModel>(model: TModel): boolean =>\n [AxAIOpenAIModel.O1Mini, AxAIOpenAIModel.O1, AxAIOpenAIModel.O3Mini].includes(\n model as AxAIOpenAIModel\n )\n\nexport class AxAIOpenAI extends AxAIOpenAIBase<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIOpenAIArgs, 'name' | 'modelInfo'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('OpenAI API key not set')\n }\n\n super({\n apiKey,\n config: {\n ...axAIOpenAIDefaultConfig(),\n ...config,\n },\n options,\n modelInfo: axModelInfoOpenAI,\n models,\n })\n\n super.setName('OpenAI')\n }\n}\n","import {\n type AxAIOpenAIArgs,\n AxAIOpenAIBase,\n axAIOpenAIBestConfig,\n axAIOpenAICreativeConfig,\n axAIOpenAIDefaultConfig,\n axAIOpenAIFastConfig,\n} from '../openai/api.js'\nimport { axModelInfoOpenAI } from '../openai/info.js'\nimport type {\n AxAIOpenAIConfig,\n AxAIOpenAIEmbedModel,\n AxAIOpenAIModel,\n} from '../openai/types.js'\n\nexport const axAIAzureOpenAIDefaultConfig = axAIOpenAIDefaultConfig\n\nexport const axAIAzureOpenAICreativeConfig = axAIOpenAICreativeConfig\n\nexport const axAIAzureOpenAIFastConfig = axAIOpenAIFastConfig\n\nexport const axAIAzureOpenAIBestConfig = axAIOpenAIBestConfig\n\nexport type AxAIAzureOpenAIConfig = AxAIOpenAIConfig<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n>\nexport type AxAIAzureOpenAIArgs = AxAIOpenAIArgs<\n 'azure-openai',\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> & {\n resourceName: string\n deploymentName: string\n version?: string\n}\n\nexport class AxAIAzureOpenAI extends AxAIOpenAIBase<\n AxAIOpenAIModel,\n AxAIOpenAIEmbedModel\n> {\n constructor({\n apiKey,\n resourceName,\n deploymentName,\n version = 'api-version=2024-02-15-preview',\n config,\n options,\n models,\n }: Readonly<Omit<AxAIAzureOpenAIArgs, 'name' | 'modelInfo'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Azure OpenAPI API key not set')\n }\n if (!resourceName || resourceName === '') {\n throw new Error('Azure OpenAPI resource name not set')\n }\n if (!deploymentName || deploymentName === '') {\n throw new Error('Azure OpenAPI deployment id not set')\n }\n const _config = {\n ...axAIAzureOpenAIDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n config: _config,\n options,\n models,\n modelInfo: axModelInfoOpenAI,\n })\n\n const host = resourceName.includes('://')\n ? resourceName\n : `https://${resourceName}.openai.azure.com/`\n\n super.setName('Azure OpenAI')\n\n super.setAPIURL(\n new URL(\n `/openai/deployments/${deploymentName}?api-version=${version}`,\n host\n ).href\n )\n\n super.setHeaders(async () => ({ 'api-key': apiKey }))\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\n/**\n * Cohere: Models for text generation\n */\nexport enum AxAICohereModel {\n CommandRPlus = 'command-r-plus',\n CommandR = 'command-r',\n Command = 'command',\n CommandLight = 'command-light',\n}\n\n/**\n * Cohere: Models for use in embeddings\n */\nexport enum AxAICohereEmbedModel {\n EmbedEnglishV30 = 'embed-english-v3.0',\n EmbedEnglishLightV30 = 'embed-english-light-v3.0',\n EmbedMultiLingualV30 = 'embed-multilingual-v3.0',\n EmbedMultiLingualLightV30 = 'embed-multilingual-light-v3.0',\n}\n\n/**\n * Cohere: Model options for text generation\n */\nexport type AxAICohereConfig = AxModelConfig & {\n model: AxAICohereModel\n embedModel?: AxAICohereEmbedModel\n}\n\nexport type AxAICohereChatResponseToolCalls = {\n name: string\n parameters?: object\n}[]\n\nexport type AxAICohereChatRequestToolResults = {\n call: AxAICohereChatResponseToolCalls[0]\n outputs: object[]\n}[]\n\nexport type AxAICohereChatRequest = {\n message?: string\n preamble?: string\n chat_history: (\n | {\n role: 'CHATBOT'\n message: string\n tool_calls?: AxAICohereChatResponseToolCalls\n }\n | {\n role: 'SYSTEM'\n message: string\n }\n | {\n role: 'USER'\n message: string\n }\n | {\n role: 'TOOL'\n message?: string\n tool_results: AxAICohereChatRequestToolResults\n }\n )[]\n\n model: AxAICohereModel\n max_tokens?: number\n temperature?: number\n k?: number\n p?: number\n frequency_penalty?: number\n presence_penalty?: number\n end_sequences?: readonly string[]\n stop_sequences?: string[]\n tools?: {\n name: string\n description: string\n parameter_definitions: Record<\n string,\n {\n description: string\n type: string\n required: boolean\n }\n >\n }[]\n tool_results?: AxAICohereChatRequestToolResults\n}\n\nexport type AxAICohereChatResponse = {\n response_id: string\n meta: {\n billed_units: {\n input_tokens: number\n output_tokens: number\n }\n }\n generation_id: string\n text: string\n finish_reason:\n | 'COMPLETE'\n | 'ERROR'\n | 'ERROR_TOXIC'\n | 'ERROR_LIMIT'\n | 'USER_CANCEL'\n | 'MAX_TOKENS'\n tool_calls: AxAICohereChatResponseToolCalls\n}\n\nexport type AxAICohereChatResponseDelta = AxAICohereChatResponse & {\n event_type:\n | 'stream-start'\n | 'text-generation'\n | 'tool-calls-generation'\n | 'stream-end'\n}\n\nexport type AxAICohereEmbedRequest = {\n texts: readonly string[]\n model: AxAICohereEmbedModel\n truncate: string\n}\n\nexport type AxAICohereEmbedResponse = {\n id: string\n texts: string[]\n model: AxAICohereEmbedModel\n embeddings: number[][]\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAICohereEmbedModel, AxAICohereModel } from './types.js'\n\nexport const axModelInfoCohere: AxModelInfo[] = [\n {\n name: AxAICohereModel.CommandRPlus,\n currency: 'usd',\n promptTokenCostPer1M: 3.0,\n completionTokenCostPer1M: 15,\n },\n {\n name: AxAICohereModel.CommandR,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n },\n {\n name: AxAICohereModel.Command,\n currency: 'usd',\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n },\n {\n name: AxAICohereModel.CommandLight,\n currency: 'usd',\n promptTokenCostPer1M: 0.3,\n completionTokenCostPer1M: 0.6,\n },\n {\n name: AxAICohereEmbedModel.EmbedEnglishLightV30,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n {\n name: AxAICohereEmbedModel.EmbedEnglishV30,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n {\n name: AxAICohereEmbedModel.EmbedMultiLingualV30,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n {\n name: AxAICohereEmbedModel.EmbedMultiLingualLightV30,\n currency: 'usd',\n promptTokenCostPer1M: 0.1,\n completionTokenCostPer1M: 0.1,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport type {\n AxAIInputModelList,\n AxAIPromptConfig,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedResponse,\n AxInternalChatRequest,\n AxInternalEmbedRequest,\n AxModelConfig,\n} from '../types.js'\n\nimport { axModelInfoCohere } from './info.js'\nimport {\n type AxAICohereChatRequest,\n type AxAICohereChatResponse,\n type AxAICohereChatResponseDelta,\n type AxAICohereConfig,\n AxAICohereEmbedModel,\n type AxAICohereEmbedRequest,\n type AxAICohereEmbedResponse,\n AxAICohereModel,\n} from './types.js'\n\nexport const axAICohereDefaultConfig = (): AxAICohereConfig =>\n structuredClone({\n model: AxAICohereModel.CommandRPlus,\n embedModel: AxAICohereEmbedModel.EmbedEnglishV30,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAICohereCreativeConfig = (): AxAICohereConfig =>\n structuredClone({\n model: AxAICohereModel.CommandR,\n embedModel: AxAICohereEmbedModel.EmbedEnglishV30,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport interface AxAICohereArgs {\n name: 'cohere'\n apiKey: string\n config?: Readonly<Partial<AxAICohereConfig>>\n options?: Readonly<AxAIServiceOptions>\n models?: AxAIInputModelList<AxAICohereModel>\n}\n\nclass AxAICohereImpl\n implements\n AxAIServiceImpl<\n AxAICohereModel,\n AxAICohereEmbedModel,\n AxAICohereChatRequest,\n AxAICohereEmbedRequest,\n AxAICohereChatResponse,\n AxAICohereChatResponseDelta,\n AxAICohereEmbedResponse\n >\n{\n constructor(private config: AxAICohereConfig) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n topK: config.topK,\n frequencyPenalty: config.frequencyPenalty,\n presencePenalty: config.presencePenalty,\n endSequences: config.endSequences,\n stopSequences: config.stopSequences,\n stream: config.stream,\n n: config.n,\n } as AxModelConfig\n }\n\n createChatReq(\n req: Readonly<AxInternalChatRequest<AxAICohereModel>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _config: Readonly<AxAIPromptConfig>\n ): [AxAPI, AxAICohereChatRequest] {\n const model = req.model\n\n const lastChatMsg = req.chatPrompt.at(-1)\n const restOfChat = req.chatPrompt.slice(0, -1)\n\n let message: AxAICohereChatRequest['message'] | undefined\n\n if (\n lastChatMsg &&\n lastChatMsg.role === 'user' &&\n typeof lastChatMsg.content === 'string'\n ) {\n message = lastChatMsg?.content\n }\n\n const chatHistory = createHistory(restOfChat)\n\n type PropValue = NonNullable<\n AxAICohereChatRequest['tools']\n >[0]['parameter_definitions'][0]\n\n const tools: AxAICohereChatRequest['tools'] = req.functions?.map((v) => {\n const props: Record<string, PropValue> = {}\n if (v.parameters?.properties) {\n for (const [key, value] of Object.entries(v.parameters.properties)) {\n props[key] = {\n description: value.description,\n type: value.type,\n required: v.parameters.required?.includes(key) ?? false,\n }\n }\n }\n\n return {\n name: v.name,\n description: v.description,\n parameter_definitions: props,\n }\n })\n\n type FnType = Extract<AxChatRequest['chatPrompt'][0], { role: 'function' }>\n\n const toolResults: AxAICohereChatRequest['tool_results'] = (\n req.chatPrompt as FnType[]\n )\n .filter((chat) => chat.role === 'function')\n .map((chat) => {\n const fn = tools?.find((t) => t.name === chat.functionId)\n if (!fn) {\n throw new Error('Function not found')\n }\n return {\n call: { name: fn.name, parameters: fn.parameter_definitions },\n outputs: [{ result: chat.result ?? '' }],\n }\n })\n\n const apiConfig = {\n name: '/chat',\n }\n\n const reqValue: AxAICohereChatRequest = {\n message,\n model,\n tools,\n ...(toolResults && !message ? { tool_results: toolResults } : {}),\n chat_history: chatHistory,\n max_tokens: req.modelConfig?.maxTokens ?? this.config.maxTokens,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n k: req.modelConfig?.topK ?? this.config.topK,\n p: req.modelConfig?.topP ?? this.config.topP,\n frequency_penalty:\n req.modelConfig?.frequencyPenalty ?? this.config.frequencyPenalty,\n presence_penalty:\n req.modelConfig?.presencePenalty ?? this.config.presencePenalty,\n end_sequences: this.config.endSequences,\n stop_sequences:\n req.modelConfig?.stopSequences ?? this.config.stopSequences,\n }\n\n return [apiConfig, reqValue]\n }\n\n createEmbedReq = (\n req: Readonly<AxInternalEmbedRequest<AxAICohereEmbedModel>>\n ): [AxAPI, AxAICohereEmbedRequest] => {\n const model = req.embedModel\n\n if (!model) {\n throw new Error('Embed model not set')\n }\n\n if (!req.texts || req.texts.length === 0) {\n throw new Error('Embed texts is empty')\n }\n\n const apiConfig = {\n name: '/embed',\n }\n\n const reqValue = {\n model,\n texts: req.texts ?? [],\n input_type: 'classification',\n truncate: '',\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (resp: Readonly<AxAICohereChatResponse>): AxChatResponse => {\n const modelUsage = resp.meta.billed_units\n ? {\n promptTokens: resp.meta.billed_units.input_tokens,\n completionTokens: resp.meta.billed_units.output_tokens,\n totalTokens:\n resp.meta.billed_units.input_tokens +\n resp.meta.billed_units.output_tokens,\n }\n : undefined\n\n let finishReason: AxChatResponse['results'][0]['finishReason']\n if ('finish_reason' in resp) {\n switch (resp.finish_reason) {\n case 'COMPLETE':\n finishReason = 'stop'\n break\n case 'MAX_TOKENS':\n finishReason = 'length'\n break\n case 'ERROR':\n throw new Error('Finish reason: ERROR')\n case 'ERROR_TOXIC':\n throw new Error('Finish reason: CONTENT_FILTER')\n default:\n finishReason = 'stop'\n break\n }\n }\n\n let functionCalls: AxChatResponse['results'][0]['functionCalls']\n\n if ('tool_calls' in resp) {\n functionCalls = resp.tool_calls?.map(\n (v): NonNullable<AxChatResponse['results'][0]['functionCalls']>[0] => {\n return {\n id: v.name,\n type: 'function' as const,\n function: { name: v.name, params: v.parameters },\n }\n }\n )\n }\n\n const results: AxChatResponse['results'] = [\n {\n id: resp.generation_id,\n content: resp.text,\n functionCalls,\n finishReason,\n },\n ]\n\n return {\n results,\n modelUsage,\n remoteId: resp.response_id,\n }\n }\n\n createChatStreamResp = (\n resp: Readonly<AxAICohereChatResponseDelta>,\n state: object\n ): AxChatResponse => {\n const ss = state as {\n generation_id?: string\n }\n\n if (resp.event_type === 'stream-start') {\n ss.generation_id = resp.generation_id\n }\n\n const { results } = this.createChatResp(resp)\n const result = results[0]\n if (!result) {\n throw new Error('No result')\n }\n\n result.id = ss.generation_id ?? ''\n return { results }\n }\n\n createEmbedResp(resp: Readonly<AxAICohereEmbedResponse>): AxEmbedResponse {\n return {\n remoteId: resp.id,\n embeddings: resp.embeddings,\n }\n }\n}\n\nexport class AxAICohere extends AxBaseAI<\n AxAICohereModel,\n AxAICohereEmbedModel,\n AxAICohereChatRequest,\n AxAICohereEmbedRequest,\n AxAICohereChatResponse,\n AxAICohereChatResponseDelta,\n AxAICohereEmbedResponse\n> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAICohereArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Cohere API key not set')\n }\n const _config = {\n ...axAICohereDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAICohereImpl(_config)\n\n super(aiImpl, {\n name: 'Cohere',\n apiURL: 'https://api.cohere.ai/v1',\n headers: async () => ({ Authorization: `Bearer ${apiKey}` }),\n modelInfo: axModelInfoCohere,\n defaults: { model: _config.model },\n supportFor: { functions: true, streaming: true },\n options,\n models,\n })\n }\n}\nfunction createHistory(\n chatPrompt: Readonly<AxChatRequest['chatPrompt']>\n): AxAICohereChatRequest['chat_history'] {\n return chatPrompt.map((chat) => {\n let message: string = ''\n\n if (\n chat.role === 'system' ||\n chat.role === 'assistant' ||\n chat.role === 'user'\n ) {\n if (typeof chat.content === 'string') {\n message = chat.content\n } else {\n throw new Error('Multi-modal content not supported')\n }\n }\n\n switch (chat.role) {\n case 'user':\n return { role: 'USER' as const, message }\n case 'system':\n return { role: 'SYSTEM' as const, message }\n case 'assistant': {\n const toolCalls = createToolCall(chat.functionCalls)\n return {\n role: 'CHATBOT' as const,\n message,\n tool_calls: toolCalls,\n }\n }\n case 'function': {\n const functionCalls = chatPrompt\n .map((v) => {\n if (v.role === 'assistant') {\n return v.functionCalls?.find((f) => f.id === chat.functionId)\n }\n return undefined\n })\n .filter((v) => v !== undefined)\n\n const call = createToolCall(functionCalls)?.at(0)\n\n if (!call) {\n throw new Error('Function call not found')\n }\n\n const outputs = [{ result: chat.result }]\n return {\n role: 'TOOL' as const,\n tool_results: [\n {\n call,\n outputs,\n },\n ],\n }\n }\n default:\n throw new Error('Unknown role')\n }\n })\n}\nfunction createToolCall(\n functionCalls: Readonly<\n Extract<\n AxChatRequest['chatPrompt'][0],\n { role: 'assistant' }\n >['functionCalls']\n >\n) {\n return functionCalls?.map((v) => {\n const parameters =\n typeof v.function.params === 'string'\n ? JSON.parse(v.function.params)\n : v.function.params\n return { name: v.function.name, parameters }\n })\n}\n","/**\n * DeepSeek: Models for text generation\n */\nexport enum AxAIDeepSeekModel {\n DeepSeekChat = 'deepseek-chat',\n DeepSeekCoder = 'deepseek-coder',\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIDeepSeekModel } from './types.js'\n\nexport const axModelInfoDeepSeek: AxModelInfo[] = [\n {\n name: AxAIDeepSeekModel.DeepSeekChat,\n currency: 'USD',\n promptTokenCostPer1M: 0.14,\n completionTokenCostPer1M: 0.28,\n },\n {\n name: AxAIDeepSeekModel.DeepSeekCoder,\n currency: 'USD',\n promptTokenCostPer1M: 0.14,\n completionTokenCostPer1M: 0.28,\n },\n]\n","import {\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\n\nimport { axModelInfoDeepSeek } from './info.js'\nimport { AxAIDeepSeekModel } from './types.js'\n\ntype DeepSeekConfig = AxAIOpenAIConfig<AxAIDeepSeekModel, undefined>\n\nexport const axAIDeepSeekDefaultConfig = (): DeepSeekConfig =>\n structuredClone({\n model: AxAIDeepSeekModel.DeepSeekChat,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIDeepSeekCodeConfig = (): DeepSeekConfig =>\n structuredClone({\n model: AxAIDeepSeekModel.DeepSeekCoder,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport type AxAIDeepSeekArgs = AxAIOpenAIArgs<\n 'deepseek',\n AxAIDeepSeekModel,\n undefined\n>\n\nexport class AxAIDeepSeek extends AxAIOpenAIBase<AxAIDeepSeekModel, undefined> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIDeepSeekArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('DeepSeek API key not set')\n }\n const _config = {\n ...axAIDeepSeekDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n config: _config,\n options,\n apiURL: 'https://api.deepseek.com',\n modelInfo: axModelInfoDeepSeek,\n models,\n })\n\n super.setName('DeepSeek')\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIGoogleGeminiModel {\n Gemini20Pro = 'gemini-2.0-pro-exp-02-05',\n Gemini20Flash = 'gemini-2.0-flash',\n Gemini20FlashLite = 'gemini-2.0-flash-lite-preview-02-05',\n Gemini20FlashThinking = 'gemini-2.0-flash-thinking-exp-01-21',\n Gemini1Pro = 'gemini-1.0-pro',\n Gemini15Flash = 'gemini-1.5-flash',\n Gemini15Flash002 = 'gemini-1.5-flash-002',\n Gemini15Flash8B = 'gemini-1.5-flash-8b',\n Gemini15Pro = 'gemini-1.5-pro',\n Gemma2 = 'gemma-2-27b-it',\n AQA = 'aqa',\n}\n\nexport enum AxAIGoogleGeminiEmbedModel {\n GeminiEmbedding = 'gemini-embedding-exp-03-07',\n TextEmbedding004 = 'text-embedding-004',\n TextEmbedding005 = 'text-embedding-005',\n}\n\nexport enum AxAIGoogleGeminiSafetyCategory {\n HarmCategoryHarassment = 'HARM_CATEGORY_HARASSMENT',\n HarmCategoryHateSpeech = 'HARM_CATEGORY_HATE_SPEECH',\n HarmCategorySexuallyExplicit = 'HARM_CATEGORY_SEXUALLY_EXPLICIT',\n HarmCategoryDangerousContent = 'HARM_CATEGORY_DANGEROUS_CONTENT',\n}\n\nexport enum AxAIGoogleGeminiSafetyThreshold {\n BlockNone = 'BLOCK_NONE',\n BlockOnlyHigh = 'BLOCK_ONLY_HIGH',\n BlockMediumAndAbove = 'BLOCK_MEDIUM_AND_ABOVE',\n BlockLowAndAbove = 'BLOCK_LOW_AND_ABOVE',\n BlockDefault = 'HARM_BLOCK_THRESHOLD_UNSPECIFIED',\n}\n\nexport enum AxAIGoogleGeminiEmbedTypes {\n SemanticSimilarity = 'SEMANTIC_SIMILARITY',\n Classification = 'CLASSIFICATION',\n Clustering = 'CLUSTERING',\n RetrievalDocument = 'RETRIEVAL_DOCUMENT',\n RetrievalQuery = 'RETRIEVAL_QUERY',\n QuestionAnswering = 'QUESTION_ANSWERING',\n FactVerification = 'FACT_VERIFICATION',\n CodeRetrievalQuery = 'CODE_RETRIEVAL_QUERY',\n}\n\nexport type AxAIGoogleGeminiContent =\n | {\n role: 'user'\n parts: (\n | {\n text: string\n }\n | {\n inlineData: {\n mimeType: string\n data: string\n }\n }\n | {\n fileData: {\n mimeType: string\n fileUri: string\n }\n }\n )[]\n }\n | {\n role: 'model'\n parts:\n | {\n text: string\n }[]\n | {\n functionCall: {\n name: string\n args: object\n }\n }[]\n }\n | {\n role: 'function'\n parts: {\n functionResponse: {\n name: string\n response: object\n }\n }[]\n }\n\nexport type AxAIGoogleGeminiToolFunctionDeclaration = {\n name: string\n description?: string\n parameters?: object\n}\n\nexport type AxAIGoogleGeminiToolGoogleSearchRetrieval = {\n dynamic_retrieval_config: {\n mode?: 'MODE_DYNAMIC'\n dynamic_threshold?: number\n }\n}\n\nexport type AxAIGoogleGeminiTool = {\n function_declarations?: AxAIGoogleGeminiToolFunctionDeclaration[]\n code_execution?: object\n google_search_retrieval?: AxAIGoogleGeminiToolGoogleSearchRetrieval\n}\n\nexport type AxAIGoogleGeminiToolConfig = {\n function_calling_config: {\n mode: 'ANY' | 'NONE' | 'AUTO'\n allowed_function_names?: string[]\n }\n}\n\nexport type AxAIGoogleGeminiGenerationConfig = {\n temperature?: number\n topP?: number\n topK?: number\n candidateCount?: number\n maxOutputTokens?: number\n stopSequences?: readonly string[]\n}\n\nexport type AxAIGoogleGeminiSafetySettings = {\n category: AxAIGoogleGeminiSafetyCategory\n threshold: AxAIGoogleGeminiSafetyThreshold\n}[]\n\nexport type AxAIGoogleGeminiChatRequest = {\n contents: AxAIGoogleGeminiContent[]\n tools?: AxAIGoogleGeminiTool[]\n toolConfig?: AxAIGoogleGeminiToolConfig\n systemInstruction?: AxAIGoogleGeminiContent\n generationConfig: AxAIGoogleGeminiGenerationConfig\n safetySettings?: AxAIGoogleGeminiSafetySettings\n}\n\nexport type AxAIGoogleGeminiChatResponse = {\n candidates: {\n content: AxAIGoogleGeminiContent\n\n finishReason:\n | 'STOP'\n | 'MAX_TOKENS'\n | 'SAFETY'\n | 'RECITATION'\n | 'OTHER'\n | 'MALFORMED_FUNCTION_CALL'\n citationMetadata: {\n citations: {\n startIndex: number\n endIndex: number\n uri: string\n title: string\n license: string\n publicationDate: {\n year: number\n month: number\n day: number\n }\n }[]\n }\n }[]\n usageMetadata: {\n promptTokenCount: number\n candidatesTokenCount: number\n totalTokenCount: number\n }\n}\n\nexport type AxAIGoogleGeminiChatResponseDelta = AxAIGoogleGeminiChatResponse\n\n/**\n * AxAIGoogleGeminiConfig: Configuration options for Google Gemini API\n */\nexport type AxAIGoogleGeminiConfig = AxModelConfig & {\n model: AxAIGoogleGeminiModel\n embedModel?: AxAIGoogleGeminiEmbedModel\n safetySettings?: AxAIGoogleGeminiSafetySettings\n embedType?: AxAIGoogleGeminiEmbedTypes\n dimensions?: number\n}\n\n/**\n * AxAIGoogleGeminiEmbedRequest: Structure for making an embedding request to the Google Gemini API.\n */\nexport type AxAIGoogleGeminiBatchEmbedRequest = {\n requests: {\n model: string\n content: {\n parts: { text: string }[]\n }\n }[]\n}\n\n/**\n * AxAIGoogleGeminiEmbedResponse: Structure for handling responses from the Google Gemini API embedding requests.\n */\nexport type AxAIGoogleGeminiBatchEmbedResponse = {\n embeddings: {\n values: number[]\n }[]\n}\n\n/**\n * AxAIGoogleVertexBatchEmbedRequest: Structure for making an embedding request to the Google Vertex API.\n */\nexport type AxAIGoogleVertexBatchEmbedRequest = {\n instances: {\n content: string\n }[]\n}\n\n/**\n * AxAIGoogleVertexBatchEmbedResponse: Structure for handling responses from the Google Vertex API embedding requests.\n */\nexport type AxAIGoogleVertexBatchEmbedResponse = {\n predictions: {\n embeddings: {\n values: number[]\n }\n }[]\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIGoogleGeminiModel } from './types.js'\n\n/**\n * AxAIGoogleGemini: Model information\n */\nexport const axModelInfoGoogleGemini: AxModelInfo[] = [\n {\n name: AxAIGoogleGeminiModel.Gemini20Pro,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.0,\n completionTokenCostPer1M: 0.0,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini20Flash,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.01,\n completionTokenCostPer1M: 0.4,\n },\n\n {\n name: AxAIGoogleGeminiModel.Gemini20FlashLite,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.0,\n completionTokenCostPer1M: 0.0,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini20FlashThinking,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.0,\n completionTokenCostPer1M: 0.0,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini15Flash,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.075,\n completionTokenCostPer1M: 0.3,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini15Flash8B,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.0375,\n completionTokenCostPer1M: 0.15,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini15Pro,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 1.25,\n completionTokenCostPer1M: 5.0,\n },\n {\n name: AxAIGoogleGeminiModel.Gemini1Pro,\n currency: 'usd',\n characterIsToken: false,\n promptTokenCostPer1M: 0.5,\n completionTokenCostPer1M: 1.5,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport { GoogleVertexAuth } from '../google-vertex/auth.js'\nimport type {\n AxAIInputModelList,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatResponse,\n AxChatResponseResult,\n AxEmbedResponse,\n AxInternalChatRequest,\n AxInternalEmbedRequest,\n AxModelConfig,\n AxTokenUsage,\n} from '../types.js'\n\nimport { axModelInfoGoogleGemini } from './info.js'\nimport {\n type AxAIGoogleGeminiBatchEmbedRequest,\n type AxAIGoogleGeminiBatchEmbedResponse,\n type AxAIGoogleGeminiChatRequest,\n type AxAIGoogleGeminiChatResponse,\n type AxAIGoogleGeminiChatResponseDelta,\n type AxAIGoogleGeminiConfig,\n AxAIGoogleGeminiEmbedModel,\n AxAIGoogleGeminiModel,\n AxAIGoogleGeminiSafetyCategory,\n type AxAIGoogleGeminiSafetySettings,\n AxAIGoogleGeminiSafetyThreshold,\n type AxAIGoogleVertexBatchEmbedRequest,\n type AxAIGoogleVertexBatchEmbedResponse,\n} from './types.js'\n\nconst safetySettings: AxAIGoogleGeminiSafetySettings = [\n {\n category: AxAIGoogleGeminiSafetyCategory.HarmCategoryHarassment,\n threshold: AxAIGoogleGeminiSafetyThreshold.BlockNone,\n },\n {\n category: AxAIGoogleGeminiSafetyCategory.HarmCategoryHateSpeech,\n threshold: AxAIGoogleGeminiSafetyThreshold.BlockNone,\n },\n {\n category: AxAIGoogleGeminiSafetyCategory.HarmCategorySexuallyExplicit,\n threshold: AxAIGoogleGeminiSafetyThreshold.BlockNone,\n },\n {\n category: AxAIGoogleGeminiSafetyCategory.HarmCategoryDangerousContent,\n threshold: AxAIGoogleGeminiSafetyThreshold.BlockNone,\n },\n]\n\n/**\n * AxAIGoogleGemini: Default Model options for text generation\n */\nexport const axAIGoogleGeminiDefaultConfig = (): AxAIGoogleGeminiConfig =>\n structuredClone({\n model: AxAIGoogleGeminiModel.Gemini20Flash,\n embedModel: AxAIGoogleGeminiEmbedModel.TextEmbedding004,\n safetySettings,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIGoogleGeminiDefaultCreativeConfig =\n (): AxAIGoogleGeminiConfig =>\n structuredClone({\n model: AxAIGoogleGeminiModel.Gemini20Flash,\n embedModel: AxAIGoogleGeminiEmbedModel.TextEmbedding004,\n safetySettings,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport interface AxAIGoogleGeminiOptionsTools {\n codeExecution?: boolean\n googleSearchRetrieval?: {\n mode?: 'MODE_DYNAMIC'\n dynamicThreshold?: number\n }\n googleSearch?: boolean\n}\n\nexport interface AxAIGoogleGeminiArgs {\n name: 'google-gemini'\n apiKey?: string\n projectId?: string\n region?: string\n endpointId?: string\n config?: Readonly<Partial<AxAIGoogleGeminiConfig>>\n options?: Readonly<AxAIServiceOptions & AxAIGoogleGeminiOptionsTools>\n models?: AxAIInputModelList<AxAIGoogleGeminiModel>\n}\n\nclass AxAIGoogleGeminiImpl\n implements\n AxAIServiceImpl<\n AxAIGoogleGeminiModel,\n AxAIGoogleGeminiEmbedModel,\n AxAIGoogleGeminiChatRequest,\n AxAIGoogleGeminiBatchEmbedRequest | AxAIGoogleVertexBatchEmbedRequest,\n AxAIGoogleGeminiChatResponse,\n AxAIGoogleGeminiChatResponseDelta,\n AxAIGoogleGeminiBatchEmbedResponse | AxAIGoogleVertexBatchEmbedResponse\n >\n{\n constructor(\n private config: AxAIGoogleGeminiConfig,\n private isVertex: boolean,\n private endpointId?: string,\n private apiKey?: string,\n private options?: AxAIGoogleGeminiArgs['options']\n ) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n topK: config.topK,\n presencePenalty: config.presencePenalty,\n frequencyPenalty: config.frequencyPenalty,\n stopSequences: config.stopSequences,\n endSequences: config.endSequences,\n stream: config.stream,\n n: config.n,\n } as AxModelConfig\n }\n\n createChatReq = (\n req: Readonly<AxInternalChatRequest<AxAIGoogleGeminiModel>>\n ): [AxAPI, AxAIGoogleGeminiChatRequest] => {\n const model = req.model\n const stream = req.modelConfig?.stream ?? this.config.stream\n\n if (!req.chatPrompt || req.chatPrompt.length === 0) {\n throw new Error('Chat prompt is empty')\n }\n\n let apiConfig\n if (this.endpointId) {\n apiConfig = {\n name: stream\n ? `/${this.endpointId}:streamGenerateContent?alt=sse`\n : `/${this.endpointId}:generateContent`,\n }\n } else {\n apiConfig = {\n name: stream\n ? `/models/${model}:streamGenerateContent?alt=sse`\n : `/models/${model}:generateContent`,\n }\n }\n\n if (!this.isVertex) {\n const pf = stream ? '&' : '?'\n apiConfig.name += `${pf}key=${this.apiKey}`\n }\n\n const systemPrompts = req.chatPrompt\n .filter((p) => p.role === 'system')\n .map((p) => p.content)\n\n const systemInstruction =\n systemPrompts.length > 0\n ? {\n role: 'user' as const,\n parts: [{ text: systemPrompts.join(' ') }],\n }\n : undefined\n\n const contents: AxAIGoogleGeminiChatRequest['contents'] = req.chatPrompt\n .filter((p) => p.role !== 'system')\n .map((msg, i) => {\n switch (msg.role) {\n case 'user': {\n const parts: Extract<\n AxAIGoogleGeminiChatRequest['contents'][0],\n { role: 'user' }\n >['parts'] = Array.isArray(msg.content)\n ? msg.content.map((c, i) => {\n switch (c.type) {\n case 'text':\n return { text: c.text }\n case 'image':\n return {\n inlineData: { mimeType: c.mimeType, data: c.image },\n }\n default:\n throw new Error(\n `Chat prompt content type not supported (index: ${i})`\n )\n }\n })\n : [{ text: msg.content }]\n return {\n role: 'user' as const,\n parts,\n }\n }\n\n case 'assistant': {\n let parts: Extract<\n AxAIGoogleGeminiChatRequest['contents'][0],\n { role: 'model' }\n >['parts'] = []\n\n if (msg.functionCalls) {\n parts = msg.functionCalls.map((f) => {\n const args =\n typeof f.function.params === 'string'\n ? JSON.parse(f.function.params)\n : f.function.params\n return {\n functionCall: {\n name: f.function.name,\n args: args,\n },\n }\n })\n\n if (!parts) {\n throw new Error('Function call is empty')\n }\n\n return {\n role: 'model' as const,\n parts,\n }\n }\n\n if (!msg.content) {\n throw new Error('Assistant content is empty')\n }\n\n parts = [{ text: msg.content }]\n return {\n role: 'model' as const,\n parts,\n }\n }\n\n case 'function': {\n if (!('functionId' in msg)) {\n throw new Error(`Chat prompt functionId is empty (index: ${i})`)\n }\n const parts: Extract<\n AxAIGoogleGeminiChatRequest['contents'][0],\n { role: 'function' }\n >['parts'] = [\n {\n functionResponse: {\n name: msg.functionId,\n response: { result: msg.result },\n },\n },\n ]\n\n return {\n role: 'function' as const,\n parts,\n }\n }\n\n default:\n throw new Error('Invalid role')\n }\n })\n\n let tools: AxAIGoogleGeminiChatRequest['tools'] | undefined = []\n\n if (req.functions && req.functions.length > 0) {\n tools.push({ function_declarations: req.functions })\n }\n\n if (this.options?.codeExecution) {\n tools.push({ code_execution: {} })\n }\n\n if (this.options?.googleSearchRetrieval) {\n tools.push({\n google_search_retrieval: {\n dynamic_retrieval_config: this.options.googleSearchRetrieval,\n },\n })\n }\n\n if (tools.length === 0) {\n tools = undefined\n }\n\n let toolConfig\n\n if (req.functionCall) {\n if (req.functionCall === 'none') {\n toolConfig = { function_calling_config: { mode: 'NONE' as const } }\n } else if (req.functionCall === 'auto') {\n toolConfig = { function_calling_config: { mode: 'AUTO' as const } }\n } else if (req.functionCall === 'required') {\n toolConfig = {\n function_calling_config: { mode: 'ANY' as const },\n }\n } else {\n const allowedFunctionNames = req.functionCall.function?.name\n ? {\n allowedFunctionNames: [req.functionCall.function.name],\n }\n : {}\n toolConfig = {\n function_calling_config: { mode: 'ANY' as const },\n ...allowedFunctionNames,\n }\n }\n } else if (tools && tools.length > 0) {\n toolConfig = { function_calling_config: { mode: 'AUTO' as const } }\n }\n\n const generationConfig = {\n maxOutputTokens: req.modelConfig?.maxTokens ?? this.config.maxTokens,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n topP: req.modelConfig?.topP ?? this.config.topP,\n topK: req.modelConfig?.topK ?? this.config.topK,\n frequencyPenalty:\n req.modelConfig?.frequencyPenalty ?? this.config.frequencyPenalty,\n candidateCount: 1,\n stopSequences:\n req.modelConfig?.stopSequences ?? this.config.stopSequences,\n responseMimeType: 'text/plain',\n }\n\n const safetySettings = this.config.safetySettings\n\n const reqValue: AxAIGoogleGeminiChatRequest = {\n contents,\n tools,\n toolConfig,\n systemInstruction,\n generationConfig,\n safetySettings,\n }\n\n return [apiConfig, reqValue]\n }\n\n createEmbedReq = (\n req: Readonly<AxInternalEmbedRequest<AxAIGoogleGeminiEmbedModel>>\n ): [\n AxAPI,\n AxAIGoogleGeminiBatchEmbedRequest | AxAIGoogleVertexBatchEmbedRequest,\n ] => {\n const model = req.embedModel\n\n if (!model) {\n throw new Error('Embed model not set')\n }\n\n if (!req.texts || req.texts.length === 0) {\n throw new Error('Embed texts is empty')\n }\n\n let apiConfig\n let reqValue:\n | AxAIGoogleGeminiBatchEmbedRequest\n | AxAIGoogleVertexBatchEmbedRequest\n\n if (this.isVertex) {\n if (this.endpointId) {\n apiConfig = {\n name: `/${this.endpointId}:predict`,\n }\n } else {\n apiConfig = {\n name: `/models/${model}:predict`,\n }\n }\n\n reqValue = {\n instances: req.texts.map((text) => ({\n content: text,\n })),\n }\n } else {\n apiConfig = {\n name: `/models/${model}:batchEmbedContents?key=${this.apiKey}`,\n }\n\n reqValue = {\n requests: req.texts.map((text) => ({\n model: 'models/' + model,\n content: { parts: [{ text }] },\n outputDimensionality: this.config.dimensions,\n taskType: this.config.embedType,\n })),\n }\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (\n resp: Readonly<AxAIGoogleGeminiChatResponse>\n ): AxChatResponse => {\n const results: AxChatResponseResult[] = resp.candidates?.map(\n (candidate) => {\n const result: AxChatResponseResult = {}\n\n switch (candidate.finishReason) {\n case 'MAX_TOKENS':\n result.finishReason = 'length'\n break\n case 'STOP':\n result.finishReason = 'stop'\n break\n case 'SAFETY':\n throw new Error('Finish reason: SAFETY')\n case 'RECITATION':\n throw new Error('Finish reason: RECITATION')\n case 'MALFORMED_FUNCTION_CALL':\n throw new Error('Finish reason: MALFORMED_FUNCTION_CALL')\n }\n\n if (!candidate.content || !candidate.content.parts) {\n return result\n }\n\n for (const part of candidate.content.parts) {\n if ('text' in part) {\n result.content = part.text\n continue\n }\n if ('functionCall' in part) {\n result.functionCalls = [\n {\n id: part.functionCall.name,\n type: 'function',\n function: {\n name: part.functionCall.name,\n params: part.functionCall.args,\n },\n },\n ]\n }\n }\n return result\n }\n )\n\n let modelUsage: AxTokenUsage | undefined\n if (resp.usageMetadata) {\n modelUsage = {\n totalTokens: resp.usageMetadata.totalTokenCount,\n promptTokens: resp.usageMetadata.promptTokenCount,\n completionTokens: resp.usageMetadata.candidatesTokenCount,\n }\n }\n return {\n results,\n modelUsage,\n }\n }\n\n createChatStreamResp = (\n resp: Readonly<AxAIGoogleGeminiChatResponseDelta>\n ): AxChatResponse => {\n return this.createChatResp(resp)\n }\n\n createEmbedResp = (\n resp: Readonly<\n AxAIGoogleGeminiBatchEmbedResponse | AxAIGoogleVertexBatchEmbedResponse\n >\n ): AxEmbedResponse => {\n let embeddings: number[][]\n if (this.isVertex) {\n embeddings = (resp as AxAIGoogleVertexBatchEmbedResponse).predictions.map(\n (prediction) => prediction.embeddings.values\n )\n } else {\n embeddings = (resp as AxAIGoogleGeminiBatchEmbedResponse).embeddings.map(\n (embedding) => embedding.values\n )\n }\n\n return {\n embeddings,\n }\n }\n}\n\n/**\n * AxAIGoogleGemini: AI Service\n */\nexport class AxAIGoogleGemini extends AxBaseAI<\n AxAIGoogleGeminiModel,\n AxAIGoogleGeminiEmbedModel,\n AxAIGoogleGeminiChatRequest,\n AxAIGoogleGeminiBatchEmbedRequest | AxAIGoogleVertexBatchEmbedRequest,\n AxAIGoogleGeminiChatResponse,\n AxAIGoogleGeminiChatResponseDelta,\n AxAIGoogleGeminiBatchEmbedResponse | AxAIGoogleVertexBatchEmbedResponse\n> {\n constructor({\n apiKey,\n projectId,\n region,\n endpointId,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIGoogleGeminiArgs, 'name'>>) {\n const isVertex = projectId !== undefined && region !== undefined\n\n let apiURL\n let headers\n\n if (isVertex) {\n let path\n if (endpointId) {\n path = 'endpoints'\n } else {\n path = 'publishers/google'\n }\n\n apiURL = `https://${region}-aiplatform.googleapis.com/v1/projects/${projectId}/locations/${region}/${path}`\n if (apiKey) {\n headers = async () => ({ Authorization: `Bearer ${apiKey}` })\n } else {\n const vertexAuth = new GoogleVertexAuth()\n headers = async () => ({\n Authorization: `Bearer ${await vertexAuth.getAccessToken()}`,\n })\n }\n } else {\n if (!apiKey) {\n throw new Error('GoogleGemini AI API key not set')\n }\n apiURL = 'https://generativelanguage.googleapis.com/v1beta'\n headers = async () => ({})\n }\n\n const _config = {\n ...axAIGoogleGeminiDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAIGoogleGeminiImpl(\n _config,\n isVertex,\n endpointId,\n apiKey,\n options\n )\n\n super(aiImpl, {\n name: 'GoogleGeminiAI',\n apiURL,\n headers,\n modelInfo: axModelInfoGoogleGemini,\n defaults: {\n model: _config.model as AxAIGoogleGeminiModel,\n embedModel: _config.embedModel as AxAIGoogleGeminiEmbedModel,\n },\n options,\n supportFor: { functions: true, streaming: true },\n models,\n })\n }\n}\n","import { ColorLog } from './log.js'\n\nconst colorLog = new ColorLog()\n\nexport interface AxRateLimiterTokenUsageOptions {\n debug?: boolean\n}\n\nexport class AxRateLimiterTokenUsage {\n private options?: Readonly<AxRateLimiterTokenUsageOptions>\n private maxTokens: number\n private refillRate: number\n private currentTokens: number\n private lastRefillTime: number\n\n constructor(\n maxTokens: number,\n refillRate: number,\n options?: Readonly<AxRateLimiterTokenUsageOptions>\n ) {\n this.maxTokens = maxTokens\n this.refillRate = refillRate\n this.currentTokens = maxTokens\n this.lastRefillTime = Date.now()\n this.options = options\n }\n\n private refillTokens() {\n const now = Date.now()\n const timeElapsed = (now - this.lastRefillTime) / 1000 // Convert ms to seconds\n const tokensToAdd = timeElapsed * this.refillRate\n this.currentTokens = Math.min(\n this.maxTokens,\n this.currentTokens + tokensToAdd\n )\n this.lastRefillTime = now\n }\n\n private async waitUntilTokensAvailable(tokens: number): Promise<void> {\n this.refillTokens()\n if (this.currentTokens >= tokens) {\n this.currentTokens -= tokens\n return\n }\n if (this.options?.debug) {\n console.log(\n colorLog.red(\n `Rate limiter: Waiting for ${tokens - this.currentTokens} tokens`\n )\n )\n }\n await new Promise((resolve) => setTimeout(resolve, 100)) // Wait for 100ms before checking again\n return this.waitUntilTokensAvailable(tokens) // Recursive call\n }\n\n public async acquire(tokens: number): Promise<void> {\n await this.waitUntilTokensAvailable(tokens)\n }\n}\n\n/**\n * Example usage of the rate limiter. Limits to 5800 tokens per minute.\nconst rateLimiter = new AxRateLimiterTokenUsage(5800, 5800 / 60);\n\nconst axRateLimiterFunction = async (func, info) => {\n const totalTokens = info.modelUsage?.totalTokens || 0;\n await rateLimiter.acquire(totalTokens);\n return func();\n};\n**/\n","export enum AxAIGroqModel {\n Llama3_8B = 'llama3-8b-8192',\n Llama33_70B = 'llama-3.3-70b-versatile',\n Mixtral_8x7B = 'mixtral-8x7b-32768',\n Gemma2_9B = 'gemma2-9b-it',\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIGroqModel } from './types.js'\n\n/**\n * AxAIGroq: Model information\n */\nexport const axModelInfoGroq: AxModelInfo[] = [\n {\n name: AxAIGroqModel.Gemma2_9B,\n currency: 'usd',\n characterIsToken: true,\n promptTokenCostPer1M: 0.2,\n completionTokenCostPer1M: 0.2,\n },\n {\n name: AxAIGroqModel.Llama33_70B,\n currency: 'usd',\n characterIsToken: true,\n promptTokenCostPer1M: 0.59,\n completionTokenCostPer1M: 0.79,\n },\n {\n name: AxAIGroqModel.Llama3_8B,\n currency: 'usd',\n characterIsToken: true,\n promptTokenCostPer1M: 0.05,\n completionTokenCostPer1M: 0.08,\n },\n {\n name: AxAIGroqModel.Mixtral_8x7B,\n currency: 'usd',\n characterIsToken: true,\n promptTokenCostPer1M: 0.24,\n completionTokenCostPer1M: 0.24,\n },\n]\n","import { AxRateLimiterTokenUsage } from '../../util/rate-limit.js'\nimport { axBaseAIDefaultConfig } from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\nimport type { AxAIServiceOptions, AxRateLimiterFunction } from '../types.js'\n\nimport { axModelInfoGroq } from './info.js'\nimport { AxAIGroqModel } from './types.js'\n\ntype AxAIGroqAIConfig = AxAIOpenAIConfig<AxAIGroqModel, undefined>\n\nconst axAIGroqDefaultConfig = (): AxAIGroqAIConfig =>\n structuredClone({\n model: AxAIGroqModel.Llama33_70B,\n ...axBaseAIDefaultConfig(),\n })\n\nexport type AxAIGroqArgs = AxAIOpenAIArgs<'groq', AxAIGroqModel, undefined> & {\n options?: Readonly<AxAIServiceOptions> & { tokensPerMinute?: number }\n}\n\nexport class AxAIGroq extends AxAIOpenAIBase<AxAIGroqModel, undefined> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIGroqArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Groq API key not set')\n }\n const _config = {\n ...axAIGroqDefaultConfig(),\n ...config,\n }\n\n const _options = {\n ...options,\n streamingUsage: false,\n }\n\n super({\n apiKey,\n config: _config,\n options: _options,\n modelInfo: axModelInfoGroq,\n apiURL: 'https://api.groq.com/openai/v1',\n models,\n })\n\n super.setName('Groq')\n this.setOptions(_options)\n }\n\n override setOptions = (options: Readonly<AxAIServiceOptions>) => {\n const rateLimiter = this.newRateLimiter(options)\n super.setOptions({ ...options, rateLimiter })\n }\n\n private newRateLimiter = (options: Readonly<AxAIGroqArgs['options']>) => {\n if (options?.rateLimiter) {\n return options.rateLimiter\n }\n\n const tokensPerMin = options?.tokensPerMinute ?? 4800\n const rt = new AxRateLimiterTokenUsage(tokensPerMin, tokensPerMin / 60, {\n debug: options?.debug,\n })\n\n const rtFunc: AxRateLimiterFunction = async (func, info) => {\n const totalTokens = info.modelUsage?.totalTokens || 0\n await rt.acquire(totalTokens)\n return await func()\n }\n\n return rtFunc\n }\n}\n","import type { AxModelInfo } from '../types.js'\n\n/**\n * HuggingFace: Model information\n */\nexport const axModelInfoHuggingFace: AxModelInfo[] = []\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIHuggingFaceModel {\n MetaLlama270BChatHF = 'meta-llama/Llama-2-70b-chat-hf',\n}\n\nexport type AxAIHuggingFaceConfig = AxModelConfig & {\n model: AxAIHuggingFaceModel\n returnFullText?: boolean\n doSample?: boolean\n maxTime?: number\n useCache?: boolean\n waitForModel?: boolean\n}\n\nexport type AxAIHuggingFaceRequest = {\n model: AxAIHuggingFaceModel\n inputs: string\n parameters: {\n max_new_tokens?: number\n repetition_penalty?: number\n temperature?: number\n top_p?: number\n top_k?: number\n return_full_text?: boolean\n num_return_sequences?: number\n do_sample?: boolean\n max_time?: number\n }\n options?: {\n use_cache?: boolean\n wait_for_model?: boolean\n }\n}\n\nexport type AxAIHuggingFaceResponse = {\n generated_text: string\n}\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport type {\n AxAIInputModelList,\n AxAIPromptConfig,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatResponse,\n AxInternalChatRequest,\n AxModelConfig,\n} from '../types.js'\n\nimport { axModelInfoHuggingFace } from './info.js'\nimport {\n type AxAIHuggingFaceConfig,\n AxAIHuggingFaceModel,\n type AxAIHuggingFaceRequest,\n type AxAIHuggingFaceResponse,\n} from './types.js'\n\nexport const axAIHuggingFaceDefaultConfig = (): AxAIHuggingFaceConfig =>\n structuredClone({\n model: AxAIHuggingFaceModel.MetaLlama270BChatHF,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIHuggingFaceCreativeConfig = (): AxAIHuggingFaceConfig =>\n structuredClone({\n model: AxAIHuggingFaceModel.MetaLlama270BChatHF,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport interface AxAIHuggingFaceArgs {\n name: 'huggingface'\n apiKey: string\n config?: Readonly<Partial<AxAIHuggingFaceConfig>>\n options?: Readonly<AxAIServiceOptions>\n models?: AxAIInputModelList<AxAIHuggingFaceModel>\n}\n\nclass AxAIHuggingFaceImpl\n implements\n AxAIServiceImpl<\n AxAIHuggingFaceModel,\n unknown,\n AxAIHuggingFaceRequest,\n unknown,\n AxAIHuggingFaceResponse,\n unknown,\n unknown\n >\n{\n constructor(private config: AxAIHuggingFaceConfig) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n topP: config.topP,\n topK: config.topK,\n n: config.n,\n presencePenalty: config.presencePenalty,\n } as AxModelConfig\n }\n\n createChatReq = (\n req: Readonly<AxInternalChatRequest<AxAIHuggingFaceModel>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _config: Readonly<AxAIPromptConfig>\n ): [AxAPI, AxAIHuggingFaceRequest] => {\n const model = req.model\n\n const functionsList = req.functions\n ? `Functions:\\n${JSON.stringify(req.functions, null, 2)}\\n`\n : ''\n\n const prompt = req.chatPrompt\n ?.map((msg) => {\n switch (msg.role) {\n case 'user':\n return `User: ${msg.content}`\n case 'system':\n return `System: ${msg.content}`\n case 'function':\n return `Function Result: ${msg.result}`\n case 'assistant': {\n const fc = msg.functionCalls\n ?.map((fc) => {\n const args =\n typeof fc.function.params === 'string'\n ? fc.function.params\n : JSON.stringify(fc.function.params)\n\n return `${fc.function.name}(${args})`\n })\n .join('\\n')\n if (fc) {\n return `Assistant: ${msg.content}\\n Functions:\\n${fc}`\n }\n return `Assistant: ${msg.content}`\n }\n default:\n throw new Error(`Unknown role`)\n }\n\n //return `${msg.role}: ${msg.content}`;\n })\n .join('\\n')\n\n const inputs = `${functionsList} ${prompt}`.trim()\n\n const apiConfig = {\n name: '/models',\n }\n\n const reqValue: AxAIHuggingFaceRequest = {\n model,\n inputs,\n parameters: {\n max_new_tokens: req.modelConfig?.maxTokens ?? this.config.maxTokens,\n repetition_penalty:\n req.modelConfig?.presencePenalty ?? this.config.presencePenalty,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n top_p: req.modelConfig?.topP ?? this.config.topP,\n top_k: req.modelConfig?.topK ?? this.config.topK,\n return_full_text: this.config.returnFullText,\n num_return_sequences: this.config.n,\n do_sample: this.config.doSample,\n max_time: this.config.maxTime,\n },\n options: {\n use_cache: this.config.useCache,\n wait_for_model: this.config.waitForModel,\n },\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (\n resp: Readonly<AxAIHuggingFaceResponse>\n ): AxChatResponse => {\n return {\n results: [\n {\n content: resp.generated_text,\n },\n ],\n }\n }\n}\n\nexport class AxAIHuggingFace extends AxBaseAI<\n AxAIHuggingFaceModel,\n unknown,\n AxAIHuggingFaceRequest,\n unknown,\n AxAIHuggingFaceResponse,\n unknown,\n unknown\n> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIHuggingFaceArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('HuggingFace API key not set')\n }\n const _config = {\n ...axAIHuggingFaceDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAIHuggingFaceImpl(_config)\n\n super(aiImpl, {\n name: 'HuggingFace',\n apiURL: 'https://api-inference.huggingface.co',\n headers: async () => ({ Authorization: `Bearer ${apiKey}` }),\n modelInfo: axModelInfoHuggingFace,\n defaults: { model: _config.model },\n options,\n supportFor: { functions: false, streaming: false },\n models,\n })\n }\n}\n","// cspell:ignore mistral, mixtral, codestral, nemo\n\nexport enum AxAIMistralModel {\n Mistral7B = 'open-mistral-7b',\n Mistral8x7B = 'open-mixtral-8x7b',\n MistralSmall = 'mistral-small-latest',\n MistralNemo = 'mistral-nemo-latest',\n MistralLarge = 'mistral-large-latest',\n Codestral = 'codestral-latest',\n OpenCodestralMamba = 'open-codestral-mamba',\n OpenMistralNemo = 'open-mistral-nemo-latest',\n}\n\nexport enum AxAIMistralEmbedModels {\n MistralEmbed = 'mistral-embed',\n}\n","// cspell:ignore mistral, mixtral, codestral, nemo\n\nimport type { AxModelInfo } from '../types.js'\n\nimport { AxAIMistralModel } from './types.js'\n\nexport const axModelInfoMistral: AxModelInfo[] = [\n {\n name: AxAIMistralModel.Mistral7B,\n currency: 'USD',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 0.25,\n },\n {\n name: AxAIMistralModel.Mistral8x7B,\n currency: 'USD',\n promptTokenCostPer1M: 0.7,\n completionTokenCostPer1M: 0.7,\n },\n {\n name: AxAIMistralModel.MistralNemo,\n currency: 'USD',\n promptTokenCostPer1M: 0.15,\n completionTokenCostPer1M: 0.15,\n },\n {\n name: AxAIMistralModel.MistralSmall,\n currency: 'USD',\n promptTokenCostPer1M: 0.2,\n completionTokenCostPer1M: 0.6,\n },\n {\n name: AxAIMistralModel.MistralLarge,\n currency: 'USD',\n promptTokenCostPer1M: 2,\n completionTokenCostPer1M: 6,\n },\n {\n name: AxAIMistralModel.Codestral,\n currency: 'USD',\n promptTokenCostPer1M: 0.2,\n completionTokenCostPer1M: 0.6,\n },\n {\n name: AxAIMistralModel.OpenCodestralMamba,\n currency: 'USD',\n promptTokenCostPer1M: 0.25,\n completionTokenCostPer1M: 0.25,\n },\n {\n name: AxAIMistralModel.OpenMistralNemo,\n currency: 'USD',\n promptTokenCostPer1M: 0.3,\n completionTokenCostPer1M: 0.3,\n },\n]\n","import { axBaseAIDefaultConfig } from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\nimport type { AxAIServiceOptions } from '../types.js'\n\nimport { axModelInfoMistral } from './info.js'\nimport { AxAIMistralEmbedModels, AxAIMistralModel } from './types.js'\n\ntype AxAIMistralConfig = AxAIOpenAIConfig<\n AxAIMistralModel,\n AxAIMistralEmbedModels\n>\n\nexport const axAIMistralDefaultConfig = (): AxAIMistralConfig =>\n structuredClone({\n model: AxAIMistralModel.MistralSmall,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIMistralBestConfig = (): AxAIMistralConfig =>\n structuredClone({\n ...axAIMistralDefaultConfig(),\n model: AxAIMistralModel.MistralLarge,\n })\n\nexport type AxAIMistralArgs = AxAIOpenAIArgs<\n 'mistral',\n AxAIMistralModel,\n AxAIMistralEmbedModels\n> & {\n options?: Readonly<AxAIServiceOptions> & { tokensPerMinute?: number }\n}\n\nexport class AxAIMistral extends AxAIOpenAIBase<\n AxAIMistralModel,\n AxAIMistralEmbedModels\n> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAIMistralArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Mistral API key not set')\n }\n const _config = {\n ...axAIMistralDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n config: _config,\n options,\n apiURL: 'https://api.mistral.ai/v1',\n modelInfo: axModelInfoMistral,\n models,\n })\n\n super.setName('Mistral')\n }\n}\n","import {\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\n\nexport type AxAIOllamaAIConfig = AxAIOpenAIConfig<string, string>\n\nexport const axAIOllamaDefaultConfig = (): AxAIOllamaAIConfig =>\n structuredClone({\n ...axBaseAIDefaultConfig(),\n model: 'nous-hermes2',\n embedModel: 'all-minilm',\n })\n\nexport const axAIOllamaDefaultCreativeConfig = (): AxAIOllamaAIConfig =>\n structuredClone({\n ...axBaseAIDefaultCreativeConfig(),\n model: 'nous-hermes2',\n embedModel: 'all-minilm',\n })\n\nexport type AxAIOllamaArgs = AxAIOpenAIArgs<'ollama', string, string> & {\n model?: string\n embedModel?: string\n url?: string\n}\n\n/**\n * OllamaAI: AI Service\n */\nexport class AxAIOllama extends AxAIOpenAIBase<string, string> {\n constructor({\n apiKey = 'not-set',\n url = 'http://localhost:11434/v1',\n config,\n options,\n models,\n }: Readonly<Omit<AxAIOllamaArgs, 'name'>>) {\n const _config = {\n ...axAIOllamaDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n options,\n config: _config,\n apiURL: url,\n models,\n modelInfo: [],\n })\n\n super.setName('Ollama')\n }\n}\n","import type { AxModelConfig } from '../types.js'\n\nexport enum AxAIRekaModel {\n RekaCore = 'reka-core',\n RekaFlash = 'reka-flash',\n RekaEdge = 'reka-edge',\n}\n\nexport type AxAIRekaConfig = Omit<AxModelConfig, 'topK'> & {\n model: AxAIRekaModel\n stop?: readonly string[]\n useSearchEngine?: boolean\n}\n\nexport type AxAIRekaUsage = {\n input_tokens: number\n output_tokens: number\n}\n\nexport type AxAIRekaChatRequest = {\n model: string\n messages: (\n | {\n role: 'user'\n content:\n | string\n | {\n type: 'text'\n text: string\n }[]\n }\n | {\n role: 'assistant'\n content:\n | string\n | {\n type: 'text'\n text: string\n }[]\n }\n )[]\n usage?: AxAIRekaUsage\n response_format?: { type: string }\n max_tokens: number\n temperature?: number\n top_p?: number\n top_k?: number\n stream?: boolean\n stop?: readonly string[]\n presence_penalty?: number\n frequency_penalty?: number\n use_search_engine?: boolean\n}\n\nexport type AxAIRekaChatResponse = {\n id: string\n model: string\n responses: {\n message: {\n content:\n | string\n | {\n type: 'text'\n text: string\n }\n }\n finish_reason: 'stop' | 'length' | 'context'\n }[]\n usage?: AxAIRekaUsage\n}\n\nexport type AxAIRekaChatResponseDelta = {\n id: string\n model: string\n responses: {\n chunk: AxAIRekaChatResponse['responses'][0]['message']\n finish_reason: AxAIRekaChatResponse['responses'][0]['finish_reason']\n }[]\n usage?: AxAIRekaUsage\n}\n","import type { AxModelInfo } from '../types.js'\n\nimport { AxAIRekaModel } from './types.js'\n/**\n * OpenAI: Model information\n */\nexport const axModelInfoReka: AxModelInfo[] = [\n {\n name: AxAIRekaModel.RekaCore,\n currency: 'usd',\n promptTokenCostPer1M: 3,\n completionTokenCostPer1M: 15,\n },\n {\n name: AxAIRekaModel.RekaFlash,\n currency: 'usd',\n promptTokenCostPer1M: 0.8,\n completionTokenCostPer1M: 2,\n },\n {\n name: AxAIRekaModel.RekaEdge,\n currency: 'usd',\n promptTokenCostPer1M: 0.4,\n completionTokenCostPer1M: 1,\n },\n]\n","import type { AxAPI } from '../../util/apicall.js'\nimport {\n AxBaseAI,\n axBaseAIDefaultConfig,\n axBaseAIDefaultCreativeConfig,\n} from '../base.js'\nimport type {\n AxAIInputModelList,\n AxAIPromptConfig,\n AxAIServiceImpl,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxInternalChatRequest,\n AxModelConfig,\n AxModelInfo,\n} from '../types.js'\n\nimport { axModelInfoReka } from './info.js'\nimport {\n type AxAIRekaChatRequest,\n type AxAIRekaChatResponse,\n type AxAIRekaChatResponseDelta,\n type AxAIRekaConfig,\n AxAIRekaModel,\n} from './types.js'\n\nexport const axAIRekaDefaultConfig = (): AxAIRekaConfig =>\n structuredClone({\n model: AxAIRekaModel.RekaCore,\n ...axBaseAIDefaultConfig(),\n })\n\nexport const axAIRekaBestConfig = (): AxAIRekaConfig =>\n structuredClone({\n ...axAIRekaDefaultConfig(),\n model: AxAIRekaModel.RekaCore,\n })\n\nexport const axAIRekaCreativeConfig = (): AxAIRekaConfig =>\n structuredClone({\n model: AxAIRekaModel.RekaCore,\n ...axBaseAIDefaultCreativeConfig(),\n })\n\nexport const axAIRekaFastConfig = (): AxAIRekaConfig => ({\n ...axAIRekaDefaultConfig(),\n model: AxAIRekaModel.RekaFlash,\n})\n\nexport interface AxAIRekaArgs {\n name: 'reka'\n apiKey: string\n apiURL?: string\n config?: Readonly<Partial<AxAIRekaConfig>>\n options?: Readonly<AxAIServiceOptions & { streamingUsage?: boolean }>\n modelInfo?: Readonly<AxModelInfo[]>\n models?: AxAIInputModelList<AxAIRekaModel>\n}\n\nclass AxAIRekaImpl\n implements\n AxAIServiceImpl<\n AxAIRekaModel,\n undefined,\n AxAIRekaChatRequest,\n unknown,\n AxAIRekaChatResponse,\n AxAIRekaChatResponseDelta,\n unknown\n >\n{\n constructor(private config: AxAIRekaConfig) {}\n\n getModelConfig(): AxModelConfig {\n const { config } = this\n return {\n maxTokens: config.maxTokens,\n temperature: config.temperature,\n presencePenalty: config.presencePenalty,\n frequencyPenalty: config.frequencyPenalty,\n stopSequences: config.stopSequences,\n topP: config.topP,\n n: config.n,\n stream: config.stream,\n }\n }\n\n createChatReq = (\n req: Readonly<AxInternalChatRequest<AxAIRekaModel>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _config: Readonly<AxAIPromptConfig>\n ): [AxAPI, AxAIRekaChatRequest] => {\n const model = req.model\n\n if (!req.chatPrompt || req.chatPrompt.length === 0) {\n throw new Error('Chat prompt is empty')\n }\n\n const apiConfig = {\n name: '/chat/completions',\n }\n\n const messages = createMessages(req)\n\n const frequencyPenalty =\n req.modelConfig?.frequencyPenalty ?? this.config.frequencyPenalty\n\n const stream = req.modelConfig?.stream ?? this.config.stream\n\n const reqValue: AxAIRekaChatRequest = {\n model,\n messages,\n max_tokens: req.modelConfig?.maxTokens ?? this.config.maxTokens ?? 500,\n temperature: req.modelConfig?.temperature ?? this.config.temperature,\n top_k: req.modelConfig?.n ?? this.config.n,\n top_p: req.modelConfig?.topP ?? this.config.topP ?? 1,\n stop: req.modelConfig?.stopSequences ?? this.config.stop,\n presence_penalty:\n req.modelConfig?.presencePenalty ?? this.config.presencePenalty,\n ...(frequencyPenalty ? { frequency_penalty: frequencyPenalty } : {}),\n ...(stream ? { stream: true } : {}),\n }\n\n return [apiConfig, reqValue]\n }\n\n createChatResp = (resp: Readonly<AxAIRekaChatResponse>): AxChatResponse => {\n const { id, usage, responses } = resp\n\n const modelUsage = usage\n ? {\n promptTokens: usage.input_tokens,\n completionTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n }\n : undefined\n\n const results = responses.map((res) => {\n const finishReason = mapFinishReason(res.finish_reason)\n let content\n if (typeof res.message.content === 'string') {\n content = res.message.content\n } else {\n content = res.message.content.text\n }\n\n return {\n id: `${id}`,\n content,\n finishReason,\n }\n })\n\n return {\n modelUsage,\n results,\n remoteId: id,\n }\n }\n\n createChatStreamResp = (\n resp: Readonly<AxAIRekaChatResponseDelta>\n ): AxChatResponse => {\n const { id, usage, responses } = resp\n\n const modelUsage = usage\n ? {\n promptTokens: usage.input_tokens,\n completionTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n }\n : undefined\n\n const results = responses.map((res) => {\n const finishReason = mapFinishReason(res.finish_reason)\n let content\n if (typeof res.chunk.content === 'string') {\n content = res.chunk.content\n } else {\n content = res.chunk.content.text\n }\n\n return {\n id: `${id}`,\n content,\n finishReason,\n }\n })\n\n return {\n results,\n modelUsage,\n }\n }\n}\n\nconst mapFinishReason = (\n finishReason: AxAIRekaChatResponse['responses'][0]['finish_reason']\n): AxChatResponseResult['finishReason'] => {\n switch (finishReason) {\n case 'stop':\n return 'stop' as const\n case 'context':\n return 'length' as const\n case 'length':\n return 'length' as const\n }\n}\n\nfunction createMessages(\n req: Readonly<AxChatRequest>\n): AxAIRekaChatRequest['messages'] {\n return req.chatPrompt.map((msg) => {\n switch (msg.role) {\n case 'system':\n return { role: 'user' as const, content: msg.content }\n\n case 'user':\n if (Array.isArray(msg.content)) {\n return {\n role: 'user' as const,\n content: msg.content.map((c) => {\n switch (c.type) {\n case 'text':\n return { type: 'text' as const, text: c.text }\n case 'image': {\n throw new Error('Image type not supported')\n }\n default:\n throw new Error('Invalid content type')\n }\n }),\n }\n }\n return { role: 'user' as const, content: msg.content }\n\n case 'assistant':\n if (Array.isArray(msg.content)) {\n return {\n role: 'assistant' as const,\n content: msg.content.map((c) => {\n switch (c.type) {\n case 'text':\n return { type: 'text' as const, text: c.text }\n case 'image': {\n throw new Error('Image type not supported')\n }\n default:\n throw new Error('Invalid content type')\n }\n }),\n }\n }\n if (!msg.content) {\n throw new Error('Assistant content is empty')\n }\n return { role: 'user' as const, content: msg.content }\n default:\n throw new Error('Invalid role')\n }\n })\n}\n\nexport class AxAIReka extends AxBaseAI<\n AxAIRekaModel,\n undefined,\n AxAIRekaChatRequest,\n unknown,\n AxAIRekaChatResponse,\n AxAIRekaChatResponseDelta,\n unknown\n> {\n constructor({\n apiKey,\n config,\n options,\n apiURL,\n modelInfo = axModelInfoReka,\n models,\n }: Readonly<Omit<AxAIRekaArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Reka API key not set')\n }\n const _config = {\n ...axAIRekaDefaultConfig(),\n ...config,\n }\n\n const aiImpl = new AxAIRekaImpl(_config)\n\n super(aiImpl, {\n name: 'Reka',\n apiURL: apiURL ? apiURL : 'https://api.reka.ai/v1/chat',\n headers: async () => ({ 'X-Api-Key': apiKey }),\n modelInfo,\n defaults: {\n model: _config.model,\n },\n options,\n supportFor: { functions: true, streaming: true },\n models,\n })\n }\n}\n","import type { AxModelInfo } from '../types.js'\n\nexport const axModelInfoTogether: AxModelInfo[] = []\n","import { axBaseAIDefaultConfig } from '../base.js'\nimport { type AxAIOpenAIArgs, AxAIOpenAIBase } from '../openai/api.js'\nimport type { AxAIOpenAIConfig } from '../openai/types.js'\n\nimport { axModelInfoTogether } from './info.js'\n\ntype TogetherAIConfig = AxAIOpenAIConfig<string, unknown>\n\nexport const axAITogetherDefaultConfig = (): TogetherAIConfig =>\n structuredClone({\n // cspell:disable-next-line\n model: 'mistralai/Mixtral-8x7B-Instruct-v0.1',\n ...axBaseAIDefaultConfig(),\n })\n\nexport type AxAITogetherArgs = AxAIOpenAIArgs<'together', string, unknown>\n\nexport class AxAITogether extends AxAIOpenAIBase<string, unknown> {\n constructor({\n apiKey,\n config,\n options,\n models,\n }: Readonly<Omit<AxAITogetherArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Together API key not set')\n }\n const _config = {\n ...axAITogetherDefaultConfig(),\n ...config,\n }\n super({\n apiKey,\n config: _config,\n options,\n apiURL: 'https://api.together.xyz/v1',\n modelInfo: axModelInfoTogether,\n models,\n })\n\n super.setName('Together')\n }\n}\n","import type { ReadableStream } from 'stream/web'\n\nimport { AxAIAnthropic, type AxAIAnthropicArgs } from './anthropic/api.js'\nimport type { AxAIAnthropicModel } from './anthropic/types.js'\nimport {\n AxAIAzureOpenAI,\n type AxAIAzureOpenAIArgs,\n} from './azure-openai/api.js'\nimport { AxAICohere, type AxAICohereArgs } from './cohere/api.js'\nimport type { AxAICohereEmbedModel, AxAICohereModel } from './cohere/types.js'\nimport { AxAIDeepSeek, type AxAIDeepSeekArgs } from './deepseek/api.js'\nimport type { AxAIDeepSeekModel } from './deepseek/types.js'\nimport {\n AxAIGoogleGemini,\n type AxAIGoogleGeminiArgs,\n} from './google-gemini/api.js'\nimport type {\n AxAIGoogleGeminiEmbedModel,\n AxAIGoogleGeminiModel,\n} from './google-gemini/types.js'\nimport { AxAIGroq, type AxAIGroqArgs } from './groq/api.js'\nimport type { AxAIGroqModel } from './groq/types.js'\nimport { AxAIHuggingFace, type AxAIHuggingFaceArgs } from './huggingface/api.js'\nimport type { AxAIHuggingFaceModel } from './huggingface/types.js'\nimport { AxAIMistral, type AxAIMistralArgs } from './mistral/api.js'\nimport type { AxAIMistralModel } from './mistral/types.js'\nimport { AxAIOllama, type AxAIOllamaArgs } from './ollama/api.js'\nimport {\n AxAIOpenAI,\n type AxAIOpenAIArgs as AxAIOpenAIArgs,\n} from './openai/api.js'\nimport type { AxAIOpenAIEmbedModel, AxAIOpenAIModel } from './openai/types.js'\nimport { AxAIReka, type AxAIRekaArgs } from './reka/api.js'\nimport { AxAITogether, type AxAITogetherArgs } from './together/api.js'\nimport type {\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n} from './types.js'\n\nexport type AxAIArgs =\n | AxAIOpenAIArgs\n | AxAIAzureOpenAIArgs\n | AxAITogetherArgs\n | AxAIAnthropicArgs\n | AxAIGroqArgs\n | AxAIGoogleGeminiArgs\n | AxAICohereArgs\n | AxAIHuggingFaceArgs\n | AxAIMistralArgs\n | AxAIDeepSeekArgs\n | AxAIOllamaArgs\n | AxAIRekaArgs\n\nexport type AxAIModels =\n | AxAIOpenAIModel\n | AxAIAnthropicModel\n | AxAIGroqModel\n | AxAIGoogleGeminiModel\n | AxAICohereModel\n | AxAIHuggingFaceModel\n | AxAIMistralModel\n | AxAIDeepSeekModel\n\nexport type AxAIEmbedModels =\n | AxAIOpenAIEmbedModel\n | AxAIGoogleGeminiEmbedModel\n | AxAICohereEmbedModel\n\nexport class AxAI implements AxAIService {\n private ai: AxAIService\n\n constructor(options: Readonly<AxAIArgs>) {\n switch (options.name) {\n case 'openai':\n this.ai = new AxAIOpenAI(options)\n break\n case 'azure-openai':\n this.ai = new AxAIAzureOpenAI(options)\n break\n case 'huggingface':\n this.ai = new AxAIHuggingFace(options)\n break\n case 'groq':\n this.ai = new AxAIGroq(options)\n break\n case 'together':\n this.ai = new AxAITogether(options)\n break\n case 'cohere':\n this.ai = new AxAICohere(options)\n break\n case 'google-gemini':\n this.ai = new AxAIGoogleGemini(options)\n break\n case 'anthropic':\n this.ai = new AxAIAnthropic(options)\n break\n case 'mistral':\n this.ai = new AxAIMistral(options)\n break\n case 'deepseek':\n this.ai = new AxAIDeepSeek(options)\n break\n case 'ollama':\n this.ai = new AxAIOllama(options)\n break\n case 'reka':\n this.ai = new AxAIReka(options)\n break\n default:\n throw new Error(`Unknown AI`)\n }\n }\n\n getName(): string {\n return this.ai.getName()\n }\n\n getId(): string {\n return this.ai.getId()\n }\n\n getFeatures(model?: string): { functions: boolean; streaming: boolean } {\n return this.ai.getFeatures(model)\n }\n getModelList(): AxAIModelList | undefined {\n return this.ai.getModelList() as AxAIModelList | undefined\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n return this.ai.getDefaultModels()\n }\n\n getMetrics(): AxAIServiceMetrics {\n return this.ai.getMetrics()\n }\n\n async chat(\n req: Readonly<AxChatRequest>,\n options?: Readonly<AxAIPromptConfig & AxAIServiceActionOptions>\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n return await this.ai.chat(req, options)\n }\n\n async embed(\n req: Readonly<AxEmbedRequest>,\n options?: Readonly<AxAIServiceActionOptions & AxAIServiceActionOptions>\n ): Promise<AxEmbedResponse> {\n return await this.ai.embed(req, options)\n }\n\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n this.ai.setOptions(options)\n }\n\n getOptions(): Readonly<AxAIServiceOptions> {\n return this.ai.getOptions()\n }\n}\n","import { ReadableStream } from 'node:stream/web'\n\nimport { type Span, SpanKind, type Tracer } from '@opentelemetry/api'\n\nimport type {\n AxAIService,\n AxChatRequest,\n AxChatResponse,\n AxChatResponseResult,\n AxFunction,\n AxRateLimiterFunction,\n} from '../ai/types.js'\nimport { mergeFunctionCalls } from '../ai/util.js'\nimport { AxMemory } from '../mem/memory.js'\nimport type { AxAIMemory } from '../mem/types.js'\nimport { AxAIServiceStreamTerminatedError } from '../util/apicall.js'\n\nimport {\n assertAssertions,\n assertStreamingAssertions,\n type AxAssertion,\n AxAssertionError,\n type AxStreamingAssertion,\n} from './asserts.js'\nimport {\n type extractionState,\n extractValues,\n streamingExtractFinalValue,\n streamingExtractValues,\n streamValues,\n} from './extract.js'\nimport {\n type AxFieldProcessor,\n processFieldProcessors,\n processStreamingFieldProcessors,\n} from './fieldProcessor.js'\nimport {\n type AxChatResponseFunctionCall,\n type AxInputFunctionType,\n parseFunctionCalls,\n parseFunctions,\n processFunctions,\n} from './functions.js'\nimport {\n type AxGenIn,\n type AxGenOut,\n type AxProgramForwardOptions,\n type AxProgramStreamingForwardOptions,\n AxProgramWithSignature,\n} from './program.js'\nimport { AxPromptTemplate } from './prompt.js'\nimport type { AxIField, AxSignature } from './sig.js'\nimport { mergeDeltas } from './util.js'\nimport { handleValidationError, ValidationError } from './validate.js'\n\nexport interface AxGenOptions {\n maxRetries?: number\n maxSteps?: number\n mem?: AxAIMemory\n tracer?: Tracer\n rateLimiter?: AxRateLimiterFunction\n stream?: boolean\n description?: string\n\n functions?: AxInputFunctionType\n functionCall?: AxChatRequest['functionCall']\n stopFunction?: string\n promptTemplate?: typeof AxPromptTemplate\n asserts?: AxAssertion[]\n streamingAsserts?: AxStreamingAssertion[]\n fastFail?: boolean\n}\n\nexport type AxGenerateResult<OUT extends AxGenOut> = OUT & {\n functions?: AxChatResponseFunctionCall[]\n}\n\nexport interface AxResponseHandlerArgs<T> {\n ai: Readonly<AxAIService>\n model?: string\n res: T\n usageInfo: { ai: string; model: string }\n mem: AxAIMemory\n sessionId?: string\n traceId?: string\n functions?: Readonly<AxFunction[]>\n fastFail?: boolean\n}\n\nexport interface AxStreamingEvent<T> {\n event: 'delta' | 'done' | 'error'\n data: {\n contentDelta?: string\n partialValues?: Partial<T>\n error?: string\n functions?: AxChatResponseFunctionCall[]\n }\n}\n\nexport class AxGen<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenerateResult<AxGenOut> = AxGenerateResult<AxGenOut>,\n> extends AxProgramWithSignature<IN, OUT> {\n private promptTemplate: AxPromptTemplate\n private asserts: AxAssertion[]\n private streamingAsserts: AxStreamingAssertion[]\n private options?: Omit<AxGenOptions, 'functions'>\n private functions?: AxFunction[]\n private functionsExecuted: Set<string> = new Set<string>()\n private fieldProcessors: AxFieldProcessor[] = []\n private streamingFieldProcessors: AxFieldProcessor[] = []\n\n constructor(\n signature: Readonly<AxSignature | string>,\n options?: Readonly<AxGenOptions>\n ) {\n super(signature, { description: options?.description })\n\n this.options = options\n this.promptTemplate = new (options?.promptTemplate ?? AxPromptTemplate)(\n this.signature,\n options?.functions\n )\n this.asserts = this.options?.asserts ?? []\n this.streamingAsserts = this.options?.streamingAsserts ?? []\n this.usage = []\n\n if (options?.functions) {\n this.functions = parseFunctions(options.functions)\n }\n }\n\n public addAssert = (fn: AxAssertion['fn'], message?: string) => {\n this.asserts.push({ fn, message })\n }\n\n public addStreamingAssert = (\n fieldName: string,\n fn: AxStreamingAssertion['fn'],\n message?: string\n ) => {\n this.streamingAsserts.push({ fieldName, fn, message })\n }\n\n private addFieldProcessorInternal = (\n fieldName: string,\n fn: AxFieldProcessor['process'],\n streaming = false\n ) => {\n const field = this.signature\n .getOutputFields()\n .find((f) => f.name === fieldName)\n\n if (!field) {\n throw new Error(`addFieldProcessor: field ${fieldName} not found`)\n }\n\n if (streaming) {\n const ft = field.type?.name\n const isText = !ft || ft === 'string' || ft === 'code'\n\n if (!isText) {\n throw new Error(\n `addFieldProcessor: field ${fieldName} is must be a text field`\n )\n }\n this.streamingFieldProcessors.push({ field, process: fn })\n } else {\n this.fieldProcessors.push({ field, process: fn })\n }\n }\n\n public addStreamingFieldProcessor = (\n fieldName: string,\n fn: AxFieldProcessor['process']\n ) => {\n this.addFieldProcessorInternal(fieldName, fn, true)\n }\n\n public addFieldProcessor = (\n fieldName: string,\n fn: AxFieldProcessor['process']\n ) => {\n this.addFieldProcessorInternal(fieldName, fn, false)\n }\n\n private async forwardSendRequest({\n ai,\n mem,\n options,\n }: Readonly<{\n ai: Readonly<AxAIService>\n mem: AxAIMemory\n options?: Omit<AxProgramForwardOptions, 'ai' | 'mem'>\n }>) {\n const {\n sessionId,\n traceId,\n modelConfig,\n model,\n rateLimiter,\n stream,\n functions: _functions,\n functionCall: _functionCall,\n } = options ?? {}\n\n const chatPrompt = mem?.history(sessionId) ?? []\n\n if (chatPrompt.length === 0) {\n throw new Error('No chat prompt found')\n }\n\n // biome-ignore lint/complexity/useFlatMap: you cannot use flatMap here\n const functions = _functions\n ?.map((f) => ('toFunction' in f ? f.toFunction() : f))\n ?.flat()\n\n const functionCall = _functionCall ?? this.options?.functionCall\n\n const res = await ai.chat(\n {\n chatPrompt,\n functions,\n functionCall,\n modelConfig,\n model,\n },\n {\n sessionId,\n traceId,\n rateLimiter,\n stream,\n debug: false,\n }\n )\n\n return res\n }\n\n private async *forwardCore({\n ai,\n mem,\n options,\n }: Readonly<{\n ai: Readonly<AxAIService>\n mem: AxAIMemory\n options: Omit<AxProgramForwardOptions, 'ai' | 'mem'>\n }>) {\n const { sessionId, traceId, model, functions: _functions } = options ?? {}\n const fastFail = options?.fastFail ?? this.options?.fastFail\n\n const modelName = model ?? ai.getDefaultModels().model\n const usageInfo = {\n ai: ai.getName(),\n model: modelName,\n }\n\n // biome-ignore lint/complexity/useFlatMap: you cannot use flatMap here\n const functions = _functions\n ?.map((f) => ('toFunction' in f ? f.toFunction() : f))\n ?.flat()\n\n const res = await this.forwardSendRequest({\n ai,\n mem,\n options,\n })\n\n if (res instanceof ReadableStream) {\n yield* this.processStreamingResponse({\n ai,\n model,\n res,\n usageInfo,\n mem,\n traceId,\n sessionId,\n functions,\n fastFail,\n })\n } else {\n yield await this.processResponse({\n ai,\n model,\n res,\n usageInfo,\n mem,\n traceId,\n sessionId,\n functions,\n })\n }\n }\n\n private async *processStreamingResponse({\n ai,\n model,\n res,\n usageInfo,\n mem,\n sessionId,\n traceId,\n functions,\n fastFail,\n }: Readonly<AxResponseHandlerArgs<ReadableStream<AxChatResponse>>>) {\n const streamingValidation =\n fastFail ?? ai.getFeatures().functionCot !== true\n const functionCalls: NonNullable<AxChatResponseResult['functionCalls']> = []\n const values = {}\n const xstate: extractionState = {\n extractedFields: [],\n streamedIndex: {},\n s: -1,\n }\n\n let content = ''\n\n for await (const v of res) {\n const result = v.results[0]\n if (!result) {\n continue\n }\n\n if (v.modelUsage) {\n this.usage.push({ ...usageInfo, ...v.modelUsage })\n }\n\n if (result.functionCalls) {\n mergeFunctionCalls(functionCalls, result.functionCalls)\n mem.updateResult(\n {\n name: result.name,\n content,\n functionCalls,\n delta: result.functionCalls?.[0]?.function?.params as string,\n },\n sessionId\n )\n } else if (result.content) {\n content += result.content\n mem.updateResult(\n { name: result.name, content, delta: result.content },\n sessionId\n )\n\n const skip = streamingExtractValues(\n this.signature,\n values,\n xstate,\n content,\n streamingValidation\n )\n\n if (skip) {\n continue\n }\n\n if (this.streamingAsserts.length !== 0) {\n await assertStreamingAssertions(\n this.streamingAsserts,\n xstate,\n content\n )\n }\n\n if (this.streamingFieldProcessors.length !== 0) {\n await processStreamingFieldProcessors(\n this.streamingFieldProcessors,\n content,\n xstate,\n mem,\n values,\n sessionId\n )\n }\n\n yield* streamValues<OUT>(this.signature, content, values, xstate)\n\n await assertAssertions(this.asserts, values)\n }\n\n if (result.finishReason === 'length') {\n throw new Error('Max tokens reached before completion')\n }\n }\n\n const funcs = parseFunctionCalls(ai, functionCalls, values, model)\n if (funcs) {\n if (!functions) {\n throw new Error('Functions are not defined')\n }\n const fx = await processFunctions(\n ai,\n functions,\n funcs,\n mem,\n sessionId,\n traceId\n )\n this.functionsExecuted = new Set([...this.functionsExecuted, ...fx])\n } else {\n streamingExtractFinalValue(this.signature, values, xstate, content)\n\n await assertStreamingAssertions(\n this.streamingAsserts,\n xstate,\n content,\n true\n )\n await assertAssertions(this.asserts, values)\n\n if (this.fieldProcessors.length) {\n await processFieldProcessors(\n this.fieldProcessors,\n values,\n mem,\n sessionId\n )\n }\n\n if (this.streamingFieldProcessors.length !== 0) {\n await processStreamingFieldProcessors(\n this.streamingFieldProcessors,\n content,\n xstate,\n mem,\n values,\n sessionId,\n true\n )\n }\n\n yield* streamValues<OUT>(this.signature, content, values, xstate)\n }\n }\n\n private async processResponse({\n ai,\n res,\n usageInfo,\n mem,\n sessionId,\n traceId,\n functions,\n }: Readonly<AxResponseHandlerArgs<AxChatResponse>>): Promise<OUT> {\n const values = {}\n\n let results = res.results ?? []\n\n if (results.length > 1) {\n results = results.filter((r) => r.functionCalls)\n }\n\n for (const result of results) {\n if (res.modelUsage) {\n this.usage.push({ ...usageInfo, ...res.modelUsage })\n }\n\n mem.addResult(result, sessionId)\n\n if (result.functionCalls?.length) {\n const funcs = parseFunctionCalls(ai, result.functionCalls, values)\n if (funcs) {\n if (!functions) {\n throw new Error('Functions are not defined')\n }\n const fx = await processFunctions(\n ai,\n functions,\n funcs,\n mem,\n sessionId,\n traceId\n )\n this.functionsExecuted = new Set([...this.functionsExecuted, ...fx])\n }\n } else if (result.content) {\n extractValues(this.signature, values, result.content)\n await assertAssertions(this.asserts, values)\n\n if (this.fieldProcessors.length) {\n await processFieldProcessors(\n this.fieldProcessors,\n values,\n mem,\n sessionId\n )\n }\n }\n\n if (result.finishReason === 'length') {\n throw new Error('Max tokens reached before completion')\n }\n }\n\n // Strip out values whose signature fields have isInternal: true\n const publicValues: AxGenOut = { ...values }\n for (const field of this.signature.getOutputFields()) {\n if (field.isInternal) {\n delete publicValues[field.name]\n }\n }\n\n return { ...values } as unknown as OUT\n }\n\n private async *_forward2(\n ai: Readonly<AxAIService>,\n values: IN,\n options: Readonly<AxProgramForwardOptions>,\n span?: Span\n ) {\n const stopFunction = (\n options?.stopFunction ?? this.options?.stopFunction\n )?.toLowerCase()\n\n const maxRetries = options.maxRetries ?? this.options?.maxRetries ?? 10\n const maxSteps = options.maxSteps ?? this.options?.maxSteps ?? 10\n const debug = options.debug ?? ai.getOptions().debug\n const memOptions = {\n debug: options.debug,\n debugHideSystemPrompt: options.debugHideSystemPrompt,\n }\n const mem =\n options.mem ?? this.options?.mem ?? new AxMemory(10000, memOptions)\n\n let err: ValidationError | AxAssertionError | undefined\n\n if (options?.functions && options.functions.length > 0) {\n const promptTemplate = this.options?.promptTemplate ?? AxPromptTemplate\n this.promptTemplate = new promptTemplate(\n this.signature,\n options.functions\n )\n }\n\n const prompt = this.promptTemplate.render<IN>(values, {\n examples: this.examples,\n demos: this.demos,\n })\n\n mem.add(prompt, options?.sessionId)\n\n multiStepLoop: for (let n = 0; n < maxSteps; n++) {\n for (let errCount = 0; errCount < maxRetries; errCount++) {\n try {\n const generator = this.forwardCore({ options, ai, mem })\n for await (const delta of generator) {\n if (delta !== undefined) {\n yield { version: errCount, delta }\n }\n }\n\n const lastMemItem = mem.getLast(options?.sessionId)\n const shouldContinue = this.shouldContinueSteps(\n lastMemItem,\n stopFunction\n )\n\n if (shouldContinue) {\n continue multiStepLoop\n }\n\n if (debug) {\n process.stdout.write('\\n')\n }\n\n return\n } catch (e) {\n let errorFields: AxIField[] | undefined\n\n span?.recordException(e as Error)\n\n if (e instanceof ValidationError) {\n errorFields = e.getFixingInstructions()\n err = e\n } else if (e instanceof AxAssertionError) {\n const e1 = e as AxAssertionError\n errorFields = e1.getFixingInstructions()\n err = e\n } else if (e instanceof AxAIServiceStreamTerminatedError) {\n // Do nothing allow error correction to happen\n } else {\n throw e\n }\n\n if (errorFields) {\n handleValidationError(\n mem,\n errorFields,\n ai,\n this.promptTemplate,\n options.sessionId\n )\n }\n }\n }\n\n throw new Error(`Unable to fix validation error: ${err?.message}`)\n }\n\n throw new Error(`Max steps reached: ${maxSteps}`)\n }\n\n private shouldContinueSteps(\n lastMemItem: ReturnType<AxAIMemory['getLast']>,\n stopFunction: string | undefined\n ) {\n const stopFunctionExecuted =\n stopFunction && this.functionsExecuted.has(stopFunction)\n\n const isFunction = lastMemItem?.chat?.role === 'function'\n const isProcessor = lastMemItem?.tags\n ? lastMemItem.tags.some((tag) => tag === 'processor')\n : false\n\n if (isFunction && stopFunction && stopFunctionExecuted) {\n return false\n }\n\n if (isFunction || isProcessor) {\n return true\n }\n\n return false\n }\n\n public async *_forward1(\n ai: Readonly<AxAIService>,\n values: IN,\n options: Readonly<AxProgramForwardOptions>\n ) {\n const tracer = this.options?.tracer ?? options?.tracer\n\n let functions: AxFunction[] | undefined = this.functions\n\n if (options?.functions) {\n functions = parseFunctions(options.functions, this.functions)\n }\n\n if (!tracer) {\n yield* this._forward2(ai, values, {\n ...options,\n functions,\n })\n return\n }\n\n const funcNames = functions?.map((f) => f.name).join(',')\n\n const attributes = {\n 'generate.signature': this.signature.toString(),\n 'generate.functions': funcNames ?? '',\n }\n\n const span = tracer.startSpan('Generate', {\n kind: SpanKind.SERVER,\n attributes,\n })\n\n try {\n yield* this._forward2(\n ai,\n values,\n {\n ...options,\n functions,\n },\n span\n )\n } finally {\n span.end()\n }\n }\n\n public override async forward(\n ai: Readonly<AxAIService>,\n values: IN,\n options?: Readonly<AxProgramForwardOptions>\n ): Promise<OUT> {\n const generator = this._forward1(ai, values, {\n ...options,\n })\n\n let buffer = {} as Partial<OUT>\n let currentVersion = 0\n\n for await (const item of generator) {\n if (item.version !== currentVersion) {\n buffer = {}\n }\n currentVersion = item.version\n buffer = mergeDeltas(buffer, item.delta)\n }\n\n this.trace = { ...values, ...buffer }\n return buffer as OUT\n }\n\n override async *streamingForward(\n ai: Readonly<AxAIService>,\n values: IN,\n options?: Readonly<AxProgramStreamingForwardOptions>\n ) {\n yield* this._forward1(ai, values, {\n ...options,\n stream: true,\n })\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { createHash } from 'crypto'\n\nimport type { AxChatResponseResult, AxModelInfo } from './types.js'\n\nexport const findItemByNameOrAlias = (\n list: readonly AxModelInfo[],\n name: string\n): AxModelInfo | undefined => {\n for (const item of list) {\n if (item.name === name || item.aliases?.includes(name)) {\n return item\n }\n }\n return undefined\n}\n\nexport const uniqBy = <T>(\n array: readonly T[],\n uniqueField: (value: T) => unknown\n): T[] => {\n const uniqueValues = new Map()\n\n array.forEach((value: T) => {\n const field = uniqueField(value)\n\n if (!uniqueValues.has(field)) {\n uniqueValues.set(field, value)\n }\n })\n\n return Array.from(uniqueValues.values())\n}\n\nconst functionCallRe = /(\\w+)\\((.*)\\)/s\n\nexport const parseFunction = (\n value: string\n): { name: string; args?: string } | undefined => {\n let v: string[] | null\n\n // extract function calls\n if ((v = functionCallRe.exec(value)) !== null) {\n const name = v.at(1)?.trim()\n const args = v.at(2)?.trim()\n if (!name || name.length === 0) {\n throw new Error(`Invalid function format: ${value}`)\n }\n return { name, args }\n }\n return\n}\n\nexport interface mergeFunctionsState {\n lastId?: string\n}\n\nexport function mergeFunctionCalls(\n functionCalls: NonNullable<AxChatResponseResult['functionCalls']>,\n functionCallDeltas: Readonly<\n NonNullable<AxChatResponseResult['functionCalls']>\n >\n) {\n for (const _fc of functionCallDeltas) {\n const fc = functionCalls.find((fc) => fc.id === _fc.id)\n\n if (fc) {\n if (\n typeof _fc.function.name == 'string' &&\n _fc.function.name.length > 0\n ) {\n fc.function.name += _fc.function.name\n }\n\n if (\n typeof _fc.function.params == 'string' &&\n _fc.function.params.length > 0\n ) {\n fc.function.params += _fc.function.params\n }\n\n if (typeof _fc.function.params == 'object') {\n fc.function.params = _fc.function.params\n }\n } else {\n functionCalls.push(_fc)\n }\n }\n}\n\nexport const hashObject = (obj: object) => {\n const hash = createHash('sha256')\n hash.update(JSON.stringify(obj))\n return hash.digest('hex')\n}\n","import {\n logChatRequest,\n logChatRequestMessage,\n logResponseDelta,\n logResponseResult,\n} from '../ai/debug.js'\nimport type { AxChatRequest, AxChatResponseResult } from '../ai/types.js'\n\nimport type { AxAIMemory } from './types.js'\n\ntype MemoryData = {\n tags?: string[]\n chat: AxChatRequest['chatPrompt'][number]\n}[]\n\nconst defaultLimit = 10000\n\nexport class MemoryImpl {\n private data: MemoryData = []\n\n constructor(\n private limit = defaultLimit,\n private options?: {\n debug?: boolean\n debugHideSystemPrompt?: boolean\n }\n ) {\n if (limit <= 0) {\n throw Error(\"argument 'limit' must be greater than 0\")\n }\n }\n\n private addMemory(\n value: AxChatRequest['chatPrompt'][number] | AxChatRequest['chatPrompt']\n ): void {\n if (Array.isArray(value)) {\n this.data.push(...value.map((chat) => ({ chat: structuredClone(chat) })))\n } else {\n this.data.push({\n chat: structuredClone(value),\n })\n }\n\n if (this.data.length > this.limit) {\n const removeCount = this.data.length - this.limit\n this.data.splice(0, removeCount)\n }\n }\n\n add(\n value: AxChatRequest['chatPrompt'][number] | AxChatRequest['chatPrompt']\n ): void {\n this.addMemory(value)\n\n if (this.options?.debug) {\n debugRequest(value, this.options?.debugHideSystemPrompt)\n }\n }\n\n private addResultMessage({\n content,\n name,\n functionCalls,\n }: Readonly<AxChatResponseResult>): void {\n if (!content && (!functionCalls || functionCalls.length === 0)) {\n return\n }\n this.addMemory({ content, name, role: 'assistant', functionCalls })\n }\n\n addResult({\n content,\n name,\n functionCalls,\n }: Readonly<AxChatResponseResult>): void {\n this.addResultMessage({ content, name, functionCalls })\n\n if (this.options?.debug) {\n debugResponse({ content, name, functionCalls })\n }\n }\n\n updateResult({\n content,\n name,\n functionCalls,\n delta,\n }: Readonly<AxChatResponseResult & { delta?: string }>): void {\n const lastItem = this.data.at(-1)\n\n if (!lastItem || lastItem.chat.role !== 'assistant') {\n this.addResultMessage({ content, name, functionCalls })\n } else {\n if ('content' in lastItem.chat && content) {\n lastItem.chat.content = content\n }\n if ('name' in lastItem.chat && name) {\n lastItem.chat.name = name\n }\n if ('functionCalls' in lastItem.chat && functionCalls) {\n lastItem.chat.functionCalls = functionCalls\n }\n }\n\n if (this.options?.debug) {\n if (delta && typeof delta === 'string') {\n debugResponseDelta(delta)\n } else if (lastItem) {\n debugResponse({ content, name, functionCalls })\n }\n }\n }\n\n addTag(name: string): void {\n const lastItem = this.data.at(-1)\n if (!lastItem) {\n return\n }\n\n if (!lastItem.tags) {\n lastItem.tags = []\n }\n\n if (!lastItem.tags.includes(name)) {\n lastItem.tags.push(name)\n }\n }\n\n rewindToTag(name: string): AxChatRequest['chatPrompt'] {\n const tagIndex = this.data.findIndex((item) => item.tags?.includes(name))\n if (tagIndex === -1) {\n throw new Error(`Tag \"${name}\" not found`)\n }\n\n // Remove and return the tagged item and everything after it\n const removedItems = this.data.splice(tagIndex)\n return removedItems.map((item) => item.chat)\n }\n\n removeByTag(name: string): AxChatRequest['chatPrompt'] {\n const indices = this.data.reduce<number[]>((acc, item, index) => {\n if (item.tags?.includes(name)) {\n acc.push(index)\n }\n return acc\n }, [])\n\n if (indices.length === 0) {\n throw new Error(`No items found with tag \"${name}\"`)\n }\n\n return indices\n .reverse()\n .map((index) => this.data.splice(index, 1).at(0)?.chat)\n .filter(Boolean)\n .reverse() as AxChatRequest['chatPrompt']\n }\n\n history(): AxChatRequest['chatPrompt'] {\n return this.data.map((item) => item.chat)\n }\n\n getLast():\n | { chat: AxChatRequest['chatPrompt'][number]; tags?: string[] }\n | undefined {\n const lastItem = this.data.at(-1)\n if (!lastItem) return undefined\n // Merge the tags into the chat object so that consumers can inspect them.\n return {\n chat: lastItem.chat,\n tags: lastItem.tags,\n }\n }\n\n reset(): void {\n this.data = []\n }\n}\n\nexport class AxMemory implements AxAIMemory {\n private memories = new Map<string, MemoryImpl>()\n private defaultMemory: MemoryImpl\n\n constructor(\n private limit = defaultLimit,\n private options?: {\n debug?: boolean\n debugHideSystemPrompt?: boolean\n }\n ) {\n this.defaultMemory = new MemoryImpl(limit, options)\n }\n\n private getMemory(sessionId?: string): MemoryImpl {\n if (!sessionId) {\n return this.defaultMemory\n }\n\n if (!this.memories.has(sessionId)) {\n this.memories.set(sessionId, new MemoryImpl(this.limit, this.options))\n }\n\n return this.memories.get(sessionId) as MemoryImpl\n }\n\n add(\n value: AxChatRequest['chatPrompt'][number] | AxChatRequest['chatPrompt'],\n sessionId?: string\n ): void {\n this.getMemory(sessionId).add(value)\n }\n\n addResult(result: Readonly<AxChatResponseResult>, sessionId?: string): void {\n this.getMemory(sessionId).addResult(result)\n }\n\n updateResult(\n result: Readonly<AxChatResponseResult>,\n sessionId?: string\n ): void {\n this.getMemory(sessionId).updateResult(result)\n }\n\n addTag(name: string, sessionId?: string) {\n this.getMemory(sessionId).addTag(name)\n }\n\n rewindToTag(name: string, sessionId?: string) {\n return this.getMemory(sessionId).rewindToTag(name)\n }\n\n history(sessionId?: string) {\n return this.getMemory(sessionId).history()\n }\n\n getLast(sessionId?: string) {\n return this.getMemory(sessionId).getLast()\n }\n\n reset(sessionId?: string): void {\n if (!sessionId) {\n this.defaultMemory.reset()\n } else {\n this.memories.set(sessionId, new MemoryImpl(this.limit, this.options))\n }\n }\n}\n\nfunction debugRequest(\n value: AxChatRequest['chatPrompt'][number] | AxChatRequest['chatPrompt'],\n hideSystemPrompt?: boolean\n) {\n if (Array.isArray(value)) {\n logChatRequest(value, hideSystemPrompt)\n } else {\n logChatRequestMessage(value, hideSystemPrompt)\n }\n}\n\nfunction debugResponse(value: Readonly<AxChatResponseResult>) {\n logResponseResult(value)\n}\n\nfunction debugResponseDelta(delta: string) {\n logResponseDelta(delta)\n}\n","import type { extractionState } from './extract.js'\n\nexport interface AxAssertion {\n fn(\n values: Record<string, unknown>\n ): Promise<boolean | undefined> | boolean | undefined\n message?: string\n}\n\nexport interface AxStreamingAssertion {\n fieldName: string\n fn(content: string, done?: boolean): boolean | undefined\n message?: string\n}\n\nexport class AxAssertionError extends Error {\n constructor({\n message,\n }: Readonly<{\n message: string\n }>) {\n super(message)\n this.name = this.constructor.name\n }\n\n public getFixingInstructions = () => {\n const extraFields = []\n const message = this.message.trim()\n\n extraFields.push({\n name: 'error',\n title: 'Follow these instructions',\n description: message + (message.endsWith('.') ? '' : '.'),\n })\n\n return extraFields\n }\n}\n\nexport const assertAssertions = async (\n asserts: readonly AxAssertion[],\n values: Record<string, unknown>\n) => {\n for (const assert of asserts) {\n const { fn, message } = assert\n\n const res = await fn(values)\n if (res === undefined) {\n continue\n }\n\n if (!res) {\n if (!message) {\n throw new Error(`Assertion Failed: No message provided for assertion`)\n }\n throw new AxAssertionError({ message })\n }\n }\n}\n\nexport const assertStreamingAssertions = async (\n asserts: readonly AxStreamingAssertion[],\n xstate: Readonly<extractionState>,\n content: string,\n final: boolean = false\n) => {\n if (\n !xstate.currField ||\n xstate.s === -1 ||\n !asserts ||\n asserts.length === 0\n ) {\n return\n }\n\n const fieldAsserts = asserts.filter(\n (a) => a.fieldName === xstate.currField?.name\n )\n\n if (fieldAsserts.length === 0) {\n return\n }\n\n const currValue = content.substring(xstate.s)\n\n for (const assert of fieldAsserts) {\n const { message, fn } = assert\n\n const res = await fn(currValue, final)\n if (res === undefined) {\n continue\n }\n\n if (!res && message) {\n throw new AxAssertionError({ message })\n }\n }\n}\n","import moment from 'moment-timezone'\n\nimport type { AxField } from './sig.js'\nimport { ValidationError } from './validate.js'\n\nexport function parseLLMFriendlyDate(\n field: Readonly<AxField>,\n dateStr: string,\n required: boolean = false\n) {\n try {\n return _parseLLMFriendlyDate(dateStr)\n } catch (err) {\n if (field.isOptional && !required) {\n return\n }\n const message = (err as Error).message\n throw new ValidationError({ fields: [field], message, value: dateStr })\n }\n}\n\nfunction _parseLLMFriendlyDate(dateStr: string) {\n // Validate the date string format\n if (!moment(dateStr, 'YYYY-MM-DD', true).isValid()) {\n throw new Error(\n 'Invalid date format. Please provide the date in \"YYYY-MM-DD\" format.'\n )\n }\n\n // Parse the date and create a UTC moment object at midnight\n const date = moment.utc(dateStr, 'YYYY-MM-DD').startOf('day')\n\n return date.toDate()\n}\n\nexport function parseLLMFriendlyDateTime(\n field: Readonly<AxField>,\n dateStr: string,\n required: boolean = false\n) {\n try {\n return _parseLLMFriendlyDateTime(dateStr)\n } catch (err) {\n if (field.isOptional && !required) {\n return\n }\n const message = (err as Error).message\n throw new ValidationError({ fields: [field], message, value: dateStr })\n }\n}\n\nfunction _parseLLMFriendlyDateTime(dateTimeStr: string) {\n // Validate the date and time string format\n const dateTimeRegex = /^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}(?::\\d{2})?) (.+)$/\n const match = dateTimeStr.match(dateTimeRegex)\n if (!match) {\n throw new Error(\n 'Invalid date and time format. Please provide the date and time in \"YYYY-MM-DD HH:mm\" or \"YYYY-MM-DD HH:mm:ss\" format, followed by the timezone.'\n )\n }\n\n const [, dateTime, timeZone] = match\n\n if (!dateTime || !timeZone) {\n throw new Error(\n 'Invalid date and time format. Please provide the date and time in \"YYYY-MM-DD HH:mm\" or \"YYYY-MM-DD HH:mm:ss\" format, followed by the timezone.'\n )\n }\n\n // Try to parse the timezone\n const zone = moment.tz.zone(timeZone)\n\n // If still not found, throw an error\n if (!zone) {\n throw new Error(\n `Unrecognized time zone ${timeZone}. Please provide a valid time zone name, abbreviation, or offset. For example, \"America/New_York\", or \"EST\".`\n )\n }\n\n // Parse the date and time in the specified time zone\n const date = moment.tz(\n dateTime,\n ['YYYY-MM-DD HH:mm', 'YYYY-MM-DD HH:mm:ss'],\n zone.name\n )\n\n // Check if the date and time are valid\n if (!date.isValid()) {\n throw new Error(\n 'Invalid date and time values. Please ensure all components are correct.'\n )\n }\n\n // Convert to UTC\n return date.utc().toDate()\n}\n\nexport const formatDateWithTimezone = (date: Readonly<Date>) => {\n const momentDate = moment(date).utc()\n return momentDate.format(`YYYY-MM-DD HH:mm:ss UTC`)\n}\n","export class AxInstanceRegistry<T> {\n private reg: Set<T> // To track keys for iteration\n\n constructor() {\n this.reg = new Set()\n }\n\n register(instance: T): void {\n this.reg.add(instance)\n }\n\n *[Symbol.iterator]() {\n for (const key of this.reg) {\n yield key\n }\n }\n}\n","import { createHash } from 'crypto'\n\nimport type { AxFunctionJSONSchema } from '../ai/types.js'\n\nimport {\n type InputParsedField,\n type OutputParsedField,\n type ParsedSignature,\n parseSignature,\n} from './parser.js'\n\nexport interface AxField {\n name: string\n title?: string\n description?: string\n type?: {\n name:\n | 'string'\n | 'number'\n | 'boolean'\n | 'json'\n | 'image'\n | 'audio'\n | 'date'\n | 'datetime'\n | 'class'\n | 'code'\n isArray: boolean\n classes?: string[]\n }\n isOptional?: boolean\n isInternal?: boolean\n}\n\nexport type AxIField = Omit<AxField, 'title'> & { title: string }\n\nexport class AxSignature {\n private description?: string\n private inputFields: AxIField[]\n private outputFields: AxIField[]\n\n private sigHash: string\n private sigString: string\n\n constructor(signature?: Readonly<AxSignature | string>) {\n if (!signature) {\n this.inputFields = []\n this.outputFields = []\n this.sigHash = ''\n this.sigString = ''\n return\n }\n\n if (typeof signature === 'string') {\n let sig: ParsedSignature\n try {\n sig = parseSignature(signature)\n } catch (e) {\n throw new Error(\n `Invalid Signature: ${(e as Error).message} (${signature})`\n )\n }\n this.description = sig.desc\n this.inputFields = sig.inputs.map((v) => this.parseParsedField(v))\n this.outputFields = sig.outputs.map((v) => this.parseParsedField(v))\n ;[this.sigHash, this.sigString] = this.updateHash()\n } else if (signature instanceof AxSignature) {\n this.description = signature.getDescription()\n this.inputFields = structuredClone(\n signature.getInputFields()\n ) as AxIField[]\n this.outputFields = structuredClone(\n signature.getOutputFields()\n ) as AxIField[]\n this.sigHash = signature.hash()\n this.sigString = signature.toString()\n } else {\n throw new Error('invalid signature argument: ' + signature)\n }\n }\n\n private parseParsedField = (\n field: Readonly<InputParsedField | OutputParsedField>\n ): AxIField => {\n if (!field.name || field.name.length === 0) {\n throw new Error('Field name is required.')\n }\n\n const title = this.toTitle(field.name)\n return {\n name: field.name,\n title,\n description: 'desc' in field ? field.desc : undefined,\n type: field.type ?? { name: 'string', isArray: false },\n ...('isInternal' in field ? { isInternal: field.isInternal } : {}),\n ...('isOptional' in field ? { isOptional: field.isOptional } : {}),\n }\n }\n\n private parseField = (field: Readonly<AxField>): AxIField => {\n const title =\n !field.title || field.title.length === 0\n ? this.toTitle(field.name)\n : field.title\n\n if (field.type && (!field.type.name || field.type.name.length === 0)) {\n throw new Error('Field type name is required: ' + field.name)\n }\n\n return { ...field, title }\n }\n\n public setDescription = (desc: string) => {\n this.description = desc\n this.updateHash()\n }\n\n public addInputField = (field: Readonly<AxField>) => {\n this.inputFields.push(this.parseField(field))\n this.updateHash()\n }\n\n public addOutputField = (field: Readonly<AxField>) => {\n this.outputFields.push(this.parseField(field))\n this.updateHash()\n }\n\n public setInputFields = (fields: readonly AxField[]) => {\n this.inputFields = fields.map((v) => this.parseField(v))\n this.updateHash()\n }\n\n public setOutputFields = (fields: readonly AxField[]) => {\n this.outputFields = fields.map((v) => this.parseField(v))\n this.updateHash()\n }\n\n public getInputFields = (): Readonly<AxIField[]> => this.inputFields\n public getOutputFields = (): Readonly<AxIField[]> => this.outputFields\n public getDescription = () => this.description\n\n private toTitle = (name: string) => {\n let result = name.replace(/_/g, ' ')\n result = result.replace(/([A-Z]|[0-9]+)/g, ' $1').trim()\n return result.charAt(0).toUpperCase() + result.slice(1)\n }\n\n public toJSONSchema = (): AxFunctionJSONSchema => {\n const properties: Record<string, unknown> = {}\n const required: Array<string> = []\n\n for (const f of this.inputFields) {\n const type = f.type ? f.type.name : 'string'\n if (f.type?.isArray) {\n properties[f.name] = {\n description: f.description,\n type: 'array' as const,\n items: {\n type: type,\n description: f.description,\n },\n }\n } else {\n properties[f.name] = {\n description: f.description,\n type: type,\n }\n }\n\n if (!f.isOptional) {\n required.push(f.name)\n }\n }\n\n const schema = {\n type: 'object',\n properties: properties,\n required: required,\n }\n\n return schema as AxFunctionJSONSchema\n }\n\n private updateHash = (): [string, string] => {\n this.getInputFields().forEach((field) => {\n validateField(field)\n })\n this.getOutputFields().forEach((field) => {\n validateField(field)\n if (field.type?.name === 'image') {\n throw new Error('Image type is not supported in output fields.')\n }\n })\n\n this.sigHash = createHash('sha256')\n .update(this.description ?? '')\n .update(JSON.stringify(this.inputFields))\n .update(JSON.stringify(this.outputFields))\n .digest('hex')\n\n this.sigString = renderSignature(\n this.description,\n this.inputFields,\n this.outputFields\n )\n\n return [this.sigHash, this.sigString]\n }\n\n public hash = () => this.sigHash\n\n public toString = () => this.sigString\n}\n\nfunction renderField(field: Readonly<AxField>): string {\n let result = field.name\n if (field.isOptional) {\n result += '?'\n }\n if (field.type) {\n result += ':' + field.type.name\n if (field.type.isArray) {\n result += '[]'\n }\n }\n // Check if description exists and append it.\n if (field.description) {\n result += ` \"${field.description}\"`\n }\n return result\n}\n\nfunction renderSignature(\n description: string | undefined,\n inputFields: readonly AxField[],\n outputFields: readonly AxField[]\n): string {\n // Prepare the description part of the signature.\n const descriptionPart = description ? `\"${description}\"` : ''\n\n // Render each input field into a comma-separated list.\n const inputFieldsRendered = inputFields.map(renderField).join(', ')\n\n // Render each output field into a comma-separated list.\n const outputFieldsRendered = outputFields.map(renderField).join(', ')\n\n // Combine all parts into the final signature.\n return `${descriptionPart} ${inputFieldsRendered} -> ${outputFieldsRendered}`\n}\n\nfunction isValidCase(inputString: string): boolean {\n const camelCaseRegex = /^[a-z][a-zA-Z0-9]*$/\n const snakeCaseRegex = /^[a-z]+(_[a-z0-9]+)*$/\n\n return camelCaseRegex.test(inputString) || snakeCaseRegex.test(inputString)\n}\n\nfunction validateField(field: Readonly<AxField>): void {\n if (!field.name || field.name.length === 0) {\n throw new Error('Field name cannot be blank')\n }\n\n if (!isValidCase(field.name)) {\n throw new Error(\n `Invalid field name '${field.name}', it must be camel case or snake case: `\n )\n }\n\n if (\n [\n 'text',\n 'object',\n 'image',\n 'string',\n 'number',\n 'boolean',\n 'json',\n 'array',\n 'datetime',\n 'date',\n 'time',\n 'type',\n 'class',\n ].includes(field.name)\n ) {\n throw new Error(\n `Invalid field name '${field.name}', please make it more descriptive (eg. companyDescription)`\n )\n }\n}\n","// Updated type definitions\n\nexport type TypeNotClass =\n | 'string'\n | 'number'\n | 'boolean'\n | 'json'\n | 'image'\n | 'audio'\n | 'datetime'\n | 'date'\n | 'code'\nexport type Type = TypeNotClass | 'class'\nexport type ParsedIdentifier = string\nexport type ParsedString = string\n\nexport type ParsedSignature = {\n desc?: string\n inputs: InputParsedField[]\n outputs: OutputParsedField[]\n}\n\nexport type InputParsedField = {\n name: ParsedIdentifier\n desc?: string\n type?: { name: TypeNotClass; isArray: boolean }\n isOptional?: boolean\n}\n\nexport type OutputParsedField = {\n name: ParsedIdentifier\n desc?: string\n type?:\n | { name: TypeNotClass; isArray: boolean }\n | { name: 'class'; isArray: boolean; classes: string[] }\n isOptional?: boolean\n isInternal?: boolean\n}\n\nclass SignatureParser {\n private input: string\n private position: number\n private currentFieldName: string | null = null\n\n constructor(input: string) {\n this.input = input\n this.position = 0\n }\n\n parse(): ParsedSignature {\n try {\n this.skipWhitespace()\n const optionalDesc = this.parseParsedString()\n this.skipWhitespace()\n\n // Use the specialized input field parser\n const inputs = this.parseFieldList(\n this.parseInputField.bind(this),\n 'input'\n )\n this.skipWhitespace()\n\n if (this.position >= this.input.length) {\n throw new Error(\n 'Incomplete signature: Missing output section. Expected \"->\" followed by output fields'\n )\n }\n\n this.expect('->')\n this.skipWhitespace()\n\n if (this.position >= this.input.length) {\n throw new Error(\n 'Incomplete signature: No output fields specified after \"->\"'\n )\n }\n\n // Use the specialized output field parser\n const outputs = this.parseFieldList(\n this.parseOutputField.bind(this),\n 'output'\n )\n\n return {\n desc: optionalDesc?.trim(),\n inputs,\n outputs,\n }\n } catch (error) {\n // Add context about the position where the error occurred\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error'\n const context = this.getErrorContext()\n throw new Error(`${errorMessage}\\n${context}`)\n }\n }\n\n private getErrorContext(): string {\n const start = Math.max(0, this.position - 20)\n const end = Math.min(this.input.length, this.position + 20)\n const before = this.input.slice(start, this.position)\n const after = this.input.slice(this.position, end)\n const pointer = ' '.repeat(before.length) + '^'\n\n return `Near position ${this.position}:\\n${before}${after}\\n${pointer}`\n }\n\n private parseFieldList<T extends InputParsedField | OutputParsedField>(\n parseFieldFn: () => T,\n section: 'input' | 'output'\n ): T[] {\n const fields: T[] = []\n this.skipWhitespace()\n\n if (this.position >= this.input.length) {\n throw new Error(`Empty ${section} section: Expected at least one field`)\n }\n\n // Parse first field\n try {\n fields.push(parseFieldFn())\n } catch (error) {\n throw new Error(\n `Invalid first ${section} field: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n )\n }\n\n this.skipWhitespace()\n\n // Parse remaining fields\n while (this.position < this.input.length) {\n if (\n this.input[this.position] === '-' &&\n this.input[this.position + 1] === '>'\n ) {\n break\n }\n\n if (this.match(',')) {\n this.skipWhitespace()\n if (this.position >= this.input.length) {\n throw new Error(\n `Unexpected end of input after comma in ${section} section`\n )\n }\n try {\n fields.push(parseFieldFn())\n } catch (error) {\n throw new Error(\n `Invalid ${section} field after comma: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n )\n }\n this.skipWhitespace()\n } else {\n break\n }\n }\n\n return fields\n }\n\n // -------------------------------\n // Parse input fields (no \"class\" type and no internal flag)\n // -------------------------------\n private parseInputField(): InputParsedField {\n this.skipWhitespace()\n const name = this.parseParsedIdentifier()\n this.currentFieldName = name\n\n // Only the optional marker is allowed\n let isOptional = undefined\n while (true) {\n if (this.match('?')) {\n isOptional = true\n continue\n }\n if (this.match('!')) {\n throw new Error(\n `Input field \"${name}\" does not support the internal marker \"!\"`\n )\n }\n break\n }\n\n let type: { name: TypeNotClass; isArray: boolean } | undefined\n this.skipWhitespace()\n if (this.match(':')) {\n this.skipWhitespace()\n // Disallow the \"class\" type in input fields\n if (/^class\\b/.test(this.input.slice(this.position))) {\n throw new Error(\n `Input field \"${name}\" does not support the \"class\" type`\n )\n } else {\n try {\n const typeName = this.parseTypeNotClass()\n const isArray = this.match('[]')\n type = { name: typeName, isArray }\n } catch (error) {\n throw new Error(\n `Input field \"${name}\": ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n )\n }\n }\n }\n\n this.skipWhitespace()\n const desc = this.parseParsedString()\n\n return {\n name,\n desc: desc?.trim(),\n type,\n isOptional,\n }\n }\n\n // -------------------------------\n // Parse output fields (supports both \"class\" type and the internal marker)\n // -------------------------------\n private parseOutputField(): OutputParsedField {\n this.skipWhitespace()\n const name = this.parseParsedIdentifier()\n this.currentFieldName = name\n\n let isOptional = false\n let isInternal = false\n while (true) {\n if (this.match('?')) {\n isOptional = true\n continue\n }\n if (this.match('!')) {\n isInternal = true\n continue\n }\n break\n }\n\n let type:\n | { name: TypeNotClass; isArray: boolean }\n | { name: 'class'; isArray: boolean; classes: string[] }\n | undefined\n this.skipWhitespace()\n if (this.match(':')) {\n this.skipWhitespace()\n if (this.match('class')) {\n const isArray = this.match('[]')\n this.skipWhitespace()\n const classNamesString = this.parseParsedString()\n if (!classNamesString) {\n throw new Error(\n `Output field \"${name}\": Expected class names in quotes after \"class\" type. Example: class \"MyClass1, MyClass2\"`\n )\n }\n const classes = classNamesString\n .split(/[,\\s]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n\n if (classes.length === 0) {\n throw new Error(\n `Output field \"${name}\": Empty class list provided. At least one class name is required`\n )\n }\n\n type = { name: 'class', isArray, classes }\n } else {\n try {\n const typeName = this.parseTypeNotClass()\n const isArray = this.match('[]')\n type = { name: typeName, isArray }\n } catch (error) {\n throw new Error(\n `Output field \"${name}\": ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n )\n }\n }\n }\n\n this.skipWhitespace()\n const desc = this.parseParsedString()\n\n return {\n name,\n desc: desc?.trim(),\n type,\n isOptional,\n isInternal,\n }\n }\n\n private parseTypeNotClass(): TypeNotClass {\n const types: TypeNotClass[] = [\n 'string',\n 'number',\n 'boolean',\n 'json',\n 'image',\n 'audio',\n 'datetime',\n 'date',\n 'code',\n ]\n\n const foundType = types.find((type) => this.match(type))\n if (!foundType) {\n const currentWord =\n this.input.slice(this.position).match(/^\\w+/)?.[0] || 'empty'\n throw new Error(\n `Invalid type \"${currentWord}\". Expected one of: ${types.join(', ')}`\n )\n }\n return foundType\n }\n\n private parseParsedIdentifier(): ParsedIdentifier {\n this.skipWhitespace()\n const match = /^[a-zA-Z_][a-zA-Z_0-9]*/.exec(\n this.input.slice(this.position)\n )\n if (match) {\n this.position += match[0].length\n return match[0]\n }\n\n const invalidMatch = /^\\S+/.exec(this.input.slice(this.position))\n const invalidId = invalidMatch ? invalidMatch[0] : 'empty'\n\n throw new Error(\n `Invalid identifier \"${invalidId}\". Identifiers must start with a letter or underscore and contain only letters, numbers, or underscores`\n )\n }\n\n private parseParsedString(): string | undefined {\n const quoteChars = [\"'\", '\"']\n for (const quoteChar of quoteChars) {\n if (this.match(quoteChar)) {\n let content = ''\n let escaped = false\n let startPos = this.position\n\n while (this.position < this.input.length) {\n const char = this.input[this.position]\n this.position++\n if (escaped) {\n content += char\n escaped = false\n } else if (char === '\\\\') {\n escaped = true\n } else if (char === quoteChar) {\n return content\n } else {\n content += char\n }\n }\n\n const partialString = this.input.slice(startPos, this.position)\n throw new Error(\n `Unterminated string starting at position ${startPos}: \"${partialString}...\"`\n )\n }\n }\n return undefined\n }\n\n private skipWhitespace() {\n const match = /^[\\s\\t\\r\\n]+/.exec(this.input.slice(this.position))\n if (match) {\n this.position += match[0].length\n }\n }\n\n private match(strOrRegex: string | RegExp): boolean {\n let match\n if (typeof strOrRegex === 'string') {\n if (this.input.startsWith(strOrRegex, this.position)) {\n this.position += strOrRegex.length\n return true\n }\n } else {\n match = strOrRegex.exec(this.input.slice(this.position))\n if (match) {\n this.position += match[0].length\n return true\n }\n }\n return false\n }\n\n private expect(str: string) {\n if (!this.match(str)) {\n const found = this.input.slice(this.position, this.position + 10)\n throw new Error(\n `Expected \"${str}\" but found \"${found}...\" at position ${this.position}`\n )\n }\n }\n}\n\nexport function parseSignature(input: string): ParsedSignature {\n const parser = new SignatureParser(input)\n return parser.parse()\n}\n","import { ColorLog } from '../util/log.js'\n\nimport type { AxExample, AxOptimizationStats } from './optimize.js'\nimport type { AxFieldValue, AxGenOut, AxProgramUsage } from './program.js'\nimport type { AxField } from './sig.js'\n\nconst colorLog = new ColorLog()\n\nexport const updateProgressBar = (\n current: number,\n total: number,\n success: number,\n elapsedTime: number, // in seconds\n msg: string,\n progressBarWidth = 20 // Default width of the progress bar\n): void => {\n const percentage = ((current / total) * 100).toFixed(1)\n const filledBarLength = Math.round((progressBarWidth * current) / total)\n const emptyBarLength = progressBarWidth - filledBarLength\n const filledBar = colorLog.blueBright('█'.repeat(filledBarLength))\n const emptyBar = ' '.repeat(emptyBarLength)\n const itemsPerSecond =\n elapsedTime > 0 ? (current / elapsedTime).toFixed(2) : '0.00'\n\n process.stdout.write(\n `\\r${msg}: ${current} / ${total} (${colorLog.yellow(percentage)}%): 100%|${filledBar}${emptyBar}| Success: ${success}/${total} [${colorLog.red(elapsedTime.toFixed(2))}, ${itemsPerSecond}it/s]`\n )\n}\n\nexport const validateValue = (\n field: Readonly<AxField>,\n value: Readonly<AxFieldValue>\n): void => {\n const ft = field.type ?? { name: 'string', isArray: false }\n\n const validateSingleValue = (\n expectedType: string,\n val: Readonly<AxFieldValue>\n ): boolean => {\n switch (expectedType) {\n case 'code':\n return typeof val === 'string'\n case 'string':\n return typeof val === 'string'\n case 'number':\n return typeof val === 'number'\n case 'boolean':\n return typeof val === 'boolean'\n case 'date':\n return val instanceof Date || typeof val === 'string'\n case 'datetime':\n return val instanceof Date || typeof val === 'string'\n case 'json':\n return typeof val === 'object' || typeof val === 'string'\n default:\n return false // Unknown or unsupported type\n }\n }\n\n const validImage = (val: Readonly<AxFieldValue>): boolean => {\n if (\n !val ||\n typeof val !== 'object' ||\n !('mimeType' in val) ||\n !('data' in val)\n ) {\n return false\n }\n return true\n }\n\n if (field.type?.name === 'image') {\n let msg: string | undefined\n if (Array.isArray(value)) {\n for (const item of value) {\n if (!validImage(item)) {\n msg = 'object ({ mimeType: string; data: string })'\n break\n }\n }\n } else if (!validImage(value)) {\n msg = 'object ({ mimeType: string; data: string })'\n }\n\n if (msg) {\n throw new Error(\n `Validation failed: Expected '${field.name}' to be a ${msg} instead got '${value}'`\n )\n }\n return\n }\n\n const validAudio = (val: Readonly<AxFieldValue>): boolean => {\n if (!val || typeof val !== 'object' || !('data' in val)) {\n return false\n }\n return true\n }\n\n if (field.type?.name === 'audio') {\n let msg: string | undefined\n if (Array.isArray(value)) {\n for (const item of value) {\n if (!validAudio(item)) {\n msg = 'object ({ data: string; format?: string })'\n break\n }\n }\n } else if (!validAudio(value)) {\n msg = 'object ({ data: string; format?: string })'\n }\n\n if (msg) {\n throw new Error(\n `Validation failed: Expected '${field.name}' to be a ${msg} instead got '${value}'`\n )\n }\n return\n }\n\n let isValid = true\n\n if (ft.isArray) {\n if (!Array.isArray(value)) {\n isValid = false\n } else {\n for (const item of value) {\n if (!validateSingleValue(ft.name, item)) {\n isValid = false\n break\n }\n }\n }\n } else {\n isValid = validateSingleValue(ft.name, value)\n }\n\n if (!isValid) {\n throw new Error(\n `Validation failed: Expected '${field.name}' to be a ${field.type?.isArray ? 'an array of ' : ''}${ft.name} instead got '${typeof value}' (${value})`\n )\n }\n}\n\nexport function mergeProgramUsage(\n usages: readonly AxProgramUsage[]\n): AxProgramUsage[] {\n const usageMap: { [key: string]: AxProgramUsage } = {}\n\n for (const usage of usages) {\n const key = `${usage.ai}:${usage.model}`\n\n if (!usageMap[key]) {\n usageMap[key] = { ...usage }\n continue\n }\n\n const currentUsage = usageMap[key]\n if (currentUsage) {\n currentUsage.promptTokens += usage.promptTokens\n currentUsage.completionTokens += usage.completionTokens\n currentUsage.totalTokens += usage.totalTokens\n }\n }\n\n return Object.values(usageMap)\n}\n\n/**\n * Parses a markdown list from a string. This is a very forgiving parser that\n * will try to handle anything that looks vaguely like a markdown list.\n */\nexport const parseMarkdownList = (input: string): string[] => {\n // Handle empty input\n if (!input.trim()) {\n return []\n }\n\n const listBullets = new Set(['-', '*', '+'])\n const numberedListRegex = /^\\d+[\\s]*[.)\\]]\\s*/\n\n const lines = input.split('\\n')\n const list = []\n\n for (const line of lines) {\n const trimmedLine = line.trim()\n // Skip empty lines\n if (!trimmedLine) {\n continue\n }\n\n // Check for bullet points\n if (trimmedLine[0] && listBullets.has(trimmedLine[0])) {\n list.push(trimmedLine.slice(1).trim())\n }\n // Check for numbered lists (e.g., \"1.\", \"2.\", etc.)\n else if (numberedListRegex.test(trimmedLine)) {\n list.push(trimmedLine.replace(numberedListRegex, '').trim())\n }\n // If it's not a list item and we haven't collected any items yet, do nothing\n else if (list.length === 0) {\n // Skip non-list lines at the beginning\n }\n // If we've already started collecting list items, then this non-list line\n //is an error\n else {\n throw new Error('Could not parse markdown list: mixed content detected')\n }\n }\n\n // If we didn't find any list items, throw error\n if (list.length === 0) {\n throw new Error('Could not parse markdown list: no valid list items found')\n }\n\n return list\n}\n\nexport function mergeDeltas<OUT>(\n base: Partial<AxGenOut>,\n delta: Partial<AxGenOut>\n) {\n for (const key of Object.keys(delta)) {\n const baseValue = base[key]\n const deltaValue = delta[key]\n\n if (baseValue === undefined && Array.isArray(deltaValue)) {\n base[key] = [...deltaValue]\n } else if (Array.isArray(baseValue) && Array.isArray(deltaValue)) {\n // Concatenate arrays\n base[key] = [...(baseValue ?? []), ...deltaValue]\n } else if (\n (baseValue === undefined || typeof baseValue === 'string') &&\n typeof deltaValue === 'string'\n ) {\n // Concatenate strings\n base[key] = (baseValue ?? '') + deltaValue\n } else {\n // For all other types, overwrite with the new value\n base[key] = deltaValue\n }\n }\n return base as OUT\n}\n\nexport class LRUCache<K, V> {\n private cache = new Map<K, V>()\n private readonly maxSize: number\n\n constructor(maxSize: number) {\n this.maxSize = maxSize\n }\n\n get(key: K): V | undefined {\n const value = this.cache.get(key)\n if (value) {\n // Refresh position by deleting and re-adding\n this.cache.delete(key)\n this.cache.set(key, value)\n }\n return value\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n this.cache.delete(key)\n } else if (this.cache.size >= this.maxSize) {\n // Remove oldest entry (first item in map)\n const firstKey = this.cache.keys().next().value\n if (firstKey) {\n this.cache.delete(firstKey)\n }\n }\n this.cache.set(key, value)\n }\n}\n\nconst globalPrefixCache = new LRUCache<string, string[]>(500)\n\n/**\n * Checks if a streaming string matches a prefix, either fully or partially from the end.\n * For streaming content, partial matches are checked from shortest to longest since\n * the content grows at the end and we want to detect partial prefixes as they form.\n * @param content The string to check (potentially streaming)\n * @param prefix The prefix to look for\n * @param startIndex Optional starting index for the search\n * @returns\n * - index >= 0: Position of full match\n * - -1: No match found\n * - -2: Partial match from the end\n * - -3: String is only whitespace\n */\nexport function matchesContent(\n content: string,\n prefix: string,\n startIndex = 0,\n prefixCache: LRUCache<string, string[]> = globalPrefixCache\n): number {\n // Check if string starts with a markdown block with optional language\n if (/^```[a-zA-Z]*\\s*$/.test(content)) {\n return -4\n }\n\n // Check if string is only whitespace\n if (/^[\\s`]*$/.test(content)) {\n return -3\n }\n\n // First check if the complete prefix exists anywhere after startIndex\n const exactMatchIndex = content.indexOf(prefix, startIndex)\n\n if (exactMatchIndex !== -1) {\n return exactMatchIndex\n }\n\n // Get or create cached prefixes\n const prefixes =\n prefixCache.get(prefix) ??\n Array.from({ length: prefix.length }, (_, i) => prefix.slice(0, i + 1))\n\n // Set in cache if it wasn't there\n if (!prefixCache.get(prefix)) {\n prefixCache.set(prefix, prefixes)\n }\n\n // Get the content slice we'll check for partial matches\n const contentEnd = content.slice(\n Math.max(startIndex, content.length - prefix.length)\n )\n\n // Check for partial matches at the end, starting from shortest to longest\n // Skip the full prefix as it was already checked\n for (let i = 0; i < prefixes.length - 1; i++) {\n const partialPrefix = prefixes[i]\n if (partialPrefix && contentEnd.endsWith(partialPrefix)) {\n return -2\n }\n }\n\n return -1\n}\n\nexport const formatTime = (ms: number): string => {\n const seconds = Math.floor(ms / 1000)\n if (seconds < 60) return `${seconds}s`\n\n const minutes = Math.floor(seconds / 60)\n const remainingSeconds = seconds % 60\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`\n\n const hours = Math.floor(minutes / 60)\n const remainingMinutes = minutes % 60\n return `${hours}h ${remainingMinutes}m ${remainingSeconds}s`\n}\n\nexport const calculateETA = (\n current: number,\n total: number,\n elapsedMs: number\n): string => {\n if (current === 0) return 'calculating...'\n\n const msPerItem = elapsedMs / current\n const remainingItems = total - current\n const etaMs = msPerItem * remainingItems\n\n return formatTime(etaMs)\n}\n\ninterface ProgressConfigInfo {\n maxRounds: number\n batchSize: number\n earlyStoppingPatience: number\n costMonitoring: boolean\n verboseMode: boolean\n debugMode: boolean\n}\n\nexport const updateDetailedProgress = <T extends AxGenOut = AxGenOut>(\n roundIndex: number,\n current: number,\n total: number,\n elapsedTime: number,\n example: Readonly<AxExample>,\n stats: Readonly<AxOptimizationStats>,\n configInfo: Readonly<ProgressConfigInfo>,\n result?: T,\n error?: Error\n): void => {\n // Clear line and create a formatted output\n process.stdout.write('\\r\\x1b[K')\n\n const percentage = ((current / total) * 100).toFixed(1)\n const formattedTime = formatTime(elapsedTime)\n const itemsPerSecond =\n elapsedTime > 0 ? ((current / elapsedTime) * 1000).toFixed(2) : '0.00'\n const eta = calculateETA(current, total, elapsedTime)\n\n // Basic progress info (always shown)\n let output = `Round ${roundIndex + 1}/${configInfo.maxRounds}: ${current}/${total} (${percentage}%) [${formattedTime}, ${itemsPerSecond} it/s, ETA: ${eta}]`\n\n // Add success stats\n const successRate =\n stats.totalCalls > 0 ? (stats.successfulDemos / stats.totalCalls) * 100 : 0\n output += ` | Success: ${stats.successfulDemos}/${stats.totalCalls} (${successRate.toFixed(1)}%)`\n\n // Additional info for verbose mode\n if (configInfo.verboseMode || configInfo.debugMode) {\n if (configInfo.costMonitoring) {\n output += `\\n Tokens: ~${stats.estimatedTokenUsage.toLocaleString()} total`\n }\n\n output += `\\n Batch: ${Math.floor(current / configInfo.batchSize) + 1}/${Math.ceil(total / configInfo.batchSize)}`\n\n if (configInfo.earlyStoppingPatience > 0 && stats.earlyStopping) {\n output += `\\n Best round: ${stats.earlyStopping.bestScoreRound + 1}, Patience: ${configInfo.earlyStoppingPatience}`\n }\n }\n\n // Debug mode gets even more info\n if (configInfo.debugMode) {\n // Truncate example keys for display\n const exampleKeys = Object.keys(example)\n .map((k) => {\n const valueStr = JSON.stringify(example[k])\n const truncated =\n valueStr.length > 30 ? `${valueStr.substring(0, 30)}...` : valueStr\n return `${k}: ${truncated}`\n })\n .join(', ')\n\n output += `\\n Example: {${exampleKeys}}`\n\n if (error) {\n output += `\\n ERROR: ${error.message}`\n } else if (result) {\n // Truncate result for display\n const resultStr = JSON.stringify(result)\n const truncatedResult =\n resultStr.length > 50 ? `${resultStr.substring(0, 50)}...` : resultStr\n output += `\\n Result: ${truncatedResult}`\n }\n\n // Add temperature info\n output += `\\n Temperature: ${(0.7 + 0.001 * current).toFixed(3)}`\n }\n\n console.log(output)\n}\n","import type { Tracer } from '@opentelemetry/api'\n\nimport type {\n AxAIService,\n AxChatRequest,\n AxChatResponse,\n AxModelConfig,\n AxRateLimiterFunction,\n} from '../ai/types.js'\nimport type { AxAIMemory } from '../mem/types.js'\n\nimport type { AxInputFunctionType } from './functions.js'\nimport { AxInstanceRegistry } from './registry.js'\nimport { AxSignature } from './sig.js'\nimport { mergeProgramUsage, validateValue } from './util.js'\n\nexport type AxFieldValue =\n | string\n | string[]\n | number\n | boolean\n | object\n | null\n | undefined\n | { mimeType: string; data: string }\n | { mimeType: string; data: string }[]\n | { format?: 'wav'; data: string }\n | { format?: 'wav'; data: string }[]\n\nexport type AxGenIn = { [key: symbol]: AxFieldValue }\n\nexport type AxGenOut = Record<string, AxFieldValue>\n\nexport type AxProgramTrace = {\n // examples: Record<string, Value>[];\n trace: Record<string, AxFieldValue>\n programId: string\n}\n\nexport type AxProgramDemos = {\n // examples: Record<string, Value>[];\n traces: Record<string, AxFieldValue>[]\n programId: string\n}\n\nexport type AxProgramExamples = AxProgramDemos | AxProgramDemos['traces']\n\nexport type AxProgramForwardOptions = {\n maxRetries?: number\n maxSteps?: number\n mem?: AxAIMemory\n ai?: AxAIService\n modelConfig?: AxModelConfig\n model?: string\n sessionId?: string\n traceId?: string | undefined\n tracer?: Tracer\n rateLimiter?: AxRateLimiterFunction\n stream?: boolean\n functions?: AxInputFunctionType\n functionCall?: AxChatRequest['functionCall']\n stopFunction?: string\n fastFail?: boolean\n debug?: boolean\n debugHideSystemPrompt?: boolean\n}\n\nexport type AxProgramStreamingForwardOptions = Omit<\n AxProgramForwardOptions,\n 'stream'\n>\n\nexport type AxGenDeltaOut<OUT> = {\n version: number\n delta: Partial<OUT>\n}\n\nexport type AxGenStreamingOut<OUT> = AsyncGenerator<\n AxGenDeltaOut<OUT>,\n // biome-ignore lint/suspicious/noConfusingVoidType: just cause\n void | OUT,\n unknown\n>\n\nexport interface AxTunable {\n setExamples: (examples: Readonly<AxProgramExamples>) => void\n setId: (id: string) => void\n setParentId: (parentId: string) => void\n getTraces: () => AxProgramTrace[]\n setDemos: (demos: readonly AxProgramDemos[]) => void\n}\n\nexport interface AxUsable {\n getUsage: () => AxProgramUsage[]\n resetUsage: () => void\n}\n\nexport type AxProgramUsage = AxChatResponse['modelUsage'] & {\n ai: string\n model: string\n}\n\nexport interface AxProgramWithSignatureOptions {\n description?: string\n}\n\nexport class AxProgramWithSignature<IN extends AxGenIn, OUT extends AxGenOut>\n implements AxTunable, AxUsable\n{\n protected signature: AxSignature\n protected sigHash: string\n\n protected examples?: Record<string, AxFieldValue>[]\n protected demos?: Record<string, AxFieldValue>[]\n protected trace?: Record<string, AxFieldValue>\n protected usage: AxProgramUsage[] = []\n\n private key: { id: string; custom?: boolean }\n private children: AxInstanceRegistry<Readonly<AxTunable & AxUsable>>\n\n constructor(\n signature: Readonly<AxSignature | string>,\n options?: Readonly<AxProgramWithSignatureOptions>\n ) {\n this.signature = new AxSignature(signature)\n this.sigHash = this.signature?.hash()\n this.children = new AxInstanceRegistry()\n this.key = { id: this.constructor.name }\n\n if (options?.description) {\n this.signature.setDescription(options.description)\n }\n }\n\n public getSignature() {\n return this.signature\n }\n\n public register(prog: Readonly<AxTunable & AxUsable>) {\n if (this.key) {\n prog.setParentId(this.key.id)\n }\n this.children.register(prog)\n }\n\n public async forward(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _ai: Readonly<AxAIService>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _values: IN,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxProgramForwardOptions>\n ): Promise<OUT> {\n throw new Error('forward() not implemented')\n }\n\n // biome-ignore lint/correctness/useYield: just a placeholder\n public async *streamingForward(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _ai: Readonly<AxAIService>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _values: IN,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxProgramStreamingForwardOptions>\n ): AxGenStreamingOut<OUT> {\n throw new Error('streamingForward() not implemented')\n }\n\n public setId(id: string) {\n this.key = { id, custom: true }\n for (const child of this.children) {\n child.setParentId(id)\n }\n }\n\n public setParentId(parentId: string) {\n if (!this.key.custom) {\n this.key.id = [parentId, this.key.id].join('/')\n }\n }\n\n public setExamples(examples: Readonly<AxProgramExamples>) {\n this._setExamples(examples)\n\n if (!('programId' in examples)) {\n return\n }\n\n for (const child of this.children) {\n child.setExamples(examples)\n }\n }\n\n private _setExamples(examples: Readonly<AxProgramExamples>) {\n let traces: Record<string, AxFieldValue>[] = []\n\n if ('programId' in examples && examples.programId === this.key.id) {\n traces = examples.traces\n }\n\n if (Array.isArray(examples)) {\n traces = examples\n }\n\n if (traces) {\n const sig = this.signature\n const fields = [...sig.getInputFields(), ...sig.getOutputFields()]\n\n this.examples = traces.map((e) => {\n const res: Record<string, AxFieldValue> = {}\n for (const f of fields) {\n const value = e[f.name]\n if (value) {\n validateValue(f, value)\n res[f.name] = value\n }\n }\n return res\n })\n }\n }\n\n public getTraces(): AxProgramTrace[] {\n let traces: AxProgramTrace[] = []\n\n if (this.trace) {\n traces.push({ trace: this.trace, programId: this.key.id })\n }\n\n for (const child of this.children) {\n const _traces = child.getTraces()\n traces = [...traces, ..._traces]\n }\n return traces\n }\n\n public getUsage(): AxProgramUsage[] {\n let usage: AxProgramUsage[] = [...(this.usage ?? [])]\n\n for (const child of this.children) {\n const cu = child.getUsage()\n usage = [...usage, ...cu]\n }\n return mergeProgramUsage(usage)\n }\n\n public resetUsage() {\n this.usage = []\n for (const child of this.children) {\n child.resetUsage()\n }\n }\n\n public setDemos(demos: readonly AxProgramDemos[]) {\n // biome-ignore lint/complexity/useFlatMap: it can't\n this.demos = demos\n .filter((v) => v.programId === this.key.id)\n .map((v) => v.traces)\n .flat()\n\n for (const child of this.children) {\n child.setDemos(demos)\n }\n }\n}\n\nexport class AxProgram<IN extends AxGenIn, OUT extends AxGenOut>\n implements AxTunable, AxUsable\n{\n protected trace?: Record<string, AxFieldValue>\n protected usage: AxProgramUsage[] = []\n\n private key: { id: string; custom?: boolean }\n private children: AxInstanceRegistry<Readonly<AxTunable & AxUsable>>\n\n constructor() {\n this.children = new AxInstanceRegistry()\n this.key = { id: this.constructor.name }\n }\n\n public register(prog: Readonly<AxTunable & AxUsable>) {\n if (this.key) {\n prog.setParentId(this.key.id)\n }\n this.children.register(prog)\n }\n\n public async forward(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _ai: Readonly<AxAIService>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _values: IN,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxProgramForwardOptions>\n ): Promise<OUT> {\n throw new Error('forward() not implemented')\n }\n\n // biome-ignore lint/correctness/useYield: just a placeholder\n public async *streamingForward(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _ai: Readonly<AxAIService>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _values: IN,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxProgramStreamingForwardOptions>\n ): AxGenStreamingOut<OUT> {\n throw new Error('streamingForward() not implemented')\n }\n\n public setId(id: string) {\n this.key = { id, custom: true }\n for (const child of this.children) {\n child.setParentId(id)\n }\n }\n\n public setParentId(parentId: string) {\n if (!this.key.custom) {\n this.key.id = [parentId, this.key.id].join('/')\n }\n }\n\n public setExamples(examples: Readonly<AxProgramExamples>) {\n if (!('programId' in examples)) {\n return\n }\n\n for (const child of this.children) {\n child.setExamples(examples)\n }\n }\n\n public getTraces(): AxProgramTrace[] {\n let traces: AxProgramTrace[] = []\n\n if (this.trace) {\n traces.push({ trace: this.trace, programId: this.key.id })\n }\n\n for (const child of this.children) {\n const _traces = child.getTraces()\n traces = [...traces, ..._traces]\n }\n return traces\n }\n\n public getUsage(): AxProgramUsage[] {\n let usage: AxProgramUsage[] = [...(this.usage ?? [])]\n\n for (const child of this.children) {\n const cu = child.getUsage()\n usage = [...usage, ...cu]\n }\n return mergeProgramUsage(usage)\n }\n\n public resetUsage() {\n this.usage = []\n for (const child of this.children) {\n child.resetUsage()\n }\n }\n\n public setDemos(demos: readonly AxProgramDemos[]) {\n for (const child of this.children) {\n child.setDemos(demos)\n }\n }\n}\n","import type { AxChatRequest } from '../ai/types.js'\n\nimport { formatDateWithTimezone } from './datetime.js'\nimport type { AxInputFunctionType } from './functions.js'\nimport { type AxFieldValue } from './program.js'\nimport type { AxField, AxIField, AxSignature } from './sig.js'\nimport { validateValue } from './util.js'\n\ntype Writeable<T> = { -readonly [P in keyof T]: T[P] }\ntype AxChatRequestChatPrompt = Writeable<AxChatRequest['chatPrompt'][0]>\n\ntype ChatRequestUserMessage = Exclude<\n Extract<AxChatRequestChatPrompt, { role: 'user' }>['content'],\n string\n>\n\nconst functionCallInstructions = `\n## Function Call Instructions\n- Complete the task, using the functions defined earlier in this prompt. \n- Call functions step-by-step, using the output of one function as input to the next.\n- Use the function results to generate the output fields.`\n\nconst formattingRules = `\n## Strict Output Formatting Rules\n- Output must strictly follow the defined plain-text \\`field name: value\\` field format.\n- Output field, values must strictly adhere to the specified output field formatting rules.\n- Do not add any text before or after the output fields, just the field name and value.\n- Do not use code blocks.`\n\nexport type AxFieldTemplateFn = (\n field: Readonly<AxField>,\n value: Readonly<AxFieldValue>\n) => ChatRequestUserMessage\n\nexport class AxPromptTemplate {\n private sig: Readonly<AxSignature>\n private fieldTemplates?: Record<string, AxFieldTemplateFn>\n private task: { type: 'text'; text: string }\n\n constructor(\n sig: Readonly<AxSignature>,\n functions?: Readonly<AxInputFunctionType>,\n fieldTemplates?: Record<string, AxFieldTemplateFn>\n ) {\n this.sig = sig\n this.fieldTemplates = fieldTemplates\n\n const task = []\n\n const inArgs = renderDescFields(this.sig.getInputFields())\n const outArgs = renderDescFields(this.sig.getOutputFields())\n task.push(\n `You will be provided with the following fields: ${inArgs}. Your task is to generate new fields: ${outArgs}.`\n )\n\n // biome-ignore lint/complexity/useFlatMap: you cannot use flatMap here\n const funcs = functions\n ?.map((f) => ('toFunction' in f ? f.toFunction() : f))\n ?.flat()\n\n const funcList = funcs\n ?.map((fn) => `- \\`${fn.name}\\`: ${formatDescription(fn.description)}`)\n .join('\\n')\n\n if (funcList && funcList.length > 0) {\n task.push(`## Available Functions\\n${funcList}`)\n }\n\n const inputFields = renderInputFields(this.sig.getInputFields())\n task.push(`## Input Fields\\n${inputFields}`)\n\n const outputFields = renderOutputFields(this.sig.getOutputFields())\n task.push(`## Output Fields\\n${outputFields}`)\n\n if (funcList && funcList.length > 0) {\n task.push(functionCallInstructions.trim())\n }\n\n task.push(formattingRules.trim())\n\n const desc = this.sig.getDescription()\n if (desc) {\n const text = formatDescription(desc)\n task.push(text)\n }\n\n this.task = {\n type: 'text' as const,\n text: task.join('\\n\\n'),\n }\n }\n\n public render = <T extends Record<string, AxFieldValue>>(\n values: T,\n {\n examples,\n demos,\n }: Readonly<{\n skipSystemPrompt?: boolean\n examples?: Record<string, AxFieldValue>[]\n demos?: Record<string, AxFieldValue>[]\n }>\n ): AxChatRequest['chatPrompt'] => {\n const renderedExamples = examples\n ? [\n { type: 'text' as const, text: '\\n\\n## Examples\\n' },\n ...this.renderExamples(examples),\n ]\n : []\n\n const renderedDemos = demos ? this.renderDemos(demos) : []\n\n const completion = this.renderInputFields(values)\n\n // Check if demos and examples are all text type\n const allTextExamples = renderedExamples.every((v) => v.type === 'text')\n const allTextDemos = renderedDemos.every((v) => v.type === 'text')\n const examplesInSystemPrompt = allTextExamples && allTextDemos\n\n let systemContent = this.task.text\n\n if (examplesInSystemPrompt) {\n const combinedItems = [\n { type: 'text' as const, text: systemContent },\n ...renderedExamples,\n ...renderedDemos,\n ]\n combinedItems.reduce(combineConsecutiveStrings(''), [])\n\n if (combinedItems && combinedItems[0]) {\n systemContent = combinedItems[0].text\n }\n }\n\n const systemPrompt = {\n role: 'system' as const,\n content: systemContent,\n }\n\n const promptList: ChatRequestUserMessage = examplesInSystemPrompt\n ? completion\n : [...renderedExamples, ...renderedDemos, ...completion]\n\n const prompt = promptList.filter((v) => v !== undefined)\n\n const userContent = prompt.every((v) => v.type === 'text')\n ? prompt.map((v) => v.text).join('\\n')\n : prompt.reduce(combineConsecutiveStrings('\\n'), [])\n\n const userPrompt = {\n role: 'user' as const,\n content: userContent,\n }\n\n return [systemPrompt, userPrompt]\n }\n\n public renderExtraFields = (extraFields: readonly AxIField[]) => {\n const prompt: ChatRequestUserMessage = []\n\n if (!extraFields || extraFields.length === 0) {\n return prompt\n }\n\n // First, group fields by title\n const groupedFields = extraFields.reduce(\n (acc, field) => {\n const title = field.title\n if (!acc[title]) {\n acc[title] = []\n }\n acc[title].push(field)\n return acc\n },\n {} as Record<string, AxIField[]>\n )\n\n // Convert grouped fields into formatted data\n const formattedGroupedFields = Object.entries(groupedFields)\n .map(([title, fields]) => {\n if (fields.length === 1) {\n // Single field case\n const field = fields[0]!\n return {\n title,\n name: field.name,\n description: field.description,\n }\n } else if (fields.length > 1) {\n // Multiple fields case - format as markdown list\n const valuesList = fields\n .map((field) => `- ${field.description}`)\n .join('\\n')\n return {\n title,\n name: fields[0]!.name,\n description: valuesList,\n }\n }\n })\n .filter(Boolean) as AxIField[]\n\n // Now render each formatted group using the appropriate template\n formattedGroupedFields.forEach((field) => {\n const fn = this.fieldTemplates?.[field.name] ?? this.defaultRenderInField\n prompt.push(...fn(field, field.description))\n })\n\n return prompt\n }\n\n private renderExamples = (data: Readonly<Record<string, AxFieldValue>[]>) => {\n const list: ChatRequestUserMessage = []\n\n for (const [index, item] of data.entries()) {\n const renderedInputItem = this.sig\n .getInputFields()\n .map((field) => this.renderInField(field, item, true))\n .filter((v) => v !== undefined)\n .flat()\n\n const renderedOutputItem = this.sig\n .getOutputFields()\n .map((field) => this.renderInField(field, item, true))\n .filter((v) => v !== undefined)\n .flat()\n\n if (renderedOutputItem.length === 0) {\n throw new Error(\n `Output fields are required in examples: index: ${index}, data: ${JSON.stringify(item)}`\n )\n }\n\n const renderedItem = [...renderedInputItem, ...renderedOutputItem]\n\n if (\n index > 0 &&\n renderedItem.length > 0 &&\n renderedItem[0]?.type === 'text'\n ) {\n list.push({ type: 'text' as const, text: '---\\n\\n' })\n }\n\n renderedItem.forEach((v) => {\n if ('text' in v) {\n v.text = v.text + '\\n'\n }\n if ('image' in v) {\n v.image = v.image\n }\n list.push(v)\n })\n }\n\n return list\n }\n\n private renderDemos = (data: Readonly<Record<string, AxFieldValue>[]>) => {\n const list: ChatRequestUserMessage = []\n\n const fields = [...this.sig.getInputFields(), ...this.sig.getOutputFields()]\n\n for (const item of data) {\n const renderedItem = fields\n .map((field) => this.renderInField(field, item, true))\n .filter((v) => v !== undefined)\n .flat()\n\n renderedItem.slice(0, -1).forEach((v) => {\n if ('text' in v) {\n v.text = v.text + '\\n'\n }\n if ('image' in v) {\n v.image = v.image\n }\n list.push(v)\n })\n }\n\n return list\n }\n\n private renderInputFields = <T extends Record<string, AxFieldValue>>(\n values: T\n ) => {\n const renderedItems = this.sig\n .getInputFields()\n .map((field) => this.renderInField(field, values))\n .filter((v) => v !== undefined)\n .flat()\n\n renderedItems\n .filter((v) => v.type === 'text')\n .forEach((v) => {\n v.text = v.text + '\\n'\n })\n\n return renderedItems\n }\n\n private renderInField = (\n field: Readonly<AxField>,\n values: Readonly<Record<string, AxFieldValue>>,\n skipMissing?: boolean\n ) => {\n const value = values[field.name]\n\n if (skipMissing && !value) {\n return\n }\n\n if (isEmptyValue(field, value)) {\n return\n }\n\n if (field.type) {\n validateValue(field, value!)\n }\n\n const processedValue = processValue(field, value!)\n\n const textFieldFn: AxFieldTemplateFn =\n this.fieldTemplates?.[field.name] ?? this.defaultRenderInField\n\n return textFieldFn(field, processedValue)\n }\n\n private defaultRenderInField = (\n field: Readonly<AxField>,\n value: Readonly<AxFieldValue>\n ): ChatRequestUserMessage => {\n if (field.type?.name === 'image') {\n const validateImage = (\n value: Readonly<AxFieldValue>\n ): { mimeType: string; data: string } => {\n if (!value) {\n throw new Error('Image field value is required.')\n }\n\n if (typeof value !== 'object') {\n throw new Error('Image field value must be an object.')\n }\n if (!('mimeType' in value)) {\n throw new Error('Image field must have mimeType')\n }\n if (!('data' in value)) {\n throw new Error('Image field must have data')\n }\n return value\n }\n\n let result: ChatRequestUserMessage = [\n { type: 'text', text: `${field.title}: ` as string },\n ]\n\n if (field.type.isArray) {\n if (!Array.isArray(value)) {\n throw new Error('Image field value must be an array.')\n }\n result = result.concat(\n value.map((v) => {\n v = validateImage(v)\n return {\n type: 'image',\n mimeType: v.mimeType,\n image: v.data,\n }\n })\n )\n } else {\n const v = validateImage(value)\n result.push({\n type: 'image',\n mimeType: v.mimeType,\n image: v.data,\n })\n }\n return result\n }\n\n if (field.type?.name === 'audio') {\n const validateAudio = (\n value: Readonly<AxFieldValue>\n ): { format?: 'wav'; data: string } => {\n if (!value) {\n throw new Error('Audio field value is required.')\n }\n\n if (typeof value !== 'object') {\n throw new Error('Audio field value must be an object.')\n }\n if (!('data' in value)) {\n throw new Error('Audio field must have data')\n }\n return value\n }\n\n let result: ChatRequestUserMessage = [\n { type: 'text', text: `${field.title}: ` as string },\n ]\n\n if (field.type.isArray) {\n if (!Array.isArray(value)) {\n throw new Error('Image field value must be an array.')\n }\n result = result.concat(\n value.map((v) => {\n v = validateAudio(v)\n return {\n type: 'audio',\n format: v.format ?? 'wav',\n data: v.data,\n }\n })\n )\n } else {\n const v = validateAudio(value)\n result.push({\n type: 'audio',\n format: v.format ?? 'wav',\n data: v.data,\n })\n }\n return result\n }\n\n const text = [field.title, ': ']\n\n if (Array.isArray(value)) {\n text.push('\\n')\n text.push(value.map((v) => `- ${v}`).join('\\n'))\n } else {\n text.push(value as string)\n }\n return [{ type: 'text', text: text.join('') }]\n }\n}\n\nconst renderDescFields = (list: readonly AxField[]) =>\n list.map((v) => `\\`${v.title}\\``).join(', ')\n\nconst renderInputFields = (fields: readonly AxField[]) => {\n // Transform each field into table row\n const rows = fields.map((field) => {\n const name = field.title\n const type = field.type?.name ? toFieldType(field.type) : 'string'\n\n const requiredMsg = field.isOptional\n ? `This optional ${type} field may be omitted`\n : `A ${type} field`\n\n const description = field.description\n ? ` ${formatDescription(field.description)}`\n : ''\n\n return `${name}: (${requiredMsg})${description}`.trim()\n })\n\n return rows.join('\\n')\n}\n\nconst renderOutputFields = (fields: readonly AxField[]) => {\n // Transform each field into table row\n const rows = fields.map((field) => {\n const name = field.title\n const type = field.type?.name ? toFieldType(field.type) : 'string'\n\n const requiredMsg = field.isOptional\n ? `Only include this ${type} field if its value is available`\n : `This ${type} field must be included`\n\n const description = field.description\n ? ` ${formatDescription(field.description)}`\n : ''\n\n return `${name}: (${requiredMsg})${description}`.trim()\n })\n\n return rows.join('\\n')\n}\n\nconst processValue = (\n field: Readonly<AxField>,\n value: Readonly<AxFieldValue>\n): AxFieldValue => {\n if (field.type?.name === 'date' && value instanceof Date) {\n const v = value.toISOString()\n return v.slice(0, v.indexOf('T'))\n }\n if (field.type?.name === 'datetime' && value instanceof Date) {\n return formatDateWithTimezone(value)\n }\n if (field.type?.name === 'image' && typeof value === 'object') {\n return value\n }\n if (field.type?.name === 'audio' && typeof value === 'object') {\n return value\n }\n if (typeof value === 'string') {\n return value\n }\n return JSON.stringify(value, null, 2)\n}\n\n// const toVar = (name: string, type?: Readonly<Field['type']>) => {\n// const fmt = type ? type.name + (type.isArray ? '[]' : '') : undefined;\n\n// return '${' + name + (fmt ? `:${fmt}` : '') + '}';\n// };\n\nexport const toFieldType = (type: Readonly<AxField['type']>) => {\n const baseType = (() => {\n switch (type?.name) {\n case 'string':\n return 'string'\n case 'number':\n return 'number'\n case 'boolean':\n return 'boolean'\n case 'date':\n return 'date (\"YYYY-MM-DD\" format)'\n case 'datetime':\n return 'date time (\"YYYY-MM-DD HH:mm Timezone\" format)'\n case 'json':\n return 'JSON object'\n case 'class':\n return `classification class (allowed classes: ${type.classes?.join(', ')})`\n case 'code':\n return 'code'\n default:\n return 'string'\n }\n })()\n\n return type?.isArray ? `json array of ${baseType} items` : baseType\n}\n\nfunction combineConsecutiveStrings(separator: string) {\n return (\n acc: ChatRequestUserMessage,\n\n current: ChatRequestUserMessage[0]\n ) => {\n if (current.type === 'text') {\n const previous = acc.length > 0 ? acc[acc.length - 1] : null\n if (previous && previous.type === 'text') {\n // If the last item in the accumulator is a string, append the current string to it with the separator\n previous.text += separator + current.text\n } else {\n // Otherwise, push the current string into the accumulator\n acc.push(current)\n }\n } else {\n // If current is not of type 'text', just add it to the accumulator\n acc.push(current)\n }\n return acc\n }\n}\n\nconst isEmptyValue = (\n field: Readonly<AxField>,\n value?: Readonly<AxFieldValue>\n) => {\n // Boolean type can't be empty\n if (typeof value === 'boolean') {\n return false\n }\n\n if (\n !value ||\n ((Array.isArray(value) || typeof value === 'string') && value.length === 0)\n ) {\n if (field.isOptional) {\n return true\n }\n throw new Error(`Value for input field '${field.name}' is required.`)\n }\n return false\n}\n\nfunction formatDescription(str: string) {\n const value = str.trim()\n return value.length > 0\n ? `${value.charAt(0).toUpperCase()}${value.slice(1)}${value.endsWith('.') ? '' : '.'}`\n : ''\n}\n","import type { AxAIService } from '../ai/types.js'\nimport type { AxAIMemory } from '../mem/types.js'\nimport { ColorLog } from '../util/log.js'\n\nimport { AxPromptTemplate, toFieldType } from './prompt.js'\nimport type { AxField, AxIField } from './sig.js'\n\nconst colorLog = new ColorLog()\n\nexport class ValidationError extends Error {\n private fields: AxField[]\n\n constructor({\n message,\n fields,\n }: Readonly<{\n message: string\n fields: AxField[]\n value?: string\n }>) {\n super(message)\n this.fields = fields\n this.name = this.constructor.name\n }\n\n public getFixingInstructions = () => {\n return this.fields.map((field) => ({\n name: 'outputError',\n title: 'Output Correction Required',\n description: `The section labeled '${field.title}' either was not generated by the LLM or does not match the expected format of '${toFieldType(field.type)}'. ${this.message} Please revise your response to ensure it conforms to the specified format.`,\n }))\n }\n}\n\nexport function handleValidationError(\n mem: AxAIMemory,\n errorFields: AxIField[],\n ai: Readonly<AxAIService>,\n promptTemplate: Readonly<AxPromptTemplate>,\n sessionId?: string\n) {\n mem.add(\n {\n role: 'user' as const,\n content: promptTemplate.renderExtraFields(errorFields),\n },\n sessionId\n )\n mem.addTag('error')\n\n if (ai.getOptions().debug) {\n const errors = errorFields\n .map((field) => `- ${field.title}: ${field.description}`)\n .join('\\n')\n\n process.stdout.write(colorLog.red(`\\n❌ Error Correction:\\n${errors}\\n`))\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nimport { parseLLMFriendlyDate, parseLLMFriendlyDateTime } from './datetime.js'\nimport type { AxField, AxSignature } from './sig.js'\nimport { matchesContent, parseMarkdownList } from './util.js'\nimport { ValidationError } from './validate.js'\n\nexport const extractValues = (\n sig: Readonly<AxSignature>,\n values: Record<string, unknown>,\n content: string\n) => {\n const xstate = { extractedFields: [], streamedIndex: {}, s: -1 }\n streamingExtractValues(sig, values, xstate, content)\n streamingExtractFinalValue(sig, values, xstate, content)\n}\n\nexport interface extractionState {\n prevFields?: { field: AxField; s: number; e: number }[]\n currField?: AxField\n currFieldIndex?: number\n extractedFields: AxField[]\n streamedIndex: Record<string, number>\n s: number\n inBlock?: boolean\n}\n\n// Helper function to check for missing required fields\nconst checkMissingRequiredFields = (\n xstate: Readonly<extractionState>,\n values: Record<string, unknown>,\n currentIndex: number\n) => {\n const missingFields: AxField[] = []\n\n // Check all fields up to the current index\n for (let i = 0; i < currentIndex; i++) {\n const field = xstate.extractedFields[i]\n if (field && !field.isOptional && values[field.name] === undefined) {\n missingFields.push(field)\n }\n }\n\n if (missingFields.length > 0) {\n throw new ValidationError({\n message: `Required ${missingFields.length === 1 ? 'field' : 'fields'} not found`,\n fields: missingFields,\n })\n }\n}\n\nexport const streamingExtractValues = (\n sig: Readonly<AxSignature>,\n values: Record<string, unknown>,\n // eslint-disable-next-line functional/prefer-immutable-types\n xstate: extractionState,\n content: string,\n streamingValidation: boolean = false\n) => {\n const fields = sig.getOutputFields()\n\n for (const [index, field] of fields.entries()) {\n if (field.name in values) {\n continue\n }\n\n const isFirst = xstate.extractedFields.length === 0\n const prefix = (isFirst ? '' : '\\n') + field.title + ':'\n let e = matchesContent(content, prefix, xstate.s === 0 ? 0 : xstate.s + 1)\n\n switch (e) {\n case -1:\n if (streamingValidation && values.length == 0 && !field.isOptional) {\n throw new ValidationError({\n message: 'Required field not found',\n fields: [field],\n })\n }\n continue // Field is not found, continue to the next field\n case -2:\n return true // Partial match at end, skip and gather more content\n case -3:\n return true // String is only whitespace, skip and gather more content\n case -4:\n xstate.inBlock = true\n return true // String is only backticks, skip and gather more content\n }\n // We found the next field!!!\n\n let prefixLen = prefix.length\n\n // Lets wrap up the last field which is still the current field\n if (xstate.currField) {\n const val = content.substring(xstate.s, e).trim()\n const parsedValue = validateAndParseFieldValue(xstate.currField, val)\n if (parsedValue !== undefined) {\n values[xstate.currField.name] = parsedValue\n }\n if (xstate.prevFields) {\n xstate.prevFields?.push({ field: xstate.currField, s: xstate.s, e })\n } else {\n xstate.prevFields = [{ field: xstate.currField, s: xstate.s, e }]\n }\n }\n\n checkMissingRequiredFields(xstate, values, index)\n\n // Lets update the state for the new current field\n xstate.s = e + prefixLen\n xstate.currField = field\n xstate.currFieldIndex = index\n\n if (!xstate.extractedFields.includes(field)) {\n xstate.extractedFields.push(field)\n }\n\n if (xstate.streamedIndex[field.name] === undefined) {\n xstate.streamedIndex[field.name] = 0\n }\n }\n}\n\nexport const streamingExtractFinalValue = (\n sig: Readonly<AxSignature>,\n values: Record<string, unknown>,\n // eslint-disable-next-line functional/prefer-immutable-types\n xstate: extractionState,\n content: string\n) => {\n if (xstate.currField) {\n let val = content.substring(xstate.s).trim()\n\n const parsedValue = validateAndParseFieldValue(xstate.currField, val)\n if (parsedValue !== undefined) {\n values[xstate.currField.name] = parsedValue\n }\n }\n const sigFields = sig.getOutputFields()\n\n // Check all previous required fields before processing current field\n checkMissingRequiredFields(xstate, values, sigFields.length)\n}\n\nconst convertValueToType = (\n field: Readonly<AxField>,\n val: string,\n required: boolean = false\n) => {\n switch (field.type?.name) {\n case 'code':\n return extractBlock(val)\n\n case 'string':\n return val\n\n case 'number': {\n const v = Number(val)\n if (Number.isNaN(v)) {\n if (field.isOptional && !required) {\n return\n }\n throw new Error('Invalid number')\n }\n return v\n }\n\n case 'boolean': {\n if (typeof val === 'boolean') {\n return val\n }\n const v = val.toLowerCase()\n if (v === 'true') {\n return true\n } else if (v === 'false') {\n return false\n } else {\n if (field.isOptional && !required) {\n return\n }\n throw new Error('Invalid boolean')\n }\n }\n case 'date':\n return parseLLMFriendlyDate(field, val, required)\n\n case 'datetime':\n return parseLLMFriendlyDateTime(field, val, required)\n\n case 'class':\n const className = val\n if (field.type.classes && !field.type.classes.includes(className)) {\n if (field.isOptional) {\n return\n }\n throw new Error(\n `Invalid class '${val}', expected one of the following: ${field.type.classes.join(', ')}`\n )\n }\n return className as string\n\n default:\n return val as string // Unknown type\n }\n}\n\nexport function* yieldDelta<OUT>(\n content: string,\n field: Readonly<AxField>,\n s: number,\n e: number,\n // eslint-disable-next-line functional/prefer-immutable-types\n xstate: extractionState\n) {\n const { name: fieldName, isInternal } = field\n const { isArray: fieldIsArray, name: fieldTypeName } = field.type ?? {}\n\n if (\n isInternal ||\n fieldIsArray ||\n (fieldTypeName && fieldTypeName !== 'string' && fieldTypeName !== 'code')\n ) {\n return\n }\n\n const pos = xstate.streamedIndex[fieldName] ?? 0\n const isFirstChunk = pos === 0\n\n const d1 = content.substring(s + pos, e)\n if (d1.length === 0) {\n return\n }\n\n // Remove trailing whitespace, tabs, and newlines\n let d2 = d1.replace(/\\s+$/, '')\n\n // If this field is a \"code\" type, remove trailing backticks\n if (xstate.currField?.type?.name === 'code') {\n d2 = d2.replace(/\\s*```\\s*$/, '')\n }\n\n // Only trim start for the first chunk\n let d3 = isFirstChunk ? d2.trimStart() : d2\n\n if (xstate.currField?.type?.name === 'code') {\n // Remove any leading triple-backtick fences (with optional language specifier)\n d3 = d3.replace(/^[ ]*```[a-zA-Z0-9]*\\n\\s*/, '')\n }\n\n if (d3.length > 0) {\n yield { [fieldName]: d3 } as Partial<OUT>\n xstate.streamedIndex[fieldName] = pos + d2.length\n }\n}\n\n// export function getStreamingDelta(\n// values: Record<string, unknown>,\n// // eslint-disable-next-line functional/prefer-immutable-types\n// xstate: extractionState\n// ) {\n// return processStreamingDelta(values, xstate)\n// }\n\nexport function* streamValues<OUT>(\n sig: Readonly<AxSignature>,\n content: string,\n values: Readonly<Record<string, OUT>>,\n // eslint-disable-next-line functional/prefer-immutable-types\n xstate: extractionState\n) {\n for (const prevField of xstate.prevFields ?? []) {\n const { field, s, e } = prevField\n yield* yieldDelta<OUT>(content, field, s, e, xstate)\n }\n xstate.prevFields = undefined\n\n if (!xstate.currField || xstate.currField.isInternal) {\n return\n }\n\n yield* yieldDelta<OUT>(\n content,\n xstate.currField,\n xstate.s,\n content.length,\n xstate\n )\n\n const outputFields = sig.getOutputFields()\n\n for (const key of Object.keys(values)) {\n const field = outputFields.find((f) => f.name === key)\n if (!field || field.isInternal) {\n continue\n }\n\n const value = values[key]\n\n if (Array.isArray(value)) {\n const s = xstate.streamedIndex?.[key] ?? 0\n const v = value.slice(s)\n if (v && v.length > 0) {\n yield { [key]: v } as Partial<OUT>\n xstate.streamedIndex[key] = s + 1\n }\n continue\n }\n\n if (!xstate.streamedIndex[key]) {\n yield { [key]: value } as Partial<OUT>\n xstate.streamedIndex[key] = 1\n }\n }\n}\n\nfunction validateAndParseFieldValue(\n field: Readonly<AxField>,\n fieldValue: string | undefined\n): unknown {\n if (\n !fieldValue ||\n fieldValue === '' ||\n /^(null|undefined)\\s*$/i.test(fieldValue)\n ) {\n if (field.isOptional) {\n return\n }\n throw new ValidationError({\n message: 'Required field is missing',\n fields: [field],\n value: fieldValue,\n })\n }\n\n let value: unknown | undefined\n\n if (field.type?.name === 'json') {\n try {\n const text = extractBlock(fieldValue)\n value = JSON.parse(text)\n return value\n } catch (e) {\n throw new ValidationError({\n message: 'Invalid JSON: ' + (e as Error).message,\n fields: [field],\n value: fieldValue,\n })\n }\n }\n\n if (field.type?.isArray) {\n try {\n try {\n value = JSON.parse(fieldValue)\n } catch {\n // If JSON parsing fails, try markdown parsing\n value = parseMarkdownList(fieldValue)\n }\n if (!Array.isArray(value)) {\n throw new Error('Expected an array')\n }\n } catch (e) {\n throw new ValidationError({\n message: 'Invalid Array: ' + (e as Error).message,\n fields: [field],\n value: fieldValue,\n })\n }\n }\n\n try {\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) {\n if (item !== undefined) {\n const v = typeof item === 'string' ? item.trim() : item\n value[index] = convertValueToType(field, v, true)\n }\n }\n } else {\n value = convertValueToType(field, fieldValue)\n }\n } catch (e) {\n throw new ValidationError({\n message: (e as Error).message,\n fields: [field],\n value: fieldValue,\n })\n }\n\n if (typeof value === 'string' && value === '') {\n return undefined\n }\n\n return value\n}\n\nexport const extractBlock = (input: string): string => {\n const markdownBlockPattern = /```([A-Za-z]*)\\n([\\s\\S]*?)\\n```/g\n const match = markdownBlockPattern.exec(input)\n if (!match) {\n return input\n }\n if (match.length === 3) {\n return match[2] as string\n }\n if (match.length === 2) {\n return match[1] as string\n }\n return input\n}\n","import type { AxAIMemory } from '../mem/types.js'\n\nimport type { extractionState } from './extract.js'\nimport type { AxFieldValue, AxGenOut } from './program.js'\nimport type { AxField } from './sig.js'\n\nexport type AxFieldProcessorProcess = (\n value: AxFieldValue,\n context?: Readonly<{\n values?: AxGenOut\n sessionId?: string\n done?: boolean\n }>\n) => unknown | Promise<unknown>\n\nexport type AxStreamingFieldProcessorProcess = (\n value: string,\n context?: Readonly<{\n values?: AxGenOut\n sessionId?: string\n done?: boolean\n }>\n) => unknown | Promise<unknown>\nexport interface AxFieldProcessor {\n field: Readonly<AxField>\n\n /**\n * Process the field value and return a new value (or undefined if no update is needed).\n * The returned value may be merged back into memory.\n * @param value - The current field value.\n * @param context - Additional context (e.g. memory and session id).\n */\n process: AxFieldProcessorProcess | AxStreamingFieldProcessorProcess\n}\n\n/**\n * For synchronous responses: iterates over registered field processors,\n * passing in the current values. If a processor returns a new value,\n * that value is merged into memory with a special role ('processor').\n */\nexport async function processFieldProcessors(\n fieldProcessors: AxFieldProcessor[],\n values: AxGenOut,\n mem: AxAIMemory,\n sessionId?: string\n) {\n for (const processor of fieldProcessors) {\n if (values[processor.field.name] === undefined) {\n continue\n }\n\n const processFn = processor.process as AxFieldProcessorProcess\n const result = await processFn(values[processor.field.name], {\n sessionId,\n values,\n done: true,\n })\n addToMemory(processor.field, mem, result, sessionId)\n }\n}\n\n/**\n * For streaming responses: processes each streaming field processor\n * and yields delta updates if they return new values.\n */\nexport async function processStreamingFieldProcessors(\n fieldProcessors: AxFieldProcessor[],\n content: string,\n xstate: Readonly<extractionState>,\n mem: AxAIMemory,\n values: AxGenOut,\n sessionId: string | undefined,\n done: boolean = false\n): Promise<void> {\n for (const processor of fieldProcessors) {\n if (xstate.currField?.name !== processor.field.name) {\n continue\n }\n\n let value = content.substring(xstate.s)\n\n if (xstate.currField?.type?.name === 'code') {\n // remove markdown block\n value = value.replace(/^[ ]*```[a-zA-Z0-9]*\\n\\s*/, '')\n value = value.replace(/\\s*```\\s*$/, '')\n }\n const processFn = processor.process as AxStreamingFieldProcessorProcess\n const result = await processFn(value, {\n sessionId,\n values,\n done,\n })\n\n addToMemory(xstate.currField, mem, result, sessionId)\n }\n}\n\nconst addToMemory = (\n field: Readonly<AxField>,\n mem: AxAIMemory,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n result: any | any[],\n sessionId?: string\n) => {\n if (\n result === undefined ||\n (typeof result === 'string' &&\n (result === '' || /^(null|undefined)\\s*$/i.test(result)))\n ) {\n return\n }\n\n let resultText = JSON.stringify(\n result,\n (key, value) => (typeof value === 'bigint' ? Number(value) : value),\n 2\n )\n\n const text = getFieldProcessingMessage(field, resultText)\n mem.add({ role: 'user', content: [{ type: 'text', text }] }, sessionId)\n mem.addTag(`processor`, sessionId)\n}\n\nfunction getFieldProcessingMessage(\n field: Readonly<AxField>,\n resultText: string\n) {\n const isCodeField = field.type?.name === 'code'\n const fieldTitle = field.title\n\n if (isCodeField) {\n return `Code in the field \"${fieldTitle}\" was executed. The code execution produced the following output: ${resultText}`\n } else {\n return `The field \"${fieldTitle}\" was processed. The field contents were transformed into the following output: ${resultText}`\n }\n}\n","import type { AxFunctionJSONSchema } from '../ai/types.js'\n\nexport const validateJSONSchema = (\n schema: Readonly<AxFunctionJSONSchema>\n): void => {\n const errors: string[] = []\n\n const validateSchemaObject = (\n schema: Readonly<AxFunctionJSONSchema>,\n path: string = ''\n ): void => {\n const validTypes = [\n 'array',\n 'integer',\n 'number',\n 'string',\n 'boolean',\n 'null',\n 'object',\n ]\n\n if (!validTypes.includes(schema.type)) {\n errors.push(`Invalid type '${schema.type}' at ${path || 'root'}`)\n return\n }\n\n if (schema.type === 'object' && schema.properties) {\n if (\n typeof schema.properties !== 'object' ||\n Array.isArray(schema.properties)\n ) {\n errors.push(`Invalid properties object at ${path || 'root'}`)\n } else {\n for (const key in schema.properties) {\n const value = schema.properties[key]\n if (typeof value !== 'object') {\n errors.push(`Invalid schema object at ${path}${key}`)\n continue\n }\n validateSchemaObject(value, `${path}${key}.`)\n }\n }\n\n if (schema.required && !Array.isArray(schema.required)) {\n errors.push(`'required' should be an array at ${path || 'root'}`)\n }\n }\n\n if (schema.type === 'array' && schema.items) {\n if (typeof schema.items !== 'object') {\n errors.push(`Invalid items schema at ${path || 'root'}`)\n } else {\n validateSchemaObject(schema.items, `${path}items.`)\n }\n }\n }\n\n validateSchemaObject(schema)\n\n if (errors.length > 0) {\n throw new Error(errors.join('; '))\n }\n}\n\n// Example Usage:\n\n/*\nconst validSchema: AxFunctionJSONSchema = {\n type: 'object',\n properties: {\n id: { type: 'integer' },\n name: { type: 'string' },\n email: { type: 'string' },\n isActive: { type: 'boolean' },\n tags: {\n type: 'array',\n items: { type: 'string' }\n }\n },\n required: ['id', 'name', 'email']\n};\n\nconst invalidSchema: any = {\n type: 'object',\n properties: {\n id: { type: 'integer' },\n name: { type: 'string' },\n email: { type: 'unknownType' }, // Invalid type\n isActive: { type: 'boolean' },\n tags: {\n type: 'array',\n items: { type: 'string' }\n }\n },\n required: 'id,name,email' // Invalid 'required' field\n};\n\ntry {\n validateSchemaStructure(validSchema);\n} catch (error) {\n console.error('Schema validation failed:', error.message);\n}\n\ntry {\n validateSchemaStructure(invalidSchema);\n} catch (error) {\n console.error('Schema validation failed:', error.message);\n}\n*/\n","import type {\n AxAIService,\n AxAIServiceActionOptions,\n AxChatRequest,\n AxChatResponseResult,\n AxFunction,\n} from '../ai/types.js'\nimport type { AxMemory } from '../mem/memory.js'\nimport { ColorLog } from '../util/log.js'\n\nimport { validateJSONSchema } from './jsonschema.js'\n\nconst colorLog = new ColorLog()\n\nexport class AxFunctionError extends Error {\n constructor(\n private fields: {\n field: string\n message: string\n }[]\n ) {\n super()\n this.name = this.constructor.name\n }\n\n getFields = () => this.fields\n}\n\ntype FunctionFieldErrors = ConstructorParameters<typeof AxFunctionError>[0]\n\nexport class FunctionError extends Error {\n constructor(\n private readonly fields: FunctionFieldErrors,\n private readonly func: Readonly<AxFunction>,\n private readonly funcId?: string\n ) {\n super()\n }\n\n getFunctionId = () => this.funcId\n\n private getFieldDescription(fieldName: string): string {\n if (!this.func.parameters?.properties?.[fieldName]) {\n return ''\n }\n\n const fieldSchema = this.func.parameters.properties[fieldName]\n let description = fieldSchema.description\n\n if (fieldSchema.enum?.length) {\n description += ` Allowed values are: ${fieldSchema.enum.join(', ')}`\n }\n\n return description\n }\n\n public getFixingInstructions = () => {\n const bulletPoints = this.fields.map((fieldError) => {\n const schemaDescription = this.getFieldDescription(fieldError.field) || ''\n return `- \\`${fieldError.field}\\` - ${fieldError.message} (${schemaDescription}).`\n })\n\n return `Errors In Function Arguments: Fix the following invalid arguments to '${this.func.name}'\\n${bulletPoints.join('\\n')}`\n }\n}\n\nexport type AxChatResponseFunctionCall = {\n id: string\n name: string\n args: string\n}\n\nexport class AxFunctionProcessor {\n private funcList: Readonly<AxFunction[]> = []\n\n constructor(funcList: Readonly<AxFunction[]>) {\n this.funcList = funcList\n }\n\n private executeFunction = async (\n fnSpec: Readonly<AxFunction>,\n func: Readonly<AxChatResponseFunctionCall>,\n options?: Readonly<AxAIServiceActionOptions>\n ) => {\n let args: unknown\n\n if (typeof func.args === 'string' && func.args.length > 0) {\n args = JSON.parse(func.args)\n } else {\n args = func.args\n }\n\n const opt = options\n ? {\n sessionId: options.sessionId,\n traceId: options.traceId,\n ai: options.ai,\n }\n : undefined\n\n if (!fnSpec.parameters) {\n const res =\n fnSpec.func.length === 1 ? await fnSpec.func(opt) : await fnSpec.func()\n\n return typeof res === 'string' ? res : JSON.stringify(res, null, 2)\n }\n\n const res =\n fnSpec.func.length === 2\n ? await fnSpec.func(args, opt)\n : await fnSpec.func(args)\n\n return typeof res === 'string' ? res : JSON.stringify(res, null, 2)\n }\n\n public execute = async (\n func: Readonly<AxChatResponseFunctionCall>,\n options?: Readonly<AxAIServiceActionOptions>\n ) => {\n const fnSpec = this.funcList.find(\n (v) => v.name.localeCompare(func.name) === 0\n )\n if (!fnSpec) {\n throw new Error(`Function not found: ${func.name}`)\n }\n if (!fnSpec.func) {\n throw new Error(`No handler for function: ${func.name}`)\n }\n\n // execute value function calls\n try {\n return await this.executeFunction(fnSpec, func, options)\n } catch (e) {\n if (e instanceof AxFunctionError) {\n throw new FunctionError(e.getFields(), fnSpec, func.id)\n }\n throw e\n }\n }\n}\n\nexport type AxInputFunctionType = (\n | AxFunction\n | {\n toFunction: () => AxFunction | AxFunction[]\n }\n)[]\n\nexport const parseFunctions = (\n newFuncs: Readonly<AxInputFunctionType>,\n existingFuncs?: readonly AxFunction[]\n): AxFunction[] => {\n if (newFuncs.length === 0) {\n return [...(existingFuncs ?? [])]\n }\n\n // biome-ignore lint/complexity/useFlatMap: cannot use flatMap here\n const functions = newFuncs\n .map((f) => {\n if ('toFunction' in f) {\n return f.toFunction()\n }\n return f\n })\n .flat()\n\n for (const fn of functions.filter((v) => v.parameters)) {\n if (fn.parameters) {\n validateJSONSchema(fn.parameters)\n }\n }\n\n return [...(existingFuncs ?? []), ...functions]\n}\n\ntype FunctionPromise =\n | undefined\n | Promise<Extract<AxChatRequest['chatPrompt'][number], { role: 'function' }>>\n\nexport const processFunctions = async (\n ai: Readonly<AxAIService>,\n functionList: Readonly<AxFunction[]>,\n functionCalls: readonly AxChatResponseFunctionCall[],\n mem: Readonly<AxMemory>,\n sessionId?: string,\n traceId?: string\n) => {\n const funcProc = new AxFunctionProcessor(functionList)\n const functionsExecuted = new Set<string>()\n\n // Map each function call to a promise that resolves to the function result or null\n const promises = functionCalls.map((func) => {\n if (!func.id) {\n throw new Error(`Function ${func.name} did not return an ID`)\n }\n\n const promise: FunctionPromise = funcProc\n .execute(func, { sessionId, traceId, ai })\n .then((functionResult) => {\n functionsExecuted.add(func.name.toLowerCase())\n\n return {\n role: 'function' as const,\n result: functionResult ?? '',\n functionId: func.id,\n }\n })\n .catch((e) => {\n if (e instanceof FunctionError) {\n const result = e.getFixingInstructions()\n mem.add(\n {\n role: 'function' as const,\n functionId: func.id,\n isError: true,\n result,\n },\n sessionId\n )\n mem.addTag('error')\n\n if (ai.getOptions().debug) {\n process.stdout.write(\n colorLog.red(`\\n❌ Function Error Correction:\\n${result}\\n`)\n )\n }\n } else {\n throw e\n }\n }) as FunctionPromise\n\n return promise\n })\n\n // Wait for all promises to resolve\n const results = await Promise.all(promises)\n\n for (const result of results) {\n if (result) {\n mem.add(result, sessionId)\n }\n }\n\n return functionsExecuted\n}\n\nexport function parseFunctionCalls(\n ai: Readonly<AxAIService>,\n functionCalls: Readonly<AxChatResponseResult['functionCalls']>,\n values: Record<string, unknown>,\n model?: string\n): AxChatResponseFunctionCall[] | undefined {\n if (!functionCalls || functionCalls.length === 0) {\n return\n }\n if (!ai.getFeatures(model).functions) {\n throw new Error('Functions are not supported by the AI service')\n }\n\n const funcs: AxChatResponseFunctionCall[] = functionCalls.map((f) => ({\n id: f.id,\n name: f.function.name,\n args: f.function.params as string,\n }))\n\n // for (const [i, f] of funcs.entries()) {\n // values['functionName' + i] = f.name;\n // values['functionArguments' + i] =\n // typeof f.args === 'object' ? JSON.stringify(f.args) : f.args;\n // }\n return funcs\n}\n","import type {\n AxAIModelList,\n AxAIService,\n AxFunction,\n AxFunctionHandler,\n AxFunctionJSONSchema,\n} from '../ai/types.js'\nimport type { AxInputFunctionType } from '../dsp/functions.js'\nimport { AxGen, type AxGenOptions } from '../dsp/generate.js'\nimport type {\n AxGenIn,\n AxGenOut,\n AxGenStreamingOut,\n AxProgramDemos,\n AxProgramExamples,\n AxProgramForwardOptions,\n AxProgramStreamingForwardOptions,\n AxProgramWithSignature,\n AxTunable,\n AxUsable,\n} from '../dsp/program.js'\nimport type { AxSignature } from '../dsp/sig.js'\n\n/**\n * Interface for agents that can be used as child agents.\n * Provides methods to get the agent's function definition and features.\n */\nexport interface AxAgentic extends AxTunable, AxUsable {\n getFunction(): AxFunction\n getFeatures(): AxAgentFeatures\n}\n\nexport type AxAgentOptions = Omit<AxGenOptions, 'functions'> & {\n disableSmartModelRouting?: boolean\n /** List of field names that should not be automatically passed from parent to child agents */\n excludeFieldsFromPassthrough?: string[]\n debug?: boolean\n}\n\nexport interface AxAgentFeatures {\n /** Whether this agent can use smart model routing (requires an AI service) */\n canConfigureSmartModelRouting: boolean\n /** List of fields that this agent excludes from parent->child value passing */\n excludeFieldsFromPassthrough: string[]\n}\n\n/**\n * Processes a child agent's function, applying model routing and input injection as needed.\n * Handles both the schema modifications and function wrapping.\n */\nfunction processChildAgentFunction<IN extends AxGenIn>(\n childFunction: Readonly<AxFunction>,\n parentValues: IN,\n parentInputKeys: string[],\n modelList: AxAIModelList | undefined,\n options: Readonly<{\n debug: boolean\n disableSmartModelRouting: boolean\n excludeFieldsFromPassthrough: string[]\n canConfigureSmartModelRouting: boolean\n }>\n): AxFunction {\n const processedFunction = { ...childFunction }\n\n // Process input field injection\n if (processedFunction.parameters) {\n const childKeys = processedFunction.parameters.properties\n ? Object.keys(processedFunction.parameters.properties)\n : []\n\n // Find common keys between parent and child, excluding 'model' and specified exclusions\n const commonKeys = parentInputKeys\n .filter((key) => childKeys.includes(key))\n .filter((key) => key !== 'model')\n const injectionKeys = commonKeys.filter(\n (key) => !options.excludeFieldsFromPassthrough.includes(key)\n )\n\n if (injectionKeys.length > 0) {\n // Remove injected fields from child schema\n processedFunction.parameters = removePropertiesFromSchema(\n processedFunction.parameters,\n injectionKeys\n )\n\n // Wrap function to inject parent values\n const originalFunc = processedFunction.func\n // add debug logging if enabled\n processedFunction.func = async (childArgs, funcOptions) => {\n const updatedChildArgs = {\n ...childArgs,\n ...pick(parentValues, injectionKeys as (keyof IN)[]),\n }\n\n if (options.debug && injectionKeys.length > 0) {\n process.stdout.write(\n `\\nFunction Params: ${JSON.stringify(updatedChildArgs, null, 2)}`\n )\n }\n\n return await originalFunc(updatedChildArgs, funcOptions)\n }\n }\n\n return processedFunction\n }\n\n // Apply smart model routing if enabled\n if (\n modelList &&\n !options.disableSmartModelRouting &&\n options.canConfigureSmartModelRouting\n ) {\n processedFunction.parameters = addModelParameter(\n processedFunction.parameters,\n modelList\n )\n }\n\n return processedFunction\n}\n\nconst descriptionError = new Error(\n 'Agent description must be at least 20 characters (explain in detail what the agent does)'\n)\n\nconst definitionError = new Error(\n 'Agent definition is the prompt you give to the LLM for the agent. It must be detailed and at least 100 characters'\n)\n\n/**\n * An AI agent that can process inputs using an AI service and coordinate with child agents.\n * Supports features like smart model routing and automatic input field passing to child agents.\n */\nexport class AxAgent<IN extends AxGenIn, OUT extends AxGenOut = AxGenOut>\n implements AxAgentic\n{\n private ai?: AxAIService\n private program: AxProgramWithSignature<IN, OUT>\n private functions?: AxInputFunctionType\n private agents?: AxAgentic[]\n private disableSmartModelRouting?: boolean\n private excludeFieldsFromPassthrough: string[]\n private debug?: boolean\n\n private name: string\n // private subAgentList?: string\n private func: AxFunction\n\n constructor(\n {\n ai,\n name,\n description,\n definition,\n signature,\n agents,\n functions,\n }: Readonly<{\n ai?: Readonly<AxAIService>\n name: string\n description: string\n definition?: string\n signature: AxSignature | string\n agents?: AxAgentic[]\n functions?: AxInputFunctionType\n }>,\n options?: Readonly<AxAgentOptions>\n ) {\n const { disableSmartModelRouting, excludeFieldsFromPassthrough, debug } =\n options ?? {}\n\n this.ai = ai\n this.agents = agents\n this.functions = functions\n this.disableSmartModelRouting = disableSmartModelRouting\n this.excludeFieldsFromPassthrough = excludeFieldsFromPassthrough ?? []\n this.debug = debug\n\n if (!name || name.length < 5) {\n throw new Error(\n 'Agent name must be at least 10 characters (more descriptive)'\n )\n }\n\n if (!description || description.length < 20) {\n throw descriptionError\n }\n\n if (definition && definition.length < 100) {\n throw definitionError\n }\n\n this.program = new AxGen<IN, OUT>(signature, {\n ...options,\n description: definition ?? description,\n })\n\n for (const agent of agents ?? []) {\n this.program.register(agent)\n }\n\n this.name = name\n // this.subAgentList = agents?.map((a) => a.getFunction().name).join(', ')\n\n this.func = {\n name: toCamelCase(this.name),\n description,\n parameters: this.program.getSignature().toJSONSchema(),\n func: () => this.forward,\n }\n\n const mm = ai?.getModelList()\n // Only add model parameter if smart routing is enabled and model list exists\n if (mm && !this.disableSmartModelRouting) {\n this.func.parameters = addModelParameter(this.func.parameters, mm)\n }\n }\n\n public setExamples(examples: Readonly<AxProgramExamples>) {\n this.program.setExamples(examples)\n }\n\n public setId(id: string) {\n this.program.setId(id)\n }\n\n public setParentId(parentId: string) {\n this.program.setParentId(parentId)\n }\n\n public getTraces() {\n return this.program.getTraces()\n }\n\n public setDemos(demos: readonly AxProgramDemos[]) {\n this.program.setDemos(demos)\n }\n\n public getUsage() {\n return this.program.getUsage()\n }\n\n public resetUsage() {\n this.program.resetUsage()\n }\n\n public getFunction(): AxFunction {\n const boundFunc = this.forward.bind(this)\n\n // Create a wrapper function that excludes the 'ai' parameter\n const wrappedFunc: AxFunctionHandler = async (\n valuesAndModel: IN & { model: string },\n options?\n ): Promise<string> => {\n const { model, ...values } = valuesAndModel\n\n const ai = this.ai ?? options?.ai\n if (!ai) {\n throw new Error('AI service is required to run the agent')\n }\n const debug = this.getDebug(ai, options)\n\n if (debug) {\n process.stdout.write(`\\n--- Agent Engaged: ${this.name} ---\\n`)\n }\n\n const ret = await boundFunc(ai, values as unknown as IN, {\n ...options,\n model,\n })\n\n if (debug) {\n process.stdout.write(`\\n--- Agent Done: ${this.name} ---\\n`)\n }\n\n const sig = this.program.getSignature()\n const outFields = sig.getOutputFields()\n const result = Object.keys(ret)\n .map((k) => {\n const field = outFields.find((f) => f.name === k)\n if (field) {\n return `${field.title}: ${ret[k]}`\n }\n return `${k}: ${ret[k]}`\n })\n .join('\\n')\n\n return result\n }\n\n return {\n ...this.func,\n func: wrappedFunc,\n }\n }\n\n public getFeatures(): AxAgentFeatures {\n return {\n canConfigureSmartModelRouting: this.ai === undefined,\n excludeFieldsFromPassthrough: this.excludeFieldsFromPassthrough,\n }\n }\n\n /**\n * Initializes the agent's execution context, processing child agents and their functions.\n */\n private init(\n parentAi: Readonly<AxAIService>,\n values: IN,\n options: Readonly<AxProgramForwardOptions> | undefined\n ) {\n const ai = this.ai ?? parentAi\n const mm = ai?.getModelList()\n\n // Get parent's input schema and keys\n const parentSchema = this.program.getSignature().getInputFields()\n const parentKeys = parentSchema.map((p) => p.name)\n const debug = this.getDebug(ai, options)\n\n // Process each child agent's function\n const agentFuncs = this.agents?.map((agent) => {\n const f = agent.getFeatures()\n\n const processOptions = {\n debug,\n disableSmartModelRouting: !!this.disableSmartModelRouting,\n excludeFieldsFromPassthrough: f.excludeFieldsFromPassthrough,\n canConfigureSmartModelRouting: f.canConfigureSmartModelRouting,\n }\n\n return processChildAgentFunction(\n agent.getFunction(),\n values,\n parentKeys,\n mm,\n processOptions\n )\n })\n\n // Combine all functions\n const functions: AxInputFunctionType = [\n ...(options?.functions ?? this.functions ?? []),\n ...(agentFuncs ?? []),\n ]\n\n return { ai, functions, debug }\n }\n\n public async forward(\n parentAi: Readonly<AxAIService>,\n values: IN,\n options?: Readonly<AxProgramForwardOptions>\n ): Promise<OUT> {\n const { ai, functions, debug } = this.init(parentAi, values, options)\n return await this.program.forward(ai, values, {\n ...options,\n debug,\n functions,\n })\n }\n\n public async *streamingForward(\n parentAi: Readonly<AxAIService>,\n values: IN,\n options?: Readonly<AxProgramStreamingForwardOptions>\n ): AxGenStreamingOut<OUT> {\n const { ai, functions, debug } = this.init(parentAi, values, options)\n return yield* this.program.streamingForward(ai, values, {\n ...options,\n debug,\n functions,\n })\n }\n\n /**\n * Updates the agent's description.\n * This updates both the stored description and the function's description.\n *\n * @param description - New description for the agent (must be at least 20 characters)\n * @throws Error if description is too short\n */\n public setDescription(description: string): void {\n if (!description || description.length < 20) {\n throw descriptionError\n }\n\n this.program.getSignature().setDescription(description)\n this.func.description = description\n }\n\n public setDefinition(definition: string): void {\n if (!definition || definition.length < 100) {\n throw definitionError\n }\n\n this.program.getSignature().setDescription(definition)\n }\n\n private getDebug(\n ai: AxAIService,\n options?: Readonly<AxProgramForwardOptions>\n ): boolean {\n return options?.debug ?? this.debug ?? ai?.getOptions()?.debug ?? false\n }\n}\n\nfunction toCamelCase(inputString: string): string {\n // Split the string by any non-alphanumeric character (including underscores, spaces, hyphens)\n const words = inputString.split(/[^a-zA-Z0-9]/)\n\n // Map through each word, capitalize the first letter of each word except the first word\n const camelCaseString = words\n .map((word, index) => {\n // Lowercase the word to handle cases like uppercase letters in input\n const lowerWord = word.toLowerCase()\n\n // Capitalize the first letter of each word except the first one\n if (index > 0 && lowerWord && lowerWord[0]) {\n return lowerWord[0].toUpperCase() + lowerWord.slice(1)\n }\n\n return lowerWord\n })\n .join('')\n\n return camelCaseString\n}\n\n/**\n * Adds a required model parameter to a JSON Schema definition based on provided model mappings.\n * The model parameter will be an enum with values from the model map keys.\n *\n * @param parameters - The original JSON Schema parameters definition (optional)\n * @param models - Array of model mappings containing keys, model names and descriptions\n * @returns Updated JSON Schema with added model parameter\n */\nexport function addModelParameter(\n parameters: AxFunctionJSONSchema | undefined,\n models: AxAIModelList\n): AxFunctionJSONSchema {\n // If parameters is undefined, create a base schema\n const baseSchema: AxFunctionJSONSchema = parameters\n ? structuredClone(parameters)\n : {\n type: 'object',\n properties: {},\n required: [],\n }\n\n // Check if model parameter already exists\n if (baseSchema.properties?.model) {\n return baseSchema\n }\n\n // Create the model property schema\n const modelProperty: AxFunctionJSONSchema & {\n enum: string[]\n description: string\n } = {\n type: 'string',\n enum: models.map((m) => m.key),\n description: `The AI model to use for this function call. Available options: ${models\n .map((m) => `\\`${m.key}\\` ${m.description}`)\n .join(', ')}`,\n }\n\n // Create new properties object with model parameter\n const newProperties = {\n ...(baseSchema.properties ?? {}),\n model: modelProperty,\n }\n\n // Add model to required fields\n const newRequired = [...(baseSchema.required ?? []), 'model']\n\n // Return updated schema\n return {\n ...baseSchema,\n properties: newProperties,\n required: newRequired,\n }\n}\n\n// New helper: removePropertiesFromSchema\n// Clones a JSON schema and removes properties and required fields matching the provided keys.\nfunction removePropertiesFromSchema(\n schema: Readonly<AxFunctionJSONSchema>,\n keys: string[]\n): AxFunctionJSONSchema {\n const newSchema = structuredClone(schema)\n if (newSchema.properties) {\n for (const key of keys) {\n delete newSchema.properties[key]\n }\n }\n if (Array.isArray(newSchema.required)) {\n const filteredRequired = newSchema.required.filter(\n (r: string) => !keys.includes(r)\n )\n Object.defineProperty(newSchema, 'required', {\n value: filteredRequired,\n writable: true,\n configurable: true,\n })\n }\n return newSchema\n}\n\n// New helper: pick\n// Returns an object composed of the picked object properties.\nfunction pick<T extends object, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key]\n }\n }\n return result\n}\n","import { createReadStream } from 'node:fs'\n\nexport interface AxApacheTikaArgs {\n url?: string | URL\n fetch?: typeof fetch\n}\n\nexport interface AxApacheTikaConvertOptions {\n format?: 'text' | 'html'\n}\n\nexport class AxApacheTika {\n private tikaUrl: URL\n private fetch?: typeof fetch\n\n constructor(args?: Readonly<AxApacheTikaArgs>) {\n const _args = args ?? { url: 'http://localhost:9998/' }\n this.tikaUrl = new URL('/tika', _args.url)\n this.fetch = _args.fetch\n }\n\n private async _convert(\n file: string | Blob,\n options?: Readonly<AxApacheTikaConvertOptions>\n ): Promise<string> {\n const fileData =\n typeof file === 'string' ? createReadStream(file) : file.stream()\n\n if (!fileData) {\n throw new Error('Failed to read file data')\n }\n\n const acceptValue = options?.format === 'html' ? 'text/html' : 'text/plain'\n\n try {\n const res = await (this.fetch ?? fetch)(this.tikaUrl, {\n body: fileData,\n headers: { Accept: acceptValue },\n duplex: 'half',\n method: 'PUT',\n })\n\n if (!res.ok) {\n throw new Error(`Failed to upload file: ${res.statusText}`)\n }\n\n const text = await res.text()\n return text\n } catch (error) {\n throw new Error(`Error converting file: ${error}`)\n }\n }\n\n public async convert(\n files: Readonly<string[] | Blob[]>,\n options?: Readonly<{ batchSize?: number; format?: 'html' | 'text' }>\n ): Promise<string[]> {\n const results: string[] = []\n const bs = options?.batchSize ?? 10\n\n for (let i = 0; i < files.length; i += bs) {\n const batch = files.slice(i, i + bs)\n const uploadPromises = batch.map((files) =>\n this._convert(files, { format: options?.format })\n )\n const batchResults = await Promise.all(uploadPromises)\n results.push(...batchResults)\n }\n\n return results\n }\n}\nexport default AxApacheTika\n","import type { ReadableStream } from 'stream/web'\n\nimport {\n AxAIServiceAuthenticationError,\n AxAIServiceError,\n AxAIServiceNetworkError,\n AxAIServiceResponseError,\n AxAIServiceStatusError,\n AxAIServiceStreamTerminatedError,\n AxAIServiceTimeoutError,\n} from '../util/apicall.js'\n\nimport type {\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n} from './types.js'\n\n/**\n * Options for the balancer.\n */\nexport type AxBalancerOptions = {\n comparator?: (a: AxAIService, b: AxAIService) => number\n debug?: boolean\n initialBackoffMs?: number\n maxBackoffMs?: number\n maxRetries?: number\n}\n\n/**\n * Balancer that rotates through services.\n */\nexport class AxBalancer implements AxAIService<unknown, unknown> {\n private services: AxAIService[]\n private currentServiceIndex: number = 0\n private currentService: AxAIService\n private debug: boolean\n private initialBackoffMs: number\n private maxBackoffMs: number\n private maxRetries: number\n private serviceFailures: Map<\n string,\n { retries: number; lastFailureTime: number }\n > = new Map()\n\n constructor(services: readonly AxAIService[], options?: AxBalancerOptions) {\n if (services.length === 0) {\n throw new Error('No AI services provided.')\n }\n\n validateModels(services)\n\n this.services = [...services].sort(\n options?.comparator ?? AxBalancer.metricComparator\n )\n\n const cs = this.services[this.currentServiceIndex]\n if (cs === undefined) {\n throw new Error('Error initializing the AI services.') // More specific error message\n }\n this.currentService = cs\n this.debug = options?.debug ?? true\n this.initialBackoffMs = options?.initialBackoffMs ?? 1000\n this.maxBackoffMs = options?.maxBackoffMs ?? 32000\n this.maxRetries = options?.maxRetries ?? 3\n }\n\n /**\n * Service comparator that respects the input order of services.\n */\n public static inputOrderComparator = () => 0\n\n /**\n * Service comparator that sorts services by cost.\n */\n\n // Requires a rethink\n /*\n public static costComparator = (a: AxAIService, b: AxAIService) => {\n const aInfo = a.getModelInfo()\n const bInfo = b.getModelInfo()\n const aTotalCost =\n (aInfo.promptTokenCostPer1M || Infinity) +\n (aInfo.completionTokenCostPer1M || Infinity)\n const bTotalCost =\n (bInfo.promptTokenCostPer1M || Infinity) +\n (bInfo.completionTokenCostPer1M || Infinity)\n return aTotalCost - bTotalCost\n }\n */\n\n public static metricComparator = (a: AxAIService, b: AxAIService) => {\n const aMetrics = a.getMetrics()\n const bMetrics = b.getMetrics()\n // Compare mean chat latency between services\n return aMetrics.latency.chat.mean - bMetrics.latency.chat.mean\n }\n\n getModelList(): AxAIModelList | undefined {\n return this.currentService.getModelList()\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n return this.currentService.getDefaultModels()\n }\n\n private getNextService(): boolean {\n const cs = this.services[++this.currentServiceIndex]\n if (cs === undefined) {\n return false\n }\n this.currentService = cs\n return true\n }\n\n private reset(): void {\n this.currentServiceIndex = 0\n const cs = this.services[this.currentServiceIndex]\n if (cs === undefined) {\n throw new Error('No AI services provided.')\n }\n this.currentService = cs\n }\n\n getName(): string {\n return this.currentService.getName()\n }\n\n getId(): string {\n return this.currentService.getId()\n }\n\n getFeatures(model?: string) {\n return this.currentService.getFeatures(model)\n }\n\n getMetrics(): AxAIServiceMetrics {\n return this.currentService.getMetrics()\n }\n\n private canRetryService(): boolean {\n const failure = this.serviceFailures.get(this.currentService.getId())\n if (!failure) return true\n\n const { retries, lastFailureTime } = failure\n const timeSinceLastFailure = Date.now() - lastFailureTime\n\n const backoffMs = Math.min(\n this.initialBackoffMs * Math.pow(2, retries),\n this.maxBackoffMs\n )\n return timeSinceLastFailure >= backoffMs\n }\n\n private handleFailure(): boolean {\n const failure = this.serviceFailures.get(this.currentService.getId())\n const retries = (failure?.retries ?? 0) + 1\n\n this.serviceFailures.set(this.currentService.getId(), {\n retries,\n lastFailureTime: Date.now(),\n })\n\n if (this.debug) {\n console.warn(\n `AxBalancer: Service ${this.currentService.getName()} failed (retry ${retries}/${this.maxRetries})`\n )\n }\n\n if (retries >= this.maxRetries) {\n const gotNextService = this.getNextService()\n if (this.debug) {\n console.warn(\n `AxBalancer: Switching to service ${this.currentService.getName()}`\n )\n }\n return gotNextService\n }\n\n return true\n }\n\n private handleSuccess(): void {\n this.serviceFailures.delete(this.currentService.getId())\n }\n\n async chat(\n req: Readonly<AxChatRequest>,\n options?: Readonly<AxAIPromptConfig & AxAIServiceActionOptions> | undefined\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n this.reset()\n\n while (true) {\n if (!this.canRetryService()) {\n if (!this.getNextService()) {\n throw new Error('All services exhausted')\n }\n continue\n }\n\n try {\n const response = await this.currentService.chat(req, options)\n this.handleSuccess()\n return response\n } catch (e) {\n if (!(e instanceof AxAIServiceError)) {\n throw e\n }\n\n switch (e.constructor) {\n case AxAIServiceAuthenticationError:\n // Handle authentication failure, e.g., refresh token, prompt user to re-login\n throw e\n\n case AxAIServiceStatusError:\n // Handle specific HTTP error codes, e.g., display a user-friendly message for a 404 Not Found\n break\n\n case AxAIServiceNetworkError:\n // Handle network issues, e.g., display a message about checking network connectivity\n break\n\n case AxAIServiceResponseError:\n // Handle errors related to processing the response, e.g., log the error and retry the request\n break\n\n case AxAIServiceStreamTerminatedError:\n // Handle unexpected stream termination, e.g., retry the request or display an error message\n break\n\n case AxAIServiceTimeoutError:\n // Handle request timeouts, e.g., increase timeout, retry, or display an error message\n break\n\n default:\n throw e\n // Handle unexpected AxAIServiceErrors\n }\n\n if (!this.handleFailure()) {\n throw e\n }\n }\n }\n }\n\n async embed(\n req: Readonly<AxEmbedRequest>,\n options?: Readonly<AxAIServiceActionOptions> | undefined\n ): Promise<AxEmbedResponse> {\n this.reset()\n\n while (true) {\n if (!this.canRetryService()) {\n if (!this.getNextService()) {\n throw new Error('All services exhausted')\n }\n continue\n }\n\n try {\n const response = await this.currentService.embed(req, options)\n this.handleSuccess()\n return response\n } catch (e) {\n if (!this.handleFailure()) {\n throw e\n }\n }\n }\n }\n\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n this.currentService.setOptions(options)\n }\n\n getOptions(): Readonly<AxAIServiceOptions> {\n return this.currentService.getOptions()\n }\n}\n\nfunction validateModels(services: readonly AxAIService[]) {\n // Check if any service has a model list.\n const serviceWithModel = services.find(\n (service) => service.getModelList() !== undefined\n )\n if (!serviceWithModel) {\n // No service provides a model list; no validation needed.\n return\n }\n\n // Use the first service with a model list as the reference.\n const referenceModelList = serviceWithModel.getModelList()\n if (!referenceModelList) {\n throw new Error('No model list found in any service.')\n }\n const referenceKeys = new Set(referenceModelList.map((model) => model.key))\n\n // Validate that all services provide a model list with the same keys.\n for (let i = 0; i < services.length; i++) {\n const service = services[i]\n if (!service) {\n throw new Error(`Service at index ${i} is undefined`)\n }\n const modelList = service.getModelList()\n if (!modelList) {\n throw new Error(\n `Service at index ${i} (${service.getName()}) has no model list while another service does.`\n )\n }\n\n const serviceKeys = new Set(modelList.map((model) => model.key))\n\n // Check for missing keys compared to the reference\n for (const key of referenceKeys) {\n if (!serviceKeys.has(key)) {\n throw new Error(\n `Service at index ${i} (${service.getName()}) is missing model \"${key}\"`\n )\n }\n }\n // Check for extra keys not in the reference\n for (const key of serviceKeys) {\n if (!referenceKeys.has(key)) {\n throw new Error(\n `Service at index ${i} (${service.getName()}) has extra model \"${key}\"`\n )\n }\n }\n }\n}\n","import type { AxAIService } from '../ai/types.js'\n\nimport type {\n AxFieldValue,\n AxGenIn,\n AxGenOut,\n AxProgram,\n AxProgramDemos,\n AxProgramTrace,\n} from './program.js'\nimport { updateDetailedProgress, updateProgressBar } from './util.js'\n\n// Define model config interface\ninterface ModelConfig {\n temperature: number\n max_tokens?: number\n [key: string]: number | string | boolean | undefined\n}\n\nexport type AxExample = Record<string, AxFieldValue>\n\nexport type AxMetricFn = <T extends AxGenOut = AxGenOut>(\n arg0: Readonly<{ prediction: T; example: AxExample }>\n) => boolean\n\nexport type AxMetricFnArgs = Parameters<AxMetricFn>[0]\n\nexport type AxOptimizerArgs<IN extends AxGenIn, OUT extends AxGenOut> = {\n ai: AxAIService\n program: Readonly<AxProgram<IN, OUT>>\n examples: Readonly<AxExample[]>\n options?: {\n maxRounds?: number\n maxExamples?: number\n maxDemos?: number\n batchSize?: number\n earlyStoppingPatience?: number\n teacherAI?: AxAIService\n costMonitoring?: boolean\n maxTokensPerGeneration?: number\n verboseMode?: boolean\n debugMode?: boolean\n }\n}\n\nexport interface AxOptimizationStats {\n totalCalls: number\n successfulDemos: number\n estimatedTokenUsage: number\n earlyStopped: boolean\n earlyStopping?: {\n bestScoreRound: number\n patienceExhausted: boolean\n }\n}\n\nexport class AxBootstrapFewShot<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenOut = AxGenOut,\n> {\n private ai: AxAIService\n private teacherAI?: AxAIService\n private program: Readonly<AxProgram<IN, OUT>>\n private examples: Readonly<AxExample[]>\n private maxRounds: number\n private maxDemos: number\n private maxExamples: number\n private batchSize: number\n private earlyStoppingPatience: number\n private costMonitoring: boolean\n private maxTokensPerGeneration: number\n private verboseMode: boolean\n private debugMode: boolean\n private traces: AxProgramTrace[] = []\n private stats: AxOptimizationStats = {\n totalCalls: 0,\n successfulDemos: 0,\n estimatedTokenUsage: 0,\n earlyStopped: false,\n }\n\n constructor({\n ai,\n program,\n examples = [],\n options,\n }: Readonly<AxOptimizerArgs<IN, OUT>>) {\n if (examples.length === 0) {\n throw new Error('No examples found')\n }\n this.maxRounds = options?.maxRounds ?? 3\n this.maxDemos = options?.maxDemos ?? 4\n this.maxExamples = options?.maxExamples ?? 16\n this.batchSize = options?.batchSize ?? 1\n this.earlyStoppingPatience = options?.earlyStoppingPatience ?? 0\n this.costMonitoring = options?.costMonitoring ?? false\n this.maxTokensPerGeneration = options?.maxTokensPerGeneration ?? 0\n this.verboseMode = options?.verboseMode ?? true\n this.debugMode = options?.debugMode ?? false\n\n this.ai = ai\n this.teacherAI = options?.teacherAI\n this.program = program\n this.examples = examples\n }\n\n private async compileRound(\n roundIndex: number,\n metricFn: AxMetricFn,\n options?: Readonly<AxOptimizerArgs<IN, OUT>['options']>\n ) {\n const st = new Date().getTime()\n const maxDemos = options?.maxDemos ?? this.maxDemos\n const aiOpt = {\n modelConfig: {\n temperature: 0.7,\n } as ModelConfig,\n }\n\n // Apply token limit if specified\n if (this.maxTokensPerGeneration > 0) {\n aiOpt.modelConfig.max_tokens = this.maxTokensPerGeneration\n }\n\n const examples = randomSample(this.examples, this.maxExamples)\n const previousSuccessCount = this.traces.length\n\n // Process examples in batches if batch size > 1\n for (let i = 0; i < examples.length; i += this.batchSize) {\n if (i > 0) {\n aiOpt.modelConfig.temperature = 0.7 + 0.001 * i\n }\n\n const batch = examples.slice(i, i + this.batchSize)\n\n // Process batch sequentially for now (could be parallelized if AI service supports it)\n for (const ex of batch) {\n if (!ex) {\n continue\n }\n\n // Use remaining examples as demonstration examples (excluding current one)\n const exList = examples.filter((e) => e !== ex)\n this.program.setExamples(exList)\n\n // Use teacher AI if provided, otherwise use student AI\n const aiService = this.teacherAI || this.ai\n\n this.stats.totalCalls++\n let res: OUT\n let error: Error | undefined\n\n try {\n res = await this.program.forward(aiService, ex as IN, aiOpt)\n\n // Estimate token usage if cost monitoring is enabled\n if (this.costMonitoring) {\n // Very rough estimate - replace with actual token counting from your AI service\n this.stats.estimatedTokenUsage +=\n JSON.stringify(ex).length / 4 + JSON.stringify(res).length / 4\n }\n\n const success = metricFn({ prediction: res, example: ex })\n if (success) {\n this.traces = [...this.traces, ...this.program.getTraces()]\n this.stats.successfulDemos++\n }\n } catch (err) {\n error = err as Error\n res = {} as OUT\n }\n\n const current =\n i + examples.length * roundIndex + (batch.indexOf(ex) + 1)\n const total = examples.length * this.maxRounds\n const et = new Date().getTime() - st\n\n // Use enhanced progress reporting if verbose or debug mode is enabled\n if (this.verboseMode || this.debugMode) {\n // Create a configuration object to pass to updateDetailedProgress\n const configInfo = {\n maxRounds: this.maxRounds,\n batchSize: this.batchSize,\n earlyStoppingPatience: this.earlyStoppingPatience,\n costMonitoring: this.costMonitoring,\n verboseMode: this.verboseMode,\n debugMode: this.debugMode,\n }\n\n updateDetailedProgress(\n roundIndex,\n current,\n total,\n et,\n ex,\n this.stats,\n configInfo,\n res,\n error\n )\n } else {\n // Use the standard progress bar for normal mode\n updateProgressBar(\n current,\n total,\n this.traces.length,\n et,\n 'Tuning Prompt',\n 30\n )\n }\n\n if (this.traces.length >= maxDemos) {\n return\n }\n }\n }\n\n // Check if we should early stop based on no improvement\n if (this.earlyStoppingPatience > 0) {\n const newSuccessCount = this.traces.length\n const improvement = newSuccessCount - previousSuccessCount\n\n if (!this.stats.earlyStopping) {\n this.stats.earlyStopping = {\n bestScoreRound: improvement > 0 ? roundIndex : 0,\n patienceExhausted: false,\n }\n } else if (improvement > 0) {\n this.stats.earlyStopping.bestScoreRound = roundIndex\n } else if (\n roundIndex - this.stats.earlyStopping.bestScoreRound >=\n this.earlyStoppingPatience\n ) {\n this.stats.earlyStopping.patienceExhausted = true\n this.stats.earlyStopped = true\n\n if (this.verboseMode || this.debugMode) {\n console.log(\n `\\nEarly stopping triggered after ${roundIndex + 1} rounds. No improvement for ${this.earlyStoppingPatience} rounds.`\n )\n }\n\n return\n }\n }\n }\n\n public async compile(\n metricFn: AxMetricFn,\n options?: Readonly<AxOptimizerArgs<IN, OUT>['options']>\n ): Promise<{ demos: AxProgramDemos[]; stats: AxOptimizationStats }> {\n const maxRounds = options?.maxRounds ?? this.maxRounds\n this.traces = []\n this.stats = {\n totalCalls: 0,\n successfulDemos: 0,\n estimatedTokenUsage: 0,\n earlyStopped: false,\n }\n\n for (let i = 0; i < maxRounds; i++) {\n await this.compileRound(i, metricFn, options)\n\n // Break early if early stopping was triggered\n if (this.stats.earlyStopped) {\n break\n }\n }\n\n if (this.traces.length === 0) {\n throw new Error(\n 'No demonstrations found. Either provider more examples or improve the existing ones.'\n )\n }\n\n const demos: AxProgramDemos[] = groupTracesByKeys(this.traces)\n\n return {\n demos,\n stats: this.stats,\n }\n }\n\n // Get optimization statistics\n public getStats(): AxOptimizationStats {\n return this.stats\n }\n}\n\nfunction groupTracesByKeys(\n programTraces: readonly AxProgramTrace[]\n): AxProgramDemos[] {\n const groupedTraces = new Map<string, Record<string, AxFieldValue>[]>()\n\n // Group all traces by their keys\n for (const programTrace of programTraces) {\n if (groupedTraces.has(programTrace.programId)) {\n const traces = groupedTraces.get(programTrace.programId)\n if (traces) {\n traces.push(programTrace.trace)\n }\n } else {\n groupedTraces.set(programTrace.programId, [programTrace.trace])\n }\n }\n\n // Convert the Map into an array of ProgramDemos\n const programDemosArray: AxProgramDemos[] = []\n for (const [programId, traces] of groupedTraces.entries()) {\n programDemosArray.push({ traces, programId })\n }\n\n return programDemosArray\n}\n\nconst randomSample = <T>(array: readonly T[], n: number): T[] => {\n // Clone the array to avoid modifying the original array\n const clonedArray = [...array]\n // Shuffle the cloned array\n for (let i = clonedArray.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n const caI = clonedArray[i]\n const caJ = clonedArray[j]\n\n if (!caI || !caJ) {\n throw new Error('Invalid array elements')\n }\n\n ;[clonedArray[i], clonedArray[j]] = [caJ, caI]\n }\n // Return the first `n` items of the shuffled array\n return clonedArray.slice(0, n)\n}\n","import { type Span, SpanKind, type Tracer } from '@opentelemetry/api'\n\nimport { axSpanAttributes } from '../trace/trace.js'\n\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBService,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nexport interface AxDBBaseArgs {\n fetch?: typeof fetch\n tracer?: Tracer\n}\n\nexport interface AxDBBaseOpOptions {\n span?: Span\n}\n\nexport class AxDBBase implements AxDBService {\n protected name: string\n protected fetch?: typeof fetch\n private tracer?: Tracer\n\n _upsert?: (\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean,\n options?: Readonly<AxDBBaseOpOptions>\n ) => Promise<AxDBUpsertResponse>\n\n _batchUpsert?: (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean,\n options?: Readonly<AxDBBaseOpOptions>\n ) => Promise<AxDBUpsertResponse>\n\n _query?: (\n req: Readonly<AxDBQueryRequest>,\n options?: Readonly<AxDBBaseOpOptions>\n ) => Promise<AxDBQueryResponse>\n\n constructor({\n name,\n fetch,\n tracer,\n }: Readonly<AxDBBaseArgs & { name: string }>) {\n this.name = name\n this.fetch = fetch\n this.tracer = tracer\n }\n\n async upsert(\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean\n ): Promise<AxDBUpsertResponse> {\n if (!this._upsert) {\n throw new Error('upsert() not implemented')\n }\n\n if (!this.tracer) {\n return await this._upsert(req, update)\n }\n\n return await this.tracer?.startActiveSpan(\n 'DB Upsert Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.DB_SYSTEM]: this.name,\n [axSpanAttributes.DB_OPERATION_NAME]: 'upsert',\n [axSpanAttributes.DB_TABLE]: req.table,\n [axSpanAttributes.DB_NAMESPACE]: req.namespace,\n [axSpanAttributes.DB_OPERATION_NAME]: update ? 'update' : 'insert',\n },\n },\n async (span) => {\n try {\n return await this._upsert!(req, update, { span })\n } finally {\n span.end()\n }\n }\n )\n }\n\n async batchUpsert(\n req: Readonly<AxDBUpsertRequest[]>,\n update?: boolean\n ): Promise<AxDBUpsertResponse> {\n if (!this._batchUpsert) {\n throw new Error('batchUpsert() not implemented')\n }\n if (req.length == 0) {\n throw new Error('Batch request is empty')\n }\n if (!req[0]) {\n throw new Error('Batch request is invalid first element is undefined')\n }\n\n if (!this.tracer) {\n return await this._batchUpsert(req, update)\n }\n\n return await this.tracer?.startActiveSpan(\n 'DB Batch Upsert Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.DB_SYSTEM]: this.name,\n [axSpanAttributes.DB_OPERATION_NAME]: 'upsert',\n [axSpanAttributes.DB_TABLE]: req[0].table,\n [axSpanAttributes.DB_NAMESPACE]: req[0].namespace,\n [axSpanAttributes.DB_OPERATION_NAME]: update ? 'update' : 'insert',\n },\n },\n async (span) => {\n try {\n return await this._batchUpsert!(req, update, { span })\n } finally {\n span.end()\n }\n }\n )\n }\n\n async query(req: Readonly<AxDBQueryRequest>): Promise<AxDBQueryResponse> {\n if (!this._query) {\n throw new Error('query() not implemented')\n }\n if (!this.tracer) {\n return await this._query(req)\n }\n\n return await this.tracer?.startActiveSpan(\n 'DB Query Request',\n {\n kind: SpanKind.SERVER,\n attributes: {\n [axSpanAttributes.DB_SYSTEM]: this.name,\n [axSpanAttributes.DB_OPERATION_NAME]: 'upsert',\n [axSpanAttributes.DB_TABLE]: req.table,\n [axSpanAttributes.DB_NAMESPACE]: req.namespace,\n [axSpanAttributes.DB_OPERATION_NAME]: 'query',\n },\n },\n async (span) => {\n try {\n return await this._query!(req, { span })\n } finally {\n span.end()\n }\n }\n )\n }\n}\n","import { apiCall } from '../util/apicall.js'\n\nimport { AxDBBase, type AxDBBaseArgs, type AxDBBaseOpOptions } from './base.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nconst baseURL = 'https://api.cloudflare.com/client/v4/accounts/'\n\nexport type AxDBCloudflareOpOptions = AxDBBaseOpOptions\n\ntype AxCloudflareUpsertResponse = {\n success: boolean\n errors?: { message: string }[]\n result: { ids: string[] }\n}\n\ntype AxCloudflareQueryResponse = {\n success: boolean\n errors?: { message: string }[]\n result: {\n matches: {\n id: string\n score: number\n values: number[]\n metadata: object\n }[]\n }\n}\n\nexport interface AxDBCloudflareArgs extends AxDBBaseArgs {\n name: 'cloudflare'\n apiKey: string\n accountId: string\n fetch?: typeof fetch\n}\n\n/**\n * Cloudflare: DB Service\n */\nexport class AxDBCloudflare extends AxDBBase {\n private apiKey: string\n private accountId: string\n\n constructor({\n apiKey,\n accountId,\n fetch,\n tracer,\n }: Readonly<Omit<AxDBCloudflareArgs, 'name'>>) {\n if (!apiKey || !accountId) {\n throw new Error('Cloudflare credentials not set')\n }\n super({ name: 'Cloudflare', fetch, tracer })\n this.apiKey = apiKey\n this.accountId = accountId\n }\n\n override _upsert = async (\n req: Readonly<AxDBUpsertRequest>,\n _update?: boolean,\n options?: Readonly<AxDBCloudflareOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n const res = (await apiCall(\n {\n url: new URL(\n `${this.accountId}/vectorize/indexes/${req.table}/upsert`,\n baseURL\n ),\n headers: {\n 'X-Auth-Key': this.apiKey,\n },\n fetch: this.fetch,\n span: options?.span,\n },\n {\n id: req.id,\n values: req.values,\n namespace: req.namespace,\n metadata: req.metadata,\n }\n )) as AxCloudflareUpsertResponse\n\n if (res.errors) {\n throw new Error(\n `Cloudflare upsert failed: ${res.errors.map(({ message }) => message).join(', ')}`\n )\n }\n\n return {\n ids: res.result.ids,\n }\n }\n\n override batchUpsert = async (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean,\n options?: Readonly<AxDBCloudflareOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n if (update) {\n throw new Error('Weaviate does not support batch update')\n }\n if (batchReq.length < 1) {\n throw new Error('Batch request is empty')\n }\n if (!batchReq[0] || !batchReq[0].table) {\n throw new Error('Table name is empty')\n }\n const table = batchReq[0].table\n\n const res = (await apiCall(\n {\n url: new URL(\n `${this.accountId}/vectorize/indexes/${table}/upsert`,\n baseURL\n ),\n headers: {\n 'X-Auth-Key': this.apiKey,\n },\n fetch: this.fetch,\n span: options?.span,\n },\n batchReq.map((req) => ({\n id: req.id,\n values: req.values,\n namespace: req.namespace,\n metadata: req.metadata,\n }))\n )) as AxCloudflareUpsertResponse\n\n if (res.errors) {\n throw new Error(\n `Cloudflare batch upsert failed: ${res.errors\n .map(({ message }) => message)\n .join(', ')}`\n )\n }\n\n return {\n ids: res.result.ids,\n }\n }\n\n override query = async (\n req: Readonly<AxDBQueryRequest>,\n options?: Readonly<AxDBCloudflareOpOptions>\n ): Promise<AxDBQueryResponse> => {\n const res = (await apiCall(\n {\n url: new URL(\n `${this.accountId}/vectorize/indexes/${req.table}/query`,\n baseURL\n ),\n headers: {\n 'X-Auth-Key': this.apiKey,\n },\n fetch: this.fetch,\n span: options?.span,\n },\n {\n vector: req.values,\n topK: req.limit || 10,\n returnValues: true,\n }\n )) as AxCloudflareQueryResponse\n\n if (res.errors) {\n throw new Error(\n `Cloudflare query failed: ${res.errors.map(({ message }) => message).join(', ')}`\n )\n }\n\n const matches = res.result.matches.map(\n ({ id, score, values, metadata }) => ({\n id,\n score,\n values,\n metadata,\n })\n )\n return { matches } as AxDBQueryResponse\n }\n}\n","import { AxDBBase, type AxDBBaseArgs, type AxDBBaseOpOptions } from './base.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nexport type AxDBMemoryOpOptions = AxDBBaseOpOptions\n\nexport interface AxDBMemoryArgs extends AxDBBaseArgs {\n name: 'memory'\n}\n\nexport type AxDBState = Record<string, Record<string, AxDBUpsertRequest>>\n\n/**\n * MemoryDB: DB Service\n */\nexport class AxDBMemory extends AxDBBase {\n private state: AxDBState\n\n constructor({ tracer }: Readonly<Omit<AxDBMemoryArgs, 'name'>> = {}) {\n super({ name: 'Memory', tracer })\n this.state = {}\n }\n\n override _upsert = async (\n req: Readonly<AxDBUpsertRequest>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _update?: boolean,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxDBMemoryOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n if (!this.state[req.table]) {\n this.state[req.table] = {\n [req.id]: req,\n }\n } else {\n const obj = this.state[req.table]\n if (!obj) {\n throw new Error('Table not found: ' + req.table)\n }\n obj[req.id] = req\n }\n\n return { ids: [req.id] }\n }\n\n override _batchUpsert = async (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxDBMemoryOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n const ids: string[] = []\n for (const req of batchReq) {\n const res = await this.upsert(req, update)\n ids.push(...res.ids)\n }\n\n return { ids }\n }\n\n override _query = async (\n req: Readonly<AxDBQueryRequest>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxDBMemoryOpOptions>\n ): Promise<AxDBQueryResponse> => {\n const table = this.state[req.table]\n if (!table) {\n return { matches: [] }\n }\n\n const matches: AxDBQueryResponse['matches'] = []\n\n Object.entries(table).forEach(([id, data]) => {\n if (req.values && data.values) {\n const score = distance(req.values, data.values)\n matches.push({ id: id, score: score, metadata: data.metadata })\n }\n })\n\n matches.sort((a, b) => a.score - b.score)\n if (req.limit) {\n matches.length = req.limit\n }\n\n return { matches }\n }\n\n public getDB = () => {\n return structuredClone(this.state)\n }\n\n public setDB = (state: AxDBState) => {\n this.state = structuredClone(state)\n }\n\n public clearDB = () => {\n this.state = {}\n }\n}\n\nconst distance = (a: readonly number[], b: readonly number[]): number => {\n if (a.length !== b.length) {\n throw new Error('Vectors must be of the same length.')\n }\n\n let dotProduct = 0\n let normA = 0\n let normB = 0\n let zeroVectorA = true\n let zeroVectorB = true\n\n const vectorA = new Float64Array(a)\n const vectorB = new Float64Array(b)\n\n for (let i = 0; i < vectorA.length; i++) {\n dotProduct += vectorA[i]! * vectorB[i]!\n normA += vectorA[i]! * vectorA[i]!\n normB += vectorB[i]! * vectorB[i]!\n if (vectorA[i] !== 0) zeroVectorA = false\n if (vectorB[i] !== 0) zeroVectorB = false\n }\n\n if (zeroVectorA || zeroVectorB) {\n return 1 // Return maximum distance if one vector is zero\n }\n\n const sqrtNormA = Math.sqrt(normA)\n const sqrtNormB = Math.sqrt(normB)\n const similarity = dotProduct / (sqrtNormA * sqrtNormB)\n return 1 - similarity // Returning distance as 1 - cosine similarity.\n}\n","import { apiCall } from '../util/apicall.js'\n\nimport { AxDBBase, type AxDBBaseArgs, type AxDBBaseOpOptions } from './base.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nexport type AxDBPineconeOpOptions = AxDBBaseOpOptions\n\ntype AxPineconeQueryRequest = {\n namespace?: string\n topK: number\n filter?: Record<string, string>\n includeValues: boolean\n includeMetadata: boolean\n vector: readonly number[]\n id?: string\n}\n\ntype AxPineconeQueryResponse = {\n matches: {\n id: string\n score: number\n values: number[]\n metadata?: Record<string, string>\n }[]\n}\n\nconst createPineconeQueryRequest = (\n req: Readonly<AxDBQueryRequest>\n): AxPineconeQueryRequest => {\n const pineconeQueryRequest: AxPineconeQueryRequest = {\n namespace: req.namespace,\n topK: req.limit || 10,\n filter: {},\n includeValues: true,\n includeMetadata: true,\n vector: req.values ?? [],\n id: req.id,\n }\n\n return pineconeQueryRequest\n}\n\nexport interface AxDBPineconeArgs extends AxDBBaseArgs {\n name: 'pinecone'\n apiKey: string\n host: string\n fetch?: typeof fetch\n}\n\n/**\n * Pinecone: DB Service\n */\nexport class AxDBPinecone extends AxDBBase {\n private apiKey: string\n private apiURL: string\n\n constructor({\n apiKey,\n host,\n fetch,\n tracer,\n }: Readonly<Omit<AxDBPineconeArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Pinecone API key not set')\n }\n super({ name: 'Pinecone', fetch, tracer })\n this.apiKey = apiKey\n this.apiURL = host\n }\n\n override _upsert = async (\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean,\n options?: Readonly<AxDBPineconeOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n await this._batchUpsert([req], update, options)\n return { ids: [req.id] }\n }\n\n override _batchUpsert = async (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n _update?: boolean,\n options?: Readonly<AxDBPineconeOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n if (batchReq.length === 0) {\n throw new Error('Batch request is empty')\n }\n await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: '/vectors/upsert',\n fetch: this.fetch,\n span: options?.span,\n },\n batchReq.map(({ id, values = [], metadata }) => ({\n id,\n values,\n metadata,\n }))\n )\n\n return { ids: batchReq.map(({ id }) => id) }\n }\n\n override query = async (\n req: Readonly<AxDBQueryRequest>,\n options?: Readonly<AxDBPineconeOpOptions>\n ): Promise<AxDBQueryResponse> => {\n if (req.text) {\n throw new Error('Pinecone does not support text')\n }\n\n const res = (await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: '/query',\n fetch: this.fetch,\n span: options?.span,\n },\n createPineconeQueryRequest(req)\n )) as AxPineconeQueryResponse\n\n const matches = res.matches.map(({ id, score, values, metadata }) => ({\n id,\n score,\n metadata,\n values,\n }))\n\n return { matches }\n }\n}\n","import { apiCall } from '../util/apicall.js'\n\nimport { AxDBBase, type AxDBBaseArgs, type AxDBBaseOpOptions } from './base.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\n\nexport type AxDBWeaviateOpOptions = AxDBBaseOpOptions\n\ntype AxWeaviateUpsertResponse = {\n id: string\n result?: { errors?: { error: { message: string }[] } }\n}\n\ntype AxWeaviateQueryResponse = {\n errors?: { location: string; message: string; path: string }[]\n data: {\n Get: {\n [key: string]: {\n [key: string]: unknown\n }[]\n }\n }\n}\n\nexport interface AxDBWeaviateArgs extends AxDBBaseArgs {\n name: 'weaviate'\n apiKey: string\n host: string\n fetch?: typeof fetch\n}\n\n/**\n * Weaviate: DB Service\n */\nexport class AxDBWeaviate extends AxDBBase {\n private apiKey: string\n private apiURL: string\n\n constructor({\n apiKey,\n host,\n fetch,\n tracer,\n }: Readonly<Omit<AxDBWeaviateArgs, 'name'>>) {\n if (!apiKey || apiKey === '') {\n throw new Error('Weaviate API key not set')\n }\n super({ name: 'Weaviate', fetch, tracer })\n this.apiKey = apiKey\n this.apiURL = host\n }\n\n override _upsert = async (\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean,\n options?: Readonly<AxDBWeaviateOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n const res = (await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: `/v1/objects/${req.table}/${req.id}`,\n put: update ? true : false,\n fetch: this.fetch,\n span: options?.span,\n },\n {\n id: req.id,\n class: req.table,\n tenant: req.namespace,\n vector: req.values,\n properties: req.metadata ?? {},\n }\n )) as AxWeaviateUpsertResponse\n\n if (res?.result?.errors) {\n throw new Error(\n `Weaviate upsert failed: ${res.result.errors.error\n .map(({ message }) => message)\n .join(', ')}`\n )\n }\n\n return {\n ids: [res.id],\n }\n }\n\n override _batchUpsert = async (\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean,\n options?: Readonly<AxDBWeaviateOpOptions>\n ): Promise<AxDBUpsertResponse> => {\n if (update) {\n throw new Error('Weaviate does not support batch update')\n }\n if (batchReq.length === 0) {\n throw new Error('Batch request is empty')\n }\n const objects = batchReq.map((req) => ({\n id: req.id,\n class: req.table,\n tenant: req.namespace,\n vector: req.values,\n properties: req.metadata ?? {},\n }))\n\n const res = (await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: '/v1/batch/objects',\n fetch: this.fetch,\n span: options?.span,\n },\n { objects }\n )) as AxWeaviateUpsertResponse[]\n\n if (res?.some(({ result }) => result?.errors)) {\n throw new Error(\n `Weaviate batch upsert failed: ${res\n .map(({ result }) =>\n result?.errors?.error.map(({ message }) => message).join(', ')\n )\n .join(', ')}`\n )\n }\n\n return {\n ids: res.map(({ id }) => id),\n }\n }\n\n override _query = async (\n req: Readonly<AxDBQueryRequest>,\n options?: Readonly<AxDBWeaviateOpOptions>\n ): Promise<AxDBQueryResponse> => {\n let filter = ''\n\n if (req.columns && req.columns.length === 0) {\n throw new Error('Weaviate requires at least one column')\n }\n\n if (req.values) {\n filter = `nearVector: {\n vector: [${req.values.join(',')}],\n }`\n } else if (req.text) {\n filter = `nearText: {\n concepts: ['${req.text}'],\n }`\n } else {\n throw new Error('Weaviate requires either text or values')\n }\n\n const res = (await apiCall(\n {\n url: this.apiURL,\n headers: { Authorization: `Bearer ${this.apiKey}` },\n name: '/v1/graphql',\n fetch: this.fetch,\n span: options?.span,\n },\n {\n query: `{\n Get {\n ${req.table} (\n limit: ${req.limit || 10},\n ${filter}\n ) {\n ${req.columns?.join('\\n')}\n }\n }\n }`,\n }\n )) as AxWeaviateQueryResponse\n\n if (res.errors) {\n throw new Error(\n `Weaviate query failed: ${res.errors\n .map(({ message }) => message)\n .join(', ')}`\n )\n }\n\n const resMatches = res.data.Get[req.table]\n\n if (!resMatches) {\n return { matches: [] }\n }\n\n const matches = resMatches.map((match) => {\n return {\n id: match['id'] as string,\n score: 1,\n metadata: match,\n }\n })\n return { matches } as AxDBQueryResponse\n }\n}\n","import { AxDBCloudflare, type AxDBCloudflareArgs } from './cloudflare.js'\nimport { AxDBMemory, type AxDBMemoryArgs } from './memory.js'\nimport { AxDBPinecone, type AxDBPineconeArgs } from './pinecone.js'\nimport type {\n AxDBQueryRequest,\n AxDBQueryResponse,\n AxDBService,\n AxDBUpsertRequest,\n AxDBUpsertResponse,\n} from './types.js'\nimport { AxDBWeaviate, type AxDBWeaviateArgs } from './weaviate.js'\n\nexport type AxDBArgs =\n | AxDBCloudflareArgs\n | AxDBPineconeArgs\n | AxDBWeaviateArgs\n | AxDBMemoryArgs\n\nexport class AxDB implements AxDBService {\n private db: AxDBService\n constructor(args: Readonly<AxDBArgs>) {\n switch (args.name) {\n case 'weaviate':\n this.db = new AxDBWeaviate(args)\n break\n case 'pinecone':\n this.db = new AxDBPinecone(args)\n break\n case 'cloudflare':\n this.db = new AxDBCloudflare(args)\n break\n case 'memory':\n this.db = new AxDBMemory(args)\n break\n default:\n throw new Error(`Unknown DB`)\n }\n }\n async upsert(\n req: Readonly<AxDBUpsertRequest>,\n update?: boolean\n ): Promise<AxDBUpsertResponse> {\n return await this.db.upsert(req, update)\n }\n\n async batchUpsert(\n batchReq: Readonly<AxDBUpsertRequest[]>,\n update?: boolean\n ): Promise<AxDBUpsertResponse> {\n return await this.db.batchUpsert(batchReq, update)\n }\n\n async query(req: Readonly<AxDBQueryRequest>): Promise<AxDBQueryResponse> {\n return await this.db.query(req)\n }\n}\n","import {\n type AxAIService,\n type AxDBQueryResponse,\n type AxDBService,\n type AxProgram,\n} from '../index.js'\n\nexport type AxRewriteIn = { query: string }\nexport type AxRewriteOut = { rewrittenQuery: string }\n\nexport type AxRerankerIn = { query: string; items: string[] }\nexport type AxRerankerOut = { rankedItems: string[] }\n\nexport interface AxDBLoaderOptions {\n chunker?: (text: string) => string[]\n rewriter?: AxProgram<AxRewriteIn, AxRewriteOut>\n reranker?: AxProgram<AxRerankerIn, AxRerankerOut>\n}\n\nexport interface AxDBManagerArgs {\n ai: AxAIService\n db: AxDBService\n config?: AxDBLoaderOptions\n}\n\nexport interface AxDBMatch {\n score: number\n text: string\n}\n\nconst table = '_internal'\n\nexport class AxDBManager {\n private ai: AxAIService\n private db: AxDBService\n private chunker: (text: string) => string[]\n private rewriter?: AxProgram<AxRewriteIn, AxRewriteOut>\n private reranker?: AxProgram<AxRerankerIn, AxRerankerOut>\n\n constructor({ ai, db, config }: Readonly<AxDBManagerArgs>) {\n this.ai = ai\n this.db = db\n this.chunker = config?.chunker ?? this.defaultChunker\n this.reranker = config?.reranker\n this.rewriter = config?.rewriter\n }\n\n private defaultChunker = (text: string): string[] => {\n // Default chunking by paragraphs\n return text.split(/\\n\\n+/)\n }\n\n insert = async (\n text: Readonly<string | string[]>,\n options?: Readonly<{\n batchSize?: number\n maxWordsPerChunk?: number\n minWordsPerChunk?: number\n }>\n ): Promise<void> => {\n try {\n const chunkerInput = Array.isArray(text)\n ? text.join('\\n\\n')\n : (text as string)\n\n // Chunk the text using the specified or default chunking function\n const initialChunks = this.chunker(chunkerInput).filter(\n (chunk) => chunk.length > 0\n )\n\n const maxWordsPerChunk = options?.maxWordsPerChunk\n const minWordsPerChunk = options?.minWordsPerChunk\n\n const chunks = processChunks({\n initialChunks,\n minWordsPerChunk,\n maxWordsPerChunk,\n })\n\n const bs = options?.batchSize ?? 10\n\n // Process chunks in batches of 10\n for (let i = 0; i < chunks.length; i += bs) {\n const batch = chunks.slice(i, i + bs)\n\n // Get embeddings for the whole batch from the AI service in one call\n const ret = await this.ai.embed({ texts: batch })\n\n // Prepare batch for bulk upsert\n const embeddings = ret.embeddings\n .map((embedding, index) => ({\n id: `chunk_${Date.now() + index}`, // Unique ID for each chunk, adjusted by index\n table,\n values: embedding,\n metadata: { text: batch[index] ?? '' },\n }))\n .filter(\n (v) => v.metadata?.['text'] && v.metadata?.['text'].length > 0\n )\n\n // Batch upsert embeddings\n await this.db.batchUpsert(embeddings)\n }\n } catch (error) {\n throw new Error(`Error processing text: ${error}`)\n }\n }\n\n query = async (\n query: Readonly<string | string[] | number | number[]>,\n { topPercent }: Readonly<{ topPercent?: number }> | undefined = {}\n ): Promise<AxDBMatch[][]> => {\n const texts = Array.isArray(query) ? query : [query]\n\n if (typeof texts[0] === 'string' && this.rewriter) {\n for (const [i, text] of texts.entries()) {\n const { rewrittenQuery } = await this.rewriter.forward(this.ai, {\n query: text,\n })\n texts[i] = rewrittenQuery\n }\n }\n\n let queries: Promise<AxDBQueryResponse>[]\n\n if (typeof texts[0] === 'string') {\n const embedResults = await this.ai.embed({ texts })\n queries = embedResults.embeddings.map((values) =>\n this.db.query({ table, values })\n )\n } else {\n queries = texts.map((values) => this.db.query({ table, values }))\n }\n\n const queryResults = await Promise.all(queries)\n const res: AxDBMatch[][] = []\n\n for (const { matches } of queryResults) {\n const m = matches\n .filter((v) => v.metadata?.['text'] && v.metadata?.['text'].length > 0)\n .map(({ score, metadata }) => ({\n score,\n text: metadata?.['text'] ?? '',\n }))\n\n const tp = topPercent && topPercent > 1 ? topPercent / 100 : topPercent\n const resultItems = tp ? getTopInPercent(m, tp) : m\n\n if (this.reranker) {\n const { rankedItems } = await this.reranker.forward(this.ai, {\n query: texts[0] as string,\n items: resultItems.map((item) => item.text),\n })\n\n const items = rankedItems\n .map((item) => resultItems.find((r) => r.text === item))\n .filter((v) => v !== undefined) as AxDBMatch[]\n\n res.push(items)\n } else {\n res.push(resultItems)\n }\n }\n\n return res\n }\n}\n\nconst processChunks = ({\n initialChunks,\n maxWordsPerChunk = 350,\n minWordsPerChunk = 250,\n}: Readonly<{\n initialChunks: readonly string[]\n maxWordsPerChunk?: number\n minWordsPerChunk?: number\n}>): string[] => {\n const chunks: string[] = []\n\n let currentChunk = ''\n let currentWordCount = 0\n\n initialChunks.forEach((chunk) => {\n const words = chunk.split(/\\s+/) // Split the chunk into words\n const wordCount = words.length // Count words in the current chunk\n\n if (currentWordCount + wordCount <= maxWordsPerChunk) {\n // Add to the current chunk if within the max size limit\n currentChunk += chunk + '\\n\\n'\n currentWordCount += wordCount\n } else if (\n currentWordCount > 0 &&\n currentWordCount + wordCount <= maxWordsPerChunk * 1.5\n ) {\n // If the total word count exceeds the limit but is less than 150% of the maxWordsPerChunk\n currentChunk += chunk + '\\n\\n'\n currentWordCount += wordCount\n } else {\n // If the current chunk is not empty and adding the new chunk exceeds the adjusted limit\n if (currentWordCount > minWordsPerChunk) {\n chunks.push(currentChunk.trim())\n currentChunk = ''\n currentWordCount = 0\n }\n // Handle the case where the chunk itself is larger than the limit\n if (wordCount > maxWordsPerChunk) {\n const remainingWords = words\n while (remainingWords.length > maxWordsPerChunk * 1.5) {\n const slice = remainingWords.splice(0, maxWordsPerChunk)\n chunks.push(slice.join(' '))\n }\n // Add the last portion if it fits the condition of being within 150% of maxWordsPerChunk\n if (remainingWords.length > 0) {\n currentChunk += remainingWords.join(' ') + '\\n\\n'\n currentWordCount += remainingWords.length\n }\n } else {\n // If the new chunk is smaller than the maximum words per chunk\n currentChunk = chunk + '\\n\\n'\n currentWordCount = wordCount\n }\n }\n })\n\n // Push the last chunk if it exists and meets the minimum words condition\n if (currentWordCount > minWordsPerChunk || chunks.length === 0) {\n chunks.push(currentChunk.trim())\n }\n return chunks\n}\n\nconst getTopInPercent = (\n entries: readonly AxDBMatch[],\n percent: number = 0.1\n): AxDBMatch[] => {\n // Sort entries by score in ascending order\n const sortedEntries = [...entries].sort((a, b) => a.score - b.score)\n\n // Calculate the number of entries to take (top 10%)\n const topTenPercentCount = Math.ceil(sortedEntries.length * percent)\n\n // Return the top 10% of entries\n return sortedEntries.slice(0, topTenPercentCount)\n}\n","import type { AxFunction } from '../ai/types.js'\n\nexport interface AxDockerContainer {\n Id: string\n Names: string[]\n Image: string\n ImageID: string\n Command: string\n Created: number\n State: {\n Status: string\n Running: boolean\n Paused: boolean\n Restarting: boolean\n OOMKilled: boolean\n Dead: boolean\n Pid: number\n ExitCode: number\n Error: string\n StartedAt: Date\n FinishedAt: Date\n }\n Status: string\n Ports: Array<{\n IP: string\n PrivatePort: number\n PublicPort: number\n Type: string\n }>\n Labels: { [key: string]: string }\n SizeRw: number\n SizeRootFs: number\n HostConfig: {\n NetworkMode: string\n }\n NetworkSettings: {\n Networks: {\n [key: string]: {\n IPAddress: string\n IPPrefixLen: number\n Gateway: string\n MacAddress: string\n }\n }\n }\n Mounts: Array<{\n Type: string\n Source: string\n Destination: string\n Mode: string\n RW: boolean\n Propagation: string\n }>\n}\n\nexport class AxDockerSession {\n private readonly apiUrl: string\n private containerId: string | null = null\n\n constructor(apiUrl: string = 'http://localhost:2375') {\n this.apiUrl = apiUrl\n }\n\n async pullImage(imageName: string): Promise<void> {\n const response = await this.fetchDockerAPI(\n `/images/create?fromImage=${encodeURIComponent(imageName)}`,\n {\n method: 'POST',\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to pull image: ${response.statusText}`)\n }\n\n // Wait for the pull to complete\n await response.text()\n }\n\n async createContainer({\n imageName,\n volumes = [],\n doNotPullImage,\n tag,\n }: Readonly<{\n imageName: string\n volumes?: Array<{ hostPath: string; containerPath: string }>\n doNotPullImage?: boolean\n tag?: string\n }>) {\n const binds = volumes.map((v) => `${v.hostPath}:${v.containerPath}`)\n\n if (!doNotPullImage) {\n await this.pullImage(imageName)\n }\n\n const containerConfig = {\n Image: imageName,\n Tty: true,\n OpenStdin: false,\n AttachStdin: false,\n AttachStdout: false,\n AttachStderr: false,\n HostConfig: { Binds: binds },\n Labels: {} as Record<string, string>,\n }\n\n if (tag) {\n containerConfig.Labels['com.example.tag'] = tag\n }\n\n const response = await this.fetchDockerAPI(`/containers/create`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(containerConfig),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to create container: ${response.statusText}`)\n }\n\n const data = (await response.json()) as { Id: string }\n this.containerId = data.Id\n\n return data\n }\n\n async findOrCreateContainer({\n imageName,\n volumes = [],\n doNotPullImage,\n tag,\n }: Readonly<{\n imageName: string\n volumes?: Array<{ hostPath: string; containerPath: string }>\n doNotPullImage?: boolean\n tag: string\n }>): Promise<{ Id: string; isNew: boolean }> {\n // First, try to find existing containers with the given tag\n const existingContainers = await this.listContainers(true)\n const matchingContainers = existingContainers.filter(\n (container) =>\n container.Labels && container.Labels['com.example.tag'] === tag\n )\n\n if (matchingContainers && matchingContainers.length > 0) {\n // Randomly select a container from the matching ones\n const randomIndex = Math.floor(Math.random() * matchingContainers.length)\n const selectedContainer = matchingContainers[randomIndex]\n\n if (selectedContainer) {\n // Connect to the selected container\n await this.connectToContainer(selectedContainer.Id)\n return { Id: selectedContainer.Id, isNew: false }\n }\n }\n\n // If no container with the tag exists, create a new one\n const newContainer = await this.createContainer({\n imageName,\n volumes,\n doNotPullImage,\n tag,\n })\n\n return { Id: newContainer.Id, isNew: true }\n }\n\n async startContainer(): Promise<void> {\n if (!this.containerId) {\n throw new Error('No container created or connected')\n }\n\n const response = await this.fetchDockerAPI(\n `/containers/${this.containerId}/start`,\n {\n method: 'POST',\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to start container: ${response.statusText}`)\n }\n }\n\n async connectToContainer(containerId: string): Promise<void> {\n const response = await this.fetchDockerAPI(\n `/containers/${containerId}/json`\n )\n\n if (!response.ok) {\n throw new Error(`Failed to connect to container: ${response.statusText}`)\n }\n\n this.containerId = containerId\n }\n\n async stopContainers({\n tag,\n remove,\n timeout = 10,\n }: Readonly<{ tag?: string; remove?: boolean; timeout?: number }>): Promise<\n Array<{ Id: string; Action: 'stopped' | 'removed' }>\n > {\n const results: Array<{ Id: string; Action: 'stopped' | 'removed' }> = []\n\n // List all containers\n const containers = await this.listContainers(true)\n\n // Filter containers by tag if provided\n const targetContainers = tag\n ? containers.filter(\n (container) => container.Labels['com.example.tag'] === tag\n )\n : containers\n\n for (const container of targetContainers) {\n // Stop the container if it's running\n if (container.State.Status === 'running') {\n const stopResponse = await this.fetchDockerAPI(\n `/containers/${container.Id}/stop?t=${timeout}`,\n { method: 'POST' }\n )\n\n if (!stopResponse.ok) {\n console.warn(\n `Failed to stop container ${container.Id}: ${stopResponse.statusText}`\n )\n continue\n }\n\n results.push({ Id: container.Id, Action: 'stopped' })\n }\n\n // Remove the container if the remove flag is set\n if (remove) {\n const removeResponse = await this.fetchDockerAPI(\n `/containers/${container.Id}`,\n { method: 'DELETE' }\n )\n\n if (!removeResponse.ok) {\n console.warn(\n `Failed to remove container ${container.Id}: ${removeResponse.statusText}`\n )\n continue\n }\n\n results.push({ Id: container.Id, Action: 'removed' })\n }\n }\n\n return results\n }\n\n async listContainers(all: boolean = false): Promise<AxDockerContainer[]> {\n const response = await this.fetchDockerAPI(`/containers/json?all=${all}`, {\n method: 'GET',\n })\n return response.json() as Promise<AxDockerContainer[]>\n }\n\n async getContainerLogs(): Promise<string> {\n if (!this.containerId) {\n throw new Error('No container created or connected')\n }\n const response = await this.fetchDockerAPI(\n `/containers/${this.containerId}/logs?stdout=true&stderr=true`,\n { method: 'GET' }\n )\n return response.text()\n }\n\n async executeCommand(command: string) {\n console.log('Executing command:', command)\n\n if (!this.containerId) {\n throw new Error('No container created or connected')\n }\n\n // Check container state\n const containerInfo = await this.getContainerInfo(this.containerId)\n\n if (containerInfo.State.Status !== 'running') {\n await this.startContainer()\n\n // Wait for the container to be in the \"running\" state\n await this.waitForContainerToBeRunning(this.containerId)\n }\n\n // Create exec instance\n const createResponse = await this.fetchDockerAPI(\n `/containers/${this.containerId}/exec`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n Cmd: ['sh', '-c', command],\n AttachStdout: true,\n AttachStderr: true,\n }),\n }\n )\n\n if (!createResponse.ok) {\n throw new Error(\n `Failed to create exec instance: ${createResponse.statusText}`\n )\n }\n\n const execData = (await createResponse.json()) as { Id: string }\n\n // Start exec instance\n const startResponse = await this.fetchDockerAPI(\n `/exec/${execData.Id}/start`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n Detach: false,\n Tty: false,\n }),\n }\n )\n\n if (!startResponse.ok) {\n throw new Error(\n `Failed to start exec instance: ${startResponse.statusText}`\n )\n }\n\n // Return the output\n return await startResponse.text()\n }\n\n // Add these new methods to the class:\n\n private async getContainerInfo(\n containerId: string\n ): Promise<AxDockerContainer> {\n const response = await this.fetchDockerAPI(\n `/containers/${containerId}/json`\n )\n if (!response.ok) {\n throw new Error(`Failed to get container info: ${response.statusText}`)\n }\n return response.json() as Promise<AxDockerContainer>\n }\n\n private async waitForContainerToBeRunning(\n containerId: string,\n timeout: number = 30000\n ): Promise<void> {\n const startTime = Date.now()\n while (Date.now() - startTime < timeout) {\n const containerInfo = await this.getContainerInfo(containerId)\n if (containerInfo.State.Status === 'running') {\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 1000)) // Wait for 1 second before checking again\n }\n throw new Error('Timeout waiting for container to start')\n }\n\n private async fetchDockerAPI(\n endpoint: string,\n options?: Readonly<RequestInit>\n ): Promise<Response> {\n const url = new URL(endpoint, this.apiUrl).toString()\n return await fetch(url, options)\n }\n\n public toFunction(): AxFunction {\n return {\n name: 'commandExecution',\n description:\n 'Use this function to execute shell commands, scripts, and programs. This function enables interaction with the file system, running system utilities, and performing tasks that require a shell interface.',\n parameters: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description:\n 'Shell command to execute. eg. `ls -l` or `echo \"Hello, World!\"`.',\n },\n },\n required: ['command'],\n },\n\n func: async ({ command }: Readonly<{ command: string }>) =>\n await this.executeCommand(command),\n }\n }\n}\n","import type { AxFieldValue } from './program.js'\n\nexport type AxDataRow = { row: Record<string, AxFieldValue> }\n\nexport class AxHFDataLoader {\n private rows: AxDataRow[] = []\n private baseUrl: string\n\n private dataset: string\n private split: string\n private config: string\n private options?: Readonly<{ offset?: number; length?: number }>\n\n constructor({\n dataset,\n split,\n config,\n options,\n }: Readonly<{\n dataset: string\n split: string\n config: string\n options?: Readonly<{ offset?: number; length?: number }>\n }>) {\n this.baseUrl = 'https://datasets-server.huggingface.co/rows'\n this.dataset = dataset\n this.split = split\n this.config = config\n this.options = options\n }\n\n private async fetchDataFromAPI(url: string): Promise<AxDataRow[]> {\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(`Error fetching data: ${response.statusText}`)\n }\n const data = (await response.json()) as { rows: AxDataRow[] }\n if (!data?.rows) {\n throw new Error('Invalid data format')\n }\n return data.rows\n } catch (error) {\n console.error('Error fetching data from API:', error)\n throw error\n }\n }\n\n // https://datasets-server.huggingface.co/rows?dataset=hotpot_qa&config=distractor&split=train&offset=0&length=100\n\n public async loadData() {\n const offset = this.options?.offset ?? 0\n const length = this.options?.length ?? 100\n const ds = encodeURIComponent(this.dataset)\n\n const url = `${this.baseUrl}?dataset=${ds}&config=${this.config}&split=${this.split}&offset=${offset}&length=${length}`\n\n console.log('Downloading data from API.')\n this.rows = (await this.fetchDataFromAPI(url)) as AxDataRow[]\n return this.rows\n }\n\n public setData(rows: AxDataRow[]) {\n this.rows = rows\n }\n\n public getData() {\n return this.rows\n }\n\n public async getRows<T>({\n count,\n fields,\n renameMap,\n }: Readonly<{\n count: number\n fields: readonly string[]\n renameMap?: Record<string, string>\n }>): Promise<T[]> {\n if (this.rows.length === 0) {\n throw new Error('No data loaded, call loadData or setData first.')\n }\n const dataRows = this.rows.slice(0, count)\n\n return dataRows\n .map((item) => {\n const result: Record<string, AxFieldValue> = {}\n\n fields.forEach((field) => {\n const keys = field.split('.')\n // Initial value should match the type of the rows, and be indexable by string\n let value: AxFieldValue | unknown = item.row\n for (const key of keys) {\n // Use type assertion to tell TypeScript that value will always be an object that can be indexed with string keys\n if (\n Object.prototype.hasOwnProperty.call(\n value as Record<string, unknown>,\n key\n )\n ) {\n value = (value as Record<string, unknown>)[key]\n }\n }\n if (!value) {\n return\n }\n const resultFieldName =\n renameMap && field in renameMap ? renameMap[field] : field\n if (!resultFieldName) {\n throw new Error(`Invalid field name: ${field}`)\n }\n result[resultFieldName] = value as AxFieldValue\n })\n\n return result\n })\n .filter((v) => Object.keys(v).length !== 0) as T[]\n }\n}\n","import * as _crypto from 'node:crypto'\nimport * as _fs from 'node:fs'\nimport * as _http from 'node:http'\nimport * as _https from 'node:https'\nimport * as _os from 'node:os'\nimport * as _process from 'node:process'\nimport { runInNewContext } from 'node:vm'\n\nimport type { AxFunction } from '../ai/types.js'\n\nexport enum AxJSInterpreterPermission {\n FS = 'node:fs',\n NET = 'net',\n OS = 'os',\n CRYPTO = 'crypto',\n PROCESS = 'process',\n}\n\ntype Context = {\n console: Console\n fs: unknown\n http: unknown\n https: unknown\n os: unknown\n crypto: unknown\n process: unknown\n}\n\nexport class AxJSInterpreter {\n private permissions: readonly AxJSInterpreterPermission[]\n\n constructor({\n permissions = [],\n }:\n | Readonly<{ permissions?: readonly AxJSInterpreterPermission[] }>\n | undefined = {}) {\n this.permissions = permissions ?? []\n }\n\n private codeInterpreterJavascript(code: string): unknown {\n const context: Partial<Context> = { console }\n\n if (this.permissions.includes(AxJSInterpreterPermission.FS)) {\n context.fs = _fs\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.NET)) {\n context.http = _http\n context.https = _https\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.OS)) {\n context.os = _os\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.CRYPTO)) {\n context.crypto = _crypto\n }\n\n if (this.permissions.includes(AxJSInterpreterPermission.PROCESS)) {\n context.process = _process\n }\n\n return runInNewContext(`(function() { ${code} })()`, context)\n }\n\n public toFunction(): AxFunction {\n return {\n name: 'javascriptInterpreter',\n description:\n 'Use this function to run Javascript code and get any expected return value',\n parameters: {\n type: 'object',\n properties: {\n code: {\n type: 'string',\n description: 'JS code with a return value in the end.',\n },\n },\n required: ['code'],\n },\n\n func: ({ code }: Readonly<{ code: string }>) =>\n this.codeInterpreterJavascript(code),\n }\n }\n}\n","import type { AxAIService } from '../ai/types.js'\n\nimport {\n AxBootstrapFewShot,\n type AxExample,\n type AxMetricFn,\n type AxOptimizerArgs,\n} from './optimize.js'\nimport type { AxGenIn, AxGenOut, AxProgram, AxProgramDemos } from './program.js'\nimport { updateProgressBar } from './util.js'\n\nexport interface AxMiPROOptions {\n numCandidates?: number\n initTemperature?: number\n maxBootstrappedDemos?: number\n maxLabeledDemos?: number\n numTrials?: number\n minibatch?: boolean\n minibatchSize?: number\n minibatchFullEvalSteps?: number\n programAwareProposer?: boolean\n dataAwareProposer?: boolean\n viewDataBatchSize?: number\n tipAwareProposer?: boolean\n fewshotAwareProposer?: boolean\n seed?: number\n verbose?: boolean\n earlyStoppingTrials?: number\n minImprovementThreshold?: number\n}\n\ninterface ConfigType {\n instruction: string\n bootstrappedDemos: number\n labeledExamples: number\n}\n\ninterface ConfigPoint {\n config: ConfigType\n score: number\n}\n\nexport class AxMiPRO<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenOut = AxGenOut,\n> {\n private ai: AxAIService\n private program: Readonly<AxProgram<IN, OUT>>\n private examples: readonly AxExample[]\n private maxBootstrappedDemos: number\n private maxLabeledDemos: number\n private numCandidates: number\n private initTemperature: number\n private numTrials: number\n private minibatch: boolean\n private minibatchSize: number\n private minibatchFullEvalSteps: number\n private programAwareProposer: boolean\n private dataAwareProposer: boolean\n private viewDataBatchSize: number\n private tipAwareProposer: boolean\n private fewshotAwareProposer: boolean\n private seed?: number\n private verbose: boolean\n private bootstrapper: AxBootstrapFewShot<IN, OUT>\n private earlyStoppingTrials: number\n private minImprovementThreshold: number\n\n constructor({\n ai,\n program,\n examples = [],\n options,\n }: Readonly<AxOptimizerArgs<IN, OUT>> & { options?: AxMiPROOptions }) {\n if (examples.length === 0) {\n throw new Error('No examples found')\n }\n\n const miproOptions = (options as AxMiPROOptions) || {}\n\n this.numCandidates = miproOptions.numCandidates ?? 5\n this.initTemperature = miproOptions.initTemperature ?? 0.7\n this.maxBootstrappedDemos = miproOptions.maxBootstrappedDemos ?? 3\n this.maxLabeledDemos = miproOptions.maxLabeledDemos ?? 4\n this.numTrials = miproOptions.numTrials ?? 30\n this.minibatch = miproOptions.minibatch ?? true\n this.minibatchSize = miproOptions.minibatchSize ?? 25\n this.minibatchFullEvalSteps = miproOptions.minibatchFullEvalSteps ?? 10\n this.programAwareProposer = miproOptions.programAwareProposer ?? true\n this.dataAwareProposer = miproOptions.dataAwareProposer ?? true\n this.viewDataBatchSize = miproOptions.viewDataBatchSize ?? 10\n this.tipAwareProposer = miproOptions.tipAwareProposer ?? true\n this.fewshotAwareProposer = miproOptions.fewshotAwareProposer ?? true\n this.seed = miproOptions.seed\n this.verbose = miproOptions.verbose ?? false\n this.earlyStoppingTrials = miproOptions.earlyStoppingTrials ?? 5\n this.minImprovementThreshold = miproOptions.minImprovementThreshold ?? 0.01\n\n this.ai = ai\n this.program = program\n this.examples = examples\n\n // Initialize the bootstrapper to handle few-shot example generation\n this.bootstrapper = new AxBootstrapFewShot<IN, OUT>({\n ai,\n program,\n examples,\n options: {\n maxDemos: this.maxBootstrappedDemos,\n maxRounds: 3, // Default, or adjust based on your needs\n verboseMode: this.verbose,\n },\n })\n }\n\n /**\n * Configures the optimizer for light, medium, or heavy optimization\n * @param level The optimization level: \"light\", \"medium\", or \"heavy\"\n */\n public configureAuto(level: 'light' | 'medium' | 'heavy'): void {\n switch (level) {\n case 'light':\n this.numCandidates = 3\n this.numTrials = 10\n this.minibatch = true\n this.minibatchSize = 20\n break\n case 'medium':\n this.numCandidates = 5\n this.numTrials = 20\n this.minibatch = true\n this.minibatchSize = 25\n break\n case 'heavy':\n this.numCandidates = 7\n this.numTrials = 30\n this.minibatch = true\n this.minibatchSize = 30\n break\n }\n }\n\n /**\n * Generates creative tips for instruction generation\n */\n private generateTips(): string[] {\n return [\n 'Be very specific and detailed in your instructions.',\n 'Focus on step-by-step reasoning in your instructions.',\n 'Provide clear constraints and guidelines in your instructions.',\n 'Keep your instructions concise and to the point.',\n 'Emphasize accuracy and precision in your instructions.',\n 'Include examples of good outputs in your instructions.',\n 'Focus on handling edge cases in your instructions.',\n 'Explicitly outline the reasoning process in your instructions.',\n ]\n }\n\n /**\n * Generates instruction candidates for each predictor in the program\n * @returns Array of generated instruction candidates\n */\n private async proposeInstructionCandidates(): Promise<string[]> {\n const instructions: string[] = []\n\n // Get a summary of the program for program-aware proposing\n let programContext = ''\n if (this.programAwareProposer) {\n programContext = await this.generateProgramSummary()\n }\n\n // Get a summary of the dataset for data-aware proposing\n let dataContext = ''\n if (this.dataAwareProposer) {\n dataContext = await this.generateDataSummary()\n }\n\n // Generate random tips for tip-aware proposing\n const tips = this.tipAwareProposer ? this.generateTips() : []\n\n // Generate instructions for each candidate\n for (let i = 0; i < this.numCandidates; i++) {\n const tipIndex = tips.length > 0 ? i % tips.length : -1\n const tipToUse = tipIndex >= 0 ? tips[tipIndex] : ''\n\n const instruction = await this.generateInstruction({\n programContext,\n dataContext,\n tip: tipToUse,\n candidateIndex: i,\n })\n\n instructions.push(instruction)\n }\n\n return instructions\n }\n\n /**\n * Generates a summary of the program structure for instruction proposal\n */\n private async generateProgramSummary(): Promise<string> {\n // In a real implementation, this would analyze the program's structure\n // and generate a summary of its components, signatures, etc.\n const prompt = `Summarize the following program structure. Focus on the signatures, \n input/output fields, and the purpose of each component. Identify key components \n that might benefit from better instructions.`\n\n const programStr = JSON.stringify(this.program)\n\n const response = await this.ai.chat({\n chatPrompt: [\n { role: 'system', content: prompt },\n { role: 'user', content: programStr },\n ],\n modelConfig: { temperature: 0.2 },\n })\n\n // Handle both sync and async responses\n if (response instanceof ReadableStream) {\n return ''\n }\n\n return response.results[0]?.content || ''\n }\n\n /**\n * Generates a summary of the dataset for instruction proposal\n */\n private async generateDataSummary(): Promise<string> {\n // Sample a subset of examples for analysis\n const sampleSize = Math.min(this.viewDataBatchSize, this.examples.length)\n const sample = this.examples.slice(0, sampleSize)\n\n const prompt = `Analyze the following dataset examples and provide a summary \n of key patterns, input-output relationships, and any specific challenges \n the data presents. Focus on what makes a good answer and what patterns should\n be followed.`\n\n const dataStr = JSON.stringify(sample)\n\n const response = await this.ai.chat({\n chatPrompt: [\n { role: 'system', content: prompt },\n { role: 'user', content: dataStr },\n ],\n modelConfig: { temperature: 0.2 },\n })\n\n // Handle both sync and async responses\n if (response instanceof ReadableStream) {\n return ''\n }\n\n return response.results[0]?.content || ''\n }\n\n /**\n * Generates a specific instruction candidate\n */\n private async generateInstruction({\n programContext,\n dataContext,\n tip,\n candidateIndex,\n }: Readonly<{\n programContext: string\n dataContext: string\n tip: string | undefined\n candidateIndex: number\n }>): Promise<string> {\n const prompt = `Create a high-quality instruction for an AI model performing the task described below.\n \n ${programContext ? `PROGRAM CONTEXT:\\n${programContext}\\n\\n` : ''}\n ${dataContext ? `DATA CONTEXT:\\n${dataContext}\\n\\n` : ''}\n ${tip ? `STYLE TIP: ${tip}\\n\\n` : ''}\n \n Your task is to craft a clear, effective instruction that will help the AI model generate\n accurate outputs for this task. Instruction #${candidateIndex + 1}/${this.numCandidates}.\n \n The instruction should be detailed enough to guide the model but not overly prescriptive\n or restrictive. Focus on what makes a good response rather than listing exact steps.\n \n INSTRUCTION:`\n\n const response = await this.ai.chat({\n chatPrompt: [{ role: 'user', content: prompt }],\n modelConfig: { temperature: 0.7 + 0.1 * candidateIndex },\n })\n\n // Handle both sync and async responses\n if (response instanceof ReadableStream) {\n return ''\n }\n\n return response.results[0]?.content || ''\n }\n\n /**\n * Bootstraps few-shot examples for the program\n */\n private async bootstrapFewShotExamples(\n metricFn: AxMetricFn\n ): Promise<AxProgramDemos[]> {\n if (this.verbose) {\n console.log('Bootstrapping few-shot examples...')\n }\n\n const result = await this.bootstrapper.compile(metricFn, {\n maxDemos: this.maxBootstrappedDemos,\n })\n\n return result.demos\n }\n\n /**\n * Selects labeled examples directly from the training set\n */\n private selectLabeledExamples(): AxExample[] {\n const selectedExamples: AxExample[] = []\n\n // Random sampling from the training set\n const indices = new Set<number>()\n while (\n indices.size < this.maxLabeledDemos &&\n indices.size < this.examples.length\n ) {\n const idx = Math.floor(Math.random() * this.examples.length)\n if (!indices.has(idx)) {\n indices.add(idx)\n const example = this.examples[idx]\n if (example) {\n selectedExamples.push(example)\n }\n }\n }\n\n return selectedExamples\n }\n\n /**\n * Runs Bayesian optimization to find the best combination of few-shot examples and instructions\n */\n private async runBayesianOptimization(\n bootstrappedDemos: readonly AxProgramDemos[],\n labeledExamples: readonly AxExample[],\n instructions: readonly string[],\n valset: readonly AxExample[],\n metricFn: AxMetricFn\n ): Promise<{ bestConfig: ConfigType; bestScore: number }> {\n let bestConfig: ConfigType | null = null\n let bestScore = Number.NEGATIVE_INFINITY\n\n // Track all evaluated configurations for Bayesian optimization\n const evaluatedConfigs: ConfigPoint[] = []\n\n // Add a default fallback configuration in case all evaluations fail\n const defaultConfig: ConfigType = {\n instruction: instructions[0] || '',\n bootstrappedDemos: Math.min(1, bootstrappedDemos.length),\n labeledExamples: Math.min(1, labeledExamples.length),\n }\n\n // Track early stopping conditions\n let trialsWithoutImprovement = 0\n let lastBestScore = Number.NEGATIVE_INFINITY\n\n // Initial random exploration phase (to build a model)\n const initialExplorationTrials = Math.min(\n 10,\n Math.floor(this.numTrials / 3)\n )\n\n const configs: ConfigType[] = []\n\n // Initial exploration - generate random configurations\n for (let i = 0; i < initialExplorationTrials; i++) {\n const instructionIndex = Math.floor(Math.random() * instructions.length)\n const instructionValue = instructions[instructionIndex] || ''\n\n const config: ConfigType = {\n instruction: instructionValue,\n bootstrappedDemos: Math.floor(\n Math.random() * (bootstrappedDemos.length + 1)\n ),\n labeledExamples: Math.floor(\n Math.random() * (labeledExamples.length + 1)\n ),\n }\n configs.push(config)\n }\n\n // Evaluate initial configurations\n for (let i = 0; i < configs.length; i++) {\n const config = configs[i]\n if (!config) continue\n\n const score = await this.evaluateConfig(\n config,\n bootstrappedDemos,\n labeledExamples,\n valset,\n metricFn,\n i\n )\n\n evaluatedConfigs.push({ config, score })\n\n if (score > bestScore) {\n bestScore = score\n bestConfig = config\n\n if (this.verbose) {\n console.log(\n `New best configuration found with score ${bestScore} (exploration phase)`\n )\n }\n }\n\n // Update progress\n updateProgressBar(\n i + 1,\n this.numTrials,\n Math.round(bestScore * 100),\n 0,\n 'Running MIPROv2 optimization',\n 30\n )\n }\n\n // Exploitation phase - use Bayesian optimization\n for (let i = configs.length; i < this.numTrials; i++) {\n // Generate a new configuration using acquisition function\n const nextConfig = this.selectNextConfiguration(\n evaluatedConfigs,\n bootstrappedDemos.length,\n labeledExamples.length,\n instructions\n )\n\n // Evaluate the configuration\n const score = await this.evaluateConfig(\n nextConfig,\n bootstrappedDemos,\n labeledExamples,\n valset,\n metricFn,\n i\n )\n\n evaluatedConfigs.push({ config: nextConfig, score })\n\n // Check if this is a new best configuration\n if (score > bestScore) {\n bestScore = score\n bestConfig = nextConfig\n\n if (this.verbose) {\n console.log(\n `New best configuration found with score ${bestScore} (exploitation phase)`\n )\n }\n\n // Reset early stopping counter\n trialsWithoutImprovement = 0\n lastBestScore = bestScore\n } else {\n // Check early stopping condition\n if (bestScore - lastBestScore < this.minImprovementThreshold) {\n trialsWithoutImprovement++\n\n if (trialsWithoutImprovement >= this.earlyStoppingTrials) {\n if (this.verbose) {\n console.log(\n `Early stopping triggered after ${i + 1} trials. No improvement for ${trialsWithoutImprovement} trials.`\n )\n }\n break\n }\n } else {\n // There was some improvement, but not enough to be the best\n lastBestScore = bestScore\n trialsWithoutImprovement = 0\n }\n }\n\n // Update progress\n updateProgressBar(\n i + 1,\n this.numTrials,\n Math.round(bestScore * 100),\n 0,\n 'Running MIPROv2 optimization',\n 30\n )\n\n // Run full evaluation on best config periodically\n if (\n this.minibatch &&\n i > 0 &&\n (i + 1) % this.minibatchFullEvalSteps === 0 &&\n bestConfig\n ) {\n if (this.verbose) {\n console.log(\n `Running full evaluation on best configuration at trial ${i + 1}`\n )\n }\n\n const fullScore = await this.fullEvaluation(\n bestConfig,\n bootstrappedDemos,\n labeledExamples,\n valset,\n metricFn\n )\n\n if (this.verbose) {\n console.log(`Full evaluation score: ${fullScore}`)\n }\n\n // Update best score based on full evaluation\n bestScore = fullScore\n }\n }\n\n if (!bestConfig) {\n if (this.verbose) {\n console.warn(\n 'Optimization failed to find any valid configurations, using default fallback configuration'\n )\n }\n bestConfig = defaultConfig\n\n // Try to evaluate the default config as a last resort\n try {\n bestScore = await this.evaluateConfig(\n bestConfig,\n bootstrappedDemos,\n labeledExamples,\n valset,\n metricFn,\n this.numTrials - 1\n )\n } catch (err) {\n if (this.verbose) {\n console.error('Error evaluating default configuration:', err)\n }\n bestScore = 0 // Set a minimal score as fallback\n }\n }\n\n return { bestConfig, bestScore }\n }\n\n /**\n * Evaluates a configuration on the validation set\n */\n private async evaluateConfig(\n config: Readonly<ConfigType>,\n bootstrappedDemos: readonly AxProgramDemos[],\n labeledExamples: readonly AxExample[],\n valset: readonly AxExample[],\n metricFn: AxMetricFn,\n trialIndex: number\n ): Promise<number> {\n // Create a new instance for evaluation with proper cloning\n\n // Apply configuration to program\n this.applyConfigToProgram(\n this.program,\n config,\n bootstrappedDemos,\n labeledExamples\n )\n\n // Determine which examples to use for evaluation\n let evalSet: readonly AxExample[] = valset\n if (this.minibatch) {\n // Use minibatch for faster evaluation during trials\n const startIdx = (trialIndex * this.minibatchSize) % valset.length\n const minibatchEvalSet: AxExample[] = []\n for (let j = 0; j < this.minibatchSize; j++) {\n const idx = (startIdx + j) % valset.length\n const example = valset[idx]\n if (example) {\n minibatchEvalSet.push(example)\n }\n }\n evalSet = minibatchEvalSet\n }\n\n // Evaluate the configuration\n let correctCount = 0\n for (const example of evalSet) {\n try {\n const prediction = await this.program.forward(this.ai, example as IN)\n const correct = metricFn({ prediction, example })\n if (correct) correctCount++\n } catch (err) {\n if (this.verbose) {\n console.error('Error evaluating example:', err)\n }\n }\n }\n\n return correctCount / evalSet.length\n }\n\n /**\n * Run full evaluation on the entire validation set\n */\n private async fullEvaluation(\n config: Readonly<ConfigType>,\n bootstrappedDemos: readonly AxProgramDemos[],\n labeledExamples: readonly AxExample[],\n valset: readonly AxExample[],\n metricFn: AxMetricFn\n ): Promise<number> {\n this.applyConfigToProgram(\n this.program,\n config,\n bootstrappedDemos,\n labeledExamples\n )\n\n let fullCorrectCount = 0\n for (const example of valset) {\n try {\n const prediction = await this.program.forward(this.ai, example as IN)\n const correct = metricFn({ prediction, example })\n if (correct) fullCorrectCount++\n } catch (err) {\n if (this.verbose) {\n console.error('Error evaluating example:', err)\n }\n }\n }\n\n return fullCorrectCount / valset.length\n }\n\n /**\n * Implements a Bayesian-inspired selection of the next configuration to try\n * This is a simplified version using Upper Confidence Bound (UCB) strategy\n */\n private selectNextConfiguration(\n evaluatedConfigs: ConfigPoint[],\n maxBootstrappedDemos: number,\n maxLabeledExamples: number,\n instructions: readonly string[]\n ): ConfigType {\n // If we don't have many evaluations yet, use random exploration with a bias towards good configs\n if (evaluatedConfigs.length < 5) {\n const instructionIndex = Math.floor(Math.random() * instructions.length)\n return {\n instruction: instructions[instructionIndex] || '',\n bootstrappedDemos: Math.floor(\n Math.random() * (maxBootstrappedDemos + 1)\n ),\n labeledExamples: Math.floor(Math.random() * (maxLabeledExamples + 1)),\n }\n }\n\n // Sort configurations by score\n const sortedConfigs = [...evaluatedConfigs].sort(\n (a, b) => b.score - a.score\n )\n\n // Top performing configurations to learn from\n const topConfigs = sortedConfigs.slice(0, Math.min(3, sortedConfigs.length))\n\n // Calculate mean and variance of parameters in top configurations\n const meanBootstrappedDemos =\n topConfigs.reduce((sum, c) => sum + c.config.bootstrappedDemos, 0) /\n topConfigs.length\n const meanLabeledExamples =\n topConfigs.reduce((sum, c) => sum + c.config.labeledExamples, 0) /\n topConfigs.length\n\n // Get popular instructions among top performers\n const popularInstructions = topConfigs.map((c) => c.config.instruction)\n\n // Exploration factor decreases over time\n const explorationFactor = Math.max(\n 0.2,\n 1.0 - evaluatedConfigs.length / this.numTrials\n )\n\n // Generate a new configuration with exploitation (using learned info) + exploration (random variations)\n let newBootstrappedDemos: number\n let newLabeledExamples: number\n let newInstruction: string\n\n // Decide whether to exploit or explore for bootstrapped demos\n if (Math.random() < 0.7) {\n // 70% chance to exploit\n // Sample around the mean of top configs with some noise\n newBootstrappedDemos = Math.min(\n maxBootstrappedDemos,\n Math.max(\n 0,\n Math.round(\n meanBootstrappedDemos +\n (Math.random() * 2 - 1) * explorationFactor * 2\n )\n )\n )\n } else {\n // Random exploration\n newBootstrappedDemos = Math.floor(\n Math.random() * (maxBootstrappedDemos + 1)\n )\n }\n\n // Same for labeled examples\n if (Math.random() < 0.7) {\n newLabeledExamples = Math.min(\n maxLabeledExamples,\n Math.max(\n 0,\n Math.round(\n meanLabeledExamples +\n (Math.random() * 2 - 1) * explorationFactor * 2\n )\n )\n )\n } else {\n newLabeledExamples = Math.floor(Math.random() * (maxLabeledExamples + 1))\n }\n\n // For instructions, either pick from top performers or try a new one\n if (Math.random() < 0.7 && popularInstructions.length > 0) {\n const idx = Math.floor(Math.random() * popularInstructions.length)\n newInstruction = popularInstructions[idx] || ''\n } else {\n const idx = Math.floor(Math.random() * instructions.length)\n newInstruction = instructions[idx] || ''\n }\n\n return {\n instruction: newInstruction,\n bootstrappedDemos: newBootstrappedDemos,\n labeledExamples: newLabeledExamples,\n }\n }\n\n /**\n * Applies a configuration to a program instance\n */\n private applyConfigToProgram(\n program: Readonly<AxProgram<IN, OUT>>,\n config: Readonly<ConfigType>,\n bootstrappedDemos: readonly AxProgramDemos[],\n labeledExamples: readonly AxExample[]\n ): void {\n // Set instruction\n this.setInstructionToProgram(program, config.instruction)\n\n // Set demos if needed\n if (config.bootstrappedDemos > 0) {\n program.setDemos(bootstrappedDemos.slice(0, config.bootstrappedDemos))\n }\n\n // Set examples if needed\n if (config.labeledExamples > 0) {\n program.setExamples(labeledExamples.slice(0, config.labeledExamples))\n }\n }\n\n /**\n * Sets instruction to a program\n * Note: Workaround since setInstruction may not be available directly\n */\n private setInstructionToProgram(\n program: Readonly<AxProgram<IN, OUT>>,\n instruction: string\n ): void {\n // This is a simplification - in real use, you need the actual method signature\n // For demonstration purposes only\n // Usually would be: program.setInstruction(instruction)\n const programWithInstruction = program as Readonly<\n AxProgram<IN, OUT> & { setInstruction: (instr: string) => void }\n >\n programWithInstruction.setInstruction?.(instruction)\n }\n\n /**\n * The main compile method to run MIPROv2 optimization\n * @param metricFn Evaluation metric function\n * @param options Optional configuration options\n * @returns The optimized program\n */\n public async compile(\n metricFn: AxMetricFn,\n options?: Readonly<{\n valset?: readonly AxExample[]\n teacher?: Readonly<AxProgram<IN, OUT>>\n auto?: 'light' | 'medium' | 'heavy'\n }>\n ): Promise<Readonly<AxProgram<IN, OUT>>> {\n // Configure auto settings if provided\n if (options?.auto) {\n this.configureAuto(options.auto)\n }\n\n // Split data into train and validation sets if valset not provided\n const trainset = this.examples\n const valset =\n options?.valset ||\n this.examples.slice(0, Math.floor(this.examples.length * 0.8))\n\n if (this.verbose) {\n console.log(`Starting MIPROv2 optimization with ${this.numTrials} trials`)\n console.log(\n `Using ${trainset.length} examples for training and ${valset.length} for validation`\n )\n }\n\n // If teacher is provided, use it to help bootstrap examples\n if (options?.teacher) {\n if (this.verbose) {\n console.log('Using provided teacher to assist with bootstrapping')\n }\n\n // Create a copy of the bootstrapper with the teacher AI\n const bootstrapperWithTeacher = new AxBootstrapFewShot<IN, OUT>({\n ai: this.ai,\n program: this.program,\n examples: this.examples,\n options: {\n maxDemos: this.maxBootstrappedDemos,\n maxRounds: 3,\n verboseMode: this.verbose,\n teacherAI: this.ai, // Use the same AI but with the teacher program\n },\n })\n\n // Replace the existing bootstrapper\n this.bootstrapper = bootstrapperWithTeacher\n }\n\n // Step 1: Bootstrap few-shot examples\n let bootstrappedDemos: AxProgramDemos[] = []\n if (this.maxBootstrappedDemos > 0) {\n bootstrappedDemos = await this.bootstrapFewShotExamples(metricFn)\n\n if (this.verbose) {\n console.log(\n `Generated ${bootstrappedDemos.length} bootstrapped demonstrations`\n )\n }\n }\n\n // Step 2: Select labeled examples from training set\n let labeledExamples: AxExample[] = []\n if (this.maxLabeledDemos > 0) {\n labeledExamples = this.selectLabeledExamples()\n\n if (this.verbose) {\n console.log(\n `Selected ${labeledExamples.length} labeled examples from training set`\n )\n }\n }\n\n // Step 3: Generate instruction candidates\n const instructions = await this.proposeInstructionCandidates()\n\n if (this.verbose) {\n console.log(`Generated ${instructions.length} instruction candidates`)\n }\n\n // Step 4: Run Bayesian optimization to find the best configuration\n const { bestConfig, bestScore } = await this.runBayesianOptimization(\n bootstrappedDemos,\n labeledExamples,\n instructions,\n valset,\n metricFn\n )\n\n if (this.verbose) {\n console.log(`Optimization complete. Best score: ${bestScore}`)\n console.log(`Best configuration: ${JSON.stringify(bestConfig)}`)\n }\n\n // Apply the best configuration to a fresh copy of the program\n this.applyConfigToProgram(\n this.program,\n bestConfig,\n bootstrappedDemos,\n labeledExamples\n )\n\n return this.program\n }\n}\n","import type { ReadableStream } from 'stream/web'\n\nimport type {\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n AxModelInfoWithProvider,\n} from '../types.js'\n\nexport type AxMockAIServiceConfig = {\n name?: string\n id?: string\n modelInfo?: Partial<AxModelInfoWithProvider>\n embedModelInfo?: AxModelInfoWithProvider\n features?: { functions?: boolean; streaming?: boolean }\n models?: AxAIModelList\n options?: AxAIServiceOptions\n chatResponse?:\n | AxChatResponse\n | ReadableStream<AxChatResponse>\n | (() => Promise<AxChatResponse | ReadableStream<AxChatResponse>>)\n | ((\n req: Readonly<AxChatRequest<unknown>>,\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<unknown, unknown>\n >\n ) => Promise<AxChatResponse | ReadableStream<AxChatResponse>>)\n\n embedResponse?:\n | AxEmbedResponse\n | ((\n req: Readonly<AxEmbedRequest>\n ) => AxEmbedResponse | Promise<AxEmbedResponse>)\n shouldError?: boolean\n errorMessage?: string\n latencyMs?: number\n}\n\nexport class AxMockAIService implements AxAIService {\n private metrics: AxAIServiceMetrics = {\n latency: {\n chat: { mean: 0, p95: 0, p99: 0, samples: [] },\n embed: { mean: 0, p95: 0, p99: 0, samples: [] },\n },\n errors: {\n chat: { count: 0, rate: 0, total: 0 },\n embed: { count: 0, rate: 0, total: 0 },\n },\n }\n\n constructor(private readonly config: AxMockAIServiceConfig = {}) {\n this.config.id = this.config.id ?? crypto.randomUUID()\n }\n\n getName(): string {\n return this.config.name ?? 'mock-ai-service'\n }\n\n getId(): string {\n return this.config.id ?? 'mock-ai-service-id'\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getFeatures(_model?: string): { functions: boolean; streaming: boolean } {\n return {\n functions: this.config.features?.functions ?? false,\n streaming: this.config.features?.streaming ?? false,\n }\n }\n\n getModelList(): AxAIModelList | undefined {\n return this.config.models\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n return {\n model: this.config.modelInfo?.name ?? 'mock-model',\n embedModel: this.config.embedModelInfo?.name,\n }\n }\n\n getMetrics(): AxAIServiceMetrics {\n return this.metrics\n }\n\n async chat(\n req: Readonly<AxChatRequest<unknown>>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<unknown, unknown>\n >\n ) {\n if (this.config.latencyMs) {\n await new Promise((resolve) => setTimeout(resolve, this.config.latencyMs))\n }\n\n if (this.config.shouldError) {\n throw new Error(this.config.errorMessage ?? 'Mock chat error')\n }\n\n this.updateMetrics('chat')\n\n if (typeof this.config.chatResponse === 'function') {\n return await this.config.chatResponse(req)\n }\n\n return (\n this.config.chatResponse ?? {\n results: [\n {\n content: 'Mock response',\n finishReason: 'stop',\n },\n ],\n modelUsage: {\n promptTokens: 10,\n completionTokens: 5,\n totalTokens: 15,\n },\n }\n )\n }\n\n async embed(\n req: Readonly<AxEmbedRequest>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options?: Readonly<AxAIServiceActionOptions>\n ): Promise<AxEmbedResponse> {\n if (this.config.latencyMs) {\n await new Promise((resolve) => setTimeout(resolve, this.config.latencyMs))\n }\n\n if (this.config.shouldError) {\n throw new Error(this.config.errorMessage ?? 'Mock embed error')\n }\n\n this.updateMetrics('embed')\n\n if (typeof this.config.embedResponse === 'function') {\n return this.config.embedResponse(req)\n }\n\n return (\n this.config.embedResponse ?? {\n embeddings: [[0.1, 0.2, 0.3]],\n modelUsage: {\n promptTokens: 5,\n completionTokens: 0,\n totalTokens: 5,\n },\n }\n )\n }\n\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n this.config.options = options\n }\n\n getOptions(): Readonly<AxAIServiceOptions> {\n return this.config.options ?? {}\n }\n\n private updateMetrics(type: 'chat' | 'embed'): void {\n const latency = this.config.latencyMs ?? 0\n this.metrics.latency[type].samples.push(latency)\n const samples = this.metrics.latency[type].samples\n\n // Update mean\n this.metrics.latency[type].mean =\n samples.reduce((a, b) => a + b, 0) / samples.length\n\n // Calculate percentiles only if we have enough samples\n if (samples.length > 0) {\n const sortedSamples = [...samples].sort((a, b) => a - b)\n\n // For p95, we need at least 20 samples for meaningful calculation (1/0.05)\n const p95Index = Math.max(0, Math.floor(sortedSamples.length * 0.95) - 1)\n this.metrics.latency[type].p95 = sortedSamples[p95Index] ?? latency\n\n // For p99, we need at least 100 samples for meaningful calculation (1/0.01)\n const p99Index = Math.max(0, Math.floor(sortedSamples.length * 0.99) - 1)\n this.metrics.latency[type].p99 = sortedSamples[p99Index] ?? latency\n }\n\n if (this.config.shouldError) {\n this.metrics.errors[type].count++\n this.metrics.errors[type].total++\n\n // Calculate error rate against total requests, not just samples\n const totalRequests = this.metrics.latency[type].samples.length\n this.metrics.errors[type].rate =\n totalRequests > 0 ? this.metrics.errors[type].count / totalRequests : 0\n }\n }\n}\n\n// Example usage:\n/*\nconst mockService = new MockAIService({\n name: 'test-service',\n modelInfo: {\n name: 'test-model',\n provider: 'test-provider',\n promptTokenCostPer1M: 200,\n completionTokenCostPer1M: 150,\n },\n features: {\n functions: true,\n streaming: true,\n },\n chatResponse: async (req) => ({\n results: [\n {\n content: `Processed request with ${req.chatPrompt.length} messages`,\n finishReason: 'stop',\n },\n ],\n modelUsage: {\n promptTokens: 20,\n completionTokens: 10,\n totalTokens: 30,\n },\n }),\n latencyMs: 100,\n})\n*/\n","import type { AxAIService } from '../ai/types.js'\nimport { AxDBMemory, type AxDBState } from '../db/memory.js'\nimport { ColorLog } from '../util/log.js'\n\nconst colorLog = new ColorLog()\n\nexport interface AxSimpleClassifierForwardOptions {\n cutoff?: number\n}\n\nexport class AxSimpleClassifierClass {\n private readonly name: string\n private readonly context: readonly string[]\n\n constructor(name: string, context: readonly string[]) {\n this.name = name\n this.context = context\n }\n\n public getName(): string {\n return this.name\n }\n\n public getContext(): readonly string[] {\n return this.context\n }\n}\n\nexport class AxSimpleClassifier {\n private readonly ai: AxAIService\n\n private db: AxDBMemory\n private debug?: boolean\n\n public constructor(ai: AxAIService) {\n this.db = new AxDBMemory()\n this.ai = ai\n }\n\n public getState(): AxDBState | undefined {\n return this.db.getDB()\n }\n\n public setState(state: AxDBState) {\n this.db.setDB(state)\n }\n\n public setClasses = async (\n classes: readonly AxSimpleClassifierClass[]\n ): Promise<void> => {\n for (const c of classes) {\n const ret = await this.ai.embed({ texts: c.getContext() })\n await this.db.upsert({\n id: c.getName(),\n table: 'classes',\n values: ret.embeddings[0],\n })\n }\n }\n\n public async forward(\n text: string,\n options?: Readonly<AxSimpleClassifierForwardOptions>\n ): Promise<string> {\n const { embeddings } = await this.ai.embed({ texts: [text] })\n\n const matches = await this.db.query({\n table: 'classes',\n values: embeddings[0],\n })\n\n let m = matches.matches\n if (typeof options?.cutoff === 'number') {\n const { cutoff } = options\n m = m.filter((m) => m.score <= cutoff)\n }\n\n if (this.debug) {\n console.log(\n colorLog.whiteBright(`query: ${text}`) +\n '\\n' +\n colorLog.greenBright(\n JSON.stringify(m.map((m) => `${m.id}, ${m.score}`))\n )\n )\n }\n\n const matchedClass = m.at(0)\n if (!matchedClass) {\n return ''\n }\n\n return matchedClass.id\n }\n\n public setOptions(options: Readonly<{ debug?: boolean }>): void {\n if (typeof options.debug === 'boolean') {\n this.debug = options.debug\n }\n }\n}\n","import type { AxAIService } from '../ai/types.js'\n\nimport type { AxExample, AxMetricFn } from './optimize.js'\nimport type { AxGenIn, AxGenOut, AxProgram } from './program.js'\nimport { updateProgressBar } from './util.js'\n\nexport type AxEvaluateArgs<IN extends AxGenIn, OUT extends AxGenOut> = {\n ai: AxAIService\n program: Readonly<AxProgram<IN, OUT>>\n examples: Readonly<AxExample[]>\n}\n\nexport class AxTestPrompt<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenOut = AxGenOut,\n> {\n private ai: AxAIService\n private program: Readonly<AxProgram<IN, OUT>>\n private examples: Readonly<AxExample[]>\n\n constructor({\n ai,\n program,\n examples = [],\n }: Readonly<AxEvaluateArgs<IN, OUT>>) {\n if (examples.length == 0) {\n throw new Error('No examples found')\n }\n this.ai = ai\n this.program = program\n this.examples = examples\n }\n\n public async run(metricFn: AxMetricFn) {\n const st = new Date().getTime()\n const total = this.examples.length\n let successCount = 0\n\n for (let i = 0; i < total; i++) {\n const ex = this.examples[i]\n if (!ex) {\n throw new Error('Invalid example')\n }\n\n const res = await this.program.forward(this.ai, ex as IN)\n const success = metricFn({ prediction: res, example: ex })\n if (success) {\n successCount++\n }\n\n const et = new Date().getTime() - st\n updateProgressBar(i, total, successCount, et, 'Testing Prompt', 30)\n }\n\n console.log(\n '\\nPerformance: ',\n successCount,\n '/',\n total,\n 'Accuracy: ',\n successCount / total,\n '\\n'\n )\n }\n}\n","import { AxGen, type AxGenOptions } from '../dsp/generate.js'\nimport type { AxGenIn, AxGenOut } from '../dsp/program.js'\nimport { AxSignature } from '../dsp/sig.js'\n\nexport class AxChainOfThought<\n IN extends AxGenIn = AxGenIn,\n OUT extends AxGenOut = AxGenOut,\n> extends AxGen<IN, OUT & { reason: string }> {\n constructor(\n signature: Readonly<AxSignature | string>,\n options?: Readonly<AxGenOptions>\n ) {\n const sig = new AxSignature(signature)\n const description = `Let's work this out in a step by step way in order to ensure we have the right answer.`\n\n sig.setOutputFields([\n {\n name: 'reason',\n description,\n },\n ...sig.getOutputFields(),\n ])\n\n super(sig, options)\n }\n}\n","import {\n AxGen,\n type AxGenOptions,\n type AxRewriteIn,\n type AxRewriteOut,\n} from '../index.js'\n\nexport class AxDefaultQueryRewriter extends AxGen<AxRewriteIn, AxRewriteOut> {\n constructor(options?: Readonly<AxGenOptions>) {\n const signature = `\"You are a query rewriter assistant tasked with rewriting a given query to improve its clarity, specificity, and relevance. Your role involves analyzing the query to identify any ambiguities, generalizations, or irrelevant information and then rephrasing it to make it more focused and precise. The rewritten query should be concise, easy to understand, and directly related to the original query. Output only the rewritten query.\"\n query: string -> rewrittenQuery: string`\n\n super(signature, options)\n }\n}\n","const trimNonAlphaNum = (str: string) => {\n return str.replace(/^\\W+|\\W+$/g, '')\n}\n\nconst splitIntoTwo = (\n str: string,\n separator: Readonly<RegExp | string>\n): string[] => {\n const index = str.search(separator)\n if (index === -1) {\n return [str] // No separator found, return the original string as the only part\n }\n const matchResult = str.match(separator)\n if (!matchResult) {\n throw new Error('Match failed unexpectedly.')\n }\n const firstPart = str.substring(0, index)\n const secondPart = str.substring(index + matchResult[0].length)\n return [firstPart, secondPart]\n}\n\nconst dedup = (seq: readonly string[]): string[] => {\n const seen = new Set<string>()\n const result: string[] = []\n\n for (const x of seq) {\n if (!seen.has(x)) {\n seen.add(x)\n result.push(x)\n }\n }\n\n return result\n}\n\nconst extractIdAndText = (input: string): { id: number; text: string } => {\n const match = input.match(/^(\\d+)[.,\\s]+(.*)$/)\n if (!match || match.length < 3) {\n throw new Error(\n 'line must start with a number, a dot and then text. e.g. \"1. hello\"'\n )\n }\n\n const id = parseInt(match[1] as string, 10)\n const text = (match[2] as string).trim()\n return { id, text }\n}\n\nconst extractIndexPrefixedText = (input: string): string => {\n const match = input.match(/^(\\d+)[.,\\s]+(.*)$/)\n // Check if match is not null and if the second capturing group is present\n if (match && match[2] !== undefined) {\n return match[2].trim()\n }\n return input\n}\n\nconst batchArray = <T>(arr: readonly T[], size: number): T[][] => {\n const chunkedArr: T[][] = []\n for (let i = 0; i < arr.length; i += size) {\n chunkedArr.push(arr.slice(i, i + size))\n }\n return chunkedArr\n}\n\nexport const AxStringUtil = {\n trimNonAlphaNum,\n splitIntoTwo,\n dedup,\n extractIdAndText,\n extractIndexPrefixedText,\n batchArray,\n}\n","import type { AxAIService } from '../ai/types.js'\nimport { AxGen, type AxGenOptions } from '../dsp/generate.js'\nimport type { AxProgramForwardOptions } from '../dsp/program.js'\nimport { AxStringUtil } from '../dsp/strutil.js'\n\nimport type { AxRerankerIn, AxRerankerOut } from './manager.js'\n\nexport class AxDefaultResultReranker extends AxGen<\n AxRerankerIn,\n AxRerankerOut\n> {\n constructor(options?: Readonly<AxGenOptions>) {\n const signature = `\"You are a re-ranker assistant tasked with evaluating a set of content items in relation to a specific question. Your role involves critically analyzing each content item to determine its relevance to the question and re-ranking them accordingly. This process includes assigning a relevance score from 0 to 10 to each content item based on how well it answers the question, its coverage of the topic, and the reliability of its information. This re-ranked list should start with the content item that is most relevant to the question and end with the least relevant. Output only the list.\"\n query: string, items: string[] -> rankedItems: string[] \"list of id, 5-words Rationale, relevance score\"`\n\n super(signature, options)\n }\n\n public override forward = async (\n ai: Readonly<AxAIService>,\n input: Readonly<AxRerankerIn>,\n options?: Readonly<AxProgramForwardOptions>\n ): Promise<AxRerankerOut> => {\n const { rankedItems } = await super.forward(ai, input, options)\n\n const sortedIndexes: number[] = rankedItems.map((item) => {\n const { id: index } = AxStringUtil.extractIdAndText(item)\n return index\n })\n\n // Ensure all elements are strings and filter out null or undefined\n const sortedItems = input.items\n .map((_, index) => {\n const originalIndex = sortedIndexes[index]\n return originalIndex !== undefined\n ? input.items[originalIndex]\n : undefined\n })\n .filter((item): item is string => item !== undefined)\n\n return { rankedItems: sortedItems }\n }\n}\n","import type {\n AxAIService,\n AxAIServiceActionOptions,\n AxFunction,\n} from '../ai/types.js'\n\nexport class AxEmbeddingAdapter {\n private aiService: AxAIService\n private info: {\n name: string\n description: string\n argumentDescription: string\n }\n private func: (\n args: readonly number[],\n extra?: Readonly<AxAIServiceActionOptions>\n ) => Promise<unknown>\n\n constructor({\n ai,\n info,\n func,\n }: Readonly<{\n ai: AxAIService\n info: Readonly<{\n name: string\n description: string\n argumentDescription: string\n }>\n func: (\n args: readonly number[],\n extra?: Readonly<AxAIServiceActionOptions>\n ) => Promise<unknown>\n }>) {\n this.aiService = ai\n this.info = info\n this.func = func\n }\n\n private async embedAdapter(\n text: string,\n extra?: Readonly<AxAIServiceActionOptions>\n ): Promise<unknown> {\n const embedRes = await this.aiService.embed(\n { texts: [text] },\n { sessionId: extra?.sessionId }\n )\n const embeds = embedRes.embeddings.at(0)\n\n if (!embeds) {\n throw new Error('Failed to embed text')\n }\n\n return this.func.length === 2 ? this.func(embeds, extra) : this.func(embeds)\n }\n\n public toFunction(): AxFunction {\n return {\n name: this.info.name,\n description: this.info.description,\n parameters: {\n type: 'object',\n properties: {\n text: {\n type: 'string',\n description: this.info.argumentDescription,\n },\n },\n required: ['text'],\n },\n func: ({ text }: Readonly<{ text: string }>, options) =>\n this.embedAdapter(text, options),\n }\n }\n}\n","export const stopwords = new Set([\n '0o',\n '0s',\n '3a',\n '3b',\n '3d',\n '6b',\n '6o',\n 'a',\n 'a1',\n 'a2',\n 'a3',\n 'a4',\n 'ab',\n 'able',\n 'about',\n 'above',\n 'abst',\n 'ac',\n 'accordance',\n 'according',\n 'accordingly',\n 'across',\n 'act',\n 'actually',\n 'ad',\n 'added',\n 'adj',\n 'ae',\n 'af',\n 'affected',\n 'affecting',\n 'affects',\n 'after',\n 'afterwards',\n 'ag',\n 'again',\n 'against',\n 'ah',\n 'ain',\n \"ain't\",\n 'aj',\n 'al',\n 'all',\n 'allow',\n 'allows',\n 'almost',\n 'alone',\n 'along',\n 'already',\n 'also',\n 'although',\n 'always',\n 'am',\n 'among',\n 'amongst',\n 'amoungst',\n 'amount',\n 'an',\n 'and',\n 'announce',\n 'another',\n 'any',\n 'anybody',\n 'anyhow',\n 'anymore',\n 'anyone',\n 'anything',\n 'anyway',\n 'anyways',\n 'anywhere',\n 'ao',\n 'ap',\n 'apart',\n 'apparently',\n 'appear',\n 'appreciate',\n 'appropriate',\n 'approximately',\n 'ar',\n 'are',\n 'aren',\n 'arent',\n \"aren't\",\n 'arise',\n 'around',\n 'as',\n \"a's\",\n 'aside',\n 'ask',\n 'asking',\n 'associated',\n 'at',\n 'au',\n 'auth',\n 'av',\n 'available',\n 'aw',\n 'away',\n 'awfully',\n 'ax',\n 'ay',\n 'az',\n 'b',\n 'b1',\n 'b2',\n 'b3',\n 'ba',\n 'back',\n 'bc',\n 'bd',\n 'be',\n 'became',\n 'because',\n 'become',\n 'becomes',\n 'becoming',\n 'been',\n 'before',\n 'beforehand',\n 'begin',\n 'beginning',\n 'beginnings',\n 'begins',\n 'behind',\n 'being',\n 'believe',\n 'below',\n 'beside',\n 'besides',\n 'best',\n 'better',\n 'between',\n 'beyond',\n 'bi',\n 'bill',\n 'biol',\n 'bj',\n 'bk',\n 'bl',\n 'bn',\n 'both',\n 'bottom',\n 'bp',\n 'br',\n 'brief',\n 'briefly',\n 'bs',\n 'bt',\n 'bu',\n 'but',\n 'bx',\n 'by',\n 'c',\n 'c1',\n 'c2',\n 'c3',\n 'ca',\n 'call',\n 'came',\n 'can',\n 'cannot',\n 'cant',\n \"can't\",\n 'cause',\n 'causes',\n 'cc',\n 'cd',\n 'ce',\n 'certain',\n 'certainly',\n 'cf',\n 'cg',\n 'ch',\n 'changes',\n 'ci',\n 'cit',\n 'cj',\n 'cl',\n 'clearly',\n 'cm',\n \"c'mon\",\n 'cn',\n 'co',\n 'com',\n 'come',\n 'comes',\n 'con',\n 'concerning',\n 'consequently',\n 'consider',\n 'considering',\n 'contain',\n 'containing',\n 'contains',\n 'corresponding',\n 'could',\n 'couldn',\n 'couldnt',\n \"couldn't\",\n 'course',\n 'cp',\n 'cq',\n 'cr',\n 'cry',\n 'cs',\n \"c's\",\n 'ct',\n 'cu',\n 'currently',\n 'cv',\n 'cx',\n 'cy',\n 'cz',\n 'd',\n 'd2',\n 'da',\n 'date',\n 'dc',\n 'dd',\n 'de',\n 'definitely',\n 'describe',\n 'described',\n 'despite',\n 'detail',\n 'df',\n 'di',\n 'did',\n 'didn',\n \"didn't\",\n 'different',\n 'dj',\n 'dk',\n 'dl',\n 'do',\n 'does',\n 'doesn',\n \"doesn't\",\n 'doing',\n 'don',\n 'done',\n \"don't\",\n 'down',\n 'downwards',\n 'dp',\n 'dr',\n 'ds',\n 'dt',\n 'du',\n 'due',\n 'during',\n 'dx',\n 'dy',\n 'e',\n 'e2',\n 'e3',\n 'ea',\n 'each',\n 'ec',\n 'ed',\n 'edu',\n 'ee',\n 'ef',\n 'effect',\n 'eg',\n 'ei',\n 'eight',\n 'eighty',\n 'either',\n 'ej',\n 'el',\n 'eleven',\n 'else',\n 'elsewhere',\n 'em',\n 'empty',\n 'en',\n 'end',\n 'ending',\n 'enough',\n 'entirely',\n 'eo',\n 'ep',\n 'eq',\n 'er',\n 'es',\n 'especially',\n 'est',\n 'et',\n 'et-al',\n 'etc',\n 'eu',\n 'ev',\n 'even',\n 'ever',\n 'every',\n 'everybody',\n 'everyone',\n 'everything',\n 'everywhere',\n 'ex',\n 'exactly',\n 'example',\n 'except',\n 'ey',\n 'f',\n 'f2',\n 'fa',\n 'far',\n 'fc',\n 'few',\n 'ff',\n 'fi',\n 'fifteen',\n 'fifth',\n 'fify',\n 'fill',\n 'find',\n 'fire',\n 'first',\n 'five',\n 'fix',\n 'fj',\n 'fl',\n 'fn',\n 'fo',\n 'followed',\n 'following',\n 'follows',\n 'for',\n 'former',\n 'formerly',\n 'forth',\n 'forty',\n 'found',\n 'four',\n 'fr',\n 'from',\n 'front',\n 'node:fs',\n 'ft',\n 'fu',\n 'full',\n 'further',\n 'furthermore',\n 'fy',\n 'g',\n 'ga',\n 'gave',\n 'ge',\n 'get',\n 'gets',\n 'getting',\n 'gi',\n 'give',\n 'given',\n 'gives',\n 'giving',\n 'gj',\n 'gl',\n 'go',\n 'goes',\n 'going',\n 'gone',\n 'got',\n 'gotten',\n 'gr',\n 'greetings',\n 'gs',\n 'gy',\n 'h',\n 'h2',\n 'h3',\n 'had',\n 'hadn',\n \"hadn't\",\n 'happens',\n 'hardly',\n 'has',\n 'hasn',\n 'hasnt',\n \"hasn't\",\n 'have',\n 'haven',\n \"haven't\",\n 'having',\n 'he',\n 'hed',\n \"he'd\",\n \"he'll\",\n 'hello',\n 'help',\n 'hence',\n 'her',\n 'here',\n 'hereafter',\n 'hereby',\n 'herein',\n 'heres',\n \"here's\",\n 'hereupon',\n 'hers',\n 'herself',\n 'hes',\n \"he's\",\n 'hh',\n 'hi',\n 'hid',\n 'him',\n 'himself',\n 'his',\n 'hither',\n 'hj',\n 'ho',\n 'home',\n 'hopefully',\n 'how',\n 'howbeit',\n 'however',\n \"how's\",\n 'hr',\n 'hs',\n 'http',\n 'hu',\n 'hundred',\n 'hy',\n 'i',\n 'i2',\n 'i3',\n 'i4',\n 'i6',\n 'i7',\n 'i8',\n 'ia',\n 'ib',\n 'ibid',\n 'ic',\n 'id',\n \"i'd\",\n 'ie',\n 'if',\n 'ig',\n 'ignored',\n 'ih',\n 'ii',\n 'ij',\n 'il',\n \"i'll\",\n 'im',\n \"i'm\",\n 'immediate',\n 'immediately',\n 'importance',\n 'important',\n 'in',\n 'inasmuch',\n 'inc',\n 'indeed',\n 'index',\n 'indicate',\n 'indicated',\n 'indicates',\n 'information',\n 'inner',\n 'insofar',\n 'instead',\n 'interest',\n 'into',\n 'invention',\n 'inward',\n 'io',\n 'ip',\n 'iq',\n 'ir',\n 'is',\n 'isn',\n \"isn't\",\n 'it',\n 'itd',\n \"it'd\",\n \"it'll\",\n 'its',\n \"it's\",\n 'itself',\n 'iv',\n \"i've\",\n 'ix',\n 'iy',\n 'iz',\n 'j',\n 'jj',\n 'jr',\n 'js',\n 'jt',\n 'ju',\n 'just',\n 'k',\n 'ke',\n 'keep',\n 'keeps',\n 'kept',\n 'kg',\n 'kj',\n 'km',\n 'know',\n 'known',\n 'knows',\n 'ko',\n 'l',\n 'l2',\n 'la',\n 'largely',\n 'last',\n 'lately',\n 'later',\n 'latter',\n 'latterly',\n 'lb',\n 'lc',\n 'le',\n 'least',\n 'les',\n 'less',\n 'lest',\n 'let',\n 'lets',\n \"let's\",\n 'lf',\n 'like',\n 'liked',\n 'likely',\n 'line',\n 'little',\n 'lj',\n 'll',\n 'll',\n 'ln',\n 'lo',\n 'look',\n 'looking',\n 'looks',\n 'los',\n 'lr',\n 'ls',\n 'lt',\n 'ltd',\n 'm',\n 'm2',\n 'ma',\n 'made',\n 'mainly',\n 'make',\n 'makes',\n 'many',\n 'may',\n 'maybe',\n 'me',\n 'mean',\n 'means',\n 'meantime',\n 'meanwhile',\n 'merely',\n 'mg',\n 'might',\n 'mightn',\n \"mightn't\",\n 'mill',\n 'million',\n 'mine',\n 'miss',\n 'ml',\n 'mn',\n 'mo',\n 'more',\n 'moreover',\n 'most',\n 'mostly',\n 'move',\n 'mr',\n 'mrs',\n 'ms',\n 'mt',\n 'mu',\n 'much',\n 'mug',\n 'must',\n 'mustn',\n \"mustn't\",\n 'my',\n 'myself',\n 'model',\n 'n',\n 'n2',\n 'na',\n 'name',\n 'namely',\n 'nay',\n 'nc',\n 'nd',\n 'ne',\n 'near',\n 'nearly',\n 'necessarily',\n 'necessary',\n 'need',\n 'needn',\n \"needn't\",\n 'needs',\n 'neither',\n 'never',\n 'nevertheless',\n 'new',\n 'next',\n 'ng',\n 'ni',\n 'nine',\n 'ninety',\n 'nj',\n 'nl',\n 'nn',\n 'no',\n 'nobody',\n 'non',\n 'none',\n 'nonetheless',\n 'noone',\n 'nor',\n 'normally',\n 'nos',\n 'not',\n 'noted',\n 'nothing',\n 'novel',\n 'now',\n 'nowhere',\n 'nr',\n 'ns',\n 'nt',\n 'ny',\n 'o',\n 'oa',\n 'ob',\n 'obtain',\n 'obtained',\n 'obviously',\n 'oc',\n 'od',\n 'of',\n 'off',\n 'often',\n 'og',\n 'oh',\n 'oi',\n 'oj',\n 'ok',\n 'okay',\n 'ol',\n 'old',\n 'om',\n 'omitted',\n 'on',\n 'once',\n 'one',\n 'ones',\n 'only',\n 'onto',\n 'oo',\n 'op',\n 'oq',\n 'or',\n 'ord',\n 'os',\n 'ot',\n 'other',\n 'others',\n 'otherwise',\n 'ou',\n 'ought',\n 'our',\n 'ours',\n 'ourselves',\n 'out',\n 'outside',\n 'over',\n 'overall',\n 'ow',\n 'owing',\n 'own',\n 'ox',\n 'oz',\n 'p',\n 'p1',\n 'p2',\n 'p3',\n 'page',\n 'pagecount',\n 'pages',\n 'par',\n 'part',\n 'particular',\n 'particularly',\n 'pas',\n 'past',\n 'pc',\n 'pd',\n 'pe',\n 'per',\n 'perhaps',\n 'pf',\n 'ph',\n 'pi',\n 'pj',\n 'pk',\n 'pl',\n 'placed',\n 'please',\n 'plus',\n 'pm',\n 'pn',\n 'po',\n 'poorly',\n 'possible',\n 'possibly',\n 'potentially',\n 'pp',\n 'pq',\n 'pr',\n 'predominantly',\n 'present',\n 'presumably',\n 'previously',\n 'primarily',\n 'probably',\n 'promptly',\n 'proud',\n 'provides',\n 'ps',\n 'pt',\n 'pu',\n 'put',\n 'py',\n 'q',\n 'qj',\n 'qu',\n 'que',\n 'quickly',\n 'quite',\n 'qv',\n 'r',\n 'r2',\n 'ra',\n 'ran',\n 'rather',\n 'rc',\n 'rd',\n 're',\n 'readily',\n 'really',\n 'reasonably',\n 'recent',\n 'recently',\n 'ref',\n 'refs',\n 'regarding',\n 'regardless',\n 'regards',\n 'related',\n 'relatively',\n 'research',\n 'research-articl',\n 'respectively',\n 'resulted',\n 'resulting',\n 'results',\n 'rf',\n 'rh',\n 'ri',\n 'right',\n 'rj',\n 'rl',\n 'rm',\n 'rn',\n 'ro',\n 'rq',\n 'rr',\n 'rs',\n 'rt',\n 'ru',\n 'run',\n 'rv',\n 'ry',\n 's',\n 's2',\n 'sa',\n 'said',\n 'same',\n 'saw',\n 'say',\n 'saying',\n 'says',\n 'sc',\n 'sd',\n 'se',\n 'sec',\n 'second',\n 'secondly',\n 'section',\n 'see',\n 'seeing',\n 'seem',\n 'seemed',\n 'seeming',\n 'seems',\n 'seen',\n 'self',\n 'selves',\n 'sensible',\n 'sent',\n 'serious',\n 'seriously',\n 'seven',\n 'several',\n 'sf',\n 'shall',\n 'shan',\n \"shan't\",\n 'she',\n 'shed',\n \"she'd\",\n \"she'll\",\n 'shes',\n \"she's\",\n 'should',\n 'shouldn',\n \"shouldn't\",\n \"should've\",\n 'show',\n 'showed',\n 'shown',\n 'showns',\n 'shows',\n 'si',\n 'side',\n 'significant',\n 'significantly',\n 'similar',\n 'similarly',\n 'since',\n 'sincere',\n 'six',\n 'sixty',\n 'sj',\n 'sl',\n 'slightly',\n 'sm',\n 'sn',\n 'so',\n 'some',\n 'somebody',\n 'somehow',\n 'someone',\n 'somethan',\n 'something',\n 'sometime',\n 'sometimes',\n 'somewhat',\n 'somewhere',\n 'soon',\n 'sorry',\n 'sp',\n 'specifically',\n 'specified',\n 'specify',\n 'specifying',\n 'sq',\n 'sr',\n 'ss',\n 'st',\n 'still',\n 'stop',\n 'strongly',\n 'sub',\n 'substantially',\n 'successfully',\n 'such',\n 'sufficiently',\n 'suggest',\n 'sup',\n 'sure',\n 'sy',\n 'system',\n 'sz',\n 't',\n 't1',\n 't2',\n 't3',\n 'take',\n 'taken',\n 'taking',\n 'tb',\n 'tc',\n 'td',\n 'te',\n 'tell',\n 'ten',\n 'tends',\n 'tf',\n 'th',\n 'than',\n 'thank',\n 'thanks',\n 'thanx',\n 'that',\n \"that'll\",\n 'thats',\n \"that's\",\n \"that've\",\n 'the',\n 'their',\n 'theirs',\n 'them',\n 'themselves',\n 'then',\n 'thence',\n 'there',\n 'thereafter',\n 'thereby',\n 'thered',\n 'therefore',\n 'therein',\n \"there'll\",\n 'thereof',\n 'therere',\n 'theres',\n \"there's\",\n 'thereto',\n 'thereupon',\n \"there've\",\n 'these',\n 'they',\n 'theyd',\n \"they'd\",\n \"they'll\",\n 'theyre',\n \"they're\",\n \"they've\",\n 'thickv',\n 'thin',\n 'think',\n 'third',\n 'this',\n 'thorough',\n 'thoroughly',\n 'those',\n 'thou',\n 'though',\n 'thoughh',\n 'thousand',\n 'three',\n 'throug',\n 'through',\n 'throughout',\n 'thru',\n 'thus',\n 'ti',\n 'til',\n 'tip',\n 'tj',\n 'tl',\n 'tm',\n 'tn',\n 'to',\n 'together',\n 'too',\n 'took',\n 'top',\n 'toward',\n 'towards',\n 'tp',\n 'tq',\n 'tr',\n 'tried',\n 'tries',\n 'truly',\n 'try',\n 'trying',\n 'ts',\n \"t's\",\n 'tt',\n 'tv',\n 'twelve',\n 'twenty',\n 'twice',\n 'two',\n 'tx',\n 'u',\n 'u201d',\n 'ue',\n 'ui',\n 'uj',\n 'uk',\n 'um',\n 'un',\n 'under',\n 'unfortunately',\n 'unless',\n 'unlike',\n 'unlikely',\n 'until',\n 'unto',\n 'uo',\n 'up',\n 'upon',\n 'ups',\n 'ur',\n 'us',\n 'use',\n 'used',\n 'useful',\n 'usefully',\n 'usefulness',\n 'uses',\n 'using',\n 'usually',\n 'ut',\n 'v',\n 'va',\n 'value',\n 'various',\n 'vd',\n 've',\n 've',\n 'very',\n 'via',\n 'viz',\n 'vj',\n 'vo',\n 'vol',\n 'vols',\n 'volumtype',\n 'vq',\n 'vs',\n 'vt',\n 'vu',\n 'w',\n 'wa',\n 'want',\n 'wants',\n 'was',\n 'wasn',\n 'wasnt',\n \"wasn't\",\n 'way',\n 'we',\n 'wed',\n \"we'd\",\n 'welcome',\n 'well',\n \"we'll\",\n 'well-b',\n 'went',\n 'were',\n \"we're\",\n 'weren',\n 'werent',\n \"weren't\",\n \"we've\",\n 'what',\n 'whatever',\n \"what'll\",\n 'whats',\n \"what's\",\n 'when',\n 'whence',\n 'whenever',\n \"when's\",\n 'where',\n 'whereafter',\n 'whereas',\n 'whereby',\n 'wherein',\n 'wheres',\n \"where's\",\n 'whereupon',\n 'wherever',\n 'whether',\n 'which',\n 'while',\n 'whim',\n 'whither',\n 'who',\n 'whod',\n 'whoever',\n 'whole',\n \"who'll\",\n 'whom',\n 'whomever',\n 'whos',\n \"who's\",\n 'whose',\n 'why',\n \"why's\",\n 'wi',\n 'widely',\n 'will',\n 'willing',\n 'wish',\n 'with',\n 'within',\n 'without',\n 'wo',\n 'won',\n 'wonder',\n 'wont',\n \"won't\",\n 'words',\n 'world',\n 'would',\n 'wouldn',\n 'wouldnt',\n \"wouldn't\",\n 'www',\n 'x',\n 'x1',\n 'x2',\n 'x3',\n 'xf',\n 'xi',\n 'xj',\n 'xk',\n 'xl',\n 'xn',\n 'xo',\n 'xs',\n 'xt',\n 'xv',\n 'xx',\n 'y',\n 'y2',\n 'yes',\n 'yet',\n 'yj',\n 'yl',\n 'you',\n 'youd',\n \"you'd\",\n \"you'll\",\n 'your',\n 'youre',\n \"you're\",\n 'yours',\n 'yourself',\n 'yourselves',\n \"you've\",\n 'yr',\n 'ys',\n 'yt',\n 'z',\n 'zero',\n 'zi',\n 'zz',\n 'task',\n])\n","import { stopwords } from './stopwords.js'\n\n/**\n * Filters out tokens based on a set of exclusion tokens.\n *\n * @param tokens The array of tokens to filter.\n * @param exclusions A set containing tokens to exclude.\n * @returns An array of filtered tokens.\n */\nfunction filterTokens(\n tokens: readonly string[],\n exclusions: ReadonlySet<string>\n): string[] {\n return tokens.filter((token) => !exclusions.has(token))\n}\n\n/**\n * Counts the occurrences of each token in an array of tokens.\n *\n * This function supports the preprocessing step for NLP tasks like text similarity\n * and classification by transforming text into a bag-of-words model, facilitating\n * the comparison of different texts based on their content.\n *\n * @param tokens An array of string tokens.\n * @returns A Counter object mapping each token to its count.\n */\nfunction countTokens(tokens: readonly string[]): Record<string, number> {\n const counter: Record<string, number> = {}\n for (const token of tokens) {\n counter[token] = (counter[token] || 0) + 1\n }\n return counter\n}\n\n/**\n * Normalizes text by lowercasing, removing punctuation, and squashing multiple spaces.\n *\n * This normalization is crucial in NLP for reducing the complexity of the text data,\n * minimizing the variance between words that should be considered the same for analysis\n * purposes (e.g., \"Dog!\" and \"dog\" are treated as the same word).\n *\n * @param s A string to be normalized.\n * @returns A normalized string.\n */\nfunction normalizeText(s: string): string {\n s = s.normalize('NFD')\n s = s.replace(/\\b(a|an|the)\\b/g, ' ')\n s = s.split(/\\s+/).join(' ')\n s = s.replace(/[!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]/g, '')\n return s.toLowerCase()\n}\n\n/**\n * Calculates the Exact Match (EM) score between a prediction and ground truth.\n *\n * The EM score is a strict metric used in machine learning to assess if the predicted\n * answer matches the ground truth exactly, commonly used in tasks like question answering.\n *\n * @param prediction The predicted text.\n * @param groundTruth The actual correct text.\n * @returns A boolean indicating if the prediction exactly matches the ground truth.\n */\nfunction emScore(prediction: string, groundTruth: string): boolean {\n return normalizeText(prediction) === normalizeText(groundTruth)\n}\n\n/**\n * Calculates the F1 score between a prediction and ground truth.\n *\n * The F1 score is a harmonic mean of precision and recall, widely used in NLP to measure\n * a model's accuracy in considering both false positives and false negatives, offering a\n * balance for evaluating classification models.\n *\n * @param prediction The predicted text.\n * @param groundTruth The actual correct text.\n * @returns The F1 score as a number.\n */\nfunction f1Score(prediction: string, groundTruth: string): number {\n const predictionTokens = normalizeText(prediction).split(' ')\n const groundTruthTokens = normalizeText(groundTruth).split(' ')\n\n // Calculate the intersection of common tokens between prediction and ground truth\n const predictionCounts = countTokens(predictionTokens)\n const groundTruthCounts = countTokens(groundTruthTokens)\n\n let numSame = 0\n for (const token in predictionCounts) {\n const v1 = predictionCounts[token] ?? 0\n const v2 = groundTruthCounts[token] ?? 0\n numSame += Math.min(v1, v2)\n }\n if (numSame === 0) {\n return 0\n }\n\n const precision = numSame / predictionTokens.length\n const recall = numSame / groundTruthTokens.length\n return (2 * precision * recall) / (precision + recall)\n}\n\n/**\n * Calculates a novel F1 score, taking into account a history of interaction and excluding stopwords.\n *\n * This metric extends the F1 score by considering contextual relevance and filtering out common words\n * that might skew the assessment of the prediction's quality, especially in conversational models or\n * when historical context is relevant.\n *\n * @param history The historical context or preceding interactions.\n * @param prediction The predicted text.\n * @param groundTruth The actual correct text.\n * @param returnRecall Optionally return the recall score instead of F1.\n * @returns The novel F1 or recall score as a number.\n */\nfunction novelF1ScoreOptimized(\n history: string,\n prediction: string,\n groundTruth: string,\n returnRecall: boolean = false\n): number {\n // Normalize and split the input texts into tokens\n const historyTokens = normalizeText(history).split(' ')\n let predictionTokens = normalizeText(prediction).split(' ')\n let groundTruthTokens = normalizeText(groundTruth).split(' ')\n\n // Combine stopwords and history tokens for exclusion\n const exclusions = new Set([...stopwords, ...historyTokens])\n\n // Filter prediction and ground truth tokens against the exclusions\n predictionTokens = filterTokens(predictionTokens, exclusions)\n groundTruthTokens = filterTokens(groundTruthTokens, exclusions)\n\n // Proceed with calculating common tokens, precision, recall, and F1 score as previously outlined\n\n // Placeholder for the calculation logic\n const numSame = 0 // This should be calculated as before\n const precision = numSame / predictionTokens.length\n const recall = numSame / groundTruthTokens.length\n const f1 = (2 * precision * recall) / (precision + recall)\n\n return returnRecall ? recall : f1\n}\n\nexport const AxEvalUtil = {\n emScore,\n f1Score,\n novelF1ScoreOptimized,\n}\n","import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from 'uuid'\n\nimport type { AxFunction } from '../ai/types.js'\nimport { ColorLog } from '../util/log.js'\n\nimport type { AxMCPTransport } from './transport.js'\nimport type {\n JSONRPCNotification,\n JSONRPCRequest,\n MCPInitializeParams,\n MCPInitializeResult,\n MCPToolsListResult,\n} from './types.js'\n\nconst colorLog = new ColorLog()\n\n/**\n * Configuration for overriding function properties\n */\ninterface FunctionOverride {\n /** Original function name to override */\n name: string\n /** Updates to apply to the function */\n updates: {\n /** Alternative name for the function */\n name?: string\n /** Alternative description for the function */\n description?: string\n }\n}\n\n/**\n * Options for the MCP client\n */\ninterface AxMCPClientOptions {\n /** Enable debug logging */\n debug?: boolean\n /**\n * List of function overrides\n * Use this to provide alternative names and descriptions for functions\n * while preserving their original functionality\n *\n * Example:\n * ```\n * functionOverrides: [\n * {\n * name: \"original-function-name\",\n * updates: {\n * name: \"new-function-name\",\n * description: \"New function description\"\n * }\n * }\n * ]\n * ```\n */\n functionOverrides?: FunctionOverride[]\n}\n\nexport class AxMCPClient {\n private functions: AxFunction[] = []\n private activeRequests: Map<string, { reject: (reason: unknown) => void }> =\n new Map()\n private capabilities: {\n tools?: boolean\n resources?: boolean\n prompts?: boolean\n } = {}\n\n constructor(\n private readonly transport: AxMCPTransport,\n private readonly options: Readonly<AxMCPClientOptions> = {}\n ) {}\n\n async init(): Promise<void> {\n if ('connect' in this.transport) {\n await this.transport.connect?.()\n }\n\n const { result: res } = await this.sendRequest<\n MCPInitializeParams,\n MCPInitializeResult\n >('initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {\n roots: { listChanged: true },\n sampling: {},\n },\n clientInfo: {\n name: 'AxMCPClient',\n version: '1.0.0',\n },\n })\n\n const expectedProtocolVersion = '2024-11-05'\n if (res.protocolVersion !== expectedProtocolVersion) {\n throw new Error(\n `Protocol version mismatch. Expected ${expectedProtocolVersion} but got ${res.protocolVersion}`\n )\n }\n\n if (res.capabilities.tools) {\n this.capabilities.tools = true\n }\n\n if (res.capabilities.resources) {\n this.capabilities.resources = true\n }\n\n if (res.capabilities.prompts) {\n this.capabilities.prompts = true\n }\n\n await this.sendNotification('notifications/initialized')\n\n await this.discoverFunctions()\n }\n\n private async discoverFunctions(): Promise<void> {\n if (!this.capabilities.tools) {\n throw new Error('Tools are not supported')\n }\n\n const { result: res } = await this.sendRequest<\n undefined,\n MCPToolsListResult\n >('tools/list')\n\n this.functions = res.tools.map((fn): AxFunction => {\n // Check if there's an override for this function\n const override = this.options.functionOverrides?.find(\n (o) => o.name === fn.name\n )\n\n const parameters = fn.inputSchema.properties\n ? {\n properties: fn.inputSchema.properties,\n required: fn.inputSchema.required ?? [],\n type: fn.inputSchema.type,\n }\n : undefined\n\n return {\n name: override?.updates.name ?? fn.name,\n description: override?.updates.description ?? fn.description,\n parameters,\n func: async (args) => {\n // Always use original name when calling the function\n const { result } = await this.sendRequest<{\n name: string\n // eslint-disable-next-line functional/functional-parameters\n arguments: unknown\n }>('tools/call', { name: fn.name, arguments: args })\n return result\n },\n }\n })\n\n if (this.options.debug) {\n console.log(\n colorLog.yellow(`> Discovered ${this.functions.length} functions:`)\n )\n for (const fn of this.functions) {\n console.log(colorLog.yellow(` - ${fn.name}: ${fn.description}`))\n }\n }\n }\n\n async ping(timeout = 3000): Promise<void> {\n const pingPromise = this.sendRequest('ping')\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(\n () => reject(new Error('Ping response timeout exceeded')),\n timeout\n )\n )\n const response = (await Promise.race([pingPromise, timeoutPromise])) as {\n result: unknown\n }\n const { result } = response\n if (\n typeof result !== 'object' ||\n result === null ||\n Object.keys(result).length !== 0\n ) {\n throw new Error(`Unexpected ping response: ${JSON.stringify(result)}`)\n }\n }\n\n toFunction(): AxFunction[] {\n return this.functions\n }\n\n cancelRequest(id: string): void {\n if (this.activeRequests.has(id)) {\n this.sendNotification('notifications/cancelled', {\n requestId: id,\n reason: 'Client cancelled request',\n })\n const entry = this.activeRequests.get(id)\n if (entry) {\n entry.reject(new Error(`Request ${id} cancelled`))\n }\n this.activeRequests.delete(id)\n }\n }\n\n private async sendRequest<T = unknown, R = unknown>(\n method: string,\n params: T = {} as T\n ): Promise<{ id: string; result: R }> {\n const requestId = uuidv4()\n const request: JSONRPCRequest<T> = {\n jsonrpc: '2.0',\n id: requestId,\n method,\n params,\n }\n\n if (this.options.debug) {\n console.log(\n colorLog.blueBright(\n `> Sending request ${requestId}:\\n${JSON.stringify(request, null, 2)}`\n )\n )\n }\n\n const responsePromise = new Promise<{ result: R }>((resolve, reject) => {\n this.activeRequests.set(requestId, { reject })\n this.transport\n .send(request)\n .then((res: unknown) => {\n this.activeRequests.delete(requestId)\n if (this.options.debug) {\n console.log(\n colorLog.greenBright(\n `> Received response for request ${requestId}:\\n${JSON.stringify(res, null, 2)}`\n )\n )\n }\n if (res !== null && typeof res === 'object' && 'error' in res) {\n const errorObj = res as { error: { code: number; message: string } }\n reject(\n new Error(\n `RPC Error ${errorObj.error.code}: ${errorObj.error.message}`\n )\n )\n } else if (\n res !== null &&\n typeof res === 'object' &&\n 'result' in res\n ) {\n resolve({ result: (res as { result: R }).result })\n } else {\n reject(new Error('Invalid response no result or error'))\n }\n })\n .catch((err: unknown) => {\n this.activeRequests.delete(requestId)\n reject(err)\n })\n })\n\n const { result } = await responsePromise\n return { id: requestId, result }\n }\n\n private async sendNotification(\n method: string,\n params: Record<string, unknown> = {}\n ): Promise<void> {\n const notification: JSONRPCNotification = {\n jsonrpc: '2.0',\n method,\n params,\n }\n\n if (this.options.debug) {\n console.log(\n '➡️ Sending notification:',\n JSON.stringify(notification, null, 2)\n )\n }\n\n await this.transport.sendNotification(notification)\n }\n}\n","import type { AxMCPTransport } from './transport.js'\nimport type {\n JSONRPCNotification,\n JSONRPCRequest,\n JSONRPCResponse,\n} from './types.js'\n\nexport class AxMCPHTTPTransport implements AxMCPTransport {\n private endpoint: string | null = null\n private sseUrl: string\n private eventSource?: EventSource\n\n constructor(sseUrl: string) {\n this.sseUrl = sseUrl\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.eventSource = new EventSource(this.sseUrl)\n\n this.eventSource.addEventListener('endpoint', (event: Event) => {\n try {\n const messageEvent = event as MessageEvent\n const data = JSON.parse(messageEvent.data)\n if (!data.uri) {\n throw new Error('Endpoint URI missing in SSE event data')\n }\n this.endpoint = data.uri\n resolve()\n } catch (error) {\n reject(error)\n }\n })\n\n this.eventSource.onerror = () => {\n reject(new Error('Failed to establish SSE connection'))\n }\n })\n }\n\n async send(\n message: JSONRPCRequest<unknown> | JSONRPCNotification\n ): Promise<JSONRPCResponse<unknown>> {\n if (!this.endpoint) {\n throw new Error(\n 'HTTPTransport endpoint is not initialized. Call connect() first.'\n )\n }\n\n const res = await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(message),\n })\n\n if (!res.ok) {\n throw new Error(`HTTP error ${res.status}: ${res.statusText}`)\n }\n\n return res.json() as Promise<JSONRPCResponse<unknown>>\n }\n\n async sendNotification(\n message: Readonly<JSONRPCNotification>\n ): Promise<void> {\n if (!this.endpoint) {\n throw new Error(\n 'HTTPTransport endpoint is not initialized. Call connect() first.'\n )\n }\n await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(message),\n })\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process'\nimport readline from 'node:readline'\n\nimport type { AxMCPTransport } from './transport.js'\nimport type {\n JSONRPCNotification,\n JSONRPCRequest,\n JSONRPCResponse,\n} from './types.js'\n\ninterface StdioTransportConfig {\n command: string\n args?: string[]\n env?: NodeJS.ProcessEnv\n}\n\nexport class AxMCPStdioTransport implements AxMCPTransport {\n private process: ChildProcessWithoutNullStreams\n private rl: readline.Interface\n private pendingResponses = new Map<\n string | number,\n (res: JSONRPCResponse) => void\n >()\n\n constructor(config: Readonly<StdioTransportConfig>) {\n this.process = spawn(config.command, config.args ?? [], {\n env: config.env ? { ...process.env, ...config.env } : process.env,\n })\n this.rl = readline.createInterface({ input: this.process.stdout })\n this.rl.on('line', (line) => {\n const response: JSONRPCResponse = JSON.parse(line)\n const resolver = this.pendingResponses.get(response.id)\n if (resolver) {\n resolver(response)\n this.pendingResponses.delete(response.id)\n }\n })\n }\n\n async send(\n message: Readonly<JSONRPCRequest<unknown>>\n ): Promise<JSONRPCResponse<unknown>> {\n return new Promise<JSONRPCResponse<unknown>>((resolve) => {\n this.pendingResponses.set(message.id, (res: JSONRPCResponse) => {\n resolve(res as JSONRPCResponse<unknown>)\n })\n this.process.stdin.write(`${JSON.stringify(message)}\\n`)\n })\n }\n\n async sendNotification(\n message: Readonly<JSONRPCNotification>\n ): Promise<void> {\n this.process.stdin.write(`${JSON.stringify(message)}\\n`)\n }\n\n async connect(): Promise<void> {\n // Existing implementation\n }\n}\n","import type { ReadableStream } from 'stream/web'\n\nimport type {\n AxAIModelList,\n AxAIPromptConfig,\n AxAIService,\n AxAIServiceActionOptions,\n AxAIServiceMetrics,\n AxAIServiceOptions,\n AxChatRequest,\n AxChatResponse,\n AxEmbedRequest,\n AxEmbedResponse,\n} from './types.js'\n\ntype AxAIServiceListItem = {\n key: string\n service: AxAIService\n description: string\n isInternal?: boolean\n}\n\nexport class AxMultiServiceRouter implements AxAIService<string, string> {\n private services: Map<\n string,\n {\n useDefaultModel?: boolean\n isInternal?: boolean\n description: string\n model: string\n service: AxAIService\n }\n > = new Map()\n /**\n * Constructs a new multi-service router.\n * It validates that each service provides a unique set of model keys,\n * then builds a lookup (map) for routing the chat/embed requests.\n */\n constructor(services: (AxAIServiceListItem | AxAIService)[]) {\n if (services.length === 0) {\n throw new Error('No AI services provided.')\n }\n\n // Determine input type based on first element (assuming homogeneous array)\n\n for (const [index, item] of services.entries()) {\n const isKeyBased = 'key' in item\n\n if (isKeyBased) {\n if (this.services.has(item.key)) {\n throw new Error(`Duplicate model key: ${item.key}`)\n }\n\n const { service, description, isInternal } = item\n\n this.services.set(item.key, {\n service,\n description,\n isInternal,\n model: item.service.getDefaultModels().model,\n useDefaultModel: true,\n })\n } else {\n const modelList = item.getModelList() as AxAIModelList | undefined\n\n if (!modelList) {\n throw new Error(\n `Service ${index} \\`${item.getName()}\\` has no model list.`\n )\n }\n\n for (const { key, description, model } of modelList ?? []) {\n if (this.services.has(key)) {\n const otherService = this.services.get(key)?.service\n throw new Error(\n `Service ${index} \\`${item.getName()}\\` has duplicate model key: ${key} as service ${otherService?.getName()}`\n )\n }\n\n this.services.set(key, {\n description,\n service: item,\n model,\n })\n }\n }\n }\n }\n\n /**\n * Delegates the chat call to the service matching the provided model key.\n */\n async chat(\n req: Readonly<AxChatRequest<string>>,\n options?: Readonly<\n AxAIPromptConfig & AxAIServiceActionOptions<string, string>\n >\n ): Promise<AxChatResponse | ReadableStream<AxChatResponse>> {\n const modelKey = req.model\n if (!modelKey) {\n throw new Error('Model key must be specified for multi-service')\n }\n\n const item = this.services.get(modelKey)\n if (!item) {\n throw new Error(`No service found for model key: ${modelKey}`)\n }\n\n const service = item.service\n const model = item.useDefaultModel ? req.model : modelKey\n return await service.chat({ model, ...req }, options)\n }\n\n /**\n * Delegates the embed call to the service matching the provided embed model key.\n */\n async embed(\n req: Readonly<AxEmbedRequest<string>>,\n options?: Readonly<AxAIServiceActionOptions<string, string>>\n ): Promise<AxEmbedResponse> {\n const modelKey = req.embedModel\n if (!modelKey) {\n throw new Error('Embed model key must be specified for multi-service')\n }\n\n const item = this.services.get(modelKey)\n if (!item) {\n throw new Error(`No service found for embed model key: ${modelKey}`)\n }\n\n // Remove embedModel from request as service should use its default\n const service = item.service\n const embedModel = item.useDefaultModel ? req.embedModel : modelKey\n return await service.embed({ embedModel, ...req }, options)\n }\n\n /**\n * Returns a composite ID built from the IDs of the underlying services.\n */\n getId(): string {\n return (\n 'MultiServiceRouter:' +\n Array.from(this.services.values())\n .map((s) => s.service.getId())\n .join(',')\n )\n }\n\n /**\n * Returns the name of this router.\n */\n getName(): string {\n return 'MultiServiceRouter'\n }\n\n /**\n * Aggregates all available models across the underlying services.\n */\n getModelList(): AxAIModelList {\n return Array.from(this.services)\n .filter(([, value]) => !value.isInternal)\n .map(([key, { description, model }]) => ({\n key,\n description,\n model,\n }))\n }\n\n getDefaultModels(): Readonly<{ model: string; embedModel?: string }> {\n throw new Error(\n 'getDefaultModels is not supported for multi-service router.'\n )\n }\n\n /**\n * If a model key is provided, delegate to the corresponding service's features.\n * Otherwise, returns a default feature set.\n */\n getFeatures(model?: string): {\n functions: boolean\n streaming: boolean\n functionCot?: boolean\n } {\n if (model) {\n const service = this.services.get(model)\n if (service) {\n return service.service.getFeatures(model)\n }\n }\n return { functions: false, streaming: false }\n }\n\n /**\n * Returns aggregated metrics from the underlying service.\n * Uses the metrics from the last service that was used,\n * or falls back to the first service if none has been used.\n */\n getMetrics(): AxAIServiceMetrics {\n const service = this.services.values().next().value\n if (!service) {\n throw new Error('No service available to get metrics.')\n }\n return service.service.getMetrics()\n }\n\n /**\n * Sets options on all underlying services.\n */\n setOptions(options: Readonly<AxAIServiceOptions>): void {\n for (const service of this.services.values()) {\n service.service.setOptions(options)\n }\n }\n\n /**\n * Returns the options from the last used service,\n * or falls back to the first service if none has been used.\n */\n getOptions(): Readonly<AxAIServiceOptions> {\n const service = this.services.values().next().value\n if (!service) {\n throw new Error('No service available to get options.')\n }\n return service.service.getOptions()\n }\n}\n","import { type AxProgramForwardOptions } from '../dsp/program.js'\nimport { AxStringUtil } from '../dsp/strutil.js'\nimport {\n type AxAIService,\n AxGen,\n type AxGenOptions,\n AxSignature,\n} from '../index.js'\n\nimport { AxChainOfThought } from './cot.js'\n\nexport class AxRAG extends AxChainOfThought<\n { context: string[]; question: string },\n { answer: string }\n> {\n private genQuery: AxGen<\n { context: string[]; question: string },\n { query: string }\n >\n private queryFn: (query: string) => Promise<string>\n private maxHops: number\n\n constructor(\n queryFn: (query: string) => Promise<string>,\n options: Readonly<AxGenOptions & { maxHops?: number }>\n ) {\n const sig =\n '\"Answer questions with short factoid answers.\" context:string[] \"may contain relevant facts\", question -> answer'\n super(sig, options)\n\n this.maxHops = options?.maxHops ?? 3\n\n const qsig = new AxSignature(\n '\"Write a simple search query that will help answer a complex question.\" context?:string[] \"may contain relevant facts\", question -> query \"question to further our understanding\"'\n )\n this.genQuery = new AxGen<\n { context: string[]; question: string },\n { query: string }\n >(qsig)\n this.queryFn = queryFn\n this.register(this.genQuery)\n }\n\n public override async forward(\n ai: Readonly<AxAIService>,\n { question }: Readonly<{ question: string }>,\n options?: Readonly<AxProgramForwardOptions>\n ): Promise<{ answer: string; reason: string }> {\n let context: string[] = []\n\n for (let i = 0; i < this.maxHops; i++) {\n const { query } = await this.genQuery.forward(\n ai,\n {\n context,\n question,\n },\n options\n )\n const val = await this.queryFn(query)\n context = AxStringUtil.dedup([...context, val])\n }\n\n return super.forward(ai, { context, question }, options)\n }\n}\n"],"mappings":"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AAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ACloCD,SAAS,aACP,QACA,YACU;AACV,SAAO,OAAO,OAAO,CAAC,UAAU,CAAC,WAAW,IA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","names":["AxLLMRequestTypeValues","AxSpanKindValues","ReadableStream","TransformStream","TransformStream","TransformStream","controller","ReadableStream","TransformStream","fn","res","AxAIAnthropicModel","AxAIAnthropicVertexModel","content","AxAIOpenAIModel","AxAIOpenAIEmbedModel","createMessages","mapFinishReason","id","AxAICohereModel","AxAICohereEmbedModel","AxAIDeepSeekModel","AxAIGoogleGeminiModel","AxAIGoogleGeminiEmbedModel","AxAIGoogleGeminiSafetyCategory","AxAIGoogleGeminiSafetyThreshold","AxAIGoogleGeminiEmbedTypes","i","safetySettings","colorLog","AxAIGroqModel","AxAIHuggingFaceModel","fc","AxAIMistralModel","AxAIMistralEmbedModels","AxAIRekaModel","createMessages","mapFinishReason","ReadableStream","SpanKind","fc","colorLog","value","colorLog","schema","colorLog","res","ReadableStream","SpanKind","files","validateModels","SpanKind","fetch","SpanKind","fetch","table","table","fetch","fetch","AxJSInterpreterPermission","colorLog","m","crypto","crypto","colorLog"]}