@robota-sdk/agent-provider-openai 3.0.0-beta.63 → 3.0.0-beta.82

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 (70) hide show
  1. package/LICENSE +661 -21
  2. package/dist/node/index.cjs +1 -2
  3. package/dist/node/index.d.cts +271 -267
  4. package/dist/node/index.d.cts.map +1 -0
  5. package/dist/node/index.d.ts +271 -267
  6. package/dist/node/index.d.ts.map +1 -0
  7. package/dist/node/index.js +2 -2
  8. package/dist/node/index.js.map +1 -0
  9. package/dist/node/loggers/index.cjs +1 -0
  10. package/dist/node/loggers/index.d.cts +94 -0
  11. package/dist/node/loggers/index.d.cts.map +1 -0
  12. package/dist/node/loggers/index.d.ts +94 -0
  13. package/dist/node/loggers/index.d.ts.map +1 -0
  14. package/dist/node/loggers/index.js +2 -0
  15. package/dist/node/loggers/index.js.map +1 -0
  16. package/dist/node/payload-logger-BaW0K8yI.d.cts +61 -0
  17. package/dist/node/payload-logger-BaW0K8yI.d.cts.map +1 -0
  18. package/dist/node/payload-logger-BaW0K8yI.d.ts +61 -0
  19. package/dist/node/payload-logger-BaW0K8yI.d.ts.map +1 -0
  20. package/dist/node/rolldown-runtime-CMqjfN_6.cjs +1 -0
  21. package/package.json +69 -86
  22. package/src/index.ts +1 -0
  23. package/src/openai/__tests__/endpoint-provenance.test.ts +44 -0
  24. package/src/openai/__tests__/provider-errors.test.ts +114 -0
  25. package/src/openai/__tests__/request-format.test.ts +59 -0
  26. package/src/openai/__tests__/strict-tools-closure.test.ts +136 -0
  27. package/src/openai/__tests__/tool-schema-projection.test.ts +302 -0
  28. package/src/openai/__tests__/trace-context-wire.test.ts +114 -0
  29. package/src/openai/adapter.test.ts +494 -0
  30. package/src/openai/adapter.ts +145 -0
  31. package/src/openai/chat-completions-chat.ts +225 -0
  32. package/src/openai/executor-integration.test.ts +213 -0
  33. package/src/openai/index.ts +19 -0
  34. package/src/openai/interfaces/payload-logger.ts +48 -0
  35. package/src/openai/loggers/console-payload-logger.test.ts +173 -0
  36. package/src/openai/loggers/console-payload-logger.ts +96 -0
  37. package/src/openai/loggers/console.ts +9 -0
  38. package/src/openai/loggers/file-payload-logger.test.ts +243 -0
  39. package/src/openai/loggers/file-payload-logger.ts +124 -0
  40. package/src/openai/loggers/file.ts +9 -0
  41. package/src/openai/loggers/index.ts +12 -0
  42. package/src/openai/loggers/sanitize-openai-log-data.test.ts +89 -0
  43. package/src/openai/loggers/sanitize-openai-log-data.ts +14 -0
  44. package/src/openai/message-converter.ts +23 -0
  45. package/src/openai/model-effort-table.ts +19 -0
  46. package/src/openai/model-effort-verification-config.test.ts +45 -0
  47. package/src/openai/model-effort-verification-config.ts +35 -0
  48. package/src/openai/openai-request-format.ts +116 -0
  49. package/src/openai/parsers/response-parser.test.ts +407 -0
  50. package/src/openai/parsers/response-parser.ts +48 -0
  51. package/src/openai/provider-definition.test.ts +74 -0
  52. package/src/openai/provider-definition.ts +139 -0
  53. package/src/openai/provider.test.ts +1686 -0
  54. package/src/openai/provider.ts +392 -0
  55. package/src/openai/reasoning-effort.test.ts +272 -0
  56. package/src/openai/reasoning-effort.ts +49 -0
  57. package/src/openai/request-id.ts +39 -0
  58. package/src/openai/request-options.ts +14 -0
  59. package/src/openai/responses-chat.ts +285 -0
  60. package/src/openai/responses-converter.ts +122 -0
  61. package/src/openai/responses-parser.ts +297 -0
  62. package/src/openai/responses-stream-utils.ts +45 -0
  63. package/src/openai/responses-types.ts +193 -0
  64. package/src/openai/streaming/stream-assembler.ts +3 -0
  65. package/src/openai/types/api-types.ts +113 -0
  66. package/src/openai/types.ts +235 -0
  67. package/CHANGELOG.md +0 -614
  68. package/README.md +0 -467
  69. package/dist/browser/index.d.ts +0 -307
  70. package/dist/browser/index.js +0 -2
