@burtson-labs/bandit-engine 2.0.37 → 2.0.39

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.
Files changed (44) hide show
  1. package/dist/{aiProviderStore-UJRDUYOF.mjs → aiProviderStore-XN7GCBHJ.mjs} +2 -2
  2. package/dist/{chat-SZK3EBDO.mjs → chat-5QJNWB7I.mjs} +5 -5
  3. package/dist/chat-provider.js +29 -3
  4. package/dist/chat-provider.js.map +1 -1
  5. package/dist/chat-provider.mjs +4 -4
  6. package/dist/{chunk-2ZZA2IFL.mjs → chunk-3A2527TE.mjs} +3 -3
  7. package/dist/{chunk-FJO5ZWYU.mjs → chunk-CDQYBO3Q.mjs} +26 -8
  8. package/dist/chunk-CDQYBO3Q.mjs.map +1 -0
  9. package/dist/{chunk-PLNFTIGX.mjs → chunk-ECRNIAG6.mjs} +4 -4
  10. package/dist/{chunk-S635Q6OQ.mjs → chunk-EOKIE5HZ.mjs} +24 -3
  11. package/dist/chunk-EOKIE5HZ.mjs.map +1 -0
  12. package/dist/{chunk-G4OXOTNJ.mjs → chunk-JRCDANLN.mjs} +154 -61
  13. package/dist/{chunk-G4OXOTNJ.mjs.map → chunk-JRCDANLN.mjs.map} +1 -1
  14. package/dist/{chunk-ZNNOTDRD.mjs → chunk-QU5S5QQP.mjs} +9 -4
  15. package/dist/chunk-QU5S5QQP.mjs.map +1 -0
  16. package/dist/{chunk-ED5NNDKO.mjs → chunk-QYH2T4L5.mjs} +3 -3
  17. package/dist/{chunk-ZAVV2AT5.mjs → chunk-WO5KFNNW.mjs} +4 -4
  18. package/dist/cli/cli.js +2 -3
  19. package/dist/cli/cli.js.map +1 -1
  20. package/dist/{gateway-Ckf_KusF.d.ts → gateway-B0LJ3-jT.d.mts} +3 -0
  21. package/dist/{gateway-Ckf_KusF.d.mts → gateway-B0LJ3-jT.d.ts} +3 -0
  22. package/dist/index.d.mts +2 -2
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +196 -59
  25. package/dist/index.js.map +1 -1
  26. package/dist/index.mjs +8 -8
  27. package/dist/management/management.js +196 -59
  28. package/dist/management/management.js.map +1 -1
  29. package/dist/management/management.mjs +6 -6
  30. package/dist/modals/chat-modal/chat-modal.js +8 -3
  31. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  32. package/dist/modals/chat-modal/chat-modal.mjs +4 -4
  33. package/dist/public-types.d.mts +1 -1
  34. package/dist/public-types.d.ts +1 -1
  35. package/package.json +2 -3
  36. package/dist/chunk-FJO5ZWYU.mjs.map +0 -1
  37. package/dist/chunk-S635Q6OQ.mjs.map +0 -1
  38. package/dist/chunk-ZNNOTDRD.mjs.map +0 -1
  39. /package/dist/{aiProviderStore-UJRDUYOF.mjs.map → aiProviderStore-XN7GCBHJ.mjs.map} +0 -0
  40. /package/dist/{chat-SZK3EBDO.mjs.map → chat-5QJNWB7I.mjs.map} +0 -0
  41. /package/dist/{chunk-2ZZA2IFL.mjs.map → chunk-3A2527TE.mjs.map} +0 -0
  42. /package/dist/{chunk-PLNFTIGX.mjs.map → chunk-ECRNIAG6.mjs.map} +0 -0
  43. /package/dist/{chunk-ED5NNDKO.mjs.map → chunk-QYH2T4L5.mjs.map} +0 -0
  44. /package/dist/{chunk-ZAVV2AT5.mjs.map → chunk-WO5KFNNW.mjs.map} +0 -0
