@node-llm/core 0.8.0 → 1.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 (100) hide show
  1. package/README.md +64 -67
  2. package/dist/chat/Chat.d.ts +3 -2
  3. package/dist/chat/Chat.d.ts.map +1 -1
  4. package/dist/chat/Chat.js +4 -4
  5. package/dist/chat/ChatStream.d.ts +25 -0
  6. package/dist/chat/ChatStream.d.ts.map +1 -0
  7. package/dist/chat/ChatStream.js +93 -0
  8. package/dist/config.d.ts +4 -2
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +2 -0
  11. package/dist/embedding/Embedding.d.ts +1 -1
  12. package/dist/embedding/Embedding.d.ts.map +1 -1
  13. package/dist/errors/index.d.ts +22 -0
  14. package/dist/errors/index.d.ts.map +1 -1
  15. package/dist/errors/index.js +32 -0
  16. package/dist/index.d.ts +4 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +4 -1
  19. package/dist/llm.d.ts +2 -1
  20. package/dist/llm.d.ts.map +1 -1
  21. package/dist/llm.js +26 -28
  22. package/dist/models/ModelRegistry.d.ts +4 -0
  23. package/dist/models/ModelRegistry.d.ts.map +1 -1
  24. package/dist/models/ModelRegistry.js +15 -0
  25. package/dist/models/models.d.ts +729 -60
  26. package/dist/models/models.d.ts.map +1 -1
  27. package/dist/models/models.js +24375 -2312
  28. package/dist/models/types.d.ts +3 -3
  29. package/dist/models/types.d.ts.map +1 -1
  30. package/dist/models/types.js +3 -0
  31. package/dist/providers/BaseProvider.d.ts +21 -0
  32. package/dist/providers/BaseProvider.d.ts.map +1 -0
  33. package/dist/providers/BaseProvider.js +28 -0
  34. package/dist/providers/Provider.d.ts +19 -1
  35. package/dist/providers/Provider.d.ts.map +1 -1
  36. package/dist/providers/anthropic/AnthropicProvider.d.ts +6 -7
  37. package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
  38. package/dist/providers/anthropic/AnthropicProvider.js +16 -13
  39. package/dist/providers/anthropic/Streaming.d.ts +1 -1
  40. package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
  41. package/dist/providers/anthropic/Streaming.js +80 -54
  42. package/dist/providers/deepseek/Capabilities.js +1 -1
  43. package/dist/providers/deepseek/DeepSeekProvider.d.ts +5 -1
  44. package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
  45. package/dist/providers/deepseek/DeepSeekProvider.js +15 -1
  46. package/dist/providers/deepseek/Streaming.d.ts +1 -1
  47. package/dist/providers/deepseek/Streaming.d.ts.map +1 -1
  48. package/dist/providers/deepseek/Streaming.js +80 -48
  49. package/dist/providers/gemini/Capabilities.d.ts.map +1 -1
  50. package/dist/providers/gemini/Embeddings.d.ts +1 -1
  51. package/dist/providers/gemini/Embeddings.d.ts.map +1 -1
  52. package/dist/providers/gemini/GeminiProvider.d.ts +6 -4
  53. package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
  54. package/dist/providers/gemini/GeminiProvider.js +14 -4
  55. package/dist/providers/gemini/Streaming.d.ts +1 -1
  56. package/dist/providers/gemini/Streaming.d.ts.map +1 -1
  57. package/dist/providers/gemini/Streaming.js +62 -39
  58. package/dist/providers/ollama/Capabilities.d.ts.map +1 -1
  59. package/dist/providers/ollama/Capabilities.js +5 -1
  60. package/dist/providers/ollama/OllamaProvider.d.ts +1 -0
  61. package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
  62. package/dist/providers/ollama/OllamaProvider.js +3 -0
  63. package/dist/providers/openai/Embedding.d.ts +1 -1
  64. package/dist/providers/openai/Embedding.d.ts.map +1 -1
  65. package/dist/providers/openai/OpenAIProvider.d.ts +6 -3
  66. package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
  67. package/dist/providers/openai/OpenAIProvider.js +15 -1
  68. package/dist/providers/openai/Streaming.d.ts +1 -1
  69. package/dist/providers/openai/Streaming.d.ts.map +1 -1
  70. package/dist/providers/openai/Streaming.js +75 -43
  71. package/dist/providers/openrouter/Capabilities.d.ts +13 -0
  72. package/dist/providers/openrouter/Capabilities.d.ts.map +1 -0
  73. package/dist/providers/openrouter/Capabilities.js +67 -0
  74. package/dist/providers/openrouter/Models.d.ts +11 -0
  75. package/dist/providers/openrouter/Models.d.ts.map +1 -0
  76. package/dist/providers/openrouter/Models.js +88 -0
  77. package/dist/providers/openrouter/OpenRouterProvider.d.ts +21 -0
  78. package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -0
  79. package/dist/providers/openrouter/OpenRouterProvider.js +24 -0
  80. package/dist/providers/openrouter/index.d.ts +11 -0
  81. package/dist/providers/openrouter/index.d.ts.map +1 -0
  82. package/dist/providers/openrouter/index.js +26 -0
  83. package/dist/providers/registry.d.ts +11 -1
  84. package/dist/providers/registry.d.ts.map +1 -1
  85. package/dist/providers/registry.js +14 -0
  86. package/dist/streaming/Stream.d.ts +29 -0
  87. package/dist/streaming/Stream.d.ts.map +1 -0
  88. package/dist/streaming/Stream.js +67 -0
  89. package/dist/utils/FileLoader.d.ts.map +1 -1
  90. package/dist/utils/FileLoader.js +34 -3
  91. package/dist/utils/logger.d.ts +13 -0
  92. package/dist/utils/logger.d.ts.map +1 -0
  93. package/dist/utils/logger.js +24 -0
  94. package/package.json +1 -1
  95. package/dist/chat/Stream.d.ts +0 -21
  96. package/dist/chat/Stream.d.ts.map +0 -1
  97. package/dist/chat/Stream.js +0 -73
  98. package/dist/providers/Embedding.d.ts +0 -20
  99. package/dist/providers/Embedding.d.ts.map +0 -1
  100. package/dist/providers/Embedding.js +0 -1