@@ -1,2 +1 @@
1
- 'use strict';var Se=require('openai'),agentCore=require('@robota-sdk/agent-core'),agentProviderOpenaiCompatible=require('@robota-sdk/agent-provider-openai-compatible'),crypto=require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Se__default=/*#__PURE__*/_interopDefault(Se);var p=class{parser;constructor(t){this.parser=new agentProviderOpenaiCompatible.OpenAICompatibleResponseParser({logger:t});}parseResponse(t){try{return this.parser.parseResponse(t)}catch(n){let o=h(n instanceof Error?n.message:"OpenAI response parsing failed");throw new Error(`OpenAI response parsing failed: ${o}`)}}parseStreamingChunk(t){try{return this.parser.parseStreamingChunk(t)}catch(n){let o=h(n instanceof Error?n.message:"OpenAI chunk parsing failed");throw new Error(`OpenAI chunk parsing failed: ${o}`)}}};function h(e){return e.replace(/^OpenAI-compatible response parsing failed: /,"").replace(/^OpenAI-compatible chunk parsing failed: /,"").replace("OpenAI-compatible response","OpenAI response")}function g(e){if(e.responseFormat===void 0||e.responseFormat==="text")return;if(e.responseFormat==="json_object")return {type:"json_object"};let t=y(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 A(e){if(e.responseFormat===void 0||e.responseFormat==="text")return;if(e.responseFormat==="json_object")return {format:{type:"json_object"}};let t=y(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 y(e){let t=e.jsonSchema;if(e.responseFormat!=="json_schema")throw new Error(`Unsupported OpenAI response format: ${e.responseFormat}`);if(!t?.schema)throw new 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 v(e){return agentProviderOpenaiCompatible.convertToOpenAICompatibleMessages(e)}function T(e){return agentProviderOpenaiCompatible.convertToOpenAICompatibleTools(e)}async function b(e){let t=M(e.client);try{let n=S(e);if(e.chatOptions?.onTextDelta??e.onTextDelta)return await ee(t,e,{...n,stream:!0});await d(e,n,"chat"),e.chatOptions?.onProviderNativeRawPayload?.({provider:"openai",apiSurface:"chat-completions",payloadKind:"request",payload:n});let s=await t.chat.completions.create(n);return e.chatOptions?.onProviderNativeRawPayload?.({provider:"openai",apiSurface:"chat-completions",payloadKind:"response",payload:s}),e.responseParser.parseResponse(s)}catch(n){let s=n.message||"OpenAI API request failed";throw new Error(`OpenAI chat failed: ${s}`)}}async function*P(e){let t=M(e.client);try{let n={...S(e),stream:!0};await d(e,n,"stream"),e.chatOptions?.onProviderNativeRawPayload?.({provider:"openai",apiSurface:"chat-completions",payloadKind:"request",payload:n});let o=await t.chat.completions.create(n,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);for await(let s of agentProviderOpenaiCompatible.observeProviderNativeRawPayloadStream(o,{provider:"openai",apiSurface:"chat-completions",onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload})){let r=e.responseParser.parseStreamingChunk(s);r&&(yield r);}}catch(n){let s=n.message||"OpenAI API request failed";throw new Error(`OpenAI stream failed: ${s}`)}}function S(e){let t=v(e.messages),n=e.chatOptions?.model??e.providerOptions.defaultModel;if(!n)throw new Error("Model is required in chat options. Please specify a model in defaultModel configuration.");let o=g(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:T(e.chatOptions.tools),tool_choice:"auto"},...o!==void 0&&{response_format:o}}}async function ee(e,t,n){try{await d(t,n,"stream"),t.chatOptions?.onProviderNativeRawPayload?.({provider:"openai",apiSurface:"chat-completions",payloadKind:"request",payload:n});let o=await e.chat.completions.create(n,t.chatOptions?.signal?{signal:t.chatOptions.signal}:void 0);return agentProviderOpenaiCompatible.assembleOpenAICompatibleStream({stream:agentProviderOpenaiCompatible.observeProviderNativeRawPayloadStream(o,{provider:"openai",apiSurface:"chat-completions",onProviderNativeRawPayload:t.chatOptions?.onProviderNativeRawPayload}),onTextDelta:t.chatOptions?.onTextDelta??t.onTextDelta,signal:t.chatOptions?.signal})}catch(o){let r=o.message||"OpenAI streaming request failed";throw new Error(`OpenAI stream failed: ${r}`)}}async function d(e,t,n){if(!e.payloadLogger?.isEnabled())return;let o={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(o,n);}function M(e){if(!e)throw new Error("OpenAI client not available. Either provide a client/apiKey or use an executor.");return e}function x(e){return e.flatMap(t=>te(t))}function w(e,t){let n=e?.map(o=>({type:"function",name:o.name,description:o.description,parameters:o.parameters,strict:t??false}))??[];return n.length>0?n:void 0}function te(e){if(e.role==="user")return [l("user",oe(e.content,e.parts))];if(e.role==="system")return [l("system",e.content)];if(e.role==="tool"){if(!e.toolCallId||e.toolCallId.trim().length===0)throw new Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return [{type:"function_call_output",call_id:e.toolCallId,output:e.content||""}]}return ne(e)}function ne(e){let t=[];e.content&&e.content.length>0&&t.push(l("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(l("assistant","")),t}function oe(e,t){if(!t||t.length===0)return e;let n=t.map(o=>se(o));return e.length>0&&!t.some(o=>o.type==="text")?[{type:"input_text",text:e},...n]:n}function se(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 l(e,t){return {role:e,content:t}}async function*E(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let o=await re(n,t);if(o.done||t?.aborted)break;yield o.value;}}finally{t?.aborted&&await n.return?.();}}async function re(e,t){if(!t)return e.next();if(t.aborted)return {done:true,value:void 0};let n,o=new Promise(s=>{n=()=>s({done:true,value:void 0}),t.addEventListener("abort",n,{once:true});});try{return await Promise.race([e.next(),o])}finally{n&&t.removeEventListener("abort",n);}}function U(e){j(e);let t=e.output??[],n=e.output_text??N(t);return u({content:n,toolCalls:k(t),response:e,reasoning:c(t)})}async function _(e){let t={textParts:[],toolCalls:[],reasoning:W()};for await(let n of E(e.stream,e.signal))ie(t,n,e.onTextDelta);return t.completedResponse!==void 0?le(t):u({content:t.textParts.join(""),toolCalls:t.toolCalls,reasoning:t.reasoning})}function ie(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,m(e.reasoning,c(t.response.output??[]));return}if(t.type==="response.output_item.done"){pe(e,t.item);return}if(t.type==="response.error"||t.type==="response.failed"||t.type==="response.incomplete")throw new Error(`OpenAI Responses API failed: ${fe(t)}`)}function pe(e,t){if(D(t)){e.toolCalls.push(F(t));return}L(t)&&m(e.reasoning,c([t]));}function le(e){let t=e.completedResponse;if(t===void 0)throw new Error("OpenAI Responses stream completed without response metadata");j(t);let n=t.output??[],o=k(n),s=e.textParts.length>0?e.textParts.join(""):t.output_text??N(n),r=c(n);return m(r,e.reasoning),u({content:s,toolCalls:o.length>0?o:e.toolCalls,response:t,reasoning:r})}function u(e){return {id:crypto.randomUUID(),role:"assistant",content:e.content,state:"complete",timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:de(e.response.usage)},metadata:ce(e.response,e.reasoning)}}function ce(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:true}}}function de(e){return {promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:e.total_tokens??0}}function k(e){return e.filter(D).map(t=>F(t))}function D(e){return e.type==="function_call"&&"call_id"in e&&"name"in e&&"arguments"in e}function F(e){return {id:e.call_id,type:"function",function:{name:e.name,arguments:e.arguments}}}function N(e){return e.filter(me).flatMap(t=>t.content).map(ue).join("")}function ue(e){return e.type==="refusal"?e.refusal:e.text}function me(e){return e.type==="message"&&"content"in e&&Array.isArray(e.content)}function c(e){let t=W();for(let n of e){if(!L(n))continue;let o=n.summary?.map(s=>s.text).filter(Ie)??[];t.reasoningSummaryCount+=o.length,t.reasoningSummaries.push(...o),t.hasEncryptedReasoning=t.hasEncryptedReasoning||!!n.encrypted_content;}return t}function L(e){return e.type==="reasoning"}function W(){return {reasoningSummaryCount:0,reasoningSummaries:[],hasEncryptedReasoning:false}}function m(e,t){e.reasoningSummaryCount+=t.reasoningSummaryCount,e.reasoningSummaries.push(...t.reasoningSummaries),e.hasEncryptedReasoning=e.hasEncryptedReasoning||t.hasEncryptedReasoning;}function Ie(e){return e!==void 0}function j(e){if(e.status==="failed"||e.status==="incomplete")throw new Error(`OpenAI Responses API failed: ${e.error?.message??e.status}`)}function fe(e){return e.message??e.error?.message??e.response?.error?.message??"unknown error"}async function $(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return q({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw new Error("OpenAI Responses client not available.");try{let n=V(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:"openai",apiSurface:"responses",payloadKind:"request",payload:n});let o=await e.client.responses.create(n,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:"openai",apiSurface:"responses",payloadKind:"response",payload:o}),U(o)}catch(n){let s=n.message||"OpenAI Responses API request failed";throw new Error(`OpenAI responses failed: ${s}`)}}async function*K(e){let t={deltas:[]},n=e.chatOptions?.onTextDelta??e.onTextDelta,o=q({...e,chatOptions:{...e.chatOptions,onTextDelta:s=>{n?.(s),ve(t,Ae(s));}}}).then(s=>Te(t,s)).catch(s=>Re(t,Pe(s)));yield*ye(t),await o;}async function q(e){if(!e.client)throw new Error("OpenAI Responses client not available.");try{let t=ge(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 _({stream:agentProviderOpenaiCompatible.observeProviderNativeRawPayloadStream(n,{provider:"openai",apiSurface:"responses",onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(t){let o=t.message||"OpenAI Responses streaming request failed";throw new Error(`OpenAI responses stream failed: ${o}`)}}function V(e){let t=e.chatOptions?.model??e.providerOptions.defaultModel;if(!t)throw new Error("Model is required in chat options. Please specify a model in defaultModel configuration.");let n=w(e.chatOptions?.tools,e.providerOptions.strictTools),o=A(e.providerOptions);return {model:t,input:x(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},...o!==void 0&&{text:o},...e.providerOptions.reasoning!==void 0&&{reasoning:e.providerOptions.reasoning},...e.providerOptions.includeEncryptedReasoning===true&&{include:["reasoning.encrypted_content"]},...e.providerOptions.store!==void 0&&{store:e.providerOptions.store}}}function ge(e){return {...V(e),stream:true}}function Ae(e){return {id:crypto.randomUUID(),role:"assistant",content:e,state:"complete",timestamp:new Date,metadata:{providerApiSurface:"responses",isStreamChunk:true,isComplete:false}}}async function*ye(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 be(e.finalMessage);return}await Ce(e);}}function ve(e,t){e.deltas.push(t),I(e);}function Te(e,t){e.finalMessage=t,I(e);}function Re(e,t){e.error=t,I(e);}function Ce(e){return new Promise(t=>{e.wake=t;})}function I(e){e.wake?.(),e.wake=void 0;}function be(e){return {...e,content:"",metadata:{...e.metadata,isStreamChunk:true,isComplete:true}}}function Pe(e){return e instanceof Error?e:new Error(String(e))}var i=class extends agentCore.AbstractAIProvider{name="openai";version="1.0.0";client;options;apiSurface;payloadLogger;responseParser;onTextDelta;constructor(t){if(super(t.logger||agentCore.SilentLogger),this.options=t,this.apiSurface=we(t),Ee(this.apiSurface,t.nativeWebTools),t.executor&&(this.executor=t.executor),!this.executor)if(t.client)this.client=t.client;else if(t.apiKey)this.client=new Se__default.default({apiKey:t.apiKey,...t.organization&&{organization:t.organization},...t.timeout&&{timeout:t.timeout},...t.baseURL&&{baseURL:t.baseURL}});else throw new Error("Either OpenAI client, apiKey, or executor is required");this.responseParser=new p(this.logger),this.payloadLogger=t.payloadLogger;}async chat(t,n){if(this.validateMessages(t),this.validateNativeWebTools(n?.nativeWebTools),this.executor)try{return await this.executeViaExecutorOrDirect(t,n)}catch(o){throw this.logger.error("OpenAI Provider executor chat error:",o instanceof Error?o.message:String(o)),o}return this.apiSurface==="responses"?$({client:this.client,messages:t,chatOptions:n,providerOptions:this.options,onTextDelta:this.onTextDelta}):b({client:this.client,messages:t,chatOptions:n,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}async*chatStream(t,n){if(this.validateNativeWebTools(n?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(t,n);return}catch(o){throw this.logger.error("OpenAI Provider executor stream error:",o instanceof Error?o.message:String(o)),o}if(this.apiSurface==="responses"){yield*K({client:this.client,messages:t,chatOptions:n,providerOptions:this.options,onTextDelta:this.onTextDelta});return}yield*P({client:this.client,messages:t,chatOptions:n,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta});}supportsTools(){return true}getCapabilities(){let t=this.apiSurface==="chat-completions"?"openai-compatible-chat-completions":"openai-responses";return {functionCalling:{supported:true},nativeWebTools:{webSearch:{supported:false,enabled:false,source:t,reason:Q(this.apiSurface,"search")},webFetch:{supported:false,enabled:false,source:t,reason:Q(this.apiSurface,"fetch")}}}}validateConfig(){return !!this.client&&!!this.options}async dispose(){}validateMessages(t){super.validateMessages(t);for(let n of t)if(n.role==="assistant"){let o=n;if(o.toolCalls&&o.toolCalls.length>0&&o.content==="")continue}}};function we(e){return e.apiSurface!==void 0?e.apiSurface:e.baseURL?"chat-completions":"responses"}function Q(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 Ee(e,t){if(!(t?.webSearch!==true&&t?.webFetch!==true))throw new Error(`Provider openai native web search/fetch is not supported for apiSurface ${e} in this Robota provider version.`)}var J=class{static filterMessagesForOpenAI(t){return t.filter(n=>n.role==="user"||n.role==="assistant"||n.role==="system"?true:n.role==="tool"?!!(n.toolCallId&&n.toolCallId.trim()!==""&&n.toolCallId!=="unknown"):false)}static toOpenAIFormat(t){return this.filterMessagesForOpenAI(t).map(o=>this.convertMessage(o))}static convertMessage(t){let n=t.role;if(n==="user")return {role:"user",content:t.content};if(n==="assistant"){let s=t;return s.toolCalls&&s.toolCalls.length>0?{role:"assistant",content:s.content===""?null:s.content||null,tool_calls:s.toolCalls.map(a=>({id:a.id,type:"function",function:{name:a.function.name,arguments:a.function.arguments}}))}:{role:"assistant",content:s.content===null||s.content===""?null:s.content||""}}if(n==="system")return {role:"system",content:t.content};if(n==="tool"){if(!t.toolCallId||t.toolCallId.trim()==="")throw new Error(`Tool message missing toolCallId: ${JSON.stringify(t)}`);return {role:"tool",content:t.content,tool_call_id:t.toolCallId}}let o=n;throw new Error(`Unsupported message role: ${o}`)}static addSystemPromptIfNeeded(t,n){return !n||t.some(s=>s.role==="system")?t:[{role:"system",content:n},...t]}};var Ue="https://api.openai.com/v1/models",z="https://platform.openai.com/docs/api-reference/models/list";async function H(e,t={}){if(!e.apiKey)return f("OpenAI model catalog refresh requires apiKey.");let n=t.fetcher??Fe,o=t.now??(()=>new Date),s=_e(e.baseURL);try{let r=await n(s,{headers:{Authorization:`Bearer ${e.apiKey}`}});if(!r.ok)return f(De(r));let a=await r.json(),O=ke(a);return {status:"live",entries:O,lastVerifiedAt:o().toISOString(),sourceUrl:z,message:`${O.length} OpenAI model(s) discovered.`}}catch(r){return f(r instanceof Error?r.message:String(r))}}function _e(e){return e?`${e.replace(/\/$/,"")}/models`:Ue}function ke(e){return (e.data??[]).map(t=>t.id).filter(t=>t!==void 0&&t.trim().length>0).map(t=>({id:t,displayName:t,lifecycle:"active"}))}function De(e){let t=e.statusText?` ${e.statusText}`:"";return `OpenAI model catalog refresh failed: HTTP ${e.status}${t}`}function f(e){return {status:"unavailable",sourceUrl:z,message:e}}async function Fe(e,t){let n=await fetch(e,t);return {ok:n.ok,status:n.status,statusText:n.statusText,json:()=>n.json()}}var St=void 0,Y="$ENV:OPENAI_API_KEY",Le="https://platform.openai.com/api-keys",We="https://developers.openai.com/api/reference/overview#authentication",je="2026-05-08",$e=[{kind:"api-key",label:"OpenAI API keys",url:Le,sourceUrl:We,lastVerifiedAt:je}];function Mt(){return {type:"openai",displayName:"OpenAI",description:"Official OpenAI Responses API provider",defaults:{apiKey:Y},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:$e,setupSteps:[{key:"model",title:"OpenAI model",required:true},{key:"apiKey",title:"OpenAI API key",defaultValue:Y,masked:true}],requiresApiKey:true,probeProfile:agentProviderOpenaiCompatible.probeOpenAICompatibleProfile,refreshModelCatalog:({profile:e})=>H(e),createProvider:e=>{let t=qe(e.options),n=Ve(e.options);return Qe(e.baseURL,t,n),new i({apiKey:Ke(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 Ke(e){if(!e)throw new Error("Provider openai requires apiKey");return e}function qe(e){let t=e?.apiSurface;if(t==="responses"||t==="chat-completions")return t}function Ve(e){let t=G(e?.nativeWebTools)??G(e?.builtInWebTools);if(t!==void 0)return t}function G(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 Qe(e,t,n){if(!(n?.webSearch!==true&&n?.webFetch!==true))throw e!==void 0||t==="chat-completions"?new Error("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."):new Error("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.")}
2
- exports.DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE=Y;exports.DEFAULT_OPENAI_PROVIDER_MODEL=St;exports.OpenAIConversationAdapter=J;exports.OpenAIProvider=i;exports.createOpenAIProviderDefinition=Mt;exports.refreshOpenAIModelCatalog=H;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./rolldown-runtime-CMqjfN_6.cjs");let t=require("@robota-sdk/agent-core"),n=require("openai");n=e.t(n,1);let r=require("@robota-sdk/agent-provider-openai-compatible/shared"),i=require("node:crypto");function a(e){return(0,r.convertToOpenAICompatibleMessages)(e)}function o(e){return(0,r.convertToOpenAICompatibleTools)(e)}function s(e,t){return t?.type===void 0?e:t.type===`json_schema`?{...e,responseFormat:`json_schema`,jsonSchema:{name:t.name??`structured_output`,schema:t.schema}}:{...e,responseFormat:t.type}}function c(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{type:`json_object`};let t=u(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 l(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{format:{type:`json_object`}};let t=u(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 u(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}}}async function d(e){if(typeof e.withResponse==`function`){let{data:t,request_id:n}=await e.withResponse();return{data:t,...typeof n==`string`&&n.length>0&&{providerRequestId:n}}}return{data:await e}}function f(e){let t=e?._request_id;return typeof t==`string`&&t.length>0?t:void 0}function p(e,t){return t===void 0?e:{...e,metadata:{...e.metadata,providerRequestId:t}}}function m(e,t){let n=t!==void 0&&Object.keys(t).length>0;if(!(!e&&!n))return{...e?{signal:e}:{},...n?{headers:{...t}}:{}}}async function ee(e){let n=v(e.client);try{let t=g(e);if(e.chatOptions?.onTextDelta??e.onTextDelta)return await ne(n,e,{...t,stream:!0,...h(e)});await _(e,t,`chat`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:t});let r=m(void 0,e.requestHeaders),i=r?await n.chat.completions.create(t,r):await n.chat.completions.create(t);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`response`,payload:i}),p(e.responseParser.parseResponse(i),f(i))}catch(e){throw(0,t.toProviderError)(e,`openai`,`OpenAI chat failed`)}}async function*te(e){let n=v(e.client);try{let t={...g(e),stream:!0,...h(e)};await _(e,t,`stream`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:t});let{data:i,providerRequestId:a}=await d(n.chat.completions.create(t,m(e.chatOptions?.signal,e.requestHeaders)));for await(let t of(0,r.observeProviderNativeRawPayloadStream)(i,{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload})){let n=e.responseParser.parseStreamingChunk(t);n&&(yield p(n,a))}}catch(e){throw(0,t.toProviderError)(e,`openai`,`OpenAI stream failed`)}}function h(e){return e.providerOptions.includeStreamUsage===!1?{}:{stream_options:{include_usage:!0}}}function g(e){let t=a(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 i=c(s(e.providerOptions,e.chatOptions?.responseFormat));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:o(e.chatOptions.tools),tool_choice:(0,r.toOpenAICompatibleToolChoice)(e.chatOptions.toolChoice)},...i!==void 0&&{response_format:i}}}async function ne(e,n,i){try{await _(n,i,`stream`),n.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:i});let{data:t,providerRequestId:a}=await d(e.chat.completions.create(i,m(n.chatOptions?.signal,n.requestHeaders)));return p(await(0,r.assembleOpenAICompatibleStream)({stream:(0,r.observeProviderNativeRawPayloadStream)(t,{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:n.chatOptions?.onProviderNativeRawPayload}),onTextDelta:n.chatOptions?.onTextDelta??n.onTextDelta,signal:n.chatOptions?.signal}),a)}catch(e){throw(0,t.toProviderError)(e,`openai`,`OpenAI stream failed`)}}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}const y={verifiedAt:`2026-09-11`,sourceUrl:`https://platform.openai.com/docs/api-reference/responses`,models:{"gpt-5.1":{supportedEfforts:[`none`,`low`,`medium`,`high`],defaultEffort:`none`,nativeControlId:`responses.reasoning.effort`}}};var b=class{parser;constructor(e){this.parser=new r.OpenAICompatibleResponseParser({logger:e})}parseResponse(e){try{return this.parser.parseResponse(e)}catch(e){let t=x(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=x(e instanceof Error?e.message:`OpenAI chunk parsing failed`);throw Error(`OpenAI chunk parsing failed: ${t}`)}}};function x(e){return e.replace(/^OpenAI-compatible response parsing failed: /,``).replace(/^OpenAI-compatible chunk parsing failed: /,``).replace(`OpenAI-compatible response`,`OpenAI response`)}function S(e){return e}function C(e,t){if(t===void 0)return e;if(t.effective===null||t.disposition===`model-default`){if(e?.effort!==void 0)throw Error(`Static reasoning.effort ${e.effort} conflicts with ${t.disposition===`model-default`?`provider-default selection`:`an effort resolution that does not apply a native control`}.`);return e}let n=S(t.effective);if(e?.effort!==void 0&&e.effort!==n)throw Error(`Resolved effort ${n} conflicts with static reasoning.effort ${e.effort}.`);return{...e,effort:n}}function w(e){return e.flatMap(e=>re(e))}function T(e,t){let n=t??!1,r=e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters,strict:n}))??[];return r.length>0?r:void 0}function re(e){if(e.role===`user`)return[E(`user`,ae(e.content,e.parts))];if(e.role===`system`)return[E(`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(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 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 E(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){G(e);let t=e.output??[];return j({content:e.output_text??L(t),toolCalls:P(t),response:e,reasoning:B(t)})}async function D(e){let t={textParts:[],toolCalls:[],reasoning:H()};for await(let n of se(e.stream,e.signal))O(t,n,e.onTextDelta);return t.completedResponse===void 0?j({content:t.textParts.join(``),toolCalls:t.toolCalls,reasoning:t.reasoning}):A(t)}function O(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,U(e.reasoning,B(t.response.output??[]));return}if(t.type===`response.output_item.done`){k(e,t.item);return}if(t.type===`response.error`||t.type===`response.failed`||t.type===`response.incomplete`)throw Error(`OpenAI Responses API failed: ${ue(t)}`)}function k(e,t){if(F(t)){e.toolCalls.push(I(t));return}V(t)&&U(e.reasoning,B([t]))}function A(e){let t=e.completedResponse;if(t===void 0)throw Error(`OpenAI Responses stream completed without response metadata`);G(t);let n=t.output??[],r=P(n),i=e.textParts.length>0?e.textParts.join(``):t.output_text??L(n),a=B(n);return U(a,e.reasoning),j({content:i,toolCalls:r.length>0?r:e.toolCalls,response:t,reasoning:a})}function j(e){return{id:(0,i.randomUUID)(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:N(e.response.usage)},metadata:{...M(e.response,e.reasoning),...e.response?.usage!==void 0&&{usageProvenance:e.response.usage.input_tokens!==void 0&&e.response.usage.output_tokens!==void 0&&e.response.usage.total_tokens!==void 0?`complete`:`partial`}}}}function M(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 N(e){return{promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:e.total_tokens??0}}function P(e){return e.filter(F).map(e=>I(e))}function F(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function I(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function L(e){return e.filter(z).flatMap(e=>e.content).map(R).join(``)}function R(e){return e.type===`refusal`?e.refusal:e.text}function z(e){return e.type===`message`&&`content`in e&&Array.isArray(e.content)}function B(e){let t=H();for(let n of e){if(!V(n))continue;let e=n.summary?.map(e=>e.text).filter(W)??[];t.reasoningSummaryCount+=e.length,t.reasoningSummaries.push(...e),t.hasEncryptedReasoning=t.hasEncryptedReasoning||!!n.encrypted_content}return t}function V(e){return e.type===`reasoning`}function H(){return{reasoningSummaryCount:0,reasoningSummaries:[],hasEncryptedReasoning:!1}}function U(e,t){e.reasoningSummaryCount+=t.reasoningSummaryCount,e.reasoningSummaries.push(...t.reasoningSummaries),e.hasEncryptedReasoning=e.hasEncryptedReasoning||t.hasEncryptedReasoning}function W(e){return e!==void 0}function G(e){if(e.status===`failed`||e.status===`incomplete`)throw Error(`OpenAI Responses API failed: ${e.error?.message??e.status}`)}function ue(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function de(e){let n=e.chatOptions?.onTextDelta??e.onTextDelta;if(n)return K({...e,chatOptions:{...e.chatOptions,onTextDelta:n}});if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let t=q(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,m(e.chatOptions?.signal,e.requestHeaders));return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`response`,payload:n}),p(le(n),f(n))}catch(e){throw(0,t.toProviderError)(e,`openai`,`OpenAI responses failed`)}}async function*fe(e){let t={deltas:[]},n=e.chatOptions?.onTextDelta??e.onTextDelta,r=K({...e,chatOptions:{...e.chatOptions,onTextDelta:e=>{n?.(e),ge(t,me(e))}}}).then(e=>_e(t,e)).catch(e=>ve(t,xe(e)));yield*he(t),await r}async function K(e){if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let t=pe(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:t});let{data:n,providerRequestId:i}=await d(e.client.responses.create(t,m(e.chatOptions?.signal,e.requestHeaders)));return p(await D({stream:(0,r.observeProviderNativeRawPayloadStream)(n,{provider:`openai`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal}),i)}catch(e){throw(0,t.toProviderError)(e,`openai`,`OpenAI responses stream failed`)}}function q(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=T(e.chatOptions?.tools,e.providerOptions.strictTools),i=l(e.providerOptions),a=C(e.providerOptions.reasoning,e.chatOptions?.effortResolution);return{model:t,input:w(e.messages),...n!==void 0&&{tools:n,tool_choice:(0,r.toOpenAIResponsesToolChoice)(e.chatOptions?.toolChoice)},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...i!==void 0&&{text:i},...a!==void 0&&{reasoning:a},...e.providerOptions.includeEncryptedReasoning===!0&&{include:[`reasoning.encrypted_content`]},...e.providerOptions.store!==void 0&&{store:e.providerOptions.store}}}function pe(e){return{...q(e),stream:!0}}function me(e){return{id:(0,i.randomUUID)(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{providerApiSurface:`responses`,isStreamChunk:!0,isComplete:!1}}}async function*he(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 be(e.finalMessage);return}await ye(e)}}function ge(e,t){e.deltas.push(t),J(e)}function _e(e,t){e.finalMessage=t,J(e)}function ve(e,t){e.error=t,J(e)}function ye(e){return new Promise(t=>{e.wake=t})}function J(e){e.wake?.(),e.wake=void 0}function be(e){return{...e,content:``,metadata:{...e.metadata,isStreamChunk:!0,isComplete:!0}}}function xe(e){return e instanceof Error?e:Error(String(e))}var Y=class extends t.AbstractAIProvider{name=`openai`;version=`1.0.0`;client;options;apiSurface;payloadLogger;responseParser;onTextDelta;constructor(e){if(super(e.logger||t.SilentLogger),this.options=e,this.apiSurface=Se(e),Ce(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 n.default({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 b(this.logger),this.payloadLogger=e.payloadLogger}async chat(e,t){this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools);let n=this.resolveEffortOptions(t);if(this.executor)try{let t=await this.executeViaExecutorOrDirect(e,n);return t.modelEffortOutcome===void 0&&this.publishModelEffortOutcome(n,`opaque-executor`),t.message}catch(e){throw this.logger.error(`OpenAI Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}if(this.apiSurface===`responses`){let t=await de({client:this.client,messages:e,chatOptions:this.projectChatOptions(n),providerOptions:this.options,onTextDelta:this.onTextDelta,requestHeaders:this.traceRequestHeaders(n)});return this.publishModelEffortOutcome(n),t}let r=await ee({client:this.client,messages:e,chatOptions:this.projectChatOptions(n),providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta,requestHeaders:this.traceRequestHeaders(n)});return this.publishModelEffortOutcome(n),r}async*chatStream(e,t){this.validateNativeWebTools(t?.nativeWebTools);let n=this.resolveEffortOptions(t);if(this.executor)try{let t=!1;for await(let r of this.executeStreamViaExecutorOrDirect(e,n))r.kind===`message`?yield r.message:t=r.modelEffortOutcome!==void 0;t||this.publishModelEffortOutcome(n,`opaque-executor`);return}catch(e){throw this.logger.error(`OpenAI Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}yield*this.streamDirect(e,n)}async*streamDirect(e,t){if(this.apiSurface===`responses`){yield*fe({client:this.client,messages:e,chatOptions:this.projectChatOptions(t),providerOptions:this.options,onTextDelta:this.onTextDelta,requestHeaders:this.traceRequestHeaders(t)}),this.publishModelEffortOutcome(t);return}yield*te({client:this.client,messages:e,chatOptions:this.projectChatOptions(t),providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta,requestHeaders:this.traceRequestHeaders(t)}),this.publishModelEffortOutcome(t)}endpointIsVendorDefault(){return this.options.baseURL===void 0}canPropagateTraceContext(){return!this.executor&&this.effectiveBaseUrl()!==void 0}effectiveBaseUrl(){let e=this.client?.baseURL;return typeof e==`string`&&e.length>0?e:void 0}traceRequestHeaders(e){return this.canPropagateTraceContext()?(0,t.traceHeadersFor)(this.effectiveBaseUrl(),e?.outboundTraceContext):{}}effortTable(){return this.endpointIsVendorDefault()&&this.apiSurface===`responses`?y:void 0}resolveEffortOptions(e){if(e?.effort===void 0||e.effortResolution!==void 0)return e;let n=e.model??this.options.defaultModel;return n===void 0?e:{...e,effortResolution:(0,t.resolveModelEffort)(this.effortTable(),n,e.effort)}}projectionProfile(){return this.options.strictTools?{...t.STRICT_TOOL_SCHEMA_PROFILE,providerName:`openai`}:{...t.PERMISSIVE_TOOL_SCHEMA_PROFILE,providerName:`openai`}}projectChatOptions(e){if(!e?.tools)return e;let t=e.model??this.options.defaultModel??``,n=this.projectTools(e.tools,t);return{...e,tools:n&&n.length>0?n:void 0}}publishModelEffortOutcome(e,n){let r=e?.effortResolution,i=e?.onModelEffortOutcome;if(r===void 0||i===void 0)return;let a=n===void 0?r.effective!==null&&r.disposition!==`model-default`?{state:`sent`,id:`responses.reasoning.effort`}:{state:`omitted`,reason:r.disposition===`model-default`?`provider-default-selection`:`model-effort-not-applied`}:{state:`omitted`,reason:n},o=n===void 0?{state:`sent`}:{state:`not-dispatched`,reason:n};try{i((0,t.createModelEffortOutcome)(r,{nativeControl:a,providerDispatch:o}))}catch(e){this.logger.warn(`Model-effort outcome observer failed`,{error:e instanceof Error?e.message:String(e)})}}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:X(this.apiSurface,`search`)},webFetch:{supported:!1,enabled:!1,source:e,reason:X(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 Se(e){return e.apiSurface===void 0?e.baseURL?`chat-completions`:`responses`:e.apiSurface}function X(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 Ce(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 we=class{static filterMessagesForOpenAI(e){return e.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`system`||e.role===`tool`&&!!(e.toolCallId&&e.toolCallId.trim()!==``&&e.toolCallId!==`unknown`))}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 Z=`$ENV:OPENAI_API_KEY`,Te=[{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 Ee(){return{type:`openai`,displayName:`OpenAI`,description:`GPT series — general-purpose assistant. API key required.`,category:`cloud-paid`,costPerTokenUsd:.001,defaults:{apiKey:Z},endpoint:{host:`api.openai.com`,port:443},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:Te,setupSteps:[{key:`model`,title:`OpenAI model`,required:!0},{key:`apiKey`,title:`OpenAI API key`,defaultValue:Z,masked:!0}],requiresApiKey:!0,probeProfile:r.probeOpenAICompatibleProfile,destinationEnvironment:[`OPENAI_BASE_URL`,`OPENAI_ORG_ID`,`OPENAI_PROJECT_ID`],createProvider:e=>{let t=Q(e.options),n=Oe(e.options);return ke(e.baseURL,t,n),new Y({apiKey:De(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 De(e){if(!e)throw Error(`Provider openai requires apiKey`);return e}function Q(e){let t=e?.apiSurface;if(t===`responses`||t===`chat-completions`)return t}function Oe(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 ke(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.`)}exports.DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE=Z,exports.DEFAULT_OPENAI_PROVIDER_MODEL=void 0,exports.OpenAIConversationAdapter=we,exports.OpenAIProvider=Y,exports.createOpenAIProviderDefinition=Ee;