@ank1015/providers 0.0.1 → 0.0.2

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 (169) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -383
  3. package/dist/agent/conversation.d.ts +97 -0
  4. package/dist/agent/conversation.d.ts.map +1 -0
  5. package/dist/agent/conversation.js +328 -0
  6. package/dist/agent/conversation.js.map +1 -0
  7. package/dist/agent/runner.d.ts +37 -0
  8. package/dist/agent/runner.d.ts.map +1 -0
  9. package/dist/agent/runner.js +169 -0
  10. package/dist/agent/runner.js.map +1 -0
  11. package/dist/agent/tools/calculate.d.ts +15 -0
  12. package/dist/agent/tools/calculate.d.ts.map +1 -0
  13. package/dist/agent/tools/calculate.js +23 -0
  14. package/dist/agent/tools/calculate.js.map +1 -0
  15. package/dist/agent/tools/get-current-time.d.ts +15 -0
  16. package/dist/agent/tools/get-current-time.d.ts.map +1 -0
  17. package/dist/agent/tools/get-current-time.js +38 -0
  18. package/dist/agent/tools/get-current-time.js.map +1 -0
  19. package/dist/agent/tools/index.d.ts +3 -0
  20. package/dist/agent/tools/index.d.ts.map +1 -0
  21. package/dist/agent/tools/index.js +3 -0
  22. package/dist/agent/tools/index.js.map +1 -0
  23. package/dist/agent/types.d.ts +53 -31
  24. package/dist/agent/types.d.ts.map +1 -1
  25. package/dist/agent/types.js +1 -2
  26. package/dist/agent/utils.d.ts +14 -0
  27. package/dist/agent/utils.d.ts.map +1 -0
  28. package/dist/agent/utils.js +59 -0
  29. package/dist/agent/utils.js.map +1 -0
  30. package/dist/index.d.ts +16 -9
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +16 -28
  33. package/dist/index.js.map +1 -1
  34. package/dist/llm.d.ts +15 -0
  35. package/dist/llm.d.ts.map +1 -0
  36. package/dist/llm.js +92 -0
  37. package/dist/llm.js.map +1 -0
  38. package/dist/models.d.ts +8 -1
  39. package/dist/models.d.ts.map +1 -1
  40. package/dist/models.generated.d.ts +25 -112
  41. package/dist/models.generated.d.ts.map +1 -1
  42. package/dist/models.generated.js +72 -227
  43. package/dist/models.generated.js.map +1 -1
  44. package/dist/models.js +30 -32
  45. package/dist/models.js.map +1 -1
  46. package/dist/providers/google/complete.d.ts +3 -0
  47. package/dist/providers/google/complete.d.ts.map +1 -0
  48. package/dist/providers/google/complete.js +53 -0
  49. package/dist/providers/google/complete.js.map +1 -0
  50. package/dist/providers/google/index.d.ts +6 -0
  51. package/dist/providers/google/index.d.ts.map +1 -0
  52. package/dist/providers/google/index.js +6 -0
  53. package/dist/providers/google/index.js.map +1 -0
  54. package/dist/providers/google/stream.d.ts +3 -0
  55. package/dist/providers/google/stream.d.ts.map +1 -0
  56. package/dist/providers/{google.js → google/stream.js} +67 -231
  57. package/dist/providers/google/stream.js.map +1 -0
  58. package/dist/providers/google/types.d.ts +8 -0
  59. package/dist/providers/google/types.d.ts.map +1 -0
  60. package/dist/providers/google/types.js +2 -0
  61. package/dist/providers/google/types.js.map +1 -0
  62. package/dist/providers/google/utils.d.ts +30 -0
  63. package/dist/providers/google/utils.d.ts.map +1 -0
  64. package/dist/providers/google/utils.js +354 -0
  65. package/dist/providers/google/utils.js.map +1 -0
  66. package/dist/providers/openai/complete.d.ts +3 -0
  67. package/dist/providers/openai/complete.d.ts.map +1 -0
  68. package/dist/providers/openai/complete.js +57 -0
  69. package/dist/providers/openai/complete.js.map +1 -0
  70. package/dist/providers/openai/index.d.ts +4 -0
  71. package/dist/providers/openai/index.d.ts.map +1 -0
  72. package/dist/providers/openai/index.js +4 -0
  73. package/dist/providers/openai/index.js.map +1 -0
  74. package/dist/providers/openai/stream.d.ts +3 -0
  75. package/dist/providers/openai/stream.d.ts.map +1 -0
  76. package/dist/providers/{openai.js → openai/stream.js} +74 -152
  77. package/dist/providers/openai/stream.js.map +1 -0
  78. package/dist/providers/openai/types.d.ts +8 -0
  79. package/dist/providers/openai/types.d.ts.map +1 -0
  80. package/dist/providers/openai/types.js +2 -0
  81. package/dist/providers/openai/types.js.map +1 -0
  82. package/dist/providers/openai/utils.d.ts +13 -0
  83. package/dist/providers/openai/utils.d.ts.map +1 -0
  84. package/dist/providers/openai/utils.js +285 -0
  85. package/dist/providers/openai/utils.js.map +1 -0
  86. package/dist/types.d.ts +95 -87
  87. package/dist/types.d.ts.map +1 -1
  88. package/dist/types.js +1 -9
  89. package/dist/types.js.map +1 -1
  90. package/dist/utils/event-stream.d.ts +2 -2
  91. package/dist/utils/event-stream.d.ts.map +1 -1
  92. package/dist/utils/event-stream.js +2 -7
  93. package/dist/utils/event-stream.js.map +1 -1
  94. package/dist/utils/json-parse.js +3 -6
  95. package/dist/utils/json-parse.js.map +1 -1
  96. package/dist/utils/overflow.d.ts +51 -0
  97. package/dist/utils/overflow.d.ts.map +1 -0
  98. package/dist/utils/overflow.js +106 -0
  99. package/dist/utils/overflow.js.map +1 -0
  100. package/dist/utils/sanitize-unicode.js +1 -4
  101. package/dist/utils/sanitize-unicode.js.map +1 -1
  102. package/dist/utils/uuid.d.ts +6 -0
  103. package/dist/utils/uuid.d.ts.map +1 -0
  104. package/dist/utils/uuid.js +9 -0
  105. package/dist/utils/uuid.js.map +1 -0
  106. package/dist/utils/validation.d.ts +10 -3
  107. package/dist/utils/validation.d.ts.map +1 -1
  108. package/dist/utils/validation.js +20 -12
  109. package/dist/utils/validation.js.map +1 -1
  110. package/package.json +45 -8
  111. package/biome.json +0 -43
  112. package/dist/agent/agent-loop.d.ts +0 -5
  113. package/dist/agent/agent-loop.d.ts.map +0 -1
  114. package/dist/agent/agent-loop.js +0 -219
  115. package/dist/agent/agent-loop.js.map +0 -1
  116. package/dist/providers/convert.d.ts +0 -6
  117. package/dist/providers/convert.d.ts.map +0 -1
  118. package/dist/providers/convert.js +0 -207
  119. package/dist/providers/convert.js.map +0 -1
  120. package/dist/providers/google.d.ts +0 -26
  121. package/dist/providers/google.d.ts.map +0 -1
  122. package/dist/providers/google.js.map +0 -1
  123. package/dist/providers/openai.d.ts +0 -17
  124. package/dist/providers/openai.d.ts.map +0 -1
  125. package/dist/providers/openai.js.map +0 -1
  126. package/dist/stream.d.ts +0 -4
  127. package/dist/stream.d.ts.map +0 -1
  128. package/dist/stream.js +0 -40
  129. package/dist/stream.js.map +0 -1
  130. package/dist/test-google-agent-loop.d.ts +0 -2
  131. package/dist/test-google-agent-loop.d.ts.map +0 -1
  132. package/dist/test-google-agent-loop.js +0 -186
  133. package/dist/test-google-agent-loop.js.map +0 -1
  134. package/dist/test-google.d.ts +0 -2
  135. package/dist/test-google.d.ts.map +0 -1
  136. package/dist/test-google.js +0 -41
  137. package/dist/test-google.js.map +0 -1
  138. package/src/agent/agent-loop.ts +0 -275
  139. package/src/agent/types.ts +0 -80
  140. package/src/index.ts +0 -72
  141. package/src/models.generated.ts +0 -314
  142. package/src/models.ts +0 -45
  143. package/src/providers/convert.ts +0 -222
  144. package/src/providers/google.ts +0 -496
  145. package/src/providers/openai.ts +0 -437
  146. package/src/stream.ts +0 -60
  147. package/src/types.ts +0 -198
  148. package/src/utils/event-stream.ts +0 -60
  149. package/src/utils/json-parse.ts +0 -28
  150. package/src/utils/sanitize-unicode.ts +0 -25
  151. package/src/utils/validation.ts +0 -69
  152. package/test/core/agent-loop.test.ts +0 -958
  153. package/test/core/stream.test.ts +0 -409
  154. package/test/data/red-circle.png +0 -0
  155. package/test/data/superintelligentwill.pdf +0 -0
  156. package/test/edge-cases/general.test.ts +0 -565
  157. package/test/integration/e2e.test.ts +0 -530
  158. package/test/models/cost.test.ts +0 -499
  159. package/test/models/registry.test.ts +0 -298
  160. package/test/providers/convert.test.ts +0 -846
  161. package/test/providers/google-schema.test.ts +0 -666
  162. package/test/providers/google-stream.test.ts +0 -369
  163. package/test/providers/openai-stream.test.ts +0 -251
  164. package/test/utils/event-stream.test.ts +0 -289
  165. package/test/utils/json-parse.test.ts +0 -344
  166. package/test/utils/sanitize-unicode.test.ts +0 -329
  167. package/test/utils/validation.test.ts +0 -614
  168. package/tsconfig.json +0 -21
  169. package/vitest.config.ts +0 -9
