@mgvdev/nestjs-ai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +655 -0
- package/dist/ai-module-options.interface-B5X4AFLC.d.cts +192 -0
- package/dist/ai-module-options.interface-Ca6y_MY2.d.ts +192 -0
- package/dist/conversation-store.interface-CtQY-qcc.d.cts +30 -0
- package/dist/conversation-store.interface-CtQY-qcc.d.ts +30 -0
- package/dist/index.cjs +3209 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1441 -0
- package/dist/index.d.ts +1441 -0
- package/dist/index.js +3163 -0
- package/dist/index.js.map +1 -0
- package/dist/stream-to-socket-fJphU0WN.d.cts +47 -0
- package/dist/stream-to-socket-fJphU0WN.d.ts +47 -0
- package/dist/testing.cjs +2395 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +46 -0
- package/dist/testing.d.ts +46 -0
- package/dist/testing.js +2391 -0
- package/dist/testing.js.map +1 -0
- package/dist/typeorm.cjs +115 -0
- package/dist/typeorm.cjs.map +1 -0
- package/dist/typeorm.d.cts +44 -0
- package/dist/typeorm.d.ts +44 -0
- package/dist/typeorm.js +113 -0
- package/dist/typeorm.js.map +1 -0
- package/dist/websocket.cjs +154 -0
- package/dist/websocket.cjs.map +1 -0
- package/dist/websocket.d.cts +25 -0
- package/dist/websocket.d.ts +25 -0
- package/dist/websocket.js +152 -0
- package/dist/websocket.js.map +1 -0
- package/documentation/README.md +44 -0
- package/documentation/agents-and-tools.md +102 -0
- package/documentation/api-reference.md +117 -0
- package/documentation/configuration.md +87 -0
- package/documentation/content-safety.md +51 -0
- package/documentation/embeddings-and-rag.md +105 -0
- package/documentation/evals-and-testing.md +56 -0
- package/documentation/getting-started.md +96 -0
- package/documentation/guardrails-events-telemetry.md +72 -0
- package/documentation/jobs-and-realtime.md +69 -0
- package/documentation/memory.md +101 -0
- package/documentation/multimodal.md +49 -0
- package/documentation/orchestration-and-mcp.md +68 -0
- package/documentation/prompts.md +51 -0
- package/documentation/reliability.md +90 -0
- package/documentation/structured-output-and-streaming.md +81 -0
- package/package.json +146 -0
- package/skill/nestjs-ai/SKILL.md +154 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ai.constants.ts","../src/resilience/fallback-model.ts","../src/cache/cache-middleware.ts","../src/core/provider-registry.ts","../src/observability/ai-event-emitter.ts","../src/observability/ai-events.ts","../src/observability/guardrail.registry.ts","../src/agent/orchestration/agent-registry.ts","../src/agent/orchestration/agent-tool.ts","../src/approval/approval-gate.interface.ts","../src/tools/tool.registry.ts","../src/core/ai.service.ts","../src/messages/message.types.ts","../src/prompts/prompt.types.ts","../src/prompts/prompt-registry.service.ts","../src/usage/pricing.ts","../src/usage/usage-tracker.service.ts","../src/embeddings/embeddings.service.ts","../src/memory/semantic/semantic-memory.service.ts","../src/agent/agent-executor.service.ts","../src/memory/in-memory-conversation.store.ts","../src/multimodal/image.service.ts","../src/multimodal/speech.service.ts","../src/multimodal/transcription.service.ts","../src/rag/rag.service.ts","../src/rag/in-memory-vector-store.ts","../src/mcp/mcp.service.ts","../src/observability/guardrail.decorator.ts","../src/usage/budget.guardrail.ts","../src/ratelimit/rate-limiter.interface.ts","../src/ratelimit/rate-limit.guardrail.ts","../src/rag/rerank/heuristic-reranker.ts","../src/evals/eval-runner.service.ts","../src/ai.module.ts","../src/tools/tool.decorator.ts","../src/agent/agent.decorator.ts","../src/agent/ai-agent.base.ts","../src/rag/retrieval-tool.ts","../src/memory/adapters/prisma/prisma-conversation.store.ts","../src/cache/in-memory-ai-cache.ts","../src/approval/approval-gates.ts","../src/http/stream-response.ts","../src/http/agent-stream.interceptor.ts","../src/jobs/agent-queue.service.ts","../src/jobs/agent-job.processor.ts","../src/jobs/agent-jobs.module.ts","../src/rag/adapters/pgvector/pgvector-store.ts","../src/ratelimit/in-memory-rate-limiter.ts","../src/safety/pii-redaction.guardrail.ts","../src/safety/moderation.guardrail.ts","../src/rag/rerank/model-reranker.ts","../src/rag/adapters/qdrant/qdrant-vector-store.ts","../src/rag/adapters/pinecone/pinecone-vector-store.ts","../src/websocket/stream-to-socket.ts"],"names":["AI_MODULE_OPTIONS","CONVERSATION_STORE","VECTOR_STORE","AI_CACHE","APPROVAL_GATE","AGENT_QUEUE","RATE_LIMITER","RERANKER","TOOL_METADATA","AGENT_METADATA","GUARDRAIL_METADATA","DEFAULT_MAX_STEPS","createFallbackModel","models","options","length","Error","primary","shouldRetry","attempt","call","lastError","i","error","isLast","specificationVersion","provider","modelId","supportedUrls","doGenerate","callOptions","model","doStream","createCacheMiddleware","cache","wrapGenerate","params","key","cacheKey","cached","get","undefined","result","set","ttlMs","stableStringify","value","JSON","stringify","_key","val","Array","isArray","Object","keys","sort","reduce","acc","k","ProviderRegistry","providers","Map","applyCache","wrapLanguageModel","middleware","cacheTtlMs","onModuleInit","configured","name","config","initProvider","getLanguageModel","chain","defaultModel","resolved","map","m","resolveSingle","resolve","languageModel","getEmbeddingModel","defaultEmbeddingModel","textEmbeddingModel","getImageModel","resolveMultimodal","defaultImageModel","getRerankingModel","rerankingModel","getSpeechModel","defaultSpeechModel","getTranscriptionModel","defaultTranscriptionModel","fallback","methods","capability","method","fn","raw","parseProviderName","parseModelId","sep","indexOf","slice","size","next","def","includes","settings","apiKey","baseURL","headers","createOpenAI","createAnthropic","createGoogleGenerativeAI","test","message","EVENT_EMITTER","AiEventEmitter","emitter","emit","event","payload","enabled","AI_EVENTS","agentRunStart","agentRunFinish","agentRunError","toolCall","toolResult","streamFinish","usage","GuardrailRegistry","guardrails","discovery","wrapper","getProviders","instance","ctor","Reflect","getMetadata","push","count","runBeforeRun","ctx","guardrail","beforeRun","runAfterRun","afterRun","runOnToolCall","tool","args","onToolCall","AgentRegistry","agents","target","getByClass","all","values","createAgentTool","agent","schema","inputSchema","z","object","input","string","describe","description","execute","run","text","ToolApprovalDeniedError","ToolRegistry","tools","scanner","reflector","events","approvalGate","agentRegistry","prototype","getPrototypeOf","methodName","getAllMethodNames","methodRef","metadata","register","has","built","opts","requiresApproval","approved","requestApproval","getByName","getForClass","filter","entry","getAll","buildToolSet","refs","entries","flatMap","ref","resolveRef","agentEntry","resolveAgentRef","AiService","toolRegistry","generateText","streamText","generateObject","streamObject","rest","toMessages","role","content","PLACEHOLDER","interpolate","template","vars","replace","_match","String","DEFAULT_VERSION","PromptRegistry","prompts","latest","definition","versions","versionKey","version","registerAll","definitions","render","DEFAULT_PRICING","output","bareModelId","costOf","pricing","price","inputTokens","outputTokens","GLOBAL","empty","cost","runs","UsageTracker","totalsByScope","record","scope","conversationId","Boolean","totals","reset","delete","clear","EmbeddingsService","embed","hit","abortSignal","maxRetries","embedMany","SemanticMemory","embeddings","store","ai","remember","embedding","upsert","id","hash","kind","recall","query","topK","rememberConversation","summarize","messagesToText","prompt","p","join","h","charCodeAt","toString","AgentExecutorService","usageTracker","semanticMemory","meta","readMetadata","agentName","system","resolveSystemWithRecall","maxSteps","resolveMaxSteps","newMessages","history","loadHistory","messages","runObject","runText","temperature","experimental_telemetry","telemetry","persist","finishReason","stopWhen","stepCountIs","response","steps","toolCalls","totalUsage","stream","resolveSystem","onFinish","snippets","context","s","systemPrompt","t","isEnabled","functionId","defaultMaxSteps","load","userMessages","responseMessages","append","InMemoryConversationStore","conversations","existing","ImageService","generate","generateImage","SpeechService","generateSpeech","TranscriptionService","transcribe","audio","RagService","defaultReranker","ingest","items","chunkSize","overlap","chunkOverlap","chunks","forEach","item","index","baseId","splitText","chunkIndex","c","documents","chunk","retrieve","reranker","rerank","fetchK","results","step","Math","max","start","InMemoryVectorStore","doc","scored","matchesFilter","score","cosineSimilarity","a","b","ids","every","McpService","clients","toolSets","connect","client","listTools","info","dynamicTool","jsonSchema","callTool","arguments","extractText","getToolSet","getAllTools","assign","onModuleDestroy","closeAll","close","part","type","Guardrail","defineMetadata","Injectable","BudgetExceededError","spent","limit","toFixed","BudgetGuard","maxCostPerConversation","RateLimitedError","RateLimitGuardrail","limiter","allowed","consume","HeuristicReranker","topN","weight","overlapWeight","terms","tokenize","Set","toLowerCase","split","contentTerms","hits","term","EvalRunner","cases","judge","defaultJudge","passThreshold","evalCase","case","averageScore","sum","r","passRate","passed","threshold","expected","reasoning","createLlmJudge","scale","number","rubric","normalized","min","AI_INITIALIZER","AiModule","forRoot","build","provide","useValue","forRootAsync","useFactory","inject","imports","forFeature","feature","registry","module","exports","optionsProvider","extraImports","DiscoveryModule","storeProvider","conversationStore","vectorStoreProvider","vectorStore","eventEmitterProvider","tokenProvider","rateLimiter","guardrailClasses","coreProviders","initializerProvider","exportedTokens","token","useClass","moduleRef","mod","EventEmitter2","strict","ModuleRef","Tool","propertyKey","descriptor","Agent","AiAgent","executor","createRetrievalTool","rag","PrismaConversationStore","delegate","rows","findMany","where","orderBy","position","row","base","create","data","deleteMany","InMemoryAiCache","expiresAt","Date","now","AutoApproveGate","_context","DenyApproveGate","pipeAgentStream","res","protocol","pipeTextStreamToResponse","pipeUIMessageStreamToResponse","AgentStreamInterceptor","intercept","switchToHttp","getResponse","handle","pipe","mergeMap","EMPTY","AGENT_JOB_NAME","AgentQueueService","queue","enqueue","jobOptions","job","add","AgentJobProcessor","AGENT_JOBS_OPTIONS","DEFAULT_QUEUE","loadBullMq","specifier","AgentWorkerManager","worker","processor","runWorker","Worker","queueName","connection","AgentJobsModule","Queue","PgVectorStore","table","pool","toVectorLiteral","vector","limitParam","Number","InMemoryRateLimiter","buckets","bucket","tokens","capacity","last","elapsed","refill","intervalMs","refillTokens","DEFAULT_PII_PATTERNS","redactPii","patterns","replacement","out","pattern","redactMessages","PiiRedactionGuardrail","createPiiRedactionGuardrail","ConfiguredPiiRedaction","ContentBlockedError","reason","messagesText","createModerationGuardrail","blocked","moderate","ConfiguredModeration","lower","find","ModelReranker","ranking","originalIndex","QdrantVectorStore","collection","wait","points","search","with_payload","buildFilter","must","match","PineconeVectorStore","matches","includeMetadata","deleteAll","streamAgentToSocket","socket","chunkEvent","doneEvent","errorEvent","delta","textStream"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Dependency-injection tokens used across the module.\n */\nexport const AI_MODULE_OPTIONS = Symbol('AI_MODULE_OPTIONS');\nexport const CONVERSATION_STORE = Symbol('CONVERSATION_STORE');\nexport const VECTOR_STORE = Symbol('VECTOR_STORE');\nexport const AI_CACHE = Symbol('AI_CACHE');\nexport const APPROVAL_GATE = Symbol('APPROVAL_GATE');\nexport const AGENT_QUEUE = Symbol('AGENT_QUEUE');\nexport const RATE_LIMITER = Symbol('RATE_LIMITER');\nexport const RERANKER = Symbol('RERANKER');\n\n/**\n * Reflect metadata keys for the `@Tool` and `@Agent` decorators.\n */\nexport const TOOL_METADATA = Symbol('nestjs-ai:tool');\nexport const AGENT_METADATA = Symbol('nestjs-ai:agent');\nexport const GUARDRAIL_METADATA = Symbol('nestjs-ai:guardrail');\n\n/**\n * Default number of tool-calling steps allowed before an agent run stops.\n */\nexport const DEFAULT_MAX_STEPS = 5;\n","import type { LanguageModelV3 } from '@ai-sdk/provider';\n\nexport interface FallbackOptions {\n /**\n * Decide whether an error from a model should trigger a fallback to the next\n * one. Defaults to always retrying on the next model.\n */\n shouldRetry?: (error: unknown) => boolean;\n /** Provider name reported by the composite model. */\n provider?: string;\n}\n\n/**\n * Composes several language models into one that tries each in order, falling\n * back to the next when a model throws (subject to `shouldRetry`). Fallback\n * applies to the initial `doGenerate` / `doStream` call; once a stream starts it\n * is not switched mid-flight.\n *\n * @example\n * ```ts\n * const model = createFallbackModel([\n * registry.getLanguageModel('openai:gpt-4o'),\n * registry.getLanguageModel('anthropic:claude-sonnet-5'),\n * ]);\n * ```\n */\nexport function createFallbackModel(\n models: LanguageModelV3[],\n options: FallbackOptions = {},\n): LanguageModelV3 {\n if (models.length === 0) {\n throw new Error('createFallbackModel requires at least one model.');\n }\n const primary = models[0];\n const shouldRetry = options.shouldRetry ?? (() => true);\n\n async function attempt<T>(\n call: (model: LanguageModelV3) => PromiseLike<T>,\n ): Promise<T> {\n let lastError: unknown;\n for (let i = 0; i < models.length; i++) {\n try {\n return await call(models[i]);\n } catch (error) {\n lastError = error;\n const isLast = i === models.length - 1;\n if (isLast || !shouldRetry(error)) {\n throw error;\n }\n }\n }\n throw lastError;\n }\n\n return {\n specificationVersion: 'v3',\n provider: options.provider ?? `fallback(${primary.provider})`,\n modelId: primary.modelId,\n get supportedUrls() {\n return primary.supportedUrls;\n },\n doGenerate: (callOptions) =>\n attempt((model) => model.doGenerate(callOptions)),\n doStream: (callOptions) => attempt((model) => model.doStream(callOptions)),\n };\n}\n","import type { LanguageModelMiddleware } from 'ai';\nimport type { AiCache } from './ai-cache.interface.js';\n\nexport interface CacheMiddlewareOptions {\n /** Time-to-live for cached generations, in milliseconds (default: no expiry). */\n ttlMs?: number;\n}\n\n/**\n * Language-model middleware that caches non-streaming generations in an\n * {@link AiCache}, keyed by the model id and call parameters. Wrap a model with\n * `wrapLanguageModel({ model, middleware: createCacheMiddleware(cache) })`.\n */\nexport function createCacheMiddleware(\n cache: AiCache,\n options: CacheMiddlewareOptions = {},\n): LanguageModelMiddleware {\n return {\n async wrapGenerate({ doGenerate, params, model }) {\n const key = cacheKey(model.modelId, params);\n const cached = await cache.get(key);\n if (cached !== undefined) {\n return cached as Awaited<ReturnType<typeof doGenerate>>;\n }\n const result = await doGenerate();\n await cache.set(key, result, options.ttlMs);\n return result;\n },\n };\n}\n\n/** Builds a stable cache key from the model id and call parameters. */\nexport function cacheKey(modelId: string, params: unknown): string {\n return `${modelId}:${stableStringify(params)}`;\n}\n\n/** JSON stringify with sorted object keys for deterministic keys. */\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(value, (_key, val) => {\n if (val && typeof val === 'object' && !Array.isArray(val)) {\n return Object.keys(val)\n .sort()\n .reduce<Record<string, unknown>>((acc, k) => {\n acc[k] = (val as Record<string, unknown>)[k];\n return acc;\n }, {});\n }\n return val;\n });\n}\n","import { Inject, Injectable, Optional, type OnModuleInit } from '@nestjs/common';\nimport {\n wrapLanguageModel,\n type EmbeddingModel,\n type ImageModel,\n type LanguageModel,\n type RerankingModel,\n type SpeechModel,\n type TranscriptionModel,\n} from 'ai';\nimport type { LanguageModelV3 } from '@ai-sdk/provider';\nimport { AI_CACHE, AI_MODULE_OPTIONS } from '../ai.constants.js';\nimport { createFallbackModel } from '../resilience/fallback-model.js';\nimport { createCacheMiddleware } from '../cache/cache-middleware.js';\nimport type { AiCache } from '../cache/ai-cache.interface.js';\nimport type {\n AiModuleOptions,\n ProviderConfig,\n} from '../interfaces/ai-module-options.interface.js';\n\ntype ProviderName = 'openai' | 'anthropic' | 'google';\n\n/**\n * Minimal shape shared by every `@ai-sdk/*` provider instance we support.\n */\ninterface AiSdkProvider {\n languageModel(modelId: string): LanguageModel;\n textEmbeddingModel?(modelId: string): EmbeddingModel;\n // ProviderV2 standard multimodal methods.\n imageModel?(modelId: string): ImageModel;\n speechModel?(modelId: string): SpeechModel;\n transcriptionModel?(modelId: string): TranscriptionModel;\n rerankingModel?(modelId: string): RerankingModel;\n // Shorthands exposed by some concrete providers (e.g. openai).\n image?(modelId: string): ImageModel;\n speech?(modelId: string): SpeechModel;\n transcription?(modelId: string): TranscriptionModel;\n reranking?(modelId: string): RerankingModel;\n}\n\n/**\n * Instantiates and caches the configured `@ai-sdk/*` providers, and resolves\n * `\"provider:model\"` strings into concrete language / embedding models.\n *\n * Provider packages are imported lazily on module init so only the SDKs a\n * project actually configures need to be installed.\n */\n@Injectable()\nexport class ProviderRegistry implements OnModuleInit {\n private readonly providers = new Map<ProviderName, AiSdkProvider>();\n\n constructor(\n @Inject(AI_MODULE_OPTIONS) private readonly options: AiModuleOptions,\n @Optional() @Inject(AI_CACHE) private readonly cache?: AiCache,\n ) {}\n\n /** Wraps a model with the cache middleware when a cache is configured. */\n private applyCache(model: LanguageModel): LanguageModel {\n if (!this.cache || typeof model === 'string') {\n return model;\n }\n return wrapLanguageModel({\n model: model as LanguageModelV3,\n middleware: createCacheMiddleware(this.cache, {\n ttlMs: this.options.cacheTtlMs,\n }),\n });\n }\n\n async onModuleInit(): Promise<void> {\n const configured = this.options.providers ?? {};\n for (const name of Object.keys(configured) as ProviderName[]) {\n const config = configured[name];\n if (config) {\n await this.initProvider(name, config);\n }\n }\n }\n\n /**\n * Resolves a language model. Accepts a `LanguageModel` instance (returned\n * as-is), a `\"provider:model\"` string, a bare `\"model\"` string (using the\n * default provider), or `undefined` (using `defaultModel`).\n */\n getLanguageModel(\n model?: string | LanguageModel | Array<string | LanguageModel>,\n ): LanguageModel {\n // Array => fallback chain (try each in order).\n const chain = model ?? this.options.defaultModel;\n if (Array.isArray(chain)) {\n if (chain.length === 0) {\n throw new Error('An empty model array was provided.');\n }\n if (chain.length === 1) {\n return this.getLanguageModel(chain[0]);\n }\n const resolved = chain.map((m) =>\n this.resolveSingle(m),\n ) as LanguageModelV3[];\n return this.applyCache(createFallbackModel(resolved));\n }\n return this.applyCache(this.resolveSingle(chain));\n }\n\n /** Resolves a single (non-array) model reference without cache wrapping. */\n private resolveSingle(model?: string | LanguageModel): LanguageModel {\n if (model && typeof model !== 'string') {\n return model;\n }\n const { provider, modelId } = this.resolve(model, undefined);\n return provider.languageModel(modelId);\n }\n\n /**\n * Resolves an embedding model from a `\"provider:model\"` string, a bare model\n * string, an `EmbeddingModel` instance, or `undefined` (using\n * `defaultEmbeddingModel`).\n */\n getEmbeddingModel(\n model?: string | EmbeddingModel,\n ): EmbeddingModel {\n if (model && typeof model !== 'string') {\n return model;\n }\n const { name, provider, modelId } = this.resolve(\n model,\n this.options.defaultEmbeddingModel,\n );\n if (typeof provider.textEmbeddingModel !== 'function') {\n throw new Error(\n `Provider \"${name}\" does not support embeddings. Configure a provider ` +\n `with embedding support (e.g. openai or google).`,\n );\n }\n return provider.textEmbeddingModel(modelId);\n }\n\n /** Resolves an image-generation model (default `defaultImageModel`). */\n getImageModel(model?: string | ImageModel): ImageModel {\n if (model && typeof model !== 'string') {\n return model;\n }\n return this.resolveMultimodal<ImageModel>(\n model,\n this.options.defaultImageModel,\n ['imageModel', 'image'],\n 'image generation',\n );\n }\n\n /** Resolves a reranking model (default `rerankingModel` option). */\n getRerankingModel(model?: string | RerankingModel): RerankingModel {\n if (model && typeof model !== 'string') {\n return model;\n }\n return this.resolveMultimodal<RerankingModel>(\n model,\n this.options.rerankingModel,\n ['rerankingModel', 'reranking'],\n 'reranking',\n );\n }\n\n /** Resolves a speech (text-to-speech) model (default `defaultSpeechModel`). */\n getSpeechModel(model?: string | SpeechModel): SpeechModel {\n if (model && typeof model !== 'string') {\n return model;\n }\n return this.resolveMultimodal<SpeechModel>(\n model,\n this.options.defaultSpeechModel,\n ['speechModel', 'speech'],\n 'speech',\n );\n }\n\n /** Resolves a transcription (speech-to-text) model. */\n getTranscriptionModel(\n model?: string | TranscriptionModel,\n ): TranscriptionModel {\n if (model && typeof model !== 'string') {\n return model;\n }\n return this.resolveMultimodal<TranscriptionModel>(\n model,\n this.options.defaultTranscriptionModel,\n ['transcriptionModel', 'transcription'],\n 'transcription',\n );\n }\n\n /**\n * Shared resolution for multimodal models: resolves the provider, then calls\n * the first available factory method (standard name, then shorthand).\n */\n private resolveMultimodal<T>(\n model: string | undefined,\n fallback: string | undefined,\n methods: Array<keyof AiSdkProvider>,\n capability: string,\n ): T {\n const { name, provider, modelId } = this.resolve(model, fallback);\n for (const method of methods) {\n const fn = provider[method];\n if (typeof fn === 'function') {\n return (fn as (id: string) => T).call(provider, modelId);\n }\n }\n throw new Error(\n `Provider \"${name}\" does not support ${capability}. Configure a provider ` +\n `that does (e.g. openai).`,\n );\n }\n\n private resolve(\n model: string | undefined,\n fallback: string | undefined,\n ): { name: ProviderName; provider: AiSdkProvider; modelId: string } {\n const raw = model ?? fallback;\n if (!raw) {\n throw new Error(\n 'No model specified and no default model configured. Pass a model id ' +\n 'or set `defaultModel` in AiModule options.',\n );\n }\n\n const name = this.parseProviderName(raw);\n const modelId = this.parseModelId(raw);\n const provider = this.providers.get(name);\n if (!provider) {\n throw new Error(\n `Provider \"${name}\" is not configured. Add it to AiModule ` +\n `\\`providers\\` options and install \\`@ai-sdk/${name}\\`.`,\n );\n }\n return { name, provider, modelId };\n }\n\n private parseProviderName(raw: string): ProviderName {\n const sep = raw.indexOf(':');\n if (sep !== -1) {\n return raw.slice(0, sep) as ProviderName;\n }\n // Bare model id: use the sole configured provider, else the default\n // model's provider prefix.\n if (this.providers.size === 1) {\n return this.providers.keys().next().value as ProviderName;\n }\n const def = this.options.defaultModel;\n if (def && def.includes(':')) {\n return def.slice(0, def.indexOf(':')) as ProviderName;\n }\n throw new Error(\n `Cannot infer provider for model \"${raw}\". Prefix it as ` +\n `\"provider:model\" (e.g. \"openai:${raw}\").`,\n );\n }\n\n private parseModelId(raw: string): string {\n const sep = raw.indexOf(':');\n return sep !== -1 ? raw.slice(sep + 1) : raw;\n }\n\n private async initProvider(\n name: ProviderName,\n config: ProviderConfig,\n ): Promise<void> {\n const settings = {\n apiKey: config.apiKey,\n baseURL: config.baseURL,\n headers: config.headers,\n };\n try {\n switch (name) {\n case 'openai': {\n const { createOpenAI } = await import('@ai-sdk/openai');\n this.providers.set(name, createOpenAI(settings) as AiSdkProvider);\n break;\n }\n case 'anthropic': {\n const { createAnthropic } = await import('@ai-sdk/anthropic');\n this.providers.set(name, createAnthropic(settings) as AiSdkProvider);\n break;\n }\n case 'google': {\n const { createGoogleGenerativeAI } = await import('@ai-sdk/google');\n this.providers.set(\n name,\n createGoogleGenerativeAI(settings) as AiSdkProvider,\n );\n break;\n }\n default: {\n throw new Error(`Unknown provider \"${name}\".`);\n }\n }\n } catch (error) {\n if (error instanceof Error && /Cannot find|find module/i.test(error.message)) {\n throw new Error(\n `Provider \"${name}\" is configured but the package \"@ai-sdk/${name}\" ` +\n `is not installed. Run \\`npm install @ai-sdk/${name}\\`.`,\n );\n }\n throw error;\n }\n }\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\n\n/** Minimal shape of `EventEmitter2` from `@nestjs/event-emitter`. */\nexport interface EventEmitterLike {\n emit(event: string, payload: unknown): boolean;\n}\n\n/** Injection token for an optional event emitter (EventEmitter2). */\nexport const EVENT_EMITTER = Symbol('AI_EVENT_EMITTER');\n\n/**\n * Emits library events through `@nestjs/event-emitter`'s `EventEmitter2` when\n * it is available, and is a no-op otherwise. This keeps `@nestjs/event-emitter`\n * a truly optional peer dependency.\n */\n@Injectable()\nexport class AiEventEmitter {\n constructor(\n @Optional()\n @Inject(EVENT_EMITTER)\n private readonly emitter?: EventEmitterLike | undefined,\n ) {}\n\n emit(event: string, payload: unknown): void {\n this.emitter?.emit(event, payload);\n }\n\n /** Whether an underlying emitter is wired up. */\n get enabled(): boolean {\n return this.emitter != null;\n }\n}\n","import type { AgentResult, AgentRunOptions } from '../agent/agent.interface.js';\n\n/** Event names emitted by the library (namespaced for `@OnEvent`). */\nexport const AI_EVENTS = {\n agentRunStart: 'ai.agent.run.start',\n agentRunFinish: 'ai.agent.run.finish',\n agentRunError: 'ai.agent.run.error',\n toolCall: 'ai.tool.call',\n toolResult: 'ai.tool.result',\n streamFinish: 'ai.stream.finish',\n usage: 'ai.usage',\n} as const;\n\nexport interface AgentRunStartPayload {\n agent: string;\n input: unknown;\n options: AgentRunOptions;\n}\n\nexport interface AgentRunFinishPayload {\n agent: string;\n result: AgentResult;\n}\n\nexport interface AgentRunErrorPayload {\n agent: string;\n error: unknown;\n}\n\nexport interface ToolCallPayload {\n tool: string;\n args: unknown;\n}\n\nexport interface ToolResultPayload {\n tool: string;\n args: unknown;\n result: unknown;\n}\n","import { Injectable, type OnModuleInit } from '@nestjs/common';\nimport { DiscoveryService } from '@nestjs/core';\nimport { GUARDRAIL_METADATA } from '../ai.constants.js';\nimport type { AgentResult } from '../agent/agent.interface.js';\nimport type {\n Guardrail,\n GuardrailContext,\n} from './guardrail.interface.js';\n\n/**\n * Collects all `@Guardrail`-decorated providers and runs their hooks in\n * registration order around agent execution.\n */\n@Injectable()\nexport class GuardrailRegistry implements OnModuleInit {\n private readonly guardrails: Guardrail[] = [];\n\n constructor(private readonly discovery: DiscoveryService) {}\n\n onModuleInit(): void {\n for (const wrapper of this.discovery.getProviders()) {\n const instance = wrapper.instance as Guardrail | undefined;\n const ctor = instance?.constructor;\n if (\n instance &&\n ctor &&\n Reflect.getMetadata(GUARDRAIL_METADATA, ctor) === true\n ) {\n this.guardrails.push(instance);\n }\n }\n }\n\n get count(): number {\n return this.guardrails.length;\n }\n\n async runBeforeRun(ctx: GuardrailContext): Promise<void> {\n for (const guardrail of this.guardrails) {\n await guardrail.beforeRun?.(ctx);\n }\n }\n\n async runAfterRun(\n ctx: GuardrailContext,\n result: AgentResult,\n ): Promise<void> {\n for (const guardrail of this.guardrails) {\n await guardrail.afterRun?.(ctx, result);\n }\n }\n\n async runOnToolCall(tool: string, args: unknown): Promise<void> {\n for (const guardrail of this.guardrails) {\n await guardrail.onToolCall?.(tool, args);\n }\n }\n}\n","import { Injectable, type OnModuleInit, type Type } from '@nestjs/common';\nimport { DiscoveryService } from '@nestjs/core';\nimport { AGENT_METADATA } from '../../ai.constants.js';\n\n/** A discovered agent instance and its class. */\nexport interface AgentEntry {\n name: string;\n instance: any;\n target: Type<any>;\n}\n\n/**\n * Indexes every `@Agent`-decorated provider by class name, enabling\n * multi-agent orchestration (supervisor/handoff) and background-job resolution.\n */\n@Injectable()\nexport class AgentRegistry implements OnModuleInit {\n private readonly agents = new Map<string, AgentEntry>();\n\n constructor(private readonly discovery: DiscoveryService) {}\n\n onModuleInit(): void {\n for (const wrapper of this.discovery.getProviders()) {\n const instance = wrapper.instance;\n const ctor = instance?.constructor as Type<any> | undefined;\n if (instance && ctor && Reflect.getMetadata(AGENT_METADATA, ctor)) {\n this.agents.set(ctor.name, { name: ctor.name, instance, target: ctor });\n }\n }\n }\n\n /** Returns an agent instance by class name. */\n get(name: string): any | undefined {\n return this.agents.get(name)?.instance;\n }\n\n /** Returns an agent instance by its class. */\n getByClass(target: Type<any>): any | undefined {\n return this.agents.get(target.name)?.instance;\n }\n\n /** All discovered agents. */\n all(): AgentEntry[] {\n return [...this.agents.values()];\n }\n}\n","import { tool, type Tool as AiTool } from 'ai';\nimport { z, type ZodType } from 'zod';\nimport type { AiAgent } from '../ai-agent.base.js';\n\nexport interface AgentToolOptions {\n /** Tool name exposed to the calling model (default: the agent class name). */\n name?: string;\n /** Description guiding when to delegate to this agent. */\n description?: string;\n /**\n * Input schema. Defaults to `{ input: string }`; the `input` field is passed\n * to the sub-agent's `.run()`.\n */\n inputSchema?: ZodType<any, any, any>;\n}\n\n/**\n * Wraps an agent as a tool so another agent can delegate to it (supervisor /\n * handoff patterns). The wrapped agent's `.run()` output text is returned to the\n * caller.\n *\n * @example\n * ```ts\n * @Agent({ model: 'openai:gpt-4o', system: 'Supervisor', tools: [ResearchAgent] })\n * class SupervisorAgent extends AiAgent {}\n * ```\n */\nexport function createAgentTool(\n agent: Pick<AiAgent, 'run'>,\n options: AgentToolOptions = {},\n): AiTool<any, string> {\n const schema =\n options.inputSchema ??\n z.object({\n input: z.string().describe('The task or question for the agent'),\n });\n\n return tool({\n description:\n options.description ??\n `Delegate the task to the ${options.name ?? 'sub'} agent.`,\n inputSchema: schema,\n execute: async (args: unknown) => {\n const input =\n typeof args === 'string'\n ? args\n : ((args as { input?: string })?.input ?? JSON.stringify(args));\n const result = await agent.run(input);\n return result.text;\n },\n });\n}\n","/** Context passed to an approval gate for a tool call awaiting approval. */\nexport interface ApprovalContext {\n tool: string;\n args: unknown;\n /** Name of the agent making the call, when available. */\n agent?: string;\n}\n\n/**\n * Decides whether a tool flagged `requiresApproval` may execute. Implement this\n * to plug in human-in-the-loop approval (e.g. block on a queue, check a policy)\n * and register it via `AiModule.forRoot({ approvalGate })`.\n */\nexport interface ApprovalGate {\n /** Resolve `true` to allow the tool call, `false` to block it. */\n requestApproval(context: ApprovalContext): Promise<boolean>;\n}\n\n/** Thrown when an approval gate denies a tool call. */\nexport class ToolApprovalDeniedError extends Error {\n constructor(public readonly tool: string) {\n super(`Tool \"${tool}\" was denied by the approval gate.`);\n this.name = 'ToolApprovalDeniedError';\n }\n}\n","import {\n Injectable,\n Optional,\n type OnModuleInit,\n type Type,\n} from '@nestjs/common';\nimport { Inject } from '@nestjs/common';\nimport { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core';\nimport { tool, type Tool as AiTool, type ToolSet } from 'ai';\nimport { AGENT_METADATA, APPROVAL_GATE, TOOL_METADATA } from '../ai.constants.js';\nimport { AiEventEmitter } from '../observability/ai-event-emitter.js';\nimport { AI_EVENTS } from '../observability/ai-events.js';\nimport { GuardrailRegistry } from '../observability/guardrail.registry.js';\nimport { AgentRegistry } from '../agent/orchestration/agent-registry.js';\nimport { createAgentTool } from '../agent/orchestration/agent-tool.js';\nimport {\n type ApprovalGate,\n ToolApprovalDeniedError,\n} from '../approval/approval-gate.interface.js';\nimport type { ToolMetadata } from './tool.metadata.js';\n\n/** A discovered tool together with the class that declared it. */\nexport interface ToolEntry {\n name: string;\n tool: AiTool<any, any>;\n target: Type<any>;\n}\n\n/** A tool reference accepted by `buildToolSet`: a provider class or a name. */\nexport type ToolRef = Type<any> | string;\n\n/**\n * Discovers every `@Tool`-decorated method across the application's providers\n * and wraps each into a Vercel AI SDK `tool()` whose `execute` calls the method\n * on its DI-managed instance (preserving `this` and injected dependencies).\n */\n@Injectable()\nexport class ToolRegistry implements OnModuleInit {\n private readonly tools = new Map<string, ToolEntry>();\n\n constructor(\n private readonly discovery: DiscoveryService,\n private readonly scanner: MetadataScanner,\n private readonly reflector: Reflector,\n @Optional() private readonly events?: AiEventEmitter,\n @Optional() private readonly guardrails?: GuardrailRegistry,\n @Optional() @Inject(APPROVAL_GATE) private readonly approvalGate?: ApprovalGate,\n @Optional() private readonly agentRegistry?: AgentRegistry,\n ) {}\n\n onModuleInit(): void {\n for (const wrapper of this.discovery.getProviders()) {\n const instance = wrapper.instance;\n if (!instance || typeof instance !== 'object') {\n continue;\n }\n const prototype = Object.getPrototypeOf(instance);\n if (!prototype) {\n continue;\n }\n for (const methodName of this.scanner.getAllMethodNames(prototype)) {\n const methodRef = instance[methodName];\n const metadata = this.reflector.get<ToolMetadata | undefined>(\n TOOL_METADATA,\n methodRef,\n );\n if (!metadata) {\n continue;\n }\n this.register(instance, methodName, metadata);\n }\n }\n }\n\n private register(\n instance: any,\n methodName: string,\n metadata: ToolMetadata,\n ): void {\n const name = metadata.name ?? methodName;\n if (this.tools.has(name)) {\n throw new Error(\n `Duplicate AI tool name \"${name}\". Tool names must be unique across ` +\n `all providers (declared on ${instance.constructor?.name}).`,\n );\n }\n const built = tool({\n description: metadata.description,\n inputSchema: metadata.schema,\n execute: async (args: unknown, opts: unknown) => {\n if (metadata.requiresApproval && this.approvalGate) {\n const approved = await this.approvalGate.requestApproval({\n tool: name,\n args,\n });\n if (!approved) {\n throw new ToolApprovalDeniedError(name);\n }\n }\n await this.guardrails?.runOnToolCall(name, args);\n this.events?.emit(AI_EVENTS.toolCall, { tool: name, args });\n const result = await instance[methodName](args, opts);\n this.events?.emit(AI_EVENTS.toolResult, { tool: name, args, result });\n return result;\n },\n });\n this.tools.set(name, {\n name,\n tool: built,\n target: instance.constructor,\n });\n }\n\n /** Returns the tool registered under `name`, if any. */\n getByName(name: string): ToolEntry | undefined {\n return this.tools.get(name);\n }\n\n /** Returns every tool declared by the given provider class. */\n getForClass(target: Type<any>): ToolEntry[] {\n return [...this.tools.values()].filter((entry) => entry.target === target);\n }\n\n /** Returns all discovered tools. */\n getAll(): ToolEntry[] {\n return [...this.tools.values()];\n }\n\n /**\n * Builds the `ToolSet` passed to `generateText`/`streamText` from a list of\n * tool references (provider classes and/or tool names). Passing no refs\n * returns every discovered tool.\n */\n buildToolSet(refs?: ToolRef[]): ToolSet {\n const entries =\n refs && refs.length > 0\n ? refs.flatMap((ref) => this.resolveRef(ref))\n : this.getAll();\n\n const set: ToolSet = {};\n for (const entry of entries) {\n set[entry.name] = entry.tool;\n }\n return set;\n }\n\n private resolveRef(ref: ToolRef): ToolEntry[] {\n if (typeof ref === 'string') {\n const entry = this.getByName(ref);\n if (!entry) {\n throw new Error(`Unknown AI tool \"${ref}\".`);\n }\n return [entry];\n }\n const entries = this.getForClass(ref);\n if (entries.length > 0) {\n return entries;\n }\n // Not a @Tool provider — maybe an @Agent class used as a sub-agent tool.\n const agentEntry = this.resolveAgentRef(ref);\n if (agentEntry) {\n return [agentEntry];\n }\n throw new Error(\n `Class \"${ref.name}\" declares no @Tool methods and is not a registered ` +\n `@Agent, or was not registered as a provider so it could be discovered.`,\n );\n }\n\n private resolveAgentRef(ref: Type<any>): ToolEntry | undefined {\n if (!this.agentRegistry || !Reflect.getMetadata(AGENT_METADATA, ref)) {\n return undefined;\n }\n const instance = this.agentRegistry.getByClass(ref);\n if (!instance) {\n return undefined;\n }\n return {\n name: ref.name,\n tool: createAgentTool(instance, { name: ref.name }),\n target: ref,\n };\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n generateObject,\n generateText,\n streamObject,\n streamText,\n} from 'ai';\nimport { ProviderRegistry } from './provider-registry.js';\nimport { ToolRegistry, type ToolRef } from '../tools/tool.registry.js';\n\n/** Replaces `model` (a resolvable id) and `tools` (tool refs) on SDK params. */\ntype NestAiParams<Fn extends (arg: any) => any> = Omit<\n Parameters<Fn>[0],\n 'model' | 'tools'\n> & {\n /** Model id string (e.g. `\"openai:gpt-4o\"`); defaults to the module model. */\n model?: string;\n /** Tool references (provider classes and/or names) to expose to the model. */\n tools?: ToolRef[];\n};\n\n/**\n * Thin, DI-friendly facade over the Vercel AI SDK generation functions for\n * callers that don't want to declare an `@Agent` class. Resolves `model`\n * strings and `tools` references, then forwards everything else unchanged.\n */\n@Injectable()\nexport class AiService {\n constructor(\n private readonly providers: ProviderRegistry,\n private readonly toolRegistry: ToolRegistry,\n ) {}\n\n generateText(\n params: NestAiParams<typeof generateText>,\n ): ReturnType<typeof generateText> {\n return generateText(this.resolve(params) as Parameters<typeof generateText>[0]);\n }\n\n streamText(\n params: NestAiParams<typeof streamText>,\n ): ReturnType<typeof streamText> {\n return streamText(this.resolve(params) as Parameters<typeof streamText>[0]);\n }\n\n generateObject(\n params: NestAiParams<typeof generateObject>,\n ): ReturnType<typeof generateObject> {\n return generateObject(this.resolve(params) as Parameters<typeof generateObject>[0]);\n }\n\n streamObject(\n params: NestAiParams<typeof streamObject>,\n ): ReturnType<typeof streamObject> {\n return streamObject(this.resolve(params) as Parameters<typeof streamObject>[0]);\n }\n\n private resolve(params: { model?: string; tools?: ToolRef[] } & Record<string, unknown>) {\n const { model, tools, ...rest } = params;\n return {\n ...rest,\n model: this.providers.getLanguageModel(model),\n ...(tools ? { tools: this.toolRegistry.buildToolSet(tools) } : {}),\n };\n }\n}\n","import type { ModelMessage } from 'ai';\n\n/**\n * A single conversation message, re-exported from the AI SDK so consumers of\n * this library never need to import `ai` types directly.\n */\nexport type AiMessage = ModelMessage;\n\n/**\n * The input accepted by agent `.run()` / `.stream()` and the raw facade: either\n * a plain user string or an explicit list of messages.\n */\nexport type AiInput = string | AiMessage[];\n\n/** Normalizes a string or message list into a message array. */\nexport function toMessages(input: AiInput): AiMessage[] {\n if (typeof input === 'string') {\n return [{ role: 'user', content: input }];\n }\n return input;\n}\n","/**\n * A named, optionally versioned prompt template.\n */\nexport interface PromptDefinition {\n /** Unique name used to look the prompt up. */\n name: string;\n /** Optional version; when omitted the latest registered version is used. */\n version?: string;\n /** Template body with `{{variable}}` placeholders. */\n template: string;\n /** Optional human-readable description. */\n description?: string;\n}\n\n/** Reference to a registered prompt for rendering. */\nexport interface PromptRef {\n name: string;\n vars?: Record<string, unknown>;\n version?: string;\n}\n\nconst PLACEHOLDER = /\\{\\{\\s*([\\w.]+)\\s*\\}\\}/g;\n\n/**\n * Replaces `{{var}}` placeholders in `template` with values from `vars`.\n * Throws if a referenced variable is missing, to catch typos early.\n */\nexport function interpolate(\n template: string,\n vars: Record<string, unknown> = {},\n): string {\n return template.replace(PLACEHOLDER, (_match, key: string) => {\n if (!(key in vars)) {\n throw new Error(`Missing variable \"${key}\" for prompt interpolation.`);\n }\n const value = vars[key];\n return value == null ? '' : String(value);\n });\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n interpolate,\n type PromptDefinition,\n} from './prompt.types.js';\n\n/** Marker for the unversioned entry of a prompt. */\nconst DEFAULT_VERSION = '__default__';\n\n/**\n * In-memory registry of named, versioned prompt templates. Register prompts via\n * `AiModule.forRoot({ prompts })`, `AiModule.forFeature({ prompts })`, or\n * imperatively, then `render(name, vars)` to produce a final string.\n */\n@Injectable()\nexport class PromptRegistry {\n /** name -> (version -> definition) */\n private readonly prompts = new Map<string, Map<string, PromptDefinition>>();\n /** name -> most recently registered version key */\n private readonly latest = new Map<string, string>();\n\n /** Registers a prompt. Throws on a duplicate (name, version). */\n register(definition: PromptDefinition): void {\n const versions =\n this.prompts.get(definition.name) ?? new Map<string, PromptDefinition>();\n const versionKey = definition.version ?? DEFAULT_VERSION;\n if (versions.has(versionKey)) {\n throw new Error(\n `Prompt \"${definition.name}\"${\n definition.version ? ` version \"${definition.version}\"` : ''\n } is already registered.`,\n );\n }\n versions.set(versionKey, definition);\n this.prompts.set(definition.name, versions);\n this.latest.set(definition.name, versionKey);\n }\n\n /** Registers many prompts. */\n registerAll(definitions: PromptDefinition[]): void {\n for (const definition of definitions) {\n this.register(definition);\n }\n }\n\n /** Returns a prompt definition (latest version when `version` omitted). */\n get(name: string, version?: string): PromptDefinition {\n const versions = this.prompts.get(name);\n if (!versions) {\n throw new Error(`Unknown prompt \"${name}\".`);\n }\n const versionKey = version ?? this.latest.get(name) ?? DEFAULT_VERSION;\n const definition = versions.get(versionKey);\n if (!definition) {\n throw new Error(`Unknown version \"${version}\" for prompt \"${name}\".`);\n }\n return definition;\n }\n\n /** Renders a prompt to a string, interpolating `{{var}}` placeholders. */\n render(\n name: string,\n vars: Record<string, unknown> = {},\n options: { version?: string } = {},\n ): string {\n return interpolate(this.get(name, options.version).template, vars);\n }\n\n /** Whether a prompt (any version) is registered. */\n has(name: string): boolean {\n return this.prompts.has(name);\n }\n}\n","/** Price per 1M tokens, in USD. */\nexport interface ModelPricing {\n input: number;\n output: number;\n}\n\n/** Maps a bare model id (no provider prefix) to its pricing. */\nexport type PricingTable = Record<string, ModelPricing>;\n\n/** Minimal usage shape needed for cost. */\nexport interface UsageLike {\n inputTokens?: number;\n outputTokens?: number;\n}\n\n/**\n * Default USD pricing per 1M tokens for common models. Override or extend via\n * `AiModule.forRoot({ pricing })`. Prices are indicative — verify against your\n * provider's current rates.\n */\nexport const DEFAULT_PRICING: PricingTable = {\n 'gpt-4o': { input: 2.5, output: 10 },\n 'gpt-4o-mini': { input: 0.15, output: 0.6 },\n 'gpt-4.1': { input: 2, output: 8 },\n 'gpt-4.1-mini': { input: 0.4, output: 1.6 },\n 'o3-mini': { input: 1.1, output: 4.4 },\n 'text-embedding-3-small': { input: 0.02, output: 0 },\n 'text-embedding-3-large': { input: 0.13, output: 0 },\n 'claude-sonnet-4': { input: 3, output: 15 },\n 'claude-opus-4': { input: 15, output: 75 },\n 'claude-haiku-4': { input: 0.8, output: 4 },\n 'gemini-2.5-pro': { input: 1.25, output: 10 },\n 'gemini-2.5-flash': { input: 0.3, output: 2.5 },\n};\n\n/** Strips a `\"provider:\"` prefix from a model id. */\nexport function bareModelId(modelId: string): string {\n const sep = modelId.indexOf(':');\n return sep === -1 ? modelId : modelId.slice(sep + 1);\n}\n\n/**\n * Computes the USD cost of a usage record for a model. Returns 0 when the model\n * is not in the pricing table.\n */\nexport function costOf(\n usage: UsageLike,\n modelId: string,\n pricing: PricingTable = DEFAULT_PRICING,\n): number {\n const price = pricing[bareModelId(modelId)] ?? pricing[modelId];\n if (!price) {\n return 0;\n }\n const input = usage.inputTokens ?? 0;\n const output = usage.outputTokens ?? 0;\n return (input / 1_000_000) * price.input + (output / 1_000_000) * price.output;\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { AI_MODULE_OPTIONS } from '../ai.constants.js';\nimport type { AiModuleOptions } from '../interfaces/ai-module-options.interface.js';\nimport { AiEventEmitter } from '../observability/ai-event-emitter.js';\nimport { AI_EVENTS } from '../observability/ai-events.js';\nimport { costOf, type UsageLike } from './pricing.js';\n\n/** Accumulated usage totals for a scope (conversation or global). */\nexport interface UsageTotals {\n inputTokens: number;\n outputTokens: number;\n cost: number;\n runs: number;\n}\n\n/** A single recorded run's usage. */\nexport interface UsageRecord extends UsageTotals {\n conversationId?: string;\n agent?: string;\n model: string;\n}\n\nconst GLOBAL = '__global__';\n\nfunction empty(): UsageTotals {\n return { inputTokens: 0, outputTokens: 0, cost: 0, runs: 0 };\n}\n\n/**\n * Tracks token usage and USD cost per conversation (and globally), and emits an\n * `ai.usage` event per recorded run.\n */\n@Injectable()\nexport class UsageTracker {\n private readonly totalsByScope = new Map<string, UsageTotals>();\n\n constructor(\n @Inject(AI_MODULE_OPTIONS) private readonly options: AiModuleOptions,\n @Optional() private readonly events?: AiEventEmitter,\n ) {}\n\n /** Records a run's usage, returns the single-run record, emits `ai.usage`. */\n record(entry: {\n model: string;\n usage: UsageLike | undefined;\n conversationId?: string;\n agent?: string;\n }): UsageRecord {\n const usage = entry.usage ?? {};\n const inputTokens = usage.inputTokens ?? 0;\n const outputTokens = usage.outputTokens ?? 0;\n const cost = costOf(usage, entry.model, this.options.pricing);\n\n for (const scope of [GLOBAL, entry.conversationId].filter(\n Boolean,\n ) as string[]) {\n const totals = this.totalsByScope.get(scope) ?? empty();\n totals.inputTokens += inputTokens;\n totals.outputTokens += outputTokens;\n totals.cost += cost;\n totals.runs += 1;\n this.totalsByScope.set(scope, totals);\n }\n\n const record: UsageRecord = {\n conversationId: entry.conversationId,\n agent: entry.agent,\n model: entry.model,\n inputTokens,\n outputTokens,\n cost,\n runs: 1,\n };\n this.events?.emit(AI_EVENTS.usage, record);\n return record;\n }\n\n /** Totals for a conversation, or global totals when no id is given. */\n totals(conversationId?: string): UsageTotals {\n return { ...(this.totalsByScope.get(conversationId ?? GLOBAL) ?? empty()) };\n }\n\n /** Clears totals for a conversation (or all when no id). */\n reset(conversationId?: string): void {\n if (conversationId) {\n this.totalsByScope.delete(conversationId);\n } else {\n this.totalsByScope.clear();\n }\n }\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { embed, embedMany } from 'ai';\nimport { AI_CACHE } from '../ai.constants.js';\nimport { ProviderRegistry } from '../core/provider-registry.js';\nimport type { AiCache } from '../cache/ai-cache.interface.js';\n\nexport interface EmbedOptions {\n /** Embedding model id, e.g. `\"openai:text-embedding-3-small\"`. */\n model?: string;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n}\n\n/**\n * Generates vector embeddings for semantic search, clustering, and similarity.\n * Wraps the Vercel AI SDK's `embed` / `embedMany`.\n */\n@Injectable()\nexport class EmbeddingsService {\n constructor(\n private readonly providers: ProviderRegistry,\n @Optional() @Inject(AI_CACHE) private readonly cache?: AiCache,\n ) {}\n\n /** Embeds a single value (cached when a cache is configured). */\n async embed(value: string, options: EmbedOptions = {}) {\n const model = this.providers.getEmbeddingModel(options.model);\n const key = `emb:${(model as { modelId?: string }).modelId ?? ''}:${value}`;\n\n if (this.cache) {\n const hit = await this.cache.get(key);\n if (hit !== undefined) {\n return hit as Awaited<ReturnType<typeof embed>>;\n }\n }\n\n const result = await embed({\n model,\n value,\n abortSignal: options.abortSignal,\n maxRetries: options.maxRetries,\n });\n\n if (this.cache) {\n await this.cache.set(key, result);\n }\n return result;\n }\n\n /** Embeds many values (the SDK batches automatically). */\n async embedMany(values: string[], options: EmbedOptions = {}) {\n return embedMany({\n model: this.providers.getEmbeddingModel(options.model),\n values,\n abortSignal: options.abortSignal,\n maxRetries: options.maxRetries,\n });\n }\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { VECTOR_STORE } from '../../ai.constants.js';\nimport { EmbeddingsService } from '../../embeddings/embeddings.service.js';\nimport { AiService } from '../../core/ai.service.js';\nimport type {\n VectorQueryResult,\n VectorStore,\n} from '../../rag/vector-store.interface.js';\nimport { type AiInput, toMessages } from '../../messages/message.types.js';\n\nexport interface RecallOptions {\n topK?: number;\n model?: string;\n}\n\n/**\n * Long-term semantic memory: stores snippets per conversation as embeddings and\n * recalls the most relevant ones for a query. Backed by the configured\n * `VectorStore` (isolated per conversation via metadata).\n */\n@Injectable()\nexport class SemanticMemory {\n constructor(\n private readonly embeddings: EmbeddingsService,\n @Inject(VECTOR_STORE) private readonly store: VectorStore,\n @Optional() private readonly ai?: AiService,\n ) {}\n\n /** Embeds and stores a snippet under a conversation. */\n async remember(\n conversationId: string,\n text: string,\n options: { model?: string; metadata?: Record<string, unknown> } = {},\n ): Promise<void> {\n const { embedding } = await this.embeddings.embed(text, {\n model: options.model,\n });\n await this.store.upsert([\n {\n id: `mem:${conversationId}:${hash(text)}`,\n content: text,\n embedding,\n metadata: { conversationId, kind: 'memory', ...options.metadata },\n },\n ]);\n }\n\n /** Returns the most relevant stored snippets for a query. */\n async recall(\n conversationId: string,\n query: string,\n options: RecallOptions = {},\n ): Promise<VectorQueryResult[]> {\n const { embedding } = await this.embeddings.embed(query, {\n model: options.model,\n });\n return this.store.query(embedding, {\n topK: options.topK ?? 4,\n filter: { conversationId, kind: 'memory' },\n });\n }\n\n /**\n * Summarizes messages with the LLM (requires `AiService`), then stores the\n * summary as a memory snippet. Returns the stored text.\n */\n async rememberConversation(\n conversationId: string,\n input: AiInput,\n options: { summarize?: boolean; model?: string } = {},\n ): Promise<string> {\n const text = options.summarize\n ? await this.summarize(input, options.model)\n : messagesToText(input);\n await this.remember(conversationId, text, { model: options.model });\n return text;\n }\n\n /** Summarizes messages into a compact string via the LLM. */\n async summarize(input: AiInput, model?: string): Promise<string> {\n if (!this.ai) {\n throw new Error('SemanticMemory.summarize requires AiService.');\n }\n const { text } = await this.ai.generateText({\n model,\n prompt: `Summarize the following conversation concisely:\\n\\n${messagesToText(input)}`,\n });\n return text;\n }\n}\n\nfunction messagesToText(input: AiInput): string {\n return toMessages(input)\n .map((m) => {\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n return `${m.role}: ${content}`;\n }\n if (Array.isArray(content)) {\n return `${m.role}: ${content\n .map((p) => (p && typeof p.text === 'string' ? p.text : ''))\n .join(' ')}`;\n }\n return '';\n })\n .join('\\n');\n}\n\n/** Small deterministic string hash (djb2) for stable snippet ids. */\nfunction hash(text: string): string {\n let h = 5381;\n for (let i = 0; i < text.length; i++) {\n h = (h * 33) ^ text.charCodeAt(i);\n }\n return (h >>> 0).toString(36);\n}\n","import 'reflect-metadata';\nimport { Inject, Injectable, Optional } from '@nestjs/common';\nimport {\n generateObject,\n generateText,\n stepCountIs,\n streamObject,\n streamText,\n} from 'ai';\nimport {\n AGENT_METADATA,\n AI_MODULE_OPTIONS,\n CONVERSATION_STORE,\n DEFAULT_MAX_STEPS,\n} from '../ai.constants.js';\nimport type { AiModuleOptions } from '../interfaces/ai-module-options.interface.js';\nimport type { ConversationStore } from '../memory/conversation-store.interface.js';\nimport { type AiInput, type AiMessage, toMessages } from '../messages/message.types.js';\nimport { ProviderRegistry } from '../core/provider-registry.js';\nimport { ToolRegistry } from '../tools/tool.registry.js';\nimport { AiEventEmitter } from '../observability/ai-event-emitter.js';\nimport { AI_EVENTS } from '../observability/ai-events.js';\nimport { GuardrailRegistry } from '../observability/guardrail.registry.js';\nimport type { GuardrailContext } from '../observability/guardrail.interface.js';\nimport { PromptRegistry } from '../prompts/prompt-registry.service.js';\nimport { UsageTracker } from '../usage/usage-tracker.service.js';\nimport { SemanticMemory } from '../memory/semantic/semantic-memory.service.js';\nimport type { AgentOptions } from './agent.metadata.js';\nimport type { AgentResult, AgentRunOptions } from './agent.interface.js';\n\n/**\n * Runtime that executes `@Agent` classes: resolves their model, tools and\n * memory, then drives the Vercel AI SDK (`generateText` / `streamText`, or the\n * object variants when a structured-output schema is present).\n */\n@Injectable()\nexport class AgentExecutorService {\n constructor(\n private readonly providers: ProviderRegistry,\n private readonly toolRegistry: ToolRegistry,\n @Inject(CONVERSATION_STORE) private readonly store: ConversationStore,\n @Inject(AI_MODULE_OPTIONS) private readonly options: AiModuleOptions,\n @Optional() private readonly events?: AiEventEmitter,\n @Optional() private readonly guardrails?: GuardrailRegistry,\n @Optional() private readonly prompts?: PromptRegistry,\n @Optional() private readonly usageTracker?: UsageTracker,\n @Optional() private readonly semanticMemory?: SemanticMemory,\n ) {}\n\n /** Runs an agent to completion and returns its result. */\n async run<T = unknown>(\n agent: object,\n input: AiInput,\n opts: AgentRunOptions = {},\n ): Promise<AgentResult<T>> {\n const meta = this.readMetadata(agent);\n const agentName = agent.constructor?.name ?? 'AiAgent';\n const model = this.providers.getLanguageModel(opts.model ?? meta.model);\n const system = await this.resolveSystemWithRecall(opts, meta, input);\n const schema = opts.schema ?? meta.output;\n const maxSteps = this.resolveMaxSteps(opts, meta);\n\n const newMessages = toMessages(input);\n const history = await this.loadHistory(opts.conversationId);\n const ctx: GuardrailContext = {\n agent: agentName,\n messages: [...history, ...newMessages],\n options: opts,\n };\n\n this.events?.emit(AI_EVENTS.agentRunStart, {\n agent: agentName,\n input,\n options: opts,\n });\n\n try {\n await this.guardrails?.runBeforeRun(ctx);\n\n const result = schema\n ? await this.runObject<T>(model, system, ctx.messages, schema, opts, newMessages)\n : await this.runText<T>(model, system, ctx.messages, meta, maxSteps, opts, newMessages);\n\n this.usageTracker?.record({\n model: (model as { modelId?: string }).modelId ?? 'unknown',\n usage: result.usage,\n conversationId: opts.conversationId,\n agent: agentName,\n });\n\n await this.guardrails?.runAfterRun(ctx, result);\n this.events?.emit(AI_EVENTS.agentRunFinish, {\n agent: agentName,\n result,\n });\n return result;\n } catch (error) {\n this.events?.emit(AI_EVENTS.agentRunError, { agent: agentName, error });\n throw error;\n }\n }\n\n private async runObject<T>(\n model: ReturnType<ProviderRegistry['getLanguageModel']>,\n system: string | undefined,\n messages: AiMessage[],\n schema: NonNullable<AgentRunOptions['schema']>,\n opts: AgentRunOptions,\n newMessages: AiMessage[],\n ): Promise<AgentResult<T>> {\n const result = await generateObject({\n model,\n system,\n messages,\n schema,\n abortSignal: opts.abortSignal,\n temperature: opts.temperature,\n maxRetries: opts.maxRetries ?? this.options.maxRetries,\n experimental_telemetry: this.telemetry(),\n });\n await this.persist(opts.conversationId, newMessages, [\n { role: 'assistant', content: JSON.stringify(result.object) },\n ]);\n return {\n text: '',\n object: result.object as T,\n usage: result.usage,\n finishReason: result.finishReason,\n messages: [],\n };\n }\n\n private async runText<T>(\n model: ReturnType<ProviderRegistry['getLanguageModel']>,\n system: string | undefined,\n messages: AiMessage[],\n meta: AgentOptions,\n maxSteps: number,\n opts: AgentRunOptions,\n newMessages: AiMessage[],\n ): Promise<AgentResult<T>> {\n const result = await generateText({\n model,\n system,\n messages,\n tools: this.toolRegistry.buildToolSet(meta.tools),\n stopWhen: stepCountIs(maxSteps),\n abortSignal: opts.abortSignal,\n temperature: opts.temperature,\n maxRetries: opts.maxRetries ?? this.options.maxRetries,\n experimental_telemetry: this.telemetry(),\n });\n await this.persist(opts.conversationId, newMessages, result.response.messages);\n return {\n text: result.text,\n steps: result.steps,\n toolCalls: result.toolCalls,\n usage: result.totalUsage,\n finishReason: result.finishReason,\n messages: result.response.messages,\n };\n }\n\n /**\n * Streams an agent's response. Returns the raw Vercel stream result so\n * controllers can pipe it to an HTTP response or iterate `textStream`.\n * Conversation persistence happens on stream finish.\n */\n stream(\n agent: object,\n input: AiInput,\n opts: AgentRunOptions = {},\n ): ReturnType<typeof streamText> | ReturnType<typeof streamObject> {\n const meta = this.readMetadata(agent);\n const agentName = agent.constructor?.name ?? 'AiAgent';\n const model = this.providers.getLanguageModel(opts.model ?? meta.model);\n const system = this.resolveSystem(opts, meta);\n const schema = opts.schema ?? meta.output;\n const maxSteps = this.resolveMaxSteps(opts, meta);\n\n const newMessages = toMessages(input);\n this.events?.emit(AI_EVENTS.agentRunStart, {\n agent: agentName,\n input,\n options: opts,\n });\n\n if (schema) {\n return streamObject({\n model,\n system,\n messages: newMessages,\n schema,\n abortSignal: opts.abortSignal,\n temperature: opts.temperature,\n experimental_telemetry: this.telemetry(),\n onFinish: async ({ object }) => {\n if (object !== undefined) {\n await this.persist(opts.conversationId, newMessages, [\n { role: 'assistant', content: JSON.stringify(object) },\n ]);\n }\n this.events?.emit(AI_EVENTS.streamFinish, { agent: agentName });\n },\n });\n }\n\n return streamText({\n model,\n system,\n messages: newMessages,\n tools: this.toolRegistry.buildToolSet(meta.tools),\n stopWhen: stepCountIs(maxSteps),\n abortSignal: opts.abortSignal,\n temperature: opts.temperature,\n maxRetries: opts.maxRetries ?? this.options.maxRetries,\n experimental_telemetry: this.telemetry(),\n onFinish: async ({ response }) => {\n await this.persist(opts.conversationId, newMessages, response.messages);\n this.events?.emit(AI_EVENTS.streamFinish, { agent: agentName });\n },\n });\n }\n\n /** Resolves the system prompt and prepends recalled memory when requested. */\n private async resolveSystemWithRecall(\n opts: AgentRunOptions,\n meta: AgentOptions,\n input: AiInput,\n ): Promise<string | undefined> {\n let system = this.resolveSystem(opts, meta);\n if (opts.recall && opts.conversationId && this.semanticMemory) {\n const query =\n opts.recall.query ?? (typeof input === 'string' ? input : '');\n if (query) {\n const snippets = await this.semanticMemory.recall(\n opts.conversationId,\n query,\n { topK: opts.recall.topK },\n );\n if (snippets.length > 0) {\n const context = snippets.map((s) => s.content).join('\\n');\n system = [system, `Relevant context from memory:\\n${context}`]\n .filter(Boolean)\n .join('\\n\\n');\n }\n }\n }\n return system;\n }\n\n private resolveSystem(\n opts: AgentRunOptions,\n meta: AgentOptions,\n ): string | undefined {\n if (opts.systemPrompt) {\n if (!this.prompts) {\n throw new Error(\n 'systemPrompt requires the PromptRegistry (AiModule must be imported).',\n );\n }\n return this.prompts.render(\n opts.systemPrompt.name,\n opts.systemPrompt.vars,\n { version: opts.systemPrompt.version },\n );\n }\n return opts.system ?? meta.system;\n }\n\n private telemetry() {\n const t = this.options.telemetry;\n if (!t?.isEnabled) {\n return undefined;\n }\n return { isEnabled: true, functionId: t.functionId };\n }\n\n private readMetadata(agent: object): AgentOptions {\n const ctor = (agent as { constructor: unknown }).constructor;\n return (\n (Reflect.getMetadata(AGENT_METADATA, ctor as object) as\n | AgentOptions\n | undefined) ?? {}\n );\n }\n\n private resolveMaxSteps(opts: AgentRunOptions, meta: AgentOptions): number {\n return (\n opts.maxSteps ??\n meta.maxSteps ??\n this.options.defaultMaxSteps ??\n DEFAULT_MAX_STEPS\n );\n }\n\n private async loadHistory(conversationId?: string) {\n if (!conversationId) {\n return [];\n }\n return this.store.load(conversationId);\n }\n\n private async persist(\n conversationId: string | undefined,\n userMessages: ReturnType<typeof toMessages>,\n responseMessages: readonly unknown[],\n ): Promise<void> {\n if (!conversationId) {\n return;\n }\n await this.store.append(conversationId, [\n ...userMessages,\n ...(responseMessages as ReturnType<typeof toMessages>),\n ]);\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport type { AiMessage } from '../messages/message.types.js';\nimport type { ConversationStore } from './conversation-store.interface.js';\n\n/**\n * Default in-process conversation store. Suitable for development, tests, and\n * single-instance deployments. History is lost on restart and not shared\n * across processes — provide a persistent implementation for production.\n */\n@Injectable()\nexport class InMemoryConversationStore implements ConversationStore {\n private readonly conversations = new Map<string, AiMessage[]>();\n\n async load(conversationId: string): Promise<AiMessage[]> {\n return [...(this.conversations.get(conversationId) ?? [])];\n }\n\n async append(conversationId: string, messages: AiMessage[]): Promise<void> {\n const existing = this.conversations.get(conversationId) ?? [];\n this.conversations.set(conversationId, [...existing, ...messages]);\n }\n\n async clear(conversationId: string): Promise<void> {\n this.conversations.delete(conversationId);\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { generateImage } from 'ai';\nimport { ProviderRegistry } from '../core/provider-registry.js';\n\nexport interface GenerateImageOptions {\n /** Image model id, e.g. `\"openai:dall-e-3\"`. Defaults to `defaultImageModel`. */\n model?: string;\n /** Number of images to generate. */\n n?: number;\n /** Size string, e.g. `\"1024x1024\"`. */\n size?: `${number}x${number}`;\n /** Aspect ratio, e.g. `\"16:9\"`. */\n aspectRatio?: `${number}:${number}`;\n seed?: number;\n providerOptions?: Record<string, Record<string, any>>;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n}\n\n/**\n * Generates images from a text prompt. Wraps the Vercel AI SDK's\n * `experimental_generateImage`. Result exposes `.image` and `.images`.\n */\n@Injectable()\nexport class ImageService {\n constructor(private readonly providers: ProviderRegistry) {}\n\n generate(prompt: string, options: GenerateImageOptions = {}) {\n const { model, ...rest } = options;\n return generateImage({\n model: this.providers.getImageModel(model),\n prompt,\n ...rest,\n });\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { experimental_generateSpeech as generateSpeech } from 'ai';\nimport { ProviderRegistry } from '../core/provider-registry.js';\n\nexport interface GenerateSpeechOptions {\n /** Speech model id, e.g. `\"openai:tts-1\"`. Defaults to `defaultSpeechModel`. */\n model?: string;\n /** Voice identifier (provider-specific). */\n voice?: string;\n /** Output audio format, e.g. `\"mp3\"`. */\n outputFormat?: string;\n /** Extra guidance for the synthesis. */\n instructions?: string;\n speed?: number;\n language?: string;\n providerOptions?: Record<string, Record<string, any>>;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n}\n\n/**\n * Synthesizes speech from text. Wraps the Vercel AI SDK's\n * `experimental_generateSpeech`. Result exposes `.audio`.\n */\n@Injectable()\nexport class SpeechService {\n constructor(private readonly providers: ProviderRegistry) {}\n\n generate(text: string, options: GenerateSpeechOptions = {}) {\n const { model, ...rest } = options;\n return generateSpeech({\n model: this.providers.getSpeechModel(model),\n text,\n ...rest,\n });\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { experimental_transcribe as transcribe } from 'ai';\nimport { ProviderRegistry } from '../core/provider-registry.js';\n\n/** Audio input accepted by the transcription service. */\nexport type AudioInput = Uint8Array | ArrayBuffer | Buffer | string | URL;\n\nexport interface TranscribeOptions {\n /** Transcription model id, e.g. `\"openai:whisper-1\"`. */\n model?: string;\n providerOptions?: Record<string, Record<string, any>>;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n}\n\n/**\n * Transcribes audio to text. Wraps the Vercel AI SDK's\n * `experimental_transcribe`. Result exposes `.text` and `.segments`.\n */\n@Injectable()\nexport class TranscriptionService {\n constructor(private readonly providers: ProviderRegistry) {}\n\n transcribe(audio: AudioInput, options: TranscribeOptions = {}) {\n const { model, ...rest } = options;\n return transcribe({\n model: this.providers.getTranscriptionModel(model),\n audio: audio as Parameters<typeof transcribe>[0]['audio'],\n ...rest,\n });\n }\n}\n","import { Inject, Injectable, Optional } from '@nestjs/common';\nimport { RERANKER, VECTOR_STORE } from '../ai.constants.js';\nimport { EmbeddingsService } from '../embeddings/embeddings.service.js';\nimport type {\n VectorDocument,\n VectorQueryResult,\n VectorStore,\n} from './vector-store.interface.js';\nimport type { Reranker } from './rerank/reranker.interface.js';\n\n/** An item to ingest into the vector store. */\nexport interface IngestItem {\n /** Base id; chunks are suffixed `#0`, `#1`, … Defaults to a positional id. */\n id?: string;\n content: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface IngestOptions {\n /** Max characters per chunk (default 1000; 0 disables chunking). */\n chunkSize?: number;\n /** Character overlap between consecutive chunks (default 100). */\n chunkOverlap?: number;\n /** Embedding model id. */\n model?: string;\n}\n\nexport interface RetrieveOptions {\n topK?: number;\n model?: string;\n filter?: Record<string, unknown>;\n /**\n * Rerank the results before truncating to `topK`. `true` uses the configured\n * default reranker; pass a `Reranker` to override. When reranking, more\n * candidates (`fetchK`) are fetched first.\n */\n rerank?: boolean | Reranker;\n /** Candidates to fetch before reranking (default `topK * 4`). */\n fetchK?: number;\n}\n\n/**\n * Retrieval-augmented generation helper: chunk + embed + store documents, and\n * embed queries to fetch the most relevant chunks.\n */\n@Injectable()\nexport class RagService {\n constructor(\n private readonly embeddings: EmbeddingsService,\n @Inject(VECTOR_STORE) private readonly store: VectorStore,\n @Optional() @Inject(RERANKER) private readonly defaultReranker?: Reranker,\n ) {}\n\n /** Chunks, embeds, and upserts items into the vector store. */\n async ingest(items: IngestItem[], options: IngestOptions = {}): Promise<void> {\n const chunkSize = options.chunkSize ?? 1000;\n const overlap = options.chunkOverlap ?? 100;\n\n const chunks: { id: string; content: string; metadata?: Record<string, unknown> }[] =\n [];\n items.forEach((item, index) => {\n const baseId = item.id ?? `doc-${index}`;\n splitText(item.content, chunkSize, overlap).forEach((text, chunkIndex) => {\n chunks.push({\n id: `${baseId}#${chunkIndex}`,\n content: text,\n metadata: item.metadata,\n });\n });\n });\n\n if (chunks.length === 0) {\n return;\n }\n\n const { embeddings } = await this.embeddings.embedMany(\n chunks.map((c) => c.content),\n { model: options.model },\n );\n\n const documents: VectorDocument[] = chunks.map((chunk, i) => ({\n ...chunk,\n embedding: embeddings[i],\n }));\n await this.store.upsert(documents);\n }\n\n /** Embeds `query` and returns the most similar stored chunks. */\n async retrieve(\n query: string,\n options: RetrieveOptions = {},\n ): Promise<VectorQueryResult[]> {\n const { embedding } = await this.embeddings.embed(query, {\n model: options.model,\n });\n const topK = options.topK ?? 4;\n\n const reranker =\n options.rerank === true\n ? this.defaultReranker\n : options.rerank || undefined;\n\n const fetchK = reranker ? (options.fetchK ?? topK * 4) : topK;\n const results = await this.store.query(embedding, {\n topK: fetchK,\n filter: options.filter,\n });\n\n if (reranker) {\n return reranker.rerank(query, results, topK);\n }\n return results.slice(0, topK);\n }\n}\n\n/** Splits text into overlapping fixed-size character chunks. */\nexport function splitText(\n text: string,\n chunkSize: number,\n overlap: number,\n): string[] {\n if (chunkSize <= 0 || text.length <= chunkSize) {\n return text.length > 0 ? [text] : [];\n }\n const step = Math.max(1, chunkSize - overlap);\n const chunks: string[] = [];\n for (let start = 0; start < text.length; start += step) {\n chunks.push(text.slice(start, start + chunkSize));\n if (start + chunkSize >= text.length) {\n break;\n }\n }\n return chunks;\n}\n","import { Injectable } from '@nestjs/common';\nimport { cosineSimilarity } from 'ai';\nimport type {\n VectorDocument,\n VectorQueryOptions,\n VectorQueryResult,\n VectorStore,\n} from './vector-store.interface.js';\n\n/**\n * In-process vector store ranking by cosine similarity. Suitable for\n * development, tests, and small datasets. Not persistent or shared across\n * processes — provide a durable `VectorStore` for production.\n */\n@Injectable()\nexport class InMemoryVectorStore implements VectorStore {\n private readonly documents = new Map<string, VectorDocument>();\n\n async upsert(documents: VectorDocument[]): Promise<void> {\n for (const doc of documents) {\n if (!doc.embedding) {\n throw new Error(\n `Document \"${doc.id}\" has no embedding. InMemoryVectorStore requires ` +\n `precomputed embeddings (use RagService.ingest).`,\n );\n }\n this.documents.set(doc.id, doc);\n }\n }\n\n async query(\n embedding: number[],\n options: VectorQueryOptions = {},\n ): Promise<VectorQueryResult[]> {\n const topK = options.topK ?? 4;\n const filter = options.filter;\n\n const scored: VectorQueryResult[] = [];\n for (const doc of this.documents.values()) {\n if (filter && !this.matchesFilter(doc, filter)) {\n continue;\n }\n scored.push({\n id: doc.id,\n content: doc.content,\n score: cosineSimilarity(embedding, doc.embedding!),\n metadata: doc.metadata,\n });\n }\n\n return scored.sort((a, b) => b.score - a.score).slice(0, topK);\n }\n\n async delete(ids: string[]): Promise<void> {\n for (const id of ids) {\n this.documents.delete(id);\n }\n }\n\n async clear(): Promise<void> {\n this.documents.clear();\n }\n\n private matchesFilter(\n doc: VectorDocument,\n filter: Record<string, unknown>,\n ): boolean {\n return Object.entries(filter).every(\n ([key, value]) => doc.metadata?.[key] === value,\n );\n }\n}\n","import { Injectable, type OnModuleDestroy } from '@nestjs/common';\nimport { dynamicTool, jsonSchema, type ToolSet } from 'ai';\n\n/** A listed MCP tool (subset of the MCP `tools/list` result we use). */\nexport interface McpToolInfo {\n name: string;\n description?: string;\n inputSchema: unknown;\n}\n\n/** Result of an MCP `tools/call` (subset). */\nexport interface McpCallResult {\n content?: Array<{ type: string; text?: string; [k: string]: unknown }>;\n isError?: boolean;\n [k: string]: unknown;\n}\n\n/**\n * Structural interface for an MCP client (e.g. `Client` from\n * `@modelcontextprotocol/sdk`). Kept structural so this library has no\n * compile-time dependency on the SDK and can be tested with a fake.\n */\nexport interface McpClientLike {\n listTools(): Promise<{ tools: McpToolInfo[] }>;\n callTool(params: {\n name: string;\n arguments?: Record<string, unknown>;\n }): Promise<McpCallResult>;\n close?(): Promise<void>;\n}\n\n/**\n * Connects to MCP servers and adapts their tools into AI SDK tool sets that\n * agents can use. Register a connected client via `connect(name, client)`, then\n * reference its tools with `getToolSet(name)`.\n */\n@Injectable()\nexport class McpService implements OnModuleDestroy {\n private readonly clients = new Map<string, McpClientLike>();\n private readonly toolSets = new Map<string, ToolSet>();\n\n /**\n * Registers an MCP client under `name`, lists its tools, and builds a\n * matching AI SDK tool set. Returns the tool set.\n */\n async connect(name: string, client: McpClientLike): Promise<ToolSet> {\n const { tools } = await client.listTools();\n const set: ToolSet = {};\n for (const info of tools) {\n set[info.name] = dynamicTool({\n description: info.description ?? info.name,\n inputSchema: jsonSchema(info.inputSchema as any),\n execute: async (args: unknown) => {\n const result = await client.callTool({\n name: info.name,\n arguments: (args ?? {}) as Record<string, unknown>,\n });\n return extractText(result);\n },\n });\n }\n this.clients.set(name, client);\n this.toolSets.set(name, set);\n return set;\n }\n\n /** Returns the tool set for a connected server (empty if unknown). */\n getToolSet(name: string): ToolSet {\n return this.toolSets.get(name) ?? {};\n }\n\n /** Returns tool sets for all connected servers, merged. */\n getAllTools(): ToolSet {\n return Object.assign({}, ...this.toolSets.values());\n }\n\n async onModuleDestroy(): Promise<void> {\n await this.closeAll();\n }\n\n /** Closes every connected client. */\n async closeAll(): Promise<void> {\n for (const client of this.clients.values()) {\n await client.close?.();\n }\n this.clients.clear();\n this.toolSets.clear();\n }\n}\n\n/** Flattens an MCP call result's content into a string. */\nfunction extractText(result: McpCallResult): string {\n if (!result.content) {\n return '';\n }\n return result.content\n .filter((part) => part.type === 'text' && typeof part.text === 'string')\n .map((part) => part.text)\n .join('\\n');\n}\n","import 'reflect-metadata';\nimport { Injectable } from '@nestjs/common';\nimport { GUARDRAIL_METADATA } from '../ai.constants.js';\n\n/**\n * Marks an injectable provider as a {@link Guardrail}. Discovered guardrails run\n * on every agent execution. The class may inject its own dependencies.\n *\n * @example\n * ```ts\n * @Guardrail()\n * export class BlockProfanity implements Guardrail {\n * beforeRun(ctx: GuardrailContext) {\n * if (containsProfanity(ctx.messages)) throw new Error('Blocked');\n * }\n * }\n * ```\n */\nexport function Guardrail(): ClassDecorator {\n return (target) => {\n Reflect.defineMetadata(GUARDRAIL_METADATA, true, target);\n Injectable()(target);\n };\n}\n","import { Inject, Injectable } from '@nestjs/common';\nimport { AI_MODULE_OPTIONS } from '../ai.constants.js';\nimport type { AiModuleOptions } from '../interfaces/ai-module-options.interface.js';\nimport { Guardrail } from '../observability/guardrail.decorator.js';\nimport type {\n Guardrail as GuardrailContract,\n GuardrailContext,\n} from '../observability/guardrail.interface.js';\nimport { UsageTracker } from './usage-tracker.service.js';\n\n/** Thrown when a conversation exceeds its configured cost budget. */\nexport class BudgetExceededError extends Error {\n constructor(\n public readonly conversationId: string | undefined,\n public readonly spent: number,\n public readonly limit: number,\n ) {\n super(\n `Budget exceeded${conversationId ? ` for \"${conversationId}\"` : ''}: ` +\n `$${spent.toFixed(4)} >= $${limit.toFixed(4)}.`,\n );\n this.name = 'BudgetExceededError';\n }\n}\n\n/**\n * Guardrail that blocks a run when the conversation's accumulated cost has\n * reached `maxCostPerConversation`. Registered automatically when that option\n * is set.\n */\n@Guardrail()\n@Injectable()\nexport class BudgetGuard implements GuardrailContract {\n constructor(\n private readonly usage: UsageTracker,\n @Inject(AI_MODULE_OPTIONS) private readonly options: AiModuleOptions,\n ) {}\n\n beforeRun(ctx: GuardrailContext): void {\n const limit = this.options.maxCostPerConversation;\n if (limit == null) {\n return;\n }\n const { cost } = this.usage.totals(ctx.options.conversationId);\n if (cost >= limit) {\n throw new BudgetExceededError(ctx.options.conversationId, cost, limit);\n }\n }\n}\n","/**\n * Throttles agent runs. Implement this (e.g. Redis) for distributed limiting\n * and register it via `AiModule.forRoot({ rateLimiter })`.\n */\nexport interface RateLimiter {\n /**\n * Attempts to consume `cost` units for `key`. Resolves `true` if allowed,\n * `false` if the limit is exceeded.\n */\n consume(key: string, cost?: number): Promise<boolean>;\n}\n\n/** Thrown by the rate-limit guardrail when a run is throttled. */\nexport class RateLimitedError extends Error {\n constructor(public readonly key: string) {\n super(`Rate limit exceeded for \"${key}\".`);\n this.name = 'RateLimitedError';\n }\n}\n","import { Inject, Injectable } from '@nestjs/common';\nimport { RATE_LIMITER } from '../ai.constants.js';\nimport { Guardrail } from '../observability/guardrail.decorator.js';\nimport type {\n Guardrail as GuardrailContract,\n GuardrailContext,\n} from '../observability/guardrail.interface.js';\nimport {\n RateLimitedError,\n type RateLimiter,\n} from './rate-limiter.interface.js';\n\n/**\n * Guardrail that throttles runs through the configured `RateLimiter`, keyed by\n * conversation id (or `\"global\"`). Registered when `rateLimiter` is set.\n */\n@Guardrail()\n@Injectable()\nexport class RateLimitGuardrail implements GuardrailContract {\n constructor(\n @Inject(RATE_LIMITER) private readonly limiter: RateLimiter,\n ) {}\n\n async beforeRun(ctx: GuardrailContext): Promise<void> {\n const key = ctx.options.conversationId ?? 'global';\n const allowed = await this.limiter.consume(key);\n if (!allowed) {\n throw new RateLimitedError(key);\n }\n }\n}\n","import { Injectable, Optional } from '@nestjs/common';\nimport type { VectorQueryResult } from '../vector-store.interface.js';\nimport type { Reranker } from './reranker.interface.js';\n\nexport interface HeuristicRerankerOptions {\n /** Weight of the query-term overlap boost relative to the base score. */\n overlapWeight?: number;\n}\n\n/**\n * Zero-dependency reranker that boosts results whose content shares terms with\n * the query, on top of the base similarity score. A pragmatic default when no\n * reranking model is configured.\n */\n@Injectable()\nexport class HeuristicReranker implements Reranker {\n constructor(\n @Optional() private readonly options: HeuristicRerankerOptions = {},\n ) {}\n\n async rerank(\n query: string,\n results: VectorQueryResult[],\n topN: number,\n ): Promise<VectorQueryResult[]> {\n const weight = this.options.overlapWeight ?? 0.5;\n const terms = tokenize(query);\n\n return results\n .map((result) => ({\n result,\n score: result.score + weight * overlap(terms, result.content),\n }))\n .sort((a, b) => b.score - a.score)\n .slice(0, topN)\n .map(({ result, score }) => ({ ...result, score }));\n }\n}\n\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 2),\n );\n}\n\n/** Fraction of query terms present in the content. */\nfunction overlap(terms: Set<string>, content: string): number {\n if (terms.size === 0) {\n return 0;\n }\n const contentTerms = tokenize(content);\n let hits = 0;\n for (const term of terms) {\n if (contentTerms.has(term)) {\n hits++;\n }\n }\n return hits / terms.size;\n}\n","import { Injectable } from '@nestjs/common';\nimport { z } from 'zod';\nimport type {\n EvalCase,\n EvalReport,\n EvalResult,\n Judge,\n} from './eval.types.js';\n\n/** Minimal agent shape the runner needs. */\nexport interface RunnableAgent {\n run(input: string): Promise<{ text: string }>;\n}\n\n/** Minimal `AiService` shape for the LLM judge. */\nexport interface JudgeAi {\n generateObject(params: {\n model?: string;\n schema: unknown;\n prompt: string;\n }): Promise<{ object: { score: number; reasoning: string } }>;\n}\n\nexport interface RunEvalOptions {\n judge?: Judge;\n /** Pass threshold in [0, 1] for the default judge (default 1). */\n passThreshold?: number;\n}\n\n/**\n * Runs an agent over a set of cases and scores each output with a judge\n * (default: substring match against `expected`; or an LLM judge).\n */\n@Injectable()\nexport class EvalRunner {\n async run(\n agent: RunnableAgent,\n cases: EvalCase[],\n options: RunEvalOptions = {},\n ): Promise<EvalReport> {\n const judge = options.judge ?? defaultJudge(options.passThreshold ?? 1);\n const results: EvalResult[] = [];\n\n for (const evalCase of cases) {\n const { text } = await agent.run(evalCase.input);\n const score = await judge({ case: evalCase, output: text });\n results.push({\n name: evalCase.name ?? evalCase.input,\n input: evalCase.input,\n output: text,\n ...score,\n });\n }\n\n const averageScore = results.length\n ? results.reduce((sum, r) => sum + r.score, 0) / results.length\n : 0;\n const passRate = results.length\n ? results.filter((r) => r.passed).length / results.length\n : 0;\n\n return { results, averageScore, passRate };\n }\n}\n\n/** Substring-match judge against `case.expected`. */\nexport function defaultJudge(threshold: number): Judge {\n return ({ case: evalCase, output }) => {\n if (evalCase.expected == null) {\n return { score: 0, passed: false, reasoning: 'no expected value or judge' };\n }\n const score = output.includes(evalCase.expected) ? 1 : 0;\n return { score, passed: score >= threshold };\n };\n}\n\n/**\n * Builds an LLM-as-judge that scores outputs 0..`scale` and normalizes to [0,1].\n */\nexport function createLlmJudge(\n ai: JudgeAi,\n options: { model?: string; scale?: number; passThreshold?: number } = {},\n): Judge {\n const scale = options.scale ?? 5;\n const passThreshold = options.passThreshold ?? 0.6;\n return async ({ case: evalCase, output }) => {\n const { object } = await ai.generateObject({\n model: options.model,\n schema: z.object({ score: z.number(), reasoning: z.string() }),\n prompt:\n `Rubric: ${evalCase.rubric ?? 'Is the answer correct and helpful?'}\\n` +\n `Expected: ${evalCase.expected ?? 'n/a'}\\n` +\n `Output: ${output}\\n` +\n `Give a score from 0 to ${scale} and a brief reasoning.`,\n });\n const normalized = Math.max(0, Math.min(1, object.score / scale));\n return {\n score: normalized,\n passed: normalized >= passThreshold,\n reasoning: object.reasoning,\n };\n };\n}\n","import {\n type DynamicModule,\n Global,\n Module,\n type Provider,\n type Type,\n} from '@nestjs/common';\nimport { DiscoveryModule, ModuleRef } from '@nestjs/core';\nimport {\n AI_CACHE,\n AI_MODULE_OPTIONS,\n APPROVAL_GATE,\n CONVERSATION_STORE,\n RATE_LIMITER,\n RERANKER,\n VECTOR_STORE,\n} from './ai.constants.js';\nimport type {\n AiFeatureOptions,\n AiModuleAsyncOptions,\n AiModuleOptions,\n ConversationStoreProvider,\n} from './interfaces/ai-module-options.interface.js';\nimport { ProviderRegistry } from './core/provider-registry.js';\nimport { AiService } from './core/ai.service.js';\nimport { ToolRegistry } from './tools/tool.registry.js';\nimport { AgentExecutorService } from './agent/agent-executor.service.js';\nimport { EmbeddingsService } from './embeddings/embeddings.service.js';\nimport { InMemoryConversationStore } from './memory/in-memory-conversation.store.js';\nimport { ImageService } from './multimodal/image.service.js';\nimport { SpeechService } from './multimodal/speech.service.js';\nimport { TranscriptionService } from './multimodal/transcription.service.js';\nimport { RagService } from './rag/rag.service.js';\nimport { InMemoryVectorStore } from './rag/in-memory-vector-store.js';\nimport { PromptRegistry } from './prompts/prompt-registry.service.js';\nimport {\n AiEventEmitter,\n EVENT_EMITTER,\n} from './observability/ai-event-emitter.js';\nimport { GuardrailRegistry } from './observability/guardrail.registry.js';\nimport { AgentRegistry } from './agent/orchestration/agent-registry.js';\nimport { McpService } from './mcp/mcp.service.js';\nimport { UsageTracker } from './usage/usage-tracker.service.js';\nimport { BudgetGuard } from './usage/budget.guardrail.js';\nimport { RateLimitGuardrail } from './ratelimit/rate-limit.guardrail.js';\nimport { SemanticMemory } from './memory/semantic/semantic-memory.service.js';\nimport { HeuristicReranker } from './rag/rerank/heuristic-reranker.js';\nimport { EvalRunner } from './evals/eval-runner.service.js';\n\nconst AI_INITIALIZER = Symbol('AI_INITIALIZER');\n\n/**\n * Root module for `@mgvdev/nestjs-ai`. Registered globally so agents, tools and\n * services are available everywhere once configured.\n */\n@Global()\n@Module({})\nexport class AiModule {\n /** Configure the module with static options. */\n static forRoot(options: AiModuleOptions = {}): DynamicModule {\n return AiModule.build(\n { provide: AI_MODULE_OPTIONS, useValue: options },\n options,\n );\n }\n\n /** Configure the module asynchronously (e.g. from `ConfigService`). */\n static forRootAsync(options: AiModuleAsyncOptions): DynamicModule {\n return AiModule.build(\n {\n provide: AI_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject ?? [],\n },\n options,\n options.imports,\n );\n }\n\n /**\n * Convenience registration of agents / tools / guardrails so they don't have\n * to be added to a consuming module's own `providers` array, plus feature\n * prompts. Discovery still finds providers globally regardless of where they\n * are registered.\n */\n static forFeature(feature: AiFeatureOptions = {}): DynamicModule {\n const providers: Provider[] = [\n ...(feature.agents ?? []),\n ...(feature.tools ?? []),\n ...(feature.guardrails ?? []),\n ];\n if (feature.prompts?.length) {\n providers.push({\n provide: Symbol('AI_FEATURE_PROMPTS'),\n useFactory: (registry: PromptRegistry) => {\n registry.registerAll(feature.prompts!);\n return true;\n },\n inject: [PromptRegistry],\n });\n }\n return { module: AiModule, providers, exports: providers };\n }\n\n private static build(\n optionsProvider: Provider,\n options: Partial<AiModuleOptions> & {\n conversationStore?: ConversationStoreProvider;\n },\n extraImports: DynamicModule['imports'] = [],\n ): DynamicModule {\n return {\n module: AiModule,\n imports: [DiscoveryModule, ...(extraImports ?? [])],\n providers: [\n optionsProvider,\n AiModule.storeProvider(options.conversationStore),\n AiModule.vectorStoreProvider(options.vectorStore),\n AiModule.eventEmitterProvider(),\n ...AiModule.tokenProvider(AI_CACHE, options.cache),\n ...AiModule.tokenProvider(APPROVAL_GATE, options.approvalGate),\n ...AiModule.tokenProvider(RATE_LIMITER, options.rateLimiter),\n ...AiModule.guardrailClasses(options.guardrails),\n ...(options.maxCostPerConversation != null ? [BudgetGuard] : []),\n ...(options.rateLimiter ? [RateLimitGuardrail] : []),\n ...AiModule.coreProviders(),\n AiModule.initializerProvider(),\n ],\n exports: AiModule.exportedTokens(),\n };\n }\n\n private static coreProviders(): Provider[] {\n return [\n ProviderRegistry,\n ToolRegistry,\n AgentExecutorService,\n AgentRegistry,\n AiService,\n EmbeddingsService,\n ImageService,\n SpeechService,\n TranscriptionService,\n RagService,\n PromptRegistry,\n AiEventEmitter,\n GuardrailRegistry,\n McpService,\n UsageTracker,\n SemanticMemory,\n EvalRunner,\n { provide: RERANKER, useFactory: () => new HeuristicReranker() },\n ];\n }\n\n /**\n * Registers an optional provider (class / factory / value / useClass shape)\n * under `token`, or nothing when not configured.\n */\n private static tokenProvider(\n token: symbol,\n config:\n | Type<any>\n | { useClass?: Type<any>; useFactory?: (...a: any[]) => any; useValue?: any; inject?: any[] }\n | undefined,\n ): Provider[] {\n if (!config) {\n return [];\n }\n if (typeof config === 'function') {\n return [{ provide: token, useClass: config }];\n }\n return [{ provide: token, ...config } as Provider];\n }\n\n private static exportedTokens(): any[] {\n return [\n ProviderRegistry,\n ToolRegistry,\n AgentExecutorService,\n AgentRegistry,\n AiService,\n EmbeddingsService,\n ImageService,\n SpeechService,\n TranscriptionService,\n RagService,\n PromptRegistry,\n AiEventEmitter,\n GuardrailRegistry,\n McpService,\n UsageTracker,\n SemanticMemory,\n EvalRunner,\n RERANKER,\n CONVERSATION_STORE,\n VECTOR_STORE,\n AI_MODULE_OPTIONS,\n ];\n }\n\n private static guardrailClasses(guardrails?: Type<any>[]): Provider[] {\n return guardrails ?? [];\n }\n\n /** Seeds prompts (and future startup wiring) once dependencies exist. */\n private static initializerProvider(): Provider {\n return {\n provide: AI_INITIALIZER,\n useFactory: (registry: PromptRegistry, opts: AiModuleOptions) => {\n if (opts.prompts?.length) {\n registry.registerAll(opts.prompts);\n }\n return true;\n },\n inject: [PromptRegistry, AI_MODULE_OPTIONS],\n };\n }\n\n /**\n * Optionally resolves `EventEmitter2` from `@nestjs/event-emitter` if the\n * package is installed and its module is imported; otherwise `undefined`.\n */\n private static eventEmitterProvider(): Provider {\n return {\n provide: EVENT_EMITTER,\n useFactory: async (moduleRef: ModuleRef) => {\n try {\n const mod: any = await import('@nestjs/event-emitter');\n return moduleRef.get(mod.EventEmitter2, { strict: false });\n } catch {\n return undefined;\n }\n },\n inject: [ModuleRef],\n };\n }\n\n private static storeProvider(store?: ConversationStoreProvider): Provider {\n if (!store) {\n return {\n provide: CONVERSATION_STORE,\n useClass: InMemoryConversationStore,\n };\n }\n if (typeof store === 'function') {\n return { provide: CONVERSATION_STORE, useClass: store };\n }\n return { provide: CONVERSATION_STORE, ...store } as Provider;\n }\n\n private static vectorStoreProvider(\n store?: AiModuleOptions['vectorStore'],\n ): Provider {\n if (!store) {\n return { provide: VECTOR_STORE, useClass: InMemoryVectorStore };\n }\n if (typeof store === 'function') {\n return { provide: VECTOR_STORE, useClass: store };\n }\n return { provide: VECTOR_STORE, ...store } as Provider;\n }\n}\n","import 'reflect-metadata';\nimport { TOOL_METADATA } from '../ai.constants.js';\nimport type { ToolMetadata, ToolOptions } from './tool.metadata.js';\n\n/**\n * Marks a method of an injectable provider as an AI tool (a.k.a. function\n * call). The method receives the validated arguments (typed by the Zod\n * `schema`) and its return value is fed back to the model.\n *\n * Because the owning class is a normal NestJS provider, the method keeps full\n * access to injected dependencies.\n *\n * @example\n * ```ts\n * @Injectable()\n * class WeatherTools {\n * constructor(private readonly api: WeatherApi) {}\n *\n * @Tool({ description: 'Get the weather for a city', schema: z.object({ city: z.string() }) })\n * getWeather({ city }: { city: string }) {\n * return this.api.lookup(city);\n * }\n * }\n * ```\n */\nexport function Tool(options: ToolOptions): MethodDecorator {\n return (target, propertyKey, descriptor: PropertyDescriptor) => {\n const metadata: ToolMetadata = {\n ...options,\n methodName: String(propertyKey),\n };\n // Store on the method function itself so `Reflector.get(TOOL_METADATA, fn)`\n // resolves it during discovery.\n Reflect.defineMetadata(TOOL_METADATA, metadata, descriptor.value);\n return descriptor;\n };\n}\n","import 'reflect-metadata';\nimport { Injectable } from '@nestjs/common';\nimport { AGENT_METADATA } from '../ai.constants.js';\nimport type { AgentOptions } from './agent.metadata.js';\n\n/**\n * Declares a class as an AI agent. The class should extend {@link AiAgent} to\n * gain `.run()` / `.stream()`. `@Agent` also marks the class `@Injectable`, so\n * it participates in DI and can inject its own dependencies.\n *\n * @example\n * ```ts\n * @Agent({\n * model: 'openai:gpt-4o',\n * system: 'You are a helpful support assistant.',\n * tools: [WeatherTools],\n * })\n * export class SupportAgent extends AiAgent {}\n * ```\n */\nexport function Agent(options: AgentOptions = {}): ClassDecorator {\n return (target) => {\n Reflect.defineMetadata(AGENT_METADATA, options, target);\n Injectable()(target);\n };\n}\n","import { Inject } from '@nestjs/common';\nimport type { AiInput } from '../messages/message.types.js';\nimport { AgentExecutorService } from './agent-executor.service.js';\nimport type { AgentResult, AgentRunOptions } from './agent.interface.js';\n\n/**\n * Base class for `@Agent`-decorated agents. Provides `.run()` and `.stream()`\n * by delegating to the {@link AgentExecutorService}, which is property-injected\n * so subclasses need no constructor boilerplate.\n *\n * @example\n * ```ts\n * @Agent({ model: 'openai:gpt-4o', system: 'You are helpful.' })\n * class ChatAgent extends AiAgent {}\n *\n * // elsewhere\n * const { text } = await chatAgent.run('Hello!');\n * ```\n */\nexport abstract class AiAgent {\n @Inject(AgentExecutorService)\n protected readonly executor!: AgentExecutorService;\n\n /** Runs the agent to completion. */\n run<T = unknown>(\n input: AiInput,\n opts?: AgentRunOptions,\n ): Promise<AgentResult<T>> {\n return this.executor.run<T>(this, input, opts);\n }\n\n /** Streams the agent's response (returns the raw Vercel stream result). */\n stream(\n input: AiInput,\n opts?: AgentRunOptions,\n ): ReturnType<AgentExecutorService['stream']> {\n return this.executor.stream(this, input, opts);\n }\n}\n","import { tool, type Tool as AiTool } from 'ai';\nimport { z } from 'zod';\nimport type { RagService } from './rag.service.js';\n\nexport interface RetrievalToolOptions {\n /** Tool name exposed to the model (default `\"searchKnowledgeBase\"`). */\n name?: string;\n /** Tool description guiding when the model should search. */\n description?: string;\n /** Number of chunks to return (default 4). */\n topK?: number;\n /** Embedding model id for the query. */\n model?: string;\n /** Optional metadata filter applied to every retrieval. */\n filter?: Record<string, unknown>;\n}\n\n/**\n * Builds a Vercel AI SDK `tool()` that retrieves relevant chunks from a\n * `RagService`, so an agent can ground its answers. Register it by exposing it\n * from a `@Tool`-style provider, or pass its tool set directly to `AiService`.\n *\n * @example\n * ```ts\n * const tool = createRetrievalTool(rag, { topK: 5 });\n * await ai.generateText({ model: 'openai:gpt-4o', tools: { search: tool }, prompt });\n * ```\n */\nexport function createRetrievalTool(\n rag: RagService,\n options: RetrievalToolOptions = {},\n): AiTool<{ query: string }, string> {\n return tool({\n description:\n options.description ??\n 'Search the knowledge base for information relevant to the query.',\n inputSchema: z.object({\n query: z.string().describe('The search query'),\n }),\n execute: async ({ query }) => {\n const results = await rag.retrieve(query, {\n topK: options.topK,\n model: options.model,\n filter: options.filter,\n });\n if (results.length === 0) {\n return 'No relevant information found.';\n }\n return results\n .map((r, i) => `[${i + 1}] ${r.content}`)\n .join('\\n\\n');\n },\n });\n}\n","import type { AiMessage } from '../../../messages/message.types.js';\nimport type { ConversationStore } from '../../conversation-store.interface.js';\n\n/**\n * Minimal shape of a Prisma model delegate this store needs. Pass your\n * generated delegate (e.g. `prisma.aiMessage`) — no dependency on\n * `@prisma/client` is required by this library.\n *\n * Expected Prisma model:\n * ```prisma\n * model AiMessage {\n * id String @id @default(cuid())\n * conversationId String\n * role String\n * content Json\n * position Int\n * createdAt DateTime @default(now())\n * @@index([conversationId])\n * }\n * ```\n */\nexport interface PrismaConversationDelegate {\n findMany(args: {\n where: { conversationId: string };\n orderBy: { position: 'asc' | 'desc' };\n }): Promise<Array<{ role: string; content: unknown }>>;\n create(args: {\n data: {\n conversationId: string;\n role: string;\n content: unknown;\n position: number;\n };\n }): Promise<unknown>;\n count(args: { where: { conversationId: string } }): Promise<number>;\n deleteMany(args: { where: { conversationId: string } }): Promise<unknown>;\n}\n\n/**\n * Prisma-backed conversation store built on a delegate interface, so it works\n * with any generated Prisma client without a compile-time dependency on it.\n */\nexport class PrismaConversationStore implements ConversationStore {\n constructor(private readonly delegate: PrismaConversationDelegate) {}\n\n async load(conversationId: string): Promise<AiMessage[]> {\n const rows = await this.delegate.findMany({\n where: { conversationId },\n orderBy: { position: 'asc' },\n });\n return rows.map((row) => ({\n role: row.role,\n content: row.content,\n })) as AiMessage[];\n }\n\n async append(\n conversationId: string,\n messages: AiMessage[],\n ): Promise<void> {\n if (messages.length === 0) {\n return;\n }\n const base = await this.delegate.count({ where: { conversationId } });\n for (let index = 0; index < messages.length; index++) {\n const message = messages[index];\n await this.delegate.create({\n data: {\n conversationId,\n role: message.role,\n content: message.content,\n position: base + index,\n },\n });\n }\n }\n\n async clear(conversationId: string): Promise<void> {\n await this.delegate.deleteMany({ where: { conversationId } });\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport type { AiCache } from './ai-cache.interface.js';\n\ninterface Entry {\n value: unknown;\n expiresAt: number | null;\n}\n\n/**\n * Default in-process cache with optional per-entry TTL. Not shared across\n * processes — provide a distributed `AiCache` for production.\n */\n@Injectable()\nexport class InMemoryAiCache implements AiCache {\n private readonly store = new Map<string, Entry>();\n\n async get(key: string): Promise<unknown | undefined> {\n const entry = this.store.get(key);\n if (!entry) {\n return undefined;\n }\n if (entry.expiresAt !== null && entry.expiresAt <= Date.now()) {\n this.store.delete(key);\n return undefined;\n }\n return entry.value;\n }\n\n async set(key: string, value: unknown, ttlMs?: number): Promise<void> {\n this.store.set(key, {\n value,\n expiresAt: ttlMs != null ? Date.now() + ttlMs : null,\n });\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport type {\n ApprovalContext,\n ApprovalGate,\n} from './approval-gate.interface.js';\n\n/** Default gate: approves every request. */\n@Injectable()\nexport class AutoApproveGate implements ApprovalGate {\n async requestApproval(_context: ApprovalContext): Promise<boolean> {\n return true;\n }\n}\n\n/** Gate that denies every request (useful to hard-block approval tools). */\n@Injectable()\nexport class DenyApproveGate implements ApprovalGate {\n async requestApproval(_context: ApprovalContext): Promise<boolean> {\n return false;\n }\n}\n","import type { ServerResponse } from 'node:http';\n\n/** Structural type for the pipe methods on a Vercel AI SDK stream result. */\nexport interface PipeableStreamResult {\n pipeUIMessageStreamToResponse?: (res: ServerResponse) => void;\n pipeTextStreamToResponse?: (res: ServerResponse) => void;\n}\n\nexport interface PipeAgentStreamOptions {\n /**\n * Wire protocol: `'ui'` (AI SDK UI message stream, for `useChat`) or `'text'`\n * (plain text stream). Defaults to `'ui'`.\n */\n protocol?: 'ui' | 'text';\n}\n\n/**\n * Pipes an agent/`AiService` stream result to an HTTP response (Express-style\n * `ServerResponse`). Use in a controller that injected `@Res()`.\n *\n * @example\n * ```ts\n * @Post('chat')\n * chat(@Body('prompt') prompt: string, @Res() res: Response) {\n * pipeAgentStream(this.agent.stream(prompt), res, { protocol: 'ui' });\n * }\n * ```\n */\nexport function pipeAgentStream(\n result: PipeableStreamResult,\n res: ServerResponse,\n options: PipeAgentStreamOptions = {},\n): void {\n const protocol = options.protocol ?? 'ui';\n if (protocol === 'text') {\n if (typeof result.pipeTextStreamToResponse === 'function') {\n result.pipeTextStreamToResponse(res);\n return;\n }\n } else if (typeof result.pipeUIMessageStreamToResponse === 'function') {\n result.pipeUIMessageStreamToResponse(res);\n return;\n }\n throw new Error(\n `The stream result does not support the \"${protocol}\" protocol.`,\n );\n}\n","import {\n type CallHandler,\n type ExecutionContext,\n Injectable,\n type NestInterceptor,\n} from '@nestjs/common';\nimport { EMPTY, type Observable, mergeMap } from 'rxjs';\nimport {\n pipeAgentStream,\n type PipeableStreamResult,\n type PipeAgentStreamOptions,\n} from './stream-response.js';\n\n/**\n * Interceptor that pipes a stream result returned by a route handler to the\n * HTTP response. The handler returns the `streamText`/agent `.stream()` result;\n * the interceptor pipes it and completes the request.\n *\n * @example\n * ```ts\n * @UseInterceptors(new AgentStreamInterceptor({ protocol: 'ui' }))\n * @Post('chat')\n * chat(@Body('prompt') prompt: string) {\n * return this.agent.stream(prompt);\n * }\n * ```\n */\n@Injectable()\nexport class AgentStreamInterceptor implements NestInterceptor {\n constructor(private readonly options: PipeAgentStreamOptions = {}) {}\n\n intercept(\n context: ExecutionContext,\n next: CallHandler,\n ): Observable<never> {\n const res = context.switchToHttp().getResponse<import('node:http').ServerResponse>();\n return next.handle().pipe(\n mergeMap((result: PipeableStreamResult) => {\n pipeAgentStream(result, res, this.options);\n return EMPTY;\n }),\n );\n }\n}\n","import { Inject, Injectable } from '@nestjs/common';\nimport { AGENT_QUEUE } from '../ai.constants.js';\nimport type { AgentJobData, QueueLike } from './agent-job.types.js';\n\n/** The job name used for queued agent runs. */\nexport const AGENT_JOB_NAME = 'agent-run';\n\n/**\n * Enqueues agent runs onto a BullMQ queue for asynchronous processing. The\n * queue is injected under the `AGENT_QUEUE` token by `AgentJobsModule`.\n */\n@Injectable()\nexport class AgentQueueService {\n constructor(@Inject(AGENT_QUEUE) private readonly queue: QueueLike) {}\n\n /** Enqueues an agent run and returns the created job id. */\n async enqueue(\n data: AgentJobData,\n jobOptions?: Record<string, unknown>,\n ): Promise<string | undefined> {\n const job = await this.queue.add(AGENT_JOB_NAME, data, jobOptions);\n return job.id;\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { AgentRegistry } from '../agent/orchestration/agent-registry.js';\nimport type { AgentResult } from '../agent/agent.interface.js';\nimport type { AgentJobData } from './agent-job.types.js';\n\n/**\n * Runs a queued agent job by resolving the agent from the {@link AgentRegistry}\n * and invoking its `.run()`. Framework-agnostic: a BullMQ worker simply calls\n * `run(job.data)`.\n */\n@Injectable()\nexport class AgentJobProcessor {\n constructor(private readonly agents: AgentRegistry) {}\n\n async run(data: AgentJobData): Promise<AgentResult> {\n const agent = this.agents.get(data.agent);\n if (!agent) {\n throw new Error(\n `Cannot process job: unknown agent \"${data.agent}\". Is it registered?`,\n );\n }\n return agent.run(data.input, data.options);\n }\n}\n","import {\n type DynamicModule,\n Inject,\n Injectable,\n Module,\n type OnModuleDestroy,\n type OnModuleInit,\n} from '@nestjs/common';\nimport { AGENT_QUEUE } from '../ai.constants.js';\nimport { AgentQueueService, AGENT_JOB_NAME } from './agent-queue.service.js';\nimport { AgentJobProcessor } from './agent-job.processor.js';\n\nconst AGENT_JOBS_OPTIONS = Symbol('AGENT_JOBS_OPTIONS');\n\nexport interface AgentJobsOptions {\n /** BullMQ connection (ioredis connection or options). */\n connection: unknown;\n /** Queue name (default `\"ai-agent-runs\"`). */\n queueName?: string;\n /** Start a worker in this process to consume jobs (default `true`). */\n runWorker?: boolean;\n}\n\nconst DEFAULT_QUEUE = 'ai-agent-runs';\n\n/** Loads `bullmq` at runtime without a compile-time dependency. */\nasync function loadBullMq(): Promise<any> {\n const specifier = 'bullmq';\n return import(specifier);\n}\n\n/**\n * Runs a BullMQ worker that processes queued agent jobs via\n * {@link AgentJobProcessor}. Started on module init, stopped on destroy.\n */\n@Injectable()\nclass AgentWorkerManager implements OnModuleInit, OnModuleDestroy {\n private worker: { close(): Promise<void> } | undefined;\n\n constructor(\n @Inject(AGENT_JOBS_OPTIONS) private readonly options: AgentJobsOptions,\n private readonly processor: AgentJobProcessor,\n ) {}\n\n async onModuleInit(): Promise<void> {\n if (this.options.runWorker === false) {\n return;\n }\n const { Worker } = await loadBullMq();\n this.worker = new Worker(\n this.options.queueName ?? DEFAULT_QUEUE,\n async (job: { name: string; data: any }) => {\n if (job.name === AGENT_JOB_NAME) {\n return this.processor.run(job.data);\n }\n return undefined;\n },\n { connection: this.options.connection },\n );\n }\n\n async onModuleDestroy(): Promise<void> {\n await this.worker?.close();\n }\n}\n\n/**\n * Background-job module for asynchronous agent execution on BullMQ. Import it\n * where you need it (it is separate from the global `AiModule`).\n *\n * @example\n * ```ts\n * AgentJobsModule.forRoot({ connection: { host: 'localhost', port: 6379 } })\n * ```\n * Requires the optional peers `bullmq` (and typically a Redis instance).\n */\n@Module({})\nexport class AgentJobsModule {\n static forRoot(options: AgentJobsOptions): DynamicModule {\n return {\n module: AgentJobsModule,\n providers: [\n { provide: AGENT_JOBS_OPTIONS, useValue: options },\n {\n provide: AGENT_QUEUE,\n useFactory: async () => {\n const { Queue } = await loadBullMq();\n return new Queue(options.queueName ?? DEFAULT_QUEUE, {\n connection: options.connection,\n });\n },\n },\n AgentQueueService,\n AgentJobProcessor,\n AgentWorkerManager,\n ],\n exports: [AgentQueueService, AgentJobProcessor],\n };\n }\n}\n","import type {\n VectorDocument,\n VectorQueryOptions,\n VectorQueryResult,\n VectorStore,\n} from '../../vector-store.interface.js';\n\n/** Structural interface for a `pg` Pool/Client (only `query` is used). */\nexport interface PgPoolLike {\n query(\n sql: string,\n params?: unknown[],\n ): Promise<{ rows: Array<Record<string, any>> }>;\n}\n\nexport interface PgVectorStoreOptions {\n /** Table name (default `\"ai_documents\"`). */\n table?: string;\n}\n\n/**\n * `VectorStore` backed by Postgres + the `pgvector` extension. Pass a `pg`\n * `Pool` (or any object with a compatible `query`). Expects a table like:\n *\n * ```sql\n * CREATE EXTENSION IF NOT EXISTS vector;\n * CREATE TABLE ai_documents (\n * id text PRIMARY KEY,\n * content text NOT NULL,\n * embedding vector(1536) NOT NULL,\n * metadata jsonb\n * );\n * CREATE INDEX ON ai_documents USING hnsw (embedding vector_cosine_ops);\n * ```\n */\nexport class PgVectorStore implements VectorStore {\n private readonly table: string;\n\n constructor(\n private readonly pool: PgPoolLike,\n options: PgVectorStoreOptions = {},\n ) {\n this.table = options.table ?? 'ai_documents';\n }\n\n async upsert(documents: VectorDocument[]): Promise<void> {\n for (const doc of documents) {\n if (!doc.embedding) {\n throw new Error(\n `Document \"${doc.id}\" has no embedding. PgVectorStore requires ` +\n `precomputed embeddings (use RagService.ingest).`,\n );\n }\n await this.pool.query(\n `INSERT INTO ${this.table} (id, content, embedding, metadata)\n VALUES ($1, $2, $3, $4)\n ON CONFLICT (id) DO UPDATE\n SET content = EXCLUDED.content,\n embedding = EXCLUDED.embedding,\n metadata = EXCLUDED.metadata`,\n [\n doc.id,\n doc.content,\n toVectorLiteral(doc.embedding),\n doc.metadata ? JSON.stringify(doc.metadata) : null,\n ],\n );\n }\n }\n\n async query(\n embedding: number[],\n options: VectorQueryOptions = {},\n ): Promise<VectorQueryResult[]> {\n const topK = options.topK ?? 4;\n const vector = toVectorLiteral(embedding);\n const params: unknown[] = [vector];\n let where = '';\n if (options.filter) {\n params.push(JSON.stringify(options.filter));\n where = `WHERE metadata @> $${params.length}`;\n }\n params.push(topK);\n const limitParam = `$${params.length}`;\n\n const { rows } = await this.pool.query(\n `SELECT id, content, metadata, 1 - (embedding <=> $1) AS score\n FROM ${this.table}\n ${where}\n ORDER BY embedding <=> $1\n LIMIT ${limitParam}`,\n params,\n );\n\n return rows.map((row) => ({\n id: row.id,\n content: row.content,\n score: Number(row.score),\n metadata: row.metadata ?? undefined,\n }));\n }\n\n async delete(ids: string[]): Promise<void> {\n if (ids.length === 0) {\n return;\n }\n await this.pool.query(`DELETE FROM ${this.table} WHERE id = ANY($1)`, [ids]);\n }\n\n async clear(): Promise<void> {\n await this.pool.query(`DELETE FROM ${this.table}`);\n }\n}\n\n/** Formats an embedding as a pgvector literal, e.g. `[0.1,0.2]`. */\nfunction toVectorLiteral(embedding: number[]): string {\n return `[${embedding.join(',')}]`;\n}\n","import type { RateLimiter } from './rate-limiter.interface.js';\n\nexport interface InMemoryRateLimiterOptions {\n /** Maximum tokens in the bucket (burst size). */\n capacity: number;\n /** Tokens added per `intervalMs`. */\n refillTokens: number;\n /** Refill interval in milliseconds. */\n intervalMs: number;\n /** Clock, for testing. Defaults to `Date.now`. */\n now?: () => number;\n}\n\ninterface Bucket {\n tokens: number;\n last: number;\n}\n\n/**\n * In-process token-bucket rate limiter, keyed (e.g. by conversation or user).\n * Not shared across processes — provide a distributed `RateLimiter` for scale.\n */\nexport class InMemoryRateLimiter implements RateLimiter {\n private readonly buckets = new Map<string, Bucket>();\n private readonly now: () => number;\n\n constructor(private readonly options: InMemoryRateLimiterOptions) {\n this.now = options.now ?? Date.now;\n }\n\n async consume(key: string, cost = 1): Promise<boolean> {\n const now = this.now();\n const bucket = this.buckets.get(key) ?? {\n tokens: this.options.capacity,\n last: now,\n };\n\n const elapsed = now - bucket.last;\n if (elapsed > 0) {\n const refill =\n (elapsed / this.options.intervalMs) * this.options.refillTokens;\n bucket.tokens = Math.min(this.options.capacity, bucket.tokens + refill);\n bucket.last = now;\n }\n\n let allowed = false;\n if (bucket.tokens >= cost) {\n bucket.tokens -= cost;\n allowed = true;\n }\n this.buckets.set(key, bucket);\n return allowed;\n }\n}\n","import { Injectable, type Type } from '@nestjs/common';\nimport { Guardrail } from '../observability/guardrail.decorator.js';\nimport type {\n Guardrail as GuardrailContract,\n GuardrailContext,\n} from '../observability/guardrail.interface.js';\nimport type { AiMessage } from '../messages/message.types.js';\n\n/** Default PII regexes: email, phone, credit card, US SSN. */\nexport const DEFAULT_PII_PATTERNS: RegExp[] = [\n /[\\w.+-]+@[\\w-]+\\.[\\w.-]+/g,\n /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n /\\b(?:\\d[ -]*?){13,16}\\b/g,\n /(?:\\+?\\d[\\d\\s().-]{7,}\\d)/g,\n];\n\nexport interface PiiRedactionOptions {\n patterns?: RegExp[];\n replacement?: string;\n}\n\n/** Redacts PII matches in a string. */\nexport function redactPii(\n text: string,\n patterns: RegExp[] = DEFAULT_PII_PATTERNS,\n replacement = '[REDACTED]',\n): string {\n let out = text;\n for (const pattern of patterns) {\n out = out.replace(pattern, replacement);\n }\n return out;\n}\n\n/** Redacts PII in every message's textual content, in place. */\nexport function redactMessages(\n messages: AiMessage[],\n patterns: RegExp[] = DEFAULT_PII_PATTERNS,\n replacement = '[REDACTED]',\n): void {\n for (const message of messages) {\n const content = (message as { content: unknown }).content;\n if (typeof content === 'string') {\n (message as { content: unknown }).content = redactPii(\n content,\n patterns,\n replacement,\n );\n } else if (Array.isArray(content)) {\n for (const part of content) {\n if (part && typeof part === 'object' && typeof part.text === 'string') {\n part.text = redactPii(part.text, patterns, replacement);\n }\n }\n }\n }\n}\n\n/**\n * Guardrail that redacts PII in the messages sent to the model (default\n * patterns). For custom patterns use {@link createPiiRedactionGuardrail}.\n */\n@Guardrail()\n@Injectable()\nexport class PiiRedactionGuardrail implements GuardrailContract {\n beforeRun(ctx: GuardrailContext): void {\n redactMessages(ctx.messages);\n }\n}\n\n/** Builds a configured PII-redaction guardrail class (discoverable via DI). */\nexport function createPiiRedactionGuardrail(\n options: PiiRedactionOptions = {},\n): Type<GuardrailContract> {\n const patterns = options.patterns ?? DEFAULT_PII_PATTERNS;\n const replacement = options.replacement ?? '[REDACTED]';\n\n @Guardrail()\n @Injectable()\n class ConfiguredPiiRedaction implements GuardrailContract {\n beforeRun(ctx: GuardrailContext): void {\n redactMessages(ctx.messages, patterns, replacement);\n }\n }\n return ConfiguredPiiRedaction;\n}\n","import { Injectable, type Type } from '@nestjs/common';\nimport { Guardrail } from '../observability/guardrail.decorator.js';\nimport type {\n Guardrail as GuardrailContract,\n GuardrailContext,\n} from '../observability/guardrail.interface.js';\nimport type { AiMessage } from '../messages/message.types.js';\n\n/** Thrown when moderation blocks content. */\nexport class ContentBlockedError extends Error {\n constructor(public readonly reason: string) {\n super(`Content blocked by moderation: ${reason}`);\n this.name = 'ContentBlockedError';\n }\n}\n\nexport interface ModerationOptions {\n /** Case-insensitive terms that block a run when present. */\n blocked?: string[];\n /**\n * Optional async check returning `true` to block. Runs in addition to the\n * deny-list (e.g. call a provider moderation endpoint).\n */\n moderate?: (text: string) => boolean | Promise<boolean>;\n}\n\n/** Concatenates the textual content of messages. */\nexport function messagesText(messages: AiMessage[]): string {\n return messages\n .map((m) => {\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n return content;\n }\n if (Array.isArray(content)) {\n return content\n .map((p) => (p && typeof p.text === 'string' ? p.text : ''))\n .join(' ');\n }\n return '';\n })\n .join('\\n');\n}\n\n/**\n * Builds a moderation guardrail that blocks runs whose input contains a\n * deny-listed term or fails a custom `moderate` check.\n */\nexport function createModerationGuardrail(\n options: ModerationOptions = {},\n): Type<GuardrailContract> {\n const blocked = (options.blocked ?? []).map((t) => t.toLowerCase());\n const moderate = options.moderate;\n\n @Guardrail()\n @Injectable()\n class ConfiguredModeration implements GuardrailContract {\n async beforeRun(ctx: GuardrailContext): Promise<void> {\n const text = messagesText(ctx.messages);\n const lower = text.toLowerCase();\n const hit = blocked.find((term) => lower.includes(term));\n if (hit) {\n throw new ContentBlockedError(`matched blocked term \"${hit}\"`);\n }\n if (moderate && (await moderate(text))) {\n throw new ContentBlockedError('failed custom moderation');\n }\n }\n }\n return ConfiguredModeration;\n}\n","import { Injectable } from '@nestjs/common';\nimport { rerank } from 'ai';\nimport { ProviderRegistry } from '../../core/provider-registry.js';\nimport type { VectorQueryResult } from '../vector-store.interface.js';\nimport type { Reranker } from './reranker.interface.js';\n\n/**\n * Reranker backed by a provider reranking model via the AI SDK's `rerank()`.\n * Requires a rerank-capable provider (e.g. `@ai-sdk/cohere`) configured through\n * `rerankingModel`.\n */\n@Injectable()\nexport class ModelReranker implements Reranker {\n constructor(\n private readonly providers: ProviderRegistry,\n private readonly model?: string,\n ) {}\n\n async rerank(\n query: string,\n results: VectorQueryResult[],\n topN: number,\n ): Promise<VectorQueryResult[]> {\n if (results.length === 0) {\n return [];\n }\n const { ranking } = await rerank({\n model: this.providers.getRerankingModel(this.model),\n query,\n documents: results.map((r) => r.content),\n topN,\n });\n return ranking.map((entry) => ({\n ...results[entry.originalIndex],\n score: entry.score,\n }));\n }\n}\n","import type {\n VectorDocument,\n VectorQueryOptions,\n VectorQueryResult,\n VectorStore,\n} from '../../vector-store.interface.js';\n\n/** Structural subset of the Qdrant JS client we use. */\nexport interface QdrantClientLike {\n upsert(collection: string, params: unknown): Promise<unknown>;\n search(\n collection: string,\n params: unknown,\n ): Promise<Array<{ id: string | number; score: number; payload?: any }>>;\n delete(collection: string, params: unknown): Promise<unknown>;\n}\n\nexport interface QdrantVectorStoreOptions {\n collection: string;\n}\n\n/**\n * `VectorStore` backed by Qdrant. Pass a `@qdrant/js-client-rest` `QdrantClient`\n * (or a compatible object). The payload stores `content` alongside metadata.\n */\nexport class QdrantVectorStore implements VectorStore {\n constructor(\n private readonly client: QdrantClientLike,\n private readonly options: QdrantVectorStoreOptions,\n ) {}\n\n async upsert(documents: VectorDocument[]): Promise<void> {\n await this.client.upsert(this.options.collection, {\n wait: true,\n points: documents.map((doc) => {\n if (!doc.embedding) {\n throw new Error(`Document \"${doc.id}\" has no embedding.`);\n }\n return {\n id: doc.id,\n vector: doc.embedding,\n payload: { content: doc.content, ...doc.metadata },\n };\n }),\n });\n }\n\n async query(\n embedding: number[],\n options: VectorQueryOptions = {},\n ): Promise<VectorQueryResult[]> {\n const results = await this.client.search(this.options.collection, {\n vector: embedding,\n limit: options.topK ?? 4,\n with_payload: true,\n filter: buildFilter(options.filter),\n });\n return results.map((hit) => {\n const { content, ...metadata } = hit.payload ?? {};\n return {\n id: String(hit.id),\n content: String(content ?? ''),\n score: hit.score,\n metadata: Object.keys(metadata).length ? metadata : undefined,\n };\n });\n }\n\n async delete(ids: string[]): Promise<void> {\n await this.client.delete(this.options.collection, { points: ids });\n }\n\n async clear(): Promise<void> {\n await this.client.delete(this.options.collection, { filter: {} });\n }\n}\n\nfunction buildFilter(filter?: Record<string, unknown>) {\n if (!filter || Object.keys(filter).length === 0) {\n return undefined;\n }\n return {\n must: Object.entries(filter).map(([key, value]) => ({\n key,\n match: { value },\n })),\n };\n}\n","import type {\n VectorDocument,\n VectorQueryOptions,\n VectorQueryResult,\n VectorStore,\n} from '../../vector-store.interface.js';\n\n/** Structural subset of a Pinecone index (namespace) we use. */\nexport interface PineconeIndexLike {\n upsert(\n vectors: Array<{ id: string; values: number[]; metadata?: any }>,\n ): Promise<unknown>;\n query(params: {\n vector: number[];\n topK: number;\n includeMetadata?: boolean;\n filter?: Record<string, unknown>;\n }): Promise<{ matches?: Array<{ id: string; score?: number; metadata?: any }> }>;\n deleteMany(ids: string[]): Promise<unknown>;\n deleteAll(): Promise<unknown>;\n}\n\n/**\n * `VectorStore` backed by Pinecone. Pass a Pinecone index (optionally scoped to\n * a namespace): `pinecone.index('name').namespace('ns')`. `content` is stored in\n * the vector metadata.\n */\nexport class PineconeVectorStore implements VectorStore {\n constructor(private readonly index: PineconeIndexLike) {}\n\n async upsert(documents: VectorDocument[]): Promise<void> {\n await this.index.upsert(\n documents.map((doc) => {\n if (!doc.embedding) {\n throw new Error(`Document \"${doc.id}\" has no embedding.`);\n }\n return {\n id: doc.id,\n values: doc.embedding,\n metadata: { content: doc.content, ...doc.metadata },\n };\n }),\n );\n }\n\n async query(\n embedding: number[],\n options: VectorQueryOptions = {},\n ): Promise<VectorQueryResult[]> {\n const { matches } = await this.index.query({\n vector: embedding,\n topK: options.topK ?? 4,\n includeMetadata: true,\n filter: options.filter,\n });\n return (matches ?? []).map((match) => {\n const { content, ...metadata } = match.metadata ?? {};\n return {\n id: match.id,\n content: String(content ?? ''),\n score: match.score ?? 0,\n metadata: Object.keys(metadata).length ? metadata : undefined,\n };\n });\n }\n\n async delete(ids: string[]): Promise<void> {\n await this.index.deleteMany(ids);\n }\n\n async clear(): Promise<void> {\n await this.index.deleteAll();\n }\n}\n","/** Minimal socket shape (compatible with socket.io's `Socket`). */\nexport interface SocketLike {\n emit(event: string, payload?: unknown): void;\n}\n\n/** A stream result exposing a text stream (from agent `.stream()`). */\nexport interface TextStreamLike {\n textStream: AsyncIterable<string>;\n}\n\nexport interface StreamToSocketOptions {\n chunkEvent?: string;\n doneEvent?: string;\n errorEvent?: string;\n}\n\n/**\n * Forwards an agent text stream to a socket: emits `chunkEvent` per delta, then\n * `doneEvent` with the full text; emits `errorEvent` and rethrows on failure.\n * Framework-agnostic — the WebSocket gateway is thin glue over this.\n */\nexport async function streamAgentToSocket(\n stream: TextStreamLike,\n socket: SocketLike,\n options: StreamToSocketOptions = {},\n): Promise<string> {\n const chunkEvent = options.chunkEvent ?? 'agent:chunk';\n const doneEvent = options.doneEvent ?? 'agent:done';\n const errorEvent = options.errorEvent ?? 'agent:error';\n\n try {\n let text = '';\n for await (const delta of stream.textStream) {\n text += delta;\n socket.emit(chunkEvent, { delta });\n }\n socket.emit(doneEvent, { text });\n return text;\n } catch (error) {\n socket.emit(errorEvent, {\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n"]}
|