@botonic/plugin-ai-agents 0.49.0 → 0.50.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,8 +2,14 @@ export declare const HUBTYPE_API_URL: string;
2
2
  export declare const LLM_PROVIDERS: {
3
3
  readonly AZURE: "azure";
4
4
  readonly OPENAI: "openai";
5
+ readonly LITELLM: "litellm";
5
6
  };
6
7
  export type LLMProviderType = (typeof LLM_PROVIDERS)[keyof typeof LLM_PROVIDERS];
8
+ export declare const LITELLM_TAG_KEYS: {
9
+ readonly BOT_ID: "bot_id";
10
+ readonly ORG_ID: "org_id";
11
+ readonly SEPARATOR: ",";
12
+ };
7
13
  export declare const LLM_PROVIDER: LLMProviderType;
8
14
  export declare const LLM_API_KEY: string | undefined;
9
15
  export declare const LLM_API_URL: string | undefined;
@@ -1,11 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT_16_SECONDS = exports.MAX_MEMORY_LENGTH = exports.isProd = exports.LLM_OPENAI_MODEL = exports.LLM_AZURE_API_VERSION = exports.LLM_API_URL = exports.LLM_API_KEY = exports.LLM_PROVIDER = exports.LLM_PROVIDERS = exports.HUBTYPE_API_URL = void 0;
3
+ exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT_16_SECONDS = exports.MAX_MEMORY_LENGTH = exports.isProd = exports.LLM_OPENAI_MODEL = exports.LLM_AZURE_API_VERSION = exports.LLM_API_URL = exports.LLM_API_KEY = exports.LLM_PROVIDER = exports.LITELLM_TAG_KEYS = exports.LLM_PROVIDERS = exports.HUBTYPE_API_URL = void 0;
4
4
  exports.HUBTYPE_API_URL = process.env.HUBTYPE_API_URL || 'https://api.hubtype.com';
5
5
  // LLM Configuration (provider-agnostic; set LLM_PROVIDER=azure|openai)
6
6
  exports.LLM_PROVIDERS = {
7
7
  AZURE: 'azure',
8
8
  OPENAI: 'openai',
9
+ LITELLM: 'litellm',
10
+ };
11
+ exports.LITELLM_TAG_KEYS = {
12
+ BOT_ID: 'bot_id',
13
+ ORG_ID: 'org_id',
14
+ SEPARATOR: ',',
9
15
  };
10
16
  exports.LLM_PROVIDER = process.env.LLM_PROVIDER || exports.LLM_PROVIDERS.AZURE;
11
17
  exports.LLM_API_KEY = process.env.LLM_API_KEY; // pragma: allowlist secret
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yBAAyB,CAAA;AAE1D,uEAAuE;AAC1D,QAAA,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;CACR,CAAA;AAIG,QAAA,YAAY,GACtB,OAAO,CAAC,GAAG,CAAC,YAAgC,IAAI,qBAAa,CAAC,KAAK,CAAA;AACzD,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA,CAAC,2BAA2B;AACjE,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;AACrC,QAAA,qBAAqB,GAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,oBAAoB,CAAA;AAC9C,QAAA,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,cAAc,CAAA;AAEjE,QAAA,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;AAE9C,QAAA,iBAAiB,GAAG,EAAE,CAAA;AAEtB,QAAA,0BAA0B,GAAG,KAAK,CAAA;AAClC,QAAA,mBAAmB,GAAG,CAAC,CAAA"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yBAAyB,CAAA;AAE1D,uEAAuE;AAC1D,QAAA,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;CACV,CAAA;AAIG,QAAA,gBAAgB,GAAG;IAC9B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,GAAG;CACN,CAAA;AAEG,QAAA,YAAY,GACtB,OAAO,CAAC,GAAG,CAAC,YAAgC,IAAI,qBAAa,CAAC,KAAK,CAAA;AACzD,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA,CAAC,2BAA2B;AACjE,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;AACrC,QAAA,qBAAqB,GAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,oBAAoB,CAAA;AAC9C,QAAA,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,cAAc,CAAA;AAEjE,QAAA,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;AAE9C,QAAA,iBAAiB,GAAG,EAAE,CAAA;AAEtB,QAAA,0BAA0B,GAAG,KAAK,CAAA;AAClC,QAAA,mBAAmB,GAAG,CAAC,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import type { BotContext, VerbosityLevel } from '@botonic/core';
2
2
  import { type Model, type ModelProvider, type ModelSettings } from '@openai/agents';