package/dist/models.js CHANGED
@@ -1,36 +1,23 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.calculateCost = calculateCost;
4
- const models_generated_js_1 = require("./models.generated.js");
5
- const modelRegistry = new Map();
6
- // Initialize registry from MODELS on module load
7
- for (const [provider, models] of Object.entries(models_generated_js_1.MODELS)) {
8
- const providerModels = new Map();
9
- for (const [id, model] of Object.entries(models)) {
10
- providerModels.set(id, model);
11
- }
12
- modelRegistry.set(provider, providerModels);
1
+ import { KnownApis } from "./types.js";
2
+ import { MODELS } from "./models.generated.js";
3
+ import { getApiKeyFromEnv } from "./llm.js";
4
+ export function getProviders() {
5
+ return [...KnownApis];
6
+ }
7
+ export function getModel(api, modelId) {
8
+ const modelsForApi = MODELS[api];
9
+ if (!modelsForApi)
10
+ return undefined;
11
+ // Safe cast: ModelIdsForApi<TApi> guarantees modelId is a valid key for this API's models
12
+ return modelsForApi[modelId];
13
+ }
14
+ export function getModels(api) {
15
+ const modelsForApi = MODELS[api];
16
+ if (!modelsForApi)
17
+ return [];
18
+ return Object.values(modelsForApi);
13
19
  }
14
- // type ModelApi<
15
- // TProvider extends KnownProvider,
16
- // TModelId extends keyof (typeof MODELS)[TProvider],
17
- // > = (typeof MODELS)[TProvider][TModelId] extends { api: infer TApi } ? (TApi extends Api ? TApi : never) : never;
18
- // export function getModel<TProvider extends KnownProvider, TModelId extends keyof (typeof MODELS)[TProvider]>(
19
- // provider: TProvider,
20
- // modelId: TModelId,
21
- // ): Model<ModelApi<TProvider, TModelId>> {
22
- // return modelRegistry.get(provider)?.get(modelId as string) as Model<ModelApi<TProvider, TModelId>>;
23
- // }
24
- // export function getProviders(): KnownProvider[] {
25
- // return Array.from(modelRegistry.keys()) as KnownProvider[];
26
- // }
27
- // export function getModels<TProvider extends KnownProvider>(
28
- // provider: TProvider,
29
- // ): Model<ModelApi<TProvider, keyof (typeof MODELS)[TProvider]>>[] {
30
- // const models = modelRegistry.get(provider);
31
- // return models ? (Array.from(models.values()) as Model<ModelApi<TProvider, keyof (typeof MODELS)[TProvider]>>[]) : [];
32
- // }
33
- function calculateCost(model, usage) {
20
+ export function calculateCost(model, usage) {
34
21
  usage.cost.input = (model.cost.input / 1000000) * usage.input;
35
22
  usage.cost.output = (model.cost.output / 1000000) * usage.output;
36
23
  usage.cost.cacheRead = (model.cost.cacheRead / 1000000) * usage.cacheRead;
@@ -38,4 +25,15 @@ function calculateCost(model, usage) {
38
25
  usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
39
26
  return usage.cost;
40
27
  }
28
+ export function getAvailableModels() {
29
+ const availableModels = [];
30
+ for (const api of KnownApis) {
31
+ const apiKey = getApiKeyFromEnv(api);
32
+ if (apiKey) {
33
+ const modelsForApi = getModels(api);
34
+ availableModels.push(...modelsForApi);
35
+ }
36
+ }
37
+ return availableModels;
38
+ }
41
39
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":";;AAqCA,sCAOC;AA5CD,+DAA+C;AAG/C,MAAM,aAAa,GAAyC,IAAI,GAAG,EAAE,CAAC;AAEtE,iDAAiD;AACjD,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,4BAAM,CAAC,EAAE,CAAC;IACzD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAsB,CAAC;IACrD,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,KAAmB,CAAC,CAAC;IAC7C,CAAC;IACD,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC7C,CAAC;AAED,iBAAiB;AACjB,oCAAoC;AACpC,sDAAsD;AACtD,oHAAoH;AAEpH,gHAAgH;AAChH,wBAAwB;AACxB,sBAAsB;AACtB,4CAA4C;AAC5C,uGAAuG;AACvG,IAAI;AAEJ,oDAAoD;AACpD,+DAA+D;AAC/D,IAAI;AAEJ,8DAA8D;AAC9D,wBAAwB;AACxB,sEAAsE;AACtE,+CAA+C;AAC/C,yHAAyH;AACzH,IAAI;AAEJ,SAAgB,aAAa,CAAmB,KAAkB,EAAE,KAAY;IAC/E,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IACvG,OAAO,KAAK,CAAC,IAAI,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,SAAS,EAAgB,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAO5C,MAAM,UAAU,YAAY;IAC3B,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,QAAQ,CACvB,GAAS,EACT,OAA6B;IAE7B,MAAM,YAAY,GAAG,MAAM,CAAC,GAA0B,CAAC,CAAC;IACxD,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IAEpC,0FAA0F;IAC1F,OAAO,YAAY,CAAC,OAAoC,CAA4B,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,SAAS,CAAmB,GAAS;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,GAA0B,CAAC,CAAC;IACxD,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAkB,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,aAAa,CAAmB,KAAkB,EAAE,KAAY;IAC/E,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IACvG,OAAO,KAAK,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,MAAM,eAAe,GAAiB,EAAE,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YACpC,eAAe,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;IAED,OAAO,eAAe,CAAC;AACxB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { CompleteFunction } from "../../types.js";
2
+ export declare const completeGoogle: CompleteFunction<'google'>;
3
+ //# sourceMappingURL=complete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../src/providers/google/complete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAqC,MAAM,gBAAgB,CAAA;AAMpF,eAAO,MAAM,cAAc,EAAC,gBAAgB,CAAC,QAAQ,CA8DpD,CAAA"}
@@ -0,0 +1,53 @@
1
+ import { createClient, buildParams, getResponseAssistantResponse, getResponseUsage, getAssistantStopReason } from "./utils.js";
2
+ export const completeGoogle = async (model, context, options, id) => {
3
+ const startTimestamp = Date.now();
4
+ const client = createClient(model, options?.apiKey);
5
+ const params = buildParams(model, context, options);
6
+ try {
7
+ const response = await client.models.generateContent(params);
8
+ // Cache processed content to ensure stable tool call IDs
9
+ const content = getResponseAssistantResponse(response);
10
+ const usage = getResponseUsage(response, model);
11
+ const stopReason = getAssistantStopReason(response);
12
+ return {
13
+ role: "assistant",
14
+ message: response,
15
+ id,
16
+ model,
17
+ api: model.api,
18
+ timestamp: Date.now(),
19
+ duration: Date.now() - startTimestamp,
20
+ stopReason,
21
+ content,
22
+ usage
23
+ };
24
+ }
25
+ catch (error) {
26
+ const errorMessage = error instanceof Error ? error.message : String(error);
27
+ const isAborted = options.signal?.aborted;
28
+ const stopReason = isAborted ? "aborted" : "error";
29
+ // Return error response with empty content and zero usage
30
+ const emptyUsage = {
31
+ input: 0,
32
+ output: 0,
33
+ cacheRead: 0,
34
+ cacheWrite: 0,
35
+ totalTokens: 0,
36
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }
37
+ };
38
+ return {
39
+ role: "assistant",
40
+ message: {}, // Empty response object for error case
41
+ id,
42
+ model,
43
+ api: model.api,
44
+ errorMessage,
45
+ timestamp: Date.now(),
46
+ duration: Date.now() - startTimestamp,
47
+ stopReason,
48
+ content: [],
49
+ usage: emptyUsage
50
+ };
51
+ }
52
+ };
53
+ //# sourceMappingURL=complete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../src/providers/google/complete.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAI/H,MAAM,CAAC,MAAM,cAAc,GAA8B,KAAK,EAC1D,KAAsB,EACtB,OAAgB,EAChB,OAA8B,EAC9B,EAAU,EACZ,EAAE;IAEA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAEpD,IAAG,CAAC;QACA,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAE7D,yDAAyD;QACzD,MAAM,OAAO,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAEpD,OAAO;YACH,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ;YACjB,EAAE;YACF,KAAK;YACL,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc;YACrC,UAAU;YACV,OAAO;YACP,KAAK;SACR,CAAA;IACL,CAAC;IAAC,OAAO,KAAK,EAAC,CAAC;QACZ,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAA;QACzC,MAAM,UAAU,GAAe,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAA;QAE9D,0DAA0D;QAC1D,MAAM,UAAU,GAAU;YACtB,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;SACvE,CAAC;QAEF,OAAO;YACH,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,EAA6B,EAAE,uCAAuC;YAC/E,EAAE;YACF,KAAK;YACL,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,YAAY;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc;YACrC,UAAU;YACV,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,UAAU;SACpB,CAAC;IACN,CAAC;AAEL,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { ThinkingLevel } from '@google/genai';
2
+ export * from './complete.js';
3
+ export * from './stream.js';
4
+ export * from './types.js';
5
+ export { ThinkingLevel as GoogleThinkingLevel };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/google/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAC,aAAa,IAAI,mBAAmB,EAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { ThinkingLevel } from '@google/genai';
2
+ export * from './complete.js';
3
+ export * from './stream.js';
4
+ export * from './types.js';
5
+ export { ThinkingLevel as GoogleThinkingLevel };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/google/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAC,aAAa,IAAI,mBAAmB,EAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { StreamFunction } from "../../types.js";
2
+ export declare const streamGoogle: StreamFunction<'google'>;
3
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/providers/google/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAuJ,MAAM,gBAAgB,CAAA;AAQpM,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,QAAQ,CA0SjD,CAAA"}
@@ -1,23 +1,17 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.streamGoogle = void 0;
4
- exports.transformSchemaForGoogle = transformSchemaForGoogle;
5
- const genai_1 = require("@google/genai");
6
- const sanitize_unicode_1 = require("../utils/sanitize-unicode");
7
- const event_stream_1 = require("../utils/event-stream");
8
- const convert_1 = require("./convert");
9
- const models_1 = require("../models");
10
- const validation_1 = require("../utils/validation");
11
- // Counter for generating unique tool call IDs
12
- let toolCallCounter = 0;
13
- const streamGoogle = (model, context, options) => {
14
- const stream = new event_stream_1.AssistantMessageEventStream();
1
+ import { createClient, buildParams, mapStopReason } from "./utils.js";
2
+ import { AssistantMessageEventStream } from "../../utils/event-stream.js";
3
+ import { validateToolArguments } from "../../utils/validation.js";
4
+ import { calculateCost } from "../../models.js";
5
+ export const streamGoogle = (model, context, options, id) => {
6
+ const stream = new AssistantMessageEventStream();
15
7
  (async () => {
8
+ const startTimestamp = Date.now();
16
9
  const output = {
17
10
  role: "assistant",
11
+ api: model.api,
12
+ model: model,
13
+ id,
18
14
  content: [],
19
- api: "google-generative-ai",
20
- model: model.id,
21
15
  usage: {
22
16
  input: 0,
23
17
  output: 0,
@@ -27,7 +21,8 @@ const streamGoogle = (model, context, options) => {
27
21
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
28
22
  },
29
23
  stopReason: "stop",
30
- timestamp: Date.now(),
24
+ timestamp: startTimestamp,
25
+ duration: 0
31
26
  };
32
27
  let finalResponse = {
33
28
  text: '',
@@ -36,11 +31,13 @@ const streamGoogle = (model, context, options) => {
36
31
  executableCode: '',
37
32
  codeExecutionResult: ''
38
33
  };
34
+ // Counter for generating unique tool call IDs
35
+ let toolCallCounter = 0;
39
36
  try {
40
37
  const client = createClient(model, options?.apiKey);
41
38
  const params = buildParams(model, context, options);
42
39
  const googleStream = await client.models.generateContentStream(params);
43
- stream.push({ type: "start", partial: output });
40
+ stream.push({ type: "start", message: { ...output, timestamp: Date.now() } });
44
41
  let currentBlock = null;
45
42
  const blocks = output.content;
46
43
  const blockIndex = () => blocks.length - 1;
@@ -78,84 +75,87 @@ const streamGoogle = (model, context, options) => {
78
75
  const isThinking = part.thought === true;
79
76
  if (!currentBlock ||
80
77
  (isThinking && currentBlock.type !== "thinking") ||
81
- (!isThinking && currentBlock.type !== "text")) {
78
+ (!isThinking && currentBlock.type !== "response")) {
82
79
  if (currentBlock) {
83
- if (currentBlock.type === "text") {
80
+ if (currentBlock.type === "response") {
84
81
  stream.push({
85
82
  type: "text_end",
86
83
  contentIndex: blocks.length - 1,
87
- content: currentBlock.text,
88
- partial: output,
84
+ content: currentBlock.content,
85
+ message: { ...output, timestamp: Date.now() },
89
86
  });
90
87
  }
91
88
  else {
92
89
  stream.push({
93
90
  type: "thinking_end",
94
91
  contentIndex: blockIndex(),
95
- content: currentBlock.thinking,
96
- partial: output,
92
+ content: currentBlock.thinkingText,
93
+ message: { ...output, timestamp: Date.now() },
97
94
  });
98
95
  }
99
96
  }
100
97
  if (isThinking) {
101
- currentBlock = { type: "thinking", thinking: "" };
98
+ currentBlock = { type: "thinking", thinkingText: "" };
102
99
  output.content.push(currentBlock);
103
- stream.push({ type: "thinking_start", contentIndex: blockIndex(), partial: output });
100
+ stream.push({ type: "thinking_start", contentIndex: blockIndex(), message: { ...output, timestamp: Date.now() } });
104
101
  }
105
102
  else {
106
- currentBlock = { type: "text", text: "" };
103
+ currentBlock = { type: "response", content: [{ type: 'text', content: "" }] };
107
104
  output.content.push(currentBlock);
108
- stream.push({ type: "text_start", contentIndex: blockIndex(), partial: output });
105
+ stream.push({ type: "text_start", contentIndex: blockIndex(), message: { ...output, timestamp: Date.now() } });
109
106
  }
110
107
  }
111
108
  if (currentBlock.type === "thinking") {
112
- currentBlock.thinking += part.text;
109
+ currentBlock.thinkingText += part.text;
113
110
  stream.push({
114
111
  type: "thinking_delta",
115
112
  contentIndex: blockIndex(),
116
113
  delta: part.text,
117
- partial: output,
114
+ message: { ...output, timestamp: Date.now() },
118
115
  });
119
116
  }
120
117
  else {
121
- currentBlock.text += part.text;
118
+ const index = currentBlock.content.findIndex((c) => c.type === 'text');
119
+ if (index !== -1) {
120
+ currentBlock.content[index].content += part.text;
121
+ }
122
122
  stream.push({
123
123
  type: "text_delta",
124
124
  contentIndex: blockIndex(),
125
125
  delta: part.text,
126
- partial: output,
126
+ message: { ...output, timestamp: Date.now() },
127
127
  });
128
128
  }
129
129
  }
130
130
  if (part.functionCall) {
131
131
  if (currentBlock) {
132
- if (currentBlock.type === "text") {
132
+ if (currentBlock.type === "response") {
133
133
  stream.push({
134
134
  type: "text_end",
135
135
  contentIndex: blockIndex(),
136
- content: currentBlock.text,
137
- partial: output,
136
+ content: currentBlock.content,
137
+ message: { ...output, timestamp: Date.now() },
138
138
  });
139
139
  }
140
140
  else {
141
141
  stream.push({
142
142
  type: "thinking_end",
143
143
  contentIndex: blockIndex(),
144
- content: currentBlock.thinking,
145
- partial: output,
144
+ content: currentBlock.thinkingText,
145
+ message: { ...output, timestamp: Date.now() },
146
146
  });
147
147
  }
148
148
  currentBlock = null;
149
149
  }
150
150
  // Generate unique ID if not provided or if it's a duplicate
151
151
  const providedId = part.functionCall.id;
152
- const needsNewId = !providedId || output.content.some((b) => b.type === "toolCall" && b.id === providedId);
152
+ const needsNewId = !providedId || output.content.some((b) => b.type === "toolCall" && b.toolCallId === providedId);
153
153
  const toolCallId = needsNewId
154
154
  ? `${part.functionCall.name}_${Date.now()}_${++toolCallCounter}`
155
155
  : providedId;
156
156
  const toolCall = {
157
157
  type: "toolCall",
158
- id: toolCallId,
158
+ toolCallId: toolCallId,
159
159
  name: part.functionCall.name || "",
160
160
  arguments: part.functionCall.args,
161
161
  ...(part.thoughtSignature && { thoughtSignature: part.thoughtSignature }),
@@ -164,18 +164,18 @@ const streamGoogle = (model, context, options) => {
164
164
  if (context.tools) {
165
165
  const tool = context.tools.find((t) => t.name === toolCall.name);
166
166
  if (tool) {
167
- toolCall.arguments = (0, validation_1.validateToolArguments)(tool, toolCall);
167
+ toolCall.arguments = validateToolArguments(tool, toolCall);
168
168
  }
169
169
  }
170
170
  output.content.push(toolCall);
171
- stream.push({ type: "toolcall_start", contentIndex: blockIndex(), partial: output });
171
+ stream.push({ type: "toolcall_start", contentIndex: blockIndex(), message: { ...output, timestamp: Date.now() } });
172
172
  stream.push({
173
173
  type: "toolcall_delta",
174
174
  contentIndex: blockIndex(),
175
175
  delta: JSON.stringify(toolCall.arguments),
176
- partial: output,
176
+ message: { ...output, timestamp: Date.now() },
177
177
  });
178
- stream.push({ type: "toolcall_end", contentIndex: blockIndex(), toolCall, partial: output });
178
+ stream.push({ type: "toolcall_end", contentIndex: blockIndex(), toolCall, message: { ...output, timestamp: Date.now() } });
179
179
  }
180
180
  }
181
181
  }
@@ -200,24 +200,24 @@ const streamGoogle = (model, context, options) => {
200
200
  total: 0,
201
201
  },
202
202
  };
203
- (0, models_1.calculateCost)(model, output.usage);
203
+ calculateCost(model, output.usage);
204
204
  }
205
205
  }
206
206
  if (currentBlock) {
207
- if (currentBlock.type === "text") {
207
+ if (currentBlock.type === "response") {
208
208
  stream.push({
209
209
  type: "text_end",
210
210
  contentIndex: blockIndex(),
211
- content: currentBlock.text,
212
- partial: output,
211
+ content: currentBlock.content,
212
+ message: { ...output, timestamp: Date.now() },
213
213
  });
214
214
  }
215
215
  else {
216
216
  stream.push({
217
217
  type: "thinking_end",
218
218
  contentIndex: blockIndex(),
219
- content: currentBlock.thinking,
220
- partial: output,
219
+ content: currentBlock.thinkingText,
220
+ message: { ...output, timestamp: Date.now() },
221
221
  });
222
222
  }
223
223
  }
@@ -240,195 +240,31 @@ const streamGoogle = (model, context, options) => {
240
240
  content: messageInputs[i]
241
241
  });
242
242
  }
243
- stream.push({ type: "done", reason: output.stopReason, message: output });
244
- stream.end({
245
- _provider: 'google',
246
- role: 'assistant',
247
- message: finalResponse
248
- });
243
+ stream.push({ type: "done", reason: output.stopReason, message: { ...output, timestamp: Date.now() } });
244
+ const baseAssistantMessage = {
245
+ ...output,
246
+ message: finalResponse,
247
+ timestamp: Date.now(),
248
+ duration: Date.now() - startTimestamp
249
+ };
250
+ stream.end(baseAssistantMessage);
249
251
  }
250
252
  catch (error) {
251
253
  for (const block of output.content)
252
254
  delete block.index;
253
255
  output.stopReason = options?.signal?.aborted ? "aborted" : "error";
254
256
  output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);
255
- stream.push({ type: "error", reason: output.stopReason, error: output });
256
- stream.end({
257
- _provider: 'google',
258
- role: 'assistant',
259
- message: finalResponse
260
- });
257
+ stream.push({ type: "error", reason: output.stopReason, message: { ...output, timestamp: Date.now() } });
258
+ const baseAssistantMessage = {
259
+ ...output,
260
+ message: finalResponse,
261
+ timestamp: Date.now(),
262
+ duration: Date.now() - startTimestamp,
263
+ errorMessage: error instanceof Error ? error.message : String(error)
264
+ };
265
+ stream.end(baseAssistantMessage);
261
266
  }
262
267
  })();
263
268
  return stream;
264
269
  };
265
- exports.streamGoogle = streamGoogle;
266
- function createClient(model, apiKey) {
267
- if (!apiKey) {
268
- if (!process.env.GEMINI_API_KEY) {
269
- throw new Error("Gemini API key is required. Set GEMINI_API_KEY environment variable or pass it as an argument.");
270
- }
271
- apiKey = process.env.GEMINI_API_KEY;
272
- }
273
- return new genai_1.GoogleGenAI({
274
- apiKey,
275
- httpOptions: model.headers ? { headers: model.headers } : undefined,
276
- });
277
- }
278
- function buildParams(model, context, options) {
279
- const contents = (0, convert_1.buildGoogleMessages)(model, context);
280
- const config = {};
281
- if (options?.signal) {
282
- config.abortSignal = options.signal;
283
- }
284
- if (context.systemPrompt) {
285
- config.systemInstruction = (0, sanitize_unicode_1.sanitizeSurrogates)(context.systemPrompt);
286
- }
287
- if (options?.temperature) {
288
- config.temperature = options.temperature;
289
- }
290
- if (options?.maxOutputTokens) {
291
- config.maxOutputTokens = options.maxOutputTokens;
292
- }
293
- if (options?.responseMimeType) {
294
- config.responseMimeType = options.responseMimeType;
295
- }
296
- if (context.tools) {
297
- config.tools = convertTools(context.tools);
298
- }
299
- if (options?.thinkingConfig) {
300
- config.thinkingConfig = {
301
- includeThoughts: true,
302
- thinkingLevel: options.thinkingConfig.thinkingLevel
303
- };
304
- }
305
- if (options?.imageConfig) {
306
- config.imageConfig = {
307
- imageSize: options.imageConfig.imageSize,
308
- aspectRatio: options.imageConfig.aspectRatio
309
- };
310
- }
311
- const params = {
312
- model: model.id,
313
- contents,
314
- config
315
- };
316
- return params;
317
- }
318
- /**
319
- * Transforms a JSON Schema to Google's supported subset.
320
- * Main transformations:
321
- * - Converts { "const": "value" } to { "enum": ["value"] }
322
- * - Converts { "anyOf": [{ "const": "a" }, { "const": "b" }] } to { "enum": ["a", "b"] }
323
- * - Recursively processes nested objects and arrays
324
- */
325
- function transformSchemaForGoogle(schema) {
326
- if (!schema || typeof schema !== 'object') {
327
- return schema;
328
- }
329
- // Handle arrays
330
- if (Array.isArray(schema)) {
331
- return schema.map(transformSchemaForGoogle);
332
- }
333
- const transformed = {};
334
- // Handle const keyword - convert to enum
335
- if ('const' in schema) {
336
- transformed.enum = [schema.const];
337
- // Copy over other properties except const
338
- for (const key in schema) {
339
- if (key !== 'const') {
340
- transformed[key] = schema[key];
341
- }
342
- }
343
- return transformed;
344
- }
345
- // Handle anyOf with const values - convert to enum
346
- if ('anyOf' in schema && Array.isArray(schema.anyOf) && schema.anyOf.length > 0) {
347
- const allConst = schema.anyOf.every((item) => item && typeof item === 'object' && 'const' in item);
348
- if (allConst) {
349
- // Extract all const values into a single enum
350
- transformed.enum = schema.anyOf.map((item) => item.const);
351
- // Copy over other properties from the parent schema
352
- for (const key in schema) {
353
- if (key !== 'anyOf') {
354
- transformed[key] = schema[key];
355
- }
356
- }
357
- // Copy type and other properties from the first anyOf item if not already set
358
- if (schema.anyOf.length > 0) {
359
- const firstItem = schema.anyOf[0];
360
- for (const key in firstItem) {
361
- if (key !== 'const' && !(key in transformed)) {
362
- transformed[key] = firstItem[key];
363
- }
364
- }
365
- }
366
- return transformed;
367
- }
368
- }
369
- // Recursively process all properties
370
- for (const key in schema) {
371
- if (key === 'properties' && typeof schema.properties === 'object') {
372
- // Recursively transform each property
373
- transformed.properties = {};
374
- for (const propKey in schema.properties) {
375
- transformed.properties[propKey] = transformSchemaForGoogle(schema.properties[propKey]);
376
- }
377
- }
378
- else if (key === 'items' && schema.items) {
379
- // Recursively transform array items schema
380
- transformed.items = transformSchemaForGoogle(schema.items);
381
- }
382
- else if (key === 'anyOf' || key === 'oneOf' || key === 'allOf') {
383
- // Recursively transform union/intersection schemas
384
- transformed[key] = Array.isArray(schema[key])
385
- ? schema[key].map(transformSchemaForGoogle)
386
- : transformSchemaForGoogle(schema[key]);
387
- }
388
- else {
389
- // Copy other properties as-is
390
- transformed[key] = schema[key];
391
- }
392
- }
393
- return transformed;
394
- }
395
- function convertTools(tools) {
396
- if (tools.length === 0)
397
- return undefined;
398
- return [
399
- {
400
- functionDeclarations: tools.map((tool) => ({
401
- name: tool.name,
402
- description: tool.description,
403
- parameters: transformSchemaForGoogle(tool.parameters),
404
- })),
405
- },
406
- ];
407
- }
408
- function mapStopReason(reason) {
409
- switch (reason) {
410
- case genai_1.FinishReason.STOP:
411
- return "stop";
412
- case genai_1.FinishReason.MAX_TOKENS:
413
- return "length";
414
- case genai_1.FinishReason.BLOCKLIST:
415
- case genai_1.FinishReason.PROHIBITED_CONTENT:
416
- case genai_1.FinishReason.SPII:
417
- case genai_1.FinishReason.SAFETY:
418
- case genai_1.FinishReason.IMAGE_SAFETY:
419
- case genai_1.FinishReason.IMAGE_PROHIBITED_CONTENT:
420
- case genai_1.FinishReason.RECITATION:
421
- case genai_1.FinishReason.FINISH_REASON_UNSPECIFIED:
422
- case genai_1.FinishReason.OTHER:
423
- case genai_1.FinishReason.LANGUAGE:
424
- case genai_1.FinishReason.MALFORMED_FUNCTION_CALL:
425
- case genai_1.FinishReason.UNEXPECTED_TOOL_CALL:
426
- case genai_1.FinishReason.NO_IMAGE:
427
- return "error";
428
- default: {
429
- const _exhaustive = reason;
430
- throw new Error(`Unhandled stop reason: ${_exhaustive}`);
431
- }
432
- }
433
- }
434
- //# sourceMappingURL=google.js.map
270
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/providers/google/stream.ts"],"names":[],"mappings":"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"}