@robota-sdk/agent-provider 3.0.0-beta.65 → 3.0.0-beta.67

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 (124) hide show
  1. package/README.md +89 -0
  2. package/dist/browser/index.d.ts +5 -2
  3. package/dist/browser/index.d.ts.map +1 -1
  4. package/dist/browser/index.js +3 -3
  5. package/dist/browser/index.js.map +1 -1
  6. package/dist/loggers/index.d.ts.map +1 -1
  7. package/dist/loggers/index.js.map +1 -1
  8. package/dist/node/anthropic/index.d.ts +1 -1
  9. package/dist/node/anthropic/index.d.ts.map +1 -1
  10. package/dist/node/anthropic--1vgLC-e.js.map +1 -1
  11. package/dist/node/bytedance/index.d.ts.map +1 -1
  12. package/dist/node/bytedance-C_0sF_pJ.js.map +1 -1
  13. package/dist/node/deepseek-_8Ixx7rA.js.map +1 -1
  14. package/dist/node/gemini/index.d.ts.map +1 -1
  15. package/dist/node/gemini-Bh2U87MY.js.map +1 -1
  16. package/dist/node/gemma/index.cjs +1 -1
  17. package/dist/node/gemma/index.d.ts +1 -1
  18. package/dist/node/gemma/index.js +1 -1
  19. package/dist/node/{gemma-G-Pf_PnX.cjs → gemma-079LPvrN.cjs} +1 -1
  20. package/dist/node/gemma-BMFWnmXE.js +2 -0
  21. package/dist/node/gemma-BMFWnmXE.js.map +1 -0
  22. package/dist/node/google/index.d.ts.map +1 -1
  23. package/dist/node/google/index.js.map +1 -1
  24. package/dist/node/index-B6PnlDMd.d.ts.map +1 -1
  25. package/dist/node/index-B7UvPJcI.d.ts.map +1 -1
  26. package/dist/node/{index-C3beaqKO.d.ts → index-B9a2gTwI.d.ts} +3 -3
  27. package/dist/node/{index-BqixM_XD.d.ts.map → index-B9a2gTwI.d.ts.map} +1 -1
  28. package/dist/node/index-BLPOTNb5.d.ts.map +1 -1
  29. package/dist/node/{index-BqixM_XD.d.ts → index-CjPeNJ1G.d.ts} +3 -3
  30. package/dist/node/{index-C3beaqKO.d.ts.map → index-CjPeNJ1G.d.ts.map} +1 -1
  31. package/dist/node/index-Cp2XRh9G.d.ts.map +1 -1
  32. package/dist/node/index-DSv5xruI.d.ts.map +1 -1
  33. package/dist/node/index-w0bV1uaP.d.ts.map +1 -1
  34. package/dist/node/index.cjs +1 -1
  35. package/dist/node/index.d.ts +11 -5
  36. package/dist/node/index.d.ts.map +1 -0
  37. package/dist/node/index.js +2 -1
  38. package/dist/node/index.js.map +1 -0
  39. package/dist/node/openai/index.cjs +1 -1
  40. package/dist/node/openai/index.d.ts +1 -1
  41. package/dist/node/openai/index.js +1 -1
  42. package/dist/node/openai--CyyQ-E4.js +2 -0
  43. package/dist/node/openai--CyyQ-E4.js.map +1 -0
  44. package/dist/node/{openai-xWC6pY7r.cjs → openai-CmuDu5k-.cjs} +1 -1
  45. package/dist/node/openai-compatible-Dm4Sof9e.js.map +1 -1
  46. package/dist/node/qwen/index.cjs +1 -1
  47. package/dist/node/qwen/index.d.ts +1 -1
  48. package/dist/node/qwen/index.js +1 -1
  49. package/dist/node/qwen-D8gtsbsC.js +2 -0
  50. package/dist/node/qwen-D8gtsbsC.js.map +1 -0
  51. package/dist/node/qwen-DxNnm7Le.cjs +1 -0
  52. package/package.json +4 -2
  53. package/src/anthropic/index.ts +1 -1
  54. package/src/anthropic/message-converter.ts +3 -2
  55. package/src/anthropic/model-catalog-refresh.ts +5 -4
  56. package/src/anthropic/parsers/response-parser.ts +5 -2
  57. package/src/anthropic/provider-definition.ts +2 -1
  58. package/src/anthropic/provider.ts +6 -3
  59. package/src/anthropic/streaming-handler.ts +4 -2
  60. package/src/anthropic/types.ts +1 -1
  61. package/src/bytedance/http-client.ts +1 -1
  62. package/src/bytedance/provider.spec.ts +1 -0
  63. package/src/bytedance/provider.ts +10 -9
  64. package/src/bytedance/status-mapper.ts +1 -1
  65. package/src/deepseek/model-catalog-refresh.ts +6 -5
  66. package/src/deepseek/model-catalog.ts +2 -1
  67. package/src/deepseek/provider-definition.ts +3 -2
  68. package/src/deepseek/provider.ts +11 -9
  69. package/src/deepseek/types.ts +1 -1
  70. package/src/default-provider-definitions.ts +19 -0
  71. package/src/gemini/execution-helpers.ts +14 -12
  72. package/src/gemini/image-operations.ts +2 -2
  73. package/src/gemini/message-converter.ts +1 -0
  74. package/src/gemini/model-catalog-refresh.ts +2 -1
  75. package/src/gemini/provider-definition.ts +2 -1
  76. package/src/gemini/provider.spec.ts +2 -0
  77. package/src/gemini/provider.ts +6 -3
  78. package/src/gemini/tool-schema-converter.ts +1 -0
  79. package/src/gemma/message-factory.ts +2 -1
  80. package/src/gemma/provider-definition.ts +3 -2
  81. package/src/gemma/provider-projection.ts +4 -3
  82. package/src/gemma/provider.ts +19 -17
  83. package/src/gemma/pseudo-command-envelope.ts +1 -0
  84. package/src/gemma/pseudo-tool-call-projector.ts +2 -1
  85. package/src/gemma/streaming-projection.ts +6 -4
  86. package/src/gemma/tool-call-projector.ts +4 -3
  87. package/src/gemma/types.ts +1 -1
  88. package/src/google/provider.ts +1 -0
  89. package/src/index.ts +2 -0
  90. package/src/openai/adapter.ts +1 -1
  91. package/src/openai/chat-completions-chat.ts +8 -7
  92. package/src/openai/loggers/console-payload-logger.ts +4 -2
  93. package/src/openai/loggers/file-payload-logger.ts +5 -2
  94. package/src/openai/message-converter.ts +3 -2
  95. package/src/openai/openai-request-format.ts +1 -1
  96. package/src/openai/parsers/response-parser.ts +3 -2
  97. package/src/openai/provider-definition.ts +3 -2
  98. package/src/openai/provider.ts +11 -9
  99. package/src/openai/responses-chat.ts +7 -5
  100. package/src/openai/responses-converter.ts +6 -6
  101. package/src/openai/responses-parser.ts +4 -2
  102. package/src/openai/responses-types.ts +1 -1
  103. package/src/openai/streaming/stream-handler.ts +6 -4
  104. package/src/openai/types.ts +1 -2
  105. package/src/qwen/model-catalog-refresh.ts +6 -5
  106. package/src/qwen/provider-capabilities.ts +1 -1
  107. package/src/qwen/provider-definition.ts +6 -5
  108. package/src/qwen/provider-streaming-assembly.ts +3 -2
  109. package/src/qwen/provider.ts +19 -12
  110. package/src/qwen/responses-chat.ts +8 -6
  111. package/src/qwen/responses-converter.ts +1 -1
  112. package/src/qwen/responses-parser.ts +4 -2
  113. package/src/qwen/types.ts +1 -1
  114. package/src/shared/openai-compatible/message-converter.ts +1 -1
  115. package/src/shared/openai-compatible/response-parser.ts +4 -2
  116. package/src/shared/openai-compatible/stream-assembler.ts +3 -2
  117. package/src/shared/openai-compatible/types.ts +1 -1
  118. package/dist/node/gemma-Dp_AfCUR.js +0 -2
  119. package/dist/node/gemma-Dp_AfCUR.js.map +0 -1
  120. package/dist/node/openai-CRQjg4xF.js +0 -2
  121. package/dist/node/openai-CRQjg4xF.js.map +0 -1
  122. package/dist/node/qwen-ChUZobTL.js +0 -2
  123. package/dist/node/qwen-ChUZobTL.js.map +0 -1
  124. package/dist/node/qwen-CjT71vSM.cjs +0 -1