3
+ import { type LLMProviderType } from './constants';
3
4
  export interface LLMConfigParams {
4
5
  maxRetries: number;
5
6
  timeout: number;
@@ -17,9 +18,12 @@ export declare class LLMConfig {
17
18
  constructor({ maxRetries, timeout, modelName, verbosity, botContext, }: LLMConfigParams);
18
19
  getModel(): Promise<Model>;
19
20
  private getModelProvider;
21
+ getProviderName(): LLMProviderType;
20
22
  private getClient;
23
+ private buildLiteLLMTags;
24
+ private getLiteLLMClient;
21
25
  private getOpenAIClient;
22
26
  private getAzureOpenAiClient;
23
27
  private getModelSettings;
24
- getApiVersion(): string;
28
+ getApiVersion(): string | undefined;
25
29
  }
@@ -25,12 +25,47 @@ class LLMConfig {
25
25
  useResponses: false,
26
26
  });
27
27
  }
28
+ getProviderName() {
29
+ if (this.botContext.settings.LITELLM_API_URL ||
30
+ constants_1.LLM_PROVIDER === constants_1.LLM_PROVIDERS.LITELLM) {
31
+ return constants_1.LLM_PROVIDERS.LITELLM;
32
+ }
33
+ return constants_1.LLM_PROVIDER;
34
+ }
28
35
  getClient() {
36
+ if (this.getProviderName() === constants_1.LLM_PROVIDERS.LITELLM) {
37
+ const litellmUrl = this.botContext.settings.LITELLM_API_URL || constants_1.LLM_API_URL || '';
38
+ return this.getLiteLLMClient(litellmUrl);
39
+ }
29
40
  if (constants_1.LLM_PROVIDER === constants_1.LLM_PROVIDERS.OPENAI) {
30
41
  return this.getOpenAIClient();
31
42
  }
32
43
  return this.getAzureOpenAiClient();
33
44
  }
