litellmts-core 1.1.0 → 2.0.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.
Files changed (40) hide show
  1. package/README.md +44 -19
  2. package/dist/handlers/ai21.js +7 -5
  3. package/dist/handlers/anthropic.d.ts +1 -1
  4. package/dist/handlers/anthropic.js +22 -103
  5. package/dist/handlers/cohere.js +21 -5
  6. package/dist/handlers/copilot.js +4 -2
  7. package/dist/handlers/deepinfra.js +15 -2
  8. package/dist/handlers/gemini.d.ts +1 -1
  9. package/dist/handlers/gemini.js +41 -89
  10. package/dist/handlers/geminiEmbedding.d.ts +1 -1
  11. package/dist/handlers/geminiEmbedding.js +6 -9
  12. package/dist/handlers/mistral.js +15 -2
  13. package/dist/handlers/ollama.js +10 -2
  14. package/dist/handlers/openai.js +18 -3
  15. package/dist/handlers/openaiEmbedding.js +5 -2
  16. package/dist/handlers/openaiLike.d.ts +1 -1
  17. package/dist/handlers/openaiLike.js +26 -3
  18. package/dist/handlers/openaiLikeEmbedding.d.ts +1 -1
  19. package/dist/handlers/openaiLikeEmbedding.js +6 -2
  20. package/dist/handlers/replicate.js +15 -2
  21. package/dist/handlers/vertexAnthropic.d.ts +2 -0
  22. package/dist/handlers/vertexAnthropic.js +43 -0
  23. package/dist/handlers/vertexai.d.ts +2 -0
  24. package/dist/handlers/vertexai.js +51 -0
  25. package/dist/handlers/vertexaiEmbedding.d.ts +2 -0
  26. package/dist/handlers/vertexaiEmbedding.js +31 -0
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.js +5 -1
  29. package/dist/mappings/openaiLike.js +0 -5
  30. package/dist/models/index.d.ts +2 -0
  31. package/dist/models/index.js +7 -0
  32. package/dist/models/registry.d.ts +13 -0
  33. package/dist/models/registry.js +32 -0
  34. package/dist/models/types.d.ts +9 -0
  35. package/dist/models/types.js +2 -0
  36. package/dist/utils/anthropic.d.ts +10 -0
  37. package/dist/utils/anthropic.js +99 -0
  38. package/dist/utils/gemini.d.ts +12 -0
  39. package/dist/utils/gemini.js +73 -0
  40. package/package.json +2 -2
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.OpenAIHandler = OpenAIHandler;
7
7
  const openai_1 = __importDefault(require("openai"));
8
+ const registry_1 = require("../models/registry");
8
9
  function toOpenAIMessages(messages) {
9
10
  return messages;
10
11
  }
