@robota-sdk/agent-provider 3.0.0-beta.64

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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/dist/browser/index.d.ts +1104 -0
  3. package/dist/browser/index.d.ts.map +1 -0
  4. package/dist/browser/index.js +7 -0
  5. package/dist/browser/index.js.map +1 -0
  6. package/dist/loggers/index.cjs +1 -0
  7. package/dist/loggers/index.d.ts +151 -0
  8. package/dist/loggers/index.d.ts.map +1 -0
  9. package/dist/loggers/index.js +2 -0
  10. package/dist/loggers/index.js.map +1 -0
  11. package/dist/node/anthropic/index.cjs +1 -0
  12. package/dist/node/anthropic/index.d.ts +158 -0
  13. package/dist/node/anthropic/index.d.ts.map +1 -0
  14. package/dist/node/anthropic/index.js +1 -0
  15. package/dist/node/anthropic--1vgLC-e.js +5 -0
  16. package/dist/node/anthropic--1vgLC-e.js.map +1 -0
  17. package/dist/node/anthropic-BFQ6DSCP.cjs +4 -0
  18. package/dist/node/bytedance/index.cjs +1 -0
  19. package/dist/node/bytedance/index.d.ts +74 -0
  20. package/dist/node/bytedance/index.d.ts.map +1 -0
  21. package/dist/node/bytedance/index.js +1 -0
  22. package/dist/node/bytedance-C_0sF_pJ.js +2 -0
  23. package/dist/node/bytedance-C_0sF_pJ.js.map +1 -0
  24. package/dist/node/bytedance-DVPxqEiC.cjs +1 -0
  25. package/dist/node/chunk-Bmb41Sf3.cjs +1 -0
  26. package/dist/node/deepseek/index.cjs +1 -0
  27. package/dist/node/deepseek/index.d.ts +2 -0
  28. package/dist/node/deepseek/index.js +1 -0
  29. package/dist/node/deepseek-_8Ixx7rA.js +2 -0
  30. package/dist/node/deepseek-_8Ixx7rA.js.map +1 -0
  31. package/dist/node/deepseek-oA2Y6bD0.cjs +1 -0
  32. package/dist/node/gemini/index.cjs +1 -0
  33. package/dist/node/gemini/index.d.ts +173 -0
  34. package/dist/node/gemini/index.d.ts.map +1 -0
  35. package/dist/node/gemini/index.js +1 -0
  36. package/dist/node/gemini-Bh2U87MY.js +4 -0
  37. package/dist/node/gemini-Bh2U87MY.js.map +1 -0
  38. package/dist/node/gemini-DSaNCxZj.cjs +3 -0
  39. package/dist/node/gemma/index.cjs +1 -0
  40. package/dist/node/gemma/index.d.ts +2 -0
  41. package/dist/node/gemma/index.js +1 -0
  42. package/dist/node/gemma-Dp_AfCUR.js +2 -0
  43. package/dist/node/gemma-Dp_AfCUR.js.map +1 -0
  44. package/dist/node/gemma-G-Pf_PnX.cjs +1 -0
  45. package/dist/node/google/index.cjs +1 -0
  46. package/dist/node/google/index.d.ts +14 -0
  47. package/dist/node/google/index.d.ts.map +1 -0
  48. package/dist/node/google/index.js +2 -0
  49. package/dist/node/google/index.js.map +1 -0
  50. package/dist/node/index-B6PnlDMd.d.ts +82 -0
  51. package/dist/node/index-B6PnlDMd.d.ts.map +1 -0
  52. package/dist/node/index-B7UvPJcI.d.ts +315 -0
  53. package/dist/node/index-B7UvPJcI.d.ts.map +1 -0
  54. package/dist/node/index-BLPOTNb5.d.ts +98 -0
  55. package/dist/node/index-BLPOTNb5.d.ts.map +1 -0
  56. package/dist/node/index-BqixM_XD.d.ts +231 -0
  57. package/dist/node/index-BqixM_XD.d.ts.map +1 -0
  58. package/dist/node/index-C3beaqKO.d.ts +231 -0
  59. package/dist/node/index-C3beaqKO.d.ts.map +1 -0
  60. package/dist/node/index-Cp2XRh9G.d.ts +82 -0
  61. package/dist/node/index-Cp2XRh9G.d.ts.map +1 -0
  62. package/dist/node/index-DSv5xruI.d.ts +98 -0
  63. package/dist/node/index-DSv5xruI.d.ts.map +1 -0
  64. package/dist/node/index-w0bV1uaP.d.ts +315 -0
  65. package/dist/node/index-w0bV1uaP.d.ts.map +1 -0
  66. package/dist/node/index.cjs +1 -0
  67. package/dist/node/index.d.ts +8 -0
  68. package/dist/node/index.js +1 -0
  69. package/dist/node/openai/index.cjs +1 -0
  70. package/dist/node/openai/index.d.ts +2 -0
  71. package/dist/node/openai/index.js +1 -0
  72. package/dist/node/openai-CRQjg4xF.js +2 -0
  73. package/dist/node/openai-CRQjg4xF.js.map +1 -0
  74. package/dist/node/openai-compatible-BYfyY5lb.cjs +1 -0
  75. package/dist/node/openai-compatible-Dm4Sof9e.js +2 -0
  76. package/dist/node/openai-compatible-Dm4Sof9e.js.map +1 -0
  77. package/dist/node/openai-xWC6pY7r.cjs +1 -0
  78. package/dist/node/qwen/index.cjs +1 -0
  79. package/dist/node/qwen/index.d.ts +2 -0
  80. package/dist/node/qwen/index.js +1 -0
  81. package/dist/node/qwen-ChUZobTL.js +2 -0
  82. package/dist/node/qwen-ChUZobTL.js.map +1 -0
  83. package/dist/node/qwen-CjT71vSM.cjs +1 -0
  84. package/package.json +157 -0
  85. package/src/anthropic/__tests__/abort-streaming.test.ts +199 -0
  86. package/src/anthropic/__tests__/model-catalog-refresh.test.ts +92 -0
  87. package/src/anthropic/__tests__/provider-definition.test.ts +55 -0
  88. package/src/anthropic/__tests__/provider.test.ts +1357 -0
  89. package/src/anthropic/__tests__/response-parser.test.ts +326 -0
  90. package/src/anthropic/index.ts +22 -0
  91. package/src/anthropic/message-converter.ts +181 -0
  92. package/src/anthropic/model-catalog-refresh.ts +128 -0
  93. package/src/anthropic/parsers/response-parser.ts +184 -0
  94. package/src/anthropic/provider-definition.ts +93 -0
  95. package/src/anthropic/provider.ts +290 -0
  96. package/src/anthropic/streaming-handler.ts +204 -0
  97. package/src/anthropic/types/api-types.ts +158 -0
  98. package/src/anthropic/types.ts +79 -0
  99. package/src/bytedance/http-client.test.ts +288 -0
  100. package/src/bytedance/http-client.ts +163 -0
  101. package/src/bytedance/index.ts +2 -0
  102. package/src/bytedance/provider.spec.ts +320 -0
  103. package/src/bytedance/provider.ts +171 -0
  104. package/src/bytedance/status-mapper.test.ts +299 -0
  105. package/src/bytedance/status-mapper.ts +141 -0
  106. package/src/bytedance/types.ts +68 -0
  107. package/src/deepseek/defaults.ts +4 -0
  108. package/src/deepseek/index.ts +22 -0
  109. package/src/deepseek/model-catalog-refresh.test.ts +57 -0
  110. package/src/deepseek/model-catalog-refresh.ts +105 -0
  111. package/src/deepseek/model-catalog.ts +55 -0
  112. package/src/deepseek/provider-definition.test.ts +109 -0
  113. package/src/deepseek/provider-definition.ts +132 -0
  114. package/src/deepseek/provider.test.ts +324 -0
  115. package/src/deepseek/provider.ts +298 -0
  116. package/src/deepseek/types.ts +37 -0
  117. package/src/gemini/execution-helpers.ts +233 -0
  118. package/src/gemini/genai-transport.test.ts +208 -0
  119. package/src/gemini/image-operations.test.ts +448 -0
  120. package/src/gemini/image-operations.ts +261 -0
  121. package/src/gemini/index.ts +11 -0
  122. package/src/gemini/message-converter.test.ts +616 -0
  123. package/src/gemini/message-converter.ts +140 -0
  124. package/src/gemini/model-catalog-refresh.test.ts +107 -0
  125. package/src/gemini/model-catalog-refresh.ts +92 -0
  126. package/src/gemini/provider-definition.test.ts +70 -0
  127. package/src/gemini/provider-definition.ts +78 -0
  128. package/src/gemini/provider-extended.test.ts +898 -0
  129. package/src/gemini/provider.spec.ts +216 -0
  130. package/src/gemini/provider.ts +279 -0
  131. package/src/gemini/request-converter.ts +226 -0
  132. package/src/gemini/tool-schema-converter.ts +78 -0
  133. package/src/gemini/types/api-types.ts +235 -0
  134. package/src/gemini/types.ts +121 -0
  135. package/src/gemma/index.ts +5 -0
  136. package/src/gemma/message-factory.ts +38 -0
  137. package/src/gemma/provider-definition.test.ts +43 -0
  138. package/src/gemma/provider-definition.ts +84 -0
  139. package/src/gemma/provider-projection.ts +49 -0
  140. package/src/gemma/provider.test.ts +628 -0
  141. package/src/gemma/provider.ts +308 -0
  142. package/src/gemma/pseudo-command-envelope.ts +58 -0
  143. package/src/gemma/pseudo-tool-call-projector.ts +243 -0
  144. package/src/gemma/pseudo-tool-call-tag-parser.ts +153 -0
  145. package/src/gemma/pseudo-tool-call-types.ts +31 -0
  146. package/src/gemma/reasoning-projector.test.ts +52 -0
  147. package/src/gemma/reasoning-projector.ts +144 -0
  148. package/src/gemma/streaming-projection.ts +79 -0
  149. package/src/gemma/tool-call-argument-parser.ts +126 -0
  150. package/src/gemma/tool-call-projector.test.ts +227 -0
  151. package/src/gemma/tool-call-projector.ts +264 -0
  152. package/src/gemma/types.ts +27 -0
  153. package/src/google/index.ts +11 -0
  154. package/src/google/provider-compat.test.ts +19 -0
  155. package/src/google/provider-definition.ts +6 -0
  156. package/src/google/provider.ts +10 -0
  157. package/src/google/types.ts +5 -0
  158. package/src/index.ts +9 -0
  159. package/src/openai/adapter.test.ts +494 -0
  160. package/src/openai/adapter.ts +145 -0
  161. package/src/openai/chat-completions-chat.ts +189 -0
  162. package/src/openai/executor-integration.test.ts +206 -0
  163. package/src/openai/index.ts +21 -0
  164. package/src/openai/interfaces/payload-logger.ts +48 -0
  165. package/src/openai/loggers/console-payload-logger.test.ts +173 -0
  166. package/src/openai/loggers/console-payload-logger.ts +94 -0
  167. package/src/openai/loggers/console.ts +9 -0
  168. package/src/openai/loggers/file-payload-logger.test.ts +238 -0
  169. package/src/openai/loggers/file-payload-logger.ts +112 -0
  170. package/src/openai/loggers/file.ts +9 -0
  171. package/src/openai/loggers/index.ts +12 -0
  172. package/src/openai/loggers/sanitize-openai-log-data.test.ts +89 -0
  173. package/src/openai/loggers/sanitize-openai-log-data.ts +14 -0
  174. package/src/openai/message-converter.ts +22 -0
  175. package/src/openai/model-catalog-refresh.test.ts +92 -0
  176. package/src/openai/model-catalog-refresh.ts +115 -0
  177. package/src/openai/openai-request-format.ts +92 -0
  178. package/src/openai/parsers/response-parser.test.ts +407 -0
  179. package/src/openai/parsers/response-parser.ts +47 -0
  180. package/src/openai/provider-definition.test.ts +75 -0
  181. package/src/openai/provider-definition.ts +132 -0
  182. package/src/openai/provider.test.ts +1402 -0
  183. package/src/openai/provider.ts +237 -0
  184. package/src/openai/responses-chat.ts +258 -0
  185. package/src/openai/responses-converter.ts +112 -0
  186. package/src/openai/responses-parser.ts +285 -0
  187. package/src/openai/responses-stream-utils.ts +45 -0
  188. package/src/openai/responses-types.ts +195 -0
  189. package/src/openai/streaming/stream-assembler.ts +3 -0
  190. package/src/openai/streaming/stream-handler.test.ts +367 -0
  191. package/src/openai/streaming/stream-handler.ts +119 -0
  192. package/src/openai/types/api-types.ts +112 -0
  193. package/src/openai/types.ts +194 -0
  194. package/src/qwen/defaults.ts +26 -0
  195. package/src/qwen/index.ts +5 -0
  196. package/src/qwen/model-catalog-refresh.test.ts +91 -0
  197. package/src/qwen/model-catalog-refresh.ts +97 -0
  198. package/src/qwen/provider-capabilities.ts +34 -0
  199. package/src/qwen/provider-definition.test.ts +139 -0
  200. package/src/qwen/provider-definition.ts +173 -0
  201. package/src/qwen/provider-streaming-assembly.ts +40 -0
  202. package/src/qwen/provider.test.ts +640 -0
  203. package/src/qwen/provider.ts +293 -0
  204. package/src/qwen/responses-chat.ts +194 -0
  205. package/src/qwen/responses-converter.ts +104 -0
  206. package/src/qwen/responses-parser.ts +299 -0
  207. package/src/qwen/responses-stream-utils.ts +38 -0
  208. package/src/qwen/types.ts +228 -0
  209. package/src/shared/openai-compatible/endpoint-probe.test.ts +52 -0
  210. package/src/shared/openai-compatible/endpoint-probe.ts +43 -0
  211. package/src/shared/openai-compatible/index.ts +6 -0
  212. package/src/shared/openai-compatible/message-converter.test.ts +111 -0
  213. package/src/shared/openai-compatible/message-converter.ts +84 -0
  214. package/src/shared/openai-compatible/native-payload-observer.test.ts +43 -0
  215. package/src/shared/openai-compatible/native-payload-observer.ts +26 -0
  216. package/src/shared/openai-compatible/response-parser.test.ts +172 -0
  217. package/src/shared/openai-compatible/response-parser.ts +180 -0
  218. package/src/shared/openai-compatible/stream-assembler.test.ts +266 -0
  219. package/src/shared/openai-compatible/stream-assembler.ts +248 -0
  220. package/src/shared/openai-compatible/types.ts +59 -0