45
+ buildLiteLLMTags() {
46
+ const botId = this.botContext.session.bot.id;
47
+ const orgId = this.botContext.session.organization_id;
48
+ const parts = [];
49
+ if (botId) {
50
+ parts.push(`${constants_1.LITELLM_TAG_KEYS.BOT_ID}:${botId}`);
51
+ }
52
+ if (orgId) {
53
+ parts.push(`${constants_1.LITELLM_TAG_KEYS.ORG_ID}:${orgId}`);
54
+ }
55
+ return parts.length > 0
56
+ ? { 'x-litellm-tags': parts.join(constants_1.LITELLM_TAG_KEYS.SEPARATOR) }
57
+ : undefined;
58
+ }
59
+ getLiteLLMClient(litellmUrl) {
60
+ return new openai_1.default({
61
+ apiKey: this.botContext.secrets.LITELLM_API_KEY || constants_1.LLM_API_KEY,
62
+ baseURL: litellmUrl,
63
+ timeout: this.timeout,
64
+ maxRetries: this.maxRetries,
65
+ dangerouslyAllowBrowser: !constants_1.isProd,
66
+ defaultHeaders: this.buildLiteLLMTags(),
67
+ });
68
+ }
34
69
  getOpenAIClient() {
35
70
  return new openai_1.default({
36
71
  apiKey: this.botContext.secrets.AZURE_OPENAI_API_KEY || constants_1.LLM_API_KEY,
@@ -66,9 +101,17 @@ class LLMConfig {
66
101
  text: { verbosity: 'medium' },
67
102
  };
68
103
  }
69
- throw new Error(`Unsupported model: ${model}`);
104
+ // LiteLLM can proxy any model — fall back to reasoning settings
105
+ return {
106
+ reasoning: { effort: 'none' },
107
+ temperature: 1,
108
+ text: { verbosity },
109
+ };
70
110
  }
71
111
  getApiVersion() {
112
+ if (this.getProviderName() === constants_1.LLM_PROVIDERS.LITELLM) {
113
+ return undefined;
114
+ }
72
115
  if (constants_1.LLM_PROVIDER !== constants_1.LLM_PROVIDERS.AZURE) {
73
116
  return 'NOT_API_VERSION_FOR_OPENAI_PROVIDER';
74
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"llm-config.js","sourceRoot":"","sources":["../../src/llm-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm-config.js","sourceRoot":"","sources":["../../src/llm-config.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ export interface LlmRunData {
14
14
  deployment_name: string;
15
15
  model_name: string;
16
16
  feature: string;
17
- api_version: string;
17
+ api_version?: string;
18
18
  num_prompt_tokens: number;
19
19
  num_completion_tokens: number;
20
20
  duration_in_milliseconds: number;
@@ -2,8 +2,14 @@ export declare const HUBTYPE_API_URL: string;
2
2
  export declare const LLM_PROVIDERS: {
3
3
  readonly AZURE: "azure";
4
4
  readonly OPENAI: "openai";
5
+ readonly LITELLM: "litellm";
5
6
  };
6
7
  export type LLMProviderType = (typeof LLM_PROVIDERS)[keyof typeof LLM_PROVIDERS];
8
+ export declare const LITELLM_TAG_KEYS: {
9
+ readonly BOT_ID: "bot_id";
10
+ readonly ORG_ID: "org_id";
11
+ readonly SEPARATOR: ",";
12
+ };
7
13
  export declare const LLM_PROVIDER: LLMProviderType;
8
14
  export declare const LLM_API_KEY: string | undefined;
9
15
  export declare const LLM_API_URL: string | undefined;
@@ -1,11 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT_16_SECONDS = exports.MAX_MEMORY_LENGTH = exports.isProd = exports.LLM_OPENAI_MODEL = exports.LLM_AZURE_API_VERSION = exports.LLM_API_URL = exports.LLM_API_KEY = exports.LLM_PROVIDER = exports.LLM_PROVIDERS = exports.HUBTYPE_API_URL = void 0;
3
+ exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_TIMEOUT_16_SECONDS = exports.MAX_MEMORY_LENGTH = exports.isProd = exports.LLM_OPENAI_MODEL = exports.LLM_AZURE_API_VERSION = exports.LLM_API_URL = exports.LLM_API_KEY = exports.LLM_PROVIDER = exports.LITELLM_TAG_KEYS = exports.LLM_PROVIDERS = exports.HUBTYPE_API_URL = void 0;
4
4
  exports.HUBTYPE_API_URL = process.env.HUBTYPE_API_URL || 'https://api.hubtype.com';
5
5
  // LLM Configuration (provider-agnostic; set LLM_PROVIDER=azure|openai)
6
6
  exports.LLM_PROVIDERS = {
7
7
  AZURE: 'azure',
8
8
  OPENAI: 'openai',
9
+ LITELLM: 'litellm',
10
+ };
11
+ exports.LITELLM_TAG_KEYS = {
12
+ BOT_ID: 'bot_id',
13
+ ORG_ID: 'org_id',
14
+ SEPARATOR: ',',
9
15
  };
10
16
  exports.LLM_PROVIDER = process.env.LLM_PROVIDER || exports.LLM_PROVIDERS.AZURE;
11
17
  exports.LLM_API_KEY = process.env.LLM_API_KEY; // pragma: allowlist secret
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yBAAyB,CAAA;AAE1D,uEAAuE;AAC1D,QAAA,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;CACR,CAAA;AAIG,QAAA,YAAY,GACtB,OAAO,CAAC,GAAG,CAAC,YAAgC,IAAI,qBAAa,CAAC,KAAK,CAAA;AACzD,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA,CAAC,2BAA2B;AACjE,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;AACrC,QAAA,qBAAqB,GAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,oBAAoB,CAAA;AAC9C,QAAA,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,cAAc,CAAA;AAEjE,QAAA,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;AAE9C,QAAA,iBAAiB,GAAG,EAAE,CAAA;AAEtB,QAAA,0BAA0B,GAAG,KAAK,CAAA;AAClC,QAAA,mBAAmB,GAAG,CAAC,CAAA"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yBAAyB,CAAA;AAE1D,uEAAuE;AAC1D,QAAA,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;CACV,CAAA;AAIG,QAAA,gBAAgB,GAAG;IAC9B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,GAAG;CACN,CAAA;AAEG,QAAA,YAAY,GACtB,OAAO,CAAC,GAAG,CAAC,YAAgC,IAAI,qBAAa,CAAC,KAAK,CAAA;AACzD,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA,CAAC,2BAA2B;AACjE,QAAA,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;AACrC,QAAA,qBAAqB,GAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,oBAAoB,CAAA;AAC9C,QAAA,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,cAAc,CAAA;AAEjE,QAAA,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;AAE9C,QAAA,iBAAiB,GAAG,EAAE,CAAA;AAEtB,QAAA,0BAA0B,GAAG,KAAK,CAAA;AAClC,QAAA,mBAAmB,GAAG,CAAC,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import type { BotContext, VerbosityLevel } from '@botonic/core';
2
2
  import { type Model, type ModelProvider, type ModelSettings } from '@openai/agents';
3
+ import { type LLMProviderType } from './constants';
3
4
  export interface LLMConfigParams {
4
5
  maxRetries: number;
5
6
  timeout: number;
@@ -17,9 +18,12 @@ export declare class LLMConfig {
17
18
  constructor({ maxRetries, timeout, modelName, verbosity, botContext, }: LLMConfigParams);
18
19
  getModel(): Promise<Model>;
19
20
  private getModelProvider;
21
+ getProviderName(): LLMProviderType;
20
22
  private getClient;
23
+ private buildLiteLLMTags;
24
+ private getLiteLLMClient;
21
25
  private getOpenAIClient;
22
26
  private getAzureOpenAiClient;
23
27
  private getModelSettings;
24
- getApiVersion(): string;
28
+ getApiVersion(): string | undefined;
25
29
  }
@@ -25,12 +25,47 @@ class LLMConfig {
25
25
  useResponses: false,
26
26
  });
27
27
  }
28
+ getProviderName() {
29
+ if (this.botContext.settings.LITELLM_API_URL ||
30
+ constants_1.LLM_PROVIDER === constants_1.LLM_PROVIDERS.LITELLM) {
31
+ return constants_1.LLM_PROVIDERS.LITELLM;
32
+ }
33
+ return constants_1.LLM_PROVIDER;
34
+ }
28
35
  getClient() {
36
+ if (this.getProviderName() === constants_1.LLM_PROVIDERS.LITELLM) {
37
+ const litellmUrl = this.botContext.settings.LITELLM_API_URL || constants_1.LLM_API_URL || '';
38
+ return this.getLiteLLMClient(litellmUrl);
39
+ }
29
40
  if (constants_1.LLM_PROVIDER === constants_1.LLM_PROVIDERS.OPENAI) {
30
41
  return this.getOpenAIClient();
31
42
  }
32
43
  return this.getAzureOpenAiClient();
33
44
  }
45
+ buildLiteLLMTags() {
46
+ const botId = this.botContext.session.bot.id;
47
+ const orgId = this.botContext.session.organization_id;
48
+ const parts = [];
49
+ if (botId) {
50
+ parts.push(`${constants_1.LITELLM_TAG_KEYS.BOT_ID}:${botId}`);
51
+ }
52
+ if (orgId) {
53
+ parts.push(`${constants_1.LITELLM_TAG_KEYS.ORG_ID}:${orgId}`);
54
+ }
55
+ return parts.length > 0
56
+ ? { 'x-litellm-tags': parts.join(constants_1.LITELLM_TAG_KEYS.SEPARATOR) }
57
+ : undefined;
58
+ }
59
+ getLiteLLMClient(litellmUrl) {
60
+ return new openai_1.default({
61
+ apiKey: this.botContext.secrets.LITELLM_API_KEY || constants_1.LLM_API_KEY,
62
+ baseURL: litellmUrl,
63
+ timeout: this.timeout,
64
+ maxRetries: this.maxRetries,
65
+ dangerouslyAllowBrowser: !constants_1.isProd,
66
+ defaultHeaders: this.buildLiteLLMTags(),
67
+ });
68
+ }
34
69
  getOpenAIClient() {
35
70
  return new openai_1.default({
36
71
  apiKey: this.botContext.secrets.AZURE_OPENAI_API_KEY || constants_1.LLM_API_KEY,
@@ -66,9 +101,17 @@ class LLMConfig {
66
101
  text: { verbosity: 'medium' },
67
102
  };
68
103
  }
69
- throw new Error(`Unsupported model: ${model}`);
104
+ // LiteLLM can proxy any model — fall back to reasoning settings
105
+ return {
106
+ reasoning: { effort: 'none' },
107
+ temperature: 1,
108
+ text: { verbosity },
109
+ };
70
110
  }
71
111
  getApiVersion() {
112
+ if (this.getProviderName() === constants_1.LLM_PROVIDERS.LITELLM) {
113
+ return undefined;
114
+ }
72
115
  if (constants_1.LLM_PROVIDER !== constants_1.LLM_PROVIDERS.AZURE) {
73
116
  return 'NOT_API_VERSION_FOR_OPENAI_PROVIDER';
74
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"llm-config.js","sourceRoot":"","sources":["../../src/llm-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm-config.js","sourceRoot":"","sources":["../../src/llm-config.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ export interface LlmRunData {
14
14
  deployment_name: string;
15
15
  model_name: string;
16
16
  feature: string;
17
- api_version: string;
17
+ api_version?: string;
18
18
  num_prompt_tokens: number;
19
19
  num_completion_tokens: number;
20
20
  duration_in_milliseconds: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botonic/plugin-ai-agents",
3
- "version": "0.49.0",
3
+ "version": "0.50.0-alpha.0",
4
4
  "main": "./lib/cjs/index.js",
5
5
  "module": "./lib/esm/index.js",
6
6
  "description": "Use AI Agents to generate your contents",
package/src/constants.ts CHANGED
@@ -5,10 +5,17 @@ export const HUBTYPE_API_URL =
5
5
  export const LLM_PROVIDERS = {
6
6
  AZURE: 'azure',
7
7
  OPENAI: 'openai',
8
+ LITELLM: 'litellm',
8
9
  } as const
9
10
 
10
11
  export type LLMProviderType = (typeof LLM_PROVIDERS)[keyof typeof LLM_PROVIDERS]
11
12
 
13
+ export const LITELLM_TAG_KEYS = {
14
+ BOT_ID: 'bot_id',
15
+ ORG_ID: 'org_id',
16
+ SEPARATOR: ',',
17
+ } as const
18
+
12
19
  export const LLM_PROVIDER: LLMProviderType =
13
20
  (process.env.LLM_PROVIDER as LLMProviderType) || LLM_PROVIDERS.AZURE
14
21
  export const LLM_API_KEY = process.env.LLM_API_KEY // pragma: allowlist secret
package/src/llm-config.ts CHANGED
@@ -8,12 +8,14 @@ import {
8
8
  import OpenAI, { AzureOpenAI } from 'openai'
9
9
  import {
10
10
  isProd,
11
+ LITELLM_TAG_KEYS,
11
12
  LLM_API_KEY,
12
13
  LLM_API_URL,
13
14
  LLM_AZURE_API_VERSION,
14
15
  LLM_OPENAI_MODEL,
15
16
  LLM_PROVIDER,
16
17
  LLM_PROVIDERS,
18
+ type LLMProviderType,
17
19
  } from './constants'
18
20
 
19
21
  export interface LLMConfigParams {
@@ -60,14 +62,54 @@ export class LLMConfig {
60
62
  })
61
63
  }
62
64
 
65
+ getProviderName(): LLMProviderType {
66
+ if (
67
+ this.botContext.settings.LITELLM_API_URL ||
68
+ LLM_PROVIDER === LLM_PROVIDERS.LITELLM
69
+ ) {
70
+ return LLM_PROVIDERS.LITELLM
71
+ }
72
+ return LLM_PROVIDER
73
+ }
74
+
63
75
  private getClient(): OpenAI | AzureOpenAI {
76
+ if (this.getProviderName() === LLM_PROVIDERS.LITELLM) {
77
+ const litellmUrl =
78
+ this.botContext.settings.LITELLM_API_URL || LLM_API_URL || ''
79
+ return this.getLiteLLMClient(litellmUrl)
80
+ }
64
81
  if (LLM_PROVIDER === LLM_PROVIDERS.OPENAI) {
65
82
  return this.getOpenAIClient()
66
83
  }
67
-
68
84
  return this.getAzureOpenAiClient()
69
85
  }
70
86
 
87
+ private buildLiteLLMTags(): { 'x-litellm-tags': string } | undefined {
88
+ const botId = this.botContext.session.bot.id
89
+ const orgId = this.botContext.session.organization_id
90
+ const parts: string[] = []
91
+ if (botId) {
92
+ parts.push(`${LITELLM_TAG_KEYS.BOT_ID}:${botId}`)
93
+ }
94
+ if (orgId) {
95
+ parts.push(`${LITELLM_TAG_KEYS.ORG_ID}:${orgId}`)
96
+ }
97
+ return parts.length > 0
98
+ ? { 'x-litellm-tags': parts.join(LITELLM_TAG_KEYS.SEPARATOR) }
99
+ : undefined
100
+ }
101
+
102
+ private getLiteLLMClient(litellmUrl: string): OpenAI {
103
+ return new OpenAI({
104
+ apiKey: this.botContext.secrets.LITELLM_API_KEY || LLM_API_KEY,
105
+ baseURL: litellmUrl,
106
+ timeout: this.timeout,
107
+ maxRetries: this.maxRetries,
108
+ dangerouslyAllowBrowser: !isProd,
109
+ defaultHeaders: this.buildLiteLLMTags(),
110
+ })
111
+ }
112
+
71
113
  private getOpenAIClient(): OpenAI {
72
114
  return new OpenAI({
73
115
  apiKey: this.botContext.secrets.AZURE_OPENAI_API_KEY || LLM_API_KEY,
@@ -112,10 +154,18 @@ export class LLMConfig {
112
154
  }
113
155
  }
114
156
 
115
- throw new Error(`Unsupported model: ${model}`)
157
+ // LiteLLM can proxy any model — fall back to reasoning settings
158
+ return {
159
+ reasoning: { effort: 'none' },
160
+ temperature: 1,
161
+ text: { verbosity },
162
+ }
116
163
  }
117
164
 
118
- getApiVersion(): string {
165
+ getApiVersion(): string | undefined {
166
+ if (this.getProviderName() === LLM_PROVIDERS.LITELLM) {
167
+ return undefined
168
+ }
119
169
  if (LLM_PROVIDER !== LLM_PROVIDERS.AZURE) {
120
170
  return 'NOT_API_VERSION_FOR_OPENAI_PROVIDER'
121
171
  }
@@ -17,7 +17,7 @@ export interface LlmRunData {
17
17
  deployment_name: string
18
18
  model_name: string
19
19
  feature: string
20
- api_version: string
20
+ api_version?: string
21
21
  num_prompt_tokens: number
22
22
  num_completion_tokens: number
23
23
  duration_in_milliseconds: number