@marinoscar/platform-api 0.1.0-next.5 → 0.1.0-next.6

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 (241) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/ai/core/ai-error.d.ts +15 -158
  3. package/dist/ai/core/ai-error.d.ts.map +1 -1
  4. package/dist/ai/core/ai-error.js +58 -221
  5. package/dist/ai/core/ai-error.js.map +1 -1
  6. package/dist/ai/core/capabilities.d.ts +3 -126
  7. package/dist/ai/core/capabilities.d.ts.map +1 -1
  8. package/dist/ai/core/capabilities.js +13 -109
  9. package/dist/ai/core/capabilities.js.map +1 -1
  10. package/dist/ai/core/conversation.d.ts +2 -15
  11. package/dist/ai/core/conversation.d.ts.map +1 -1
  12. package/dist/ai/core/conversation.js +9 -54
  13. package/dist/ai/core/conversation.js.map +1 -1
  14. package/dist/ai/core/hosted-tools.d.ts +3 -172
  15. package/dist/ai/core/hosted-tools.d.ts.map +1 -1
  16. package/dist/ai/core/hosted-tools.js +20 -286
  17. package/dist/ai/core/hosted-tools.js.map +1 -1
  18. package/dist/ai/core/provider-adapter.interface.d.ts +3 -260
  19. package/dist/ai/core/provider-adapter.interface.d.ts.map +1 -1
  20. package/dist/ai/core/provider-adapter.interface.js +7 -29
  21. package/dist/ai/core/provider-adapter.interface.js.map +1 -1
  22. package/dist/ai/core/structured-output.d.ts +3 -49
  23. package/dist/ai/core/structured-output.d.ts.map +1 -1
  24. package/dist/ai/core/structured-output.js +9 -80
  25. package/dist/ai/core/structured-output.js.map +1 -1
  26. package/dist/ai/core/tools.d.ts +3 -93
  27. package/dist/ai/core/tools.d.ts.map +1 -1
  28. package/dist/ai/core/tools.js +9 -73
  29. package/dist/ai/core/tools.js.map +1 -1
  30. package/dist/ai/core/types/file-inputs.types.d.ts +3 -102
  31. package/dist/ai/core/types/file-inputs.types.d.ts.map +1 -1
  32. package/dist/ai/core/types/file-inputs.types.js +14 -78
  33. package/dist/ai/core/types/file-inputs.types.js.map +1 -1
  34. package/dist/ai/core/types/media.types.d.ts +3 -616
  35. package/dist/ai/core/types/media.types.d.ts.map +1 -1
  36. package/dist/ai/core/types/media.types.js +33 -203
  37. package/dist/ai/core/types/media.types.js.map +1 -1
  38. package/dist/ai/core/types/responses.types.d.ts +3 -619
  39. package/dist/ai/core/types/responses.types.d.ts.map +1 -1
  40. package/dist/ai/core/types/responses.types.js +9 -57
  41. package/dist/ai/core/types/responses.types.js.map +1 -1
  42. package/dist/ai/http/dto/ai-images.dto.d.ts +4 -4
  43. package/dist/ai/index.d.ts +1 -1
  44. package/dist/ai/index.d.ts.map +1 -1
  45. package/dist/ai/index.js +3 -3
  46. package/dist/ai/index.js.map +1 -1
  47. package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts +13 -15
  48. package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts.map +1 -1
  49. package/dist/ai/providers/anthropic/anthropic-client.factory.js +23 -52
  50. package/dist/ai/providers/anthropic/anthropic-client.factory.js.map +1 -1
  51. package/dist/ai/providers/anthropic/anthropic.adapter.d.ts +15 -51
  52. package/dist/ai/providers/anthropic/anthropic.adapter.d.ts.map +1 -1
  53. package/dist/ai/providers/anthropic/anthropic.adapter.js +29 -293
  54. package/dist/ai/providers/anthropic/anthropic.adapter.js.map +1 -1
  55. package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts +10 -14
  56. package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts.map +1 -1
  57. package/dist/ai/providers/azure-openai/azure-openai-client.factory.js +20 -53
  58. package/dist/ai/providers/azure-openai/azure-openai-client.factory.js.map +1 -1
  59. package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts +14 -31
  60. package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts.map +1 -1
  61. package/dist/ai/providers/azure-openai/azure-openai.adapter.js +25 -170
  62. package/dist/ai/providers/azure-openai/azure-openai.adapter.js.map +1 -1
  63. package/dist/ai/providers/gemini/gemini-client.factory.d.ts +13 -18
  64. package/dist/ai/providers/gemini/gemini-client.factory.d.ts.map +1 -1
  65. package/dist/ai/providers/gemini/gemini-client.factory.js +24 -68
  66. package/dist/ai/providers/gemini/gemini-client.factory.js.map +1 -1
  67. package/dist/ai/providers/gemini/gemini.adapter.d.ts +15 -58
  68. package/dist/ai/providers/gemini/gemini.adapter.d.ts.map +1 -1
  69. package/dist/ai/providers/gemini/gemini.adapter.js +29 -348
  70. package/dist/ai/providers/gemini/gemini.adapter.js.map +1 -1
  71. package/dist/ai/providers/openai/openai-client.factory.d.ts +13 -35
  72. package/dist/ai/providers/openai/openai-client.factory.d.ts.map +1 -1
  73. package/dist/ai/providers/openai/openai-client.factory.js +25 -64
  74. package/dist/ai/providers/openai/openai-client.factory.js.map +1 -1
  75. package/dist/ai/providers/openai/openai.adapter.d.ts +15 -48
  76. package/dist/ai/providers/openai/openai.adapter.d.ts.map +1 -1
  77. package/dist/ai/providers/openai/openai.adapter.js +27 -206
  78. package/dist/ai/providers/openai/openai.adapter.js.map +1 -1
  79. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts +11 -11
  80. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts.map +1 -1
  81. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js +18 -41
  82. package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js.map +1 -1
  83. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts +14 -32
  84. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts.map +1 -1
  85. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js +25 -149
  86. package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js.map +1 -1
  87. package/dist/ai/providers/platform-ai-tracer.d.ts +4 -0
  88. package/dist/ai/providers/platform-ai-tracer.d.ts.map +1 -0
  89. package/dist/ai/providers/platform-ai-tracer.js +20 -0
  90. package/dist/ai/providers/platform-ai-tracer.js.map +1 -0
  91. package/dist/ai/runtime/ai-image-run-request.d.ts +1 -1
  92. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts +28 -5
  93. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts.map +1 -1
  94. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js +54 -9
  95. package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js.map +1 -1
  96. package/dist/ai/testing/index.d.ts +1 -1
  97. package/dist/ai/testing/index.d.ts.map +1 -1
  98. package/dist/ai/testing/index.js +2 -1
  99. package/dist/ai/testing/index.js.map +1 -1
  100. package/dist/jobs/rate-limit.error.d.ts +2 -26
  101. package/dist/jobs/rate-limit.error.d.ts.map +1 -1
  102. package/dist/jobs/rate-limit.error.js +4 -52
  103. package/dist/jobs/rate-limit.error.js.map +1 -1
  104. package/dist/storage/config/storage-config.controller.d.ts +1 -1
  105. package/package.json +3 -2
  106. package/dist/ai/providers/anthropic/anthropic-errors.d.ts +0 -16
  107. package/dist/ai/providers/anthropic/anthropic-errors.d.ts.map +0 -1
  108. package/dist/ai/providers/anthropic/anthropic-errors.js +0 -156
  109. package/dist/ai/providers/anthropic/anthropic-errors.js.map +0 -1
  110. package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts +0 -80
  111. package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts.map +0 -1
  112. package/dist/ai/providers/anthropic/anthropic-messages.mapper.js +0 -536
  113. package/dist/ai/providers/anthropic/anthropic-messages.mapper.js.map +0 -1
  114. package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts +0 -49
  115. package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts.map +0 -1
  116. package/dist/ai/providers/anthropic/anthropic-model-catalog.js +0 -198
  117. package/dist/ai/providers/anthropic/anthropic-model-catalog.js.map +0 -1
  118. package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts +0 -35
  119. package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts.map +0 -1
  120. package/dist/ai/providers/anthropic/anthropic-stream.mapper.js +0 -203
  121. package/dist/ai/providers/anthropic/anthropic-stream.mapper.js.map +0 -1
  122. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts +0 -18
  123. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts.map +0 -1
  124. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js +0 -120
  125. package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js.map +0 -1
  126. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts +0 -59
  127. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts.map +0 -1
  128. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js +0 -206
  129. package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js.map +0 -1
  130. package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts +0 -23
  131. package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts.map +0 -1
  132. package/dist/ai/providers/azure-openai/azure-openai-settings.js +0 -54
  133. package/dist/ai/providers/azure-openai/azure-openai-settings.js.map +0 -1
  134. package/dist/ai/providers/gemini/gemini-content.mapper.d.ts +0 -98
  135. package/dist/ai/providers/gemini/gemini-content.mapper.d.ts.map +0 -1
  136. package/dist/ai/providers/gemini/gemini-content.mapper.js +0 -665
  137. package/dist/ai/providers/gemini/gemini-content.mapper.js.map +0 -1
  138. package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts +0 -13
  139. package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts.map +0 -1
  140. package/dist/ai/providers/gemini/gemini-embeddings.mapper.js +0 -78
  141. package/dist/ai/providers/gemini/gemini-embeddings.mapper.js.map +0 -1
  142. package/dist/ai/providers/gemini/gemini-errors.d.ts +0 -32
  143. package/dist/ai/providers/gemini/gemini-errors.d.ts.map +0 -1
  144. package/dist/ai/providers/gemini/gemini-errors.js +0 -191
  145. package/dist/ai/providers/gemini/gemini-errors.js.map +0 -1
  146. package/dist/ai/providers/gemini/gemini-model-catalog.d.ts +0 -45
  147. package/dist/ai/providers/gemini/gemini-model-catalog.d.ts.map +0 -1
  148. package/dist/ai/providers/gemini/gemini-model-catalog.js +0 -264
  149. package/dist/ai/providers/gemini/gemini-model-catalog.js.map +0 -1
  150. package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts +0 -31
  151. package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts.map +0 -1
  152. package/dist/ai/providers/gemini/gemini-stream.mapper.js +0 -118
  153. package/dist/ai/providers/gemini/gemini-stream.mapper.js.map +0 -1
  154. package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts +0 -80
  155. package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts.map +0 -1
  156. package/dist/ai/providers/gemini/testing/gemini-fixtures.js +0 -118
  157. package/dist/ai/providers/gemini/testing/gemini-fixtures.js.map +0 -1
  158. package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts +0 -82
  159. package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts.map +0 -1
  160. package/dist/ai/providers/gemini/testing/gemini-mock-transport.js +0 -342
  161. package/dist/ai/providers/gemini/testing/gemini-mock-transport.js.map +0 -1
  162. package/dist/ai/providers/openai/openai-audio.mapper.d.ts +0 -42
  163. package/dist/ai/providers/openai/openai-audio.mapper.d.ts.map +0 -1
  164. package/dist/ai/providers/openai/openai-audio.mapper.js +0 -266
  165. package/dist/ai/providers/openai/openai-audio.mapper.js.map +0 -1
  166. package/dist/ai/providers/openai/openai-call-telemetry.d.ts +0 -25
  167. package/dist/ai/providers/openai/openai-call-telemetry.d.ts.map +0 -1
  168. package/dist/ai/providers/openai/openai-call-telemetry.js +0 -93
  169. package/dist/ai/providers/openai/openai-call-telemetry.js.map +0 -1
  170. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts +0 -41
  171. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts.map +0 -1
  172. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js +0 -173
  173. package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js.map +0 -1
  174. package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts +0 -33
  175. package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts.map +0 -1
  176. package/dist/ai/providers/openai/openai-chat-completions.engine.js +0 -165
  177. package/dist/ai/providers/openai/openai-chat-completions.engine.js.map +0 -1
  178. package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts +0 -42
  179. package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts.map +0 -1
  180. package/dist/ai/providers/openai/openai-chat-completions.mapper.js +0 -304
  181. package/dist/ai/providers/openai/openai-chat-completions.mapper.js.map +0 -1
  182. package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts +0 -25
  183. package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts.map +0 -1
  184. package/dist/ai/providers/openai/openai-embeddings.mapper.js +0 -81
  185. package/dist/ai/providers/openai/openai-embeddings.mapper.js.map +0 -1
  186. package/dist/ai/providers/openai/openai-errors.d.ts +0 -45
  187. package/dist/ai/providers/openai/openai-errors.d.ts.map +0 -1
  188. package/dist/ai/providers/openai/openai-errors.js +0 -247
  189. package/dist/ai/providers/openai/openai-errors.js.map +0 -1
  190. package/dist/ai/providers/openai/openai-family-guards.d.ts +0 -4
  191. package/dist/ai/providers/openai/openai-family-guards.d.ts.map +0 -1
  192. package/dist/ai/providers/openai/openai-family-guards.js +0 -19
  193. package/dist/ai/providers/openai/openai-family-guards.js.map +0 -1
  194. package/dist/ai/providers/openai/openai-images.mapper.d.ts +0 -23
  195. package/dist/ai/providers/openai/openai-images.mapper.d.ts.map +0 -1
  196. package/dist/ai/providers/openai/openai-images.mapper.js +0 -164
  197. package/dist/ai/providers/openai/openai-images.mapper.js.map +0 -1
  198. package/dist/ai/providers/openai/openai-model-catalog.d.ts +0 -36
  199. package/dist/ai/providers/openai/openai-model-catalog.d.ts.map +0 -1
  200. package/dist/ai/providers/openai/openai-model-catalog.js +0 -209
  201. package/dist/ai/providers/openai/openai-model-catalog.js.map +0 -1
  202. package/dist/ai/providers/openai/openai-realtime.mapper.d.ts +0 -18
  203. package/dist/ai/providers/openai/openai-realtime.mapper.d.ts.map +0 -1
  204. package/dist/ai/providers/openai/openai-realtime.mapper.js +0 -159
  205. package/dist/ai/providers/openai/openai-realtime.mapper.js.map +0 -1
  206. package/dist/ai/providers/openai/openai-redirect-guard.d.ts +0 -9
  207. package/dist/ai/providers/openai/openai-redirect-guard.d.ts.map +0 -1
  208. package/dist/ai/providers/openai/openai-redirect-guard.js +0 -61
  209. package/dist/ai/providers/openai/openai-redirect-guard.js.map +0 -1
  210. package/dist/ai/providers/openai/openai-responses.engine.d.ts +0 -50
  211. package/dist/ai/providers/openai/openai-responses.engine.d.ts.map +0 -1
  212. package/dist/ai/providers/openai/openai-responses.engine.js +0 -206
  213. package/dist/ai/providers/openai/openai-responses.engine.js.map +0 -1
  214. package/dist/ai/providers/openai/openai-responses.mapper.d.ts +0 -64
  215. package/dist/ai/providers/openai/openai-responses.mapper.d.ts.map +0 -1
  216. package/dist/ai/providers/openai/openai-responses.mapper.js +0 -580
  217. package/dist/ai/providers/openai/openai-responses.mapper.js.map +0 -1
  218. package/dist/ai/providers/openai/openai-stream.mapper.d.ts +0 -28
  219. package/dist/ai/providers/openai/openai-stream.mapper.d.ts.map +0 -1
  220. package/dist/ai/providers/openai/openai-stream.mapper.js +0 -139
  221. package/dist/ai/providers/openai/openai-stream.mapper.js.map +0 -1
  222. package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts +0 -24
  223. package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts.map +0 -1
  224. package/dist/ai/providers/openai/testing/chat-completions-fixtures.js +0 -72
  225. package/dist/ai/providers/openai/testing/chat-completions-fixtures.js.map +0 -1
  226. package/dist/ai/providers/openai/testing/conformance-responders.d.ts +0 -7
  227. package/dist/ai/providers/openai/testing/conformance-responders.d.ts.map +0 -1
  228. package/dist/ai/providers/openai/testing/conformance-responders.js +0 -64
  229. package/dist/ai/providers/openai/testing/conformance-responders.js.map +0 -1
  230. package/dist/ai/providers/openai/testing/openai-fixtures.d.ts +0 -52
  231. package/dist/ai/providers/openai/testing/openai-fixtures.d.ts.map +0 -1
  232. package/dist/ai/providers/openai/testing/openai-fixtures.js +0 -208
  233. package/dist/ai/providers/openai/testing/openai-fixtures.js.map +0 -1
  234. package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts +0 -242
  235. package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts.map +0 -1
  236. package/dist/ai/providers/openai/testing/openai-mock-transport.js +0 -523
  237. package/dist/ai/providers/openai/testing/openai-mock-transport.js.map +0 -1
  238. package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts +0 -13
  239. package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts.map +0 -1
  240. package/dist/ai/providers/openai-compatible/openai-compatible-settings.js +0 -29
  241. package/dist/ai/providers/openai-compatible/openai-compatible-settings.js.map +0 -1