@@ -0,0 +1,3 @@
1
+ require(`./chunk-Bmb41Sf3.cjs`);let e=require(`node:crypto`),t=require(`@robota-sdk/agent-core`),n=require(`@google/genai`);function r(e){return e?e.some(e=>e.type===`image_inline`||e.type===`image_uri`):!1}function i(e){if(!e)return[];let t=[];for(let n of e)n.type===`image_inline`&&t.push({kind:`uri`,uri:`data:${n.mimeType};base64,${n.data}`,mimeType:n.mimeType});return t}function a(e){let t=e.indexOf(`,`);if(t<0)return;let n=e.slice(0,t),r=e.slice(t+1);if(!n.endsWith(`;base64`))return;let i=n.replace(`data:`,``).replace(`;base64`,``).trim();if(!(i.length===0||r.trim().length===0))return{mimeType:i,data:r}}function o(e){if(e.kind===`inline`)return e.mimeType.trim().length===0||e.data.trim().length===0?{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Inline image source requires non-empty mimeType and data.`}}:{ok:!0,value:{type:`image_inline`,mimeType:e.mimeType,data:e.data}};if(!e.uri.startsWith(`data:`))return{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Google image provider supports only inline or data URI input sources.`}};let t=a(e.uri);return t?{ok:!0,value:{type:`image_inline`,mimeType:t.mimeType,data:t.data}}:{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Data URI source must use base64 payload.`}}}function s(e,t,n){return n&&n.length>0?n:e.some(e=>r(e.parts))?[`TEXT`,`IMAGE`]:t&&t.length>0?t:[`TEXT`]}function c(e,t){return!t||t.length===0?!0:t.includes(e)}function l(e,t,n){h(t);let r=s(e,t.defaultResponseModalities,n?.google?.responseModalities);u(n?.model,r,t);let i={responseModalities:r};return d(i,n),f(i,t,n),p(i,t),m(i,t),i}function u(e,t,n){if(!(!e||!t.includes(`IMAGE`))&&!c(e,n.imageCapableModels))throw Error(`Selected model "${e}" is not configured as image-capable for Google provider.`)}function d(e,t){typeof t?.temperature==`number`&&(e.temperature=t.temperature),typeof t?.maxTokens==`number`&&(e.maxOutputTokens=t.maxTokens),typeof t?.google?.topP==`number`&&(e.topP=t.google.topP),typeof t?.google?.topK==`number`&&(e.topK=t.google.topK),typeof t?.google?.candidateCount==`number`&&(e.candidateCount=t.google.candidateCount),t?.google?.stopSequences&&t.google.stopSequences.length>0&&(e.stopSequences=t.google.stopSequences),t?.signal&&(e.abortSignal=t.signal)}function f(e,t,n){let r=n?.google?.safetySettings??t.safetySettings;r&&r.length>0&&(e.safetySettings=r)}function p(e,t){t.responseMimeType&&(e.responseMimeType=t.responseMimeType),t.responseSchema&&(e.responseMimeType=t.responseMimeType??`application/json`,e.responseSchema=t.responseSchema),t.responseJsonSchema&&(e.responseMimeType=t.responseMimeType??`application/json`,e.responseJsonSchema=t.responseJsonSchema)}function m(e,t){t.thinkingConfig&&(e.thinkingConfig=t.thinkingConfig),t.toolConfig&&(e.toolConfig=t.toolConfig)}function h(e){if(e.responseSchema&&e.responseJsonSchema)throw Error(`Gemini structured output options responseSchema and responseJsonSchema are mutually exclusive.`)}function g(e){let t=[],n=e.parts??[];for(let e of n){if(e.type===`text`){t.push({text:e.text});continue}if(e.type===`image_inline`){t.push({inlineData:{mimeType:e.mimeType,data:e.data}});continue}throw Error(`Google provider does not support image URI parts directly: ${e.uri}`)}return t.length===0&&typeof e.content==`string`&&e.content.length>0&&t.push({text:e.content}),t}function _(e){let t=[],n=[];for(let r of e){if(r.role===`user`){t.push({role:`user`,parts:g(r)});continue}if(r.role===`assistant`){t.push(v(r));continue}if(r.role===`tool`){t.push(y(r));continue}let e=b(r);e.length>0&&n.push(e)}return{contents:t,...n.length>0&&{systemInstruction:n.join(`
2
+ `)}}}function v(e){let t=[],n=g(e);for(let e of n)t.push(e);return t.length===0&&e.content&&t.push({text:e.content}),e.toolCalls&&e.toolCalls.length>0&&e.toolCalls.forEach(e=>{t.push({functionCall:{id:e.id,name:e.function.name,args:S(e.function.arguments)}})}),{role:`model`,parts:t}}function y(e){return{role:`user`,parts:[{functionResponse:{id:e.toolCallId,name:x(e),response:C(e.content)}}]}}function b(e){let t=g(e);if(t.length===0)return e.content;let n=[];for(let e of t){if(typeof e.text==`string`){n.push(e.text);continue}throw Error(`Google provider system instructions support only text parts.`)}return n.join(`
3
+ `)}function x(e){let t=e.name?.trim();if(!t)throw Error(`Google provider tool message requires a function name.`);return t}function S(e){let t=JSON.parse(e);if(!w(t))throw Error(`Google provider tool call arguments must be a JSON object.`);return t}function C(e){let t=e.trim();if(t.length===0)return{output:null};try{let e=JSON.parse(t);return w(e)?e:{output:e}}catch{return{output:e}}}function w(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const T={string:n.Type.STRING,number:n.Type.NUMBER,integer:n.Type.INTEGER,boolean:n.Type.BOOLEAN,array:n.Type.ARRAY,object:n.Type.OBJECT};function E(e){return e.map(e=>({name:e.name,description:e.description,parameters:{type:n.Type.OBJECT,properties:D(e.parameters.properties),required:e.parameters.required}}))}function D(e){let t={};for(let[n,r]of Object.entries(e))t[n]=O(r);return t}function O(e){let t={},n=k(e.type);return n&&(t.type=n),e.description&&(t.description=e.description),e.enum&&(t.enum=e.enum.map(String)),e.items&&(t.items=O(e.items)),e.properties&&(t.properties=D(e.properties)),typeof e.minimum==`number`&&(t.minimum=e.minimum),typeof e.maximum==`number`&&(t.maximum=e.maximum),e.pattern&&(t.pattern=e.pattern),e.format&&(t.format=e.format),e.default!==void 0&&(t.default=e.default),t}function k(e){if(e!==`null`)return T[e]}function A(){return`call_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}function j(t){let n=t.candidates?.[0];if(!n)throw Error(`No candidate in Gemini response`);let r=n.content;if(!r||!r.parts||r.parts.length===0)throw Error(`No content in Gemini response`);let i=M(r.parts),a={id:(0,e.randomUUID)(),state:`complete`,role:`assistant`,content:i.textValues.length>0?i.textValues.join(``):null,parts:i.messageParts,timestamp:new Date};if(i.functionCalls.length>0){let e=a;e.toolCalls=i.functionCalls.map(e=>({id:e.id??A(),type:`function`,function:{name:P(e),arguments:JSON.stringify(e.args??{})}}))}let o=N(t);return o&&(a.metadata=o),a}function M(e){let t=[],n=[],r=[];for(let i of e)ee(i,t,n),te(i,n),i.functionCall&&r.push(i.functionCall);return{textValues:t,messageParts:n,functionCalls:r}}function ee(e,t,n){typeof e.text==`string`&&(t.push(e.text),n.push({type:`text`,text:e.text}))}function te(e,t){!e.inlineData||typeof e.inlineData.data!=`string`||typeof e.inlineData.mimeType!=`string`||t.push({type:`image_inline`,data:e.inlineData.data,mimeType:e.inlineData.mimeType})}function N(e){if(!(!e.usageMetadata||typeof e.usageMetadata.promptTokenCount!=`number`||typeof e.usageMetadata.candidatesTokenCount!=`number`||typeof e.usageMetadata.totalTokenCount!=`number`))return{promptTokens:e.usageMetadata.promptTokenCount,completionTokens:e.usageMetadata.candidatesTokenCount,totalTokens:e.usageMetadata.totalTokenCount}}function P(e){if(!e.name||e.name.trim().length===0)throw Error(`Gemini function call is missing a function name.`);return e.name}async function F(e,t,n,i,a=`gemini`){let o=R(t,i),c=s(n,t.defaultResponseModalities,i?.google?.responseModalities);if(i?.onTextDelta&&!c.includes(`IMAGE`))return z(e,t,n,i,a);let u=_(n),d=l(n,t,{...i,model:o}),f=L(o,u.contents,d,i,u.systemInstruction);B(i,a,`request`,f);let p=await e.models.generateContent(f);B(i,a,`response`,p);let m=j(p);if(c.includes(`IMAGE`)&&!r(m.parts))throw Error(`Gemini response did not include an image part while IMAGE modality was requested.`);return m}async function*I(t,n,r,i,a=`gemini`){let o=R(n,i);if(s(r,n.defaultResponseModalities,i?.google?.responseModalities).includes(`IMAGE`))throw Error(`Google provider does not support streaming image modality responses.`);let c=_(r),u=l(r,n,{...i,model:o}),d=L(o,c.contents,u,i,c.systemInstruction);B(i,a,`request`,d);let f=await t.models.generateContentStream(d),p=0;for await(let t of f){B(i,a,`stream_event`,t,p),p++;let n=V(t);n&&(i?.onTextDelta?.(n),yield{id:(0,e.randomUUID)(),role:`assistant`,content:n,state:`complete`,timestamp:new Date})}}function L(e,t,n,r,i){let a={...n};return r?.tools&&r.tools.length>0&&(a.tools=[{functionDeclarations:E(r.tools)}]),i&&(a.systemInstruction=i),{model:e,contents:t,config:a}}function R(e,t){let n=t?.model??e.defaultModel;if(!n)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);return n}async function z(t,n,r,i,a=`gemini`){let o=[];for await(let e of I(t,n,r,i,a))typeof e.content==`string`&&o.push(e.content);let s=o.join(``);return{id:(0,e.randomUUID)(),role:`assistant`,content:s,parts:s.length>0?[{type:`text`,text:s}]:[],state:`complete`,timestamp:new Date}}function B(e,t,n,r,i){e?.onProviderNativeRawPayload?.({provider:t,apiSurface:`gemini-generate-content`,payloadKind:n,...i!==void 0&&{sequence:i},payload:r})}function V(e){let t=e.text;return typeof t==`function`?t():t}async function H(e,t,n){try{let r=i((await e(t,{model:n,google:{responseModalities:[`TEXT`,`IMAGE`]}})).parts);return r.length===0?{ok:!1,error:{code:`PROVIDER_UPSTREAM_ERROR`,message:`Google image response did not include image output parts.`}}:{ok:!0,value:{outputs:r,model:n}}}catch(e){return{ok:!1,error:{code:`PROVIDER_UPSTREAM_ERROR`,message:e instanceof Error?e.message:`Google image request failed.`}}}}var U=class extends t.AbstractAIProvider{name=`gemini`;version=`1.0.0`;onTextDelta;client;options;constructor(e){super(),this.options=e,e.executor&&(this.executor=e.executor),this.executor||(this.client=new n.GoogleGenAI({apiKey:e.apiKey}))}async chat(e,t){if(this.validateMessages(e),this.executor)try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`Gemini Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Google client not available. Either provide apiKey or use an executor.`);try{return await F(this.client,this.options,e,this.withProviderCallbacks(t),this.name)}catch(e){let t=e instanceof Error?e.message:`Google API request failed`;throw Error(`Google chat failed: ${t}`)}}async*chatStream(e,t){if(this.validateMessages(e),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,t);return}catch(e){throw this.logger.error(`Gemini Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Google client not available. Either provide apiKey or use an executor.`);try{yield*I(this.client,this.options,e,this.withProviderCallbacks(t),this.name)}catch(e){let t=e instanceof Error?e.message:`Google API request failed`;throw Error(`Google stream failed: ${t}`)}}async generateImage(t){if(t.prompt.trim().length===0)return{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Image generation requires a non-empty prompt.`}};if(t.model.trim().length===0)return{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Image generation requires a non-empty model.`}};let n={id:(0,e.randomUUID)(),role:`user`,content:t.prompt,state:`complete`,parts:[{type:`text`,text:t.prompt}],timestamp:new Date};return H(this.chat.bind(this),[n],t.model)}async editImage(t){if(t.prompt.trim().length===0)return{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Image edit requires a non-empty prompt.`}};if(t.model.trim().length===0)return{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Image edit requires a non-empty model.`}};let n=o(t.image);if(!n.ok)return n;let r={id:(0,e.randomUUID)(),role:`user`,content:t.prompt,state:`complete`,parts:[n.value,{type:`text`,text:t.prompt}],timestamp:new Date};return H(this.chat.bind(this),[r],t.model)}async composeImage(t){if(t.prompt.trim().length===0)return{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Image compose requires a non-empty prompt.`}};if(t.model.trim().length===0)return{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Image compose requires a non-empty model.`}};if(t.images.length<2)return{ok:!1,error:{code:`PROVIDER_INVALID_REQUEST`,message:`Image compose requires at least two input images.`}};let n=[];for(let e of t.images){let t=o(e);if(!t.ok)return t;n.push(t.value)}n.push({type:`text`,text:t.prompt});let r={id:(0,e.randomUUID)(),role:`user`,content:t.prompt,state:`complete`,parts:n,timestamp:new Date};return H(this.chat.bind(this),[r],t.model)}supportsTools(){return!0}validateConfig(){return this.executor?this.executor.validateConfig():!!this.client&&!!this.options&&!!this.options.apiKey}async dispose(){}withProviderCallbacks(e){let t=e?.onTextDelta??this.onTextDelta;return t?{...e,onTextDelta:t}:e}};const W=`GEMINI_API_KEY`,G=`$ENV:${W}`,K=`gemini-3-flash-preview`,q=`https://ai.google.dev/api/models`,J=`2026-05-04`,Y=[{kind:`api-key`,label:`Google AI Studio API keys`,url:`https://aistudio.google.com/apikey`,sourceUrl:`https://ai.google.dev/gemini-api/docs/api-key`,lastVerifiedAt:`2026-05-08`}];function X(){return{type:`gemini`,aliases:[`google`],displayName:`Gemini`,description:`Google Gemini API provider`,defaults:{model:K,apiKey:G},modelCatalog:{status:`fallback`,sourceUrl:q,lastVerifiedAt:J,entries:[{id:K,displayName:`Gemini 3 Flash Preview`,capabilities:[`tools`,`vision`,`json_schema`,`reasoning`,`streaming`],lifecycle:`preview`,sourceUrl:q,lastVerifiedAt:J}]},setupHelpLinks:Y,setupSteps:[{key:`model`,title:`Gemini model`,defaultValue:K},{key:`apiKey`,title:`Gemini API key`,defaultValue:G,masked:!0}],requiresApiKey:!0,refreshModelCatalog:({profile:e})=>$(e),modelCatalogCacheTtlSeconds:86400,createProvider:e=>new U({apiKey:Z(e.apiKey),defaultModel:e.model})}}function Z(e){if(!e)throw Error(`Provider gemini requires apiKey`);return e}const Q=`https://generativelanguage.googleapis.com/v1beta/models`;async function $(e,t=ie){let n=await t(e.apiKey?`${Q}?key=${e.apiKey}`:Q);if(!n.ok)return{status:`unavailable`,sourceUrl:q,message:`Gemini model refresh failed: HTTP ${n.status}`};let r=((await n.json()).models??[]).filter(ne).map(re);return{status:`live`,sourceUrl:q,lastVerifiedAt:new Date().toISOString(),entries:r,message:`Fetched ${r.length} Gemini models`}}function ne(e){return e.supportedGenerationMethods?.includes(`generateContent`)===!0}function re(e){let t=e.name??``,n=t.startsWith(`models/`)?t.slice(7):t,r=t.includes(`preview`)?`preview`:`active`;return{id:n,displayName:e.displayName??n,lifecycle:r,sourceUrl:q,lastVerifiedAt:J}}async function ie(e,t){let n=await fetch(e);return{ok:n.ok,status:n.status,json:()=>n.json()}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return $}});
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../gemma-G-Pf_PnX.cjs`);exports.DEFAULT_GEMMA_PROVIDER_API_KEY=e.t,exports.DEFAULT_GEMMA_PROVIDER_BASE_URL=e.n,exports.DEFAULT_GEMMA_PROVIDER_MODEL=e.r,exports.GemmaProvider=e.a,exports.GemmaReasoningProjector=e.l,exports.GemmaToolCallProjector=e.o,exports.createGemmaProviderDefinition=e.i,exports.createGemmaToolCallProjector=e.s,exports.projectGemmaReasoningText=e.u,exports.projectGemmaToolCallText=e.c;
@@ -0,0 +1,2 @@
1
+ import { a as GemmaProvider, c as IGemmaToolCallProjectorOptions, d as GemmaReasoningProjector, f as IGemmaReasoningProjection, h as TGemmaProviderOptionValue, i as createGemmaProviderDefinition, l as createGemmaToolCallProjector, m as IGemmaProviderOptions, n as DEFAULT_GEMMA_PROVIDER_BASE_URL, o as GemmaToolCallProjector, p as projectGemmaReasoningText, r as DEFAULT_GEMMA_PROVIDER_MODEL, s as IGemmaToolCallProjection, t as DEFAULT_GEMMA_PROVIDER_API_KEY, u as projectGemmaToolCallText } from "../index-BLPOTNb5.js";
2
+ export { DEFAULT_GEMMA_PROVIDER_API_KEY, DEFAULT_GEMMA_PROVIDER_BASE_URL, DEFAULT_GEMMA_PROVIDER_MODEL, GemmaProvider, GemmaReasoningProjector, GemmaToolCallProjector, IGemmaProviderOptions, IGemmaReasoningProjection, IGemmaToolCallProjection, IGemmaToolCallProjectorOptions, TGemmaProviderOptionValue, createGemmaProviderDefinition, createGemmaToolCallProjector, projectGemmaReasoningText, projectGemmaToolCallText };
@@ -0,0 +1 @@
1
+ import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c,u as l}from"../gemma-Dp_AfCUR.js";export{c as DEFAULT_GEMMA_PROVIDER_API_KEY,i as DEFAULT_GEMMA_PROVIDER_BASE_URL,o as DEFAULT_GEMMA_PROVIDER_MODEL,e as GemmaProvider,r as GemmaReasoningProjector,a as GemmaToolCallProjector,n as createGemmaProviderDefinition,s as createGemmaToolCallProjector,l as projectGemmaReasoningText,t as projectGemmaToolCallText};
@@ -0,0 +1,2 @@
1
+ import{a as e,i as t,n,o as r,r as i,t as a}from"./openai-compatible-Dm4Sof9e.js";import{randomUUID as o}from"node:crypto";import{AbstractAIProvider as s,SilentLogger as c,isAssistantMessage as l}from"@robota-sdk/agent-core";import u from"openai";const d=`<|channel>`;function f(e){let t=m(e,{final:!0});return{rawText:e,visibleText:t.visibleParts.join(``),removedReasoning:t.removedReasoning}}var p=class{buffer=``;emittedVisibleText=``;hasRemovedReasoning=!1;get rawText(){return this.buffer}get removedReasoning(){return this.hasRemovedReasoning}project(e){return e.length===0?``:(this.buffer+=e,this.projectVisibleText({final:!1}))}flush(){return this.projectVisibleText({final:!0})}projectVisibleText(e){let t=m(this.buffer,e);this.hasRemovedReasoning=this.hasRemovedReasoning||t.removedReasoning;let n=t.visibleParts.join(``),r=n.slice(this.emittedVisibleText.length);return this.emittedVisibleText=n,r}};function m(e,t){let n={visibleParts:[],removedReasoning:!1},r=0;for(;r<e.length;){let i=e.indexOf(d,r);if(i===-1){h(n,e.slice(r),t);break}h(n,e.slice(r,i),t);let a=i+10,o=e.indexOf(`<channel|>`,a);if(o===-1){t.final&&(n.removedReasoning=!0);break}n.removedReasoning=!0,r=ee(e,a,o)}return n}function h(e,t,n){if(t.length===0)return;if(n.final){e.visibleParts.push(t);return}let r=te(t);e.visibleParts.push(t.slice(0,t.length-r))}function ee(e,t,n){let r=e.slice(t,n),i=n+10;if(r.trim().length===0){let t=e.slice(i).match(/^thought(?:\r?\n)*/);return t&&(i+=t[0].length),i}return r.split(/\r?\n/,1)[0]?.trim(),i}function te(e){let t=Math.min(e.length,9);for(let n=t;n>0;--n)if(d.startsWith(e.slice(e.length-n)))return n;return 0}const g=`<|"|>`;var _=class{source;cursor=0;constructor(e){this.source=e}parse(){let e=this.parseObject();if(this.skipWhitespace(),this.cursor===this.source.length)return e}parseObject(){if(!this.consume(`{`))return;let e={};if(this.skipWhitespace(),this.consume(`}`))return e;for(;this.cursor<this.source.length;){let t=this.parseKey();if(!t||!this.consume(`:`))return;let n=this.parseValue();if(n===void 0)return;if(e[t]=n,this.skipWhitespace(),this.consume(`}`))return e;if(!this.consume(`,`))return}}parseArray(){if(!this.consume(`[`))return;let e=[];if(this.skipWhitespace(),this.consume(`]`))return e;for(;this.cursor<this.source.length;){let t=this.parseValue();if(t===void 0)return;if(e.push(t),this.skipWhitespace(),this.consume(`]`))return e;if(!this.consume(`,`))return}}parseValue(){return this.skipWhitespace(),this.source.startsWith(g,this.cursor)?this.parseString():this.source.startsWith(`{`,this.cursor)?this.parseObject():this.source.startsWith(`[`,this.cursor)?this.parseArray():this.consumeLiteral(`true`)?!0:this.consumeLiteral(`false`)?!1:this.consumeLiteral(`null`)?null:this.parseNumber()}parseKey(){if(this.skipWhitespace(),this.source.startsWith(g,this.cursor))return this.parseString();let e=/^[A-Za-z_][A-Za-z0-9_-]*/.exec(this.source.slice(this.cursor));if(e)return this.cursor+=e[0].length,this.skipWhitespace(),e[0]}parseString(){if(!this.consume(g))return;let e=this.source.indexOf(g,this.cursor);if(e===-1)return;let t=this.source.slice(this.cursor,e);return this.cursor=e+5,this.skipWhitespace(),t}parseNumber(){let e=/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/.exec(this.source.slice(this.cursor));if(e)return this.cursor+=e[0].length,this.skipWhitespace(),Number(e[0])}consume(e){return this.skipWhitespace(),this.source.startsWith(e,this.cursor)?(this.cursor+=e.length,this.skipWhitespace(),!0):!1}consumeLiteral(e){return this.source.startsWith(e,this.cursor)?(this.cursor+=e.length,this.skipWhitespace(),!0):!1}skipWhitespace(){for(;/\s/.test(this.source[this.cursor]??``);)this.cursor+=1}};function ne(e){return[`<`]}function re(e,t,n){return e.indexOf(`<`,t)}function v(e,t){return+!!e.endsWith(`<`)}function y(e,t){let n=e.indexOf(`>`,t+1);if(n===-1)return;let r=e.slice(t,n+1),i=r.match(/^<\s*([A-Za-z][\w:-]*)([\s/>][\s\S]*?|)>$/);if(!i)return;let a=i[1]??``;return{tagName:a,normalizedName:a.toLowerCase(),rawOpenTag:r,attributes:x(i[2]??``),openEnd:n+1,selfClosing:/\/\s*>$/.test(r)}}function ie(e,t,n){if(t.selfClosing)return{innerText:``,end:t.openEnd,complete:!0};let r=w(e,t.tagName,t.openEnd);if(r===-1)return{innerText:e.slice(t.openEnd),end:n.final?e.length:t.openEnd-t.rawOpenTag.length,complete:!1};let i=e.indexOf(`>`,r);return{innerText:e.slice(t.openEnd,r),end:i===-1?e.length:i+1,complete:!0}}function ae(e,t){if(t.selfClosing)return{rawText:t.rawOpenTag,end:t.openEnd};let n=w(e,t.tagName,t.openEnd);if(n===-1)return{rawText:t.rawOpenTag,end:t.openEnd};let r=e.indexOf(`>`,n),i=r===-1?e.length:r+1;return{rawText:e.slice(t.openEnd-t.rawOpenTag.length,i),end:i}}function b(e,t){let n=T(e);return t.find(e=>T(e)===n)}function x(e){let t={},n=/([A-Za-z_][\w:-]*)\s*=\s*(?:"([^"]*)"|'([^']*)')/g,r=n.exec(e);for(;r;){let i=r[1]??``;t[i]=S(C(r[2]??r[3]??``)),r=n.exec(e)}return t}function S(e){return e===`true`?!0:e===`false`?!1:e===`null`?null:/^-?(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e)?Number(e):e}function C(e){return e.replace(/&quot;/g,`"`).replace(/&apos;/g,`'`).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&amp;/g,`&`)}function w(e,t,n){return e.toLowerCase().indexOf(`</${t.toLowerCase()}>`,n)}function T(e){return e.replace(/[^a-z0-9]/gi,``).toLowerCase()}function E(e,t){let n=D(e,t);return n?[n]:[]}function D(e,t){let n=e.indexOf(`>`),r=e.lastIndexOf(`</`);if(n===-1||r===-1||r<=n)return;let i=oe(e.slice(n+1,r).trim());if(!O(i))return;let a=i.command,o=i.args;if(typeof a!=`string`||!O(o))return;let s=b(a,t);if(s)return{toolName:s,args:o}}function oe(e){try{return JSON.parse(e)}catch{return}}function O(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function k(e,t,n){let r=P(),i=ne(t.toolNames),a=0;for(;a<e.length;){let o=re(e,a,i);if(o===-1){A(r,e.slice(a),n,i);break}A(r,e.slice(a,o),n,i);let s=se(e,o,r,t,n);if(!s.completed)break;a=s.cursor}return{visibleText:r.visibleParts.join(``),toolCalls:r.toolCalls,rawToolCallTextParts:r.rawToolCallTextParts,removedToolCallText:r.removedToolCallText}}function se(e,t,n,r,i){let a=y(e,t);if(!a)return ce(e,t,n,i);let o=b(a.tagName,r.toolNames);return o?de(e,a,o,n,r):le(e,t,a,n,r,i)}function ce(e,t,n,r){return r.final?(n.visibleParts.push(e[t]??``),{cursor:t+1,completed:!0}):{cursor:t,completed:!1}}function le(e,t,n,r,i,a){let o=ie(e,n,a);if(!o.complete&&!a.final)return{cursor:t,completed:!1};let s=e.slice(t,o.end),c=r.rawToolCallTextParts.length;return r.removedToolCallText=!0,M(r,s,i),F(r,ue(o,r,i)),r.rawToolCallTextParts.length===c&&r.rawToolCallTextParts.push(s),{cursor:o.end,completed:!0}}function ue(e,t,n){return k(e.innerText,{...n,startCallIndex:I(t,n)},{final:!0})}function de(e,t,n,r,i){let a=ae(e,t);return j(r,n,t.attributes,a.rawText,i),{cursor:a.end,completed:!0}}function A(e,t,n,r){if(t.length===0)return;if(n.final){e.visibleParts.push(t);return}let i=v(t,r);e.visibleParts.push(t.slice(0,t.length-i))}function j(e,t,n,r,i){Object.keys(n).length!==0&&(e.toolCalls.push(N(t,n,i,e)),e.rawToolCallTextParts.push(r),e.removedToolCallText=!0)}function M(e,t,n){let r=E(t,n.toolNames);for(let i of r)e.toolCalls.push(N(i.toolName,i.args,n,e)),e.rawToolCallTextParts.push(t)}function N(e,t,n,r){return{id:`${n.callIdPrefix??`gemma_call`}_${I(r,n)}`,type:`function`,function:{name:e,arguments:JSON.stringify(t)}}}function P(){return{visibleParts:[],toolCalls:[],rawToolCallTextParts:[],removedToolCallText:!1}}function F(e,t){e.toolCalls.push(...t.toolCalls),e.rawToolCallTextParts.push(...t.rawToolCallTextParts),e.removedToolCallText=e.removedToolCallText||t.removedToolCallText}function I(e,t){return(t.startCallIndex??0)+e.toolCalls.length}const L=`<|tool_call>`,R=`gemma_call`;function z(e){if(!(!e||e.length===0))return new V({toolNames:e.map(e=>e.name)})}function B(e,t){return ge(e,H(e,t,{final:!0}))}var V=class{options;buffer=``;emittedVisibleText=``;emittedRawToolCallText=``;emittedToolCallIds=new Set;constructor(e){this.options=e}project(e){return e.length===0?_e():(this.buffer+=e,this.projectVisibleText({final:!1}))}flush(){return this.projectVisibleText({final:!0})}projectVisibleText(e){let t=H(this.buffer,this.options,e),n=t.visibleParts.join(``),r=n.slice(this.emittedVisibleText.length),i=t.rawToolCallTextParts.join(``),a=i.slice(this.emittedRawToolCallText.length);return this.emittedVisibleText=n,this.emittedRawToolCallText=i,{visibleText:r,toolCalls:t.toolCalls.filter(e=>this.emittedToolCallIds.has(e.id)?!1:(this.emittedToolCallIds.add(e.id),!0)),removedToolCallText:a.length>0,...a.length>0&&{rawToolCallText:a}}}};function H(e,t,n){let r=fe(e,t,n),i=k(r.visibleParts.join(``),{toolNames:t.toolNames,callIdPrefix:t.callIdPrefix??R,startCallIndex:r.toolCalls.length},n);return{visibleParts:[i.visibleText],toolCalls:[...r.toolCalls,...i.toolCalls],rawToolCallTextParts:[...r.rawToolCallTextParts,...i.rawToolCallTextParts],removedToolCallText:r.removedToolCallText||i.removedToolCallText}}function fe(e,t,n){let r=me(),i=new Set(t.toolNames),a=0,o=0;for(;a<e.length;){let s=e.indexOf(L,a);if(s===-1){U(r,e.slice(a),n);break}U(r,e.slice(a,s),n);let c=s+12,l=e.indexOf(`<tool_call|>`,c);if(l===-1){n.final&&r.visibleParts.push(e.slice(s));break}let u=e.slice(s,l+12),d=pe(e.slice(c,l),i,t,o);d?(r.toolCalls.push(d),r.rawToolCallTextParts.push(u),r.removedToolCallText=!0,o+=1):r.visibleParts.push(u),a=l+12}return r}function pe(e,t,n,r){let i=e.trim();if(!i.startsWith(`call:`))return;let a=i.slice(5).trimStart(),o=a.indexOf(`{`);if(o<=0)return;let s=a.slice(0,o).trim();if(!t.has(s))return;let c=new _(a.slice(o)).parse();if(c)return{id:`${n.callIdPrefix??R}_${r}`,type:`function`,function:{name:s,arguments:JSON.stringify(c)}}}function me(){return{visibleParts:[],toolCalls:[],rawToolCallTextParts:[],removedToolCallText:!1}}function U(e,t,n){if(t.length===0)return;if(n.final){e.visibleParts.push(t);return}let r=he(t);e.visibleParts.push(t.slice(0,t.length-r))}function he(e){let t=Math.min(e.length,11);for(let n=t;n>0;--n)if(L.startsWith(e.slice(e.length-n)))return n;return 0}function ge(e,t){return{rawText:e,visibleText:t.visibleParts.join(``),toolCalls:t.toolCalls,removedToolCallText:t.removedToolCallText,...t.rawToolCallTextParts.length>0&&{rawToolCallText:t.rawToolCallTextParts.join(``)}}}function _e(){return{visibleText:``,toolCalls:[],removedToolCallText:!1}}function ve(e,n,r){let i=e.choices?.[0]?.message.content||``,a=new t({logger:n,...r?.tools&&{toolCallTextProjector:z(r.tools)}}).parseResponse(e),o=f(a.content??``);return W({...a,content:o.visibleText},i,o.removedReasoning)}function W(e,t,n){return n?{...e,metadata:{...e.metadata??{},gemmaReasoningFiltered:!0,gemmaRawContent:t}}:e}function G(e,t){return{id:o(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:t===`stop`||t===`tool_calls`}}}function ye(e,t){return{id:o(),role:`assistant`,content:``,toolCalls:e,state:`complete`,timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:t===`stop`||t===`tool_calls`}}}function be(e,n){return{reasoningProjector:new p,responseParser:new t({logger:e}),...n&&{toolCallProjector:z(n)}}}function xe(e,t){let n=e.choices?.[0];if(!n)return[];let r=t.responseParser.parseStreamingChunk(e);return r&&l(r)&&r.toolCalls?.length?[r]:K(n.delta.content||``,n.finish_reason,t)}function Se(e){let t=K(``,null,e,!0),n=e.reasoningProjector.flush();return n.length>0&&t.push(G(n,null)),t}function K(e,t,n,r=!1){let i=r?n.toolCallProjector?.flush():n.toolCallProjector?.project(e),a=[];i?.toolCalls.length&&a.push(ye(i.toolCalls,t));let o=i?.visibleText??e,s=n.reasoningProjector.project(o);return s.length>0&&a.push(G(s,t)),a}var q=class extends s{name=`gemma`;version=`1.0.0`;client;options;onTextDelta;constructor(e){if(super(e.logger||c),this.options=e,e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client;else if(e.apiKey)this.client=new u({apiKey:e.apiKey,...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout}});else throw Error(`Either Gemma client, apiKey, or executor is required`)}async chat(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`Gemma Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Gemma client not available. Either provide a client/apiKey or use an executor.`);try{let n=this.buildRequestParams(e,t),r=t?.onTextDelta??this.onTextDelta;if(r)return await this.chatWithStreamingAssembly({...n,stream:!0},{...t,onTextDelta:r});t?.onProviderNativeRawPayload?.({provider:`gemma`,apiSurface:`chat-completions`,payloadKind:`request`,payload:n});let i=await this.client.chat.completions.create(n);return t?.onProviderNativeRawPayload?.({provider:`gemma`,apiSurface:`chat-completions`,payloadKind:`response`,payload:i}),ve(i,this.logger,t)}catch(e){let t=e.message||`Gemma API request failed`;throw Error(`Gemma chat failed: ${t}`)}}async*chatStream(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,t);return}catch(e){throw this.logger.error(`Gemma Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Gemma client not available. Either provide a client/apiKey or use an executor.`);try{let r=this.buildStreamingRequestParams(e,t);t?.onProviderNativeRawPayload?.({provider:`gemma`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=await this.client.chat.completions.create(r),a=be(this.logger,t?.tools),o=n(i,{provider:`gemma`,apiSurface:`chat-completions`,onProviderNativeRawPayload:t?.onProviderNativeRawPayload});for await(let e of this.streamWithAbort(o,t?.signal))for(let t of xe(e,a))yield t;for(let e of Se(a))yield e}catch(e){let t=e.message||`Gemma API request failed`;throw Error(`Gemma stream failed: ${t}`)}}supportsTools(){return!0}getCapabilities(){return{functionCalling:{supported:!0},nativeWebTools:{webSearch:{supported:!1,enabled:!1,source:`openai-compatible-chat-completions`,reason:`Gemma OpenAI-compatible endpoints support declared function tools, not provider-native web search.`},webFetch:{supported:!1,enabled:!1,source:`openai-compatible-chat-completions`,reason:`Gemma OpenAI-compatible endpoints support declared function tools, not provider-native web fetch.`}}}}validateConfig(){return!!this.client&&!!this.options}async dispose(){}validateMessages(e){super.validateMessages(e);for(let t of e)if(t.role===`assistant`){let e=t;if(e.toolCalls&&e.toolCalls.length>0&&e.content===``)continue}}buildRequestParams(t,n){let i=n?.model??this.options.defaultModel;if(!i)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);return{model:i,messages:e(t),...n?.temperature!==void 0&&{temperature:n.temperature},...n?.maxTokens!==void 0&&{max_tokens:n.maxTokens},...n?.tools&&{tools:r(n.tools),tool_choice:`auto`}}}buildStreamingRequestParams(e,t){return{...this.buildRequestParams(e,t),stream:!0}}async chatWithStreamingAssembly(e,t){if(!this.client)throw Error(`Gemma client not available. Either provide a client/apiKey or use an executor.`);try{t.onProviderNativeRawPayload?.({provider:`gemma`,apiSurface:`chat-completions`,payloadKind:`request`,payload:e});let r=await this.client.chat.completions.create(e,t.signal?{signal:t.signal}:void 0),a=new p;return W(await i({stream:n(r,{provider:`gemma`,apiSurface:`chat-completions`,onProviderNativeRawPayload:t.onProviderNativeRawPayload}),onTextDelta:t.onTextDelta,signal:t.signal,textProjector:e=>a.project(e),textProjectorFlush:()=>a.flush(),toolCallTextProjector:z(t.tools)}),a.rawText,a.removedReasoning)}catch(e){let t=e.message||`Gemma streaming request failed`;throw Error(`Gemma stream failed: ${t}`)}}};const J=`supergemma4-26b-uncensored-v2`,Y=`lm-studio`,X=`http://localhost:1234/v1`,Z=`https://ai.google.dev/gemma`,Q=`2026-05-04`,$=`https://lmstudio.ai/docs/developer`,Ce=[{kind:`official`,label:`LM Studio local API documentation`,url:$,sourceUrl:$,lastVerifiedAt:`2026-05-08`}],we={status:`fallback`,sourceUrl:Z,lastVerifiedAt:Q,entries:[{id:J,displayName:`SuperGemma 4 26B`,capabilities:[`tools`,`streaming`],lifecycle:`active`,sourceUrl:Z,lastVerifiedAt:Q}]};function Te(){return{type:`gemma`,displayName:`Gemma`,description:`Gemma-family local models through an OpenAI-compatible endpoint`,defaults:{model:J,apiKey:Y,baseURL:X},modelCatalog:we,setupHelpLinks:Ce,setupSteps:[{key:`baseURL`,title:`Gemma OpenAI-compatible base URL`,defaultValue:X},{key:`model`,title:`Gemma model`,defaultValue:J},{key:`apiKey`,title:`Gemma OpenAI-compatible API key`,defaultValue:Y,masked:!0}],requiresApiKey:!0,probeProfile:a,createProvider:e=>new q({apiKey:Ee(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout},defaultModel:e.model})}}function Ee(e){if(!e)throw Error(`Provider gemma requires apiKey`);return e}export{q as a,B as c,Te as i,p as l,X as n,V as o,J as r,z as s,Y as t,f as u};
2
+ //# sourceMappingURL=gemma-Dp_AfCUR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemma-Dp_AfCUR.js","names":["projectText","appendVisibleTail","longestStartMarkerPrefixSuffixLength","DEFAULT_CALL_ID_PREFIX","createProjectionState","appendVisibleTail","gemmaError"],"sources":["../../src/gemma/reasoning-projector.ts","../../src/gemma/tool-call-argument-parser.ts","../../src/gemma/pseudo-tool-call-tag-parser.ts","../../src/gemma/pseudo-command-envelope.ts","../../src/gemma/pseudo-tool-call-projector.ts","../../src/gemma/tool-call-projector.ts","../../src/gemma/provider-projection.ts","../../src/gemma/message-factory.ts","../../src/gemma/streaming-projection.ts","../../src/gemma/provider.ts","../../src/gemma/provider-definition.ts"],"sourcesContent":["const START_MARKER = '<|channel>';\nconst END_MARKER = '<channel|>';\nconst THOUGHT_LABEL = 'thought';\n\nexport interface IGemmaReasoningProjection {\n rawText: string;\n visibleText: string;\n removedReasoning: boolean;\n}\n\ninterface IProjectionOptions {\n final: boolean;\n}\n\ninterface IProjectionState {\n visibleParts: string[];\n removedReasoning: boolean;\n}\n\nexport function projectGemmaReasoningText(rawText: string): IGemmaReasoningProjection {\n const result = projectText(rawText, { final: true });\n return {\n rawText,\n visibleText: result.visibleParts.join(''),\n removedReasoning: result.removedReasoning,\n };\n}\n\nexport class GemmaReasoningProjector {\n private buffer = '';\n private emittedVisibleText = '';\n private hasRemovedReasoning = false;\n\n get rawText(): string {\n return this.buffer;\n }\n\n get removedReasoning(): boolean {\n return this.hasRemovedReasoning;\n }\n\n project(delta: string): string {\n if (delta.length === 0) {\n return '';\n }\n\n this.buffer += delta;\n return this.projectVisibleText({ final: false });\n }\n\n flush(): string {\n return this.projectVisibleText({ final: true });\n }\n\n private projectVisibleText(options: IProjectionOptions): string {\n const result = projectText(this.buffer, options);\n this.hasRemovedReasoning = this.hasRemovedReasoning || result.removedReasoning;\n\n const nextVisibleText = result.visibleParts.join('');\n const delta = nextVisibleText.slice(this.emittedVisibleText.length);\n this.emittedVisibleText = nextVisibleText;\n return delta;\n }\n}\n\nfunction projectText(rawText: string, options: IProjectionOptions): IProjectionState {\n const state: IProjectionState = {\n visibleParts: [],\n removedReasoning: false,\n };\n\n let cursor = 0;\n while (cursor < rawText.length) {\n const nextMarker = rawText.indexOf(START_MARKER, cursor);\n if (nextMarker === -1) {\n appendVisibleTail(state, rawText.slice(cursor), options);\n break;\n }\n\n appendVisibleTail(state, rawText.slice(cursor, nextMarker), options);\n const afterStart = nextMarker + START_MARKER.length;\n const markerEnd = rawText.indexOf(END_MARKER, afterStart);\n\n if (markerEnd === -1) {\n if (options.final) {\n state.removedReasoning = true;\n }\n break;\n }\n\n state.removedReasoning = true;\n cursor = consumeChannelBlock(rawText, afterStart, markerEnd);\n }\n\n return state;\n}\n\nfunction appendVisibleTail(\n state: IProjectionState,\n tail: string,\n options: IProjectionOptions,\n): void {\n if (tail.length === 0) {\n return;\n }\n\n if (options.final) {\n state.visibleParts.push(tail);\n return;\n }\n\n const heldLength = longestStartMarkerPrefixSuffixLength(tail);\n state.visibleParts.push(tail.slice(0, tail.length - heldLength));\n}\n\nfunction consumeChannelBlock(rawText: string, afterStart: number, markerEnd: number): number {\n const channelText = rawText.slice(afterStart, markerEnd);\n let cursor = markerEnd + END_MARKER.length;\n\n if (channelText.trim().length === 0) {\n const followingThoughtLabel = rawText.slice(cursor).match(/^thought(?:\\r?\\n)*/);\n if (followingThoughtLabel) {\n cursor += followingThoughtLabel[0].length;\n }\n return cursor;\n }\n\n const channelLabel = channelText.split(/\\r?\\n/, 1)[0]?.trim();\n if (channelLabel === THOUGHT_LABEL) {\n return cursor;\n }\n\n return cursor;\n}\n\nfunction longestStartMarkerPrefixSuffixLength(text: string): number {\n const maxLength = Math.min(text.length, START_MARKER.length - 1);\n for (let length = maxLength; length > 0; length -= 1) {\n if (START_MARKER.startsWith(text.slice(text.length - length))) {\n return length;\n }\n }\n return 0;\n}\n","const STRING_DELIMITER = '<|\"|>';\n\nexport interface IGemmaArgumentObject {\n [key: string]: TGemmaArgumentValue;\n}\n\nexport type TGemmaArgumentValue =\n | string\n | number\n | boolean\n | null\n | IGemmaArgumentObject\n | TGemmaArgumentValue[];\n\nexport class GemmaArgumentParser {\n private cursor = 0;\n\n constructor(private readonly source: string) {}\n\n parse(): IGemmaArgumentObject | undefined {\n const value = this.parseObject();\n this.skipWhitespace();\n if (this.cursor !== this.source.length) {\n return undefined;\n }\n return value;\n }\n\n private parseObject(): IGemmaArgumentObject | undefined {\n if (!this.consume('{')) return undefined;\n const result: IGemmaArgumentObject = {};\n this.skipWhitespace();\n if (this.consume('}')) return result;\n\n while (this.cursor < this.source.length) {\n const key = this.parseKey();\n if (!key || !this.consume(':')) return undefined;\n const value = this.parseValue();\n if (value === undefined) return undefined;\n result[key] = value;\n this.skipWhitespace();\n if (this.consume('}')) return result;\n if (!this.consume(',')) return undefined;\n }\n return undefined;\n }\n\n private parseArray(): TGemmaArgumentValue[] | undefined {\n if (!this.consume('[')) return undefined;\n const result: TGemmaArgumentValue[] = [];\n this.skipWhitespace();\n if (this.consume(']')) return result;\n\n while (this.cursor < this.source.length) {\n const value = this.parseValue();\n if (value === undefined) return undefined;\n result.push(value);\n this.skipWhitespace();\n if (this.consume(']')) return result;\n if (!this.consume(',')) return undefined;\n }\n return undefined;\n }\n\n private parseValue(): TGemmaArgumentValue | undefined {\n this.skipWhitespace();\n if (this.source.startsWith(STRING_DELIMITER, this.cursor)) return this.parseString();\n if (this.source.startsWith('{', this.cursor)) return this.parseObject();\n if (this.source.startsWith('[', this.cursor)) return this.parseArray();\n if (this.consumeLiteral('true')) return true;\n if (this.consumeLiteral('false')) return false;\n if (this.consumeLiteral('null')) return null;\n return this.parseNumber();\n }\n\n private parseKey(): string | undefined {\n this.skipWhitespace();\n if (this.source.startsWith(STRING_DELIMITER, this.cursor)) return this.parseString();\n const match = /^[A-Za-z_][A-Za-z0-9_-]*/.exec(this.source.slice(this.cursor));\n if (!match) return undefined;\n this.cursor += match[0].length;\n this.skipWhitespace();\n return match[0];\n }\n\n private parseString(): string | undefined {\n if (!this.consume(STRING_DELIMITER)) return undefined;\n const end = this.source.indexOf(STRING_DELIMITER, this.cursor);\n if (end === -1) return undefined;\n const value = this.source.slice(this.cursor, end);\n this.cursor = end + STRING_DELIMITER.length;\n this.skipWhitespace();\n return value;\n }\n\n private parseNumber(): number | undefined {\n const match = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/.exec(\n this.source.slice(this.cursor),\n );\n if (!match) return undefined;\n this.cursor += match[0].length;\n this.skipWhitespace();\n return Number(match[0]);\n }\n\n private consume(expected: string): boolean {\n this.skipWhitespace();\n if (!this.source.startsWith(expected, this.cursor)) return false;\n this.cursor += expected.length;\n this.skipWhitespace();\n return true;\n }\n\n private consumeLiteral(expected: string): boolean {\n if (!this.source.startsWith(expected, this.cursor)) return false;\n this.cursor += expected.length;\n this.skipWhitespace();\n return true;\n }\n\n private skipWhitespace(): void {\n while (/\\s/.test(this.source[this.cursor] ?? '')) {\n this.cursor += 1;\n }\n }\n}\n","import type {\n IGemmaConsumedPseudoBlock,\n IGemmaConsumedPseudoToolTag,\n IGemmaParsedPseudoTag,\n IGemmaPseudoProjectionOptions,\n TGemmaJsonValue,\n} from './pseudo-tool-call-types';\n\nconst XML_START_MARKER = '<';\n\nexport function createGemmaPseudoStartMarkers(toolNames: readonly string[]): string[] {\n void toolNames;\n return [XML_START_MARKER];\n}\n\nexport function findNextGemmaPseudoStartMarker(\n text: string,\n cursor: number,\n markers: readonly string[],\n): number {\n void markers;\n return text.indexOf(XML_START_MARKER, cursor);\n}\n\nexport function longestGemmaPseudoStartPrefixSuffixLength(\n text: string,\n markers: readonly string[],\n): number {\n void markers;\n return text.endsWith(XML_START_MARKER) ? XML_START_MARKER.length : 0;\n}\n\nexport function parseGemmaPseudoTag(\n text: string,\n start: number,\n): IGemmaParsedPseudoTag | undefined {\n const tagEnd = text.indexOf('>', start + 1);\n if (tagEnd === -1) {\n return undefined;\n }\n\n const rawOpenTag = text.slice(start, tagEnd + 1);\n const tagMatch = rawOpenTag.match(/^<\\s*([A-Za-z][\\w:-]*)([\\s/>][\\s\\S]*?|)>$/);\n if (!tagMatch) {\n return undefined;\n }\n\n const tagName = tagMatch[1] ?? '';\n return {\n tagName,\n normalizedName: tagName.toLowerCase(),\n rawOpenTag,\n attributes: parseAttributes(tagMatch[2] ?? ''),\n openEnd: tagEnd + 1,\n selfClosing: /\\/\\s*>$/.test(rawOpenTag),\n };\n}\n\nexport function consumeGemmaPseudoControlBlock(\n text: string,\n tag: IGemmaParsedPseudoTag,\n options: IGemmaPseudoProjectionOptions,\n): IGemmaConsumedPseudoBlock {\n if (tag.selfClosing) {\n return {\n innerText: '',\n end: tag.openEnd,\n complete: true,\n };\n }\n\n const closeStart = indexOfClosingTag(text, tag.tagName, tag.openEnd);\n if (closeStart === -1) {\n return {\n innerText: text.slice(tag.openEnd),\n end: options.final ? text.length : tag.openEnd - tag.rawOpenTag.length,\n complete: false,\n };\n }\n\n const closingTagEnd = text.indexOf('>', closeStart);\n return {\n innerText: text.slice(tag.openEnd, closeStart),\n end: closingTagEnd === -1 ? text.length : closingTagEnd + 1,\n complete: true,\n };\n}\n\nexport function consumeGemmaPseudoToolTag(\n text: string,\n tag: IGemmaParsedPseudoTag,\n): IGemmaConsumedPseudoToolTag {\n if (tag.selfClosing) {\n return { rawText: tag.rawOpenTag, end: tag.openEnd };\n }\n\n const closeStart = indexOfClosingTag(text, tag.tagName, tag.openEnd);\n if (closeStart === -1) {\n return { rawText: tag.rawOpenTag, end: tag.openEnd };\n }\n\n const closingTagEnd = text.indexOf('>', closeStart);\n const end = closingTagEnd === -1 ? text.length : closingTagEnd + 1;\n return { rawText: text.slice(tag.openEnd - tag.rawOpenTag.length, end), end };\n}\n\nexport function findGemmaDeclaredToolName(\n tagName: string,\n toolNames: readonly string[],\n): string | undefined {\n const normalizedTagName = normalizeToolName(tagName);\n return toolNames.find((toolName) => normalizeToolName(toolName) === normalizedTagName);\n}\n\nfunction parseAttributes(attributeText: string): Record<string, TGemmaJsonValue> {\n const attributes: Record<string, TGemmaJsonValue> = {};\n const pattern = /([A-Za-z_][\\w:-]*)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g;\n let match = pattern.exec(attributeText);\n while (match) {\n const key = match[1] ?? '';\n const rawValue = match[2] ?? match[3] ?? '';\n attributes[key] = parseAttributeValue(decodeXmlEntities(rawValue));\n match = pattern.exec(attributeText);\n }\n return attributes;\n}\n\nfunction parseAttributeValue(value: string): TGemmaJsonValue {\n if (value === 'true') return true;\n if (value === 'false') return false;\n if (value === 'null') return null;\n if (/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?$/.test(value)) {\n return Number(value);\n }\n return value;\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&');\n}\n\nfunction indexOfClosingTag(text: string, tagName: string, cursor: number): number {\n return text.toLowerCase().indexOf(`</${tagName.toLowerCase()}>`, cursor);\n}\n\nfunction normalizeToolName(value: string): string {\n return value.replace(/[^a-z0-9]/gi, '').toLowerCase();\n}\n","import { findGemmaDeclaredToolName } from './pseudo-tool-call-tag-parser';\nimport type { TGemmaJsonValue } from './pseudo-tool-call-types';\n\nexport interface IGemmaPseudoCommandEnvelope {\n toolName: string;\n args: Record<string, TGemmaJsonValue>;\n}\n\nexport function parseGemmaPseudoCommandEnvelopes(\n rawText: string,\n toolNames: readonly string[],\n): IGemmaPseudoCommandEnvelope[] {\n const jsonEnvelope = parseGemmaPseudoCommandEnvelope(rawText, toolNames);\n return jsonEnvelope ? [jsonEnvelope] : [];\n}\n\nexport function parseGemmaPseudoCommandEnvelope(\n rawText: string,\n toolNames: readonly string[],\n): IGemmaPseudoCommandEnvelope | undefined {\n const openEnd = rawText.indexOf('>');\n const closeStart = rawText.lastIndexOf('</');\n if (openEnd === -1 || closeStart === -1 || closeStart <= openEnd) {\n return undefined;\n }\n\n const parsed = parseJsonValue(rawText.slice(openEnd + 1, closeStart).trim());\n if (!isJsonRecord(parsed)) {\n return undefined;\n }\n\n const command = parsed['command'];\n const args = parsed['args'];\n if (typeof command !== 'string' || !isJsonRecord(args)) {\n return undefined;\n }\n\n const toolName = findGemmaDeclaredToolName(command, toolNames);\n if (!toolName) {\n return undefined;\n }\n\n return { toolName, args };\n}\n\nfunction parseJsonValue(text: string): TGemmaJsonValue | undefined {\n try {\n return JSON.parse(text) as TGemmaJsonValue;\n } catch {\n return undefined;\n }\n}\n\nfunction isJsonRecord(\n value: TGemmaJsonValue | undefined,\n): value is Record<string, TGemmaJsonValue> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import type { IToolCall } from '@robota-sdk/agent-core';\nimport { parseGemmaPseudoCommandEnvelopes } from './pseudo-command-envelope';\nimport {\n consumeGemmaPseudoControlBlock,\n consumeGemmaPseudoToolTag,\n createGemmaPseudoStartMarkers,\n findGemmaDeclaredToolName,\n findNextGemmaPseudoStartMarker,\n longestGemmaPseudoStartPrefixSuffixLength,\n parseGemmaPseudoTag,\n} from './pseudo-tool-call-tag-parser';\nimport type {\n IGemmaConsumedPseudoBlock,\n IGemmaParsedPseudoTag,\n IGemmaPseudoProjectionOptions,\n TGemmaJsonValue,\n} from './pseudo-tool-call-types';\n\nconst DEFAULT_CALL_ID_PREFIX = 'gemma_call';\n\nexport interface IGemmaPseudoToolCallProjection {\n visibleText: string;\n toolCalls: IToolCall[];\n removedToolCallText: boolean;\n rawToolCallTextParts: string[];\n}\n\nexport interface IGemmaPseudoToolCallProjectorOptions {\n toolNames: readonly string[];\n callIdPrefix?: string;\n startCallIndex?: number;\n}\n\ninterface IProjectionState {\n visibleParts: string[];\n toolCalls: IToolCall[];\n rawToolCallTextParts: string[];\n removedToolCallText: boolean;\n}\n\ninterface IProjectTagResult {\n cursor: number;\n completed: boolean;\n}\n\nexport function projectGemmaPseudoToolCallText(\n rawText: string,\n options: IGemmaPseudoToolCallProjectorOptions,\n projectionOptions: IGemmaPseudoProjectionOptions,\n): IGemmaPseudoToolCallProjection {\n const state = createProjectionState();\n const markers = createGemmaPseudoStartMarkers(options.toolNames);\n let cursor = 0;\n\n while (cursor < rawText.length) {\n const nextMarker = findNextGemmaPseudoStartMarker(rawText, cursor, markers);\n if (nextMarker === -1) {\n appendVisibleTail(state, rawText.slice(cursor), projectionOptions, markers);\n break;\n }\n\n appendVisibleTail(state, rawText.slice(cursor, nextMarker), projectionOptions, markers);\n const result = projectTagAt(rawText, nextMarker, state, options, projectionOptions);\n if (!result.completed) {\n break;\n }\n cursor = result.cursor;\n }\n\n return {\n visibleText: state.visibleParts.join(''),\n toolCalls: state.toolCalls,\n rawToolCallTextParts: state.rawToolCallTextParts,\n removedToolCallText: state.removedToolCallText,\n };\n}\n\nfunction projectTagAt(\n rawText: string,\n tagStart: number,\n state: IProjectionState,\n options: IGemmaPseudoToolCallProjectorOptions,\n projectionOptions: IGemmaPseudoProjectionOptions,\n): IProjectTagResult {\n const tag = parseGemmaPseudoTag(rawText, tagStart);\n if (!tag) {\n return projectMalformedTag(rawText, tagStart, state, projectionOptions);\n }\n const toolName = findGemmaDeclaredToolName(tag.tagName, options.toolNames);\n if (toolName) {\n return projectToolTag(rawText, tag, toolName, state, options);\n }\n return projectXmlArtifact(rawText, tagStart, tag, state, options, projectionOptions);\n}\n\nfunction projectMalformedTag(\n rawText: string,\n tagStart: number,\n state: IProjectionState,\n projectionOptions: IGemmaPseudoProjectionOptions,\n): IProjectTagResult {\n if (!projectionOptions.final) {\n return { cursor: tagStart, completed: false };\n }\n state.visibleParts.push(rawText[tagStart] ?? '');\n return { cursor: tagStart + 1, completed: true };\n}\n\nfunction projectXmlArtifact(\n rawText: string,\n tagStart: number,\n tag: IGemmaParsedPseudoTag,\n state: IProjectionState,\n options: IGemmaPseudoToolCallProjectorOptions,\n projectionOptions: IGemmaPseudoProjectionOptions,\n): IProjectTagResult {\n const block = consumeGemmaPseudoControlBlock(rawText, tag, projectionOptions);\n if (!block.complete && !projectionOptions.final) {\n return { cursor: tagStart, completed: false };\n }\n\n const rawControlText = rawText.slice(tagStart, block.end);\n const rawPartCount = state.rawToolCallTextParts.length;\n state.removedToolCallText = true;\n appendCommandEnvelopeToolCall(state, rawControlText, options);\n mergeProjection(state, projectControlBlockInner(block, state, options));\n if (state.rawToolCallTextParts.length === rawPartCount) {\n state.rawToolCallTextParts.push(rawControlText);\n }\n return { cursor: block.end, completed: true };\n}\n\nfunction projectControlBlockInner(\n block: IGemmaConsumedPseudoBlock,\n state: IProjectionState,\n options: IGemmaPseudoToolCallProjectorOptions,\n): IGemmaPseudoToolCallProjection {\n return projectGemmaPseudoToolCallText(\n block.innerText,\n {\n ...options,\n startCallIndex: getNextCallIndex(state, options),\n },\n { final: true },\n );\n}\n\nfunction projectToolTag(\n rawText: string,\n tag: IGemmaParsedPseudoTag,\n toolName: string,\n state: IProjectionState,\n options: IGemmaPseudoToolCallProjectorOptions,\n): IProjectTagResult {\n const rawToolTag = consumeGemmaPseudoToolTag(rawText, tag);\n appendToolCall(state, toolName, tag.attributes, rawToolTag.rawText, options);\n return { cursor: rawToolTag.end, completed: true };\n}\n\nfunction appendVisibleTail(\n state: IProjectionState,\n tail: string,\n options: IGemmaPseudoProjectionOptions,\n markers: readonly string[],\n): void {\n if (tail.length === 0) {\n return;\n }\n if (options.final) {\n state.visibleParts.push(tail);\n return;\n }\n const heldLength = longestGemmaPseudoStartPrefixSuffixLength(tail, markers);\n state.visibleParts.push(tail.slice(0, tail.length - heldLength));\n}\n\nfunction appendToolCall(\n state: IProjectionState,\n toolName: string,\n args: Record<string, TGemmaJsonValue>,\n rawText: string,\n options: IGemmaPseudoToolCallProjectorOptions,\n): void {\n if (Object.keys(args).length === 0) {\n return;\n }\n state.toolCalls.push(createToolCall(toolName, args, options, state));\n state.rawToolCallTextParts.push(rawText);\n state.removedToolCallText = true;\n}\n\nfunction appendCommandEnvelopeToolCall(\n state: IProjectionState,\n rawText: string,\n options: IGemmaPseudoToolCallProjectorOptions,\n): void {\n const commands = parseGemmaPseudoCommandEnvelopes(rawText, options.toolNames);\n for (const command of commands) {\n state.toolCalls.push(createToolCall(command.toolName, command.args, options, state));\n state.rawToolCallTextParts.push(rawText);\n }\n}\n\nfunction createToolCall(\n toolName: string,\n args: Record<string, TGemmaJsonValue>,\n options: IGemmaPseudoToolCallProjectorOptions,\n state: IProjectionState,\n): IToolCall {\n return {\n id: `${options.callIdPrefix ?? DEFAULT_CALL_ID_PREFIX}_${getNextCallIndex(state, options)}`,\n type: 'function',\n function: {\n name: toolName,\n arguments: JSON.stringify(args),\n },\n };\n}\n\nfunction createProjectionState(): IProjectionState {\n return {\n visibleParts: [],\n toolCalls: [],\n rawToolCallTextParts: [],\n removedToolCallText: false,\n };\n}\n\nfunction mergeProjection(\n state: IProjectionState,\n projection: IGemmaPseudoToolCallProjection,\n): void {\n state.toolCalls.push(...projection.toolCalls);\n state.rawToolCallTextParts.push(...projection.rawToolCallTextParts);\n state.removedToolCallText = state.removedToolCallText || projection.removedToolCallText;\n}\n\nfunction getNextCallIndex(\n state: IProjectionState,\n options: IGemmaPseudoToolCallProjectorOptions,\n): number {\n return (options.startCallIndex ?? 0) + state.toolCalls.length;\n}\n","import type { IToolCall, IToolSchema } from '@robota-sdk/agent-core';\nimport type {\n IOpenAICompatibleToolCallTextProjection,\n IOpenAICompatibleToolCallTextProjector,\n} from '../shared/openai-compatible/index.js';\nimport { GemmaArgumentParser } from './tool-call-argument-parser';\nimport { projectGemmaPseudoToolCallText } from './pseudo-tool-call-projector';\n\nconst TOOL_CALL_START = '<|tool_call>';\nconst TOOL_CALL_END = '<tool_call|>';\nconst CALL_PREFIX = 'call:';\nconst DEFAULT_CALL_ID_PREFIX = 'gemma_call';\n\nexport interface IGemmaToolCallProjectorOptions {\n toolNames: readonly string[];\n callIdPrefix?: string;\n}\n\nexport interface IGemmaToolCallProjection extends IOpenAICompatibleToolCallTextProjection {\n rawText: string;\n}\n\ninterface IProjectionOptions {\n final: boolean;\n}\n\ninterface IProjectionState {\n visibleParts: string[];\n toolCalls: IToolCall[];\n rawToolCallTextParts: string[];\n removedToolCallText: boolean;\n}\n\nexport function createGemmaToolCallProjector(\n tools: readonly IToolSchema[] | undefined,\n): GemmaToolCallProjector | undefined {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n return new GemmaToolCallProjector({ toolNames: tools.map((tool) => tool.name) });\n}\n\nexport function projectGemmaToolCallText(\n rawText: string,\n options: IGemmaToolCallProjectorOptions,\n): IGemmaToolCallProjection {\n const result = projectText(rawText, options, { final: true });\n return toPublicProjection(rawText, result);\n}\n\nexport class GemmaToolCallProjector implements IOpenAICompatibleToolCallTextProjector {\n private buffer = '';\n private emittedVisibleText = '';\n private emittedRawToolCallText = '';\n private readonly emittedToolCallIds = new Set<string>();\n\n constructor(private readonly options: IGemmaToolCallProjectorOptions) {}\n\n project(delta: string): IOpenAICompatibleToolCallTextProjection {\n if (delta.length === 0) {\n return emptyProjection();\n }\n\n this.buffer += delta;\n return this.projectVisibleText({ final: false });\n }\n\n flush(): IOpenAICompatibleToolCallTextProjection {\n return this.projectVisibleText({ final: true });\n }\n\n private projectVisibleText(options: IProjectionOptions): IOpenAICompatibleToolCallTextProjection {\n const result = projectText(this.buffer, this.options, options);\n const nextVisibleText = result.visibleParts.join('');\n const visibleText = nextVisibleText.slice(this.emittedVisibleText.length);\n const nextRawToolCallText = result.rawToolCallTextParts.join('');\n const rawToolCallText = nextRawToolCallText.slice(this.emittedRawToolCallText.length);\n this.emittedVisibleText = nextVisibleText;\n this.emittedRawToolCallText = nextRawToolCallText;\n\n const toolCalls = result.toolCalls.filter((toolCall) => {\n if (this.emittedToolCallIds.has(toolCall.id)) {\n return false;\n }\n this.emittedToolCallIds.add(toolCall.id);\n return true;\n });\n\n return {\n visibleText,\n toolCalls,\n removedToolCallText: rawToolCallText.length > 0,\n ...(rawToolCallText.length > 0 && {\n rawToolCallText,\n }),\n };\n }\n}\n\nfunction projectText(\n rawText: string,\n options: IGemmaToolCallProjectorOptions,\n projectionOptions: IProjectionOptions,\n): IProjectionState {\n const nativeProjection = projectNativeToolCallText(rawText, options, projectionOptions);\n const pseudoProjection = projectGemmaPseudoToolCallText(\n nativeProjection.visibleParts.join(''),\n {\n toolNames: options.toolNames,\n callIdPrefix: options.callIdPrefix ?? DEFAULT_CALL_ID_PREFIX,\n startCallIndex: nativeProjection.toolCalls.length,\n },\n projectionOptions,\n );\n\n return {\n visibleParts: [pseudoProjection.visibleText],\n toolCalls: [...nativeProjection.toolCalls, ...pseudoProjection.toolCalls],\n rawToolCallTextParts: [\n ...nativeProjection.rawToolCallTextParts,\n ...pseudoProjection.rawToolCallTextParts,\n ],\n removedToolCallText:\n nativeProjection.removedToolCallText || pseudoProjection.removedToolCallText,\n };\n}\n\nfunction projectNativeToolCallText(\n rawText: string,\n options: IGemmaToolCallProjectorOptions,\n projectionOptions: IProjectionOptions,\n): IProjectionState {\n const state = createProjectionState();\n const toolNames = new Set(options.toolNames);\n let cursor = 0;\n let projectedCallIndex = 0;\n\n while (cursor < rawText.length) {\n const nextMarker = rawText.indexOf(TOOL_CALL_START, cursor);\n if (nextMarker === -1) {\n appendVisibleTail(state, rawText.slice(cursor), projectionOptions);\n break;\n }\n\n appendVisibleTail(state, rawText.slice(cursor, nextMarker), projectionOptions);\n const afterStart = nextMarker + TOOL_CALL_START.length;\n const markerEnd = rawText.indexOf(TOOL_CALL_END, afterStart);\n if (markerEnd === -1) {\n if (projectionOptions.final) {\n state.visibleParts.push(rawText.slice(nextMarker));\n }\n break;\n }\n\n const rawBlock = rawText.slice(nextMarker, markerEnd + TOOL_CALL_END.length);\n const blockText = rawText.slice(afterStart, markerEnd);\n const toolCall = parseToolCallBlock(blockText, toolNames, options, projectedCallIndex);\n if (!toolCall) {\n state.visibleParts.push(rawBlock);\n } else {\n state.toolCalls.push(toolCall);\n state.rawToolCallTextParts.push(rawBlock);\n state.removedToolCallText = true;\n projectedCallIndex += 1;\n }\n cursor = markerEnd + TOOL_CALL_END.length;\n }\n\n return state;\n}\n\nfunction parseToolCallBlock(\n blockText: string,\n toolNames: ReadonlySet<string>,\n options: IGemmaToolCallProjectorOptions,\n projectedCallIndex: number,\n): IToolCall | undefined {\n const trimmed = blockText.trim();\n if (!trimmed.startsWith(CALL_PREFIX)) {\n return undefined;\n }\n\n const callText = trimmed.slice(CALL_PREFIX.length).trimStart();\n const argsStart = callText.indexOf('{');\n if (argsStart <= 0) {\n return undefined;\n }\n\n const toolName = callText.slice(0, argsStart).trim();\n if (!toolNames.has(toolName)) {\n return undefined;\n }\n\n const args = new GemmaArgumentParser(callText.slice(argsStart)).parse();\n if (!args) {\n return undefined;\n }\n\n return {\n id: `${options.callIdPrefix ?? DEFAULT_CALL_ID_PREFIX}_${projectedCallIndex}`,\n type: 'function',\n function: {\n name: toolName,\n arguments: JSON.stringify(args),\n },\n };\n}\n\nfunction createProjectionState(): IProjectionState {\n return {\n visibleParts: [],\n toolCalls: [],\n rawToolCallTextParts: [],\n removedToolCallText: false,\n };\n}\n\nfunction appendVisibleTail(\n state: IProjectionState,\n tail: string,\n options: IProjectionOptions,\n): void {\n if (tail.length === 0) {\n return;\n }\n\n if (options.final) {\n state.visibleParts.push(tail);\n return;\n }\n\n const heldLength = longestStartMarkerPrefixSuffixLength(tail);\n state.visibleParts.push(tail.slice(0, tail.length - heldLength));\n}\n\nfunction longestStartMarkerPrefixSuffixLength(text: string): number {\n const maxLength = Math.min(text.length, TOOL_CALL_START.length - 1);\n for (let length = maxLength; length > 0; length -= 1) {\n if (TOOL_CALL_START.startsWith(text.slice(text.length - length))) {\n return length;\n }\n }\n return 0;\n}\n\nfunction toPublicProjection(rawText: string, state: IProjectionState): IGemmaToolCallProjection {\n return {\n rawText,\n visibleText: state.visibleParts.join(''),\n toolCalls: state.toolCalls,\n removedToolCallText: state.removedToolCallText,\n ...(state.rawToolCallTextParts.length > 0 && {\n rawToolCallText: state.rawToolCallTextParts.join(''),\n }),\n };\n}\n\nfunction emptyProjection(): IOpenAICompatibleToolCallTextProjection {\n return {\n visibleText: '',\n toolCalls: [],\n removedToolCallText: false,\n };\n}\n","import type OpenAI from 'openai';\nimport type { IChatOptions, ILogger, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { OpenAICompatibleResponseParser } from '../shared/openai-compatible/index.js';\nimport { projectGemmaReasoningText } from './reasoning-projector';\nimport { createGemmaToolCallProjector } from './tool-call-projector';\n\nexport function parseGemmaChatCompletion(\n response: OpenAI.Chat.ChatCompletion,\n logger: ILogger,\n options: IChatOptions | undefined,\n): TUniversalMessage {\n const rawContent = response.choices?.[0]?.message.content || '';\n const parser = new OpenAICompatibleResponseParser({\n logger,\n ...(options?.tools && {\n toolCallTextProjector: createGemmaToolCallProjector(options.tools),\n }),\n });\n const parsed = parser.parseResponse(response);\n const projection = projectGemmaReasoningText(parsed.content ?? '');\n\n return withGemmaProjectionMetadata(\n {\n ...parsed,\n content: projection.visibleText,\n },\n rawContent,\n projection.removedReasoning,\n );\n}\n\nexport function withGemmaProjectionMetadata(\n message: TUniversalMessage,\n rawContent: string,\n removedReasoning: boolean,\n): TUniversalMessage {\n if (!removedReasoning) {\n return message;\n }\n\n return {\n ...message,\n metadata: {\n ...(message.metadata ?? {}),\n gemmaReasoningFiltered: true,\n gemmaRawContent: rawContent,\n },\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport type OpenAI from 'openai';\nimport type { IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';\n\nexport function createStreamTextMessage(\n content: string,\n finishReason: OpenAI.Chat.ChatCompletionChunk.Choice['finish_reason'],\n): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content,\n state: 'complete',\n timestamp: new Date(),\n metadata: {\n isStreamChunk: true,\n isComplete: finishReason === 'stop' || finishReason === 'tool_calls',\n },\n };\n}\n\nexport function createStreamToolCallMessage(\n toolCalls: IToolCall[],\n finishReason: OpenAI.Chat.ChatCompletionChunk.Choice['finish_reason'],\n): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content: '',\n toolCalls,\n state: 'complete',\n timestamp: new Date(),\n metadata: {\n isStreamChunk: true,\n isComplete: finishReason === 'stop' || finishReason === 'tool_calls',\n },\n };\n}\n","import type OpenAI from 'openai';\nimport { isAssistantMessage } from '@robota-sdk/agent-core';\nimport type { ILogger, IToolSchema, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { OpenAICompatibleResponseParser } from '../shared/openai-compatible/index.js';\nimport type { IOpenAICompatibleToolCallTextProjector } from '../shared/openai-compatible/index.js';\nimport { createStreamTextMessage, createStreamToolCallMessage } from './message-factory';\nimport { GemmaReasoningProjector } from './reasoning-projector';\nimport { createGemmaToolCallProjector } from './tool-call-projector';\n\nexport interface IGemmaStreamProjectionState {\n reasoningProjector: GemmaReasoningProjector;\n responseParser: OpenAICompatibleResponseParser;\n toolCallProjector?: IOpenAICompatibleToolCallTextProjector;\n}\n\nexport function createGemmaStreamProjectionState(\n logger: ILogger,\n tools: readonly IToolSchema[] | undefined,\n): IGemmaStreamProjectionState {\n return {\n reasoningProjector: new GemmaReasoningProjector(),\n responseParser: new OpenAICompatibleResponseParser({ logger }),\n ...(tools && { toolCallProjector: createGemmaToolCallProjector(tools) }),\n };\n}\n\nexport function projectGemmaStreamChunk(\n chunk: OpenAI.Chat.ChatCompletionChunk,\n state: IGemmaStreamProjectionState,\n): TUniversalMessage[] {\n const choice = chunk.choices?.[0];\n if (!choice) {\n return [];\n }\n\n const nativeToolCallMessage = state.responseParser.parseStreamingChunk(chunk);\n if (nativeToolCallMessage && isAssistantMessage(nativeToolCallMessage)) {\n if (nativeToolCallMessage.toolCalls?.length) {\n return [nativeToolCallMessage];\n }\n }\n\n return projectGemmaTextDelta(choice.delta.content || '', choice.finish_reason, state);\n}\n\nexport function flushGemmaStreamProjection(\n state: IGemmaStreamProjectionState,\n): TUniversalMessage[] {\n const messages = projectGemmaTextDelta('', null, state, true);\n const flushedContent = state.reasoningProjector.flush();\n if (flushedContent.length > 0) {\n messages.push(createStreamTextMessage(flushedContent, null));\n }\n return messages;\n}\n\nfunction projectGemmaTextDelta(\n rawContent: string,\n finishReason: OpenAI.Chat.ChatCompletionChunk.Choice['finish_reason'],\n state: IGemmaStreamProjectionState,\n flushToolProjector = false,\n): TUniversalMessage[] {\n const toolProjection = flushToolProjector\n ? state.toolCallProjector?.flush()\n : state.toolCallProjector?.project(rawContent);\n const messages: TUniversalMessage[] = [];\n\n if (toolProjection?.toolCalls.length) {\n messages.push(createStreamToolCallMessage(toolProjection.toolCalls, finishReason));\n }\n\n const contentAfterToolProjection = toolProjection?.visibleText ?? rawContent;\n const visibleContent = state.reasoningProjector.project(contentAfterToolProjection);\n if (visibleContent.length > 0) {\n messages.push(createStreamTextMessage(visibleContent, finishReason));\n }\n\n return messages;\n}\n","import OpenAI from 'openai';\nimport { AbstractAIProvider, SilentLogger } from '@robota-sdk/agent-core';\nimport type {\n IAssistantMessage,\n IChatOptions,\n IProviderCapabilities,\n TTextDeltaCallback,\n TUniversalMessage,\n} from '@robota-sdk/agent-core';\nimport {\n assembleOpenAICompatibleStream,\n convertToOpenAICompatibleMessages,\n convertToOpenAICompatibleTools,\n observeProviderNativeRawPayloadStream,\n} from '../shared/openai-compatible/index.js';\nimport type { IOpenAICompatibleError } from '../shared/openai-compatible/index.js';\nimport type { IGemmaProviderOptions } from './types';\nimport { GemmaReasoningProjector } from './reasoning-projector';\nimport { createGemmaToolCallProjector } from './tool-call-projector';\nimport { parseGemmaChatCompletion, withGemmaProjectionMetadata } from './provider-projection';\nimport {\n createGemmaStreamProjectionState,\n flushGemmaStreamProjection,\n projectGemmaStreamChunk,\n} from './streaming-projection';\n\nexport class GemmaProvider extends AbstractAIProvider {\n override readonly name = 'gemma';\n override readonly version = '1.0.0';\n\n private readonly client?: OpenAI;\n private readonly options: IGemmaProviderOptions;\n\n onTextDelta?: TTextDeltaCallback;\n\n constructor(options: IGemmaProviderOptions) {\n super(options.logger || SilentLogger);\n this.options = options;\n\n if (options.executor) {\n this.executor = options.executor;\n }\n\n if (!this.executor) {\n if (options.client) {\n this.client = options.client;\n } else if (options.apiKey) {\n this.client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseURL !== undefined && { baseURL: options.baseURL }),\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n });\n } else {\n throw new Error('Either Gemma client, apiKey, or executor is required');\n }\n }\n }\n\n override async chat(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): Promise<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n this.logger.error(\n 'Gemma Provider executor chat error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (!this.client) {\n throw new Error(\n 'Gemma client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n try {\n const requestParams = this.buildRequestParams(messages, options);\n const textDeltaCb = options?.onTextDelta ?? this.onTextDelta;\n if (textDeltaCb) {\n return await this.chatWithStreamingAssembly(\n {\n ...requestParams,\n stream: true,\n },\n {\n ...options,\n onTextDelta: textDeltaCb,\n },\n );\n }\n\n options?.onProviderNativeRawPayload?.({\n provider: 'gemma',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await this.client.chat.completions.create(requestParams);\n options?.onProviderNativeRawPayload?.({\n provider: 'gemma',\n apiSurface: 'chat-completions',\n payloadKind: 'response',\n payload: response,\n });\n return parseGemmaChatCompletion(response, this.logger, options);\n } catch (error) {\n const gemmaError = error as IOpenAICompatibleError;\n const errorMessage = gemmaError.message || 'Gemma API request failed';\n throw new Error(`Gemma chat failed: ${errorMessage}`);\n }\n }\n\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n yield* this.executeStreamViaExecutorOrDirect(messages, options);\n return;\n } catch (error) {\n this.logger.error(\n 'Gemma Provider executor stream error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (!this.client) {\n throw new Error(\n 'Gemma client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n try {\n const requestParams = this.buildStreamingRequestParams(messages, options);\n options?.onProviderNativeRawPayload?.({\n provider: 'gemma',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await this.client.chat.completions.create(requestParams);\n const projectionState = createGemmaStreamProjectionState(this.logger, options?.tools);\n\n const observedStream = observeProviderNativeRawPayloadStream(stream, {\n provider: 'gemma',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options?.onProviderNativeRawPayload,\n });\n\n for await (const chunk of this.streamWithAbort(observedStream, options?.signal)) {\n for (const message of projectGemmaStreamChunk(chunk, projectionState)) {\n yield message;\n }\n }\n\n for (const message of flushGemmaStreamProjection(projectionState)) {\n yield message;\n }\n } catch (error) {\n const gemmaError = error as IOpenAICompatibleError;\n const errorMessage = gemmaError.message || 'Gemma API request failed';\n throw new Error(`Gemma stream failed: ${errorMessage}`);\n }\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities(): IProviderCapabilities {\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: {\n supported: false,\n enabled: false,\n source: 'openai-compatible-chat-completions',\n reason:\n 'Gemma OpenAI-compatible endpoints support declared function tools, not provider-native web search.',\n },\n webFetch: {\n supported: false,\n enabled: false,\n source: 'openai-compatible-chat-completions',\n reason:\n 'Gemma OpenAI-compatible endpoints support declared function tools, not provider-native web fetch.',\n },\n },\n };\n }\n\n override validateConfig(): boolean {\n return !!this.client && !!this.options;\n }\n\n override async dispose(): Promise<void> {\n // OpenAI-compatible local clients do not need explicit cleanup.\n }\n\n protected override validateMessages(messages: TUniversalMessage[]): void {\n super.validateMessages(messages);\n\n for (const message of messages) {\n if (message.role === 'assistant') {\n const assistantMsg = message as IAssistantMessage;\n if (\n assistantMsg.toolCalls &&\n assistantMsg.toolCalls.length > 0 &&\n assistantMsg.content === ''\n ) {\n continue;\n }\n }\n }\n }\n\n private buildRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): OpenAI.Chat.ChatCompletionCreateParamsNonStreaming {\n const model = options?.model ?? this.options.defaultModel;\n if (!model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const requestParams = {\n model,\n messages: convertToOpenAICompatibleMessages(messages),\n ...(options?.temperature !== undefined && { temperature: options.temperature }),\n ...(options?.maxTokens !== undefined && { max_tokens: options.maxTokens }),\n ...(options?.tools && {\n tools: convertToOpenAICompatibleTools(options.tools),\n tool_choice: 'auto' as const,\n }),\n };\n\n return requestParams as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming;\n }\n\n private buildStreamingRequestParams(\n messages: TUniversalMessage[],\n options: IChatOptions | undefined,\n ): OpenAI.Chat.ChatCompletionCreateParamsStreaming {\n return {\n ...this.buildRequestParams(messages, options),\n stream: true,\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming;\n }\n\n private async chatWithStreamingAssembly(\n requestParams: OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n options: IChatOptions,\n ): Promise<TUniversalMessage> {\n if (!this.client) {\n throw new Error(\n 'Gemma client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n\n try {\n options.onProviderNativeRawPayload?.({\n provider: 'gemma',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await this.client.chat.completions.create(\n requestParams,\n options.signal ? { signal: options.signal } : undefined,\n );\n const projector = new GemmaReasoningProjector();\n const result = await assembleOpenAICompatibleStream({\n stream: observeProviderNativeRawPayloadStream(stream, {\n provider: 'gemma',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: options.onProviderNativeRawPayload,\n }),\n onTextDelta: options.onTextDelta,\n signal: options.signal,\n textProjector: (text) => projector.project(text),\n textProjectorFlush: () => projector.flush(),\n toolCallTextProjector: createGemmaToolCallProjector(options.tools),\n });\n\n return withGemmaProjectionMetadata(result, projector.rawText, projector.removedReasoning);\n } catch (error) {\n const gemmaError = error as IOpenAICompatibleError;\n const errorMessage = gemmaError.message || 'Gemma streaming request failed';\n throw new Error(`Gemma stream failed: ${errorMessage}`);\n }\n }\n}\n","import type { IProviderDefinition } from '@robota-sdk/agent-core';\nimport { probeOpenAICompatibleProfile } from '../shared/openai-compatible/index.js';\nimport { GemmaProvider } from './provider';\n\nexport const DEFAULT_GEMMA_PROVIDER_MODEL = 'supergemma4-26b-uncensored-v2';\nexport const DEFAULT_GEMMA_PROVIDER_API_KEY = 'lm-studio';\nexport const DEFAULT_GEMMA_PROVIDER_BASE_URL = 'http://localhost:1234/v1';\nconst GEMMA_MODEL_SOURCE_URL = 'https://ai.google.dev/gemma';\nconst GEMMA_MODEL_LAST_VERIFIED_AT = '2026-05-04';\nconst GEMMA_SETUP_URL = 'https://lmstudio.ai/docs/developer';\nconst GEMMA_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst GEMMA_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'official',\n label: 'LM Studio local API documentation',\n url: GEMMA_SETUP_URL,\n sourceUrl: GEMMA_SETUP_URL,\n lastVerifiedAt: GEMMA_SETUP_LAST_VERIFIED_AT,\n },\n];\nconst GEMMA_MODEL_CATALOG: NonNullable<IProviderDefinition['modelCatalog']> = {\n status: 'fallback',\n sourceUrl: GEMMA_MODEL_SOURCE_URL,\n lastVerifiedAt: GEMMA_MODEL_LAST_VERIFIED_AT,\n entries: [\n {\n id: DEFAULT_GEMMA_PROVIDER_MODEL,\n displayName: 'SuperGemma 4 26B',\n capabilities: ['tools', 'streaming'],\n lifecycle: 'active',\n sourceUrl: GEMMA_MODEL_SOURCE_URL,\n lastVerifiedAt: GEMMA_MODEL_LAST_VERIFIED_AT,\n },\n ],\n};\n\nexport function createGemmaProviderDefinition(): IProviderDefinition {\n return {\n type: 'gemma',\n displayName: 'Gemma',\n description: 'Gemma-family local models through an OpenAI-compatible endpoint',\n defaults: {\n model: DEFAULT_GEMMA_PROVIDER_MODEL,\n apiKey: DEFAULT_GEMMA_PROVIDER_API_KEY,\n baseURL: DEFAULT_GEMMA_PROVIDER_BASE_URL,\n },\n modelCatalog: GEMMA_MODEL_CATALOG,\n setupHelpLinks: GEMMA_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'baseURL',\n title: 'Gemma OpenAI-compatible base URL',\n defaultValue: DEFAULT_GEMMA_PROVIDER_BASE_URL,\n },\n {\n key: 'model',\n title: 'Gemma model',\n defaultValue: DEFAULT_GEMMA_PROVIDER_MODEL,\n },\n {\n key: 'apiKey',\n title: 'Gemma OpenAI-compatible API key',\n defaultValue: DEFAULT_GEMMA_PROVIDER_API_KEY,\n masked: true,\n },\n ],\n requiresApiKey: true,\n probeProfile: probeOpenAICompatibleProfile,\n createProvider: (config) =>\n new GemmaProvider({\n apiKey: requireApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n defaultModel: config.model,\n }),\n };\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider gemma requires apiKey');\n }\n return apiKey;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./openai-compatible-BYfyY5lb.cjs`);let n=require(`node:crypto`),r=require(`@robota-sdk/agent-core`),i=require(`openai`);i=e.t(i,1);const a=`<|channel>`;function o(e){let t=c(e,{final:!0});return{rawText:e,visibleText:t.visibleParts.join(``),removedReasoning:t.removedReasoning}}var s=class{buffer=``;emittedVisibleText=``;hasRemovedReasoning=!1;get rawText(){return this.buffer}get removedReasoning(){return this.hasRemovedReasoning}project(e){return e.length===0?``:(this.buffer+=e,this.projectVisibleText({final:!1}))}flush(){return this.projectVisibleText({final:!0})}projectVisibleText(e){let t=c(this.buffer,e);this.hasRemovedReasoning=this.hasRemovedReasoning||t.removedReasoning;let n=t.visibleParts.join(``),r=n.slice(this.emittedVisibleText.length);return this.emittedVisibleText=n,r}};function c(e,t){let n={visibleParts:[],removedReasoning:!1},r=0;for(;r<e.length;){let i=e.indexOf(a,r);if(i===-1){l(n,e.slice(r),t);break}l(n,e.slice(r,i),t);let o=i+10,s=e.indexOf(`<channel|>`,o);if(s===-1){t.final&&(n.removedReasoning=!0);break}n.removedReasoning=!0,r=u(e,o,s)}return n}function l(e,t,n){if(t.length===0)return;if(n.final){e.visibleParts.push(t);return}let r=d(t);e.visibleParts.push(t.slice(0,t.length-r))}function u(e,t,n){let r=e.slice(t,n),i=n+10;if(r.trim().length===0){let t=e.slice(i).match(/^thought(?:\r?\n)*/);return t&&(i+=t[0].length),i}return r.split(/\r?\n/,1)[0]?.trim(),i}function d(e){let t=Math.min(e.length,9);for(let n=t;n>0;--n)if(a.startsWith(e.slice(e.length-n)))return n;return 0}const f=`<|"|>`;var p=class{source;cursor=0;constructor(e){this.source=e}parse(){let e=this.parseObject();if(this.skipWhitespace(),this.cursor===this.source.length)return e}parseObject(){if(!this.consume(`{`))return;let e={};if(this.skipWhitespace(),this.consume(`}`))return e;for(;this.cursor<this.source.length;){let t=this.parseKey();if(!t||!this.consume(`:`))return;let n=this.parseValue();if(n===void 0)return;if(e[t]=n,this.skipWhitespace(),this.consume(`}`))return e;if(!this.consume(`,`))return}}parseArray(){if(!this.consume(`[`))return;let e=[];if(this.skipWhitespace(),this.consume(`]`))return e;for(;this.cursor<this.source.length;){let t=this.parseValue();if(t===void 0)return;if(e.push(t),this.skipWhitespace(),this.consume(`]`))return e;if(!this.consume(`,`))return}}parseValue(){return this.skipWhitespace(),this.source.startsWith(f,this.cursor)?this.parseString():this.source.startsWith(`{`,this.cursor)?this.parseObject():this.source.startsWith(`[`,this.cursor)?this.parseArray():this.consumeLiteral(`true`)?!0:this.consumeLiteral(`false`)?!1:this.consumeLiteral(`null`)?null:this.parseNumber()}parseKey(){if(this.skipWhitespace(),this.source.startsWith(f,this.cursor))return this.parseString();let e=/^[A-Za-z_][A-Za-z0-9_-]*/.exec(this.source.slice(this.cursor));if(e)return this.cursor+=e[0].length,this.skipWhitespace(),e[0]}parseString(){if(!this.consume(f))return;let e=this.source.indexOf(f,this.cursor);if(e===-1)return;let t=this.source.slice(this.cursor,e);return this.cursor=e+5,this.skipWhitespace(),t}parseNumber(){let e=/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/.exec(this.source.slice(this.cursor));if(e)return this.cursor+=e[0].length,this.skipWhitespace(),Number(e[0])}consume(e){return this.skipWhitespace(),this.source.startsWith(e,this.cursor)?(this.cursor+=e.length,this.skipWhitespace(),!0):!1}consumeLiteral(e){return this.source.startsWith(e,this.cursor)?(this.cursor+=e.length,this.skipWhitespace(),!0):!1}skipWhitespace(){for(;/\s/.test(this.source[this.cursor]??``);)this.cursor+=1}};function ee(e){return[`<`]}function te(e,t,n){return e.indexOf(`<`,t)}function ne(e,t){return+!!e.endsWith(`<`)}function re(e,t){let n=e.indexOf(`>`,t+1);if(n===-1)return;let r=e.slice(t,n+1),i=r.match(/^<\s*([A-Za-z][\w:-]*)([\s/>][\s\S]*?|)>$/);if(!i)return;let a=i[1]??``;return{tagName:a,normalizedName:a.toLowerCase(),rawOpenTag:r,attributes:_(i[2]??``),openEnd:n+1,selfClosing:/\/\s*>$/.test(r)}}function m(e,t,n){if(t.selfClosing)return{innerText:``,end:t.openEnd,complete:!0};let r=y(e,t.tagName,t.openEnd);if(r===-1)return{innerText:e.slice(t.openEnd),end:n.final?e.length:t.openEnd-t.rawOpenTag.length,complete:!1};let i=e.indexOf(`>`,r);return{innerText:e.slice(t.openEnd,r),end:i===-1?e.length:i+1,complete:!0}}function h(e,t){if(t.selfClosing)return{rawText:t.rawOpenTag,end:t.openEnd};let n=y(e,t.tagName,t.openEnd);if(n===-1)return{rawText:t.rawOpenTag,end:t.openEnd};let r=e.indexOf(`>`,n),i=r===-1?e.length:r+1;return{rawText:e.slice(t.openEnd-t.rawOpenTag.length,i),end:i}}function g(e,t){let n=b(e);return t.find(e=>b(e)===n)}function _(e){let t={},n=/([A-Za-z_][\w:-]*)\s*=\s*(?:"([^"]*)"|'([^']*)')/g,r=n.exec(e);for(;r;){let i=r[1]??``;t[i]=ie(v(r[2]??r[3]??``)),r=n.exec(e)}return t}function ie(e){return e===`true`?!0:e===`false`?!1:e===`null`?null:/^-?(?:0|[1-9]\d*)(?:\.\d+)?$/.test(e)?Number(e):e}function v(e){return e.replace(/&quot;/g,`"`).replace(/&apos;/g,`'`).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&amp;/g,`&`)}function y(e,t,n){return e.toLowerCase().indexOf(`</${t.toLowerCase()}>`,n)}function b(e){return e.replace(/[^a-z0-9]/gi,``).toLowerCase()}function x(e,t){let n=S(e,t);return n?[n]:[]}function S(e,t){let n=e.indexOf(`>`),r=e.lastIndexOf(`</`);if(n===-1||r===-1||r<=n)return;let i=C(e.slice(n+1,r).trim());if(!w(i))return;let a=i.command,o=i.args;if(typeof a!=`string`||!w(o))return;let s=g(a,t);if(s)return{toolName:s,args:o}}function C(e){try{return JSON.parse(e)}catch{return}}function w(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function T(e,t,n){let r=A(),i=ee(t.toolNames),a=0;for(;a<e.length;){let o=te(e,a,i);if(o===-1){O(r,e.slice(a),n,i);break}O(r,e.slice(a,o),n,i);let s=E(e,o,r,t,n);if(!s.completed)break;a=s.cursor}return{visibleText:r.visibleParts.join(``),toolCalls:r.toolCalls,rawToolCallTextParts:r.rawToolCallTextParts,removedToolCallText:r.removedToolCallText}}function E(e,t,n,r,i){let a=re(e,t);if(!a)return D(e,t,n,i);let o=g(a.tagName,r.toolNames);return o?se(e,a,o,n,r):ae(e,t,a,n,r,i)}function D(e,t,n,r){return r.final?(n.visibleParts.push(e[t]??``),{cursor:t+1,completed:!0}):{cursor:t,completed:!1}}function ae(e,t,n,r,i,a){let o=m(e,n,a);if(!o.complete&&!a.final)return{cursor:t,completed:!1};let s=e.slice(t,o.end),c=r.rawToolCallTextParts.length;return r.removedToolCallText=!0,le(r,s,i),j(r,oe(o,r,i)),r.rawToolCallTextParts.length===c&&r.rawToolCallTextParts.push(s),{cursor:o.end,completed:!0}}function oe(e,t,n){return T(e.innerText,{...n,startCallIndex:M(t,n)},{final:!0})}function se(e,t,n,r,i){let a=h(e,t);return ce(r,n,t.attributes,a.rawText,i),{cursor:a.end,completed:!0}}function O(e,t,n,r){if(t.length===0)return;if(n.final){e.visibleParts.push(t);return}let i=ne(t,r);e.visibleParts.push(t.slice(0,t.length-i))}function ce(e,t,n,r,i){Object.keys(n).length!==0&&(e.toolCalls.push(k(t,n,i,e)),e.rawToolCallTextParts.push(r),e.removedToolCallText=!0)}function le(e,t,n){let r=x(t,n.toolNames);for(let i of r)e.toolCalls.push(k(i.toolName,i.args,n,e)),e.rawToolCallTextParts.push(t)}function k(e,t,n,r){return{id:`${n.callIdPrefix??`gemma_call`}_${M(r,n)}`,type:`function`,function:{name:e,arguments:JSON.stringify(t)}}}function A(){return{visibleParts:[],toolCalls:[],rawToolCallTextParts:[],removedToolCallText:!1}}function j(e,t){e.toolCalls.push(...t.toolCalls),e.rawToolCallTextParts.push(...t.rawToolCallTextParts),e.removedToolCallText=e.removedToolCallText||t.removedToolCallText}function M(e,t){return(t.startCallIndex??0)+e.toolCalls.length}const N=`<|tool_call>`,P=`gemma_call`;function F(e){if(!(!e||e.length===0))return new L({toolNames:e.map(e=>e.name)})}function I(e,t){return ue(e,R(e,t,{final:!0}))}var L=class{options;buffer=``;emittedVisibleText=``;emittedRawToolCallText=``;emittedToolCallIds=new Set;constructor(e){this.options=e}project(e){return e.length===0?de():(this.buffer+=e,this.projectVisibleText({final:!1}))}flush(){return this.projectVisibleText({final:!0})}projectVisibleText(e){let t=R(this.buffer,this.options,e),n=t.visibleParts.join(``),r=n.slice(this.emittedVisibleText.length),i=t.rawToolCallTextParts.join(``),a=i.slice(this.emittedRawToolCallText.length);return this.emittedVisibleText=n,this.emittedRawToolCallText=i,{visibleText:r,toolCalls:t.toolCalls.filter(e=>this.emittedToolCallIds.has(e.id)?!1:(this.emittedToolCallIds.add(e.id),!0)),removedToolCallText:a.length>0,...a.length>0&&{rawToolCallText:a}}}};function R(e,t,n){let r=z(e,t,n),i=T(r.visibleParts.join(``),{toolNames:t.toolNames,callIdPrefix:t.callIdPrefix??P,startCallIndex:r.toolCalls.length},n);return{visibleParts:[i.visibleText],toolCalls:[...r.toolCalls,...i.toolCalls],rawToolCallTextParts:[...r.rawToolCallTextParts,...i.rawToolCallTextParts],removedToolCallText:r.removedToolCallText||i.removedToolCallText}}function z(e,t,n){let r=V(),i=new Set(t.toolNames),a=0,o=0;for(;a<e.length;){let s=e.indexOf(N,a);if(s===-1){H(r,e.slice(a),n);break}H(r,e.slice(a,s),n);let c=s+12,l=e.indexOf(`<tool_call|>`,c);if(l===-1){n.final&&r.visibleParts.push(e.slice(s));break}let u=e.slice(s,l+12),d=B(e.slice(c,l),i,t,o);d?(r.toolCalls.push(d),r.rawToolCallTextParts.push(u),r.removedToolCallText=!0,o+=1):r.visibleParts.push(u),a=l+12}return r}function B(e,t,n,r){let i=e.trim();if(!i.startsWith(`call:`))return;let a=i.slice(5).trimStart(),o=a.indexOf(`{`);if(o<=0)return;let s=a.slice(0,o).trim();if(!t.has(s))return;let c=new p(a.slice(o)).parse();if(c)return{id:`${n.callIdPrefix??P}_${r}`,type:`function`,function:{name:s,arguments:JSON.stringify(c)}}}function V(){return{visibleParts:[],toolCalls:[],rawToolCallTextParts:[],removedToolCallText:!1}}function H(e,t,n){if(t.length===0)return;if(n.final){e.visibleParts.push(t);return}let r=U(t);e.visibleParts.push(t.slice(0,t.length-r))}function U(e){let t=Math.min(e.length,11);for(let n=t;n>0;--n)if(N.startsWith(e.slice(e.length-n)))return n;return 0}function ue(e,t){return{rawText:e,visibleText:t.visibleParts.join(``),toolCalls:t.toolCalls,removedToolCallText:t.removedToolCallText,...t.rawToolCallTextParts.length>0&&{rawToolCallText:t.rawToolCallTextParts.join(``)}}}function de(){return{visibleText:``,toolCalls:[],removedToolCallText:!1}}function fe(e,n,r){let i=e.choices?.[0]?.message.content||``,a=new t.i({logger:n,...r?.tools&&{toolCallTextProjector:F(r.tools)}}).parseResponse(e),s=o(a.content??``);return W({...a,content:s.visibleText},i,s.removedReasoning)}function W(e,t,n){return n?{...e,metadata:{...e.metadata??{},gemmaReasoningFiltered:!0,gemmaRawContent:t}}:e}function G(e,t){return{id:(0,n.randomUUID)(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:t===`stop`||t===`tool_calls`}}}function pe(e,t){return{id:(0,n.randomUUID)(),role:`assistant`,content:``,toolCalls:e,state:`complete`,timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:t===`stop`||t===`tool_calls`}}}function me(e,n){return{reasoningProjector:new s,responseParser:new t.i({logger:e}),...n&&{toolCallProjector:F(n)}}}function he(e,t){let n=e.choices?.[0];if(!n)return[];let i=t.responseParser.parseStreamingChunk(e);return i&&(0,r.isAssistantMessage)(i)&&i.toolCalls?.length?[i]:K(n.delta.content||``,n.finish_reason,t)}function ge(e){let t=K(``,null,e,!0),n=e.reasoningProjector.flush();return n.length>0&&t.push(G(n,null)),t}function K(e,t,n,r=!1){let i=r?n.toolCallProjector?.flush():n.toolCallProjector?.project(e),a=[];i?.toolCalls.length&&a.push(pe(i.toolCalls,t));let o=i?.visibleText??e,s=n.reasoningProjector.project(o);return s.length>0&&a.push(G(s,t)),a}var q=class extends r.AbstractAIProvider{name=`gemma`;version=`1.0.0`;client;options;onTextDelta;constructor(e){if(super(e.logger||r.SilentLogger),this.options=e,e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client;else if(e.apiKey)this.client=new i.default({apiKey:e.apiKey,...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout}});else throw Error(`Either Gemma client, apiKey, or executor is required`)}async chat(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`Gemma Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Gemma client not available. Either provide a client/apiKey or use an executor.`);try{let n=this.buildRequestParams(e,t),r=t?.onTextDelta??this.onTextDelta;if(r)return await this.chatWithStreamingAssembly({...n,stream:!0},{...t,onTextDelta:r});t?.onProviderNativeRawPayload?.({provider:`gemma`,apiSurface:`chat-completions`,payloadKind:`request`,payload:n});let i=await this.client.chat.completions.create(n);return t?.onProviderNativeRawPayload?.({provider:`gemma`,apiSurface:`chat-completions`,payloadKind:`response`,payload:i}),fe(i,this.logger,t)}catch(e){let t=e.message||`Gemma API request failed`;throw Error(`Gemma chat failed: ${t}`)}}async*chatStream(e,n){if(this.validateMessages(e),this.validateNativeWebTools(n?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,n);return}catch(e){throw this.logger.error(`Gemma Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Gemma client not available. Either provide a client/apiKey or use an executor.`);try{let r=this.buildStreamingRequestParams(e,n);n?.onProviderNativeRawPayload?.({provider:`gemma`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=await this.client.chat.completions.create(r),a=me(this.logger,n?.tools),o=t.n(i,{provider:`gemma`,apiSurface:`chat-completions`,onProviderNativeRawPayload:n?.onProviderNativeRawPayload});for await(let e of this.streamWithAbort(o,n?.signal))for(let t of he(e,a))yield t;for(let e of ge(a))yield e}catch(e){let t=e.message||`Gemma API request failed`;throw Error(`Gemma stream failed: ${t}`)}}supportsTools(){return!0}getCapabilities(){return{functionCalling:{supported:!0},nativeWebTools:{webSearch:{supported:!1,enabled:!1,source:`openai-compatible-chat-completions`,reason:`Gemma OpenAI-compatible endpoints support declared function tools, not provider-native web search.`},webFetch:{supported:!1,enabled:!1,source:`openai-compatible-chat-completions`,reason:`Gemma OpenAI-compatible endpoints support declared function tools, not provider-native web fetch.`}}}}validateConfig(){return!!this.client&&!!this.options}async dispose(){}validateMessages(e){super.validateMessages(e);for(let t of e)if(t.role===`assistant`){let e=t;if(e.toolCalls&&e.toolCalls.length>0&&e.content===``)continue}}buildRequestParams(e,n){let r=n?.model??this.options.defaultModel;if(!r)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);return{model:r,messages:t.a(e),...n?.temperature!==void 0&&{temperature:n.temperature},...n?.maxTokens!==void 0&&{max_tokens:n.maxTokens},...n?.tools&&{tools:t.o(n.tools),tool_choice:`auto`}}}buildStreamingRequestParams(e,t){return{...this.buildRequestParams(e,t),stream:!0}}async chatWithStreamingAssembly(e,n){if(!this.client)throw Error(`Gemma client not available. Either provide a client/apiKey or use an executor.`);try{n.onProviderNativeRawPayload?.({provider:`gemma`,apiSurface:`chat-completions`,payloadKind:`request`,payload:e});let r=await this.client.chat.completions.create(e,n.signal?{signal:n.signal}:void 0),i=new s;return W(await t.r({stream:t.n(r,{provider:`gemma`,apiSurface:`chat-completions`,onProviderNativeRawPayload:n.onProviderNativeRawPayload}),onTextDelta:n.onTextDelta,signal:n.signal,textProjector:e=>i.project(e),textProjectorFlush:()=>i.flush(),toolCallTextProjector:F(n.tools)}),i.rawText,i.removedReasoning)}catch(e){let t=e.message||`Gemma streaming request failed`;throw Error(`Gemma stream failed: ${t}`)}}};const J=`supergemma4-26b-uncensored-v2`,Y=`lm-studio`,X=`http://localhost:1234/v1`,Z=`https://ai.google.dev/gemma`,Q=`2026-05-04`,$=`https://lmstudio.ai/docs/developer`,_e=[{kind:`official`,label:`LM Studio local API documentation`,url:$,sourceUrl:$,lastVerifiedAt:`2026-05-08`}],ve={status:`fallback`,sourceUrl:Z,lastVerifiedAt:Q,entries:[{id:J,displayName:`SuperGemma 4 26B`,capabilities:[`tools`,`streaming`],lifecycle:`active`,sourceUrl:Z,lastVerifiedAt:Q}]};function ye(){return{type:`gemma`,displayName:`Gemma`,description:`Gemma-family local models through an OpenAI-compatible endpoint`,defaults:{model:J,apiKey:Y,baseURL:X},modelCatalog:ve,setupHelpLinks:_e,setupSteps:[{key:`baseURL`,title:`Gemma OpenAI-compatible base URL`,defaultValue:X},{key:`model`,title:`Gemma model`,defaultValue:J},{key:`apiKey`,title:`Gemma OpenAI-compatible API key`,defaultValue:Y,masked:!0}],requiresApiKey:!0,probeProfile:t.t,createProvider:e=>new q({apiKey:be(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout},defaultModel:e.model})}}function be(e){if(!e)throw Error(`Provider gemma requires apiKey`);return e}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return o}});
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../gemini-DSaNCxZj.cjs`);var t=class extends e.c{name=`google`;constructor(e){super(e)}};exports.DEFAULT_GEMINI_PROVIDER_API_KEY_ENV=e.n,exports.DEFAULT_GEMINI_PROVIDER_API_KEY_REFERENCE=e.r,exports.DEFAULT_GEMINI_PROVIDER_MODEL=e.i,exports.GeminiProvider=e.c,exports.GoogleProvider=t,exports.createGeminiProviderDefinition=e.s;
@@ -0,0 +1,14 @@
1
+ import { DEFAULT_GEMINI_PROVIDER_API_KEY_ENV, DEFAULT_GEMINI_PROVIDER_API_KEY_REFERENCE, DEFAULT_GEMINI_PROVIDER_MODEL, GeminiProvider, IGeminiProviderOptions, TGeminiProviderOptionValue, createGeminiProviderDefinition } from "../gemini/index.js";
2
+
3
+ //#region src/google/types.d.ts
4
+ type TGoogleProviderOptionValue = TGeminiProviderOptionValue;
5
+ interface IGoogleProviderOptions extends IGeminiProviderOptions {}
6
+ //#endregion
7
+ //#region src/google/provider.d.ts
8
+ declare class GoogleProvider extends GeminiProvider {
9
+ readonly name = "google";
10
+ constructor(options: IGoogleProviderOptions);
11
+ }
12
+ //#endregion
13
+ export { DEFAULT_GEMINI_PROVIDER_API_KEY_ENV, DEFAULT_GEMINI_PROVIDER_API_KEY_REFERENCE, DEFAULT_GEMINI_PROVIDER_MODEL, GeminiProvider, GoogleProvider, type IGeminiProviderOptions, IGoogleProviderOptions, type TGeminiProviderOptionValue, TGoogleProviderOptionValue, createGeminiProviderDefinition };
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/google/types.ts","../../../src/google/provider.ts"],"mappings":";;;KAKY,0BAAA,GAA6B,0BAA0B;AAAA,UAElD,sBAAA,SAA+B,sBAAsB;;;cCJzD,cAAA,SAAuB,cAAc;EAAA,SAC9B,IAAA;cAEN,OAAA,EAAS,sBAAA;AAAA"}
@@ -0,0 +1,2 @@
1
+ import{c as e,i as t,n,r,s as i}from"../gemini-Bh2U87MY.js";var a=class extends e{name=`google`;constructor(e){super(e)}};export{n as DEFAULT_GEMINI_PROVIDER_API_KEY_ENV,r as DEFAULT_GEMINI_PROVIDER_API_KEY_REFERENCE,t as DEFAULT_GEMINI_PROVIDER_MODEL,e as GeminiProvider,a as GoogleProvider,i as createGeminiProviderDefinition};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/google/provider.ts"],"sourcesContent":["import { GeminiProvider } from '../gemini/index.js';\nimport type { IGoogleProviderOptions } from './types.js';\n\nexport class GoogleProvider extends GeminiProvider {\n override readonly name = 'google';\n\n constructor(options: IGoogleProviderOptions) {\n super(options);\n }\n}\n"],"mappings":"4DAGA,IAAa,EAAb,cAAoC,CAAe,CACjD,KAAyB,SAEzB,YAAY,EAAiC,CAC3C,MAAM,CAAO,CACf,CACF"}
@@ -0,0 +1,82 @@
1
+ import { AbstractAIProvider, IChatOptions, IExecutor, ILogger, IProviderCapabilities, IProviderDefinition, IProviderModelCatalog, IProviderProfileConfig, TProviderOptionValueBase, TTextDeltaCallback, TUniversalMessage } from "@robota-sdk/agent-core";
2
+ import OpenAI from "openai";
3
+
4
+ //#region src/deepseek/types.d.ts
5
+ type TDeepSeekThinkingMode = 'enabled' | 'disabled';
6
+ type TDeepSeekReasoningEffort = 'low' | 'medium' | 'high' | 'xhigh' | 'max';
7
+ interface IDeepSeekThinkingConfig {
8
+ type: TDeepSeekThinkingMode;
9
+ }
10
+ type TDeepSeekProviderOptionValue = string | number | boolean | undefined | null | IDeepSeekThinkingConfig | OpenAI | ILogger | IExecutor | TProviderOptionValueBase | TDeepSeekProviderOptionValue[] | {
11
+ [key: string]: TDeepSeekProviderOptionValue;
12
+ };
13
+ interface IDeepSeekProviderOptions {
14
+ [key: string]: TDeepSeekProviderOptionValue;
15
+ apiKey?: string;
16
+ baseURL?: string;
17
+ timeout?: number;
18
+ defaultModel?: string;
19
+ thinking?: TDeepSeekThinkingMode;
20
+ reasoningEffort?: TDeepSeekReasoningEffort;
21
+ client?: OpenAI;
22
+ executor?: IExecutor;
23
+ logger?: ILogger;
24
+ }
25
+ //#endregion
26
+ //#region src/deepseek/provider.d.ts
27
+ declare class DeepSeekProvider extends AbstractAIProvider {
28
+ readonly name = "deepseek";
29
+ readonly version = "1.0.0";
30
+ private readonly client?;
31
+ private readonly options;
32
+ private readonly responseParser;
33
+ onTextDelta?: TTextDeltaCallback;
34
+ constructor(options: IDeepSeekProviderOptions);
35
+ chat(messages: TUniversalMessage[], options?: IChatOptions): Promise<TUniversalMessage>;
36
+ chatStream(messages: TUniversalMessage[], options?: IChatOptions): AsyncIterable<TUniversalMessage>;
37
+ supportsTools(): boolean;
38
+ getCapabilities(): IProviderCapabilities;
39
+ validateConfig(): boolean;
40
+ dispose(): Promise<void>;
41
+ private buildRequestParams;
42
+ private buildStreamingRequestParams;
43
+ private getClient;
44
+ private chatWithStreamingAssembly;
45
+ }
46
+ //#endregion
47
+ //#region src/deepseek/provider-definition.d.ts
48
+ declare function createDeepSeekProviderDefinition(): IProviderDefinition;
49
+ //#endregion
50
+ //#region src/deepseek/defaults.d.ts
51
+ declare const DEFAULT_DEEPSEEK_PROVIDER_MODEL = "deepseek-v4-flash";
52
+ declare const DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV = "DEEPSEEK_API_KEY";
53
+ declare const DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE = "$ENV:DEEPSEEK_API_KEY";
54
+ declare const DEFAULT_DEEPSEEK_PROVIDER_BASE_URL = "https://api.deepseek.com";
55
+ //#endregion
56
+ //#region src/deepseek/model-catalog-refresh.d.ts
57
+ interface IDeepSeekModelsResponse {
58
+ data?: Array<{
59
+ id?: string;
60
+ object?: string;
61
+ owned_by?: string;
62
+ }>;
63
+ }
64
+ interface IDeepSeekFetchInit {
65
+ headers?: Record<string, string>;
66
+ }
67
+ interface IDeepSeekFetchResponse {
68
+ ok: boolean;
69
+ status: number;
70
+ json: () => Promise<IDeepSeekModelsResponse>;
71
+ }
72
+ type TDeepSeekFetch = (url: string, init?: IDeepSeekFetchInit) => Promise<IDeepSeekFetchResponse>;
73
+ declare function refreshDeepSeekModelCatalog(profile: IProviderProfileConfig, fetcher?: TDeepSeekFetch): Promise<IProviderModelCatalog>;
74
+ //#endregion
75
+ //#region src/deepseek/model-catalog.d.ts
76
+ declare const DEEPSEEK_MODEL_CATALOG_SOURCE_URL = "https://api-docs.deepseek.com/quick_start/pricing";
77
+ declare const DEEPSEEK_MODEL_LIST_SOURCE_URL = "https://api-docs.deepseek.com/api/list-models";
78
+ declare const DEEPSEEK_MODEL_LAST_VERIFIED_AT = "2026-05-07";
79
+ declare const DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE = "2026-07-24";
80
+ //#endregion
81
+ export { refreshDeepSeekModelCatalog as a, DEFAULT_DEEPSEEK_PROVIDER_BASE_URL as c, DeepSeekProvider as d, IDeepSeekProviderOptions as f, TDeepSeekThinkingMode as g, TDeepSeekReasoningEffort as h, DEEPSEEK_MODEL_LIST_SOURCE_URL as i, DEFAULT_DEEPSEEK_PROVIDER_MODEL as l, TDeepSeekProviderOptionValue as m, DEEPSEEK_MODEL_CATALOG_SOURCE_URL as n, DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV as o, IDeepSeekThinkingConfig as p, DEEPSEEK_MODEL_LAST_VERIFIED_AT as r, DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE as s, DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE as t, createDeepSeekProviderDefinition as u };
82
+ //# sourceMappingURL=index-B6PnlDMd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-B6PnlDMd.d.ts","names":[],"sources":["../../src/deepseek/types.ts","../../src/deepseek/provider.ts","../../src/deepseek/provider-definition.ts","../../src/deepseek/defaults.ts","../../src/deepseek/model-catalog-refresh.ts","../../src/deepseek/model-catalog.ts"],"mappings":";;;;KAGY,qBAAA;AAAA,KACA,wBAAA;AAAA,UAEK,uBAAA;EACf,IAAA,EAAM,qBAAqB;AAAA;AAAA,KAGjB,4BAAA,kDAMR,uBAAA,GACA,MAAA,GACA,OAAA,GACA,SAAA,GACA,wBAAA,GACA,4BAAA;EAAA,CACG,GAAA,WAAc,4BAAA;AAAA;AAAA,UAEJ,wBAAA;EAAA,CACd,GAAA,WAAc,4BAAA;EAEf,MAAA;EACA,OAAA;EACA,OAAA;EACA,YAAA;EACA,QAAA,GAAW,qBAAA;EACX,eAAA,GAAkB,wBAAA;EAClB,MAAA,GAAS,MAAA;EACT,QAAA,GAAW,SAAA;EACX,MAAA,GAAS,OAAA;AAAA;;;cCIE,gBAAA,SAAyB,kBAAA;EAAA,SAClB,IAAA;EAAA,SACA,OAAA;EAAA,iBAED,MAAA;EAAA,iBACA,OAAA;EAAA,iBACA,cAAA;EAEjB,WAAA,GAAc,kBAAA;cAEF,OAAA,EAAS,wBAAA;EAyBN,IAAA,CACb,QAAA,EAAU,iBAAA,IACV,OAAA,GAAU,YAAA,GACT,OAAA,CAAQ,iBAAA;EAmDK,UAAA,CACd,QAAA,EAAU,iBAAA,IACV,OAAA,GAAU,YAAA,GACT,aAAA,CAAc,iBAAA;EAiDR,aAAA,CAAA;EAIA,eAAA,CAAA,GAAmB,qBAAA;EAsBnB,cAAA,CAAA;EAIM,OAAA,CAAA,GAAW,OAAA;EAAA,QAIlB,kBAAA;EAAA,QA8BA,2BAAA;EAAA,QAUA,SAAA;EAAA,QAUM,yBAAA;AAAA;;;iBCrOA,gCAAA,CAAA,GAAoC,mBAAmB;;;cCnC1D,+BAAA;AAAA,cACA,qCAAA;AAAA,cACA,2CAAA;AAAA,cACA,kCAAA;;;UCSI,uBAAA;EACf,IAAA,GAAO,KAAK;IACV,EAAA;IACA,MAAA;IACA,QAAA;EAAA;AAAA;AAAA,UAIa,kBAAA;EACf,OAAA,GAAU,MAAM;AAAA;AAAA,UAGD,sBAAA;EACf,EAAA;EACA,MAAA;EACA,IAAA,QAAY,OAAO,CAAC,uBAAA;AAAA;AAAA,KAGV,cAAA,IACV,GAAA,UACA,IAAA,GAAO,kBAAA,KACJ,OAAA,CAAQ,sBAAA;AAAA,iBAES,2BAAA,CACpB,OAAA,EAAS,sBAAA,EACT,OAAA,GAAS,cAAA,GACR,OAAA,CAAQ,qBAAA;;;cCnCE,iCAAA;AAAA,cAEA,8BAAA;AAAA,cACA,+BAAA;AAAA,cACA,yCAAA"}