@@ -744,10 +744,16 @@ import { Observable as Observable5, from as from4, switchMap as switchMap4, map
744
744
  var AnthropicProvider = class {
745
745
  config;
746
746
  baseUrl;
747
+ version;
748
+ defaultMaxTokens;
747
749
  constructor(config) {
748
750
  deprecatedAnthropicProvider();
749
751
  this.config = config;
750
752
  this.baseUrl = config.baseUrl || "https://api.anthropic.com/v1";
753
+ this.version = typeof config.anthropicVersion === "string" && config.anthropicVersion.trim() ? config.anthropicVersion.trim() : "2023-06-01";
754
+ this.defaultMaxTokens = typeof config.anthropicMaxTokens === "number" && config.anthropicMaxTokens > 0 ? config.anthropicMaxTokens : 1024;
755
+ this.config.anthropicVersion = this.version;
756
+ this.config.anthropicMaxTokens = this.defaultMaxTokens;
751
757
  }
752
758
  chat(request) {
753
759
  const url = `${this.baseUrl}/messages`;
@@ -762,7 +768,7 @@ var AnthropicProvider = class {
762
768
  system: systemMessage?.content,
763
769
  stream: Boolean(request.stream),
764
770
  temperature: request.temperature,
765
- max_tokens: request.maxTokens ?? 1e3
771
+ max_tokens: request.maxTokens ?? this.defaultMaxTokens
766
772
  };
767
773
  if (request.stream) {
768
774
  return this.streamChatRequest(url, payload);
@@ -999,7 +1005,7 @@ var AnthropicProvider = class {
999
1005
  }
1000
1006
  getHeaders() {
1001
1007
  const headers = {
1002
- "anthropic-version": "2023-06-01"
1008
+ "anthropic-version": this.version
1003
1009
  };
1004
1010
  if (this.config.apiKey) {
1005
1011
  headers["x-api-key"] = this.config.apiKey;
@@ -2478,7 +2484,6 @@ var AIProviderFactory = class {
2478
2484
  "ollama" /* OLLAMA */,
2479
2485
  "openai" /* OPENAI */,
2480
2486
  "azure-openai" /* AZURE_OPENAI */,
2481
- "anthropic" /* ANTHROPIC */,
2482
2487
  "xai" /* XAI */,
2483
2488
  "gateway" /* GATEWAY */,
2484
2489
  "playground" /* PLAYGROUND */
@@ -2538,4 +2543,4 @@ export {
2538
2543
  AIProviderFactory,
2539
2544
  useAIProviderStore
2540
2545
  };
2541
- //# sourceMappingURL=chunk-ZNNOTDRD.mjs.map
2546
+ //# sourceMappingURL=chunk-QU5S5QQP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store/aiProviderStore.ts","../src/services/ai-provider/providers/ollama.provider.ts","../src/services/ollama/ollama.service.ts","../src/services/ai-provider/providers/deprecated.ts","../src/services/ai-provider/providers/openai.provider.ts","../src/services/ai-provider/providers/azure-openai.provider.ts","../src/services/ai-provider/providers/anthropic.provider.ts","../src/services/ai-provider/providers/gateway.provider.ts","../src/services/gateway/gateway.service.ts","../src/services/gateway/openai-gateway.service.ts","../src/services/gateway/azure-openai-gateway.service.ts","../src/services/gateway/anthropic-gateway.service.ts","../src/services/gateway/ollama-gateway.service.ts","../src/services/ai-provider/providers/playground.provider.ts","../src/services/ai-provider/providers/xai.provider.ts","../src/services/ai-provider/ai-provider.factory.ts"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-A223-4FC2FA\nconst __banditFingerprint_store_aiProviderStorets = 'BL-FP-9F95DD-6297';\nconst __auditTrail_store_aiProviderStorets = 'BL-AU-MGOIKVW3-JR0V';\n// File: aiProviderStore.ts | Path: src/store/aiProviderStore.ts | Hash: a2236297\n\nimport { create, StoreApi, UseBoundStore } from \"zustand\";\nimport { IAIProvider } from \"../services/ai-provider/interfaces/ai-provider.interface\";\nimport { AIProviderConfig } from \"../services/ai-provider/types/common.types\";\nimport { AIProviderFactory } from \"../services/ai-provider/ai-provider.factory\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\nexport interface AIProviderStore {\n /**\n * The current AI provider instance.\n * @type {IAIProvider}\n * @default null\n * @description The provider instance used to interact with AI services.\n * \n * @example\n * const provider = useAIProviderStore((state) => state.provider);\n * const setProvider = useAIProviderStore((state) => state.setProvider);\n * \n * // Create and set an Ollama provider\n * const ollamaConfig = { type: 'ollama', baseUrl: 'http://localhost:11434' };\n * const ollamaProvider = AIProviderFactory.createProvider(ollamaConfig);\n * setProvider(ollamaProvider);\n * \n * @returns {IAIProvider | null} The current AI provider instance.\n */\n provider: IAIProvider | null;\n \n /**\n * The current provider configuration\n */\n config: AIProviderConfig | null;\n \n /**\n * Set the provider and config\n */\n setProvider: (provider: IAIProvider | null, config?: AIProviderConfig | null) => void;\n \n /**\n * Create a new provider from config\n */\n createProvider: (config: AIProviderConfig) => void;\n \n /**\n * Switch to a different provider\n */\n switchProvider: (config: AIProviderConfig) => void;\n}\n\n/**\n * Use for initializing the AI provider.\n * This is a private interface that extends the AIProviderStore interface.\n * This prevents the singleton service from being initialized multiple times.\n */\nexport interface AIProviderStoreInit extends AIProviderStore {\n // Additional methods could be added here if needed for internal initialization\n}\n\nexport const useAIProviderStore = create<AIProviderStore>((set, get) => ({\n provider: null,\n config: null,\n \n setProvider: (provider, config) => set({ provider, config }),\n \n createProvider: (config) => {\n try {\n const provider = AIProviderFactory.createProvider(config);\n set({ provider, config });\n } catch (error) {\n debugLogger.error('Failed to create AI provider:', { error });\n throw error;\n }\n },\n \n switchProvider: (config) => {\n const currentProvider = get().provider;\n try {\n const newProvider = AIProviderFactory.createProvider(config);\n set({ provider: newProvider, config });\n } catch (error) {\n debugLogger.error('Failed to switch AI provider:', { error });\n // Keep the current provider if switching fails\n throw error;\n }\n }\n})) as UseBoundStore<StoreApi<AIProviderStore>>;","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-A59E-4B6F9C\nconst __banditFingerprint_providers_ollamaproviderts = 'BL-FP-89E894-7B5E';\nconst __auditTrail_providers_ollamaproviderts = 'BL-AU-MGOIKVVQ-QJIU';\n// File: ollama.provider.ts | Path: src/services/ai-provider/providers/ollama.provider.ts | Hash: a59e7b5e\n\nimport { Observable, map } from 'rxjs';\nimport { OllamaService } from '../../ollama/ollama.service';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { deprecatedOllamaProvider } from './deprecated';\n\n/**\n * Ollama provider implementation that wraps the existing OllamaService\n */\nexport class OllamaProvider implements IAIProvider {\n private ollamaService: OllamaService;\n private config: AIProviderConfig;\n\n constructor(config: AIProviderConfig) {\n deprecatedOllamaProvider(); // Show info about gateway option for production\n this.config = config;\n const baseUrl = config.baseUrl || 'http://localhost:11434';\n debugLogger.info(\"OllamaProvider: Constructor\", { \n configBaseUrl: config.baseUrl,\n finalBaseUrl: baseUrl,\n hasTokenFactory: !!config.tokenFactory \n });\n this.ollamaService = new OllamaService(\n baseUrl,\n config.tokenFactory || (() => null)\n );\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n // Transform common request to Ollama-specific format\n const ollamaRequest = {\n model: request.model,\n messages: request.messages.map(msg => ({\n role: msg.role as 'system' | 'user' | 'assistant',\n content: msg.content\n })),\n stream: request.stream,\n options: request.options,\n images: request.images\n };\n\n return this.ollamaService.chat(ollamaRequest).pipe(\n map(response => ({\n message: {\n content: response.message.content,\n role: 'assistant' as const\n },\n done: response.done\n }))\n );\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n // Transform common request to Ollama-specific format\n const ollamaRequest = {\n model: request.model,\n prompt: request.prompt,\n stream: request.stream,\n options: request.options\n };\n\n return this.ollamaService.generate(ollamaRequest).pipe(\n map(response => ({\n response: response.response,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n return this.ollamaService.listModels().pipe(\n map(models => models.map(model => ({\n name: model.name,\n size: model.size,\n details: model.details,\n digest: model.digest,\n modified_at: model.modified_at\n })))\n );\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n return this.ollamaService.validateServiceAvailability({\n fallbackUrl: args.fallbackUrl || '',\n timeoutMs: args.timeoutMs\n });\n }\n\n getProviderType(): string {\n return AIProviderType.OLLAMA;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n}","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-6CED-5122D4\nconst __banditFingerprint_ollama_ollamaservicets = 'BL-FP-3B6550-DAFC';\nconst __auditTrail_ollama_ollamaservicets = 'BL-AU-MGOIKVVW-1K0E';\n// File: ollama.service.ts | Path: src/services/ollama/ollama.service.ts | Hash: 6ceddafc\n\nimport { ChatRequest, ChatResponse, GenerateRequest, GenerateResponse, Model, ModelResponse } from \"./interfaces\";\nimport { catchError, from, lastValueFrom, map, Observable, of, shareReplay, switchMap, throwError, timeout } from \"rxjs\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nconst handleError = () => (obs: Observable<Response>) =>\n obs.pipe(\n switchMap((response) =>\n response.ok\n ? of(response)\n : throwError(() => new Error(`Request failed: ${response.status} ${response.statusText}`))\n )\n );\n\nconst parseResponseBody = async <T>(response: Response, responseType: 'json' | 'text'): Promise<T> => {\n if (responseType === 'text') {\n return (await response.text()) as unknown as T;\n }\n return (await response.json()) as T;\n};\n\nexport class OllamaService {\n\n constructor(\n private _baseUrl: string,\n private readonly _tokenFactory: () => string | null\n ) {\n if (!this._baseUrl) {\n this._baseUrl = 'http://localhost:11434'\n debugLogger.warn(`No base URL provided, using default: ${this._baseUrl}`);\n }\n }\n\n\n private _tryGatewayWithTimeout(args: {\n url: string,\n responseType: 'json' | 'text',\n timeoutMs: number,\n }): Observable<boolean> {\n const { url, responseType, timeoutMs } = args;\n const source = this._get(url, responseType)\n const mapped = source.pipe(\n catchError((e) => (e?.message.includes(\"401\") ? of(true) : of(false))),\n map(() => true),\n timeout(timeoutMs),\n );\n return mapped;\n }\n\n /**\n * Validates the availability of the service at the given base URL.\n * @param fallbackUrl The fallback URL to try if the base URL is not available.\n * @returns An object containing the URL and availability status.\n */\n async validateServiceAvailability(args: { fallbackUrl: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n const { fallbackUrl, timeoutMs } = args;\n const responseType = 'text';\n const availablility = {\n url: \"\",\n isAvailable: false,\n }\n try {\n debugLogger.debug(`Validating service availability at ${this._baseUrl}`);\n\n\n\n availablility.url = this._baseUrl;\n availablility.isAvailable = await lastValueFrom(\n this._tryGatewayWithTimeout({\n url: availablility.url,\n responseType,\n timeoutMs,\n })\n ) as boolean;\n if (!availablility.isAvailable) {\n throw new Error(`Service not available at ${this._baseUrl}`);\n }\n\n return availablility;\n } catch (e) {\n debugLogger.warn(`Service not available at ${this._baseUrl}, trying fallback URL: ${fallbackUrl}`);\n try {\n\n availablility.url = fallbackUrl;\n availablility.isAvailable = await lastValueFrom(\n this._tryGatewayWithTimeout({\n url: availablility.url,\n responseType,\n timeoutMs,\n })\n ) as boolean;\n\n if (!availablility.isAvailable) {\n throw new Error(`Service not available at ${fallbackUrl}`);\n }\n this._baseUrl = fallbackUrl;\n return availablility;\n } catch (e) {\n debugLogger.error(`Service not available at fallback URL: ${fallbackUrl}`);\n throw e;\n }\n }\n }\n\n\n generate(request: GenerateRequest): Observable<GenerateResponse> {\n const url = `${this._baseUrl}/api/generate`;\n return new Observable<GenerateResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify({ ...request, stream: request.stream === false ? false : true }),\n });\n task.then(response => {\n this._throwErrorIfNotOk(url, response);\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n if (buffer.trim() !== \"\") {\n try {\n observer.next(JSON.parse(buffer));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Final chunk parsing error (generate):', { buffer });\n }\n }\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n observer.next(JSON.parse(line));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Error parsing JSON line (generate):', { line });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n })\n .catch(err => observer.error(err));\n });\n }\n\n // generate(request: GenerateRequest): Observable<GenerateResponse> {\n // const url = `${this._baseUrl}/api/generate`;\n // return this._post<GenerateRequest, GenerateResponse>(url, request);\n // }\n\n chat(request: ChatRequest): Observable<ChatResponse> {\n const url = `${this._baseUrl}/api/chat`;\n return new Observable<ChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify({ ...request, stream: true }),\n });\n task.then(response => {\n this._throwErrorIfNotOk(url, response);\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n if (buffer.trim() !== \"\") {\n try {\n observer.next(JSON.parse(buffer));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Final chunk parsing error (chat):', { buffer });\n }\n }\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n observer.next(JSON.parse(line));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Error parsing JSON line (chat):', { line });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n })\n .catch(err => observer.error(err));\n });\n }\n\n\n listModels(): Observable<Model[]> {\n const url = `${this._baseUrl}/api/tags`;\n const response = this._get<ModelResponse>(url);\n const result = response.pipe(\n map(data => data.models),\n shareReplay(1));\n return result;\n }\n\n private _get<T>(url: string, responseType: 'json' | 'text' = 'json'): Observable<T> {\n const requestInit = {\n method: 'GET',\n headers: this._getHeaders(),\n }\n\n const response = from(fetch(url, requestInit));\n const handleFetchError = response.pipe(handleError());\n const data = handleFetchError.pipe(switchMap((res) => from(parseResponseBody<T>(res, responseType))));\n const result = data.pipe(shareReplay(1));\n\n return result;\n }\n\n private _post<TRequest, TResponse>(url: string, body: TRequest): Observable<TResponse> {\n const response = from(fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify(body),\n }));\n const handleFetchError = response.pipe(handleError());\n const json = handleFetchError.pipe(switchMap((res) => from(parseResponseBody<TResponse>(res, 'json'))));\n const result = json.pipe(shareReplay(1));\n return result;\n }\n private _throwErrorIfNotOk(url: string, response: Response) {\n if (!response.ok) {\n throw new Error(`POST ${url} failed: ${response.status} ${response.statusText}`);\n }\n }\n private _getHeaders() {\n const token = this._tokenFactory();\n \n if (!token) {\n debugLogger.warn('OllamaService: No token found, using empty string for Authorization header');\n }\n\n return {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token || ''}`\n };\n }\n\n\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-22FF-7E873B\nconst __banditFingerprint_providers_deprecatedts = 'BL-FP-DA6749-9B2A';\nconst __auditTrail_providers_deprecatedts = 'BL-AU-MGOIKVVQ-2ZKO';\n// File: deprecated.ts | Path: src/services/ai-provider/providers/deprecated.ts | Hash: 22ff9b2a\n\nimport { debugLogger } from '../../logging/debugLogger';\nimport { AIProviderConfig } from '../types/common.types';\n\n/**\n * Deprecation notices for direct provider implementations\n * \n * MIGRATION NOTICE: Direct provider implementations are being phased out in favor \n * of the new unified gateway architecture. Please migrate to gateway-based providers\n * for enhanced security, performance, and centralized management.\n * \n * See GATEWAY_MIGRATION_GUIDE.md for migration instructions.\n */\n\n/**\n * @deprecated Use GatewayProvider with provider: 'openai' instead\n * \n * Migration example:\n * ```typescript\n * // Old (deprecated)\n * const config = { type: 'openai', apiKey: 'sk-...', baseUrl: '...' };\n * \n * // New (recommended)\n * const config = { \n * type: 'gateway', \n * gatewayUrl: 'https://your-gateway.com',\n * provider: 'openai',\n * tokenFactory: () => localStorage.getItem('authToken')\n * };\n * ```\n */\nexport function deprecatedOpenAIProvider() {\n debugLogger.warn('⚠️ DEPRECATION WARNING: Direct OpenAI provider is deprecated. Please migrate to GatewayProvider with provider: \"openai\". See GATEWAY_MIGRATION_GUIDE.md for details.');\n}\n\n/**\n * @deprecated Use GatewayProvider with provider: 'azure-openai' instead\n * \n * Migration example:\n * ```typescript\n * // Old (deprecated)\n * const config = { \n * type: 'azure-openai', \n * baseUrl: 'https://your-resource.openai.azure.com',\n * apiKey: 'your-key',\n * apiVersion: '2024-02-15-preview',\n * deploymentName: 'gpt-4'\n * };\n * \n * // New (recommended)\n * const config = { \n * type: 'gateway', \n * gatewayUrl: 'https://your-gateway.com',\n * provider: 'azure-openai',\n * deploymentName: 'gpt-4',\n * apiVersion: '2024-02-15-preview',\n * tokenFactory: () => localStorage.getItem('authToken')\n * };\n * ```\n */\nexport function deprecatedAzureOpenAIProvider() {\n debugLogger.warn('⚠️ DEPRECATION WARNING: Direct Azure OpenAI provider is deprecated. Please migrate to GatewayProvider with provider: \"azure-openai\". See GATEWAY_MIGRATION_GUIDE.md for details.');\n}\n\n/**\n * @deprecated Use GatewayProvider with provider: 'anthropic' instead\n * \n * Migration example:\n * ```typescript\n * // Old (deprecated)\n * const config = { type: 'anthropic', apiKey: 'sk-ant-...', baseUrl: '...' };\n * \n * // New (recommended)\n * const config = { \n * type: 'gateway', \n * gatewayUrl: 'https://your-gateway.com',\n * provider: 'anthropic',\n * tokenFactory: () => localStorage.getItem('authToken')\n * };\n * ```\n */\nexport function deprecatedAnthropicProvider() {\n debugLogger.warn('⚠️ DEPRECATION WARNING: Direct Anthropic provider is deprecated. Please migrate to GatewayProvider with provider: \"anthropic\". See GATEWAY_MIGRATION_GUIDE.md for details.');\n}\n\n/**\n * @deprecated Use GatewayProvider with provider: 'ollama' instead for production environments\n * \n * Note: The direct Ollama provider will remain available for local development,\n * but for production deployments, use the gateway for better management.\n * \n * Migration example:\n * ```typescript\n * // Development (still supported)\n * const config = { type: 'ollama', baseUrl: 'http://localhost:11434' };\n * \n * // Production (recommended)\n * const config = { \n * type: 'gateway', \n * gatewayUrl: 'https://your-gateway.com',\n * provider: 'ollama',\n * tokenFactory: () => localStorage.getItem('authToken')\n * };\n * ```\n */\nexport function deprecatedOllamaProvider() {\n debugLogger.info('ℹ️ INFO: Direct Ollama provider is available for local development. For production environments, consider using GatewayProvider with provider: \"ollama\" for enhanced management. See GATEWAY_MIGRATION_GUIDE.md for details.');\n}\n\n/**\n * Display deprecation summary\n */\nexport function showDeprecationSummary() {\n debugLogger.warn(`\n🏗️ BANDIT ENGINE PROVIDER ARCHITECTURE UPDATE\n\nThe Bandit Engine is transitioning to a unified gateway architecture for enhanced:\n• Security (centralized API key management)\n• Performance (connection pooling, caching)\n• Monitoring (unified logging, health checks)\n• Scaling (load balancing, failover)\n\nMIGRATION REQUIRED:\n• OpenAI Provider → GatewayProvider (provider: 'openai')\n• Azure OpenAI Provider → GatewayProvider (provider: 'azure-openai') \n• Anthropic Provider → GatewayProvider (provider: 'anthropic')\n\nMIGRATION RECOMMENDED:\n• Ollama Provider → GatewayProvider (provider: 'ollama') for production\n\n📖 Full migration guide: GATEWAY_MIGRATION_GUIDE.md\n🆘 Need help? Check the troubleshooting section in the migration guide\n `);\n}\n\n/**\n * Check if provider config is using deprecated direct provider\n */\nexport function isDeprecatedProvider(config: AIProviderConfig | undefined): boolean {\n const deprecatedTypes = ['openai', 'azure-openai', 'anthropic'];\n return deprecatedTypes.includes(config?.type);\n}\n\n/**\n * Suggest gateway migration for deprecated config\n */\nexport function suggestGatewayMigration(config: AIProviderConfig): AIProviderConfig {\n if (!isDeprecatedProvider(config)) {\n return config; // No migration needed\n }\n\n const gatewayConfig: AIProviderConfig = {\n type: 'gateway',\n gatewayUrl: '${GATEWAY_URL}', // Replace with your gateway URL\n provider: config.type as 'openai' | 'azure-openai' | 'anthropic' | 'ollama',\n tokenFactory: () => localStorage.getItem('authToken')\n };\n\n // Preserve Azure-specific config\n if (config.type === 'azure-openai') {\n gatewayConfig.deploymentName = config.deploymentName;\n gatewayConfig.apiVersion = config.apiVersion;\n }\n\n debugLogger.info('🔄 Suggested gateway migration:', {\n from: config,\n to: gatewayConfig\n });\n\n return gatewayConfig;\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E7EE-93DC85\nconst __banditFingerprint_providers_openaiproviderts = 'BL-FP-7E2188-DCC5';\nconst __auditTrail_providers_openaiproviderts = 'BL-AU-MGOIKVVQ-8GVP';\n// File: openai.provider.ts | Path: src/services/ai-provider/providers/openai.provider.ts | Hash: e7eedcc5\n\nimport { Observable, from, switchMap, map, throwError } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { deprecatedOpenAIProvider } from './deprecated';\n\ninterface OpenAIChatPayload {\n model: string;\n messages: AIChatRequest['messages'];\n stream: boolean;\n temperature?: number;\n max_tokens?: number;\n}\n\ninterface OpenAIStreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n };\n }>;\n}\n\ninterface OpenAIChatResponsePayload {\n choices?: Array<{\n message?: {\n content?: string;\n };\n }>;\n}\n\ninterface OpenAIModelListResponse {\n data: Array<{\n id: string;\n object?: string;\n }>;\n}\n\n/**\n * OpenAI provider implementation\n */\nexport class OpenAIProvider implements IAIProvider {\n private config: AIProviderConfig;\n private baseUrl: string;\n\n constructor(config: AIProviderConfig) {\n deprecatedOpenAIProvider(); // Show deprecation warning\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const url = `${this.baseUrl}/chat/completions`;\n \n const payload: OpenAIChatPayload = {\n model: request.model,\n messages: request.messages,\n stream: Boolean(request.stream),\n temperature: request.temperature,\n max_tokens: request.maxTokens\n };\n\n if (request.stream) {\n return this.streamChatRequest(url, payload);\n } else {\n return this.nonStreamChatRequest(url, payload);\n }\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n // For OpenAI, we'll use the chat endpoint with a single user message\n const chatRequest: AIChatRequest = {\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n stream: request.stream,\n options: request.options\n };\n\n return this.chat(chatRequest).pipe(\n map(response => ({\n response: response.message.content,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n const url = `${this.baseUrl}/models`;\n \n return from(fetch(url, {\n headers: this.getHeaders()\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`Failed to list models: ${response.status}`));\n }\n return from(response.json() as Promise<OpenAIModelListResponse>);\n }),\n map((data) =>\n data.data.map((model) => ({\n name: model.id,\n details: {\n format: 'openai',\n family: model.object\n }\n }))\n )\n );\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${this.baseUrl}/models`, {\n headers: this.getHeaders(),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: this.baseUrl,\n isAvailable: response.ok\n };\n } catch (error) {\n if (args.fallbackUrl) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${args.fallbackUrl}/models`, {\n headers: this.getHeaders(),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n this.baseUrl = args.fallbackUrl;\n return {\n url: args.fallbackUrl,\n isAvailable: true\n };\n }\n } catch (fallbackError) {\n // Fall through to return unavailable\n }\n }\n\n return {\n url: this.baseUrl,\n isAvailable: false\n };\n }\n }\n\n getProviderType(): string {\n return AIProviderType.OPENAI;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private streamChatRequest(url: string, payload: OpenAIChatPayload): Observable<AIChatResponse> {\n return new Observable<AIChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n task.then(response => {\n if (!response.ok) {\n observer.error(new Error(`OpenAI request failed: ${response.status}`));\n return;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim() && line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as OpenAIStreamChunk;\n const content = parsed.choices?.[0]?.delta?.content ?? '';\n if (content) {\n observer.next({\n message: { content, role: 'assistant' },\n done: false\n });\n }\n } catch (err) {\n debugLogger.error('Error parsing OpenAI stream data:', { data, error: err });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n }).catch(err => observer.error(err));\n });\n }\n\n private nonStreamChatRequest(url: string, payload: OpenAIChatPayload): Observable<AIChatResponse> {\n return from(fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`OpenAI request failed: ${response.status}`));\n }\n return from(response.json() as Promise<OpenAIChatResponsePayload>);\n }),\n map((data) => ({\n message: {\n content: data.choices?.[0]?.message?.content ?? '',\n role: 'assistant' as const\n },\n done: true\n }))\n );\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n \n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n return headers;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4A56-02BF87\nconst __banditFingerprint_providers_azureopenaiproviderts = 'BL-FP-51FF06-B29D';\nconst __auditTrail_providers_azureopenaiproviderts = 'BL-AU-MGOIKVVQ-070A';\n// File: azure-openai.provider.ts | Path: src/services/ai-provider/providers/azure-openai.provider.ts | Hash: 4a56b29d\n\nimport { Observable, from, switchMap, map, throwError } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { deprecatedAzureOpenAIProvider } from './deprecated';\n\ninterface AzureChatPayload {\n messages: AIChatRequest['messages'];\n stream: boolean;\n temperature?: number;\n max_tokens?: number;\n}\n\ninterface OpenAIStreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n };\n }>;\n}\n\ninterface OpenAIChatResponsePayload {\n choices?: Array<{\n message?: {\n content?: string;\n };\n }>;\n}\n/**\n * Azure OpenAI provider implementation\n */\nexport class AzureOpenAIProvider implements IAIProvider {\n private config: AIProviderConfig;\n private baseUrl: string;\n\n constructor(config: AIProviderConfig) {\n deprecatedAzureOpenAIProvider(); // Show deprecation warning\n this.config = config;\n if (!config.baseUrl || !config.deploymentName || !config.apiVersion) {\n throw new Error('Azure OpenAI requires baseUrl, deploymentName, and apiVersion');\n }\n this.baseUrl = config.baseUrl;\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const url = `${this.baseUrl}/openai/deployments/${this.config.deploymentName}/chat/completions?api-version=${this.config.apiVersion}`;\n \n const payload: AzureChatPayload = {\n messages: request.messages,\n stream: Boolean(request.stream),\n temperature: request.temperature,\n max_tokens: request.maxTokens\n };\n\n if (request.stream) {\n return this.streamChatRequest(url, payload);\n } else {\n return this.nonStreamChatRequest(url, payload);\n }\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n // For Azure OpenAI, we'll use the chat endpoint with a single user message\n const chatRequest: AIChatRequest = {\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n stream: request.stream,\n options: request.options\n };\n\n return this.chat(chatRequest).pipe(\n map(response => ({\n response: response.message.content,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n // Azure OpenAI doesn't have a direct models endpoint, return the deployment as a model\n const model: AIModel = {\n name: this.config.deploymentName || 'azure-deployment',\n details: {\n format: 'azure-openai',\n family: 'gpt'\n }\n };\n\n return new Observable<AIModel[]>(observer => {\n observer.next([model]);\n observer.complete();\n });\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n // Test with a simple chat request\n const testUrl = `${this.baseUrl}/openai/deployments/${this.config.deploymentName}/chat/completions?api-version=${this.config.apiVersion}`;\n const response = await fetch(testUrl, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n messages: [{ role: 'user', content: 'test' }],\n max_tokens: 1\n }),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: this.baseUrl,\n isAvailable: response.ok || response.status === 400 // 400 might be expected for the test\n };\n } catch (error) {\n if (args.fallbackUrl) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const testUrl = `${args.fallbackUrl}/openai/deployments/${this.config.deploymentName}/chat/completions?api-version=${this.config.apiVersion}`;\n const response = await fetch(testUrl, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n messages: [{ role: 'user', content: 'test' }],\n max_tokens: 1\n }),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok || response.status === 400) {\n this.baseUrl = args.fallbackUrl;\n return {\n url: args.fallbackUrl,\n isAvailable: true\n };\n }\n } catch (fallbackError) {\n // Fall through to return unavailable\n }\n }\n\n return {\n url: this.baseUrl,\n isAvailable: false\n };\n }\n }\n\n getProviderType(): string {\n return AIProviderType.AZURE_OPENAI;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private streamChatRequest(url: string, payload: AzureChatPayload): Observable<AIChatResponse> {\n return new Observable<AIChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n task.then(response => {\n if (!response.ok) {\n observer.error(new Error(`Azure OpenAI request failed: ${response.status}`));\n return;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim() && line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as OpenAIStreamChunk;\n const content = parsed.choices?.[0]?.delta?.content ?? '';\n if (content) {\n observer.next({\n message: { content, role: 'assistant' },\n done: false\n });\n }\n } catch (err) {\n debugLogger.error('Error parsing Azure OpenAI stream data:', { data, error: err });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n }).catch(err => observer.error(err));\n });\n }\n\n private nonStreamChatRequest(url: string, payload: AzureChatPayload): Observable<AIChatResponse> {\n return from(fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`Azure OpenAI request failed: ${response.status}`));\n }\n return from(response.json() as Promise<OpenAIChatResponsePayload>);\n }),\n map((data) => {\n const content = data.choices?.[0]?.message?.content ?? '';\n return {\n message: {\n content,\n role: 'assistant' as const\n },\n done: true\n };\n })\n );\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n \n if (this.config.apiKey) {\n headers['api-key'] = this.config.apiKey;\n }\n\n return headers;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-8631-D26CFA\nconst __banditFingerprint_providers_anthropicproviderts = 'BL-FP-B138E7-AB87';\nconst __auditTrail_providers_anthropicproviderts = 'BL-AU-MGOIKVVP-762R';\n// File: anthropic.provider.ts | Path: src/services/ai-provider/providers/anthropic.provider.ts | Hash: 8631ab87\n\nimport { Observable, from, switchMap, map, throwError } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { deprecatedAnthropicProvider } from './deprecated';\n\ntype AnthropicRole = 'user' | 'assistant';\n\ninterface AnthropicChatMessagePayload {\n role: AnthropicRole;\n content: string;\n}\n\ninterface AnthropicChatPayload {\n model: string;\n messages: AnthropicChatMessagePayload[];\n system?: string;\n stream: boolean;\n temperature?: number;\n max_tokens: number;\n}\n\ninterface AnthropicStreamChunk {\n delta?: {\n text?: string;\n };\n}\n\ninterface AnthropicChatResponsePayload {\n content?: unknown;\n completion?: string;\n message?: {\n content?: string;\n };\n}\n\n/**\n * Anthropic provider implementation for direct API access\n */\nexport class AnthropicProvider implements IAIProvider {\n private config: AIProviderConfig;\n private baseUrl: string;\n private version: string;\n private defaultMaxTokens: number;\n\n constructor(config: AIProviderConfig) {\n deprecatedAnthropicProvider(); // Show deprecation warning\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://api.anthropic.com/v1';\n this.version = typeof config.anthropicVersion === 'string' && config.anthropicVersion.trim()\n ? config.anthropicVersion.trim()\n : '2023-06-01';\n this.defaultMaxTokens =\n typeof config.anthropicMaxTokens === 'number' && config.anthropicMaxTokens > 0\n ? config.anthropicMaxTokens\n : 1024;\n this.config.anthropicVersion = this.version;\n this.config.anthropicMaxTokens = this.defaultMaxTokens;\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const url = `${this.baseUrl}/messages`;\n \n // Convert system messages to Anthropic format\n const systemMessage = request.messages.find(msg => msg.role === 'system');\n const userMessages = request.messages.filter(msg => msg.role !== 'system');\n \n const payload: AnthropicChatPayload = {\n model: request.model,\n messages: userMessages.map(msg => ({\n role: msg.role === 'user' ? 'user' : 'assistant',\n content: msg.content\n })),\n system: systemMessage?.content,\n stream: Boolean(request.stream),\n temperature: request.temperature,\n max_tokens: request.maxTokens ?? this.defaultMaxTokens\n };\n\n if (request.stream) {\n return this.streamChatRequest(url, payload);\n } else {\n return this.nonStreamChatRequest(url, payload);\n }\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n // For Anthropic, we'll use the messages endpoint with a single user message\n const chatRequest: AIChatRequest = {\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n stream: request.stream,\n options: request.options\n };\n\n return this.chat(chatRequest).pipe(\n map(response => ({\n response: response.message.content,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n // Anthropic doesn't have a public models endpoint, return common models\n const commonModels: AIModel[] = [\n {\n name: 'claude-3-5-sonnet-20241022',\n details: {\n format: 'anthropic',\n family: 'claude-3.5'\n }\n },\n {\n name: 'claude-3-5-haiku-20241022',\n details: {\n format: 'anthropic',\n family: 'claude-3.5'\n }\n },\n {\n name: 'claude-3-opus-20240229',\n details: {\n format: 'anthropic',\n family: 'claude-3'\n }\n },\n {\n name: 'claude-3-sonnet-20240229',\n details: {\n format: 'anthropic',\n family: 'claude-3'\n }\n },\n {\n name: 'claude-3-haiku-20240307',\n details: {\n format: 'anthropic',\n family: 'claude-3'\n }\n }\n ];\n\n return new Observable<AIModel[]>(observer => {\n observer.next(commonModels);\n observer.complete();\n });\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n // Test with a simple messages request\n const response = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: 'claude-3-haiku-20240307',\n messages: [{ role: 'user', content: 'test' }],\n max_tokens: 1\n }),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: this.baseUrl,\n isAvailable: response.ok || response.status === 400 // 400 might be expected for the test\n };\n } catch (error) {\n if (args.fallbackUrl) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${args.fallbackUrl}/messages`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: 'claude-3-haiku-20240307',\n messages: [{ role: 'user', content: 'test' }],\n max_tokens: 1\n }),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok || response.status === 400) {\n this.baseUrl = args.fallbackUrl;\n return {\n url: args.fallbackUrl,\n isAvailable: true\n };\n }\n } catch (fallbackError) {\n // Fall through to return unavailable\n }\n }\n\n return {\n url: this.baseUrl,\n isAvailable: false\n };\n }\n }\n\n getProviderType(): string {\n return AIProviderType.ANTHROPIC;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private streamChatRequest(url: string, payload: AnthropicChatPayload): Observable<AIChatResponse> {\n return new Observable<AIChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n task.then(response => {\n if (!response.ok) {\n observer.error(new Error(`Anthropic request failed: ${response.status}`));\n return;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim() && line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as AnthropicStreamChunk;\n // Anthropic streaming format may differ, adjust as needed\n const content = parsed.delta?.text || '';\n if (content) {\n observer.next({\n message: { content, role: 'assistant' },\n done: false\n });\n }\n } catch (err) {\n debugLogger.error('Error parsing Anthropic stream data:', { data, error: err });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n }).catch(err => observer.error(err));\n });\n }\n\n private nonStreamChatRequest(url: string, payload: AnthropicChatPayload): Observable<AIChatResponse> {\n return from(fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`Anthropic request failed: ${response.status}`));\n }\n return from(response.json() as Promise<AnthropicChatResponsePayload>);\n }),\n map((data) => ({\n message: {\n content: this.extractContentText(data),\n role: 'assistant' as const\n },\n done: true\n }))\n );\n }\n\n private extractContentText(payload: AnthropicChatResponsePayload): string {\n const { content } = payload;\n\n if (Array.isArray(content)) {\n for (const entry of content) {\n if (typeof entry === 'string') {\n return entry;\n }\n if (entry && typeof entry === 'object' && 'text' in entry) {\n const text = (entry as { text?: unknown }).text;\n if (typeof text === 'string') {\n return text;\n }\n }\n }\n } else if (typeof content === 'string') {\n return content;\n }\n\n if (typeof payload.completion === 'string') {\n return payload.completion;\n }\n\n if (payload.message && typeof payload.message.content === 'string') {\n return payload.message.content;\n }\n\n return '';\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'anthropic-version': this.version\n };\n \n if (this.config.apiKey) {\n headers['x-api-key'] = this.config.apiKey;\n }\n\n return headers;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-0C91-217979\nconst __banditFingerprint_providers_gatewayproviderts = 'BL-FP-4F2F4F-2A21';\nconst __auditTrail_providers_gatewayproviderts = 'BL-AU-MGOIKVVQ-MHFK';\n// File: gateway.provider.ts | Path: src/services/ai-provider/providers/gateway.provider.ts | Hash: 0c912a21\n\nimport { Observable, map } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { GatewayService } from '../../gateway/gateway.service';\nimport { OpenAIGatewayService } from '../../gateway/openai-gateway.service';\nimport { AzureOpenAIGatewayService } from '../../gateway/azure-openai-gateway.service';\nimport { AnthropicGatewayService } from '../../gateway/anthropic-gateway.service';\nimport { OllamaGatewayService } from '../../gateway/ollama-gateway.service';\nimport { \n GatewayChatRequest,\n GatewayMessage,\n GatewayMessageContent\n} from '../../gateway/interfaces';\n\n/**\n * Gateway provider implementation that routes requests through the .NET gateway API\n * This consolidates all AI provider logic behind a single gateway endpoint\n */\nexport class GatewayProvider implements IAIProvider {\n private config: AIProviderConfig;\n private gatewayService: GatewayService;\n private providerSpecificService: OpenAIGatewayService | AzureOpenAIGatewayService | AnthropicGatewayService | OllamaGatewayService | null = null;\n\n constructor(config: AIProviderConfig) {\n this.config = config;\n \n if (!config.gatewayUrl) {\n throw new Error('Gateway provider requires gatewayUrl in config');\n }\n \n if (!config.provider) {\n throw new Error('Gateway provider requires provider field to specify backend (openai, azure-openai, anthropic, ollama)');\n }\n\n const tokenFactory = config.tokenFactory || (() => null);\n this.gatewayService = new GatewayService(config.gatewayUrl, tokenFactory);\n\n // Create provider-specific service for enhanced functionality\n this.createProviderSpecificService(config.gatewayUrl, tokenFactory);\n\n debugLogger.info('GatewayProvider initialized', { \n gatewayUrl: config.gatewayUrl,\n backendProvider: config.provider\n });\n }\n\n private createProviderSpecificService(gatewayUrl: string, tokenFactory: () => string | null) {\n switch (this.config.provider) {\n case 'openai':\n this.providerSpecificService = new OpenAIGatewayService(gatewayUrl, tokenFactory);\n break;\n case 'azure-openai':\n if (!this.config.deploymentName || !this.config.apiVersion) {\n throw new Error('Azure OpenAI gateway provider requires deploymentName and apiVersion');\n }\n this.providerSpecificService = new AzureOpenAIGatewayService(\n gatewayUrl, \n tokenFactory,\n {\n deploymentName: this.config.deploymentName,\n apiVersion: this.config.apiVersion\n }\n );\n break;\n case 'anthropic':\n this.providerSpecificService = new AnthropicGatewayService(gatewayUrl, tokenFactory);\n break;\n case 'ollama':\n this.providerSpecificService = new OllamaGatewayService(gatewayUrl, tokenFactory);\n break;\n default:\n debugLogger.warn('Unknown provider for gateway, using generic gateway service', { \n provider: this.config.provider \n });\n }\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n // Convert AI request to standardized gateway request format\n // The gateway API will handle provider-specific transformations\n \n const messages: GatewayMessage[] = request.messages.map(msg => ({\n role: msg.role,\n content: msg.content\n }));\n \n // Handle images based on provider type\n if (request.images && request.images.length > 0) {\n const lastUserMessageIndex = messages.map(m => m.role).lastIndexOf('user');\n \n if (this.config.provider === 'ollama') {\n // Ollama: attach images directly to the last user message\n if (lastUserMessageIndex !== -1) {\n messages[lastUserMessageIndex] = {\n ...messages[lastUserMessageIndex],\n images: request.images\n };\n }\n } else if (['openai', 'azure-openai', 'anthropic'].includes(this.config.provider || '')) {\n // OpenAI/Azure/Anthropic: convert to structured content format\n if (lastUserMessageIndex !== -1) {\n const currentMessage = messages[lastUserMessageIndex];\n const contentArray: GatewayMessageContent[] = [\n {\n type: 'text',\n text: currentMessage.content as string\n }\n ];\n \n // Add images as image_url content\n request.images.forEach(base64Image => {\n contentArray.push({\n type: 'image_url',\n image_url: {\n url: base64Image.startsWith('data:') ? base64Image : `data:image/jpeg;base64,${base64Image}`,\n detail: 'auto'\n }\n });\n });\n \n messages[lastUserMessageIndex] = {\n ...messages[lastUserMessageIndex],\n content: contentArray\n };\n }\n }\n }\n \n const gatewayRequest: GatewayChatRequest = {\n model: request.model,\n messages,\n stream: request.stream,\n temperature: request.temperature,\n max_tokens: request.maxTokens,\n provider: this.config.provider,\n // Only include top-level images for Ollama (fallback)\n images: this.config.provider === 'ollama' ? request.images : undefined\n };\n\n debugLogger.debug('Gateway provider chat request', { \n model: request.model,\n provider: this.config.provider,\n messageCount: request.messages.length,\n stream: request.stream,\n hasImages: !!(request.images && request.images.length > 0),\n imageCount: request.images?.length || 0,\n imageStrategy: this.config.provider === 'ollama' \n ? 'message-level-array' \n : ['openai', 'azure-openai', 'anthropic'].includes(this.config.provider || '')\n ? 'structured-content'\n : 'top-level-fallback',\n finalMessages: messages.map(m => ({ \n role: m.role, \n hasImages: Array.isArray(m.images) && m.images.length > 0,\n contentType: Array.isArray(m.content) ? 'structured' : 'text'\n }))\n });\n\n return this.gatewayService.chat(gatewayRequest).pipe(\n map(response => ({\n message: {\n content: response.choices?.[0]?.message?.content || \n response.choices?.[0]?.delta?.content || '',\n role: 'assistant' as const\n },\n done: response.choices?.[0]?.finish_reason === 'stop' || response.choices?.[0]?.finish_reason === 'length'\n }))\n );\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n const gatewayRequest = {\n model: request.model,\n prompt: request.prompt,\n stream: request.stream,\n provider: this.config.provider\n };\n\n debugLogger.debug('Gateway provider generate request', { \n model: request.model,\n provider: this.config.provider,\n promptLength: request.prompt.length,\n stream: request.stream \n });\n\n return this.gatewayService.generate(gatewayRequest).pipe(\n map(response => ({\n response: response.response || '',\n done: response.done || false\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n debugLogger.debug('Gateway provider listing models', { provider: this.config.provider });\n \n if (this.config.provider) {\n return this.gatewayService.listModelsByProvider(this.config.provider).pipe(\n map(models => models.map(model => ({\n name: model.id || model.name,\n size: model.size,\n details: model.details,\n digest: model.digest,\n modified_at: model.modified_at\n })))\n );\n } else {\n // List all models from all providers\n return this.gatewayService.listModels().pipe(\n map(models => models.map(model => ({\n name: model.id || model.name,\n size: model.size,\n details: model.details,\n digest: model.digest,\n modified_at: model.modified_at\n })))\n );\n }\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n debugLogger.debug('Gateway provider validating service availability');\n return this.gatewayService.validateServiceAvailability(args);\n }\n\n getProviderType(): string {\n return AIProviderType.GATEWAY;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n /**\n * Get the backend provider type\n */\n getBackendProvider(): string | undefined {\n return this.config.provider;\n }\n\n /**\n * Get gateway health including backend provider status\n */\n getHealth() {\n return this.gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n backend_provider: this.config.provider,\n backend_provider_status: health.providers.find(p => p.name === this.config.provider)?.status || 'unavailable'\n }))\n );\n }\n\n /**\n * Use provider-specific service if available for enhanced functionality\n */\n getProviderSpecificService(): OpenAIGatewayService | AzureOpenAIGatewayService | AnthropicGatewayService | OllamaGatewayService | null {\n return this.providerSpecificService;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-809E-685A92\nconst __banditFingerprint_gateway_gatewayservicets = 'BL-FP-6DB2F9-8464';\nconst __auditTrail_gateway_gatewayservicets = 'BL-AU-MGOIKVVT-6725';\n// File: gateway.service.ts | Path: src/services/gateway/gateway.service.ts | Hash: 809e8464\n\nimport axios, { AxiosError, AxiosHeaders, AxiosInstance } from \"axios\";\nimport {\n GatewayChatRequest,\n GatewayChatResponse,\n GatewayGenerateRequest,\n GatewayGenerateResponse,\n GatewayModel,\n GatewayModelsResponse,\n GatewayHealthResponse,\n GatewayMemoryResponse\n} from \"./interfaces\";\nimport { FeedbackRequest, FeedbackResponse } from \"./feedback.interfaces\";\nimport { catchError, from, lastValueFrom, map, Observable, of, shareReplay, timeout } from \"rxjs\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\ninterface GatewayHttpErrorResponse {\n status: number;\n statusText: string;\n data: unknown;\n url: string;\n}\n\ntype GatewayHttpError = Error & { response: GatewayHttpErrorResponse };\n\nexport class GatewayService {\n private readonly _client: AxiosInstance;\n\n constructor(\n private _baseUrl: string,\n private readonly _tokenFactory: () => string | null,\n private readonly _feedbackEmail?: string\n ) {\n if (!this._baseUrl) {\n this._baseUrl = 'http://localhost:5000'\n debugLogger.warn(`No gateway URL provided, using default: ${this._baseUrl}`);\n }\n \n // Ensure baseUrl doesn't end with slash\n this._baseUrl = this._baseUrl.replace(/\\/$/, '');\n\n // Remove /api suffix if it exists to avoid double /api/api paths\n if (this._baseUrl.endsWith('/api')) {\n this._baseUrl = this._baseUrl.slice(0, -4);\n debugLogger.info(`Removed /api suffix from gateway URL: ${this._baseUrl}`);\n }\n\n this._client = this._createAxiosClient();\n }\n\n private _createAxiosClient(): AxiosInstance {\n const instance = axios.create({\n baseURL: this._baseUrl,\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n\n instance.interceptors.request.use((config) => {\n const token = this._tokenFactory();\n const headers = AxiosHeaders.from(config.headers ?? {});\n\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n\n if (token && token.trim()) {\n headers.set('Authorization', `Bearer ${token}`);\n } else if (headers.has('Authorization')) {\n headers.delete('Authorization');\n }\n\n config.headers = headers;\n return config;\n });\n\n instance.interceptors.response.use(\n (response) => response,\n (error) => Promise.reject(this._normalizeAxiosError(error))\n );\n\n return instance;\n }\n\n private _normalizeAxiosError(error: AxiosError): Error {\n if (error.response) {\n return this._createHttpError(\n `Request failed: ${error.response.status} ${error.response.statusText ?? \"\"}`,\n {\n status: error.response.status,\n statusText: error.response.statusText ?? \"\",\n data: error.response.data,\n url: error.config?.url ?? \"\"\n }\n );\n }\n\n if (error.request) {\n return new Error(`No response received from gateway: ${error.message}`);\n }\n\n return new Error(error.message);\n }\n\n private _createHttpError(message: string, response: GatewayHttpErrorResponse): GatewayHttpError {\n return Object.assign(new Error(message), { response }) as GatewayHttpError;\n }\n\n private _setBaseUrl(url: string) {\n this._baseUrl = url;\n this._client.defaults.baseURL = url;\n }\n\n private _tryGatewayWithTimeout(args: {\n url: string,\n responseType: 'json' | 'text',\n timeoutMs: number,\n }): Observable<boolean> {\n const { url, responseType, timeoutMs } = args;\n const source = this._get(url, responseType)\n const mapped = source.pipe(\n catchError((e) => (e?.message.includes(\"401\") ? of(true) : of(false))),\n map(() => true),\n timeout(timeoutMs),\n );\n return mapped;\n }\n\n /**\n * Validates the availability of the gateway service.\n * @param fallbackUrl The fallback URL to try if the base URL is not available.\n * @returns An object containing the URL and availability status.\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n const { fallbackUrl, timeoutMs } = args;\n const responseType = 'json';\n const availability = {\n url: \"\",\n isAvailable: false,\n }\n\n try {\n debugLogger.debug(`Validating gateway service availability at ${this._baseUrl}`);\n\n availability.url = this._baseUrl;\n availability.isAvailable = await lastValueFrom(\n this._tryGatewayWithTimeout({\n url: `${availability.url}/api/health`,\n responseType,\n timeoutMs,\n })\n ) as boolean;\n \n if (!availability.isAvailable) {\n throw new Error(`Gateway service not available at ${this._baseUrl}`);\n }\n\n return availability;\n } catch (e) {\n if (fallbackUrl) {\n debugLogger.warn(`Gateway service not available at ${this._baseUrl}, trying fallback URL: ${fallbackUrl}`);\n try {\n availability.url = fallbackUrl.replace(/\\/$/, '');\n availability.isAvailable = await lastValueFrom(\n this._tryGatewayWithTimeout({\n url: `${availability.url}/api/health`,\n responseType,\n timeoutMs,\n })\n ) as boolean;\n\n if (!availability.isAvailable) {\n throw new Error(`Gateway service not available at ${fallbackUrl}`);\n }\n \n this._setBaseUrl(availability.url);\n return availability;\n } catch (e) {\n debugLogger.error(`Gateway service not available at fallback URL: ${fallbackUrl}`);\n throw e;\n }\n } else {\n debugLogger.error(`Gateway service not available and no fallback URL provided`);\n throw e;\n }\n }\n }\n\n /**\n * Get gateway health status and available providers\n */\n getHealth(): Observable<GatewayHealthResponse> {\n const url = `${this._baseUrl}/api/health`;\n return this._get<GatewayHealthResponse>(url);\n }\n\n /**\n * Chat completion using the gateway API\n */\n chat(request: GatewayChatRequest): Observable<GatewayChatResponse> {\n // Use provider-specific endpoint if provider is specified\n // For Ollama specifically, use /chat instead of /chat/completions\n const endpoint = request.provider === 'ollama' \n ? `/api/${request.provider}/chat`\n : request.provider \n ? `/api/${request.provider}/chat/completions` \n : '/api/chat/completions';\n const url = `${this._baseUrl}${endpoint}`;\n \n debugLogger.debug(`Gateway chat request to ${url} with provider: ${request.provider || 'default'}`, {\n model: request.model,\n messageCount: request.messages.length,\n hasImages: !!(request.images && request.images.length > 0),\n imageCount: request.images?.length || 0\n });\n \n \n const requestBody = { ...request, stream: request.stream !== false };\n \n return new Observable<GatewayChatResponse>(observer => {\n const controller = new AbortController();\n const task = fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n });\n \n task.then(async (response) => {\n \n debugLogger.debug(`Gateway chat response status: ${response.status} for provider: ${request.provider || 'default'}`);\n \n if (!response.ok) {\n // Handle error response properly with body parsing\n let errorText = '';\n let errorData: unknown = null;\n \n try {\n // First, try to read the response body\n errorText = await response.text();\n debugLogger.error('GatewayService chat error response body', {\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n body: errorText\n });\n } catch (readError) {\n debugLogger.error('GatewayService chat failed to read error response body', { error: readError });\n errorText = `Request failed with status ${response.status}`;\n }\n \n // Then, try to parse as JSON for better error info\n try {\n errorData = JSON.parse(errorText);\n debugLogger.error('GatewayService chat parsed error payload', errorData);\n } catch (parseError) {\n debugLogger.error('GatewayService chat error payload was not valid JSON');\n errorData = { message: errorText };\n }\n \n // Create an error object that mimics an HTTP response error for the notification service\n const error = this._createHttpError(\n `POST ${url} failed: ${response.status} ${response.statusText ?? \"\"}`,\n {\n status: response.status,\n statusText: response.statusText ?? \"\",\n data: errorData,\n url\n }\n );\n \n throw error;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n \n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n if (buffer.trim() !== \"\") {\n try {\n const finalResponse = JSON.parse(buffer);\n observer.next(finalResponse);\n } catch (err) {\n debugLogger.error('GatewayService chat final chunk parsing error', { buffer, error: err });\n observer.error(err);\n }\n }\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n // Handle both SSE format (OpenAI-style) and direct JSON (Ollama-style)\n let data = trimmed;\n \n if (trimmed.startsWith('data: ')) {\n data = trimmed.slice(6); // Remove 'data: ' prefix for SSE format\n if (data === '[DONE]') {\n observer.complete();\n return;\n }\n }\n \n try {\n const parsed = JSON.parse(data);\n \n // Transform Ollama chat format to OpenAI-compatible format\n if (request.provider === 'ollama' && parsed.message) {\n const transformed: GatewayChatResponse = {\n id: `chatcmpl-${Date.now()}`,\n object: 'chat.completion.chunk',\n created: Math.floor(new Date(parsed.created_at || Date.now()).getTime() / 1000),\n model: parsed.model,\n choices: [{\n index: 0,\n delta: {\n role: parsed.message.role,\n content: parsed.message.content\n },\n finish_reason: parsed.done ? (parsed.done_reason || 'stop') : null\n }]\n };\n \n if (parsed.done && parsed.total_duration) {\n transformed.usage = {\n prompt_tokens: parsed.prompt_eval_count || 0,\n completion_tokens: parsed.eval_count || 0,\n total_tokens: (parsed.prompt_eval_count || 0) + (parsed.eval_count || 0)\n };\n }\n \n observer.next(transformed);\n } else {\n // For non-Ollama providers or already transformed responses\n observer.next(parsed);\n }\n } catch (err) {\n debugLogger.error('GatewayService chat stream chunk parsing error', {\n line: trimmed,\n rawData: data,\n error: err\n });\n observer.error(err);\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n })\n .catch(err => {\n debugLogger.error('GatewayService chat fetch error', {\n error: err,\n url,\n provider: request.provider\n });\n observer.error(err);\n });\n\n // Teardown: abort the request/stream on unsubscribe\n return () => {\n try { controller.abort(); } catch {}\n };\n });\n }\n\n /**\n * Text generation using the gateway API\n */\n generate(request: GatewayGenerateRequest): Observable<GatewayGenerateResponse> {\n // Use provider-specific endpoint if provider is specified\n const endpoint = request.provider ? `/api/${request.provider}/generate` : '/api/generate';\n const url = `${this._baseUrl}${endpoint}`;\n \n debugLogger.debug(`Gateway generate request to ${url} with provider: ${request.provider || 'default'}`);\n \n return new Observable<GatewayGenerateResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify({ ...request, stream: request.stream !== false }),\n });\n \n task.then(async (response) => {\n if (!response.ok) {\n // Handle error response properly with body parsing\n let errorText = '';\n let errorData: unknown = null;\n \n try {\n // First, try to read the response body\n errorText = await response.text();\n } catch (readError) {\n errorText = `Request failed with status ${response.status}`;\n }\n \n // Then, try to parse as JSON for better error info\n try {\n errorData = JSON.parse(errorText);\n } catch (parseError) {\n errorData = { message: errorText };\n }\n \n // Create an error object that mimics an HTTP response error for the notification service\n const error = this._createHttpError(\n `POST ${url} failed: ${response.status} ${response.statusText ?? \"\"}`,\n {\n status: response.status,\n statusText: response.statusText ?? \"\",\n data: errorData,\n url\n }\n );\n \n throw error;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n \n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n if (buffer.trim() !== \"\") {\n try {\n observer.next(JSON.parse(buffer));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Final chunk parsing error (gateway generate):', { buffer });\n }\n }\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n observer.next(JSON.parse(line));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Error parsing JSON line (gateway generate):', { line });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n })\n .catch(err => observer.error(err));\n });\n }\n\n /**\n * List all available models from all providers\n */\n listModels(): Observable<GatewayModel[]> {\n const url = `${this._baseUrl}/api/models`;\n const response = this._get<GatewayModelsResponse>(url);\n const result = response.pipe(\n map(data => data.models),\n shareReplay(1)\n );\n return result;\n }\n\n /**\n * List models for a specific provider\n */\n listModelsByProvider(provider: string): Observable<GatewayModel[]> {\n const url = `${this._baseUrl}/api/models/${provider}`;\n const response = this._get<GatewayModelsResponse>(url);\n const result = response.pipe(\n map(data => data.models),\n shareReplay(1)\n );\n return result;\n }\n\n getMemory(): Observable<GatewayMemoryResponse> {\n const url = `${this._baseUrl}/api/memory`;\n return this._get<GatewayMemoryResponse>(url);\n }\n\n private _get<T>(url: string, responseType: 'json' | 'text' = 'json'): Observable<T> {\n const request = this._client.get<T>(url, { responseType });\n return from(request).pipe(\n map(response => response.data as T),\n shareReplay(1)\n );\n }\n\n private _post<TRequest, TResponse>(url: string, body: TRequest): Observable<TResponse> {\n const request = this._client.post<TResponse>(url, body);\n return from(request).pipe(\n map(response => response.data),\n shareReplay(1)\n );\n }\n\n private _getHeaders() {\n const token = this._tokenFactory();\n \n const headers: { [key: string]: string } = {\n 'Content-Type': 'application/json'\n };\n \n // Only include Authorization header if we have a real token\n if (token && token.trim() !== '') {\n headers['Authorization'] = `Bearer ${token}`;\n debugLogger.debug(\"Authorization header set with token\");\n } else {\n debugLogger.warn('GatewayService: No token found, skipping Authorization header');\n }\n \n return headers;\n }\n\n /**\n * Submit feedback to the gateway API\n */\n submitFeedback(feedback: FeedbackRequest): Observable<FeedbackResponse> {\n const url = `${this._baseUrl}/api/feedback`;\n \n debugLogger.debug('Gateway feedback submission', {\n category: feedback.category,\n priority: feedback.priority,\n hasImages: !!(feedback.images && feedback.images.length > 0),\n hasAttachments: !!(feedback.attachments && feedback.attachments.length > 0)\n });\n\n return from(\n this._client.post<FeedbackResponse>(url, feedback).then(response => response.data)\n ).pipe(\n catchError(error => {\n debugLogger.error('Feedback submission failed, using email fallback', error);\n\n const fallbackResponse: FeedbackResponse = {\n id: `fallback-${Date.now()}`,\n status: 'submitted',\n message: 'Feedback submission failed. Opening email client as fallback.',\n mailtoUrl: this._generateMailtoUrl(feedback)\n };\n return of(fallbackResponse);\n })\n );\n }\n\n /**\n * Generate a mailto URL as fallback for feedback submission\n */\n private _generateMailtoUrl(feedback: FeedbackRequest): string {\n const subject = encodeURIComponent(`[${feedback.category.toUpperCase()}] ${feedback.title}`);\n \n let body = `Category: ${feedback.category}\\n`;\n body += `Priority: ${feedback.priority}\\n`;\n \n if (feedback.annoyanceLevel) {\n const annoyanceLabels = {\n 1: '😊 Not annoying at all',\n 2: '😐 Slightly annoying',\n 3: '🙄 Moderately annoying', \n 4: '😠 Very annoying',\n 5: '🤬 Extremely annoying'\n };\n body += `Annoyance Level: ${feedback.annoyanceLevel}/5 - ${annoyanceLabels[feedback.annoyanceLevel as keyof typeof annoyanceLabels]}\\n`;\n }\n \n body += `\\nDescription:\\n${feedback.description}\\n\\n`;\n \n if (feedback.sessionInfo) {\n body += `Session Info:\\n`;\n body += `- Model: ${feedback.sessionInfo.currentModel}\\n`;\n body += `- Provider: ${feedback.sessionInfo.currentProvider}\\n`;\n body += `- Conversation: ${feedback.sessionInfo.conversationId}\\n`;\n body += `- Timestamp: ${feedback.sessionInfo.timestamp}\\n\\n`;\n }\n \n if (feedback.browserInfo) {\n body += `Browser Info:\\n`;\n body += `- Name: ${feedback.browserInfo.name}\\n`;\n body += `- Version: ${feedback.browserInfo.version}\\n`;\n body += `- Platform: ${feedback.browserInfo.platform}\\n\\n`;\n }\n \n if (feedback.userAgent) {\n body += `User Agent: ${feedback.userAgent}\\n\\n`;\n }\n \n if (feedback.contactEmail) {\n body += `Contact Email: ${feedback.contactEmail}\\n\\n`;\n }\n \n if (feedback.images && feedback.images.length > 0) {\n body += `📎 IMAGE ATTACHMENT:\\n`;\n body += `Please paste your clipboard contents here (Ctrl+V or Cmd+V)\\n\\n`;\n }\n \n if (feedback.attachments && feedback.attachments.length > 0) {\n body += `📎 IMPORTANT - FILES TO ATTACH:\\n`;\n body += `Please attach the following ${feedback.attachments.length} file(s) to this email:\\n`;\n feedback.attachments.forEach((attachment, index) => {\n body += ` • File ${index + 1}: ${attachment.name || `[Attachment ${index + 1}]`}\\n`;\n });\n body += `\\n(Note: Files cannot be automatically included in email links)\\n\\n`;\n }\n \n body += `---\\nGenerated by Bandit AI Feedback System`;\n \n const encodedBody = encodeURIComponent(body);\n const toEmail = this._feedbackEmail || 'feedback@burtson.ai'; // Use custom email or default\n \n return `mailto:${toEmail}?subject=${subject}&body=${encodedBody}`;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-1D46-424011\nconst __banditFingerprint_gateway_openaigatewayservicets = 'BL-FP-DEEDDF-C675';\nconst __auditTrail_gateway_openaigatewayservicets = 'BL-AU-MGOIKVVU-ZD2R';\n// File: openai-gateway.service.ts | Path: src/services/gateway/openai-gateway.service.ts | Hash: 1d46c675\n\nimport { GatewayService } from './gateway.service';\nimport { GatewayChatRequest, GatewayChatResponse, GatewayGenerateRequest, GatewayGenerateResponse, GatewayModel } from './interfaces';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface OpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n name?: string;\n}\n\nexport interface OpenAIChatRequest {\n model: string;\n messages: OpenAIMessage[];\n stream?: boolean;\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n stop?: string | string[];\n}\n\nexport class OpenAIGatewayService {\n private _gatewayService: GatewayService;\n\n constructor(\n gatewayUrl: string,\n tokenFactory: () => string | null\n ) {\n this._gatewayService = new GatewayService(gatewayUrl, tokenFactory);\n debugLogger.info('OpenAIGatewayService initialized', { gatewayUrl });\n }\n\n /**\n * Validates the availability of the gateway service for OpenAI\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n return this._gatewayService.validateServiceAvailability(args);\n }\n\n /**\n * Chat completion using OpenAI through the gateway\n */\n chat(request: OpenAIChatRequest): Observable<GatewayChatResponse> {\n const gatewayRequest: GatewayChatRequest = {\n ...request,\n provider: 'openai'\n };\n\n debugLogger.debug('OpenAI Gateway chat request', { \n model: request.model, \n messageCount: request.messages.length,\n stream: request.stream \n });\n\n return this._gatewayService.chat(gatewayRequest);\n }\n\n /**\n * Text completion using OpenAI through the gateway\n */\n complete(prompt: string, options: {\n model: string;\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n stop?: string | string[];\n }): Observable<GatewayGenerateResponse> {\n const gatewayRequest: GatewayGenerateRequest = {\n model: options.model,\n prompt,\n temperature: options.temperature,\n max_tokens: options.max_tokens,\n stream: options.stream,\n stop: options.stop,\n provider: 'openai'\n };\n\n debugLogger.debug('OpenAI Gateway completion request', { \n model: options.model, \n promptLength: prompt.length,\n stream: options.stream \n });\n\n return this._gatewayService.generate(gatewayRequest);\n }\n\n /**\n * List available OpenAI models through the gateway\n */\n listModels(): Observable<GatewayModel[]> {\n debugLogger.debug('Fetching OpenAI models through gateway');\n return this._gatewayService.listModelsByProvider('openai');\n }\n\n /**\n * Get gateway health with OpenAI provider status\n */\n getHealth() {\n return this._gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n openai_status: health.providers.find(p => p.name === 'openai')?.status || 'unavailable'\n }))\n );\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9B34-38B0E8\nconst __banditFingerprint_gateway_azureopenaigatewayservicets = 'BL-FP-4A759E-00DC';\nconst __auditTrail_gateway_azureopenaigatewayservicets = 'BL-AU-MGOIKVVT-GARS';\n// File: azure-openai-gateway.service.ts | Path: src/services/gateway/azure-openai-gateway.service.ts | Hash: 9b3400dc\n\nimport { GatewayService } from './gateway.service';\nimport { GatewayChatRequest, GatewayChatResponse, GatewayGenerateRequest, GatewayGenerateResponse, GatewayModel } from './interfaces';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface AzureOpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n name?: string;\n}\n\nexport interface AzureOpenAIChatRequest {\n model: string; // This will be the deployment name for Azure\n messages: AzureOpenAIMessage[];\n stream?: boolean;\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n stop?: string | string[];\n}\n\nexport interface AzureOpenAIConfig {\n deploymentName: string;\n apiVersion: string;\n resourceName?: string; // For endpoint construction if needed\n}\n\nexport class AzureOpenAIGatewayService {\n private _gatewayService: GatewayService;\n private _azureConfig: AzureOpenAIConfig;\n\n constructor(\n gatewayUrl: string,\n tokenFactory: () => string | null,\n azureConfig: AzureOpenAIConfig\n ) {\n this._gatewayService = new GatewayService(gatewayUrl, tokenFactory);\n this._azureConfig = azureConfig;\n debugLogger.info('AzureOpenAIGatewayService initialized', { \n gatewayUrl, \n deploymentName: azureConfig.deploymentName,\n apiVersion: azureConfig.apiVersion \n });\n }\n\n /**\n * Validates the availability of the gateway service for Azure OpenAI\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n return this._gatewayService.validateServiceAvailability(args);\n }\n\n /**\n * Chat completion using Azure OpenAI through the gateway\n */\n chat(request: AzureOpenAIChatRequest): Observable<GatewayChatResponse> {\n const gatewayRequest: GatewayChatRequest = {\n ...request,\n model: this._azureConfig.deploymentName, // Use deployment name as model\n provider: 'azure-openai'\n };\n\n debugLogger.debug('Azure OpenAI Gateway chat request', { \n deploymentName: this._azureConfig.deploymentName,\n apiVersion: this._azureConfig.apiVersion,\n messageCount: request.messages.length,\n stream: request.stream \n });\n\n return this._gatewayService.chat(gatewayRequest);\n }\n\n /**\n * Text completion using Azure OpenAI through the gateway\n */\n complete(prompt: string, options: {\n model?: string; // Optional override for deployment name\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n stop?: string | string[];\n }): Observable<GatewayGenerateResponse> {\n const gatewayRequest: GatewayGenerateRequest = {\n model: options.model || this._azureConfig.deploymentName,\n prompt,\n temperature: options.temperature,\n max_tokens: options.max_tokens,\n stream: options.stream,\n stop: options.stop,\n provider: 'azure-openai'\n };\n\n debugLogger.debug('Azure OpenAI Gateway completion request', { \n deploymentName: options.model || this._azureConfig.deploymentName,\n promptLength: prompt.length,\n stream: options.stream \n });\n\n return this._gatewayService.generate(gatewayRequest);\n }\n\n /**\n * List available Azure OpenAI models through the gateway\n */\n listModels(): Observable<GatewayModel[]> {\n debugLogger.debug('Fetching Azure OpenAI models through gateway');\n return this._gatewayService.listModelsByProvider('azure-openai');\n }\n\n /**\n * Get gateway health with Azure OpenAI provider status\n */\n getHealth() {\n return this._gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n azure_openai_status: health.providers.find(p => p.name === 'azure-openai')?.status || 'unavailable',\n azure_config: {\n deploymentName: this._azureConfig.deploymentName,\n apiVersion: this._azureConfig.apiVersion\n }\n }))\n );\n }\n\n /**\n * Update Azure configuration\n */\n updateAzureConfig(newConfig: Partial<AzureOpenAIConfig>) {\n this._azureConfig = { ...this._azureConfig, ...newConfig };\n debugLogger.info('Azure OpenAI configuration updated', this._azureConfig);\n }\n\n /**\n * Get current Azure configuration\n */\n getAzureConfig(): AzureOpenAIConfig {\n return { ...this._azureConfig };\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-8264-DAEB3A\nconst __banditFingerprint_gateway_anthropicgatewayservicets = 'BL-FP-CA4EB6-817C';\nconst __auditTrail_gateway_anthropicgatewayservicets = 'BL-AU-MGOIKVVS-X7J4';\n// File: anthropic-gateway.service.ts | Path: src/services/gateway/anthropic-gateway.service.ts | Hash: 8264817c\n\nimport { GatewayService } from './gateway.service';\nimport { GatewayChatRequest, GatewayChatResponse, GatewayGenerateRequest, GatewayGenerateResponse, GatewayModel } from './interfaces';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface AnthropicMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n name?: string;\n}\n\nexport interface AnthropicChatRequest {\n model: string;\n messages: AnthropicMessage[];\n stream?: boolean;\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n stop_sequences?: string[];\n system?: string; // Anthropic uses separate system parameter\n}\n\nexport class AnthropicGatewayService {\n private _gatewayService: GatewayService;\n\n constructor(\n gatewayUrl: string,\n tokenFactory: () => string | null\n ) {\n this._gatewayService = new GatewayService(gatewayUrl, tokenFactory);\n debugLogger.info('AnthropicGatewayService initialized', { gatewayUrl });\n }\n\n /**\n * Validates the availability of the gateway service for Anthropic\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n return this._gatewayService.validateServiceAvailability(args);\n }\n\n /**\n * Chat completion using Anthropic through the gateway\n */\n chat(request: AnthropicChatRequest): Observable<GatewayChatResponse> {\n // Convert Anthropic-specific request to gateway format\n const gatewayRequest: GatewayChatRequest = {\n model: request.model,\n messages: request.messages,\n stream: request.stream,\n temperature: request.temperature,\n max_tokens: request.max_tokens,\n top_p: request.top_p,\n stop: request.stop_sequences,\n provider: 'anthropic'\n };\n\n debugLogger.debug('Anthropic Gateway chat request', { \n model: request.model, \n messageCount: request.messages.length,\n stream: request.stream,\n hasSystem: !!request.system\n });\n\n return this._gatewayService.chat(gatewayRequest);\n }\n\n /**\n * Text completion using Anthropic through the gateway\n */\n complete(prompt: string, options: {\n model: string;\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n stop_sequences?: string[];\n system?: string;\n }): Observable<GatewayGenerateResponse> {\n const gatewayRequest: GatewayGenerateRequest = {\n model: options.model,\n prompt,\n temperature: options.temperature,\n max_tokens: options.max_tokens,\n stream: options.stream,\n stop: options.stop_sequences,\n provider: 'anthropic'\n };\n\n debugLogger.debug('Anthropic Gateway completion request', { \n model: options.model, \n promptLength: prompt.length,\n stream: options.stream,\n hasSystem: !!options.system\n });\n\n return this._gatewayService.generate(gatewayRequest);\n }\n\n /**\n * List available Anthropic models through the gateway\n */\n listModels(): Observable<GatewayModel[]> {\n debugLogger.debug('Fetching Anthropic models through gateway');\n return this._gatewayService.listModelsByProvider('anthropic');\n }\n\n /**\n * Get gateway health with Anthropic provider status\n */\n getHealth() {\n return this._gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n anthropic_status: health.providers.find(p => p.name === 'anthropic')?.status || 'unavailable'\n }))\n );\n }\n\n /**\n * Helper method to convert system message to Anthropic format\n * Anthropic treats system messages differently - they can be separate from messages\n */\n private extractSystemMessage(messages: AnthropicMessage[]): { messages: AnthropicMessage[], system?: string } {\n const systemMessage = messages.find(msg => msg.role === 'system');\n const userMessages = messages.filter(msg => msg.role !== 'system');\n \n return {\n messages: userMessages,\n system: systemMessage?.content\n };\n }\n\n /**\n * Enhanced chat method that handles Anthropic's system message format\n */\n chatWithSystem(request: AnthropicChatRequest): Observable<GatewayChatResponse> {\n const { messages, system } = this.extractSystemMessage(request.messages);\n \n const enhancedRequest: AnthropicChatRequest = {\n ...request,\n messages,\n system: system || request.system\n };\n\n return this.chat(enhancedRequest);\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-76E6-8DEDE6\nconst __banditFingerprint_gateway_ollamagatewayservicets = 'BL-FP-124FB6-97C7';\nconst __auditTrail_gateway_ollamagatewayservicets = 'BL-AU-MGOIKVVU-PU6T';\n// File: ollama-gateway.service.ts | Path: src/services/gateway/ollama-gateway.service.ts | Hash: 76e697c7\n\nimport { GatewayService } from './gateway.service';\nimport { GatewayChatRequest, GatewayChatResponse, GatewayGenerateRequest, GatewayGenerateResponse, GatewayModel } from './interfaces';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface OllamaMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n images?: string[]; // Ollama supports image inputs\n}\n\nexport interface OllamaChatRequest {\n model: string;\n messages: OllamaMessage[];\n stream?: boolean;\n options?: Record<string, unknown>;\n images?: string[];\n}\n\nexport interface OllamaGenerateRequest {\n model: string;\n prompt: string;\n stream?: boolean;\n images?: string[];\n options?: Record<string, unknown>;\n}\n\nexport class OllamaGatewayService {\n private _gatewayService: GatewayService;\n\n constructor(\n gatewayUrl: string,\n tokenFactory: () => string | null\n ) {\n this._gatewayService = new GatewayService(gatewayUrl, tokenFactory);\n debugLogger.info('OllamaGatewayService initialized', { gatewayUrl });\n }\n\n /**\n * Validates the availability of the gateway service for Ollama\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n return this._gatewayService.validateServiceAvailability(args);\n }\n\n /**\n * Chat completion using Ollama through the gateway\n */\n chat(request: OllamaChatRequest): Observable<GatewayChatResponse> {\n const gatewayRequest: GatewayChatRequest = {\n ...request,\n provider: 'ollama'\n };\n\n debugLogger.debug('Ollama Gateway chat request', { \n model: request.model, \n messageCount: request.messages.length,\n stream: request.stream,\n hasImages: !!(request.images && request.images.length > 0)\n });\n\n return this._gatewayService.chat(gatewayRequest);\n }\n\n /**\n * Text generation using Ollama through the gateway\n */\n generate(request: OllamaGenerateRequest): Observable<GatewayGenerateResponse> {\n const gatewayRequest: GatewayGenerateRequest = {\n ...request,\n provider: 'ollama'\n };\n\n debugLogger.debug('Ollama Gateway generate request', { \n model: request.model, \n promptLength: request.prompt.length,\n stream: request.stream,\n hasImages: !!(request.images && request.images.length > 0)\n });\n\n return this._gatewayService.generate(gatewayRequest);\n }\n\n /**\n * List available Ollama models through the gateway\n */\n listModels(): Observable<GatewayModel[]> {\n debugLogger.debug('Fetching Ollama models through gateway');\n return this._gatewayService.listModelsByProvider('ollama');\n }\n\n /**\n * Get gateway health with Ollama provider status\n */\n getHealth() {\n return this._gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n ollama_status: health.providers.find(p => p.name === 'ollama')?.status || 'unavailable'\n }))\n );\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-DBA3-6C3A2B\nconst __banditFingerprint_providers_playgroundproviderts = 'BL-FP-7465CF-7B8B';\nconst __auditTrail_providers_playgroundproviderts = 'BL-AU-MGOIKVVR-EV75';\n// File: playground.provider.ts | Path: src/services/ai-provider/providers/playground.provider.ts | Hash: dba37b8b\n\nimport { Observable } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\n\ntype PlaygroundScript = {\n match: (input: string) => boolean;\n response: string;\n};\n\nconst PLAYGROUND_MODELS: AIModel[] = [\n {\n name: 'bandit-playground',\n details: {\n format: 'chat',\n family: 'bandit',\n families: ['bandit', 'demo'],\n parameter_size: 'demo',\n quantization_level: 'synthetic'\n },\n digest: 'playground-demo-001',\n modified_at: new Date().toISOString()\n },\n {\n name: 'bandit-starter',\n details: {\n format: 'chat',\n family: 'bandit',\n families: ['bandit', 'demo'],\n parameter_size: 'demo',\n quantization_level: 'synthetic'\n },\n digest: 'playground-demo-002',\n modified_at: new Date().toISOString()\n }\n];\n\nconst PLAYGROUND_CONVERSATION_STARTERS = [\n 'What can I build with Bandit Engine if my backend is not ready yet?',\n 'How does the gateway contract keep API keys out of the browser?',\n 'Can I theme the chat UI to match my product brand?',\n 'How do I switch between Ollama and OpenAI without redeploying the frontend?',\n 'Show me how the management console handles personas and models.'\n];\n\nconst PLAYGROUND_SCRIPTS: PlaygroundScript[] = [\n {\n match: (input) => /model|switch|personas|management/i.test(input),\n response: [\n \"Absolutely — the management console ships with live model switching, persona editing, and feature toggles.\",\n \"\",\n \"- Use the **Models** tab to expose whichever gateway-backed models you want customers to see.\",\n \"- Personas hydrate the chat with branded system prompts, voice preferences, and avatars.\",\n \"- Everything persists through the gateway, so you can roll out changes without shipping a new build.\"\n ].join('\\n')\n },\n {\n match: (input) => /gateway|api|contract|backend/i.test(input),\n response: [\n \"The gateway contract keeps secrets on the server while giving the UI a unified AI API.\",\n \"\",\n \"Key highlights:\",\n \"1. `/api/chat/completions` is the default OpenAI-format endpoint when no provider override is set.\",\n \"2. `/api/{provider}/chat/completions` handles OpenAI, Azure OpenAI, and Anthropic while `/api/ollama/chat` streams Ollama responses.\",\n \"3. The contract is language-agnostic — Express, FastAPI, .NET, Go… anything works as long as it speaks HTTP.\"\n ].join('\\n')\n },\n {\n match: (input) => /style|theme|brand|ui/i.test(input),\n response: [\n \"Every surface in Bandit Engine is themeable.\",\n \"\",\n \"- Drop a JSON config into your `public/` folder (or host it on a CDN) to control themes, logos, and accent colors.\",\n \"- The React components expose hooks for custom headers, menus, and call-to-action buttons.\",\n \"- Need a modal? `ChatModal` reuses the same store, so the handoff between embedded chat and floating assistant stays seamless.\"\n ].join('\\n')\n },\n {\n match: (input) => /voice|tts|audio/i.test(input),\n response: [\n \"Voice is opt-in, but the plumbing is ready.\",\n \"\",\n \"- Configure `/api/tts` and `/api/stt` on the gateway to unlock the speak/listen controls.\",\n \"- The UI lazily loads voices and respects feature flags, so you can leave it disabled in the playground.\",\n \"- Everything streams — the assistant starts speaking before the full response lands.\"\n ].join('\\n')\n },\n {\n match: (input) => /deploy|production|secure/i.test(input),\n response: [\n \"Production hardening is front and center.\",\n \"\",\n \"- Gateway tokens ride in the `Authorization` header; rotate them server-side without touching the bundle.\",\n \"- Feature flags gate premium surfaces, letting you trial the UI before wiring billing.\",\n \"- Vector search, knowledge, and memories are isolated behind `/api/embedding/*` so you can plug in your own storage policies.\"\n ].join('\\n')\n }\n];\n\nconst FALLBACK_RESPONSE = [\n \"Bandit Engine is running in playground mode. I'm simulating how streaming works so you can explore the UX without connecting a live model.\",\n \"\",\n \"Try asking about the gateway contract, theming, voice features, or model management to see tailored walkthroughs.\"\n].join('\\n');\n\nconst STREAM_DELAY_MS = 350;\n\nexport class PlaygroundProvider implements IAIProvider {\n private config: AIProviderConfig;\n\n constructor(config: AIProviderConfig) {\n this.config = { type: AIProviderType.PLAYGROUND, ...config };\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const lastUserMessage = [...request.messages]\n .reverse()\n .find((m) => m.role === 'user')?.content ?? '';\n\n const script = PLAYGROUND_SCRIPTS.find((scenario) =>\n scenario.match(lastUserMessage)\n );\n\n const responseText = script?.response ?? FALLBACK_RESPONSE;\n const chunks = this.splitIntoChunks(responseText);\n\n return new Observable<AIChatResponse>((observer) => {\n let index = 0;\n const emitChunk = () => {\n if (index >= chunks.length) {\n observer.complete();\n return;\n }\n\n const chunk = chunks[index];\n observer.next({\n message: {\n content: chunk,\n role: 'assistant'\n },\n done: index === chunks.length - 1\n });\n\n index += 1;\n setTimeout(emitChunk, STREAM_DELAY_MS);\n };\n\n emitChunk();\n\n return () => {\n index = chunks.length;\n };\n });\n }\n\n generate(_request: AIGenerateRequest): Observable<AIGenerateResponse> {\n const starters = PLAYGROUND_CONVERSATION_STARTERS.join('\\n');\n\n return new Observable<AIGenerateResponse>((observer) => {\n observer.next({\n response: starters,\n done: true\n });\n observer.complete();\n });\n }\n\n listModels(): Observable<AIModel[]> {\n return new Observable<AIModel[]>((observer) => {\n observer.next(PLAYGROUND_MODELS);\n observer.complete();\n });\n }\n\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number }): Promise<{ url: string; isAvailable: boolean }> {\n const simulatedUrl = this.config.baseUrl ?? 'playground://local';\n\n if (args.timeoutMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, Math.min(args.timeoutMs, 250)));\n }\n\n return {\n url: simulatedUrl,\n isAvailable: true\n };\n }\n\n getProviderType(): string {\n return AIProviderType.PLAYGROUND;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private splitIntoChunks(response: string): string[] {\n const paragraphs = response.split('\\n\\n').map((p) => p.trim()).filter(Boolean);\n\n if (paragraphs.length <= 1) {\n const sentences = response.split(/(?<=[.!?])\\s+/).filter(Boolean);\n return sentences.length > 0 ? sentences : [response];\n }\n\n return paragraphs;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-16A2-8F5D0C\nconst __banditFingerprint_providers_xaiproviderts = 'BL-FP-DA7844-7C12';\nconst __auditTrail_providers_xaiproviderts = 'BL-AU-MGOIKVVR-W7UB';\n// File: xai.provider.ts | Path: src/services/ai-provider/providers/xai.provider.ts | Hash: 16a28f5d\n\nimport { Observable, from, switchMap, map, throwError } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\n\ninterface XAIChatPayload {\n model: string;\n messages: AIChatRequest['messages'];\n stream: boolean;\n temperature?: number;\n max_tokens?: number;\n}\n\ninterface XAIStreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n };\n }>;\n}\n\ninterface XAIChatResponsePayload {\n choices?: Array<{\n message?: {\n content?: string;\n };\n }>;\n}\n\ninterface XAIModelListResponse {\n data: Array<{\n id: string;\n object?: string;\n }>;\n}\n\n/**\n * xAI provider implementation\n */\nexport class XAIProvider implements IAIProvider {\n private config: AIProviderConfig;\n private baseUrl: string;\n\n constructor(config: AIProviderConfig) {\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://api.x.ai/v1';\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const url = `${this.baseUrl}/chat/completions`;\n\n const payload: XAIChatPayload = {\n model: request.model,\n messages: request.messages,\n stream: Boolean(request.stream),\n temperature: request.temperature,\n max_tokens: request.maxTokens\n };\n\n if (request.stream) {\n return this.streamChatRequest(url, payload);\n } else {\n return this.nonStreamChatRequest(url, payload);\n }\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n const chatRequest: AIChatRequest = {\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n stream: request.stream,\n options: request.options\n };\n\n return this.chat(chatRequest).pipe(\n map(response => ({\n response: response.message.content,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n const url = `${this.baseUrl}/models`;\n\n return from(fetch(url, {\n headers: this.getHeaders()\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`Failed to list models: ${response.status}`));\n }\n return from(response.json() as Promise<XAIModelListResponse>);\n }),\n map((data) =>\n data.data.map((model) => ({\n name: model.id,\n details: {\n format: 'xai',\n family: model.object\n }\n }))\n )\n );\n }\n\n async validateServiceAvailability(args: {\n fallbackUrl?: string;\n timeoutMs: number;\n }): Promise<{ url: string; isAvailable: boolean }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${this.baseUrl}/models`, {\n headers: this.getHeaders(),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: this.baseUrl,\n isAvailable: response.ok\n };\n } catch (error) {\n if (args.fallbackUrl) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${args.fallbackUrl}/models`, {\n headers: this.getHeaders(),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n this.baseUrl = args.fallbackUrl;\n return {\n url: args.fallbackUrl,\n isAvailable: true\n };\n }\n } catch (fallbackError) {\n debugLogger.warn('xAI fallback validation failed', { error: fallbackError });\n }\n }\n\n return {\n url: this.baseUrl,\n isAvailable: false\n };\n }\n }\n\n getProviderType(): string {\n return AIProviderType.XAI;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private streamChatRequest(url: string, payload: XAIChatPayload): Observable<AIChatResponse> {\n return new Observable<AIChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n task.then(response => {\n if (!response.ok) {\n observer.error(new Error(`xAI request failed: ${response.status}`));\n return;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim() && line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as XAIStreamChunk;\n const content = parsed.choices?.[0]?.delta?.content ?? '';\n if (content) {\n observer.next({\n message: { content, role: 'assistant' },\n done: false\n });\n }\n } catch (err) {\n debugLogger.error('Error parsing xAI stream data:', { data, error: err });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n }).catch(err => observer.error(err));\n });\n }\n\n private nonStreamChatRequest(url: string, payload: XAIChatPayload): Observable<AIChatResponse> {\n return from(fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`xAI request failed: ${response.status}`));\n }\n return from(response.json() as Promise<XAIChatResponsePayload>);\n }),\n map((data) => ({\n message: {\n content: data.choices?.[0]?.message?.content ?? '',\n role: 'assistant' as const\n },\n done: true\n }))\n );\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n return headers;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-AED4-661A13\nconst __banditFingerprint_aiprovider_aiproviderfactoryts = 'BL-FP-C75FF8-443D';\nconst __auditTrail_aiprovider_aiproviderfactoryts = 'BL-AU-MGOIKVVP-DXHW';\n// File: ai-provider.factory.ts | Path: src/services/ai-provider/ai-provider.factory.ts | Hash: aed4443d\n\nimport { IAIProvider } from './interfaces/ai-provider.interface';\nimport { AIProviderConfig, AIProviderType } from './types/common.types';\nimport { OllamaProvider } from './providers/ollama.provider';\nimport { OpenAIProvider } from './providers/openai.provider';\nimport { AzureOpenAIProvider } from './providers/azure-openai.provider';\nimport { AnthropicProvider } from './providers/anthropic.provider';\nimport { GatewayProvider } from './providers/gateway.provider';\nimport { PlaygroundProvider } from './providers/playground.provider';\nimport { XAIProvider } from './providers/xai.provider';\n\n/**\n * Factory for creating AI provider instances\n */\nexport class AIProviderFactory {\n static createProvider(config: AIProviderConfig): IAIProvider {\n switch (config.type) {\n case AIProviderType.OLLAMA:\n return new OllamaProvider(config);\n \n case AIProviderType.OPENAI:\n return new OpenAIProvider(config);\n \n case AIProviderType.AZURE_OPENAI:\n return new AzureOpenAIProvider(config);\n \n case AIProviderType.ANTHROPIC:\n return new AnthropicProvider(config);\n\n case AIProviderType.XAI:\n return new XAIProvider(config);\n\n case AIProviderType.GATEWAY:\n return new GatewayProvider(config);\n\n case AIProviderType.PLAYGROUND:\n return new PlaygroundProvider(config);\n \n default:\n throw new Error(`Unsupported AI provider type: ${config.type}`);\n }\n }\n\n static getSupportedProviders(): AIProviderType[] {\n return [\n AIProviderType.OLLAMA,\n AIProviderType.OPENAI,\n AIProviderType.AZURE_OPENAI,\n AIProviderType.XAI,\n AIProviderType.GATEWAY,\n AIProviderType.PLAYGROUND\n ];\n }\n\n static validateConfig(config: AIProviderConfig): boolean {\n switch (config.type) {\n case AIProviderType.OLLAMA:\n return true; // Ollama only needs baseUrl which has defaults\n \n case AIProviderType.OPENAI:\n return !!config.apiKey;\n \n case AIProviderType.AZURE_OPENAI:\n return !!(config.baseUrl && config.apiKey && config.apiVersion && config.deploymentName);\n \n case AIProviderType.ANTHROPIC:\n return !!config.apiKey;\n\n case AIProviderType.XAI:\n return !!config.apiKey;\n\n case AIProviderType.GATEWAY:\n return !!(config.gatewayUrl && config.provider);\n\n case AIProviderType.PLAYGROUND:\n return true;\n \n default:\n return false;\n }\n }\n}\n"],"mappings":"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","names":["map","e","map","Observable","from","switchMap","map","throwError","map","from","switchMap","throwError","Observable","Observable","from","switchMap","map","throwError","map","Observable","from","switchMap","throwError","Observable","from","switchMap","map","throwError","map","Observable","from","switchMap","throwError","map","catchError","from","lastValueFrom","map","Observable","of","shareReplay","timeout","catchError","of","map","timeout","lastValueFrom","e","Observable","shareReplay","from","map","map","map","map","map","map","map","map","map","Observable","Observable","Observable","from","switchMap","map","throwError","map","from","switchMap","throwError","Observable"]}
@@ -8,7 +8,7 @@ import {
8
8
  useMemoryStore,
9
9
  useNotification,
10
10
  useVectorStore
11
- } from "./chunk-FJO5ZWYU.mjs";
11
+ } from "./chunk-CDQYBO3Q.mjs";
12
12
  import {
13
13
  useModelStore,
14
14
  usePackageSettingsStore,
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-XUBYA5I7.mjs";
17
17
  import {
18
18
  GatewayService
19
- } from "./chunk-ZNNOTDRD.mjs";
19
+ } from "./chunk-QU5S5QQP.mjs";
20
20
  import {
21
21
  debugLogger
22
22
  } from "./chunk-KCI46M23.mjs";
@@ -8922,4 +8922,4 @@ export {
8922
8922
  FeedbackButton,
8923
8923
  useNotificationService
8924
8924
  };
8925
- //# sourceMappingURL=chunk-ED5NNDKO.mjs.map
8925
+ //# sourceMappingURL=chunk-QYH2T4L5.mjs.map
@@ -19,7 +19,7 @@ import {
19
19
  useNotificationService,
20
20
  useTTS,
21
21
  useVoiceStore
22
- } from "./chunk-ED5NNDKO.mjs";
22
+ } from "./chunk-QYH2T4L5.mjs";
23
23
  import {
24
24
  authenticationService,
25
25
  brandingService_default,
@@ -43,7 +43,7 @@ import {
43
43
  useMemoryStore,
44
44
  useProjectStore,
45
45
  useVectorStore
46
- } from "./chunk-FJO5ZWYU.mjs";
46
+ } from "./chunk-CDQYBO3Q.mjs";
47
47
  import {
48
48
  indexedDBService_default,
49
49
  useModelStore,
@@ -52,7 +52,7 @@ import {
52
52
  } from "./chunk-XUBYA5I7.mjs";
53
53
  import {
54
54
  useAIProviderStore
55
- } from "./chunk-ZNNOTDRD.mjs";
55
+ } from "./chunk-QU5S5QQP.mjs";
56
56
  import {
57
57
  debugLogger
58
58
  } from "./chunk-KCI46M23.mjs";
@@ -9507,4 +9507,4 @@ var chat_default = Chat;
9507
9507
  export {
9508
9508
  chat_default
9509
9509
  };
9510
- //# sourceMappingURL=chunk-ZAVV2AT5.mjs.map
9510
+ //# sourceMappingURL=chunk-WO5KFNNW.mjs.map
package/dist/cli/cli.js CHANGED
@@ -30,7 +30,7 @@ var import_commander = require("commander");
30
30
  // package.json
31
31
  var package_default = {
32
32
  name: "@burtson-labs/bandit-engine",
33
- version: "2.0.37",
33
+ version: "2.0.39",
34
34
  license: "BUSL-1.1",
35
35
  main: "dist/index.js",
36
36
  module: "dist/index.mjs",
@@ -47,8 +47,7 @@ var package_default = {
47
47
  ],
48
48
  repository: {
49
49
  type: "git",
50
- url: "https://github.com/Burtson-Labs/bandit-engine.git",
51
- directory: "packages/bandit-engine"
50
+ url: "https://github.com/Burtson-Labs/bandit-engine.git"
52
51
  },
53
52
  homepage: "https://banditailabs.com/npm-package",
54
53
  author: "Burtson Labs LLC <team@burtson.ai>",