@@ -1,3 +1,4 @@
1
+ import { APIError } from "../../errors/index.js";
1
2
  export class DeepSeekStreaming {
2
3
  baseUrl;
3
4
  apiKey;
@@ -5,7 +6,8 @@ export class DeepSeekStreaming {
5
6
  this.baseUrl = baseUrl;
6
7
  this.apiKey = apiKey;
7
8
  }
8
- async *execute(request) {
9
+ async *execute(request, controller) {
10
+ const abortController = controller || new AbortController();
9
11
  const { model, messages, tools, max_tokens, response_format, headers, ...rest } = request;
10
12
  const body = {
11
13
  model,
@@ -19,55 +21,85 @@ export class DeepSeekStreaming {
19
21
  body.tools = tools;
20
22
  if (response_format)
21
23
  body.response_format = response_format;
22
- const response = await fetch(`${this.baseUrl}/chat/completions`, {
23
- method: "POST",
24
- headers: {
25
- "Authorization": `Bearer ${this.apiKey}`,
26
- "Content-Type": "application/json",
27
- ...request.headers,
28
- },
29
- body: JSON.stringify(body),
30
- });
31
- if (!response.ok) {
32
- const errorText = await response.text();
33
- throw new Error(`DeepSeek API error: ${response.status} - ${errorText}`);
34
- }
35
- if (!response.body) {
36
- throw new Error("No response body for streaming");
37
- }
38
- // @ts-ignore
39
- const reader = response.body.getReader();
40
- const decoder = new TextDecoder();
41
- let buffer = "";
42
- while (true) {
43
- const { value, done } = await reader.read();
44
- if (done)
45
- break;
46
- const chunk = decoder.decode(value, { stream: true });
47
- buffer += chunk;
48
- const lines = buffer.split("\n\n");
49
- buffer = lines.pop() || "";
50
- for (const line of lines) {
51
- const trimmed = line.trim();
52
- if (!trimmed.startsWith("data: "))
53
- continue;
54
- const data = trimmed.replace("data: ", "").trim();
55
- if (data === "[DONE]")
56
- return;
57
- try {
58
- const json = JSON.parse(data);
59
- const deltaContent = json.choices?.[0]?.delta?.content;
60
- const deltaReasoning = json.choices?.[0]?.delta?.reasoning_content;
61
- if (deltaContent || deltaReasoning) {
62
- yield {
63
- content: deltaContent || "",
64
- reasoning: deltaReasoning || ""
65
- };
24
+ let done = false;
25
+ try {
26
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
27
+ method: "POST",
28
+ headers: {
29
+ "Authorization": `Bearer ${this.apiKey}`,
30
+ "Content-Type": "application/json",
31
+ ...request.headers,
32
+ },
33
+ body: JSON.stringify(body),
34
+ signal: abortController.signal,
35
+ });
36
+ if (!response.ok) {
37
+ const errorText = await response.text();
38
+ throw new Error(`DeepSeek API error: ${response.status} - ${errorText}`);
39
+ }
40
+ if (!response.body) {
41
+ throw new Error("No response body for streaming");
42
+ }
43
+ const reader = response.body.getReader();
44
+ const decoder = new TextDecoder();
45
+ let buffer = "";
46
+ while (true) {
47
+ const { value, done: readerDone } = await reader.read();
48
+ if (readerDone)
49
+ break;
50
+ const chunk = decoder.decode(value, { stream: true });
51
+ buffer += chunk;
52
+ const lines = buffer.split("\n\n");
53
+ buffer = lines.pop() || "";
54
+ for (const line of lines) {
55
+ let trimmed = line.trim();
56
+ // Handle carriage returns
57
+ if (trimmed.endsWith('\r')) {
58
+ trimmed = trimmed.substring(0, trimmed.length - 1);
59
+ }
60
+ if (!trimmed.startsWith("data: "))
61
+ continue;
62
+ const data = trimmed.replace("data: ", "").trim();
63
+ if (data === "[DONE]") {
64
+ done = true;
65
+ return;
66
+ }
67
+ try {
68
+ const json = JSON.parse(data);
69
+ // Check for errors in the data
70
+ if (json.error) {
71
+ throw new APIError("DeepSeek", response.status, json.error.message || "Stream error");
72
+ }
73
+ const deltaContent = json.choices?.[0]?.delta?.content;
74
+ const deltaReasoning = json.choices?.[0]?.delta?.reasoning_content;
75
+ if (deltaContent || deltaReasoning) {
76
+ yield {
77
+ content: deltaContent || "",
78
+ reasoning: deltaReasoning || ""
79
+ };
80
+ }
81
+ }
82
+ catch (e) {
83
+ // Re-throw APIError
84
+ if (e instanceof APIError)
85
+ throw e;
86
+ // Ignore other parse errors
66
87
  }
67
88
  }
68
- catch (e) {
69
- // ignore
70
- }
89
+ }
90
+ done = true;
91
+ }
92
+ catch (e) {
93
+ // Graceful exit on abort
94
+ if (e instanceof Error && e.name === 'AbortError') {
95
+ return;
96
+ }
97
+ throw e;
98
+ }
99
+ finally {
100
+ // Cleanup: abort if user breaks early
101
+ if (!done) {
102
+ abortController.abort();
71
103
  }
72
104
  }
73
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Capabilities.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;IACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAuBvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAoBzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAW/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAW9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAWzD,MAAM,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI3D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI/F,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAY5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAUjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;;oBArI2D,CAAC;iCAA6B,CAAC;wCAGrH,CAAC;kCACH,CAAC;4CAEgB,CAAC;;iBACd,CAAC;iCAEG,CAAC;kCAAoC,CAAC;;;;oBAG3B,CAAC;qBACV,CAAC;sBAEF,CAAC;;iBAGM,CAAC;qBAAiB,CAAC;sBACrC,CAAA;;;;oBAA6D,CAAC;iCACxC,CAAC;kCAEpB,CAAC;;;;IA4IN,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAGhC"}
1
+ {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Capabilities.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;IACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAuBvD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAoBzD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAW/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAW9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAWzD,MAAM,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI3D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIjD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQnD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI/F,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAY5E,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAUjD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;;oBArIyB,CAAC;iCAA6B,CAAC;wCACrF,CAAD;kCAEM,CAAC;4CACO,CAAC;;iBAEA,CAAC;iCACf,CAAC;kCAEU,CAAC;;;;oBACD,CAAC;qBAET,CAAC;sBACH,CAAC;;iBAEI,CAAC;qBAGP,CAAC;sBAAwB,CAAC;;;;oBACD,CAAC;iCAA6B,CAAC;kCACjC,CAAC;;;;IA8I5B,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAGhC"}
@@ -1,4 +1,4 @@
1
- import { EmbeddingRequest, EmbeddingResponse } from "../Embedding.js";
1
+ import { EmbeddingRequest, EmbeddingResponse } from "../Provider.js";
2
2
  export declare class GeminiEmbeddings {
3
3
  private readonly baseUrl;
4
4
  private readonly apiKey;
@@ -1 +1 @@
1
- {"version":3,"file":"Embeddings.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAItE,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEvE,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAwCrE"}
1
+ {"version":3,"file":"Embeddings.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIrE,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEvE,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAwCrE"}
@@ -1,10 +1,10 @@
1
- import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse, TranscriptionRequest, TranscriptionResponse, ModerationRequest, ModerationResponse } from "../Provider.js";
2
- import { EmbeddingRequest, EmbeddingResponse } from "../Embedding.js";
1
+ import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse, TranscriptionRequest, TranscriptionResponse, EmbeddingRequest, EmbeddingResponse } from "../Provider.js";
2
+ import { BaseProvider } from "../BaseProvider.js";
3
3
  export interface GeminiProviderOptions {
4
4
  apiKey: string;
5
5
  baseUrl?: string;
6
6
  }
7
- export declare class GeminiProvider implements Provider {
7
+ export declare class GeminiProvider extends BaseProvider implements Provider {
8
8
  private readonly options;
9
9
  private readonly baseUrl;
10
10
  private readonly chatHandler;
@@ -25,12 +25,14 @@ export declare class GeminiProvider implements Provider {
25
25
  getContextWindow: (model: string) => number | null;
26
26
  };
27
27
  constructor(options: GeminiProviderOptions);
28
+ apiBase(): string;
29
+ headers(): Record<string, string>;
30
+ protected providerName(): string;
28
31
  chat(request: ChatRequest): Promise<ChatResponse>;
29
32
  stream(request: ChatRequest): AsyncGenerator<ChatChunk>;
30
33
  listModels(): Promise<ModelInfo[]>;
31
34
  paint(request: ImageRequest): Promise<ImageResponse>;
32
35
  embed(request: EmbeddingRequest): Promise<EmbeddingResponse>;
33
36
  transcribe(request: TranscriptionRequest): Promise<TranscriptionResponse>;
34
- moderate(_request: ModerationRequest): Promise<ModerationResponse>;
35
37
  }
36
38
  //# sourceMappingURL=GeminiProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/GeminiProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,YAAW,QAAQ;IAqBjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAEpD,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;oCACN,MAAM;kCACR,MAAM;MAChC;gBAE2B,OAAO,EAAE,qBAAqB;IAUrD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI5D,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAGzE"}
1
+ {"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/GeminiProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EAGrB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASlD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAqBtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAEpD,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;oCACN,MAAM;kCACR,MAAM;MAChC;gBAE2B,OAAO,EAAE,qBAAqB;IAWpD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAI1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI5D,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAKhF"}
@@ -1,3 +1,4 @@
1
+ import { BaseProvider } from "../BaseProvider.js";
1
2
  import { Capabilities } from "./Capabilities.js";
2
3
  import { GeminiChat } from "./Chat.js";
3
4
  import { GeminiStreaming } from "./Streaming.js";
@@ -5,7 +6,7 @@ import { GeminiModels } from "./Models.js";
5
6
  import { GeminiImage } from "./Image.js";
6
7
  import { GeminiEmbeddings } from "./Embeddings.js";
7
8
  import { GeminiTranscription } from "./Transcription.js";
8
- export class GeminiProvider {
9
+ export class GeminiProvider extends BaseProvider {
9
10
  options;
10
11
  baseUrl;
11
12
  chatHandler;
@@ -26,6 +27,7 @@ export class GeminiProvider {
26
27
  getContextWindow: (model) => Capabilities.getContextWindow(model),
27
28
  };
28
29
  constructor(options) {
30
+ super();
29
31
  this.options = options;
30
32
  this.baseUrl = options.baseUrl ?? "https://generativelanguage.googleapis.com/v1beta";
31
33
  this.chatHandler = new GeminiChat(this.baseUrl, options.apiKey);
@@ -35,6 +37,17 @@ export class GeminiProvider {
35
37
  this.embeddingHandler = new GeminiEmbeddings(this.baseUrl, options.apiKey);
36
38
  this.transcriptionHandler = new GeminiTranscription(this.baseUrl, options.apiKey);
37
39
  }
40
+ apiBase() {
41
+ return this.baseUrl;
42
+ }
43
+ headers() {
44
+ return {
45
+ "Content-Type": "application/json",
46
+ };
47
+ }
48
+ providerName() {
49
+ return "Gemini";
50
+ }
38
51
  async chat(request) {
39
52
  return this.chatHandler.execute(request);
40
53
  }
@@ -53,7 +66,4 @@ export class GeminiProvider {
53
66
  async transcribe(request) {
54
67
  return this.transcriptionHandler.execute(request);
55
68
  }
56
- async moderate(_request) {
57
- throw new Error("Gemini doesn't support moderation");
58
- }
59
69
  }
@@ -3,7 +3,7 @@ export declare class GeminiStreaming {
3
3
  private readonly baseUrl;
4
4
  private readonly apiKey;
5
5
  constructor(baseUrl: string, apiKey: string);
6
- execute(request: ChatRequest): AsyncGenerator<ChatChunk>;
6
+ execute(request: ChatRequest, controller?: AbortController): AsyncGenerator<ChatChunk>;
7
7
  private sanitizeSchema;
8
8
  }
9
9
  //# sourceMappingURL=Streaming.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAMxD,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEtE,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAgF/D,OAAO,CAAC,cAAc;CAwBvB"}
1
+ {"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAMxD,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEtE,OAAO,CACZ,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,eAAe,GAC3B,cAAc,CAAC,SAAS,CAAC;IAuG5B,OAAO,CAAC,cAAc;CAwBvB"}
@@ -8,7 +8,8 @@ export class GeminiStreaming {
8
8
  this.baseUrl = baseUrl;
9
9
  this.apiKey = apiKey;
10
10
  }
11
- async *execute(request) {
11
+ async *execute(request, controller) {
12
+ const abortController = controller || new AbortController();
12
13
  const temperature = Capabilities.normalizeTemperature(request.temperature, request.model);
13
14
  const url = `${this.baseUrl}/models/${request.model}:streamGenerateContent?alt=sse&key=${this.apiKey}`;
14
15
  const { contents, systemInstructionParts } = await GeminiChatUtils.convertMessages(request.messages);
@@ -32,49 +33,71 @@ export class GeminiStreaming {
32
33
  if (systemInstructionParts.length > 0) {
33
34
  payload.systemInstruction = { parts: systemInstructionParts };
34
35
  }
35
- const response = await fetch(url, {
36
- method: "POST",
37
- headers: {
38
- "Content-Type": "application/json",
39
- },
40
- body: JSON.stringify(payload),
41
- });
42
- if (!response.ok) {
43
- await handleGeminiError(response, request.model);
44
- }
45
- if (!response.body) {
46
- throw new Error("No response body for streaming");
47
- }
48
- const reader = response.body.getReader();
49
- const decoder = new TextDecoder();
50
- let buffer = "";
51
- while (true) {
52
- const { value, done } = await reader.read();
53
- if (done)
54
- break;
55
- buffer += decoder.decode(value, { stream: true });
56
- let lineEnd;
57
- while ((lineEnd = buffer.indexOf("\n")) !== -1) {
58
- const line = buffer.substring(0, lineEnd).trim();
59
- buffer = buffer.substring(lineEnd + 1);
60
- if (line.startsWith("data: ")) {
61
- const data = line.substring(6).trim();
62
- if (!data)
63
- continue;
64
- try {
65
- const json = JSON.parse(data);
66
- const parts = json.candidates?.[0]?.content?.parts || [];
67
- for (const part of parts) {
68
- if (part.text) {
69
- yield { content: part.text };
36
+ let done = false;
37
+ try {
38
+ const response = await fetch(url, {
39
+ method: "POST",
40
+ headers: {
41
+ "Content-Type": "application/json",
42
+ },
43
+ body: JSON.stringify(payload),
44
+ signal: abortController.signal,
45
+ });
46
+ if (!response.ok) {
47
+ await handleGeminiError(response, request.model);
48
+ }
49
+ if (!response.body) {
50
+ throw new Error("No response body for streaming");
51
+ }
52
+ const reader = response.body.getReader();
53
+ const decoder = new TextDecoder();
54
+ let buffer = "";
55
+ while (true) {
56
+ const { value, done: readerDone } = await reader.read();
57
+ if (readerDone)
58
+ break;
59
+ buffer += decoder.decode(value, { stream: true });
60
+ let lineEnd;
61
+ while ((lineEnd = buffer.indexOf("\n")) !== -1) {
62
+ let line = buffer.substring(0, lineEnd).trim();
63
+ buffer = buffer.substring(lineEnd + 1);
64
+ // Handle carriage returns
65
+ if (line.endsWith('\r')) {
66
+ line = line.substring(0, line.length - 1);
67
+ }
68
+ if (line.startsWith("data: ")) {
69
+ const data = line.substring(6).trim();
70
+ if (!data)
71
+ continue;
72
+ try {
73
+ const json = JSON.parse(data);
74
+ const parts = json.candidates?.[0]?.content?.parts || [];
75
+ for (const part of parts) {
76
+ if (part.text) {
77
+ yield { content: part.text };
78
+ }
70
79
  }
71
80
  }
72
- }
73
- catch (e) {
74
- // Ignore parse errors
81
+ catch (e) {
82
+ // Ignore parse errors
83
+ }
75
84
  }
76
85
  }
77
86
  }
87
+ done = true;
88
+ }
89
+ catch (e) {
90
+ // Graceful exit on abort
91
+ if (e instanceof Error && e.name === 'AbortError') {
92
+ return;
93
+ }
94
+ throw e;
95
+ }
96
+ finally {
97
+ // Cleanup: abort if user breaks early
98
+ if (!done) {
99
+ abortController.abort();
100
+ }
78
101
  }
79
102
  }
80
103
  sanitizeSchema(schema) {
@@ -1 +1 @@
1
- {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/Capabilities.ts"],"names":[],"mappings":"AAEA,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM;IAYhC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKvD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAK/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAK9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKzD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKlD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAIpD"}
1
+ {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/Capabilities.ts"],"names":[],"mappings":"AAEA,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM;IAYhC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKvD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAU/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAK9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKzD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKlD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKtD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAIpD"}
@@ -17,7 +17,11 @@ export class OllamaCapabilities {
17
17
  }
18
18
  static supportsVision(modelId) {
19
19
  const model = this.findModel(modelId);
20
- return model?.modalities?.input?.includes("image") || model?.capabilities?.includes("vision") || false;
20
+ if (model) {
21
+ return model.modalities?.input?.includes("image") || model.capabilities?.includes("vision") || false;
22
+ }
23
+ // Fallback for custom models not in registry
24
+ return /vision|llava|moondream|bakllava/.test(modelId.toLowerCase());
21
25
  }
22
26
  static supportsTools(modelId) {
23
27
  const model = this.findModel(modelId);
@@ -4,5 +4,6 @@ export interface OllamaProviderOptions {
4
4
  }
5
5
  export declare class OllamaProvider extends OpenAIProvider {
6
6
  constructor(options?: OllamaProviderOptions);
7
+ protected providerName(): string;
7
8
  }
8
9
  //# sourceMappingURL=OllamaProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OllamaProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/OllamaProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,GAAE,qBAA0B;CAuBhD"}
1
+ {"version":3,"file":"OllamaProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/OllamaProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,GAAE,qBAA0B;IAwB/C,SAAS,CAAC,YAAY,IAAI,MAAM;CAGjC"}
@@ -25,4 +25,7 @@ export class OllamaProvider extends OpenAIProvider {
25
25
  getContextWindow: (modelId) => OllamaCapabilities.getContextWindow(modelId),
26
26
  };
27
27
  }
28
+ providerName() {
29
+ return "Ollama";
30
+ }
28
31
  }
@@ -1,4 +1,4 @@
1
- import { EmbeddingRequest, EmbeddingResponse } from "../Embedding.js";
1
+ import { EmbeddingRequest, EmbeddingResponse } from "../Provider.js";
2
2
  export declare class OpenAIEmbedding {
3
3
  protected readonly baseUrl: string;
4
4
  protected readonly apiKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Embedding.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAMtE,qBAAa,eAAe;IAExB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGnC,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMtC,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA2CrE"}
1
+ {"version":3,"file":"Embedding.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Embedding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAMrE,qBAAa,eAAe;IAExB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAClC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAGnC,SAAS,CAAC,eAAe,IAAI,MAAM;IAInC,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMtC,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA2CrE"}
@@ -1,4 +1,5 @@
1
- import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse, ModerationRequest, ModerationResponse } from "../Provider.js";
1
+ import { Provider, ChatRequest, ChatResponse, ModelInfo, ChatChunk, ImageRequest, ImageResponse, ModerationRequest, ModerationResponse, EmbeddingRequest, EmbeddingResponse } from "../Provider.js";
2
+ import { BaseProvider } from "../BaseProvider.js";
2
3
  import { OpenAIChat } from "./Chat.js";
3
4
  import { OpenAIStreaming } from "./Streaming.js";
4
5
  import { OpenAIModels } from "./Models.js";
@@ -7,12 +8,11 @@ import { OpenAITranscription } from "./Transcription.js";
7
8
  import { OpenAIModeration } from "./Moderation.js";
8
9
  import { OpenAIEmbedding } from "./Embedding.js";
9
10
  import { TranscriptionRequest, TranscriptionResponse } from "../Provider.js";
10
- import { EmbeddingRequest, EmbeddingResponse } from "../Embedding.js";
11
11
  export interface OpenAIProviderOptions {
12
12
  apiKey: string;
13
13
  baseUrl?: string;
14
14
  }
15
- export declare class OpenAIProvider implements Provider {
15
+ export declare class OpenAIProvider extends BaseProvider implements Provider {
16
16
  protected readonly options: OpenAIProviderOptions;
17
17
  protected baseUrl: string;
18
18
  protected chatHandler: OpenAIChat;
@@ -34,6 +34,9 @@ export declare class OpenAIProvider implements Provider {
34
34
  getContextWindow: (model: string) => number | null;
35
35
  };
36
36
  constructor(options: OpenAIProviderOptions);
37
+ apiBase(): string;
38
+ headers(): Record<string, string>;
39
+ protected providerName(): string;
37
40
  chat(request: ChatRequest): Promise<ChatResponse>;
38
41
  stream(request: ChatRequest): AsyncGenerator<ChatChunk>;
39
42
  listModels(): Promise<ModelInfo[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE/J,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,YAAW,QAAQ;IAsBjC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB;IArB7D,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IAClC,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC5C,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACtC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;IACpD,SAAS,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAErC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;kCACP,MAAM;MAChC;gBAE6B,OAAO,EAAE,qBAAqB;IAWvD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIjE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGnE"}
1
+ {"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpM,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAsBtD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB;IArB7D,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IAClC,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC5C,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACtC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;IACpD,SAAS,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAErC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;kCACP,MAAM;MAChC;gBAE6B,OAAO,EAAE,qBAAqB;IAYtD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAI1B,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIjE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGnE"}
@@ -1,3 +1,4 @@
1
+ import { BaseProvider } from "../BaseProvider.js";
1
2
  import { Capabilities } from "./Capabilities.js";
2
3
  import { OpenAIChat } from "./Chat.js";
3
4
  import { OpenAIStreaming } from "./Streaming.js";
@@ -6,7 +7,7 @@ import { OpenAIImage } from "./Image.js";
6
7
  import { OpenAITranscription } from "./Transcription.js";
7
8
  import { OpenAIModeration } from "./Moderation.js";
8
9
  import { OpenAIEmbedding } from "./Embedding.js";
9
- export class OpenAIProvider {
10
+ export class OpenAIProvider extends BaseProvider {
10
11
  options;
11
12
  baseUrl;
12
13
  chatHandler;
@@ -28,6 +29,7 @@ export class OpenAIProvider {
28
29
  getContextWindow: (model) => Capabilities.getContextWindow(model) || null,
29
30
  };
30
31
  constructor(options) {
32
+ super();
31
33
  this.options = options;
32
34
  this.baseUrl = options.baseUrl ?? "https://api.openai.com/v1";
33
35
  this.chatHandler = new OpenAIChat(this.baseUrl, options.apiKey);
@@ -38,6 +40,18 @@ export class OpenAIProvider {
38
40
  this.moderationHandler = new OpenAIModeration(this.baseUrl, options.apiKey);
39
41
  this.embeddingHandler = new OpenAIEmbedding(this.baseUrl, options.apiKey);
40
42
  }
43
+ apiBase() {
44
+ return this.baseUrl;
45
+ }
46
+ headers() {
47
+ return {
48
+ "Authorization": `Bearer ${this.options.apiKey}`,
49
+ "Content-Type": "application/json",
50
+ };
51
+ }
52
+ providerName() {
53
+ return "OpenAI";
54
+ }
41
55
  async chat(request) {
42
56
  return this.chatHandler.execute(request);
43
57
  }
@@ -3,6 +3,6 @@ export declare class OpenAIStreaming {
3
3
  private readonly baseUrl;
4
4
  private readonly apiKey;
5
5
  constructor(baseUrl: string, apiKey: string);
6
- execute(request: ChatRequest): AsyncGenerator<ChatChunk>;
6
+ execute(request: ChatRequest, controller?: AbortController): AsyncGenerator<ChatChunk>;
7
7
  }
8
8
  //# sourceMappingURL=Streaming.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKxD,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEtE,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;CAyEhE"}
1
+ {"version":3,"file":"Streaming.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/Streaming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAMxD,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAxC,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAEtE,OAAO,CACZ,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,eAAe,GAC3B,cAAc,CAAC,SAAS,CAAC;CAgH7B"}