@@ -1,264 +0,0 @@
1
- "use strict";
2
- // =============================================================================
3
- // Gemini model classifier (issue #447, epic #421)
4
- // =============================================================================
5
- //
6
- // This table is a best-effort default; admins override per model. Update it
7
- // when Google ships a new family.
8
- //
9
- // TWO SOURCES, ONE ANSWER. Unlike OpenAI's and Anthropic's, Gemini's model
10
- // list says things about each model: `inputTokenLimit`, `outputTokenLimit`,
11
- // `supportedGenerationMethods` (the SDK's `supportedActions`) and a
12
- // `thinking` flag. The catalog sync hands those back as
13
- // `AiDiscoveredModelMetadata` (`AiProviderAdapter.classifyModel`'s optional
14
- // second argument), and `classifyGeminiModel` uses them to ENRICH what the
15
- // curated rule table below says:
16
- //
17
- // - the token limits replace the table's (the provider is the authority on
18
- // its own limits, and they move between previews);
19
- // - `supportedActions`, when present, must include the method the profile
20
- // needs (`generateContent` for a generative model, `embedContent` /
21
- // `batchEmbedContents` for an embedding model) or the id is left
22
- // unclassified — a listing that says a model cannot generate outranks a
23
- // name that looks like it can;
24
- // - an id NO rule matches is still classified when its metadata is clear:
25
- // a `gemini-*` model that supports `generateContent` gets the generic
26
- // Gemini profile (reasoning only if `thinking` says so), a model that
27
- // supports `embedContent` the embedding profile. Aliases such as
28
- // `gemini-flash-latest` land here.
29
- //
30
- // Without metadata (a request-time lookup, a test) the rule table answers
31
- // alone. The rule list is ORDERED — FIRST MATCH WINS — and every pattern is
32
- // tested against the lower-cased id with any `models/` prefix removed, so a
33
- // dated or `-preview-MM-YYYY` snapshot classifies like its family.
34
- //
35
- // Each rule carries a `GeminiModelProfile`: the neutral capabilities the
36
- // catalog stores, plus the facts the REQUEST MAPPER needs that the neutral
37
- // vocabulary deliberately does not model:
38
- //
39
- // thinking how `reasoning.effort` is expressed —
40
- // 'level': `thinkingConfig.thinkingLevel` (Gemini 3.x,
41
- // where the level is the recommended control),
42
- // 'budget': `thinkingConfig.thinkingBudget` (Gemini 2.5),
43
- // 'none': no thinking (Gemini 2.0 / 1.5);
44
- // thinkingLevels 'level' families: effort -> level (Gemini 3 Pro has
45
- // only LOW and HIGH; Flash has all four);
46
- // structuredOutput whether `responseJsonSchema` is sent at all (2.5+);
47
- // structuredWithTools whether a schema may be combined with function tools
48
- // (Gemini 3.x; 2.5 answers that combination with a 400);
49
- // embeddingDimensions embedding models: whether `outputDimensionality`
50
- // (Matryoshka truncation) is accepted.
51
- //
52
- // Every generative Gemini model reads images and documents (PDF, text,
53
- // audio, video) inline, so `vision_input` and `file_input` are declared for
54
- // all of them. `hosted_tools` is never declared: this adapter maps none of
55
- // Google's built-in tools yet (see `gemini.adapter.ts`).
56
- // =============================================================================
57
- Object.defineProperty(exports, "__esModule", { value: true });
58
- exports.GEMINI_CLASSIFIER_RULES = exports.GEMINI_THINKING_BUDGETS = void 0;
59
- exports.normalizeGeminiModelId = normalizeGeminiModelId;
60
- exports.geminiModelProfile = geminiModelProfile;
61
- exports.classifyGeminiModel = classifyGeminiModel;
62
- const ALL_EFFORTS = ['minimal', 'low', 'medium', 'high'];
63
- /**
64
- * `reasoning.effort` → `thinkingConfig.thinkingBudget`, for the 'budget'
65
- * families (Gemini 2.5), and for an unclassified model.
66
- *
67
- * The ranges Google documents are 128-32768 (2.5 Pro), 0-24576 (2.5 Flash)
68
- * and 512-24576 (2.5 Flash-Lite), so every rung sits inside all three: the
69
- * floor is Flash-Lite's minimum, the top is Flash's maximum, and the rungs
70
- * roughly quadruple so the four efforts are genuinely different amounts of
71
- * thinking. Gemini 3.x still accepts a budget (it is how an unclassified
72
- * model is asked), though a level is the recommended control there.
73
- */
74
- exports.GEMINI_THINKING_BUDGETS = {
75
- minimal: 512,
76
- low: 2048,
77
- medium: 8192,
78
- high: 24576,
79
- };
80
- /** Gemini 3.x Flash / Flash-Lite: all four levels. */
81
- const FLASH_LEVELS = {
82
- minimal: 'MINIMAL',
83
- low: 'LOW',
84
- medium: 'MEDIUM',
85
- high: 'HIGH',
86
- };
87
- /** Gemini 3.x Pro: LOW and HIGH only — the lower two efforts ask for LOW, the upper two HIGH. */
88
- const PRO_LEVELS = {
89
- minimal: 'LOW',
90
- low: 'LOW',
91
- medium: 'HIGH',
92
- high: 'HIGH',
93
- };
94
- const M1 = 1_048_576;
95
- function generate(spec) {
96
- const reasoning = spec.thinking !== 'none';
97
- return {
98
- kind: 'generate',
99
- capabilities: {
100
- capabilities: [
101
- 'responses',
102
- ...(reasoning ? ['reasoning'] : []),
103
- 'tools',
104
- ...(spec.structuredOutput ? ['structured_output'] : []),
105
- 'streaming',
106
- 'vision_input',
107
- 'file_input',
108
- ],
109
- inputModalities: ['text', 'image', 'file'],
110
- outputModalities: ['text'],
111
- ...(reasoning ? { reasoningEfforts: [...ALL_EFFORTS] } : {}),
112
- contextWindow: spec.contextWindow,
113
- maxOutputTokens: spec.maxOutputTokens,
114
- },
115
- thinking: spec.thinking,
116
- ...(spec.thinkingLevels ? { thinkingLevels: spec.thinkingLevels } : {}),
117
- structuredOutput: spec.structuredOutput,
118
- structuredWithTools: spec.structuredWithTools,
119
- };
120
- }
121
- function embedding(contextWindow) {
122
- return {
123
- kind: 'embedding',
124
- capabilities: {
125
- capabilities: ['embeddings'],
126
- inputModalities: ['text'],
127
- outputModalities: ['embedding'],
128
- contextWindow,
129
- },
130
- thinking: 'none',
131
- structuredOutput: false,
132
- structuredWithTools: false,
133
- embeddingDimensions: true,
134
- };
135
- }
136
- const GEMINI_3_PRO = generate({
137
- thinking: 'level',
138
- thinkingLevels: PRO_LEVELS,
139
- structuredOutput: true,
140
- structuredWithTools: true,
141
- contextWindow: M1,
142
- maxOutputTokens: 65_536,
143
- });
144
- const GEMINI_3_FLASH = { ...GEMINI_3_PRO, thinkingLevels: FLASH_LEVELS };
145
- const GEMINI_2_5 = generate({
146
- thinking: 'budget',
147
- structuredOutput: true,
148
- structuredWithTools: false,
149
- contextWindow: M1,
150
- maxOutputTokens: 65_536,
151
- });
152
- function legacy(contextWindow) {
153
- return generate({
154
- thinking: 'none',
155
- structuredOutput: false,
156
- structuredWithTools: false,
157
- contextWindow,
158
- maxOutputTokens: 8192,
159
- });
160
- }
161
- /**
162
- * The profile an unmatched `gemini-*` id gets when its listing says it can
163
- * `generateContent` — current-generation defaults, with reasoning decided by
164
- * the listing's `thinking` flag (see `classifyGeminiModel`).
165
- */
166
- const GENERIC_GEMINI = generate({
167
- thinking: 'budget',
168
- structuredOutput: true,
169
- structuredWithTools: true,
170
- contextWindow: M1,
171
- maxOutputTokens: 65_536,
172
- });
173
- /** Ordered; first match wins. See the file header before reordering. */
174
- exports.GEMINI_CLASSIFIER_RULES = [
175
- // ---- Deliberately unclassified: models no port here drives — image
176
- // output, speech output, the Live API, computer use, robotics, and the
177
- // non-Gemini families the listing also carries.
178
- { match: /-(?:image|tts)(?:-|$)|native-audio|-live(?:-|$)|computer-use|robotics/, profile: null },
179
- { match: /^(?:imagen|veo|aqa|gemma|learnlm|lyria)-?/, profile: null },
180
- { match: /^(?:embedding-001|embedding-gecko)/, profile: null },
181
- // ---- Embeddings.
182
- { match: /^gemini-embedding-2(?:-|$)/, profile: embedding(8192) },
183
- { match: /^gemini-embedding-/, profile: embedding(2048) },
184
- { match: /^text-embedding-004$/, profile: embedding(2048) },
185
- // ---- Gemini 3.x: thinking levels, schemas with tools.
186
- { match: /^gemini-3(?:\.\d+)?-pro(?:-|$)/, profile: GEMINI_3_PRO },
187
- { match: /^gemini-3(?:\.\d+)?-flash(?:-lite)?(?:-|$)/, profile: GEMINI_3_FLASH },
188
- // ---- Gemini 2.5: thinking budgets.
189
- { match: /^gemini-2\.5-(?:pro|flash|flash-lite)(?:-|$)/, profile: GEMINI_2_5 },
190
- // ---- Gemini 2.0 / 1.5: no thinking; `responseJsonSchema` not sent.
191
- { match: /^gemini-2\.0-flash(?:-lite)?(?:-|$)/, profile: legacy(M1) },
192
- { match: /^gemini-1\.5-pro(?:-|$)/, profile: legacy(2_097_152) },
193
- { match: /^gemini-1\.5-flash(?:-8b)?(?:-|$)/, profile: legacy(M1) },
194
- ];
195
- /** The id the rules are tested against: trimmed, lower-cased, without `models/`. */
196
- function normalizeGeminiModelId(modelId) {
197
- return modelId.trim().toLowerCase().replace(/^models\//, '');
198
- }
199
- function positiveInt(value) {
200
- return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : undefined;
201
- }
202
- function supports(metadata, ...actions) {
203
- const listed = metadata?.supportedActions;
204
- if (!Array.isArray(listed))
205
- return undefined;
206
- return actions.some((action) => listed.includes(action));
207
- }
208
- /** `profile` with the listing's own token limits and thinking flag folded in. */
209
- function enrich(profile, metadata) {
210
- if (!metadata)
211
- return profile;
212
- const out = structuredClone(profile);
213
- const context = positiveInt(metadata.inputTokenLimit);
214
- const output = positiveInt(metadata.outputTokenLimit);
215
- if (context !== undefined)
216
- out.capabilities.contextWindow = context;
217
- if (output !== undefined && out.kind === 'generate')
218
- out.capabilities.maxOutputTokens = output;
219
- return out;
220
- }
221
- /** The generic profile for an unmatched `gemini-*` id, reasoning per the listing's flag. */
222
- function genericFromMetadata(metadata) {
223
- if (metadata.thinking === true)
224
- return GENERIC_GEMINI;
225
- const noThinking = structuredClone(GENERIC_GEMINI);
226
- noThinking.thinking = 'none';
227
- noThinking.capabilities.capabilities = noThinking.capabilities.capabilities.filter((c) => c !== 'reasoning');
228
- delete noThinking.capabilities.reasoningEfforts;
229
- return noThinking;
230
- }
231
- /**
232
- * The full profile for `modelId`, or `null` when neither the table nor the
233
- * listing metadata classifies it. A fresh copy each call, so a caller cannot
234
- * corrupt the table.
235
- */
236
- function geminiModelProfile(modelId, metadata, rules = exports.GEMINI_CLASSIFIER_RULES) {
237
- const id = normalizeGeminiModelId(modelId);
238
- const rule = rules.find((candidate) => candidate.match.test(id));
239
- if (rule) {
240
- if (!rule.profile)
241
- return null;
242
- const needed = rule.profile.kind === 'embedding'
243
- ? supports(metadata, 'embedContent', 'batchEmbedContents')
244
- : supports(metadata, 'generateContent');
245
- // A listing that says the model cannot do what its name suggests wins.
246
- if (needed === false)
247
- return null;
248
- return enrich(structuredClone(rule.profile), metadata);
249
- }
250
- if (!metadata)
251
- return null;
252
- if (id.startsWith('gemini-') && supports(metadata, 'generateContent')) {
253
- return enrich(genericFromMetadata(metadata), metadata);
254
- }
255
- if (id.includes('embedding') && supports(metadata, 'embedContent', 'batchEmbedContents')) {
256
- return enrich(embedding(2048), metadata);
257
- }
258
- return null;
259
- }
260
- /** `classifyModel()`: the neutral capabilities only. */
261
- function classifyGeminiModel(modelId, metadata) {
262
- return geminiModelProfile(modelId, metadata)?.capabilities ?? null;
263
- }
264
- //# sourceMappingURL=gemini-model-catalog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-model-catalog.js","sourceRoot":"","sources":["../../../../src/ai/providers/gemini/gemini-model-catalog.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- import type { GenerateContentResponse } from '@google/genai';
2
- import { AiError } from '../../core/ai-error';
3
- import type { AiResponseRequest, AiStreamEvent } from '../../core/types/responses.types';
4
- export interface GeminiStreamMapperOptions {
5
- request: AiResponseRequest;
6
- }
7
- export declare class GeminiStreamMapper {
8
- private readonly opts;
9
- private readonly assembler;
10
- private id;
11
- private model;
12
- private finishReason;
13
- private promptBlocked;
14
- private usage;
15
- private startedFlag;
16
- private terminalFlag;
17
- constructor(opts: GeminiStreamMapperOptions);
18
- /** Whether `response.created` has been emitted. */
19
- get started(): boolean;
20
- /** Whether a terminal event (`response.completed` or `error`) has been emitted. */
21
- get terminated(): boolean;
22
- /** Whether the stream has said it is finished (a finish reason, or a blocked prompt). */
23
- get finished(): boolean;
24
- /** Maps one chunk to zero or more of our events. Nothing is emitted after a terminal event. */
25
- map(chunk: GenerateContentResponse): AiStreamEvent[];
26
- /** The stream ended: closes the open item and emits `response.completed`. Call only when `finished`. */
27
- complete(): AiStreamEvent[];
28
- /** Ends the stream with an `error` event for `err` (idempotent). */
29
- fail(err: AiError): AiStreamEvent[];
30
- }
31
- //# sourceMappingURL=gemini-stream.mapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-stream.mapper.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/gemini/gemini-stream.mapper.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAgB,uBAAuB,EAAwC,MAAM,eAAe,CAAC;AAEjH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAQzF,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAUjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IATjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,KAAK,CAAmD;IAChE,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;gBAEA,IAAI,EAAE,yBAAyB;IAE5D,mDAAmD;IACnD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,mFAAmF;IACnF,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,yFAAyF;IACzF,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,+FAA+F;IAC/F,GAAG,CAAC,KAAK,EAAE,uBAAuB,GAAG,aAAa,EAAE;IAyBpD,wGAAwG;IACxG,QAAQ,IAAI,aAAa,EAAE;IA2B3B,oEAAoE;IACpE,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,EAAE;CAMpC"}
@@ -1,118 +0,0 @@
1
- "use strict";
2
- // =============================================================================
3
- // Gemini `streamGenerateContent` chunks -> AiStreamEvent (issue #447, epic #421)
4
- // =============================================================================
5
- //
6
- // One `GeminiStreamMapper` per stream. A Gemini stream is a sequence of
7
- // partial `GenerateContentResponse`s (SSE `data:` frames): each carries the
8
- // NEXT parts of the one candidate — a slice of text, a slice of a thought
9
- // summary, or a whole function call — and the last carries the
10
- // `finishReason` and the final `usageMetadata`. There is no terminal event:
11
- // the stream simply ends. The output contract is exactly the other adapters':
12
- // `response.created` first, exactly one terminal event (`response.completed`
13
- // or `error`), and the concatenated `output_text.delta`s equal the completed
14
- // response's `outputText`.
15
- //
16
- // first chunk -> response.created (its `responseId`)
17
- // text part -> output_text.delta
18
- // thought part -> reasoning_summary.delta
19
- // functionCall part -> function_call.arguments.delta (the whole
20
- // arguments JSON — Gemini sends a call whole)
21
- // + output_item.done
22
- // a change of part kind -> output_item.done for the item it closes
23
- // thoughtSignature -> (kept for replay, never emitted)
24
- // end of stream -> response.completed, IF a finish reason (or a
25
- // blocked prompt) was seen; a stream that ends
26
- // without one is truncated — the adapter's to
27
- // fail
28
- //
29
- // Parts are assembled by `GeminiOutputAssembler`, and the completed response
30
- // is built by `finishGeminiResponse` — both shared with `create`, so a
31
- // streamed and a non-streamed call produce the same items and the same
32
- // structured-output validation; if that validation fails, the stream ends
33
- // with an `error` event carrying its code instead.
34
- // =============================================================================
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.GeminiStreamMapper = void 0;
37
- const ai_error_1 = require("../../core/ai-error");
38
- const gemini_content_mapper_1 = require("./gemini-content.mapper");
39
- class GeminiStreamMapper {
40
- opts;
41
- assembler = new gemini_content_mapper_1.GeminiOutputAssembler();
42
- id = '';
43
- model = '';
44
- finishReason;
45
- promptBlocked = false;
46
- usage;
47
- startedFlag = false;
48
- terminalFlag = false;
49
- constructor(opts) {
50
- this.opts = opts;
51
- }
52
- /** Whether `response.created` has been emitted. */
53
- get started() {
54
- return this.startedFlag;
55
- }
56
- /** Whether a terminal event (`response.completed` or `error`) has been emitted. */
57
- get terminated() {
58
- return this.terminalFlag;
59
- }
60
- /** Whether the stream has said it is finished (a finish reason, or a blocked prompt). */
61
- get finished() {
62
- return this.finishReason !== undefined || this.promptBlocked;
63
- }
64
- /** Maps one chunk to zero or more of our events. Nothing is emitted after a terminal event. */
65
- map(chunk) {
66
- if (this.terminalFlag)
67
- return [];
68
- const events = [];
69
- if (!this.startedFlag) {
70
- this.startedFlag = true;
71
- this.id = chunk.responseId || (0, gemini_content_mapper_1.geminiFallbackResponseId)();
72
- events.push({ type: 'response.created', id: this.id });
73
- }
74
- if (chunk.modelVersion)
75
- this.model = chunk.modelVersion;
76
- if (chunk.usageMetadata)
77
- this.usage = chunk.usageMetadata;
78
- const candidate = chunk.candidates?.[0];
79
- if (!candidate && chunk.promptFeedback?.blockReason)
80
- this.promptBlocked = true;
81
- for (const part of candidate?.content?.parts ?? [])
82
- events.push(...this.assembler.push(part));
83
- if (candidate?.finishReason)
84
- this.finishReason = candidate.finishReason;
85
- return events;
86
- }
87
- /** The stream ended: closes the open item and emits `response.completed`. Call only when `finished`. */
88
- complete() {
89
- if (this.terminalFlag)
90
- return [];
91
- const events = this.assembler.finish();
92
- let response;
93
- try {
94
- response = (0, gemini_content_mapper_1.finishGeminiResponse)({
95
- id: this.id,
96
- model: this.model || this.opts.request.model,
97
- output: this.assembler.items,
98
- finishReason: this.finishReason,
99
- promptBlocked: this.promptBlocked,
100
- usage: (0, gemini_content_mapper_1.geminiUsage)(this.usage),
101
- }, this.opts.request);
102
- }
103
- catch (err) {
104
- return [...events, ...this.fail(ai_error_1.AiError.wrap(err))];
105
- }
106
- this.terminalFlag = true;
107
- return [...events, { type: 'response.completed', response }];
108
- }
109
- /** Ends the stream with an `error` event for `err` (idempotent). */
110
- fail(err) {
111
- if (this.terminalFlag)
112
- return [];
113
- this.terminalFlag = true;
114
- return [{ type: 'error', code: err.code, message: err.message }];
115
- }
116
- }
117
- exports.GeminiStreamMapper = GeminiStreamMapper;
118
- //# sourceMappingURL=gemini-stream.mapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-stream.mapper.js","sourceRoot":"","sources":["../../../../src/ai/providers/gemini/gemini-stream.mapper.ts"],"names":[],"mappings":"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"}
@@ -1,80 +0,0 @@
1
- export interface GeminiWirePart {
2
- text?: string;
3
- thought?: boolean;
4
- thoughtSignature?: string;
5
- functionCall?: {
6
- name: string;
7
- args?: Record<string, unknown>;
8
- id?: string;
9
- };
10
- functionResponse?: {
11
- name: string;
12
- response: Record<string, unknown>;
13
- id?: string;
14
- };
15
- inlineData?: {
16
- mimeType: string;
17
- data: string;
18
- };
19
- fileData?: {
20
- fileUri: string;
21
- mimeType?: string;
22
- };
23
- executableCode?: {
24
- language: string;
25
- code: string;
26
- };
27
- }
28
- export interface GeminiWireUsage {
29
- promptTokenCount?: number;
30
- candidatesTokenCount?: number;
31
- thoughtsTokenCount?: number;
32
- cachedContentTokenCount?: number;
33
- toolUsePromptTokenCount?: number;
34
- totalTokenCount?: number;
35
- }
36
- export interface GeminiWireResponse {
37
- candidates?: Array<{
38
- content?: {
39
- role: 'model';
40
- parts: GeminiWirePart[];
41
- };
42
- finishReason?: string;
43
- index?: number;
44
- }>;
45
- promptFeedback?: {
46
- blockReason?: string;
47
- };
48
- usageMetadata?: GeminiWireUsage;
49
- modelVersion?: string;
50
- responseId?: string;
51
- }
52
- export declare function textPart(text: string, thoughtSignature?: string): GeminiWirePart;
53
- export declare function thoughtPart(text: string, thoughtSignature?: string): GeminiWirePart;
54
- export declare function functionCallPart(name: string, args: Record<string, unknown>, opts?: {
55
- id?: string;
56
- thoughtSignature?: string;
57
- }): GeminiWirePart;
58
- /** A fresh opaque signature, base64 like the real ones. */
59
- export declare function signature(): string;
60
- export declare function usageFixture(patch?: GeminiWireUsage): GeminiWireUsage;
61
- export interface ResponseFixtureOptions {
62
- model?: string;
63
- parts: GeminiWirePart[];
64
- finishReason?: string;
65
- usage?: GeminiWireUsage;
66
- responseId?: string;
67
- }
68
- /** A complete `GenerateContentResponse` body. `finishReason` defaults to `STOP`. */
69
- export declare function responseFixture(opts: ResponseFixtureOptions): GeminiWireResponse;
70
- /**
71
- * The `streamGenerateContent` chunks for `response`: each text/thought part
72
- * split into `chunkSize`-character slices (the signature on the last slice),
73
- * each other part whole, then a final chunk with an empty text part, the
74
- * finish reason and the full usage. Every chunk repeats the response id and
75
- * model version, as the real API's do.
76
- */
77
- export declare function streamChunksFor(response: GeminiWireResponse, chunkSize?: number): GeminiWireResponse[];
78
- /** A deterministic unit-ish vector for `text`, `length` long — the same text always embeds the same. */
79
- export declare function embeddingFor(text: string, length: number): number[];
80
- //# sourceMappingURL=gemini-fixtures.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-fixtures.d.ts","sourceRoot":"","sources":["../../../../../src/ai/providers/gemini/testing/gemini-fixtures.ts"],"names":[],"mappings":"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"}
@@ -1,118 +0,0 @@
1
- "use strict";
2
- // Builders for Gemini API wire objects in tests (issue #447). Not imported by
3
- // production code.
4
- //
5
- // These are the REST shapes (`generativelanguage.googleapis.com/v1beta`), not
6
- // the SDK's classes: the mock transport sends them over HTTP and the real SDK
7
- // parses them, exactly as it would the real API's. `streamChunksFor` turns
8
- // one response into the chunk sequence `streamGenerateContent?alt=sse` sends
9
- // for it — text split into slices, a function call whole, and a final chunk
10
- // carrying the finish reason and the full usage — so a streamed and a
11
- // non-streamed call can be driven from the same fixture.
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.textPart = textPart;
14
- exports.thoughtPart = thoughtPart;
15
- exports.functionCallPart = functionCallPart;
16
- exports.signature = signature;
17
- exports.usageFixture = usageFixture;
18
- exports.responseFixture = responseFixture;
19
- exports.streamChunksFor = streamChunksFor;
20
- exports.embeddingFor = embeddingFor;
21
- let counter = 0;
22
- function textPart(text, thoughtSignature) {
23
- return { text, ...(thoughtSignature ? { thoughtSignature } : {}) };
24
- }
25
- function thoughtPart(text, thoughtSignature) {
26
- return { text, thought: true, ...(thoughtSignature ? { thoughtSignature } : {}) };
27
- }
28
- function functionCallPart(name, args, opts = {}) {
29
- return {
30
- functionCall: { name, args, ...(opts.id ? { id: opts.id } : {}) },
31
- ...(opts.thoughtSignature ? { thoughtSignature: opts.thoughtSignature } : {}),
32
- };
33
- }
34
- /** A fresh opaque signature, base64 like the real ones. */
35
- function signature() {
36
- return Buffer.from(`sig-${++counter}-${Math.random()}`).toString('base64');
37
- }
38
- function usageFixture(patch = {}) {
39
- return { promptTokenCount: 12, candidatesTokenCount: 7, totalTokenCount: 19, ...patch };
40
- }
41
- /** A complete `GenerateContentResponse` body. `finishReason` defaults to `STOP`. */
42
- function responseFixture(opts) {
43
- return {
44
- candidates: [
45
- {
46
- content: { role: 'model', parts: opts.parts },
47
- finishReason: opts.finishReason ?? 'STOP',
48
- index: 0,
49
- },
50
- ],
51
- usageMetadata: usageFixture(opts.usage),
52
- modelVersion: opts.model ?? 'gemini-2.5-flash',
53
- responseId: opts.responseId ?? `resp_${++counter}`,
54
- };
55
- }
56
- function slices(text, size) {
57
- const out = [];
58
- for (let i = 0; i < text.length; i += size)
59
- out.push(text.slice(i, i + size));
60
- return out.length > 0 ? out : [''];
61
- }
62
- /**
63
- * The `streamGenerateContent` chunks for `response`: each text/thought part
64
- * split into `chunkSize`-character slices (the signature on the last slice),
65
- * each other part whole, then a final chunk with an empty text part, the
66
- * finish reason and the full usage. Every chunk repeats the response id and
67
- * model version, as the real API's do.
68
- */
69
- function streamChunksFor(response, chunkSize = 5) {
70
- const candidate = response.candidates?.[0];
71
- const head = { modelVersion: response.modelVersion, responseId: response.responseId };
72
- const chunks = [];
73
- if (!candidate) {
74
- return [{ ...head, promptFeedback: response.promptFeedback, usageMetadata: response.usageMetadata }];
75
- }
76
- for (const part of candidate.content?.parts ?? []) {
77
- if (typeof part.text === 'string') {
78
- const pieces = slices(part.text, chunkSize);
79
- pieces.forEach((piece, i) => {
80
- const last = i === pieces.length - 1;
81
- const slice = {
82
- text: piece,
83
- ...(part.thought ? { thought: true } : {}),
84
- ...(last && part.thoughtSignature ? { thoughtSignature: part.thoughtSignature } : {}),
85
- };
86
- chunks.push({
87
- ...head,
88
- candidates: [{ content: { role: 'model', parts: [slice] }, index: 0 }],
89
- usageMetadata: { promptTokenCount: response.usageMetadata?.promptTokenCount },
90
- });
91
- });
92
- }
93
- else {
94
- chunks.push({
95
- ...head,
96
- candidates: [{ content: { role: 'model', parts: [part] }, index: 0 }],
97
- usageMetadata: { promptTokenCount: response.usageMetadata?.promptTokenCount },
98
- });
99
- }
100
- }
101
- chunks.push({
102
- ...head,
103
- candidates: [{ content: { role: 'model', parts: [{ text: '' }] }, finishReason: candidate.finishReason, index: 0 }],
104
- usageMetadata: response.usageMetadata,
105
- });
106
- return chunks;
107
- }
108
- /** A deterministic unit-ish vector for `text`, `length` long — the same text always embeds the same. */
109
- function embeddingFor(text, length) {
110
- let seed = 0;
111
- for (const char of text)
112
- seed = (seed * 31 + char.charCodeAt(0)) >>> 0;
113
- return Array.from({ length }, () => {
114
- seed = (seed * 1103515245 + 12345) >>> 0;
115
- return Number(((seed / 0xffffffff) * 2 - 1).toFixed(6));
116
- });
117
- }
118
- //# sourceMappingURL=gemini-fixtures.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-fixtures.js","sourceRoot":"","sources":["../../../../../src/ai/providers/gemini/testing/gemini-fixtures.ts"],"names":[],"mappings":"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"}