@@ -31,6 +32,9 @@ async function OpenAIHandler(params) {
31
32
  const { apiKey: providedApiKey, baseUrl: providedBaseUrl, ...completionsParams } = params;
32
33
  const apiKey = providedApiKey ?? process.env.OPENAI_API_KEY;
33
34
  const baseUrl = providedBaseUrl ?? 'https://api.openai.com/v1';
35
+ const modelName = completionsParams.model.startsWith('openai/')
36
+ ? completionsParams.model.slice(7)
37
+ : completionsParams.model;
34
38
  const openai = new openai_1.default({
35
39
  apiKey: apiKey,
36
40
  baseURL: baseUrl,
@@ -41,6 +45,7 @@ async function OpenAIHandler(params) {
41
45
  try {
42
46
  response = await openai.chat.completions.create({
43
47
  ...completionsParams,
48
+ model: modelName,
44
49
  stream: true,
45
50
  messages,
46
51
  });
@@ -54,6 +59,7 @@ async function OpenAIHandler(params) {
54
59
  try {
55
60
  response = await openai.chat.completions.create({
56
61
  ...completionsParams,
62
+ model: modelName,
57
63
  stream: false,
58
64
  messages,
59
65
  });
@@ -83,6 +89,15 @@ async function OpenAIHandler(params) {
83
89
  };
84
90
  return result;
85
91
  }
86
- const registry_1 = require("../registry");
87
- (0, registry_1.registerCompletionHandler)('gpt-', OpenAIHandler);
88
- (0, registry_1.registerCompletionHandler)('openai/', OpenAIHandler);
92
+ (0, registry_1.registerModelProvider)('openai', async ({ apiKey } = {}) => {
93
+ const key = apiKey ?? process.env.OPENAI_API_KEY;
94
+ if (!key)
95
+ return [];
96
+ const res = await fetch('https://api.openai.com/v1/models', {
97
+ headers: { Authorization: `Bearer ${key}` },
98
+ });
99
+ const { data } = await res.json();
100
+ return data.map((m) => ({ id: m.id, provider: 'openai', created: m.created }));
101
+ });
102
+ const registry_2 = require("../registry");
103
+ (0, registry_2.registerCompletionHandler)('openai/', OpenAIHandler);
@@ -8,16 +8,19 @@ const openai_1 = __importDefault(require("openai"));
8
8
  async function OpenAIEmbeddingHandler(params) {
9
9
  const apiKey = params.apiKey ?? process.env.OPENAI_API_KEY;
10
10
  const baseUrl = params.baseUrl;
11
+ const modelName = params.model.startsWith('openai/')
12
+ ? params.model.slice(7)
13
+ : params.model;
11
14
  const openai = new openai_1.default({
12
15
  apiKey: apiKey,
13
16
  baseURL: baseUrl,
14
17
  });
15
18
  try {
16
- return await openai.embeddings.create({ input: params.input, model: params.model });
19
+ return await openai.embeddings.create({ input: params.input, model: modelName });
17
20
  }
18
21
  catch (err) {
19
22
  throw new Error(`OpenAI embedding API error: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
20
23
  }
21
24
  }
22
25
  const registry_1 = require("../registry");
23
- (0, registry_1.registerEmbeddingHandler)('text-embedding-', OpenAIEmbeddingHandler);
26
+ (0, registry_1.registerEmbeddingHandler)('openai/', OpenAIEmbeddingHandler);
@@ -1,3 +1,3 @@
1
1
  import type { Handler } from '../types';
2
2
  import type { OpenAILikeConfig } from '../mappings/openaiLike';
3
- export declare function createOpenAILikeHandler(config: OpenAILikeConfig): Handler;
3
+ export declare function createOpenAILikeHandler(prefix: string, config: OpenAILikeConfig): Handler;
@@ -2,21 +2,44 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createOpenAILikeHandler = createOpenAILikeHandler;
4
4
  const openai_1 = require("./openai");
5
- function createOpenAILikeHandler(config) {
5
+ const registry_1 = require("../models/registry");
6
+ function createOpenAILikeHandler(prefix, config) {
6
7
  return async (params) => {
7
8
  const apiKey = params.apiKey ?? process.env[config.apiKeyEnv];
8
9
  if (!apiKey) {
9
10
  throw new Error(`${config.name} requires an API key. Set the ${config.apiKeyEnv} environment variable or pass apiKey in params.`);
10
11
  }
12
+ const modelName = params.model.startsWith(prefix)
13
+ ? params.model.slice(prefix.length)
14
+ : params.model;
11
15
  return (0, openai_1.OpenAIHandler)({
12
16
  ...params,
17
+ model: modelName,
13
18
  apiKey,
14
19
  baseUrl: config.baseUrl,
15
20
  });
16
21
  };
17
22
  }
18
23
  const openaiLike_1 = require("../mappings/openaiLike");
19
- const registry_1 = require("../registry");
24
+ const registry_2 = require("../registry");
20
25
  for (const [prefix, config] of Object.entries(openaiLike_1.OPENAI_LIKE_MAPPINGS)) {
21
- (0, registry_1.registerCompletionHandler)(prefix, createOpenAILikeHandler(config));
26
+ (0, registry_2.registerCompletionHandler)(prefix, createOpenAILikeHandler(prefix, config));
27
+ const provider = prefix.replace('/', '');
28
+ (0, registry_1.registerModelProvider)(provider, async ({ apiKey } = {}) => {
29
+ const key = apiKey ?? process.env[config.apiKeyEnv];
30
+ if (!key)
31
+ return [];
32
+ try {
33
+ const res = await fetch(`${config.baseUrl}/models`, {
34
+ headers: { Authorization: `Bearer ${key}` },
35
+ });
36
+ if (!res.ok)
37
+ return [];
38
+ const { data } = await res.json();
39
+ return (data ?? []).map((m) => ({ id: m.id, provider }));
40
+ }
41
+ catch {
42
+ return [];
43
+ }
44
+ });
22
45
  }
@@ -1,3 +1,3 @@
1
1
  import type { EmbeddingParams, EmbeddingResponse } from '../types';
2
2
  import type { OpenAILikeConfig } from '../mappings/openaiLike';
3
- export declare function createOpenAILikeEmbeddingHandler(config: OpenAILikeConfig): (params: EmbeddingParams) => Promise<EmbeddingResponse>;
3
+ export declare function createOpenAILikeEmbeddingHandler(prefix: string, config: OpenAILikeConfig): (params: EmbeddingParams) => Promise<EmbeddingResponse>;
@@ -2,14 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createOpenAILikeEmbeddingHandler = createOpenAILikeEmbeddingHandler;
4
4
  const openaiEmbedding_1 = require("./openaiEmbedding");
5
- function createOpenAILikeEmbeddingHandler(config) {
5
+ function createOpenAILikeEmbeddingHandler(prefix, config) {
6
6
  return async (params) => {
7
7
  const apiKey = params.apiKey ?? process.env[config.apiKeyEnv];
8
8
  if (!apiKey) {
9
9
  throw new Error(`${config.name} requires an API key. Set the ${config.apiKeyEnv} environment variable or pass apiKey in params.`);
10
10
  }
11
+ const modelName = params.model.startsWith(prefix)
12
+ ? params.model.slice(prefix.length)
13
+ : params.model;
11
14
  return (0, openaiEmbedding_1.OpenAIEmbeddingHandler)({
12
15
  ...params,
16
+ model: modelName,
13
17
  apiKey,
14
18
  baseUrl: config.baseUrl,
15
19
  });
@@ -18,5 +22,5 @@ function createOpenAILikeEmbeddingHandler(config) {
18
22
  const openaiLike_1 = require("../mappings/openaiLike");
19
23
  const registry_1 = require("../registry");
20
24
  for (const [prefix, config] of Object.entries(openaiLike_1.OPENAI_LIKE_MAPPINGS)) {
21
- (0, registry_1.registerEmbeddingHandler)(prefix, createOpenAILikeEmbeddingHandler(config));
25
+ (0, registry_1.registerEmbeddingHandler)(prefix, createOpenAILikeEmbeddingHandler(prefix, config));
22
26
  }
@@ -106,5 +106,18 @@ async function ReplicateHandler(params) {
106
106
  }
107
107
  return handleNonStreamingPrediction(prompt, prediction, replicate, modelName);
108
108
  }
109
- const registry_1 = require("../registry");
110
- (0, registry_1.registerCompletionHandler)('replicate/', ReplicateHandler);
109
+ const registry_1 = require("../models/registry");
110
+ (0, registry_1.registerModelProvider)('replicate', async ({ apiKey } = {}) => {
111
+ const key = apiKey ?? process.env.REPLICATE_API_KEY;
112
+ if (!key)
113
+ return [];
114
+ const res = await fetch('https://api.replicate.com/v1/models', {
115
+ headers: { Authorization: `Bearer ${key}` },
116
+ });
117
+ if (!res.ok)
118
+ return [];
119
+ const { results } = await res.json();
120
+ return (results ?? []).map((m) => ({ id: `${m.owner}/${m.name}`, provider: 'replicate' }));
121
+ });
122
+ const registry_2 = require("../registry");
123
+ (0, registry_2.registerCompletionHandler)('replicate/', ReplicateHandler);
@@ -0,0 +1,2 @@
1
+ import type { HandlerParams, ResultNotStreaming, ResultStreaming } from '../types';
2
+ export declare function VertexAnthropicHandler(params: HandlerParams): Promise<ResultNotStreaming | ResultStreaming>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VertexAnthropicHandler = VertexAnthropicHandler;
4
+ const vertex_sdk_1 = require("@anthropic-ai/vertex-sdk");
5
+ const anthropic_1 = require("../utils/anthropic");
6
+ async function VertexAnthropicHandler(params) {
7
+ const project = params.project ?? process.env.GCP_PROJECT;
8
+ if (!project)
9
+ throw new Error('Vertex AI Anthropic requires GCP_PROJECT environment variable or project in params.');
10
+ const region = params.location ?? process.env.CLOUD_ML_REGION ?? 'us-central1';
11
+ const modelName = params.model.startsWith('vertex/')
12
+ ? params.model.slice(7)
13
+ : params.model;
14
+ const anthropic = new vertex_sdk_1.AnthropicVertex({
15
+ projectId: project,
16
+ region,
17
+ });
18
+ const { system, messages } = (0, anthropic_1.toAnthropicMessages)(params.messages);
19
+ try {
20
+ if (params.stream) {
21
+ const stream = await anthropic.messages.create({
22
+ model: modelName,
23
+ max_tokens: params.max_tokens ?? 300,
24
+ messages,
25
+ ...(system ? { system } : {}),
26
+ stream: true,
27
+ });
28
+ return (0, anthropic_1.toAnthropicStreamingResponse)(stream);
29
+ }
30
+ const message = await anthropic.messages.create({
31
+ model: modelName,
32
+ max_tokens: params.max_tokens ?? 300,
33
+ messages,
34
+ ...(system ? { system } : {}),
35
+ });
36
+ return (0, anthropic_1.toAnthropicResponse)(message);
37
+ }
38
+ catch (err) {
39
+ throw new Error(`Vertex Anthropic error: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
40
+ }
41
+ }
42
+ const registry_1 = require("../registry");
43
+ (0, registry_1.registerCompletionHandler)('vertex/claude-', VertexAnthropicHandler);
@@ -0,0 +1,2 @@
1
+ import type { HandlerParams, ResultNotStreaming, ResultStreaming } from '../types';
2
+ export declare function VertexAIHandler(params: HandlerParams): Promise<ResultNotStreaming | ResultStreaming>;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VertexAIHandler = VertexAIHandler;
4
+ const genai_1 = require("@google/genai");
5
+ const gemini_1 = require("../utils/gemini");
6
+ async function VertexAIHandler(params) {
7
+ const project = params.project ?? process.env.GCP_PROJECT;
8
+ if (!project)
9
+ throw new Error('Vertex AI requires GCP_PROJECT environment variable or project in params.');
10
+ const location = params.location ?? process.env.GCP_LOCATION ?? 'us-central1';
11
+ const modelName = params.model.startsWith('vertex/')
12
+ ? params.model.slice(7)
13
+ : params.model;
14
+ const client = new genai_1.GoogleGenAI({
15
+ vertexai: true,
16
+ project,
17
+ location,
18
+ });
19
+ const contents = (0, gemini_1.toGeminiContent)(params.messages);
20
+ try {
21
+ if (params.stream) {
22
+ const stream = await client.models.generateContentStream({
23
+ model: modelName,
24
+ contents,
25
+ config: {
26
+ temperature: params.temperature ?? undefined,
27
+ topP: params.top_p ?? undefined,
28
+ maxOutputTokens: params.max_tokens ?? undefined,
29
+ stopSequences: params.stop ? (Array.isArray(params.stop) ? params.stop : [params.stop]) : undefined,
30
+ },
31
+ });
32
+ return (0, gemini_1.toStreamingResponse)(stream, modelName);
33
+ }
34
+ const response = await client.models.generateContent({
35
+ model: modelName,
36
+ contents,
37
+ config: {
38
+ temperature: params.temperature ?? undefined,
39
+ topP: params.top_p ?? undefined,
40
+ maxOutputTokens: params.max_tokens ?? undefined,
41
+ stopSequences: params.stop ? (Array.isArray(params.stop) ? params.stop : [params.stop]) : undefined,
42
+ },
43
+ });
44
+ return (0, gemini_1.toResponse)(response, modelName);
45
+ }
46
+ catch (err) {
47
+ throw new Error(`Vertex AI error: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
48
+ }
49
+ }
50
+ const registry_1 = require("../registry");
51
+ (0, registry_1.registerCompletionHandler)('vertex/', VertexAIHandler);
@@ -0,0 +1,2 @@
1
+ import type { EmbeddingParams, EmbeddingResponse } from '../types';
2
+ export declare function VertexAIEmbeddingHandler(params: EmbeddingParams): Promise<EmbeddingResponse>;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VertexAIEmbeddingHandler = VertexAIEmbeddingHandler;
4
+ const genai_1 = require("@google/genai");
5
+ async function VertexAIEmbeddingHandler(params) {
6
+ const project = params.project ?? process.env.GCP_PROJECT;
7
+ if (!project)
8
+ throw new Error('Vertex AI requires GCP_PROJECT environment variable or project in params.');
9
+ const location = params.location ?? process.env.GCP_LOCATION ?? 'us-central1';
10
+ const modelName = params.model.startsWith('vertex/')
11
+ ? params.model.slice(7)
12
+ : params.model;
13
+ const client = new genai_1.GoogleGenAI({
14
+ vertexai: true,
15
+ project,
16
+ location,
17
+ });
18
+ const input = typeof params.input === 'string'
19
+ ? params.input
20
+ : params.input.join(' ');
21
+ const result = await client.models.embedContent({
22
+ model: modelName,
23
+ contents: [{ role: 'user', parts: [{ text: input }] }],
24
+ });
25
+ return {
26
+ model: modelName,
27
+ data: [{ embedding: result.embeddings?.[0]?.values ?? [], index: 0 }],
28
+ };
29
+ }
30
+ const registry_1 = require("../registry");
31
+ (0, registry_1.registerEmbeddingHandler)('vertex/', VertexAIEmbeddingHandler);
package/dist/index.d.ts CHANGED
@@ -7,4 +7,5 @@
7
7
  */
8
8
  export { completion } from './completion';
9
9
  export { embedding } from './embedding';
10
+ export { listModels, listProviders, clearModelCache } from './models';
10
11
  export { login, loginAnthropic, getValidToken, getAnthropicKey } from './auth';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAnthropicKey = exports.getValidToken = exports.loginAnthropic = exports.login = exports.embedding = exports.completion = void 0;
3
+ exports.getAnthropicKey = exports.getValidToken = exports.loginAnthropic = exports.login = exports.clearModelCache = exports.listProviders = exports.listModels = exports.embedding = exports.completion = void 0;
4
4
  /**
5
5
  * @litellmts/core — Unified API client for 45+ LLM providers.
6
6
  *
@@ -12,6 +12,10 @@ var completion_1 = require("./completion");
12
12
  Object.defineProperty(exports, "completion", { enumerable: true, get: function () { return completion_1.completion; } });
13
13
  var embedding_1 = require("./embedding");
14
14
  Object.defineProperty(exports, "embedding", { enumerable: true, get: function () { return embedding_1.embedding; } });
15
+ var models_1 = require("./models");
16
+ Object.defineProperty(exports, "listModels", { enumerable: true, get: function () { return models_1.listModels; } });
17
+ Object.defineProperty(exports, "listProviders", { enumerable: true, get: function () { return models_1.listProviders; } });
18
+ Object.defineProperty(exports, "clearModelCache", { enumerable: true, get: function () { return models_1.clearModelCache; } });
15
19
  var auth_1 = require("./auth");
16
20
  Object.defineProperty(exports, "login", { enumerable: true, get: function () { return auth_1.login; } });
17
21
  Object.defineProperty(exports, "loginAnthropic", { enumerable: true, get: function () { return auth_1.loginAnthropic; } });
@@ -77,11 +77,6 @@ exports.OPENAI_LIKE_MAPPINGS = {
77
77
  baseUrl: 'https://integrate.api.nvidia.com/v1',
78
78
  apiKeyEnv: 'NVIDIA_API_KEY',
79
79
  },
80
- 'ai21/': {
81
- name: 'AI21 Labs',
82
- baseUrl: 'https://api.ai21.com/studio/v1',
83
- apiKeyEnv: 'AI21_API_KEY',
84
- },
85
80
  'codestral/': {
86
81
  name: 'Codestral',
87
82
  baseUrl: 'https://codestral.mistral.ai/v1',
@@ -0,0 +1,2 @@
1
+ export { listModels, listProviders, clearModelCache } from './registry';
2
+ export type { ModelInfo, ProviderInfo } from './types';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clearModelCache = exports.listProviders = exports.listModels = void 0;
4
+ var registry_1 = require("./registry");
5
+ Object.defineProperty(exports, "listModels", { enumerable: true, get: function () { return registry_1.listModels; } });
6
+ Object.defineProperty(exports, "listProviders", { enumerable: true, get: function () { return registry_1.listProviders; } });
7
+ Object.defineProperty(exports, "clearModelCache", { enumerable: true, get: function () { return registry_1.clearModelCache; } });
@@ -0,0 +1,13 @@
1
+ import type { ModelInfo, ProviderInfo } from './types';
2
+ type ModelFetcher = (params?: {
3
+ apiKey?: string;
4
+ baseUrl?: string;
5
+ }) => Promise<ModelInfo[]>;
6
+ export declare function registerModelProvider(provider: string, fetcher: ModelFetcher): void;
7
+ export declare function listModels(provider: string, opts?: {
8
+ apiKey?: string;
9
+ baseUrl?: string;
10
+ }): Promise<ModelInfo[]>;
11
+ export declare function listProviders(): ProviderInfo[];
12
+ export declare function clearModelCache(): void;
13
+ export {};
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerModelProvider = registerModelProvider;
4
+ exports.listModels = listModels;
5
+ exports.listProviders = listProviders;
6
+ exports.clearModelCache = clearModelCache;
7
+ const fetchers = new Map();
8
+ const cache = new Map();
9
+ const CACHE_TTL = 5 * 60 * 1000;
10
+ function registerModelProvider(provider, fetcher) {
11
+ fetchers.set(provider, fetcher);
12
+ }
13
+ async function listModels(provider, opts) {
14
+ const cached = cache.get(provider);
15
+ if (cached && cached.expires > Date.now())
16
+ return cached.data;
17
+ const fetcher = fetchers.get(provider);
18
+ if (!fetcher)
19
+ throw new Error(`Provider '${provider}' not found.`);
20
+ const data = await fetcher(opts);
21
+ cache.set(provider, { data, expires: Date.now() + CACHE_TTL });
22
+ return data;
23
+ }
24
+ function listProviders() {
25
+ return Array.from(fetchers.keys()).map((key) => ({
26
+ name: key,
27
+ hasModelList: true,
28
+ }));
29
+ }
30
+ function clearModelCache() {
31
+ cache.clear();
32
+ }
@@ -0,0 +1,9 @@
1
+ export interface ModelInfo {
2
+ id: string;
3
+ provider: string;
4
+ created?: number;
5
+ }
6
+ export interface ProviderInfo {
7
+ name: string;
8
+ hasModelList: boolean;
9
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ import type Anthropic from '@anthropic-ai/sdk';
2
+ import type { Message, FinishReason, ResultNotStreaming, ResultStreaming } from '../types';
3
+ export declare function toAnthropicMessages(input: Message[]): {
4
+ system: string | undefined;
5
+ messages: Anthropic.MessageParam[];
6
+ };
7
+ export declare function toAnthropicFinishReason(reason: Anthropic.StopReason | null | undefined): FinishReason;
8
+ export declare function getTextContent(content: Anthropic.ContentBlock[]): string;
9
+ export declare function toAnthropicResponse(message: Anthropic.Message): ResultNotStreaming;
10
+ export declare function toAnthropicStreamingResponse(stream: AsyncIterable<Anthropic.RawMessageStreamEvent>): ResultStreaming;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toAnthropicMessages = toAnthropicMessages;
4
+ exports.toAnthropicFinishReason = toAnthropicFinishReason;
5
+ exports.getTextContent = getTextContent;
6
+ exports.toAnthropicResponse = toAnthropicResponse;
7
+ exports.toAnthropicStreamingResponse = toAnthropicStreamingResponse;
8
+ const getUnixTimestamp_1 = require("./getUnixTimestamp");
9
+ function toAnthropicMessages(input) {
10
+ let system;
11
+ const messages = [];
12
+ for (const msg of input) {
13
+ if (msg.role === 'system') {
14
+ system = (system ? system + '\n' : '') + (msg.content ?? '');
15
+ continue;
16
+ }
17
+ if (msg.role === 'user' || msg.role === 'assistant') {
18
+ messages.push({
19
+ role: msg.role,
20
+ content: msg.content ?? '',
21
+ });
22
+ }
23
+ }
24
+ return { system, messages };
25
+ }
26
+ function toAnthropicFinishReason(reason) {
27
+ return reason === 'max_tokens' ? 'length' : 'stop';
28
+ }
29
+ function getTextContent(content) {
30
+ return content
31
+ .filter((block) => block.type === 'text')
32
+ .map((block) => block.text)
33
+ .join('');
34
+ }
35
+ function toAnthropicResponse(message) {
36
+ return {
37
+ model: message.model,
38
+ created: (0, getUnixTimestamp_1.getUnixTimestamp)(),
39
+ usage: {
40
+ prompt_tokens: message.usage.input_tokens,
41
+ completion_tokens: message.usage.output_tokens,
42
+ total_tokens: message.usage.input_tokens + message.usage.output_tokens,
43
+ },
44
+ choices: [
45
+ {
46
+ message: {
47
+ content: getTextContent(message.content),
48
+ role: 'assistant',
49
+ },
50
+ finish_reason: toAnthropicFinishReason(message.stop_reason),
51
+ index: 0,
52
+ },
53
+ ],
54
+ };
55
+ }
56
+ async function* toAnthropicStreamingResponse(stream) {
57
+ let model = '';
58
+ let stopReason;
59
+ for await (const event of stream) {
60
+ switch (event.type) {
61
+ case 'message_start':
62
+ model = event.message.model;
63
+ stopReason = event.message.stop_reason;
64
+ break;
65
+ case 'content_block_delta':
66
+ if (event.delta.type === 'text_delta') {
67
+ const chunk = {
68
+ model,
69
+ created: (0, getUnixTimestamp_1.getUnixTimestamp)(),
70
+ choices: [
71
+ {
72
+ delta: { content: event.delta.text, role: 'assistant' },
73
+ finish_reason: null,
74
+ index: 0,
75
+ },
76
+ ],
77
+ };
78
+ yield chunk;
79
+ }
80
+ break;
81
+ case 'message_delta':
82
+ stopReason = event.delta.stop_reason;
83
+ break;
84
+ case 'message_stop':
85
+ yield {
86
+ model,
87
+ created: (0, getUnixTimestamp_1.getUnixTimestamp)(),
88
+ choices: [
89
+ {
90
+ delta: { content: '', role: 'assistant' },
91
+ finish_reason: toAnthropicFinishReason(stopReason),
92
+ index: 0,
93
+ },
94
+ ],
95
+ };
96
+ break;
97
+ }
98
+ }
99
+ }
@@ -0,0 +1,12 @@
1
+ import type { GenerateContentResponse } from '@google/genai';
2
+ import type { Message, FinishReason, ConsistentResponseUsage, ResultNotStreaming, ResultStreaming } from '../types';
3
+ export declare function toGeminiContent(messages: Message[]): {
4
+ role: string;
5
+ parts: {
6
+ text: string;
7
+ }[];
8
+ }[];
9
+ export declare function toFinishReason(reason: string | null | undefined): FinishReason;
10
+ export declare function toUsage(meta: GenerateContentResponse['usageMetadata']): ConsistentResponseUsage | undefined;
11
+ export declare function toResponse(response: GenerateContentResponse, model: string): ResultNotStreaming;
12
+ export declare function toStreamingResponse(stream: AsyncGenerator<GenerateContentResponse>, model: string): ResultStreaming;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toGeminiContent = toGeminiContent;
4
+ exports.toFinishReason = toFinishReason;
5
+ exports.toUsage = toUsage;
6
+ exports.toResponse = toResponse;
7
+ exports.toStreamingResponse = toStreamingResponse;
8
+ const getUnixTimestamp_1 = require("./getUnixTimestamp");
9
+ function toGeminiContent(messages) {
10
+ return messages.map((msg) => ({
11
+ role: msg.role === 'assistant' ? 'model' : msg.role,
12
+ parts: msg.content ? [{ text: msg.content }] : [],
13
+ }));
14
+ }
15
+ function toFinishReason(reason) {
16
+ switch (reason) {
17
+ case 'STOP':
18
+ return 'stop';
19
+ case 'MAX_TOKENS':
20
+ return 'length';
21
+ default:
22
+ return 'stop';
23
+ }
24
+ }
25
+ function toUsage(meta) {
26
+ if (!meta)
27
+ return undefined;
28
+ return {
29
+ prompt_tokens: meta.promptTokenCount ?? 0,
30
+ completion_tokens: meta.candidatesTokenCount ?? 0,
31
+ total_tokens: meta.totalTokenCount ?? 0,
32
+ };
33
+ }
34
+ function toResponse(response, model) {
35
+ const candidate = response.candidates?.[0];
36
+ return {
37
+ model,
38
+ created: (0, getUnixTimestamp_1.getUnixTimestamp)(),
39
+ usage: toUsage(response.usageMetadata),
40
+ choices: [
41
+ {
42
+ index: candidate?.index ?? 0,
43
+ finish_reason: toFinishReason(candidate?.finishReason),
44
+ message: {
45
+ role: 'assistant',
46
+ content: candidate?.content?.parts?.map((p) => p.text ?? '').join('') ?? null,
47
+ },
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ async function* toStreamingResponse(stream, model) {
53
+ for await (const chunk of stream) {
54
+ const candidate = chunk.candidates?.[0];
55
+ const deltaContent = candidate?.content?.parts?.map((p) => p.text ?? '').join('') ?? '';
56
+ const chunkOutput = {
57
+ model,
58
+ created: (0, getUnixTimestamp_1.getUnixTimestamp)(),
59
+ usage: toUsage(chunk.usageMetadata),
60
+ choices: [
61
+ {
62
+ index: candidate?.index ?? 0,
63
+ finish_reason: toFinishReason(candidate?.finishReason),
64
+ delta: {
65
+ content: deltaContent,
66
+ role: 'assistant',
67
+ },
68
+ },
69
+ ],
70
+ };
71
+ yield chunkOutput;
72
+ }
73
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "litellmts-core",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "TypeScript implementation of LiteLLM — unified interface for 45+ LLM providers",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@anthropic-ai/sdk": "^0.104.1",
43
- "@google/generative-ai": "^0.24.1",
43
+ "@google/genai": "^2.8.0",
44
44
  "cohere-ai": "^8.0.0",
45
45
  "eventsource": "^4.1.0",
46
46
  "js-tiktoken": "^1.0.21",