@@ -1,12 +1,14 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import type OpenAI from 'openai';
3
- import type { ILogger, IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';
2
+
4
3
  import { SilentLogger } from '@robota-sdk/agent-core';
4
+
5
5
  import type {
6
6
  IOpenAICompatibleToolCallTextProjector,
7
7
  IOpenAICompatibleToolCallTextProjection,
8
8
  TOpenAICompatibleTextProjector,
9
9
  } from './types';
10
+ import type { ILogger, IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';
11
+ import type OpenAI from 'openai';
10
12
 
11
13
  export interface IOpenAICompatibleResponseParserOptions {
12
14
  logger?: ILogger;
@@ -1,11 +1,12 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import type OpenAI from 'openai';
3
- import type { IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';
2
+
4
3
  import type {
5
4
  IOpenAICompatibleToolCallTextProjection,
6
5
  IOpenAICompatibleStreamAssemblyOptions,
7
6
  TOpenAICompatibleTextProjector,
8
7
  } from './types';
8
+ import type { IToolCall, TUniversalMessage } from '@robota-sdk/agent-core';
9
+ import type OpenAI from 'openai';
9
10
 
10
11
  interface IToolCallPart {
11
12
  id: string;
@@ -1,5 +1,5 @@
1
- import type OpenAI from 'openai';
2
1
  import type { IToolCall, TTextDeltaCallback } from '@robota-sdk/agent-core';
2
+ import type OpenAI from 'openai';
3
3
 
4
4
  export interface IOpenAICompatibleChatRequestParams {
5
5
  model: string;
@@ -1,2 +0,0 @@
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
@@ -1 +0,0 @@
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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"}
@@ -1,2 +0,0 @@
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 ee,SilentLogger as s}from"@robota-sdk/agent-core";import c from"openai";var l=class{parser;constructor(e){this.parser=new t({logger:e})}parseResponse(e){try{return this.parser.parseResponse(e)}catch(e){let t=u(e instanceof Error?e.message:`OpenAI response parsing failed`);throw Error(`OpenAI response parsing failed: ${t}`)}}parseStreamingChunk(e){try{return this.parser.parseStreamingChunk(e)}catch(e){let t=u(e instanceof Error?e.message:`OpenAI chunk parsing failed`);throw Error(`OpenAI chunk parsing failed: ${t}`)}}};function u(e){return e.replace(/^OpenAI-compatible response parsing failed: /,``).replace(/^OpenAI-compatible chunk parsing failed: /,``).replace(`OpenAI-compatible response`,`OpenAI response`)}function te(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{type:`json_object`};let t=d(e);return{type:`json_schema`,json_schema:{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function ne(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{format:{type:`json_object`}};let t=d(e);return{format:{type:`json_schema`,name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function d(e){let t=e.jsonSchema;if(e.responseFormat!==`json_schema`)throw Error(`Unsupported OpenAI response format: ${e.responseFormat}`);if(!t?.schema)throw Error(`OpenAI jsonSchema.schema is required when responseFormat is json_schema`);return{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}function f(t){return e(t)}function re(e){return r(e)}async function p(e){let t=v(e.client);try{let n=h(e);if(e.chatOptions?.onTextDelta??e.onTextDelta)return await g(t,e,{...n,stream:!0});await _(e,n,`chat`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:n});let r=await t.chat.completions.create(n);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`response`,payload:r}),e.responseParser.parseResponse(r)}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI chat failed: ${t}`)}}async function*m(e){let t=v(e.client);try{let r={...h(e),stream:!0};await _(e,r,`stream`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=await t.chat.completions.create(r,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);for await(let t of n(i,{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload})){let n=e.responseParser.parseStreamingChunk(t);n&&(yield n)}}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI stream failed: ${t}`)}}function h(e){let t=f(e.messages),n=e.chatOptions?.model??e.providerOptions.defaultModel;if(!n)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let r=te(e.providerOptions);return{model:n,messages:t,...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_tokens:e.chatOptions.maxTokens},...e.chatOptions?.tools&&{tools:re(e.chatOptions.tools),tool_choice:`auto`},...r!==void 0&&{response_format:r}}}async function g(e,t,r){try{return await _(t,r,`stream`),t.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r}),i({stream:n(await e.chat.completions.create(r,t.chatOptions?.signal?{signal:t.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:t.chatOptions?.onProviderNativeRawPayload}),onTextDelta:t.chatOptions?.onTextDelta??t.onTextDelta,signal:t.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI streaming request failed`;throw Error(`OpenAI stream failed: ${t}`)}}async function _(e,t,n){if(!e.payloadLogger?.isEnabled())return;let r={model:t.model,messagesCount:t.messages.length,hasTools:!!t.tools,temperature:t.temperature??void 0,maxTokens:t.max_tokens??void 0,timestamp:new Date().toISOString()};await e.payloadLogger.logPayload(r,n)}function v(e){if(!e)throw Error(`OpenAI client not available. Either provide a client/apiKey or use an executor.`);return e}function y(e){return e.flatMap(e=>x(e))}function b(e,t){let n=e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters,strict:t??!1}))??[];return n.length>0?n:void 0}function x(e){if(e.role===`user`)return[S(`user`,ae(e.content,e.parts))];if(e.role===`system`)return[S(`system`,e.content)];if(e.role===`tool`){if(!e.toolCallId||e.toolCallId.trim().length===0)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]}return ie(e)}function ie(e){let t=[];e.content&&e.content.length>0&&t.push(S(`assistant`,e.content));for(let n of e.toolCalls??[])t.push({type:`function_call`,call_id:n.id,name:n.function.name,arguments:n.function.arguments});return t.length===0&&t.push(S(`assistant`,``)),t}function ae(e,t){if(!t||t.length===0)return e;let n=t.map(e=>oe(e));return e.length>0&&!t.some(e=>e.type===`text`)?[{type:`input_text`,text:e},...n]:n}function oe(e){return e.type===`text`?{type:`input_text`,text:e.text}:e.type===`image_uri`?{type:`input_image`,image_url:e.uri}:{type:`input_image`,image_url:`data:${e.mimeType};base64,${e.data}`}}function S(e,t){return{role:e,content:t}}async function*se(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await ce(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function ce(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}function le(e){z(e);let t=e.output??[];return T({content:e.output_text??j(t),toolCalls:O(t),response:e,reasoning:P(t)})}async function ue(e){let t={textParts:[],toolCalls:[],reasoning:I()};for await(let n of se(e.stream,e.signal))de(t,n,e.onTextDelta);return t.completedResponse===void 0?T({content:t.textParts.join(``),toolCalls:t.toolCalls,reasoning:t.reasoning}):w(t)}function de(e,t,n){if(t.type===`response.output_text.delta`){e.textParts.push(t.delta),n?.(t.delta);return}if(t.type===`response.completed`){e.completedResponse=t.response,L(e.reasoning,P(t.response.output??[]));return}if(t.type===`response.output_item.done`){C(e,t.item);return}if(t.type===`response.error`||t.type===`response.failed`||t.type===`response.incomplete`)throw Error(`OpenAI Responses API failed: ${B(t)}`)}function C(e,t){if(k(t)){e.toolCalls.push(A(t));return}F(t)&&L(e.reasoning,P([t]))}function w(e){let t=e.completedResponse;if(t===void 0)throw Error(`OpenAI Responses stream completed without response metadata`);z(t);let n=t.output??[],r=O(n),i=e.textParts.length>0?e.textParts.join(``):t.output_text??j(n),a=P(n);return L(a,e.reasoning),T({content:i,toolCalls:r.length>0?r:e.toolCalls,response:t,reasoning:a})}function T(e){return{id:o(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:D(e.response.usage)},metadata:E(e.response,e.reasoning)}}function E(e,t){return{providerApiSurface:`responses`,...e?.id!==void 0&&{responseId:e.id},...e?.model!==void 0&&{model:e.model},...e?.status!==void 0&&{finishReason:e.status},...t.reasoningSummaryCount>0&&{reasoningSummaryCount:t.reasoningSummaryCount,reasoningSummaries:t.reasoningSummaries},...t.hasEncryptedReasoning&&{hasEncryptedReasoning:!0}}}function D(e){return{promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:e.total_tokens??0}}function O(e){return e.filter(k).map(e=>A(e))}function k(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function A(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function j(e){return e.filter(N).flatMap(e=>e.content).map(M).join(``)}function M(e){return e.type===`refusal`?e.refusal:e.text}function N(e){return e.type===`message`&&`content`in e&&Array.isArray(e.content)}function P(e){let t=I();for(let n of e){if(!F(n))continue;let e=n.summary?.map(e=>e.text).filter(R)??[];t.reasoningSummaryCount+=e.length,t.reasoningSummaries.push(...e),t.hasEncryptedReasoning=t.hasEncryptedReasoning||!!n.encrypted_content}return t}function F(e){return e.type===`reasoning`}function I(){return{reasoningSummaryCount:0,reasoningSummaries:[],hasEncryptedReasoning:!1}}function L(e,t){e.reasoningSummaryCount+=t.reasoningSummaryCount,e.reasoningSummaries.push(...t.reasoningSummaries),e.hasEncryptedReasoning=e.hasEncryptedReasoning||t.hasEncryptedReasoning}function R(e){return e!==void 0}function z(e){if(e.status===`failed`||e.status===`incomplete`)throw Error(`OpenAI Responses API failed: ${e.error?.message??e.status}`)}function B(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function V(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return U({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let t=W(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`response`,payload:n}),le(n)}catch(e){let t=e.message||`OpenAI Responses API request failed`;throw Error(`OpenAI responses failed: ${t}`)}}async function*H(e){let t={deltas:[]},n=e.chatOptions?.onTextDelta??e.onTextDelta,r=U({...e,chatOptions:{...e.chatOptions,onTextDelta:e=>{n?.(e),me(t,fe(e))}}}).then(e=>he(t,e)).catch(e=>ge(t,ye(e)));yield*pe(t),await r}async function U(e){if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let t=G(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:t}),ue({stream:n(await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI Responses streaming request failed`;throw Error(`OpenAI responses stream failed: ${t}`)}}function W(e){let t=e.chatOptions?.model??e.providerOptions.defaultModel;if(!t)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let n=b(e.chatOptions?.tools,e.providerOptions.strictTools),r=ne(e.providerOptions);return{model:t,input:y(e.messages),...n!==void 0&&{tools:n,tool_choice:`auto`},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...r!==void 0&&{text:r},...e.providerOptions.reasoning!==void 0&&{reasoning:e.providerOptions.reasoning},...e.providerOptions.includeEncryptedReasoning===!0&&{include:[`reasoning.encrypted_content`]},...e.providerOptions.store!==void 0&&{store:e.providerOptions.store}}}function G(e){return{...W(e),stream:!0}}function fe(e){return{id:o(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{providerApiSurface:`responses`,isStreamChunk:!0,isComplete:!1}}}async function*pe(e){for(;;){let t=e.deltas.shift();if(t!==void 0){yield t;continue}if(e.error!==void 0)throw e.error;if(e.finalMessage!==void 0){yield ve(e.finalMessage);return}await _e(e)}}function me(e,t){e.deltas.push(t),K(e)}function he(e,t){e.finalMessage=t,K(e)}function ge(e,t){e.error=t,K(e)}function _e(e){return new Promise(t=>{e.wake=t})}function K(e){e.wake?.(),e.wake=void 0}function ve(e){return{...e,content:``,metadata:{...e.metadata,isStreamChunk:!0,isComplete:!0}}}function ye(e){return e instanceof Error?e:Error(String(e))}var q=class extends ee{name=`openai`;version=`1.0.0`;client;options;apiSurface;payloadLogger;responseParser;onTextDelta;constructor(e){if(super(e.logger||s),this.options=e,this.apiSurface=be(e),xe(this.apiSurface,e.nativeWebTools),e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client;else if(e.apiKey)this.client=new c({apiKey:e.apiKey,...e.organization&&{organization:e.organization},...e.timeout&&{timeout:e.timeout},...e.baseURL&&{baseURL:e.baseURL}});else throw Error(`Either OpenAI client, apiKey, or executor is required`);this.responseParser=new l(this.logger),this.payloadLogger=e.payloadLogger}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(`OpenAI Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}return this.apiSurface===`responses`?V({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta}):p({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}async*chatStream(e,t){if(this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,t);return}catch(e){throw this.logger.error(`OpenAI Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(this.apiSurface===`responses`){yield*H({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta});return}yield*m({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}supportsTools(){return!0}getCapabilities(){let e=this.apiSurface===`chat-completions`?`openai-compatible-chat-completions`:`openai-responses`;return{functionCalling:{supported:!0},nativeWebTools:{webSearch:{supported:!1,enabled:!1,source:e,reason:J(this.apiSurface,`search`)},webFetch:{supported:!1,enabled:!1,source:e,reason:J(this.apiSurface,`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}}};function be(e){return e.apiSurface===void 0?e.baseURL?`chat-completions`:`responses`:e.apiSurface}function J(e,t){return e===`chat-completions`?`OpenAI-compatible Chat Completions endpoints support declared function tools, not provider-native web ${t}.`:`OpenAI Responses native web ${t} is not wired in this Robota provider version.`}function xe(e,t){if(!(t?.webSearch!==!0&&t?.webFetch!==!0))throw Error(`Provider openai native web search/fetch is not supported for apiSurface ${e} in this Robota provider version.`)}var Se=class{static filterMessagesForOpenAI(e){return e.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`system`?!0:e.role===`tool`?!!(e.toolCallId&&e.toolCallId.trim()!==``&&e.toolCallId!==`unknown`):!1)}static toOpenAIFormat(e){return this.filterMessagesForOpenAI(e).map(e=>this.convertMessage(e))}static convertMessage(e){let t=e.role;if(t===`user`)return{role:`user`,content:e.content};if(t===`assistant`){let t=e;return t.toolCalls&&t.toolCalls.length>0?{role:`assistant`,content:t.content===``?null:t.content||null,tool_calls:t.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}))}:{role:`assistant`,content:t.content===null||t.content===``?null:t.content||``}}if(t===`system`)return{role:`system`,content:e.content};if(t===`tool`){if(!e.toolCallId||e.toolCallId.trim()===``)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return{role:`tool`,content:e.content,tool_call_id:e.toolCallId}}throw Error(`Unsupported message role: ${t}`)}static addSystemPromptIfNeeded(e,t){return!t||e.some(e=>e.role===`system`)?e:[{role:`system`,content:t},...e]}};const Y=`https://platform.openai.com/docs/api-reference/models/list`;async function X(e,t={}){if(!e.apiKey)return Z(`OpenAI model catalog refresh requires apiKey.`);let n=t.fetcher??Ee,r=t.now??(()=>new Date),i=Ce(e.baseURL);try{let t=await n(i,{headers:{Authorization:`Bearer ${e.apiKey}`}});if(!t.ok)return Z(Te(t));let a=we(await t.json());return{status:`live`,entries:a,lastVerifiedAt:r().toISOString(),sourceUrl:Y,message:`${a.length} OpenAI model(s) discovered.`}}catch(e){return Z(e instanceof Error?e.message:String(e))}}function Ce(e){return e?`${e.replace(/\/$/,``)}/models`:`https://api.openai.com/v1/models`}function we(e){return(e.data??[]).map(e=>e.id).filter(e=>e!==void 0&&e.trim().length>0).map(e=>({id:e,displayName:e,lifecycle:`active`}))}function Te(e){let t=e.statusText?` ${e.statusText}`:``;return`OpenAI model catalog refresh failed: HTTP ${e.status}${t}`}function Z(e){return{status:`unavailable`,sourceUrl:Y,message:e}}async function Ee(e,t){let n=await fetch(e,t);return{ok:n.ok,status:n.status,statusText:n.statusText,json:()=>n.json()}}const De=void 0,Q=`$ENV:OPENAI_API_KEY`,Oe=[{kind:`api-key`,label:`OpenAI API keys`,url:`https://platform.openai.com/api-keys`,sourceUrl:`https://developers.openai.com/api/reference/overview#authentication`,lastVerifiedAt:`2026-05-08`}];function ke(){return{type:`openai`,displayName:`OpenAI`,description:`Official OpenAI Responses API provider`,defaults:{apiKey:Q},modelCatalog:{status:`unavailable`,sourceUrl:`https://platform.openai.com/docs/api-reference/models/list`,message:`OpenAI model availability should be discovered live from GET /v1/models.`},setupHelpLinks:Oe,setupSteps:[{key:`model`,title:`OpenAI model`,required:!0},{key:`apiKey`,title:`OpenAI API key`,defaultValue:Q,masked:!0}],requiresApiKey:!0,probeProfile:a,refreshModelCatalog:({profile:e})=>X(e),modelCatalogCacheTtlSeconds:86400,createProvider:e=>{let t=je(e.options),n=Me(e.options);return Ne(e.baseURL,t,n),new q({apiKey:Ae(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout},...t!==void 0&&{apiSurface:t},...n!==void 0&&{nativeWebTools:n},defaultModel:e.model})}}}function Ae(e){if(!e)throw Error(`Provider openai requires apiKey`);return e}function je(e){let t=e?.apiSurface;if(t===`responses`||t===`chat-completions`)return t}function Me(e){let t=$(e?.nativeWebTools)??$(e?.builtInWebTools);if(t!==void 0)return t}function $(e){if(e==null||e instanceof Date||Array.isArray(e)||typeof e!=`object`)return;let t=e.webSearch,n=e.webFetch;return{...typeof t==`boolean`&&{webSearch:t},...typeof n==`boolean`&&{webFetch:n}}}function Ne(e,t,n){if(!(n?.webSearch!==!0&&n?.webFetch!==!0))throw Error(e!==void 0||t===`chat-completions`?`Provider openai profile uses an OpenAI-compatible Chat Completions endpoint; native web search/fetch is not supported for this profile. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.`:`Provider openai native web search/fetch is not wired in this Robota provider version. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.`)}export{Se as a,X as i,De as n,q as o,ke as r,Q as t};
2
- //# sourceMappingURL=openai-CRQjg4xF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-CRQjg4xF.js","names":["openaiError","assembleOpenAIStream","openaiError","exhaustive"],"sources":["../../src/openai/parsers/response-parser.ts","../../src/openai/openai-request-format.ts","../../src/openai/message-converter.ts","../../src/openai/chat-completions-chat.ts","../../src/openai/responses-converter.ts","../../src/openai/responses-stream-utils.ts","../../src/openai/responses-parser.ts","../../src/openai/responses-chat.ts","../../src/openai/provider.ts","../../src/openai/adapter.ts","../../src/openai/model-catalog-refresh.ts","../../src/openai/provider-definition.ts"],"sourcesContent":["import type OpenAI from 'openai';\nimport type { ILogger, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { OpenAICompatibleResponseParser } from '../../shared/openai-compatible/index.js';\n\n/**\n * OpenAI response parser compatibility wrapper.\n *\n * The implementation delegates to the shared OpenAI-compatible parser while\n * preserving the OpenAI-branded error messages that are part of this package's\n * current test contract.\n */\nexport class OpenAIResponseParser {\n private readonly parser: OpenAICompatibleResponseParser;\n\n constructor(logger?: ILogger) {\n this.parser = new OpenAICompatibleResponseParser({ logger });\n }\n\n parseResponse(response: OpenAI.Chat.ChatCompletion): TUniversalMessage {\n try {\n return this.parser.parseResponse(response);\n } catch (error) {\n const message = normalizeParserMessage(\n error instanceof Error ? error.message : 'OpenAI response parsing failed',\n );\n throw new Error(`OpenAI response parsing failed: ${message}`);\n }\n }\n\n parseStreamingChunk(chunk: OpenAI.Chat.ChatCompletionChunk): TUniversalMessage | null {\n try {\n return this.parser.parseStreamingChunk(chunk);\n } catch (error) {\n const message = normalizeParserMessage(\n error instanceof Error ? error.message : 'OpenAI chunk parsing failed',\n );\n throw new Error(`OpenAI chunk parsing failed: ${message}`);\n }\n }\n}\n\nfunction normalizeParserMessage(message: string): string {\n return message\n .replace(/^OpenAI-compatible response parsing failed: /, '')\n .replace(/^OpenAI-compatible chunk parsing failed: /, '')\n .replace('OpenAI-compatible response', 'OpenAI response');\n}\n","import type { IOpenAIProviderOptions, TOpenAIProviderOptionValue } from './types';\nimport type {\n IOpenAIResponsesTextConfig,\n IOpenAIResponsesTextFormatJsonSchema,\n} from './responses-types';\n\nexport interface IOpenAIChatTextFormatText {\n type: 'text';\n}\n\nexport interface IOpenAIChatTextFormatJsonObject {\n type: 'json_object';\n}\n\nexport interface IOpenAIChatTextFormatJsonSchema {\n type: 'json_schema';\n json_schema: {\n name: string;\n schema: Record<string, TOpenAIProviderOptionValue>;\n description?: string;\n strict?: boolean;\n };\n}\n\nexport type TOpenAIChatResponseFormat =\n | IOpenAIChatTextFormatText\n | IOpenAIChatTextFormatJsonObject\n | IOpenAIChatTextFormatJsonSchema;\n\nexport function buildOpenAIChatResponseFormat(\n options: IOpenAIProviderOptions,\n): TOpenAIChatResponseFormat | undefined {\n if (options.responseFormat === undefined || options.responseFormat === 'text') {\n return undefined;\n }\n if (options.responseFormat === 'json_object') {\n return { type: 'json_object' };\n }\n\n const schema = requireJsonSchema(options);\n return {\n type: 'json_schema',\n json_schema: {\n name: schema.name,\n schema: schema.schema,\n ...(schema.description !== undefined && { description: schema.description }),\n ...(schema.strict !== undefined && { strict: schema.strict }),\n },\n };\n}\n\nexport function buildOpenAIResponsesTextConfig(\n options: IOpenAIProviderOptions,\n): IOpenAIResponsesTextConfig | undefined {\n if (options.responseFormat === undefined || options.responseFormat === 'text') {\n return undefined;\n }\n if (options.responseFormat === 'json_object') {\n return { format: { type: 'json_object' } };\n }\n\n const schema = requireJsonSchema(options);\n const format: IOpenAIResponsesTextFormatJsonSchema = {\n type: 'json_schema',\n name: schema.name,\n schema: schema.schema,\n ...(schema.description !== undefined && { description: schema.description }),\n ...(schema.strict !== undefined && { strict: schema.strict }),\n };\n return { format };\n}\n\nfunction requireJsonSchema(input: IOpenAIProviderOptions): {\n name: string;\n schema: Record<string, TOpenAIProviderOptionValue>;\n description?: string;\n strict?: boolean;\n} {\n const schema = input.jsonSchema;\n if (input.responseFormat !== 'json_schema') {\n throw new Error(`Unsupported OpenAI response format: ${input.responseFormat}`);\n }\n if (!schema?.schema) {\n throw new Error('OpenAI jsonSchema.schema is required when responseFormat is json_schema');\n }\n return {\n name: schema.name,\n schema: schema.schema,\n ...(schema.description !== undefined && { description: schema.description }),\n ...(schema.strict !== undefined && { strict: schema.strict }),\n };\n}\n","import type OpenAI from 'openai';\nimport type { IToolSchema, TUniversalMessage } from '@robota-sdk/agent-core';\nimport {\n convertToOpenAICompatibleMessages,\n convertToOpenAICompatibleTools,\n} from '../shared/openai-compatible/index.js';\n\n/**\n * Convert TUniversalMessage array to OpenAI chat completion message format.\n */\nexport function convertToOpenAIMessages(\n messages: TUniversalMessage[],\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n return convertToOpenAICompatibleMessages(messages);\n}\n\n/**\n * Convert tool schemas to OpenAI function tool format.\n */\nexport function convertToOpenAITools(tools: IToolSchema[]): OpenAI.Chat.ChatCompletionTool[] {\n return convertToOpenAICompatibleTools(tools);\n}\n","import type OpenAI from 'openai';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { observeProviderNativeRawPayloadStream } from '../shared/openai-compatible/index.js';\nimport type { IPayloadLogger } from './interfaces/payload-logger';\nimport type { IOpenAIError, IOpenAILogData } from './types/api-types';\nimport type { IOpenAIProviderOptions } from './types';\nimport { buildOpenAIChatResponseFormat } from './openai-request-format';\nimport { convertToOpenAIMessages, convertToOpenAITools } from './message-converter';\nimport { OpenAIResponseParser } from './parsers/response-parser';\nimport { assembleOpenAIStream } from './streaming/stream-assembler';\n\nexport interface IOpenAIChatCompletionsOptions {\n client?: OpenAI;\n messages: TUniversalMessage[];\n chatOptions?: IChatOptions;\n providerOptions: IOpenAIProviderOptions;\n payloadLogger?: IPayloadLogger;\n responseParser: OpenAIResponseParser;\n onTextDelta?: TTextDeltaCallback;\n}\n\nexport async function chatWithOpenAIChatCompletions(\n input: IOpenAIChatCompletionsOptions,\n): Promise<TUniversalMessage> {\n const client = requireClient(input.client);\n\n try {\n const requestParams = buildChatRequestParams(input);\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n if (textDeltaCb) {\n return await chatWithStreamingAssembly(client, input, {\n ...requestParams,\n stream: true,\n });\n }\n\n await logPayload(input, requestParams, 'chat');\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await client.chat.completions.create(requestParams);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'response',\n payload: response,\n });\n return input.responseParser.parseResponse(response);\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI API request failed';\n throw new Error(`OpenAI chat failed: ${errorMessage}`);\n }\n}\n\nexport async function* chatStreamWithOpenAIChatCompletions(\n input: IOpenAIChatCompletionsOptions,\n): AsyncIterable<TUniversalMessage> {\n const client = requireClient(input.client);\n\n try {\n const requestParams: OpenAI.Chat.ChatCompletionCreateParamsStreaming = {\n ...buildChatRequestParams(input),\n stream: true,\n };\n\n await logPayload(input, requestParams, 'stream');\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n\n for await (const chunk of observeProviderNativeRawPayloadStream(stream, {\n provider: 'openai',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n })) {\n const universalMessage = input.responseParser.parseStreamingChunk(chunk);\n if (universalMessage) {\n yield universalMessage;\n }\n }\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI API request failed';\n throw new Error(`OpenAI stream failed: ${errorMessage}`);\n }\n}\n\nfunction buildChatRequestParams(\n input: IOpenAIChatCompletionsOptions,\n): OpenAI.Chat.ChatCompletionCreateParamsNonStreaming {\n const openaiMessages = convertToOpenAIMessages(input.messages);\n const model = input.chatOptions?.model ?? input.providerOptions.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 responseFormat = buildOpenAIChatResponseFormat(input.providerOptions);\n return {\n model,\n messages: openaiMessages,\n ...(input.chatOptions?.temperature !== undefined && {\n temperature: input.chatOptions.temperature,\n }),\n ...(input.chatOptions?.maxTokens !== undefined && { max_tokens: input.chatOptions.maxTokens }),\n ...(input.chatOptions?.tools && {\n tools: convertToOpenAITools(input.chatOptions.tools),\n tool_choice: 'auto',\n }),\n ...(responseFormat !== undefined && { response_format: responseFormat }),\n } as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming;\n}\n\nasync function chatWithStreamingAssembly(\n client: OpenAI,\n input: IOpenAIChatCompletionsOptions,\n requestParams: OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n): Promise<TUniversalMessage> {\n try {\n await logPayload(input, requestParams, 'stream');\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n\n return assembleOpenAIStream({\n stream: observeProviderNativeRawPayloadStream(stream, {\n provider: 'openai',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n }),\n onTextDelta: input.chatOptions?.onTextDelta ?? input.onTextDelta,\n signal: input.chatOptions?.signal,\n });\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI streaming request failed';\n throw new Error(`OpenAI stream failed: ${errorMessage}`);\n }\n}\n\nasync function logPayload(\n input: IOpenAIChatCompletionsOptions,\n requestParams:\n | OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n | OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n type: 'chat' | 'stream',\n): Promise<void> {\n if (!input.payloadLogger?.isEnabled()) {\n return;\n }\n\n const logData: IOpenAILogData = {\n model: requestParams.model,\n messagesCount: requestParams.messages.length,\n hasTools: !!requestParams.tools,\n temperature: requestParams.temperature ?? undefined,\n maxTokens: requestParams.max_tokens ?? undefined,\n timestamp: new Date().toISOString(),\n };\n await input.payloadLogger.logPayload(logData, type);\n}\n\nfunction requireClient(client: OpenAI | undefined): OpenAI {\n if (!client) {\n throw new Error(\n 'OpenAI client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n return client;\n}\n","import type {\n IAssistantMessage,\n IToolSchema,\n TUniversalMessage,\n TUniversalMessagePart,\n} from '@robota-sdk/agent-core';\nimport type {\n IOpenAIResponsesFunctionTool,\n IOpenAIResponsesMessageInput,\n TOpenAIResponsesInputContent,\n TOpenAIResponsesInputItem,\n} from './responses-types';\n\nexport function convertToOpenAIResponsesInput(\n messages: TUniversalMessage[],\n): TOpenAIResponsesInputItem[] {\n return messages.flatMap((message) => convertMessage(message));\n}\n\nexport function convertToOpenAIResponsesTools(\n tools: IToolSchema[] | undefined,\n strictTools: boolean | undefined,\n): IOpenAIResponsesFunctionTool[] | undefined {\n const converted =\n tools?.map((tool) => ({\n type: 'function' as const,\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n strict: strictTools ?? false,\n })) ?? [];\n return converted.length > 0 ? converted : undefined;\n}\n\nfunction convertMessage(message: TUniversalMessage): TOpenAIResponsesInputItem[] {\n if (message.role === 'user') {\n return [createMessageInput('user', getUserContent(message.content, message.parts))];\n }\n if (message.role === 'system') {\n return [createMessageInput('system', message.content)];\n }\n if (message.role === 'tool') {\n if (!message.toolCallId || message.toolCallId.trim().length === 0) {\n throw new Error(`Tool message missing toolCallId: ${JSON.stringify(message)}`);\n }\n return [\n {\n type: 'function_call_output',\n call_id: message.toolCallId,\n output: message.content || '',\n },\n ];\n }\n return convertAssistantMessage(message);\n}\n\nfunction convertAssistantMessage(message: IAssistantMessage): TOpenAIResponsesInputItem[] {\n const items: TOpenAIResponsesInputItem[] = [];\n if (message.content && message.content.length > 0) {\n items.push(createMessageInput('assistant', message.content));\n }\n for (const toolCall of message.toolCalls ?? []) {\n items.push({\n type: 'function_call',\n call_id: toolCall.id,\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n });\n }\n if (items.length === 0) {\n items.push(createMessageInput('assistant', ''));\n }\n return items;\n}\n\nfunction getUserContent(\n content: string,\n parts: TUniversalMessagePart[] | undefined,\n): string | TOpenAIResponsesInputContent[] {\n if (!parts || parts.length === 0) {\n return content;\n }\n\n const converted = parts.map((part) => convertPart(part));\n if (content.length > 0 && !parts.some((part) => part.type === 'text')) {\n return [{ type: 'input_text', text: content }, ...converted];\n }\n return converted;\n}\n\nfunction convertPart(part: TUniversalMessagePart): TOpenAIResponsesInputContent {\n if (part.type === 'text') {\n return { type: 'input_text', text: part.text };\n }\n if (part.type === 'image_uri') {\n return { type: 'input_image', image_url: part.uri };\n }\n return {\n type: 'input_image',\n image_url: `data:${part.mimeType};base64,${part.data}`,\n };\n}\n\nfunction createMessageInput(\n role: IOpenAIResponsesMessageInput['role'],\n content: string | TOpenAIResponsesInputContent[],\n): IOpenAIResponsesMessageInput {\n return {\n role,\n content,\n };\n}\n","export async function* streamWithAbort<T>(\n source: AsyncIterable<T>,\n signal?: AbortSignal,\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]();\n try {\n while (!signal?.aborted) {\n const item = await nextStreamItem(iterator, signal);\n if (item.done || signal?.aborted) {\n break;\n }\n yield item.value;\n }\n } finally {\n if (signal?.aborted) {\n await iterator.return?.();\n }\n }\n}\n\nasync function nextStreamItem<T>(\n iterator: AsyncIterator<T>,\n signal?: AbortSignal,\n): Promise<IteratorResult<T>> {\n if (!signal) {\n return iterator.next();\n }\n if (signal.aborted) {\n return { done: true, value: undefined as T };\n }\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<IteratorResult<T>>((resolve) => {\n abortListener = (): void => resolve({ done: true, value: undefined as T });\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([iterator.next(), aborted]);\n } finally {\n if (abortListener) {\n signal.removeEventListener('abort', abortListener);\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { IToolCall, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type {\n IOpenAIResponsesErrorEvent,\n IOpenAIResponsesFunctionCallOutputItem,\n IOpenAIResponsesMessageOutputItem,\n IOpenAIResponsesReasoningOutputItem,\n IOpenAIResponsesResponse,\n IOpenAIResponsesUsage,\n TOpenAIResponsesOutputContent,\n TOpenAIResponsesOutputItem,\n TOpenAIResponsesStreamEvent,\n} from './responses-types';\nimport { streamWithAbort } from './responses-stream-utils';\n\ninterface IOpenAIResponsesStreamAssemblyOptions {\n stream: AsyncIterable<TOpenAIResponsesStreamEvent>;\n onTextDelta?: TTextDeltaCallback;\n signal?: AbortSignal;\n}\n\ninterface IOpenAIResponsesReasoningMetadata {\n reasoningSummaryCount: number;\n reasoningSummaries: string[];\n hasEncryptedReasoning: boolean;\n}\n\ninterface IOpenAIResponseUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\ninterface IOpenAIResponsesStreamState {\n textParts: string[];\n toolCalls: IToolCall[];\n completedResponse?: IOpenAIResponsesResponse;\n reasoning: IOpenAIResponsesReasoningMetadata;\n}\n\nexport function parseOpenAIResponsesResponse(\n response: IOpenAIResponsesResponse,\n): TUniversalMessage {\n assertUsableResponse(response);\n const output = response.output ?? [];\n const content = response.output_text ?? extractMessageText(output);\n return buildAssistantMessage({\n content,\n toolCalls: extractFunctionToolCalls(output),\n response,\n reasoning: collectReasoningMetadata(output),\n });\n}\n\nexport async function assembleOpenAIResponsesStream(\n options: IOpenAIResponsesStreamAssemblyOptions,\n): Promise<TUniversalMessage> {\n const state: IOpenAIResponsesStreamState = {\n textParts: [],\n toolCalls: [],\n reasoning: createEmptyReasoningMetadata(),\n };\n\n for await (const event of streamWithAbort(options.stream, options.signal)) {\n applyStreamEvent(state, event, options.onTextDelta);\n }\n\n if (state.completedResponse !== undefined) {\n return buildMessageFromCompletedResponse(state);\n }\n\n return buildAssistantMessage({\n content: state.textParts.join(''),\n toolCalls: state.toolCalls,\n reasoning: state.reasoning,\n });\n}\n\nfunction applyStreamEvent(\n state: IOpenAIResponsesStreamState,\n event: TOpenAIResponsesStreamEvent,\n onTextDelta: TTextDeltaCallback | undefined,\n): void {\n if (event.type === 'response.output_text.delta') {\n state.textParts.push(event.delta);\n onTextDelta?.(event.delta);\n return;\n }\n\n if (event.type === 'response.completed') {\n state.completedResponse = event.response;\n mergeReasoningMetadata(state.reasoning, collectReasoningMetadata(event.response.output ?? []));\n return;\n }\n\n if (event.type === 'response.output_item.done') {\n applyOutputItem(state, event.item);\n return;\n }\n\n if (\n event.type === 'response.error' ||\n event.type === 'response.failed' ||\n event.type === 'response.incomplete'\n ) {\n throw new Error(`OpenAI Responses API failed: ${extractErrorMessage(event)}`);\n }\n}\n\nfunction applyOutputItem(\n state: IOpenAIResponsesStreamState,\n item: TOpenAIResponsesOutputItem,\n): void {\n if (isFunctionCallOutputItem(item)) {\n state.toolCalls.push(convertFunctionCall(item));\n return;\n }\n if (isReasoningOutputItem(item)) {\n mergeReasoningMetadata(state.reasoning, collectReasoningMetadata([item]));\n }\n}\n\nfunction buildMessageFromCompletedResponse(state: IOpenAIResponsesStreamState): TUniversalMessage {\n const response = state.completedResponse;\n if (response === undefined) {\n throw new Error('OpenAI Responses stream completed without response metadata');\n }\n\n assertUsableResponse(response);\n const output = response.output ?? [];\n const responseToolCalls = extractFunctionToolCalls(output);\n const content =\n state.textParts.length > 0\n ? state.textParts.join('')\n : (response.output_text ?? extractMessageText(output));\n const reasoning = collectReasoningMetadata(output);\n mergeReasoningMetadata(reasoning, state.reasoning);\n\n return buildAssistantMessage({\n content,\n toolCalls: responseToolCalls.length > 0 ? responseToolCalls : state.toolCalls,\n response,\n reasoning,\n });\n}\n\nfunction buildAssistantMessage(input: {\n content: string;\n toolCalls: IToolCall[];\n response?: IOpenAIResponsesResponse;\n reasoning: IOpenAIResponsesReasoningMetadata;\n}): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content: input.content,\n state: 'complete',\n timestamp: new Date(),\n ...(input.toolCalls.length > 0 && { toolCalls: input.toolCalls }),\n ...(input.response?.usage !== undefined && { usage: mapUsage(input.response.usage) }),\n metadata: buildMetadata(input.response, input.reasoning),\n };\n}\n\nfunction buildMetadata(\n response: IOpenAIResponsesResponse | undefined,\n reasoning: IOpenAIResponsesReasoningMetadata,\n): NonNullable<TUniversalMessage['metadata']> {\n return {\n providerApiSurface: 'responses',\n ...(response?.id !== undefined && { responseId: response.id }),\n ...(response?.model !== undefined && { model: response.model }),\n ...(response?.status !== undefined && { finishReason: response.status }),\n ...(reasoning.reasoningSummaryCount > 0 && {\n reasoningSummaryCount: reasoning.reasoningSummaryCount,\n reasoningSummaries: reasoning.reasoningSummaries,\n }),\n ...(reasoning.hasEncryptedReasoning && { hasEncryptedReasoning: true }),\n };\n}\n\nfunction mapUsage(usage: IOpenAIResponsesUsage): IOpenAIResponseUsage {\n return {\n promptTokens: usage.input_tokens ?? 0,\n completionTokens: usage.output_tokens ?? 0,\n totalTokens: usage.total_tokens ?? 0,\n };\n}\n\nfunction extractFunctionToolCalls(output: readonly TOpenAIResponsesOutputItem[]): IToolCall[] {\n return output.filter(isFunctionCallOutputItem).map((item) => convertFunctionCall(item));\n}\n\nfunction isFunctionCallOutputItem(\n item: TOpenAIResponsesOutputItem,\n): item is IOpenAIResponsesFunctionCallOutputItem {\n return (\n item.type === 'function_call' && 'call_id' in item && 'name' in item && 'arguments' in item\n );\n}\n\nfunction convertFunctionCall(item: IOpenAIResponsesFunctionCallOutputItem): IToolCall {\n return {\n id: item.call_id,\n type: 'function',\n function: {\n name: item.name,\n arguments: item.arguments,\n },\n };\n}\n\nfunction extractMessageText(output: readonly TOpenAIResponsesOutputItem[]): string {\n return output\n .filter(isMessageOutputItem)\n .flatMap((item) => item.content)\n .map(extractTextContent)\n .join('');\n}\n\nfunction extractTextContent(content: TOpenAIResponsesOutputContent): string {\n if (content.type === 'refusal') {\n return content.refusal;\n }\n return content.text;\n}\n\nfunction isMessageOutputItem(\n item: TOpenAIResponsesOutputItem,\n): item is IOpenAIResponsesMessageOutputItem {\n return item.type === 'message' && 'content' in item && Array.isArray(item.content);\n}\n\nfunction collectReasoningMetadata(\n output: readonly TOpenAIResponsesOutputItem[],\n): IOpenAIResponsesReasoningMetadata {\n const metadata = createEmptyReasoningMetadata();\n for (const item of output) {\n if (!isReasoningOutputItem(item)) {\n continue;\n }\n const summaries = item.summary?.map((summary) => summary.text).filter(isString) ?? [];\n metadata.reasoningSummaryCount += summaries.length;\n metadata.reasoningSummaries.push(...summaries);\n metadata.hasEncryptedReasoning = metadata.hasEncryptedReasoning || !!item.encrypted_content;\n }\n return metadata;\n}\n\nfunction isReasoningOutputItem(\n item: TOpenAIResponsesOutputItem,\n): item is IOpenAIResponsesReasoningOutputItem {\n return item.type === 'reasoning';\n}\n\nfunction createEmptyReasoningMetadata(): IOpenAIResponsesReasoningMetadata {\n return {\n reasoningSummaryCount: 0,\n reasoningSummaries: [],\n hasEncryptedReasoning: false,\n };\n}\n\nfunction mergeReasoningMetadata(\n target: IOpenAIResponsesReasoningMetadata,\n source: IOpenAIResponsesReasoningMetadata,\n): void {\n target.reasoningSummaryCount += source.reasoningSummaryCount;\n target.reasoningSummaries.push(...source.reasoningSummaries);\n target.hasEncryptedReasoning = target.hasEncryptedReasoning || source.hasEncryptedReasoning;\n}\n\nfunction isString(value: string | undefined): value is string {\n return value !== undefined;\n}\n\nfunction assertUsableResponse(response: IOpenAIResponsesResponse): void {\n if (response.status === 'failed' || response.status === 'incomplete') {\n throw new Error(`OpenAI Responses API failed: ${response.error?.message ?? response.status}`);\n }\n}\n\nfunction extractErrorMessage(event: IOpenAIResponsesErrorEvent): string {\n return event.message ?? event.error?.message ?? event.response?.error?.message ?? 'unknown error';\n}\n","import { randomUUID } from 'node:crypto';\nimport type OpenAI from 'openai';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { observeProviderNativeRawPayloadStream } from '../shared/openai-compatible/index.js';\nimport type { IOpenAIError } from './types/api-types';\nimport type { IOpenAIProviderOptions } from './types';\nimport { buildOpenAIResponsesTextConfig } from './openai-request-format';\nimport {\n convertToOpenAIResponsesInput,\n convertToOpenAIResponsesTools,\n} from './responses-converter';\nimport { assembleOpenAIResponsesStream, parseOpenAIResponsesResponse } from './responses-parser';\nimport type {\n IOpenAIResponsesRequestNonStreaming,\n IOpenAIResponsesRequestStreaming,\n TOpenAIResponsesStreamEvent,\n} from './responses-types';\n\nexport interface IOpenAIResponsesChatOptions {\n client?: OpenAI;\n messages: TUniversalMessage[];\n chatOptions?: IChatOptions;\n providerOptions: IOpenAIProviderOptions;\n onTextDelta?: TTextDeltaCallback;\n}\n\ninterface IResponsesStreamMessageQueue {\n deltas: TUniversalMessage[];\n finalMessage?: TUniversalMessage;\n error?: Error;\n wake?: () => void;\n}\n\nexport async function chatWithOpenAIResponsesApi(\n input: IOpenAIResponsesChatOptions,\n): Promise<TUniversalMessage> {\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n if (textDeltaCb) {\n return chatWithOpenAIResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: textDeltaCb,\n },\n });\n }\n\n if (!input.client) {\n throw new Error('OpenAI Responses client not available.');\n }\n\n try {\n const requestParams = buildResponsesRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'responses',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await input.client.responses.create(\n requestParams as OpenAI.Responses.ResponseCreateParamsNonStreaming,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'responses',\n payloadKind: 'response',\n payload: response,\n });\n return parseOpenAIResponsesResponse(response);\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI Responses API request failed';\n throw new Error(`OpenAI responses failed: ${errorMessage}`);\n }\n}\n\nexport async function* chatStreamWithOpenAIResponsesApi(\n input: IOpenAIResponsesChatOptions,\n): AsyncIterable<TUniversalMessage> {\n const queue: IResponsesStreamMessageQueue = { deltas: [] };\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n const assembly = chatWithOpenAIResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: (delta) => {\n textDeltaCb?.(delta);\n enqueueStreamDelta(queue, createStreamDeltaMessage(delta));\n },\n },\n })\n .then((result) => finishStreamQueue(queue, result))\n .catch((error) => failStreamQueue(queue, toError(error)));\n\n yield* drainResponsesStreamQueue(queue);\n await assembly;\n}\n\nasync function chatWithOpenAIResponsesStreamingAssembly(\n input: IOpenAIResponsesChatOptions,\n): Promise<TUniversalMessage> {\n if (!input.client) {\n throw new Error('OpenAI Responses client not available.');\n }\n\n try {\n const requestParams = buildResponsesStreamingRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'responses',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await input.client.responses.create(\n requestParams as OpenAI.Responses.ResponseCreateParamsStreaming,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n return assembleOpenAIResponsesStream({\n stream: observeProviderNativeRawPayloadStream(\n stream as AsyncIterable<TOpenAIResponsesStreamEvent>,\n {\n provider: 'openai',\n apiSurface: 'responses',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n },\n ),\n onTextDelta: input.chatOptions?.onTextDelta,\n signal: input.chatOptions?.signal,\n });\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI Responses streaming request failed';\n throw new Error(`OpenAI responses stream failed: ${errorMessage}`);\n }\n}\n\nfunction buildResponsesRequestParams(\n input: IOpenAIResponsesChatOptions,\n): IOpenAIResponsesRequestNonStreaming {\n const model = input.chatOptions?.model ?? input.providerOptions.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 tools = convertToOpenAIResponsesTools(\n input.chatOptions?.tools,\n input.providerOptions.strictTools,\n );\n const textConfig = buildOpenAIResponsesTextConfig(input.providerOptions);\n return {\n model,\n input: convertToOpenAIResponsesInput(input.messages),\n ...(tools !== undefined && { tools, tool_choice: 'auto' }),\n ...(input.chatOptions?.temperature !== undefined && {\n temperature: input.chatOptions.temperature,\n }),\n ...(input.chatOptions?.maxTokens !== undefined && {\n max_output_tokens: input.chatOptions.maxTokens,\n }),\n ...(textConfig !== undefined && { text: textConfig }),\n ...(input.providerOptions.reasoning !== undefined && {\n reasoning: input.providerOptions.reasoning,\n }),\n ...(input.providerOptions.includeEncryptedReasoning === true && {\n include: ['reasoning.encrypted_content'],\n }),\n ...(input.providerOptions.store !== undefined && { store: input.providerOptions.store }),\n };\n}\n\nfunction buildResponsesStreamingRequestParams(\n input: IOpenAIResponsesChatOptions,\n): IOpenAIResponsesRequestStreaming {\n return {\n ...buildResponsesRequestParams(input),\n stream: true,\n };\n}\n\nfunction createStreamDeltaMessage(delta: string): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content: delta,\n state: 'complete',\n timestamp: new Date(),\n metadata: {\n providerApiSurface: 'responses',\n isStreamChunk: true,\n isComplete: false,\n },\n };\n}\n\nasync function* drainResponsesStreamQueue(\n queue: IResponsesStreamMessageQueue,\n): AsyncIterable<TUniversalMessage> {\n while (true) {\n const next = queue.deltas.shift();\n if (next !== undefined) {\n yield next;\n continue;\n }\n if (queue.error !== undefined) {\n throw queue.error;\n }\n if (queue.finalMessage !== undefined) {\n yield createFinalStreamMessage(queue.finalMessage);\n return;\n }\n await waitForStreamQueue(queue);\n }\n}\n\nfunction enqueueStreamDelta(queue: IResponsesStreamMessageQueue, message: TUniversalMessage): void {\n queue.deltas.push(message);\n wakeStreamQueue(queue);\n}\n\nfunction finishStreamQueue(queue: IResponsesStreamMessageQueue, result: TUniversalMessage): void {\n queue.finalMessage = result;\n wakeStreamQueue(queue);\n}\n\nfunction failStreamQueue(queue: IResponsesStreamMessageQueue, error: Error): void {\n queue.error = error;\n wakeStreamQueue(queue);\n}\n\nfunction waitForStreamQueue(queue: IResponsesStreamMessageQueue): Promise<void> {\n return new Promise((resolve) => {\n queue.wake = resolve;\n });\n}\n\nfunction wakeStreamQueue(queue: IResponsesStreamMessageQueue): void {\n queue.wake?.();\n queue.wake = undefined;\n}\n\nfunction createFinalStreamMessage(result: TUniversalMessage): TUniversalMessage {\n return {\n ...result,\n content: '',\n metadata: {\n ...result.metadata,\n isStreamChunk: true,\n isComplete: true,\n },\n };\n}\n\nfunction toError(error: Error | string): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n","import OpenAI from 'openai';\nimport type { IOpenAIProviderOptions, TOpenAIApiSurface } from './types';\nimport { AbstractAIProvider } from '@robota-sdk/agent-core';\nimport type {\n TUniversalMessage,\n IChatOptions,\n IAssistantMessage,\n IProviderCapabilities,\n TTextDeltaCallback,\n} from '@robota-sdk/agent-core';\nimport type { IPayloadLogger } from './interfaces/payload-logger';\nimport { OpenAIResponseParser } from './parsers/response-parser';\nimport { SilentLogger } from '@robota-sdk/agent-core';\nimport {\n chatStreamWithOpenAIChatCompletions,\n chatWithOpenAIChatCompletions,\n} from './chat-completions-chat';\nimport { chatStreamWithOpenAIResponsesApi, chatWithOpenAIResponsesApi } from './responses-chat';\n\n/**\n * OpenAI provider implementation for Robota\n *\n * Provides integration with OpenAI models through the Robota provider contract.\n * Uses OpenAI SDK native types internally for optimal performance and feature support.\n *\n * @public\n */\nexport class OpenAIProvider extends AbstractAIProvider {\n override readonly name = 'openai';\n override readonly version = '1.0.0';\n\n private readonly client?: OpenAI;\n private readonly options: IOpenAIProviderOptions;\n private readonly apiSurface: TOpenAIApiSurface;\n private readonly payloadLogger: IPayloadLogger | undefined;\n private readonly responseParser: OpenAIResponseParser;\n\n /**\n * Optional callback for text deltas during streaming.\n * Set by the consumer (e.g., Session) to receive real-time text chunks.\n * When set, chat() uses streaming internally while still returning\n * the complete assembled message.\n */\n onTextDelta?: TTextDeltaCallback;\n\n constructor(options: IOpenAIProviderOptions) {\n super(options.logger || SilentLogger);\n this.options = options;\n this.apiSurface = resolveApiSurface(options);\n validateOpenAIProviderNativeWebTools(this.apiSurface, options.nativeWebTools);\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.organization && { organization: options.organization }),\n ...(options.timeout && { timeout: options.timeout }),\n ...(options.baseURL && { baseURL: options.baseURL }),\n });\n } else {\n throw new Error('Either OpenAI client, apiKey, or executor is required');\n }\n }\n\n this.responseParser = new OpenAIResponseParser(this.logger);\n this.payloadLogger = options.payloadLogger;\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 'OpenAI Provider executor chat error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (this.apiSurface === 'responses') {\n return chatWithOpenAIResponsesApi({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n onTextDelta: this.onTextDelta,\n });\n }\n\n return chatWithOpenAIChatCompletions({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n payloadLogger: this.payloadLogger,\n responseParser: this.responseParser,\n onTextDelta: this.onTextDelta,\n });\n }\n\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\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 'OpenAI Provider executor stream error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (this.apiSurface === 'responses') {\n yield* chatStreamWithOpenAIResponsesApi({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n onTextDelta: this.onTextDelta,\n });\n return;\n }\n\n yield* chatStreamWithOpenAIChatCompletions({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n payloadLogger: this.payloadLogger,\n responseParser: this.responseParser,\n onTextDelta: this.onTextDelta,\n });\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities(): IProviderCapabilities {\n const source =\n this.apiSurface === 'chat-completions'\n ? 'openai-compatible-chat-completions'\n : 'openai-responses';\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: {\n supported: false,\n enabled: false,\n source,\n reason: getOpenAIUnsupportedNativeWebReason(this.apiSurface, 'search'),\n },\n webFetch: {\n supported: false,\n enabled: false,\n source,\n reason: getOpenAIUnsupportedNativeWebReason(this.apiSurface, '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 client doesn't 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\nfunction resolveApiSurface(options: IOpenAIProviderOptions): TOpenAIApiSurface {\n if (options.apiSurface !== undefined) {\n return options.apiSurface;\n }\n return options.baseURL ? 'chat-completions' : 'responses';\n}\n\nfunction getOpenAIUnsupportedNativeWebReason(\n apiSurface: TOpenAIApiSurface,\n toolKind: 'search' | 'fetch',\n): string {\n if (apiSurface === 'chat-completions') {\n return `OpenAI-compatible Chat Completions endpoints support declared function tools, not provider-native web ${toolKind}.`;\n }\n return `OpenAI Responses native web ${toolKind} is not wired in this Robota provider version.`;\n}\n\nfunction validateOpenAIProviderNativeWebTools(\n apiSurface: TOpenAIApiSurface,\n nativeWebTools: IOpenAIProviderOptions['nativeWebTools'],\n): void {\n if (nativeWebTools?.webSearch !== true && nativeWebTools?.webFetch !== true) {\n return;\n }\n throw new Error(\n `Provider openai native web search/fetch is not supported for apiSurface ${apiSurface} in this Robota provider version.`,\n );\n}\n","import OpenAI from 'openai';\nimport type { TUniversalMessage, IAssistantMessage } from '@robota-sdk/agent-core';\n\n/**\n * OpenAI Conversation Adapter\n *\n * Converts between TUniversalMessage format and OpenAI native types.\n * Provides bidirectional conversion for seamless integration.\n *\n * @public\n */\nexport class OpenAIConversationAdapter {\n /**\n * Filter messages for OpenAI compatibility\n *\n * OpenAI has specific requirements:\n * - Tool messages must have valid toolCallId\n * - Messages must be in proper sequence\n * - Tool messages without toolCallId should be excluded\n */\n static filterMessagesForOpenAI(messages: TUniversalMessage[]): TUniversalMessage[] {\n return messages.filter((msg) => {\n // Always include user, assistant, and system messages\n if (msg.role === 'user' || msg.role === 'assistant' || msg.role === 'system') {\n return true;\n }\n\n // For tool messages, only include if they have a valid toolCallId\n if (msg.role === 'tool') {\n // Must have toolCallId and it must not be empty or 'unknown'\n return !!(msg.toolCallId && msg.toolCallId.trim() !== '' && msg.toolCallId !== 'unknown');\n }\n\n return false;\n });\n }\n\n /**\n * Convert TUniversalMessage array to OpenAI message format\n * Now properly handles tool messages for OpenAI's tool calling feature\n */\n static toOpenAIFormat(messages: TUniversalMessage[]): OpenAI.Chat.ChatCompletionMessageParam[] {\n // First filter messages for OpenAI compatibility\n const filteredMessages = this.filterMessagesForOpenAI(messages);\n return filteredMessages.map((msg) => this.convertMessage(msg));\n }\n\n /**\n * Convert a single TUniversalMessage to OpenAI format\n * Handles all message types including tool messages\n */\n static convertMessage(msg: TUniversalMessage): OpenAI.Chat.ChatCompletionMessageParam {\n const messageRole = msg.role;\n\n if (messageRole === 'user') {\n return {\n role: 'user',\n content: msg.content,\n };\n }\n\n if (messageRole === 'assistant') {\n const assistantMsg = msg as IAssistantMessage;\n\n // Handle tool_calls format\n if (assistantMsg.toolCalls && assistantMsg.toolCalls.length > 0) {\n const result: OpenAI.Chat.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n // CRITICAL: OpenAI API requires content to be null (not empty string) when tool_calls are present\n // VERIFIED: 2024-12 - This prevents \"400 Bad Request\" errors from OpenAI API\n // DO NOT CHANGE without testing against actual OpenAI API\n content: assistantMsg.content === '' ? null : assistantMsg.content || null,\n tool_calls: assistantMsg.toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })),\n };\n return result;\n }\n\n // Regular assistant message (without tool calls)\n // VERIFIED: OpenAI accepts both null and string content for regular messages\n // We preserve null when content is null or empty string for API consistency\n return {\n role: 'assistant',\n content:\n assistantMsg.content === null\n ? null\n : assistantMsg.content === ''\n ? null\n : assistantMsg.content || '',\n };\n }\n\n if (messageRole === 'system') {\n return {\n role: 'system',\n content: msg.content,\n };\n }\n\n // Handle tool messages for OpenAI tool calling\n if (messageRole === 'tool') {\n if (!msg.toolCallId || msg.toolCallId.trim() === '') {\n throw new Error(`Tool message missing toolCallId: ${JSON.stringify(msg)}`);\n }\n\n const result: OpenAI.Chat.ChatCompletionToolMessageParam = {\n role: 'tool',\n content: msg.content,\n tool_call_id: msg.toolCallId,\n };\n return result;\n }\n\n const exhaustive: never = messageRole;\n throw new Error(`Unsupported message role: ${exhaustive}`);\n }\n\n /**\n * Add system prompt to message array if needed\n */\n static addSystemPromptIfNeeded(\n messages: OpenAI.Chat.ChatCompletionMessageParam[],\n systemPrompt?: string,\n ): OpenAI.Chat.ChatCompletionMessageParam[] {\n if (!systemPrompt) {\n return messages;\n }\n\n // Check if system message already exists\n const hasSystemMessage = messages.some((msg) => msg.role === 'system');\n\n if (hasSystemMessage) {\n return messages;\n }\n\n // Add system prompt at the beginning\n return [{ role: 'system', content: systemPrompt }, ...messages];\n }\n}\n","import type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\n\nconst OPENAI_MODELS_ENDPOINT = 'https://api.openai.com/v1/models';\nconst OPENAI_MODELS_SOURCE_URL = 'https://platform.openai.com/docs/api-reference/models/list';\n\nexport interface IOpenAIModelCatalogResponse {\n data?: readonly IOpenAIModelCatalogResource[];\n}\n\nexport interface IOpenAIModelCatalogResource {\n id?: string;\n}\n\nexport interface IOpenAIModelCatalogFetchInit {\n headers: Record<string, string>;\n}\n\nexport interface IOpenAIModelCatalogFetchResponse {\n ok: boolean;\n status: number;\n statusText?: string;\n json: () => Promise<IOpenAIModelCatalogResponse>;\n}\n\nexport type TOpenAIModelCatalogFetch = (\n url: string,\n init: IOpenAIModelCatalogFetchInit,\n) => Promise<IOpenAIModelCatalogFetchResponse>;\n\nexport interface IRefreshOpenAIModelCatalogOptions {\n fetcher?: TOpenAIModelCatalogFetch;\n now?: () => Date;\n}\n\nexport async function refreshOpenAIModelCatalog(\n profile: IProviderProfileConfig,\n options: IRefreshOpenAIModelCatalogOptions = {},\n): Promise<IProviderModelCatalog> {\n if (!profile.apiKey) {\n return createUnavailableCatalog('OpenAI model catalog refresh requires apiKey.');\n }\n\n const fetcher = options.fetcher ?? defaultOpenAIModelCatalogFetch;\n const now = options.now ?? (() => new Date());\n const url = resolveModelsEndpoint(profile.baseURL);\n\n try {\n const response = await fetcher(url, {\n headers: { Authorization: `Bearer ${profile.apiKey}` },\n });\n if (!response.ok) {\n return createUnavailableCatalog(formatHttpFailure(response));\n }\n\n const body = await response.json();\n const entries = toModelCatalogEntries(body);\n return {\n status: 'live',\n entries,\n lastVerifiedAt: now().toISOString(),\n sourceUrl: OPENAI_MODELS_SOURCE_URL,\n message: `${entries.length} OpenAI model(s) discovered.`,\n };\n } catch (error) {\n return createUnavailableCatalog(error instanceof Error ? error.message : String(error));\n }\n}\n\nfunction resolveModelsEndpoint(baseURL: string | undefined): string {\n if (!baseURL) return OPENAI_MODELS_ENDPOINT;\n return `${baseURL.replace(/\\/$/, '')}/models`;\n}\n\nfunction toModelCatalogEntries(\n body: IOpenAIModelCatalogResponse,\n): readonly IProviderModelCatalogEntry[] {\n return (body.data ?? [])\n .map((model) => model.id)\n .filter((id): id is string => id !== undefined && id.trim().length > 0)\n .map((id) => ({\n id,\n displayName: id,\n lifecycle: 'active',\n }));\n}\n\nfunction formatHttpFailure(response: IOpenAIModelCatalogFetchResponse): string {\n const statusText = response.statusText ? ` ${response.statusText}` : '';\n return `OpenAI model catalog refresh failed: HTTP ${response.status}${statusText}`;\n}\n\nfunction createUnavailableCatalog(message: string): IProviderModelCatalog {\n return {\n status: 'unavailable',\n sourceUrl: OPENAI_MODELS_SOURCE_URL,\n message,\n };\n}\n\nasync function defaultOpenAIModelCatalogFetch(\n url: string,\n init: IOpenAIModelCatalogFetchInit,\n): Promise<IOpenAIModelCatalogFetchResponse> {\n const response = await fetch(url, init);\n return {\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n json: () => response.json() as Promise<IOpenAIModelCatalogResponse>,\n };\n}\n","import type { IProviderDefinition, TUniversalValue } from '@robota-sdk/agent-core';\nimport { probeOpenAICompatibleProfile } from '../shared/openai-compatible/index.js';\nimport { refreshOpenAIModelCatalog } from './model-catalog-refresh';\nimport { OpenAIProvider } from './provider';\nimport type { IOpenAINativeWebToolsOptions, TOpenAIApiSurface } from './types';\n\nexport const DEFAULT_OPENAI_PROVIDER_MODEL: string | undefined = undefined;\nexport const DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE = '$ENV:OPENAI_API_KEY';\nconst OPENAI_API_KEY_URL = 'https://platform.openai.com/api-keys';\nconst OPENAI_SETUP_SOURCE_URL =\n 'https://developers.openai.com/api/reference/overview#authentication';\nconst OPENAI_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst OPENAI_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'OpenAI API keys',\n url: OPENAI_API_KEY_URL,\n sourceUrl: OPENAI_SETUP_SOURCE_URL,\n lastVerifiedAt: OPENAI_SETUP_LAST_VERIFIED_AT,\n },\n];\n\nexport function createOpenAIProviderDefinition(): IProviderDefinition {\n return {\n type: 'openai',\n displayName: 'OpenAI',\n description: 'Official OpenAI Responses API provider',\n defaults: {\n apiKey: DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,\n },\n modelCatalog: {\n status: 'unavailable',\n sourceUrl: 'https://platform.openai.com/docs/api-reference/models/list',\n message: 'OpenAI model availability should be discovered live from GET /v1/models.',\n },\n setupHelpLinks: OPENAI_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'model',\n title: 'OpenAI model',\n required: true,\n },\n {\n key: 'apiKey',\n title: 'OpenAI API key',\n defaultValue: DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n ],\n requiresApiKey: true,\n probeProfile: probeOpenAICompatibleProfile,\n refreshModelCatalog: ({ profile }) => refreshOpenAIModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n createProvider: (config) => {\n const apiSurface = readApiSurface(config.options);\n const nativeWebTools = readNativeWebTools(config.options);\n validateOpenAINativeWebTools(config.baseURL, apiSurface, nativeWebTools);\n return new OpenAIProvider({\n apiKey: requireApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n ...(apiSurface !== undefined && { apiSurface }),\n ...(nativeWebTools !== undefined && { nativeWebTools }),\n defaultModel: config.model,\n });\n },\n };\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider openai requires apiKey');\n }\n return apiKey;\n}\n\nfunction readApiSurface(\n options: Record<string, TUniversalValue> | undefined,\n): TOpenAIApiSurface | undefined {\n const apiSurface = options?.['apiSurface'];\n if (apiSurface === 'responses' || apiSurface === 'chat-completions') {\n return apiSurface;\n }\n return undefined;\n}\n\nfunction readNativeWebTools(\n options: Record<string, TUniversalValue> | undefined,\n): IOpenAINativeWebToolsOptions | undefined {\n const nativeWebTools =\n readNativeWebToolsRecord(options?.['nativeWebTools']) ??\n readNativeWebToolsRecord(options?.['builtInWebTools']);\n if (nativeWebTools === undefined) {\n return undefined;\n }\n return nativeWebTools;\n}\n\nfunction readNativeWebToolsRecord(\n value: TUniversalValue | undefined,\n): IOpenAINativeWebToolsOptions | undefined {\n if (value === null || value === undefined || value instanceof Date || Array.isArray(value)) {\n return undefined;\n }\n if (typeof value !== 'object') {\n return undefined;\n }\n const webSearch = value['webSearch'];\n const webFetch = value['webFetch'];\n return {\n ...(typeof webSearch === 'boolean' && { webSearch }),\n ...(typeof webFetch === 'boolean' && { webFetch }),\n };\n}\n\nfunction validateOpenAINativeWebTools(\n baseURL: string | undefined,\n apiSurface: TOpenAIApiSurface | undefined,\n nativeWebTools: IOpenAINativeWebToolsOptions | undefined,\n): void {\n if (nativeWebTools?.webSearch !== true && nativeWebTools?.webFetch !== true) {\n return;\n }\n if (baseURL !== undefined || apiSurface === 'chat-completions') {\n throw new Error(\n 'Provider openai profile uses an OpenAI-compatible Chat Completions endpoint; native web search/fetch is not supported for this profile. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.',\n );\n }\n throw new Error(\n 'Provider openai native web search/fetch is not wired in this Robota provider version. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.',\n );\n}\n"],"mappings":"gOAWA,IAAa,EAAb,KAAkC,CAChC,OAEA,YAAY,EAAkB,CAC5B,KAAK,OAAS,IAAI,EAA+B,CAAE,QAAO,CAAC,CAC7D,CAEA,cAAc,EAAyD,CACrE,GAAI,CACF,OAAO,KAAK,OAAO,cAAc,CAAQ,CAC3C,OAAS,EAAO,CACd,IAAM,EAAU,EACd,aAAiB,MAAQ,EAAM,QAAU,gCAC3C,EACA,MAAU,MAAM,mCAAmC,GAAS,CAC9D,CACF,CAEA,oBAAoB,EAAkE,CACpF,GAAI,CACF,OAAO,KAAK,OAAO,oBAAoB,CAAK,CAC9C,OAAS,EAAO,CACd,IAAM,EAAU,EACd,aAAiB,MAAQ,EAAM,QAAU,6BAC3C,EACA,MAAU,MAAM,gCAAgC,GAAS,CAC3D,CACF,CACF,EAEA,SAAS,EAAuB,EAAyB,CACvD,OAAO,EACJ,QAAQ,+CAAgD,EAAE,EAC1D,QAAQ,4CAA6C,EAAE,EACvD,QAAQ,6BAA8B,iBAAiB,CAC5D,CCjBA,SAAgB,GACd,EACuC,CACvC,GAAI,EAAQ,iBAAmB,IAAA,IAAa,EAAQ,iBAAmB,OACrE,OAEF,GAAI,EAAQ,iBAAmB,cAC7B,MAAO,CAAE,KAAM,aAAc,EAG/B,IAAM,EAAS,EAAkB,CAAO,EACxC,MAAO,CACL,KAAM,cACN,YAAa,CACX,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,GAAI,EAAO,cAAgB,IAAA,IAAa,CAAE,YAAa,EAAO,WAAY,EAC1E,GAAI,EAAO,SAAW,IAAA,IAAa,CAAE,OAAQ,EAAO,MAAO,CAC7D,CACF,CACF,CAEA,SAAgB,GACd,EACwC,CACxC,GAAI,EAAQ,iBAAmB,IAAA,IAAa,EAAQ,iBAAmB,OACrE,OAEF,GAAI,EAAQ,iBAAmB,cAC7B,MAAO,CAAE,OAAQ,CAAE,KAAM,aAAc,CAAE,EAG3C,IAAM,EAAS,EAAkB,CAAO,EAQxC,MAAO,CAAE,OAAA,CANP,KAAM,cACN,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,GAAI,EAAO,cAAgB,IAAA,IAAa,CAAE,YAAa,EAAO,WAAY,EAC1E,GAAI,EAAO,SAAW,IAAA,IAAa,CAAE,OAAQ,EAAO,MAAO,CAE/C,CAAE,CAClB,CAEA,SAAS,EAAkB,EAKzB,CACA,IAAM,EAAS,EAAM,WACrB,GAAI,EAAM,iBAAmB,cAC3B,MAAU,MAAM,uCAAuC,EAAM,gBAAgB,EAE/E,GAAI,CAAC,GAAQ,OACX,MAAU,MAAM,yEAAyE,EAE3F,MAAO,CACL,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,GAAI,EAAO,cAAgB,IAAA,IAAa,CAAE,YAAa,EAAO,WAAY,EAC1E,GAAI,EAAO,SAAW,IAAA,IAAa,CAAE,OAAQ,EAAO,MAAO,CAC7D,CACF,CCjFA,SAAgB,EACd,EAC0C,CAC1C,OAAO,EAAkC,CAAQ,CACnD,CAKA,SAAgB,GAAqB,EAAwD,CAC3F,OAAO,EAA+B,CAAK,CAC7C,CCAA,eAAsB,EACpB,EAC4B,CAC5B,IAAM,EAAS,EAAc,EAAM,MAAM,EAEzC,GAAI,CACF,IAAM,EAAgB,EAAuB,CAAK,EAElD,GADoB,EAAM,aAAa,aAAe,EAAM,YAE1D,OAAO,MAAM,EAA0B,EAAQ,EAAO,CACpD,GAAG,EACH,OAAQ,EACV,CAAC,EAGH,MAAM,EAAW,EAAO,EAAe,MAAM,EAC7C,EAAM,aAAa,6BAA6B,CAC9C,SAAU,SACV,WAAY,mBACZ,YAAa,UACb,QAAS,CACX,CAAC,EACD,IAAM,EAAW,MAAM,EAAO,KAAK,YAAY,OAAO,CAAa,EAOnE,OANA,EAAM,aAAa,6BAA6B,CAC9C,SAAU,SACV,WAAY,mBACZ,YAAa,WACb,QAAS,CACX,CAAC,EACM,EAAM,eAAe,cAAc,CAAQ,CACpD,OAAS,EAAO,CAEd,IAAM,EAAeA,EAAY,SAAW,4BAC5C,MAAU,MAAM,uBAAuB,GAAc,CACvD,CACF,CAEA,eAAuB,EACrB,EACkC,CAClC,IAAM,EAAS,EAAc,EAAM,MAAM,EAEzC,GAAI,CACF,IAAM,EAAiE,CACrE,GAAG,EAAuB,CAAK,EAC/B,OAAQ,EACV,EAEA,MAAM,EAAW,EAAO,EAAe,QAAQ,EAC/C,EAAM,aAAa,6BAA6B,CAC9C,SAAU,SACV,WAAY,mBACZ,YAAa,UACb,QAAS,CACX,CAAC,EACD,IAAM,EAAS,MAAM,EAAO,KAAK,YAAY,OAC3C,EACA,EAAM,aAAa,OAAS,CAAE,OAAQ,EAAM,YAAY,MAAO,EAAI,IAAA,EACrE,EAEA,UAAW,IAAM,KAAS,EAAsC,EAAQ,CACtE,SAAU,SACV,WAAY,mBACZ,2BAA4B,EAAM,aAAa,0BACjD,CAAC,EAAG,CACF,IAAM,EAAmB,EAAM,eAAe,oBAAoB,CAAK,EACnE,IACF,MAAM,EAEV,CACF,OAAS,EAAO,CAEd,IAAM,EAAeA,EAAY,SAAW,4BAC5C,MAAU,MAAM,yBAAyB,GAAc,CACzD,CACF,CAEA,SAAS,EACP,EACoD,CACpD,IAAM,EAAiB,EAAwB,EAAM,QAAQ,EACvD,EAAQ,EAAM,aAAa,OAAS,EAAM,gBAAgB,aAChE,GAAI,CAAC,EACH,MAAU,MACR,0FACF,EAGF,IAAM,EAAiB,GAA8B,EAAM,eAAe,EAC1E,MAAO,CACL,QACA,SAAU,EACV,GAAI,EAAM,aAAa,cAAgB,IAAA,IAAa,CAClD,YAAa,EAAM,YAAY,WACjC,EACA,GAAI,EAAM,aAAa,YAAc,IAAA,IAAa,CAAE,WAAY,EAAM,YAAY,SAAU,EAC5F,GAAI,EAAM,aAAa,OAAS,CAC9B,MAAO,GAAqB,EAAM,YAAY,KAAK,EACnD,YAAa,MACf,EACA,GAAI,IAAmB,IAAA,IAAa,CAAE,gBAAiB,CAAe,CACxE,CACF,CAEA,eAAe,EACb,EACA,EACA,EAC4B,CAC5B,GAAI,CAaF,OAZA,MAAM,EAAW,EAAO,EAAe,QAAQ,EAC/C,EAAM,aAAa,6BAA6B,CAC9C,SAAU,SACV,WAAY,mBACZ,YAAa,UACb,QAAS,CACX,CAAC,EAMMC,EAAqB,CAC1B,OAAQ,EAAsC,MAN3B,EAAO,KAAK,YAAY,OAC3C,EACA,EAAM,aAAa,OAAS,CAAE,OAAQ,EAAM,YAAY,MAAO,EAAI,IAAA,EACrE,EAGwD,CACpD,SAAU,SACV,WAAY,mBACZ,2BAA4B,EAAM,aAAa,0BACjD,CAAC,EACD,YAAa,EAAM,aAAa,aAAe,EAAM,YACrD,OAAQ,EAAM,aAAa,MAC7B,CAAC,CACH,OAAS,EAAO,CAEd,IAAM,EAAeD,EAAY,SAAW,kCAC5C,MAAU,MAAM,yBAAyB,GAAc,CACzD,CACF,CAEA,eAAe,EACb,EACA,EAGA,EACe,CACf,GAAI,CAAC,EAAM,eAAe,UAAU,EAClC,OAGF,IAAM,EAA0B,CAC9B,MAAO,EAAc,MACrB,cAAe,EAAc,SAAS,OACtC,SAAU,CAAC,CAAC,EAAc,MAC1B,YAAa,EAAc,aAAe,IAAA,GAC1C,UAAW,EAAc,YAAc,IAAA,GACvC,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,EACA,MAAM,EAAM,cAAc,WAAW,EAAS,CAAI,CACpD,CAEA,SAAS,EAAc,EAAoC,CACzD,GAAI,CAAC,EACH,MAAU,MACR,iFACF,EAEF,OAAO,CACT,CC/KA,SAAgB,EACd,EAC6B,CAC7B,OAAO,EAAS,QAAS,GAAY,EAAe,CAAO,CAAC,CAC9D,CAEA,SAAgB,EACd,EACA,EAC4C,CAC5C,IAAM,EACJ,GAAO,IAAK,IAAU,CACpB,KAAM,WACN,KAAM,EAAK,KACX,YAAa,EAAK,YAClB,WAAY,EAAK,WACjB,OAAQ,GAAe,EACzB,EAAE,GAAK,CAAC,EACV,OAAO,EAAU,OAAS,EAAI,EAAY,IAAA,EAC5C,CAEA,SAAS,EAAe,EAAyD,CAC/E,GAAI,EAAQ,OAAS,OACnB,MAAO,CAAC,EAAmB,OAAQ,GAAe,EAAQ,QAAS,EAAQ,KAAK,CAAC,CAAC,EAEpF,GAAI,EAAQ,OAAS,SACnB,MAAO,CAAC,EAAmB,SAAU,EAAQ,OAAO,CAAC,EAEvD,GAAI,EAAQ,OAAS,OAAQ,CAC3B,GAAI,CAAC,EAAQ,YAAc,EAAQ,WAAW,KAAK,EAAE,SAAW,EAC9D,MAAU,MAAM,oCAAoC,KAAK,UAAU,CAAO,GAAG,EAE/E,MAAO,CACL,CACE,KAAM,uBACN,QAAS,EAAQ,WACjB,OAAQ,EAAQ,SAAW,EAC7B,CACF,CACF,CACA,OAAO,GAAwB,CAAO,CACxC,CAEA,SAAS,GAAwB,EAAyD,CACxF,IAAM,EAAqC,CAAC,EACxC,EAAQ,SAAW,EAAQ,QAAQ,OAAS,GAC9C,EAAM,KAAK,EAAmB,YAAa,EAAQ,OAAO,CAAC,EAE7D,IAAK,IAAM,KAAY,EAAQ,WAAa,CAAC,EAC3C,EAAM,KAAK,CACT,KAAM,gBACN,QAAS,EAAS,GAClB,KAAM,EAAS,SAAS,KACxB,UAAW,EAAS,SAAS,SAC/B,CAAC,EAKH,OAHI,EAAM,SAAW,GACnB,EAAM,KAAK,EAAmB,YAAa,EAAE,CAAC,EAEzC,CACT,CAEA,SAAS,GACP,EACA,EACyC,CACzC,GAAI,CAAC,GAAS,EAAM,SAAW,EAC7B,OAAO,EAGT,IAAM,EAAY,EAAM,IAAK,GAAS,GAAY,CAAI,CAAC,EAIvD,OAHI,EAAQ,OAAS,GAAK,CAAC,EAAM,KAAM,GAAS,EAAK,OAAS,MAAM,EAC3D,CAAC,CAAE,KAAM,aAAc,KAAM,CAAQ,EAAG,GAAG,CAAS,EAEtD,CACT,CAEA,SAAS,GAAY,EAA2D,CAO9E,OANI,EAAK,OAAS,OACT,CAAE,KAAM,aAAc,KAAM,EAAK,IAAK,EAE3C,EAAK,OAAS,YACT,CAAE,KAAM,cAAe,UAAW,EAAK,GAAI,EAE7C,CACL,KAAM,cACN,UAAW,QAAQ,EAAK,SAAS,UAAU,EAAK,MAClD,CACF,CAEA,SAAS,EACP,EACA,EAC8B,CAC9B,MAAO,CACL,OACA,SACF,CACF,CC/GA,eAAuB,GACrB,EACA,EACmB,CACnB,IAAM,EAAW,EAAO,OAAO,eAAe,EAC9C,GAAI,CACF,KAAO,CAAC,GAAQ,SAAS,CACvB,IAAM,EAAO,MAAM,GAAe,EAAU,CAAM,EAClD,GAAI,EAAK,MAAQ,GAAQ,QACvB,MAEF,MAAM,EAAK,KACb,CACF,QAAU,CACJ,GAAQ,SACV,MAAM,EAAS,SAAS,CAE5B,CACF,CAEA,eAAe,GACb,EACA,EAC4B,CAC5B,GAAI,CAAC,EACH,OAAO,EAAS,KAAK,EAEvB,GAAI,EAAO,QACT,MAAO,CAAE,KAAM,GAAM,MAAO,IAAA,EAAe,EAG7C,IAAI,EACE,EAAU,IAAI,QAA4B,GAAY,CAC1D,MAA4B,EAAQ,CAAE,KAAM,GAAM,MAAO,IAAA,EAAe,CAAC,EACzE,EAAO,iBAAiB,QAAS,EAAe,CAAE,KAAM,EAAK,CAAC,CAChE,CAAC,EAED,GAAI,CACF,OAAO,MAAM,QAAQ,KAAK,CAAC,EAAS,KAAK,EAAG,CAAO,CAAC,CACtD,QAAU,CACJ,GACF,EAAO,oBAAoB,QAAS,CAAa,CAErD,CACF,CCJA,SAAgB,GACd,EACmB,CACnB,EAAqB,CAAQ,EAC7B,IAAM,EAAS,EAAS,QAAU,CAAC,EAEnC,OAAO,EAAsB,CAC3B,QAFc,EAAS,aAAe,EAAmB,CAAM,EAG/D,UAAW,EAAyB,CAAM,EAC1C,WACA,UAAW,EAAyB,CAAM,CAC5C,CAAC,CACH,CAEA,eAAsB,GACpB,EAC4B,CAC5B,IAAM,EAAqC,CACzC,UAAW,CAAC,EACZ,UAAW,CAAC,EACZ,UAAW,EAA6B,CAC1C,EAEA,UAAW,IAAM,KAAS,GAAgB,EAAQ,OAAQ,EAAQ,MAAM,EACtE,GAAiB,EAAO,EAAO,EAAQ,WAAW,EAOpD,OAJI,EAAM,oBAAsB,IAAA,GAIzB,EAAsB,CAC3B,QAAS,EAAM,UAAU,KAAK,EAAE,EAChC,UAAW,EAAM,UACjB,UAAW,EAAM,SACnB,CAAC,EAPQ,EAAkC,CAAK,CAQlD,CAEA,SAAS,GACP,EACA,EACA,EACM,CACN,GAAI,EAAM,OAAS,6BAA8B,CAC/C,EAAM,UAAU,KAAK,EAAM,KAAK,EAChC,IAAc,EAAM,KAAK,EACzB,MACF,CAEA,GAAI,EAAM,OAAS,qBAAsB,CACvC,EAAM,kBAAoB,EAAM,SAChC,EAAuB,EAAM,UAAW,EAAyB,EAAM,SAAS,QAAU,CAAC,CAAC,CAAC,EAC7F,MACF,CAEA,GAAI,EAAM,OAAS,4BAA6B,CAC9C,EAAgB,EAAO,EAAM,IAAI,EACjC,MACF,CAEA,GACE,EAAM,OAAS,kBACf,EAAM,OAAS,mBACf,EAAM,OAAS,sBAEf,MAAU,MAAM,gCAAgC,EAAoB,CAAK,GAAG,CAEhF,CAEA,SAAS,EACP,EACA,EACM,CACN,GAAI,EAAyB,CAAI,EAAG,CAClC,EAAM,UAAU,KAAK,EAAoB,CAAI,CAAC,EAC9C,MACF,CACI,EAAsB,CAAI,GAC5B,EAAuB,EAAM,UAAW,EAAyB,CAAC,CAAI,CAAC,CAAC,CAE5E,CAEA,SAAS,EAAkC,EAAuD,CAChG,IAAM,EAAW,EAAM,kBACvB,GAAI,IAAa,IAAA,GACf,MAAU,MAAM,6DAA6D,EAG/E,EAAqB,CAAQ,EAC7B,IAAM,EAAS,EAAS,QAAU,CAAC,EAC7B,EAAoB,EAAyB,CAAM,EACnD,EACJ,EAAM,UAAU,OAAS,EACrB,EAAM,UAAU,KAAK,EAAE,EACtB,EAAS,aAAe,EAAmB,CAAM,EAClD,EAAY,EAAyB,CAAM,EAGjD,OAFA,EAAuB,EAAW,EAAM,SAAS,EAE1C,EAAsB,CAC3B,UACA,UAAW,EAAkB,OAAS,EAAI,EAAoB,EAAM,UACpE,WACA,WACF,CAAC,CACH,CAEA,SAAS,EAAsB,EAKT,CACpB,MAAO,CACL,GAAI,EAAW,EACf,KAAM,YACN,QAAS,EAAM,QACf,MAAO,WACP,UAAW,IAAI,KACf,GAAI,EAAM,UAAU,OAAS,GAAK,CAAE,UAAW,EAAM,SAAU,EAC/D,GAAI,EAAM,UAAU,QAAU,IAAA,IAAa,CAAE,MAAO,EAAS,EAAM,SAAS,KAAK,CAAE,EACnF,SAAU,EAAc,EAAM,SAAU,EAAM,SAAS,CACzD,CACF,CAEA,SAAS,EACP,EACA,EAC4C,CAC5C,MAAO,CACL,mBAAoB,YACpB,GAAI,GAAU,KAAO,IAAA,IAAa,CAAE,WAAY,EAAS,EAAG,EAC5D,GAAI,GAAU,QAAU,IAAA,IAAa,CAAE,MAAO,EAAS,KAAM,EAC7D,GAAI,GAAU,SAAW,IAAA,IAAa,CAAE,aAAc,EAAS,MAAO,EACtE,GAAI,EAAU,sBAAwB,GAAK,CACzC,sBAAuB,EAAU,sBACjC,mBAAoB,EAAU,kBAChC,EACA,GAAI,EAAU,uBAAyB,CAAE,sBAAuB,EAAK,CACvE,CACF,CAEA,SAAS,EAAS,EAAoD,CACpE,MAAO,CACL,aAAc,EAAM,cAAgB,EACpC,iBAAkB,EAAM,eAAiB,EACzC,YAAa,EAAM,cAAgB,CACrC,CACF,CAEA,SAAS,EAAyB,EAA4D,CAC5F,OAAO,EAAO,OAAO,CAAwB,EAAE,IAAK,GAAS,EAAoB,CAAI,CAAC,CACxF,CAEA,SAAS,EACP,EACgD,CAChD,OACE,EAAK,OAAS,iBAAmB,YAAa,GAAQ,SAAU,GAAQ,cAAe,CAE3F,CAEA,SAAS,EAAoB,EAAyD,CACpF,MAAO,CACL,GAAI,EAAK,QACT,KAAM,WACN,SAAU,CACR,KAAM,EAAK,KACX,UAAW,EAAK,SAClB,CACF,CACF,CAEA,SAAS,EAAmB,EAAuD,CACjF,OAAO,EACJ,OAAO,CAAmB,EAC1B,QAAS,GAAS,EAAK,OAAO,EAC9B,IAAI,CAAkB,EACtB,KAAK,EAAE,CACZ,CAEA,SAAS,EAAmB,EAAgD,CAI1E,OAHI,EAAQ,OAAS,UACZ,EAAQ,QAEV,EAAQ,IACjB,CAEA,SAAS,EACP,EAC2C,CAC3C,OAAO,EAAK,OAAS,WAAa,YAAa,GAAQ,MAAM,QAAQ,EAAK,OAAO,CACnF,CAEA,SAAS,EACP,EACmC,CACnC,IAAM,EAAW,EAA6B,EAC9C,IAAK,IAAM,KAAQ,EAAQ,CACzB,GAAI,CAAC,EAAsB,CAAI,EAC7B,SAEF,IAAM,EAAY,EAAK,SAAS,IAAK,GAAY,EAAQ,IAAI,EAAE,OAAO,CAAQ,GAAK,CAAC,EACpF,EAAS,uBAAyB,EAAU,OAC5C,EAAS,mBAAmB,KAAK,GAAG,CAAS,EAC7C,EAAS,sBAAwB,EAAS,uBAAyB,CAAC,CAAC,EAAK,iBAC5E,CACA,OAAO,CACT,CAEA,SAAS,EACP,EAC6C,CAC7C,OAAO,EAAK,OAAS,WACvB,CAEA,SAAS,GAAkE,CACzE,MAAO,CACL,sBAAuB,EACvB,mBAAoB,CAAC,EACrB,sBAAuB,EACzB,CACF,CAEA,SAAS,EACP,EACA,EACM,CACN,EAAO,uBAAyB,EAAO,sBACvC,EAAO,mBAAmB,KAAK,GAAG,EAAO,kBAAkB,EAC3D,EAAO,sBAAwB,EAAO,uBAAyB,EAAO,qBACxE,CAEA,SAAS,EAAS,EAA4C,CAC5D,OAAO,IAAU,IAAA,EACnB,CAEA,SAAS,EAAqB,EAA0C,CACtE,GAAI,EAAS,SAAW,UAAY,EAAS,SAAW,aACtD,MAAU,MAAM,gCAAgC,EAAS,OAAO,SAAW,EAAS,QAAQ,CAEhG,CAEA,SAAS,EAAoB,EAA2C,CACtE,OAAO,EAAM,SAAW,EAAM,OAAO,SAAW,EAAM,UAAU,OAAO,SAAW,eACpF,CC3PA,eAAsB,EACpB,EAC4B,CAC5B,IAAM,EAAc,EAAM,aAAa,aAAe,EAAM,YAC5D,GAAI,EACF,OAAO,EAAyC,CAC9C,GAAG,EACH,YAAa,CACX,GAAG,EAAM,YACT,YAAa,CACf,CACF,CAAC,EAGH,GAAI,CAAC,EAAM,OACT,MAAU,MAAM,wCAAwC,EAG1D,GAAI,CACF,IAAM,EAAgB,EAA4B,CAAK,EACvD,EAAM,aAAa,6BAA6B,CAC9C,SAAU,SACV,WAAY,YACZ,YAAa,UACb,QAAS,CACX,CAAC,EACD,IAAM,EAAW,MAAM,EAAM,OAAO,UAAU,OAC5C,EACA,EAAM,aAAa,OAAS,CAAE,OAAQ,EAAM,YAAY,MAAO,EAAI,IAAA,EACrE,EAOA,OANA,EAAM,aAAa,6BAA6B,CAC9C,SAAU,SACV,WAAY,YACZ,YAAa,WACb,QAAS,CACX,CAAC,EACM,GAA6B,CAAQ,CAC9C,OAAS,EAAO,CAEd,IAAM,EAAeE,EAAY,SAAW,sCAC5C,MAAU,MAAM,4BAA4B,GAAc,CAC5D,CACF,CAEA,eAAuB,EACrB,EACkC,CAClC,IAAM,EAAsC,CAAE,OAAQ,CAAC,CAAE,EACnD,EAAc,EAAM,aAAa,aAAe,EAAM,YACtD,EAAW,EAAyC,CACxD,GAAG,EACH,YAAa,CACX,GAAG,EAAM,YACT,YAAc,GAAU,CACtB,IAAc,CAAK,EACnB,GAAmB,EAAO,GAAyB,CAAK,CAAC,CAC3D,CACF,CACF,CAAC,EACE,KAAM,GAAW,GAAkB,EAAO,CAAM,CAAC,EACjD,MAAO,GAAU,GAAgB,EAAO,GAAQ,CAAK,CAAC,CAAC,EAE1D,MAAO,GAA0B,CAAK,EACtC,MAAM,CACR,CAEA,eAAe,EACb,EAC4B,CAC5B,GAAI,CAAC,EAAM,OACT,MAAU,MAAM,wCAAwC,EAG1D,GAAI,CACF,IAAM,EAAgB,EAAqC,CAAK,EAWhE,OAVA,EAAM,aAAa,6BAA6B,CAC9C,SAAU,SACV,WAAY,YACZ,YAAa,UACb,QAAS,CACX,CAAC,EAKM,GAA8B,CACnC,OAAQ,EACN,MANiB,EAAM,OAAO,UAAU,OAC1C,EACA,EAAM,aAAa,OAAS,CAAE,OAAQ,EAAM,YAAY,MAAO,EAAI,IAAA,EACrE,EAII,CACE,SAAU,SACV,WAAY,YACZ,2BAA4B,EAAM,aAAa,0BACjD,CACF,EACA,YAAa,EAAM,aAAa,YAChC,OAAQ,EAAM,aAAa,MAC7B,CAAC,CACH,OAAS,EAAO,CAEd,IAAM,EAAeA,EAAY,SAAW,4CAC5C,MAAU,MAAM,mCAAmC,GAAc,CACnE,CACF,CAEA,SAAS,EACP,EACqC,CACrC,IAAM,EAAQ,EAAM,aAAa,OAAS,EAAM,gBAAgB,aAChE,GAAI,CAAC,EACH,MAAU,MACR,0FACF,EAGF,IAAM,EAAQ,EACZ,EAAM,aAAa,MACnB,EAAM,gBAAgB,WACxB,EACM,EAAa,GAA+B,EAAM,eAAe,EACvE,MAAO,CACL,QACA,MAAO,EAA8B,EAAM,QAAQ,EACnD,GAAI,IAAU,IAAA,IAAa,CAAE,QAAO,YAAa,MAAO,EACxD,GAAI,EAAM,aAAa,cAAgB,IAAA,IAAa,CAClD,YAAa,EAAM,YAAY,WACjC,EACA,GAAI,EAAM,aAAa,YAAc,IAAA,IAAa,CAChD,kBAAmB,EAAM,YAAY,SACvC,EACA,GAAI,IAAe,IAAA,IAAa,CAAE,KAAM,CAAW,EACnD,GAAI,EAAM,gBAAgB,YAAc,IAAA,IAAa,CACnD,UAAW,EAAM,gBAAgB,SACnC,EACA,GAAI,EAAM,gBAAgB,4BAA8B,IAAQ,CAC9D,QAAS,CAAC,6BAA6B,CACzC,EACA,GAAI,EAAM,gBAAgB,QAAU,IAAA,IAAa,CAAE,MAAO,EAAM,gBAAgB,KAAM,CACxF,CACF,CAEA,SAAS,EACP,EACkC,CAClC,MAAO,CACL,GAAG,EAA4B,CAAK,EACpC,OAAQ,EACV,CACF,CAEA,SAAS,GAAyB,EAAkC,CAClE,MAAO,CACL,GAAI,EAAW,EACf,KAAM,YACN,QAAS,EACT,MAAO,WACP,UAAW,IAAI,KACf,SAAU,CACR,mBAAoB,YACpB,cAAe,GACf,WAAY,EACd,CACF,CACF,CAEA,eAAgB,GACd,EACkC,CAClC,OAAa,CACX,IAAM,EAAO,EAAM,OAAO,MAAM,EAChC,GAAI,IAAS,IAAA,GAAW,CACtB,MAAM,EACN,QACF,CACA,GAAI,EAAM,QAAU,IAAA,GAClB,MAAM,EAAM,MAEd,GAAI,EAAM,eAAiB,IAAA,GAAW,CACpC,MAAM,GAAyB,EAAM,YAAY,EACjD,MACF,CACA,MAAM,GAAmB,CAAK,CAChC,CACF,CAEA,SAAS,GAAmB,EAAqC,EAAkC,CACjG,EAAM,OAAO,KAAK,CAAO,EACzB,EAAgB,CAAK,CACvB,CAEA,SAAS,GAAkB,EAAqC,EAAiC,CAC/F,EAAM,aAAe,EACrB,EAAgB,CAAK,CACvB,CAEA,SAAS,GAAgB,EAAqC,EAAoB,CAChF,EAAM,MAAQ,EACd,EAAgB,CAAK,CACvB,CAEA,SAAS,GAAmB,EAAoD,CAC9E,OAAO,IAAI,QAAS,GAAY,CAC9B,EAAM,KAAO,CACf,CAAC,CACH,CAEA,SAAS,EAAgB,EAA2C,CAClE,EAAM,OAAO,EACb,EAAM,KAAO,IAAA,EACf,CAEA,SAAS,GAAyB,EAA8C,CAC9E,MAAO,CACL,GAAG,EACH,QAAS,GACT,SAAU,CACR,GAAG,EAAO,SACV,cAAe,GACf,WAAY,EACd,CACF,CACF,CAEA,SAAS,GAAQ,EAA8B,CAC7C,OAAO,aAAiB,MAAQ,EAAY,MAAM,OAAO,CAAK,CAAC,CACjE,CCtOA,IAAa,EAAb,cAAoC,EAAmB,CACrD,KAAyB,SACzB,QAA4B,QAE5B,OACA,QACA,WACA,cACA,eAQA,YAEA,YAAY,EAAiC,CAU3C,GATA,MAAM,EAAQ,QAAU,CAAY,EACpC,KAAK,QAAU,EACf,KAAK,WAAa,GAAkB,CAAO,EAC3C,GAAqC,KAAK,WAAY,EAAQ,cAAc,EAExE,EAAQ,WACV,KAAK,SAAW,EAAQ,UAGtB,CAAC,KAAK,SACR,GAAI,EAAQ,OACV,KAAK,OAAS,EAAQ,YACjB,GAAI,EAAQ,OACjB,KAAK,OAAS,IAAI,EAAO,CACvB,OAAQ,EAAQ,OAChB,GAAI,EAAQ,cAAgB,CAAE,aAAc,EAAQ,YAAa,EACjE,GAAI,EAAQ,SAAW,CAAE,QAAS,EAAQ,OAAQ,EAClD,GAAI,EAAQ,SAAW,CAAE,QAAS,EAAQ,OAAQ,CACpD,CAAC,OAED,MAAU,MAAM,uDAAuD,EAI3E,KAAK,eAAiB,IAAI,EAAqB,KAAK,MAAM,EAC1D,KAAK,cAAgB,EAAQ,aAC/B,CAEA,MAAe,KACb,EACA,EAC4B,CAI5B,GAHA,KAAK,iBAAiB,CAAQ,EAC9B,KAAK,uBAAuB,GAAS,cAAc,EAE/C,KAAK,SACP,GAAI,CACF,OAAO,MAAM,KAAK,2BAA2B,EAAU,CAAO,CAChE,OAAS,EAAO,CAKd,MAJA,KAAK,OAAO,MACV,uCACA,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CACvD,EACM,CACR,CAaF,OAVI,KAAK,aAAe,YACf,EAA2B,CAChC,OAAQ,KAAK,OACb,WACA,YAAa,EACb,gBAAiB,KAAK,QACtB,YAAa,KAAK,WACpB,CAAC,EAGI,EAA8B,CACnC,OAAQ,KAAK,OACb,WACA,YAAa,EACb,gBAAiB,KAAK,QACtB,cAAe,KAAK,cACpB,eAAgB,KAAK,eACrB,YAAa,KAAK,WACpB,CAAC,CACH,CAEA,MAAgB,WACd,EACA,EACkC,CAGlC,GAFA,KAAK,uBAAuB,GAAS,cAAc,EAE/C,KAAK,SACP,GAAI,CACF,MAAO,KAAK,iCAAiC,EAAU,CAAO,EAC9D,MACF,OAAS,EAAO,CAKd,MAJA,KAAK,OAAO,MACV,yCACA,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CACvD,EACM,CACR,CAGF,GAAI,KAAK,aAAe,YAAa,CACnC,MAAO,EAAiC,CACtC,OAAQ,KAAK,OACb,WACA,YAAa,EACb,gBAAiB,KAAK,QACtB,YAAa,KAAK,WACpB,CAAC,EACD,MACF,CAEA,MAAO,EAAoC,CACzC,OAAQ,KAAK,OACb,WACA,YAAa,EACb,gBAAiB,KAAK,QACtB,cAAe,KAAK,cACpB,eAAgB,KAAK,eACrB,YAAa,KAAK,WACpB,CAAC,CACH,CAEA,eAAkC,CAChC,MAAO,EACT,CAEA,iBAAkD,CAChD,IAAM,EACJ,KAAK,aAAe,mBAChB,qCACA,mBACN,MAAO,CACL,gBAAiB,CAAE,UAAW,EAAK,EACnC,eAAgB,CACd,UAAW,CACT,UAAW,GACX,QAAS,GACT,SACA,OAAQ,EAAoC,KAAK,WAAY,QAAQ,CACvE,EACA,SAAU,CACR,UAAW,GACX,QAAS,GACT,SACA,OAAQ,EAAoC,KAAK,WAAY,OAAO,CACtE,CACF,CACF,CACF,CAEA,gBAAmC,CACjC,MAAO,CAAC,CAAC,KAAK,QAAU,CAAC,CAAC,KAAK,OACjC,CAEA,MAAe,SAAyB,CAExC,CAEA,iBAAoC,EAAqC,CACvE,MAAM,iBAAiB,CAAQ,EAE/B,IAAK,IAAM,KAAW,EACpB,GAAI,EAAQ,OAAS,YAAa,CAChC,IAAM,EAAe,EACrB,GACE,EAAa,WACb,EAAa,UAAU,OAAS,GAChC,EAAa,UAAY,GAEzB,QAEJ,CAEJ,CACF,EAEA,SAAS,GAAkB,EAAoD,CAI7E,OAHI,EAAQ,aAAe,IAAA,GAGpB,EAAQ,QAAU,mBAAqB,YAFrC,EAAQ,UAGnB,CAEA,SAAS,EACP,EACA,EACQ,CAIR,OAHI,IAAe,mBACV,yGAAyG,EAAS,GAEpH,+BAA+B,EAAS,+CACjD,CAEA,SAAS,GACP,EACA,EACM,CACF,QAAgB,YAAc,IAAQ,GAAgB,WAAa,IAGvE,MAAU,MACR,2EAA2E,EAAW,kCACxF,CACF,CCjOA,IAAa,GAAb,KAAuC,CASrC,OAAO,wBAAwB,EAAoD,CACjF,OAAO,EAAS,OAAQ,GAElB,EAAI,OAAS,QAAU,EAAI,OAAS,aAAe,EAAI,OAAS,SAC3D,GAIL,EAAI,OAAS,OAER,CAAC,EAAE,EAAI,YAAc,EAAI,WAAW,KAAK,IAAM,IAAM,EAAI,aAAe,WAG1E,EACR,CACH,CAMA,OAAO,eAAe,EAAyE,CAG7F,OADyB,KAAK,wBAAwB,CAChC,EAAE,IAAK,GAAQ,KAAK,eAAe,CAAG,CAAC,CAC/D,CAMA,OAAO,eAAe,EAAgE,CACpF,IAAM,EAAc,EAAI,KAExB,GAAI,IAAgB,OAClB,MAAO,CACL,KAAM,OACN,QAAS,EAAI,OACf,EAGF,GAAI,IAAgB,YAAa,CAC/B,IAAM,EAAe,EAyBrB,OAtBI,EAAa,WAAa,EAAa,UAAU,OAAS,EAgBrD,CAdL,KAAM,YAIN,QAAS,EAAa,UAAY,GAAK,KAAO,EAAa,SAAW,KACtE,WAAY,EAAa,UAAU,IAAK,IAAc,CACpD,GAAI,EAAS,GACb,KAAM,WACN,SAAU,CACR,KAAM,EAAS,SAAS,KACxB,UAAW,EAAS,SAAS,SAC/B,CACF,EAAE,CAEQ,EAMP,CACL,KAAM,YACN,QACE,EAAa,UAAY,MAErB,EAAa,UAAY,GADzB,KAGE,EAAa,SAAW,EAClC,CACF,CAEA,GAAI,IAAgB,SAClB,MAAO,CACL,KAAM,SACN,QAAS,EAAI,OACf,EAIF,GAAI,IAAgB,OAAQ,CAC1B,GAAI,CAAC,EAAI,YAAc,EAAI,WAAW,KAAK,IAAM,GAC/C,MAAU,MAAM,oCAAoC,KAAK,UAAU,CAAG,GAAG,EAQ3E,MAAO,CAJL,KAAM,OACN,QAAS,EAAI,QACb,aAAc,EAAI,UAER,CACd,CAGA,MAAU,MAAM,6BAA6BC,GAAY,CAC3D,CAKA,OAAO,wBACL,EACA,EAC0C,CAa1C,MAZI,CAAC,GAKoB,EAAS,KAAM,GAAQ,EAAI,OAAS,QAE1C,EACV,EAIF,CAAC,CAAE,KAAM,SAAU,QAAS,CAAa,EAAG,GAAG,CAAQ,CAChE,CACF,EC1IA,MACM,EAA2B,6DA+BjC,eAAsB,EACpB,EACA,EAA6C,CAAC,EACd,CAChC,GAAI,CAAC,EAAQ,OACX,OAAO,EAAyB,+CAA+C,EAGjF,IAAM,EAAU,EAAQ,SAAW,GAC7B,EAAM,EAAQ,UAAc,IAAI,MAChC,EAAM,GAAsB,EAAQ,OAAO,EAEjD,GAAI,CACF,IAAM,EAAW,MAAM,EAAQ,EAAK,CAClC,QAAS,CAAE,cAAe,UAAU,EAAQ,QAAS,CACvD,CAAC,EACD,GAAI,CAAC,EAAS,GACZ,OAAO,EAAyB,GAAkB,CAAQ,CAAC,EAI7D,IAAM,EAAU,GAAsB,MADnB,EAAS,KAAK,CACS,EAC1C,MAAO,CACL,OAAQ,OACR,UACA,eAAgB,EAAI,EAAE,YAAY,EAClC,UAAW,EACX,QAAS,GAAG,EAAQ,OAAO,6BAC7B,CACF,OAAS,EAAO,CACd,OAAO,EAAyB,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAAC,CACxF,CACF,CAEA,SAAS,GAAsB,EAAqC,CAElE,OADK,EACE,GAAG,EAAQ,QAAQ,MAAO,EAAE,EAAE,SADhB,kCAEvB,CAEA,SAAS,GACP,EACuC,CACvC,OAAQ,EAAK,MAAQ,CAAC,GACnB,IAAK,GAAU,EAAM,EAAE,EACvB,OAAQ,GAAqB,IAAO,IAAA,IAAa,EAAG,KAAK,EAAE,OAAS,CAAC,EACrE,IAAK,IAAQ,CACZ,KACA,YAAa,EACb,UAAW,QACb,EAAE,CACN,CAEA,SAAS,GAAkB,EAAoD,CAC7E,IAAM,EAAa,EAAS,WAAa,IAAI,EAAS,aAAe,GACrE,MAAO,6CAA6C,EAAS,SAAS,GACxE,CAEA,SAAS,EAAyB,EAAwC,CACxE,MAAO,CACL,OAAQ,cACR,UAAW,EACX,SACF,CACF,CAEA,eAAe,GACb,EACA,EAC2C,CAC3C,IAAM,EAAW,MAAM,MAAM,EAAK,CAAI,EACtC,MAAO,CACL,GAAI,EAAS,GACb,OAAQ,EAAS,OACjB,WAAY,EAAS,WACrB,SAAY,EAAS,KAAK,CAC5B,CACF,CC5GA,MAAa,GAAoD,IAAA,GACpD,EAA4C,sBAKnD,GAA8E,CAClF,CACE,KAAM,UACN,MAAO,kBACP,IAAK,uCACL,UAAW,sEACX,eAAgB,YAClB,CACF,EAEA,SAAgB,IAAsD,CACpE,MAAO,CACL,KAAM,SACN,YAAa,SACb,YAAa,yCACb,SAAU,CACR,OAAQ,CACV,EACA,aAAc,CACZ,OAAQ,cACR,UAAW,6DACX,QAAS,0EACX,EACA,eAAgB,GAChB,WAAY,CACV,CACE,IAAK,QACL,MAAO,eACP,SAAU,EACZ,EACA,CACE,IAAK,SACL,MAAO,iBACP,aAAc,EACd,OAAQ,EACV,CACF,EACA,eAAgB,GAChB,aAAc,EACd,qBAAsB,CAAE,aAAc,EAA0B,CAAO,EACvE,4BAA6B,MAC7B,eAAiB,GAAW,CAC1B,IAAM,EAAa,GAAe,EAAO,OAAO,EAC1C,EAAiB,GAAmB,EAAO,OAAO,EAExD,OADA,GAA6B,EAAO,QAAS,EAAY,CAAc,EAChE,IAAI,EAAe,CACxB,OAAQ,GAAc,EAAO,MAAM,EACnC,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,OAAQ,EAC9D,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,OAAQ,EAC9D,GAAI,IAAe,IAAA,IAAa,CAAE,YAAW,EAC7C,GAAI,IAAmB,IAAA,IAAa,CAAE,gBAAe,EACrD,aAAc,EAAO,KACvB,CAAC,CACH,CACF,CACF,CAEA,SAAS,GAAc,EAAoC,CACzD,GAAI,CAAC,EACH,MAAU,MAAM,iCAAiC,EAEnD,OAAO,CACT,CAEA,SAAS,GACP,EAC+B,CAC/B,IAAM,EAAa,GAAU,WAC7B,GAAI,IAAe,aAAe,IAAe,mBAC/C,OAAO,CAGX,CAEA,SAAS,GACP,EAC0C,CAC1C,IAAM,EACJ,EAAyB,GAAU,cAAiB,GACpD,EAAyB,GAAU,eAAkB,EACnD,OAAmB,IAAA,GAGvB,OAAO,CACT,CAEA,SAAS,EACP,EAC0C,CAI1C,GAHI,GAAU,MAA+B,aAAiB,MAAQ,MAAM,QAAQ,CAAK,GAGrF,OAAO,GAAU,SACnB,OAEF,IAAM,EAAY,EAAM,UAClB,EAAW,EAAM,SACvB,MAAO,CACL,GAAI,OAAO,GAAc,WAAa,CAAE,WAAU,EAClD,GAAI,OAAO,GAAa,WAAa,CAAE,UAAS,CAClD,CACF,CAEA,SAAS,GACP,EACA,EACA,EACM,CACF,QAAgB,YAAc,IAAQ,GAAgB,WAAa,IAQvE,MAJY,MADR,IAAY,IAAA,IAAa,IAAe,mBAExC,sOAIF,mLAHA,CAKJ"}
@@ -1,2 +0,0 @@
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}from"@robota-sdk/agent-core";import l from"openai";const u={singapore:`https://dashscope-intl.aliyuncs.com/compatible-mode/v1`,usVirginia:`https://dashscope-us.aliyuncs.com/compatible-mode/v1`,beijing:`https://dashscope.aliyuncs.com/compatible-mode/v1`,hongKong:`https://cn-hongkong.dashscope.aliyuncs.com/compatible-mode/v1`},d={singapore:`https://dashscope-intl.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`,usVirginia:`https://dashscope-us.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`,beijing:`https://dashscope.aliyuncs.com/api/v2/apps/protocols/compatible-mode/v1`},f=`qwen-plus`,p=`DASHSCOPE_API_KEY`,m=`$ENV:${p}`,h=u.singapore,g=d.singapore,_=`https://www.alibabacloud.com/help/en/model-studio/compatibility-of-openai-with-dashscope`,v=`2026-05-04`;function y(e){let t=[];return(e?.webSearch===!0||e?.webFetch===!0)&&t.push(`web_search`),e?.webFetch===!0&&t.push(`web_extractor`),t}function b(e){return y(e).length>0}function x(e){return e.flatMap(e=>w(e))}function S(e,t){let n=[...e.map(e=>({type:e})),...C(t)];return n.length>0?n:void 0}function C(e){return e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters}))??[]}function w(e){return e.role===`user`?[E(`user`,e.content)]:e.role===`system`?[E(`system`,e.content)]:e.role===`tool`?[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]:T(e)}function T(e){let t=[];e.content&&e.content.length>0&&t.push(E(`assistant`,e.content));for(let n of e.toolCalls??[])t.push({type:`function_call`,call_id:n.id,name:n.function.name,arguments:n.function.arguments});return t.length===0&&t.push(E(`assistant`,``)),t}function E(e,t){return{role:e,content:t??``}}async function*D(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await ee(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function ee(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}function O(e,t){let n=e.output??[],r=M(n,e.usage),i=L(n);return k({content:e.output_text??B(n),toolCalls:i,response:e,usage:r,enabledBuiltInTools:t.enabledBuiltInTools})}async function te(e){let t={textParts:[],toolCalls:[],usage:F()};for await(let n of D(e.stream,e.signal))ne(t,n,e.onTextDelta);return t.completedResponse===void 0?k({content:t.textParts.join(``),toolCalls:t.toolCalls,usage:t.usage,enabledBuiltInTools:e.enabledBuiltInTools}):re(t,e.enabledBuiltInTools)}function ne(e,t,n){if(t.type===`response.output_text.delta`){e.textParts.push(t.delta),n?.(t.delta);return}if(t.type===`response.completed`){e.completedResponse=t.response,P(e.usage,M(t.response.output??[],t.response.usage));return}if(t.type===`response.output_item.done`){ie(e,t.item);return}if(t.type===`response.web_search_call.completed`){e.usage.webSearchCalls+=1;return}if(t.type===`response.error`||t.type===`response.failed`)throw Error(`Qwen Responses API failed: ${V(t)}`)}function re(e,t){let n=e.completedResponse;if(n===void 0)throw Error(`Qwen Responses stream completed without response metadata`);let r=n.output??[],i=L(r),a=e.textParts.length>0?e.textParts.join(``):n.output_text??B(r),o=M(r,n.usage);return P(o,e.usage),k({content:a,toolCalls:i.length>0?i:e.toolCalls,response:n,usage:o,enabledBuiltInTools:t})}function ie(e,t){if(t.type===`function_call`){R(t)&&e.toolCalls.push(z(t));return}P(e.usage,M([t],void 0))}function k(e){return{id:o(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:{promptTokens:e.response.usage.input_tokens??0,completionTokens:e.response.usage.output_tokens??0,totalTokens:e.response.usage.total_tokens??0}},metadata:A(e.enabledBuiltInTools,e.usage,e.response)}}function A(e,t,n){let r=j(t);return{providerToolMode:`qwen_responses`,providerBuiltInToolsEnabled:[...e],...r.length>0&&{providerBuiltInToolsUsed:r},qwenWebSearchCalls:t.webSearchCalls,qwenWebExtractorCalls:t.webExtractorCalls,...t.unsupportedToolTypes.size>0&&{qwenUnsupportedProviderToolTypes:[...t.unsupportedToolTypes].sort()},...n?.id!==void 0&&{responseId:n.id},...n?.model!==void 0&&{model:n.model},...n?.status!==void 0&&{finishReason:n.status}}}function j(e){let t=[];return e.webSearchCalls>0&&t.push(`web_search`),e.webExtractorCalls>0&&t.push(`web_extractor`),t}function M(e,t){let n=F();for(let t of e)t.type===`web_search_call`?n.webSearchCalls+=1:t.type===`web_extractor_call`?n.webExtractorCalls+=1:I(t.type)&&n.unsupportedToolTypes.add(t.type);return N(n,t),n}function N(e,t){let n=t?.x_tools;if(n!==void 0){e.webSearchCalls=Math.max(e.webSearchCalls,n.web_search?.count??0),e.webExtractorCalls=Math.max(e.webExtractorCalls,n.web_extractor?.count??0);for(let t of Object.keys(n))t!==`web_search`&&t!==`web_extractor`&&e.unsupportedToolTypes.add(t)}}function P(e,t){e.webSearchCalls=Math.max(e.webSearchCalls,t.webSearchCalls),e.webExtractorCalls=Math.max(e.webExtractorCalls,t.webExtractorCalls);for(let n of t.unsupportedToolTypes)e.unsupportedToolTypes.add(n)}function F(){return{webSearchCalls:0,webExtractorCalls:0,unsupportedToolTypes:new Set}}function I(e){return e.endsWith(`_call`)&&e!==`function_call`}function L(e){return e.filter(R).map(e=>z(e))}function R(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function z(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function B(e){return e.filter(e=>e.type===`message`).flatMap(e=>e.content).map(e=>e.text).join(``)}function V(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function H(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return W({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let t=G(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`response`,payload:n}),O(n,{enabledBuiltInTools:y(e.builtInWebTools)})}catch(e){let t=e.message||`Qwen Responses API request failed`;throw Error(`Qwen responses failed: ${t}`)}}async function*U(e){let t=[],n=await W({...e,chatOptions:{...e.chatOptions,onTextDelta:n=>{e.chatOptions?.onTextDelta?.(n),t.push(q(n))}}});for(let e of t)yield e;yield{...n,content:``,metadata:{...n.metadata,isStreamChunk:!0,isComplete:!0}}}async function W(e){if(!e.client)throw Error(`Qwen Responses client not available for built-in web tools.`);try{let t=K(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`responses`,payloadKind:`request`,payload:t}),te({stream:n(await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`qwen`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),enabledBuiltInTools:y(e.builtInWebTools),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(e){let t=e.message||`Qwen Responses streaming request failed`;throw Error(`Qwen responses stream failed: ${t}`)}}function G(e){let t=e.chatOptions?.model??e.defaultModel;if(!t)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let n=S(y(e.builtInWebTools),e.chatOptions?.tools);return{model:t,input:x(e.messages),...n!==void 0&&{tools:n},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...e.builtInWebTools?.enableThinking!==void 0&&{enable_thinking:e.builtInWebTools.enableThinking}}}function K(e){return{...G(e),stream:!0}}function q(e){return{id:o(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:!1}}}const J=`qwen-responses`;function Y(e){let t=e.builtInWebTools,n=t?.webSearch===!0||t?.webFetch===!0,r=t?.webFetch===!0;return{functionCalling:{supported:!0},nativeWebTools:{webSearch:n?{supported:!0,enabled:!0,source:J}:{supported:!0,enabled:!1,source:J,reason:`Enable builtInWebTools.webSearch or builtInWebTools.webFetch.`},webFetch:r?{supported:!0,enabled:!0,source:J}:{supported:!0,enabled:!1,source:J,reason:`Enable builtInWebTools.webFetch.`}}}}async function ae(e,t,r){try{return r.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:t}),i({stream:n(await e.chat.completions.create(t,r.signal?{signal:r.signal}:void 0),{provider:`qwen`,apiSurface:`chat-completions`,onProviderNativeRawPayload:r.onProviderNativeRawPayload}),onTextDelta:r.onTextDelta,signal:r.signal})}catch(e){let t=e.message||`Qwen streaming request failed`;throw Error(`Qwen stream failed: ${t}`)}}var X=class extends s{name=`qwen`;version=`1.0.0`;client;responsesClient;options;responseParser;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,this.responsesClient=e.client;else if(e.apiKey)this.client=new l({apiKey:e.apiKey,baseURL:e.baseURL??h,...e.timeout!==void 0&&{timeout:e.timeout}}),this.responsesClient=new l({apiKey:e.apiKey,baseURL:e.responsesBaseURL??g,...e.timeout!==void 0&&{timeout:e.timeout}});else throw Error(`Either Qwen client, apiKey, or executor is required`);this.responseParser=new t({logger:this.logger})}async chat(e,t){return this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor?this.chatViaExecutor(e,t):this.shouldUseResponsesApi()?this.chatViaResponsesApi(e,t,this.getResponsesClient()):this.chatViaChatCompletions(e,t,this.getClient())}async chatViaExecutor(e,t){try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`Qwen Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}}async chatViaResponsesApi(e,t,n){return this.validateTools(t?.tools),H({client:n,messages:e,chatOptions:t,defaultModel:this.options.defaultModel,builtInWebTools:this.options.builtInWebTools,onTextDelta:this.onTextDelta})}async chatViaChatCompletions(e,t,n){try{let r=this.buildRequestParams(e,t),i=t?.onTextDelta??this.onTextDelta;if(i)return ae(n,{...r,stream:!0},{...t,onTextDelta:i});t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let a=await n.chat.completions.create(r);return t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`response`,payload:a}),this.responseParser.parseResponse(a)}catch(e){let t=e.message||`Qwen API request failed`;throw Error(`Qwen 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(`Qwen Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(!this.client)throw Error(`Qwen client not available. Either provide a client/apiKey or use an executor.`);if(this.shouldUseResponsesApi()){this.validateTools(t?.tools),yield*U({client:this.responsesClient,messages:e,chatOptions:t,defaultModel:this.options.defaultModel,builtInWebTools:this.options.builtInWebTools,onTextDelta:this.onTextDelta});return}try{let r=this.buildStreamingRequestParams(e,t);t?.onProviderNativeRawPayload?.({provider:`qwen`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=n(await this.client.chat.completions.create(r),{provider:`qwen`,apiSurface:`chat-completions`,onProviderNativeRawPayload:t?.onProviderNativeRawPayload});for await(let e of this.streamWithAbort(i,t?.signal)){let t=this.responseParser.parseStreamingChunk(e);t&&(yield t)}}catch(e){let t=e.message||`Qwen API request failed`;throw Error(`Qwen stream failed: ${t}`)}}supportsTools(){return!0}getCapabilities(){return Y(this.options)}validateConfig(){return!!this.client&&!!this.options&&(!this.shouldUseResponsesApi()||!!this.responsesClient)}async dispose(){}buildRequestParams(t,n){this.validateTools(n?.tools);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}}shouldUseResponsesApi(){return b(this.options.builtInWebTools)}getClient(){if(!this.client)throw Error(`Qwen client not available. Either provide a client/apiKey or use an executor.`);return this.client}getResponsesClient(){if(!this.responsesClient)throw Error(`Qwen Responses client not available for built-in web tools.`);return this.responsesClient}};async function Z(e,t=le){let n=await t(`${ce(e.baseURL??h)}/models`,oe(e.apiKey));if(!n.ok)return{status:`unavailable`,sourceUrl:_,message:`Qwen model refresh failed: HTTP ${n.status}`};let r=((await n.json()).data??[]).map(e=>e.id).filter(e=>typeof e==`string`&&e.length>0).map(se);return{status:`live`,sourceUrl:_,lastVerifiedAt:v,entries:r,message:`Loaded ${r.length} models from Qwen API`}}function oe(e){if(e)return{headers:{Authorization:`Bearer ${e}`}}}function se(e){return{id:e,displayName:e,lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v}}function ce(e){return e.replace(/\/$/,``)}async function le(e,t){let n=await fetch(e,{...t?.headers!==void 0&&{headers:t.headers}});return{ok:n.ok,status:n.status,json:()=>n.json()}}const ue=[{kind:`api-key`,label:`Alibaba Cloud Model Studio API keys`,url:`https://modelstudio.console.alibabacloud.com/?tab=api#/api-key`,sourceUrl:`https://www.alibabacloud.com/help/en/model-studio/get-api-key`,lastVerifiedAt:`2026-05-08`}],Q={status:`fallback`,sourceUrl:_,lastVerifiedAt:v,entries:[{id:f,displayName:`Qwen Plus`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v},{id:`qwen-max`,displayName:`Qwen Max`,capabilities:[`tools`,`reasoning`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v},{id:`qwen-flash`,displayName:`Qwen Flash`,capabilities:[`tools`,`native_web`,`streaming`],lifecycle:`active`,sourceUrl:_,lastVerifiedAt:v}]};function de(){return{type:`qwen`,displayName:`Qwen`,description:`Alibaba Cloud Model Studio OpenAI-compatible endpoint`,defaults:{model:f,apiKey:m,baseURL:h},modelCatalog:Q,refreshModelCatalog:({profile:e})=>Z(e),modelCatalogCacheTtlSeconds:86400,setupHelpLinks:ue,setupSteps:[{key:`baseURL`,title:`Qwen OpenAI-compatible base URL`,defaultValue:h},{key:`model`,title:`Qwen model`,defaultValue:f},{key:`apiKey`,title:`Qwen Model Studio API key`,defaultValue:m,masked:!0}],requiresApiKey:!0,probeProfile:a,createProvider:e=>{let t=pe(e.options);return new X({apiKey:fe(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...t.responsesBaseURL!==void 0&&{responsesBaseURL:t.responsesBaseURL},...e.timeout!==void 0&&{timeout:e.timeout},...t.builtInWebTools!==void 0&&{builtInWebTools:t.builtInWebTools},defaultModel:e.model})}}}function fe(e){if(!e)throw Error(`Provider qwen requires apiKey`);return e}function pe(e){let t=me(he(e?.builtInWebTools)),n=ge(e?.responsesBaseURL);return{...n!==void 0&&{responsesBaseURL:n},...t!==void 0&&{builtInWebTools:t}}}function me(e){if(e!==void 0)return{...$(e.webSearch)!==void 0&&{webSearch:$(e.webSearch)},...$(e.webFetch)!==void 0&&{webFetch:$(e.webFetch)},...$(e.enableThinking)!==void 0&&{enableThinking:$(e.enableThinking)}}}function he(e){if(!(e==null||e instanceof Date||Array.isArray(e)))return typeof e==`object`?e:void 0}function $(e){return typeof e==`boolean`?e:void 0}function ge(e){return typeof e==`string`&&e.length>0?e:void 0}export{m as a,g as c,u as d,d as f,p as i,v as l,Z as n,h as o,X as r,f as s,de as t,_ as u};
2
- //# sourceMappingURL=qwen-ChUZobTL.js.map