getkova 2026.4.21 → 2026.4.22

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 (102) hide show
  1. package/dist/control-ui/apple-touch-icon.png +0 -0
  2. package/dist/control-ui/assets/agents-CLtFQRXd.js +918 -0
  3. package/dist/control-ui/assets/agents-CLtFQRXd.js.map +1 -0
  4. package/dist/control-ui/assets/anthropic-CFEPAL-v.js +37 -0
  5. package/dist/control-ui/assets/anthropic-CFEPAL-v.js.map +1 -0
  6. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js +2 -0
  7. package/dist/control-ui/assets/azure-openai-responses-CxiWQLmZ.js.map +1 -0
  8. package/dist/control-ui/assets/briefing-DS4VWpUL.js +121 -0
  9. package/dist/control-ui/assets/briefing-DS4VWpUL.js.map +1 -0
  10. package/dist/control-ui/assets/canvas-BfC_2Nqy.js +17 -0
  11. package/dist/control-ui/assets/canvas-BfC_2Nqy.js.map +1 -0
  12. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js +2 -0
  13. package/dist/control-ui/assets/channel-config-extras-YNNd-4PG.js.map +1 -0
  14. package/dist/control-ui/assets/channels-BKdM7i5r.js +471 -0
  15. package/dist/control-ui/assets/channels-BKdM7i5r.js.map +1 -0
  16. package/dist/control-ui/assets/cron-C11m3yJi.js +928 -0
  17. package/dist/control-ui/assets/cron-C11m3yJi.js.map +1 -0
  18. package/dist/control-ui/assets/de-rLAkQOBc.js +2 -0
  19. package/dist/control-ui/assets/de-rLAkQOBc.js.map +1 -0
  20. package/dist/control-ui/assets/debug-DFf2qCcM.js +94 -0
  21. package/dist/control-ui/assets/debug-DFf2qCcM.js.map +1 -0
  22. package/dist/control-ui/assets/dist-D8DZLmCF.js +18 -0
  23. package/dist/control-ui/assets/dist-D8DZLmCF.js.map +1 -0
  24. package/dist/control-ui/assets/employees-DV-5FV4K.js +104 -0
  25. package/dist/control-ui/assets/employees-DV-5FV4K.js.map +1 -0
  26. package/dist/control-ui/assets/es-CIeD3O54.js +2 -0
  27. package/dist/control-ui/assets/es-CIeD3O54.js.map +1 -0
  28. package/dist/control-ui/assets/event-stream-B8X6sYaV.js +2 -0
  29. package/dist/control-ui/assets/event-stream-B8X6sYaV.js.map +1 -0
  30. package/dist/control-ui/assets/format-BahKhiOC.js +2 -0
  31. package/dist/control-ui/assets/format-BahKhiOC.js.map +1 -0
  32. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js +2 -0
  33. package/dist/control-ui/assets/github-copilot-headers-CrI0CIJ7.js.map +1 -0
  34. package/dist/control-ui/assets/google-BT0bmsh5.js +2 -0
  35. package/dist/control-ui/assets/google-BT0bmsh5.js.map +1 -0
  36. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js +3 -0
  37. package/dist/control-ui/assets/google-gemini-cli-BpxbH95Q.js.map +1 -0
  38. package/dist/control-ui/assets/google-shared-CbPHVnPr.js +12 -0
  39. package/dist/control-ui/assets/google-shared-CbPHVnPr.js.map +1 -0
  40. package/dist/control-ui/assets/google-vertex-lQwbjEII.js +2 -0
  41. package/dist/control-ui/assets/google-vertex-lQwbjEII.js.map +1 -0
  42. package/dist/control-ui/assets/hash-Bt1aVMQ3.js +2 -0
  43. package/dist/control-ui/assets/hash-Bt1aVMQ3.js.map +1 -0
  44. package/dist/control-ui/assets/inbox-C4tOnlJr.js +100 -0
  45. package/dist/control-ui/assets/inbox-C4tOnlJr.js.map +1 -0
  46. package/dist/control-ui/assets/index-DYMuTfvX.css +1 -0
  47. package/dist/control-ui/assets/index-XGDpaFxG.js +5482 -0
  48. package/dist/control-ui/assets/index-XGDpaFxG.js.map +1 -0
  49. package/dist/control-ui/assets/instances-Cyr-tbN6.js +57 -0
  50. package/dist/control-ui/assets/instances-Cyr-tbN6.js.map +1 -0
  51. package/dist/control-ui/assets/kova-logo.png +0 -0
  52. package/dist/control-ui/assets/lit-zdTgzAJI.js +3 -0
  53. package/dist/control-ui/assets/lit-zdTgzAJI.js.map +1 -0
  54. package/dist/control-ui/assets/local-storage-D3baoRWx.js +2 -0
  55. package/dist/control-ui/assets/local-storage-D3baoRWx.js.map +1 -0
  56. package/dist/control-ui/assets/logs-B7--7dYP.js +74 -0
  57. package/dist/control-ui/assets/logs-B7--7dYP.js.map +1 -0
  58. package/dist/control-ui/assets/meetings-DSqn6s7n.js +185 -0
  59. package/dist/control-ui/assets/meetings-DSqn6s7n.js.map +1 -0
  60. package/dist/control-ui/assets/mistral-CBrDC_Gv.js +8 -0
  61. package/dist/control-ui/assets/mistral-CBrDC_Gv.js.map +1 -0
  62. package/dist/control-ui/assets/nodes-Cvq_sAqT.js +430 -0
  63. package/dist/control-ui/assets/nodes-Cvq_sAqT.js.map +1 -0
  64. package/dist/control-ui/assets/openai-Cn7eGqwa.js +17 -0
  65. package/dist/control-ui/assets/openai-Cn7eGqwa.js.map +1 -0
  66. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js +8 -0
  67. package/dist/control-ui/assets/openai-codex-responses-DuhESMYF.js.map +1 -0
  68. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js +6 -0
  69. package/dist/control-ui/assets/openai-completions-Bv33lqKL.js.map +1 -0
  70. package/dist/control-ui/assets/openai-responses-BPxpapOg.js +2 -0
  71. package/dist/control-ui/assets/openai-responses-BPxpapOg.js.map +1 -0
  72. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js +11 -0
  73. package/dist/control-ui/assets/openai-responses-shared-8nKH8ywL.js.map +1 -0
  74. package/dist/control-ui/assets/pdf-BwYFZMZM.js +57 -0
  75. package/dist/control-ui/assets/pdf-BwYFZMZM.js.map +1 -0
  76. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js +2 -0
  77. package/dist/control-ui/assets/pdf.worker.min-BmpgcBpm.js.map +1 -0
  78. package/dist/control-ui/assets/pdf.worker.min-C8PGFc0r.mjs +28 -0
  79. package/dist/control-ui/assets/preload-helper-Chd9yIcd.js +1 -0
  80. package/dist/control-ui/assets/pt-BR-lSsBb08k.js +2 -0
  81. package/dist/control-ui/assets/pt-BR-lSsBb08k.js.map +1 -0
  82. package/dist/control-ui/assets/routing-DizI_FiJ.js +157 -0
  83. package/dist/control-ui/assets/routing-DizI_FiJ.js.map +1 -0
  84. package/dist/control-ui/assets/sessions-N9rgJP2R.js +236 -0
  85. package/dist/control-ui/assets/sessions-N9rgJP2R.js.map +1 -0
  86. package/dist/control-ui/assets/skills-D1vP4MkL.js +280 -0
  87. package/dist/control-ui/assets/skills-D1vP4MkL.js.map +1 -0
  88. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js +11 -0
  89. package/dist/control-ui/assets/skills-shared-Bg0Qcnkp.js.map +1 -0
  90. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js +2 -0
  91. package/dist/control-ui/assets/transform-messages-XKqwKV3D.js.map +1 -0
  92. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js +2 -0
  93. package/dist/control-ui/assets/zh-CN-C5tPG8Eu.js.map +1 -0
  94. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js +2 -0
  95. package/dist/control-ui/assets/zh-TW-CPSoC7Wz.js.map +1 -0
  96. package/dist/control-ui/favicon-32.png +0 -0
  97. package/dist/control-ui/favicon.ico +0 -0
  98. package/dist/control-ui/favicon.png +0 -0
  99. package/dist/control-ui/favicon.svg +22 -0
  100. package/dist/control-ui/index.html +73 -0
  101. package/dist/control-ui/openclaw-canvas-auth-sw.js +57 -0
  102. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ import{r as e,t}from"./event-stream-B8X6sYaV.js";import{t as n}from"./preload-helper-Chd9yIcd.js";import{g as r}from"./index-XGDpaFxG.js";import{i,r as a}from"./transform-messages-XKqwKV3D.js";import{n as o,r as s,t as c}from"./openai-responses-shared-8nKH8ywL.js";var l=null;typeof process<`u`&&(process.versions?.node||process.versions?.bun)&&(e=>n(()=>import(e),[],import.meta.url))(`node:os`).then(e=>{l=e});var u=`https://chatgpt.com/backend-api`,d=`https://api.openai.com/auth`,f=3,p=1e3,m=new Set([`openai`,`openai-codex`,`opencode`]),h=new Set([`completed`,`incomplete`,`failed`,`cancelled`,`queued`,`in_progress`]);function g(e,t){return e===429||e===500||e===502||e===503||e===504?!0:/rate.?limit|overloaded|service.?unavailable|upstream.?connect|connection.?refused/i.test(t)}function _(e,t){return new Promise((n,r)=>{if(t?.aborted){r(Error(`Request was aborted`));return}let i=setTimeout(n,e);t?.addEventListener(`abort`,()=>{clearTimeout(i),r(Error(`Request was aborted`))})})}var v=(e,n,i)=>{let a=new t;return(async()=>{let t={role:`assistant`,content:[],api:`openai-codex-responses`,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()};try{let o=i?.apiKey||r(e.provider)||``;if(!o)throw Error(`No API key for provider: ${e.provider}`);let s=G(o),c=b(e,n,i),l=await i?.onPayload?.(c,e);l!==void 0&&(c=l);let u=i?.sessionId||K(),d=J(e.headers,i?.headers,s,o,i?.sessionId),m=Y(e.headers,i?.headers,s,o,u),h=JSON.stringify(c),v=i?.transport||`sse`;if(v!==`sse`){let n=!1;try{if(await U(C(e.baseUrl),c,m,t,a,e,()=>{n=!0},i),i?.signal?.aborted)throw Error(`Request was aborted`);a.push({type:`done`,reason:t.stopReason,message:t}),a.end();return}catch(e){if(v===`websocket`||n)throw e}}let y,x;for(let t=0;t<=f;t++){if(i?.signal?.aborted)throw Error(`Request was aborted`);try{if(y=await fetch(S(e.baseUrl),{method:`POST`,headers:d,body:h,signal:i?.signal}),y.ok)break;let n=await y.text();if(t<f&&g(y.status,n)){await _(p*2**t,i?.signal);continue}let r=await W(new Response(n,{status:y.status,statusText:y.statusText}));throw Error(r.friendlyMessage||r.message)}catch(e){if(e instanceof Error&&(e.name===`AbortError`||e.message===`Request was aborted`))throw Error(`Request was aborted`);if(x=e instanceof Error?e:Error(String(e)),t<f&&!x.message.includes(`usage limit`)){await _(p*2**t,i?.signal);continue}throw x}}if(!y?.ok)throw x??Error(`Failed after retries`);if(!y.body)throw Error(`No response body`);if(a.push({type:`start`,partial:t}),await w(y,t,a,e),i?.signal?.aborted)throw Error(`Request was aborted`);a.push({type:`done`,reason:t.stopReason,message:t}),a.end()}catch(e){t.stopReason=i?.signal?.aborted?`aborted`:`error`,t.errorMessage=e instanceof Error?e.message:String(e),a.push({type:`error`,reason:t.stopReason,error:t}),a.end()}})(),a},y=(t,n,o)=>{let s=o?.apiKey||r(t.provider);if(!s)throw Error(`No API key for provider: ${t.provider}`);let c=a(t,o,s),l=e(t)?o?.reasoning:i(o?.reasoning);return v(t,n,{...c,reasoningEffort:l})};function b(e,t,n){let r=c(e,t,m,{includeSystemPrompt:!1}),i={model:e.id,store:!1,stream:!0,instructions:t.systemPrompt,input:r,text:{verbosity:n?.textVerbosity||`medium`},include:[`reasoning.encrypted_content`],prompt_cache_key:n?.sessionId,tool_choice:`auto`,parallel_tool_calls:!0};return n?.temperature!==void 0&&(i.temperature=n.temperature),t.tools&&(i.tools=o(t.tools,{strict:null})),n?.reasoningEffort!==void 0&&(i.reasoning={effort:x(e.id,n.reasoningEffort),summary:n.reasoningSummary??`auto`}),i}function x(e,t){let n=e.includes(`/`)?e.split(`/`).pop():e;return(n.startsWith(`gpt-5.2`)||n.startsWith(`gpt-5.3`)||n.startsWith(`gpt-5.4`))&&t===`minimal`?`low`:n===`gpt-5.1`&&t===`xhigh`?`high`:n===`gpt-5.1-codex-mini`?t===`high`||t===`xhigh`?`high`:`medium`:t}function S(e){let t=(e&&e.trim().length>0?e:u).replace(/\/+$/,``);return t.endsWith(`/codex/responses`)?t:t.endsWith(`/codex`)?`${t}/responses`:`${t}/codex/responses`}function C(e){let t=new URL(S(e));return t.protocol===`https:`&&(t.protocol=`wss:`),t.protocol===`http:`&&(t.protocol=`ws:`),t.toString()}async function w(e,t,n,r){await s(T(D(e)),t,n,r)}async function*T(e){for await(let t of e){let e=typeof t.type==`string`?t.type:void 0;if(e){if(e===`error`){let e=t.code||``,n=t.message||``;throw Error(`Codex error: ${n||e||JSON.stringify(t)}`)}if(e===`response.failed`){let e=t.response?.error?.message;throw Error(e||`Codex response failed`)}if(e===`response.done`||e===`response.completed`||e===`response.incomplete`){let e=t.response,n=e&&{...e,status:E(e.status)};yield{...t,type:`response.completed`,response:n};return}yield t}}}function E(e){if(typeof e==`string`)return h.has(e)?e:void 0}async function*D(e){if(!e.body)return;let t=e.body.getReader(),n=new TextDecoder,r=``;try{for(;;){let{done:e,value:i}=await t.read();if(e)break;r+=n.decode(i,{stream:!0});let a=r.indexOf(`
2
+
3
+ `);for(;a!==-1;){let e=r.slice(0,a);r=r.slice(a+2);let t=e.split(`
4
+ `).filter(e=>e.startsWith(`data:`)).map(e=>e.slice(5).trim());if(t.length>0){let e=t.join(`
5
+ `).trim();if(e&&e!==`[DONE]`)try{yield JSON.parse(e)}catch{}}a=r.indexOf(`
6
+
7
+ `)}}}finally{try{await t.cancel()}catch{}try{t.releaseLock()}catch{}}}var O=`responses_websockets=2026-02-06`,k=300*1e3,A=new Map;function j(){let e=globalThis.WebSocket;return typeof e==`function`?e:null}function M(e){let t={};for(let[n,r]of e.entries())t[n]=r;return t}function N(e){let t=e.readyState;return typeof t==`number`?t:void 0}function P(e){let t=N(e);return t===void 0||t===1}function F(e,t=1e3,n=`done`){try{e.close(t,n)}catch{}}function I(e,t){t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=setTimeout(()=>{t.busy||(F(t.socket,1e3,`idle_timeout`),A.delete(e))},k)}async function L(e,t,n){let r=j();if(!r)throw Error(`WebSocket transport is not available in this runtime`);let i=M(t);return delete i[`OpenAI-Beta`],new Promise((t,a)=>{let o=!1,s;try{s=new r(e,{headers:i})}catch(e){a(e instanceof Error?e:Error(String(e)));return}let c=()=>{o||(o=!0,f(),t(s))},l=e=>{let t=z(e);o||(o=!0,f(),a(t))},u=e=>{let t=B(e);o||(o=!0,f(),a(t))},d=()=>{o||(o=!0,f(),s.close(1e3,`aborted`),a(Error(`Request was aborted`)))},f=()=>{s.removeEventListener(`open`,c),s.removeEventListener(`error`,l),s.removeEventListener(`close`,u),n?.removeEventListener(`abort`,d)};s.addEventListener(`open`,c),s.addEventListener(`error`,l),s.addEventListener(`close`,u),n?.addEventListener(`abort`,d)})}async function R(e,t,n,r){if(!n){let n=await L(e,t,r);return{socket:n,release:({keep:e}={})=>{if(e===!1){F(n);return}F(n)}}}let i=A.get(n);if(i){if(i.idleTimer&&=(clearTimeout(i.idleTimer),void 0),!i.busy&&P(i.socket))return i.busy=!0,{socket:i.socket,release:({keep:e}={})=>{if(!e||!P(i.socket)){F(i.socket),A.delete(n);return}i.busy=!1,I(n,i)}};if(i.busy){let n=await L(e,t,r);return{socket:n,release:()=>{F(n)}}}P(i.socket)||(F(i.socket),A.delete(n))}let a=await L(e,t,r),o={socket:a,busy:!0};return A.set(n,o),{socket:a,release:({keep:e}={})=>{if(!e||!P(o.socket)){F(o.socket),o.idleTimer&&clearTimeout(o.idleTimer),A.get(n)===o&&A.delete(n);return}o.busy=!1,I(n,o)}}}function z(e){if(e&&typeof e==`object`&&`message`in e){let t=e.message;if(typeof t==`string`&&t.length>0)return Error(t)}return Error(`WebSocket error`)}function B(e){if(e&&typeof e==`object`){let t=`code`in e?e.code:void 0,n=`reason`in e?e.reason:void 0,r=typeof t==`number`?` ${t}`:``,i=typeof n==`string`&&n.length>0?` ${n}`:``;return Error(`WebSocket closed${r}${i}`.trim())}return Error(`WebSocket closed`)}async function V(e){if(typeof e==`string`)return e;if(e instanceof ArrayBuffer)return new TextDecoder().decode(new Uint8Array(e));if(ArrayBuffer.isView(e)){let t=e;return new TextDecoder().decode(new Uint8Array(t.buffer,t.byteOffset,t.byteLength))}if(e&&typeof e==`object`&&`arrayBuffer`in e){let t=await e.arrayBuffer();return new TextDecoder().decode(new Uint8Array(t))}return null}async function*H(e,t){let n=[],r=null,i=!1,a=null,o=!1,s=()=>{if(!r)return;let e=r;r=null,e()},c=e=>{(async()=>{if(!e||typeof e!=`object`||!(`data`in e))return;let t=await V(e.data);if(t)try{let e=JSON.parse(t),r=typeof e.type==`string`?e.type:``;(r===`response.completed`||r===`response.done`||r===`response.incomplete`)&&(o=!0,i=!0),n.push(e),s()}catch{}})()},l=e=>{a=z(e),i=!0,s()},u=e=>{if(o){i=!0,s();return}a||=B(e),i=!0,s()},d=()=>{a=Error(`Request was aborted`),i=!0,s()};e.addEventListener(`message`,c),e.addEventListener(`error`,l),e.addEventListener(`close`,u),t?.addEventListener(`abort`,d);try{for(;;){if(t?.aborted)throw Error(`Request was aborted`);if(n.length>0){yield n.shift();continue}if(i)break;await new Promise(e=>{r=e})}if(a)throw a;if(!o)throw Error(`WebSocket stream closed before response.completed`)}finally{e.removeEventListener(`message`,c),e.removeEventListener(`error`,l),e.removeEventListener(`close`,u),t?.removeEventListener(`abort`,d)}}async function U(e,t,n,r,i,a,o,c){let{socket:l,release:u}=await R(e,n,c?.sessionId,c?.signal),d=!0;try{l.send(JSON.stringify({type:`response.create`,...t})),o(),i.push({type:`start`,partial:r}),await s(T(H(l,c?.signal)),r,i,a),c?.signal?.aborted&&(d=!1)}catch(e){throw d=!1,e}finally{u({keep:d})}}async function W(e){let t=await e.text(),n=t||e.statusText||`Request failed`,r;try{let i=JSON.parse(t)?.error;if(i){let t=i.code||i.type||``;if(/usage_limit_reached|usage_not_included|rate_limit_exceeded/i.test(t)||e.status===429){let e=i.plan_type?` (${i.plan_type.toLowerCase()} plan)`:``,t=i.resets_at?Math.max(0,Math.round((i.resets_at*1e3-Date.now())/6e4)):void 0;r=`You have hit your ChatGPT usage limit${e}.${t===void 0?``:` Try again in ~${t} min.`}`.trim()}n=i.message||r||n}}catch{}return{message:n,friendlyMessage:r}}function G(e){try{let t=e.split(`.`);if(t.length!==3)throw Error(`Invalid token`);let n=JSON.parse(atob(t[1]))?.[d]?.chatgpt_account_id;if(!n)throw Error(`No account ID in token`);return n}catch{throw Error(`Failed to extract accountId from token`)}}function K(){return typeof globalThis.crypto?.randomUUID==`function`?globalThis.crypto.randomUUID():`codex_${Date.now()}_${Math.random().toString(36).slice(2,10)}`}function q(e,t,n,r){let i=new Headers(e);for(let[e,n]of Object.entries(t||{}))i.set(e,n);i.set(`Authorization`,`Bearer ${r}`),i.set(`chatgpt-account-id`,n),i.set(`originator`,`pi`);let a=l?`pi (${l.platform()} ${l.release()}; ${l.arch()})`:`pi (browser)`;return i.set(`User-Agent`,a),i}function J(e,t,n,r,i){let a=q(e,t,n,r);return a.set(`OpenAI-Beta`,`responses=experimental`),a.set(`accept`,`text/event-stream`),a.set(`content-type`,`application/json`),i&&a.set(`session_id`,i),a}function Y(e,t,n,r,i){let a=q(e,t,n,r);return a.delete(`accept`),a.delete(`content-type`),a.delete(`OpenAI-Beta`),a.delete(`openai-beta`),a.set(`OpenAI-Beta`,O),a.set(`x-client-request-id`,i),a.set(`session_id`,i),a}export{v as streamOpenAICodexResponses,y as streamSimpleOpenAICodexResponses};
8
+ //# sourceMappingURL=openai-codex-responses-DuhESMYF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[0],"sources":["../../../node_modules/@mariozechner/pi-ai/dist/providers/openai-codex-responses.js"],"sourcesContent":["// NEVER convert to top-level runtime imports - breaks browser/Vite builds (web-ui)\nlet _os = null;\nconst dynamicImport = (specifier) => import(specifier);\nconst NODE_OS_SPECIFIER = \"node:\" + \"os\";\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n dynamicImport(NODE_OS_SPECIFIER).then((m) => {\n _os = m;\n });\n}\nimport { getEnvApiKey } from \"../env-api-keys.js\";\nimport { supportsXhigh } from \"../models.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\nimport { convertResponsesMessages, convertResponsesTools, processResponsesStream } from \"./openai-responses-shared.js\";\nimport { buildBaseOptions, clampReasoning } from \"./simple-options.js\";\n// ============================================================================\n// Configuration\n// ============================================================================\nconst DEFAULT_CODEX_BASE_URL = \"https://chatgpt.com/backend-api\";\nconst JWT_CLAIM_PATH = \"https://api.openai.com/auth\";\nconst MAX_RETRIES = 3;\nconst BASE_DELAY_MS = 1000;\nconst CODEX_TOOL_CALL_PROVIDERS = new Set([\"openai\", \"openai-codex\", \"opencode\"]);\nconst CODEX_RESPONSE_STATUSES = new Set([\n \"completed\",\n \"incomplete\",\n \"failed\",\n \"cancelled\",\n \"queued\",\n \"in_progress\",\n]);\n// ============================================================================\n// Retry Helpers\n// ============================================================================\nfunction isRetryableError(status, errorText) {\n if (status === 429 || status === 500 || status === 502 || status === 503 || status === 504) {\n return true;\n }\n return /rate.?limit|overloaded|service.?unavailable|upstream.?connect|connection.?refused/i.test(errorText);\n}\nfunction sleep(ms, signal) {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error(\"Request was aborted\"));\n return;\n }\n const timeout = setTimeout(resolve, ms);\n signal?.addEventListener(\"abort\", () => {\n clearTimeout(timeout);\n reject(new Error(\"Request was aborted\"));\n });\n });\n}\n// ============================================================================\n// Main Stream Function\n// ============================================================================\nexport const streamOpenAICodexResponses = (model, context, options) => {\n const stream = new AssistantMessageEventStream();\n (async () => {\n const output = {\n role: \"assistant\",\n content: [],\n api: \"openai-codex-responses\",\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: \"stop\",\n timestamp: Date.now(),\n };\n try {\n const apiKey = options?.apiKey || getEnvApiKey(model.provider) || \"\";\n if (!apiKey) {\n throw new Error(`No API key for provider: ${model.provider}`);\n }\n const accountId = extractAccountId(apiKey);\n let body = buildRequestBody(model, context, options);\n const nextBody = await options?.onPayload?.(body, model);\n if (nextBody !== undefined) {\n body = nextBody;\n }\n const websocketRequestId = options?.sessionId || createCodexRequestId();\n const sseHeaders = buildSSEHeaders(model.headers, options?.headers, accountId, apiKey, options?.sessionId);\n const websocketHeaders = buildWebSocketHeaders(model.headers, options?.headers, accountId, apiKey, websocketRequestId);\n const bodyJson = JSON.stringify(body);\n const transport = options?.transport || \"sse\";\n if (transport !== \"sse\") {\n let websocketStarted = false;\n try {\n await processWebSocketStream(resolveCodexWebSocketUrl(model.baseUrl), body, websocketHeaders, output, stream, model, () => {\n websocketStarted = true;\n }, options);\n if (options?.signal?.aborted) {\n throw new Error(\"Request was aborted\");\n }\n stream.push({\n type: \"done\",\n reason: output.stopReason,\n message: output,\n });\n stream.end();\n return;\n }\n catch (error) {\n if (transport === \"websocket\" || websocketStarted) {\n throw error;\n }\n }\n }\n // Fetch with retry logic for rate limits and transient errors\n let response;\n let lastError;\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n if (options?.signal?.aborted) {\n throw new Error(\"Request was aborted\");\n }\n try {\n response = await fetch(resolveCodexUrl(model.baseUrl), {\n method: \"POST\",\n headers: sseHeaders,\n body: bodyJson,\n signal: options?.signal,\n });\n if (response.ok) {\n break;\n }\n const errorText = await response.text();\n if (attempt < MAX_RETRIES && isRetryableError(response.status, errorText)) {\n const delayMs = BASE_DELAY_MS * 2 ** attempt;\n await sleep(delayMs, options?.signal);\n continue;\n }\n // Parse error for friendly message on final attempt or non-retryable error\n const fakeResponse = new Response(errorText, {\n status: response.status,\n statusText: response.statusText,\n });\n const info = await parseErrorResponse(fakeResponse);\n throw new Error(info.friendlyMessage || info.message);\n }\n catch (error) {\n if (error instanceof Error) {\n if (error.name === \"AbortError\" || error.message === \"Request was aborted\") {\n throw new Error(\"Request was aborted\");\n }\n }\n lastError = error instanceof Error ? error : new Error(String(error));\n // Network errors are retryable\n if (attempt < MAX_RETRIES && !lastError.message.includes(\"usage limit\")) {\n const delayMs = BASE_DELAY_MS * 2 ** attempt;\n await sleep(delayMs, options?.signal);\n continue;\n }\n throw lastError;\n }\n }\n if (!response?.ok) {\n throw lastError ?? new Error(\"Failed after retries\");\n }\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n stream.push({ type: \"start\", partial: output });\n await processStream(response, output, stream, model);\n if (options?.signal?.aborted) {\n throw new Error(\"Request was aborted\");\n }\n stream.push({ type: \"done\", reason: output.stopReason, message: output });\n stream.end();\n }\n catch (error) {\n output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n output.errorMessage = error instanceof Error ? error.message : String(error);\n stream.push({ type: \"error\", reason: output.stopReason, error: output });\n stream.end();\n }\n })();\n return stream;\n};\nexport const streamSimpleOpenAICodexResponses = (model, context, options) => {\n const apiKey = options?.apiKey || getEnvApiKey(model.provider);\n if (!apiKey) {\n throw new Error(`No API key for provider: ${model.provider}`);\n }\n const base = buildBaseOptions(model, options, apiKey);\n const reasoningEffort = supportsXhigh(model) ? options?.reasoning : clampReasoning(options?.reasoning);\n return streamOpenAICodexResponses(model, context, {\n ...base,\n reasoningEffort,\n });\n};\n// ============================================================================\n// Request Building\n// ============================================================================\nfunction buildRequestBody(model, context, options) {\n const messages = convertResponsesMessages(model, context, CODEX_TOOL_CALL_PROVIDERS, {\n includeSystemPrompt: false,\n });\n const body = {\n model: model.id,\n store: false,\n stream: true,\n instructions: context.systemPrompt,\n input: messages,\n text: { verbosity: options?.textVerbosity || \"medium\" },\n include: [\"reasoning.encrypted_content\"],\n prompt_cache_key: options?.sessionId,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n };\n if (options?.temperature !== undefined) {\n body.temperature = options.temperature;\n }\n if (context.tools) {\n body.tools = convertResponsesTools(context.tools, { strict: null });\n }\n if (options?.reasoningEffort !== undefined) {\n body.reasoning = {\n effort: clampReasoningEffort(model.id, options.reasoningEffort),\n summary: options.reasoningSummary ?? \"auto\",\n };\n }\n return body;\n}\nfunction clampReasoningEffort(modelId, effort) {\n const id = modelId.includes(\"/\") ? modelId.split(\"/\").pop() : modelId;\n if ((id.startsWith(\"gpt-5.2\") || id.startsWith(\"gpt-5.3\") || id.startsWith(\"gpt-5.4\")) && effort === \"minimal\")\n return \"low\";\n if (id === \"gpt-5.1\" && effort === \"xhigh\")\n return \"high\";\n if (id === \"gpt-5.1-codex-mini\")\n return effort === \"high\" || effort === \"xhigh\" ? \"high\" : \"medium\";\n return effort;\n}\nfunction resolveCodexUrl(baseUrl) {\n const raw = baseUrl && baseUrl.trim().length > 0 ? baseUrl : DEFAULT_CODEX_BASE_URL;\n const normalized = raw.replace(/\\/+$/, \"\");\n if (normalized.endsWith(\"/codex/responses\"))\n return normalized;\n if (normalized.endsWith(\"/codex\"))\n return `${normalized}/responses`;\n return `${normalized}/codex/responses`;\n}\nfunction resolveCodexWebSocketUrl(baseUrl) {\n const url = new URL(resolveCodexUrl(baseUrl));\n if (url.protocol === \"https:\")\n url.protocol = \"wss:\";\n if (url.protocol === \"http:\")\n url.protocol = \"ws:\";\n return url.toString();\n}\n// ============================================================================\n// Response Processing\n// ============================================================================\nasync function processStream(response, output, stream, model) {\n await processResponsesStream(mapCodexEvents(parseSSE(response)), output, stream, model);\n}\nasync function* mapCodexEvents(events) {\n for await (const event of events) {\n const type = typeof event.type === \"string\" ? event.type : undefined;\n if (!type)\n continue;\n if (type === \"error\") {\n const code = event.code || \"\";\n const message = event.message || \"\";\n throw new Error(`Codex error: ${message || code || JSON.stringify(event)}`);\n }\n if (type === \"response.failed\") {\n const msg = event.response?.error?.message;\n throw new Error(msg || \"Codex response failed\");\n }\n if (type === \"response.done\" || type === \"response.completed\" || type === \"response.incomplete\") {\n const response = event.response;\n const normalizedResponse = response\n ? { ...response, status: normalizeCodexStatus(response.status) }\n : response;\n yield { ...event, type: \"response.completed\", response: normalizedResponse };\n return;\n }\n yield event;\n }\n}\nfunction normalizeCodexStatus(status) {\n if (typeof status !== \"string\")\n return undefined;\n return CODEX_RESPONSE_STATUSES.has(status) ? status : undefined;\n}\n// ============================================================================\n// SSE Parsing\n// ============================================================================\nasync function* parseSSE(response) {\n if (!response.body)\n return;\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n buffer += decoder.decode(value, { stream: true });\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data);\n }\n catch { }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n }\n finally {\n try {\n await reader.cancel();\n }\n catch { }\n try {\n reader.releaseLock();\n }\n catch { }\n }\n}\n// ============================================================================\n// WebSocket Parsing\n// ============================================================================\nconst OPENAI_BETA_RESPONSES_WEBSOCKETS = \"responses_websockets=2026-02-06\";\nconst SESSION_WEBSOCKET_CACHE_TTL_MS = 5 * 60 * 1000;\nconst websocketSessionCache = new Map();\nfunction getWebSocketConstructor() {\n const ctor = globalThis.WebSocket;\n if (typeof ctor !== \"function\")\n return null;\n return ctor;\n}\nfunction headersToRecord(headers) {\n const out = {};\n for (const [key, value] of headers.entries()) {\n out[key] = value;\n }\n return out;\n}\nfunction getWebSocketReadyState(socket) {\n const readyState = socket.readyState;\n return typeof readyState === \"number\" ? readyState : undefined;\n}\nfunction isWebSocketReusable(socket) {\n const readyState = getWebSocketReadyState(socket);\n // If readyState is unavailable, assume the runtime keeps it open/reusable.\n return readyState === undefined || readyState === 1;\n}\nfunction closeWebSocketSilently(socket, code = 1000, reason = \"done\") {\n try {\n socket.close(code, reason);\n }\n catch { }\n}\nfunction scheduleSessionWebSocketExpiry(sessionId, entry) {\n if (entry.idleTimer) {\n clearTimeout(entry.idleTimer);\n }\n entry.idleTimer = setTimeout(() => {\n if (entry.busy)\n return;\n closeWebSocketSilently(entry.socket, 1000, \"idle_timeout\");\n websocketSessionCache.delete(sessionId);\n }, SESSION_WEBSOCKET_CACHE_TTL_MS);\n}\nasync function connectWebSocket(url, headers, signal) {\n const WebSocketCtor = getWebSocketConstructor();\n if (!WebSocketCtor) {\n throw new Error(\"WebSocket transport is not available in this runtime\");\n }\n const wsHeaders = headersToRecord(headers);\n delete wsHeaders[\"OpenAI-Beta\"];\n return new Promise((resolve, reject) => {\n let settled = false;\n let socket;\n try {\n socket = new WebSocketCtor(url, { headers: wsHeaders });\n }\n catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n const onOpen = () => {\n if (settled)\n return;\n settled = true;\n cleanup();\n resolve(socket);\n };\n const onError = (event) => {\n const error = extractWebSocketError(event);\n if (settled)\n return;\n settled = true;\n cleanup();\n reject(error);\n };\n const onClose = (event) => {\n const error = extractWebSocketCloseError(event);\n if (settled)\n return;\n settled = true;\n cleanup();\n reject(error);\n };\n const onAbort = () => {\n if (settled)\n return;\n settled = true;\n cleanup();\n socket.close(1000, \"aborted\");\n reject(new Error(\"Request was aborted\"));\n };\n const cleanup = () => {\n socket.removeEventListener(\"open\", onOpen);\n socket.removeEventListener(\"error\", onError);\n socket.removeEventListener(\"close\", onClose);\n signal?.removeEventListener(\"abort\", onAbort);\n };\n socket.addEventListener(\"open\", onOpen);\n socket.addEventListener(\"error\", onError);\n socket.addEventListener(\"close\", onClose);\n signal?.addEventListener(\"abort\", onAbort);\n });\n}\nasync function acquireWebSocket(url, headers, sessionId, signal) {\n if (!sessionId) {\n const socket = await connectWebSocket(url, headers, signal);\n return {\n socket,\n release: ({ keep } = {}) => {\n if (keep === false) {\n closeWebSocketSilently(socket);\n return;\n }\n closeWebSocketSilently(socket);\n },\n };\n }\n const cached = websocketSessionCache.get(sessionId);\n if (cached) {\n if (cached.idleTimer) {\n clearTimeout(cached.idleTimer);\n cached.idleTimer = undefined;\n }\n if (!cached.busy && isWebSocketReusable(cached.socket)) {\n cached.busy = true;\n return {\n socket: cached.socket,\n release: ({ keep } = {}) => {\n if (!keep || !isWebSocketReusable(cached.socket)) {\n closeWebSocketSilently(cached.socket);\n websocketSessionCache.delete(sessionId);\n return;\n }\n cached.busy = false;\n scheduleSessionWebSocketExpiry(sessionId, cached);\n },\n };\n }\n if (cached.busy) {\n const socket = await connectWebSocket(url, headers, signal);\n return {\n socket,\n release: () => {\n closeWebSocketSilently(socket);\n },\n };\n }\n if (!isWebSocketReusable(cached.socket)) {\n closeWebSocketSilently(cached.socket);\n websocketSessionCache.delete(sessionId);\n }\n }\n const socket = await connectWebSocket(url, headers, signal);\n const entry = { socket, busy: true };\n websocketSessionCache.set(sessionId, entry);\n return {\n socket,\n release: ({ keep } = {}) => {\n if (!keep || !isWebSocketReusable(entry.socket)) {\n closeWebSocketSilently(entry.socket);\n if (entry.idleTimer)\n clearTimeout(entry.idleTimer);\n if (websocketSessionCache.get(sessionId) === entry) {\n websocketSessionCache.delete(sessionId);\n }\n return;\n }\n entry.busy = false;\n scheduleSessionWebSocketExpiry(sessionId, entry);\n },\n };\n}\nfunction extractWebSocketError(event) {\n if (event && typeof event === \"object\" && \"message\" in event) {\n const message = event.message;\n if (typeof message === \"string\" && message.length > 0) {\n return new Error(message);\n }\n }\n return new Error(\"WebSocket error\");\n}\nfunction extractWebSocketCloseError(event) {\n if (event && typeof event === \"object\") {\n const code = \"code\" in event ? event.code : undefined;\n const reason = \"reason\" in event ? event.reason : undefined;\n const codeText = typeof code === \"number\" ? ` ${code}` : \"\";\n const reasonText = typeof reason === \"string\" && reason.length > 0 ? ` ${reason}` : \"\";\n return new Error(`WebSocket closed${codeText}${reasonText}`.trim());\n }\n return new Error(\"WebSocket closed\");\n}\nasync function decodeWebSocketData(data) {\n if (typeof data === \"string\")\n return data;\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(data));\n }\n if (ArrayBuffer.isView(data)) {\n const view = data;\n return new TextDecoder().decode(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n }\n if (data && typeof data === \"object\" && \"arrayBuffer\" in data) {\n const blobLike = data;\n const arrayBuffer = await blobLike.arrayBuffer();\n return new TextDecoder().decode(new Uint8Array(arrayBuffer));\n }\n return null;\n}\nasync function* parseWebSocket(socket, signal) {\n const queue = [];\n let pending = null;\n let done = false;\n let failed = null;\n let sawCompletion = false;\n const wake = () => {\n if (!pending)\n return;\n const resolve = pending;\n pending = null;\n resolve();\n };\n const onMessage = (event) => {\n void (async () => {\n if (!event || typeof event !== \"object\" || !(\"data\" in event))\n return;\n const text = await decodeWebSocketData(event.data);\n if (!text)\n return;\n try {\n const parsed = JSON.parse(text);\n const type = typeof parsed.type === \"string\" ? parsed.type : \"\";\n if (type === \"response.completed\" || type === \"response.done\" || type === \"response.incomplete\") {\n sawCompletion = true;\n done = true;\n }\n queue.push(parsed);\n wake();\n }\n catch { }\n })();\n };\n const onError = (event) => {\n failed = extractWebSocketError(event);\n done = true;\n wake();\n };\n const onClose = (event) => {\n if (sawCompletion) {\n done = true;\n wake();\n return;\n }\n if (!failed) {\n failed = extractWebSocketCloseError(event);\n }\n done = true;\n wake();\n };\n const onAbort = () => {\n failed = new Error(\"Request was aborted\");\n done = true;\n wake();\n };\n socket.addEventListener(\"message\", onMessage);\n socket.addEventListener(\"error\", onError);\n socket.addEventListener(\"close\", onClose);\n signal?.addEventListener(\"abort\", onAbort);\n try {\n while (true) {\n if (signal?.aborted) {\n throw new Error(\"Request was aborted\");\n }\n if (queue.length > 0) {\n yield queue.shift();\n continue;\n }\n if (done)\n break;\n await new Promise((resolve) => {\n pending = resolve;\n });\n }\n if (failed) {\n throw failed;\n }\n if (!sawCompletion) {\n throw new Error(\"WebSocket stream closed before response.completed\");\n }\n }\n finally {\n socket.removeEventListener(\"message\", onMessage);\n socket.removeEventListener(\"error\", onError);\n socket.removeEventListener(\"close\", onClose);\n signal?.removeEventListener(\"abort\", onAbort);\n }\n}\nasync function processWebSocketStream(url, body, headers, output, stream, model, onStart, options) {\n const { socket, release } = await acquireWebSocket(url, headers, options?.sessionId, options?.signal);\n let keepConnection = true;\n try {\n socket.send(JSON.stringify({ type: \"response.create\", ...body }));\n onStart();\n stream.push({ type: \"start\", partial: output });\n await processResponsesStream(mapCodexEvents(parseWebSocket(socket, options?.signal)), output, stream, model);\n if (options?.signal?.aborted) {\n keepConnection = false;\n }\n }\n catch (error) {\n keepConnection = false;\n throw error;\n }\n finally {\n release({ keep: keepConnection });\n }\n}\n// ============================================================================\n// Error Handling\n// ============================================================================\nasync function parseErrorResponse(response) {\n const raw = await response.text();\n let message = raw || response.statusText || \"Request failed\";\n let friendlyMessage;\n try {\n const parsed = JSON.parse(raw);\n const err = parsed?.error;\n if (err) {\n const code = err.code || err.type || \"\";\n if (/usage_limit_reached|usage_not_included|rate_limit_exceeded/i.test(code) || response.status === 429) {\n const plan = err.plan_type ? ` (${err.plan_type.toLowerCase()} plan)` : \"\";\n const mins = err.resets_at\n ? Math.max(0, Math.round((err.resets_at * 1000 - Date.now()) / 60000))\n : undefined;\n const when = mins !== undefined ? ` Try again in ~${mins} min.` : \"\";\n friendlyMessage = `You have hit your ChatGPT usage limit${plan}.${when}`.trim();\n }\n message = err.message || friendlyMessage || message;\n }\n }\n catch { }\n return { message, friendlyMessage };\n}\n// ============================================================================\n// Auth & Headers\n// ============================================================================\nfunction extractAccountId(token) {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3)\n throw new Error(\"Invalid token\");\n const payload = JSON.parse(atob(parts[1]));\n const accountId = payload?.[JWT_CLAIM_PATH]?.chatgpt_account_id;\n if (!accountId)\n throw new Error(\"No account ID in token\");\n return accountId;\n }\n catch {\n throw new Error(\"Failed to extract accountId from token\");\n }\n}\nfunction createCodexRequestId() {\n if (typeof globalThis.crypto?.randomUUID === \"function\") {\n return globalThis.crypto.randomUUID();\n }\n return `codex_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\nfunction buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token) {\n const headers = new Headers(initHeaders);\n for (const [key, value] of Object.entries(additionalHeaders || {})) {\n headers.set(key, value);\n }\n headers.set(\"Authorization\", `Bearer ${token}`);\n headers.set(\"chatgpt-account-id\", accountId);\n headers.set(\"originator\", \"pi\");\n const userAgent = _os ? `pi (${_os.platform()} ${_os.release()}; ${_os.arch()})` : \"pi (browser)\";\n headers.set(\"User-Agent\", userAgent);\n return headers;\n}\nfunction buildSSEHeaders(initHeaders, additionalHeaders, accountId, token, sessionId) {\n const headers = buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token);\n headers.set(\"OpenAI-Beta\", \"responses=experimental\");\n headers.set(\"accept\", \"text/event-stream\");\n headers.set(\"content-type\", \"application/json\");\n if (sessionId) {\n headers.set(\"session_id\", sessionId);\n }\n return headers;\n}\nfunction buildWebSocketHeaders(initHeaders, additionalHeaders, accountId, token, requestId) {\n const headers = buildBaseCodexHeaders(initHeaders, additionalHeaders, accountId, token);\n headers.delete(\"accept\");\n headers.delete(\"content-type\");\n headers.delete(\"OpenAI-Beta\");\n headers.delete(\"openai-beta\");\n headers.set(\"OpenAI-Beta\", OPENAI_BETA_RESPONSES_WEBSOCKETS);\n headers.set(\"x-client-request-id\", requestId);\n headers.set(\"session_id\", requestId);\n return headers;\n}\n//# sourceMappingURL=openai-codex-responses.js.map"],"file":"openai-codex-responses-DuhESMYF.js"}
@@ -0,0 +1,6 @@
1
+ import{n as e,r as t,t as n}from"./event-stream-B8X6sYaV.js";import{g as r,h as i}from"./index-XGDpaFxG.js";import{a,i as o,r as s,t as c}from"./transform-messages-XKqwKV3D.js";import{n as l,t as u}from"./github-copilot-headers-CrI0CIJ7.js";import{n as d}from"./openai-Cn7eGqwa.js";function f(e){for(let t of e)if(t.role===`toolResult`||t.role===`assistant`&&t.content.some(e=>e.type===`toolCall`))return!0;return!1}var p=(e,t,a)=>{let o=new n;return(async()=>{let n={role:`assistant`,content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()};try{let s=h(e,t,a?.apiKey||r(e.provider)||``,a?.headers),c=g(e,t,a),l=await a?.onPayload?.(c,e);l!==void 0&&(c=l);let u=await s.chat.completions.create(c,{signal:a?.signal});o.push({type:`start`,partial:n});let d=null,f=n.content,p=()=>f.length-1,m=e=>{e&&(e.type===`text`?o.push({type:`text_end`,contentIndex:p(),content:e.text,partial:n}):e.type===`thinking`?o.push({type:`thinking_end`,contentIndex:p(),content:e.thinking,partial:n}):e.type===`toolCall`&&(e.arguments=i(e.partialArgs),delete e.partialArgs,o.push({type:`toolcall_end`,contentIndex:p(),toolCall:e,partial:n})))};for await(let t of u){if(!t||typeof t!=`object`)continue;n.responseId||=t.id,t.usage&&(n.usage=x(t.usage,e));let r=Array.isArray(t.choices)?t.choices[0]:void 0;if(r){if(!t.usage&&r.usage&&(n.usage=x(r.usage,e)),r.finish_reason){let e=S(r.finish_reason);n.stopReason=e.stopReason,e.errorMessage&&(n.errorMessage=e.errorMessage)}if(r.delta){r.delta.content!==null&&r.delta.content!==void 0&&r.delta.content.length>0&&((!d||d.type!==`text`)&&(m(d),d={type:`text`,text:``},n.content.push(d),o.push({type:`text_start`,contentIndex:p(),partial:n})),d.type===`text`&&(d.text+=r.delta.content,o.push({type:`text_delta`,contentIndex:p(),delta:r.delta.content,partial:n})));let e=[`reasoning_content`,`reasoning`,`reasoning_text`],t=null;for(let n of e)if(r.delta[n]!==null&&r.delta[n]!==void 0&&r.delta[n].length>0&&!t){t=n;break}if(t&&((!d||d.type!==`thinking`)&&(m(d),d={type:`thinking`,thinking:``,thinkingSignature:t},n.content.push(d),o.push({type:`thinking_start`,contentIndex:p(),partial:n})),d.type===`thinking`)){let e=r.delta[t];d.thinking+=e,o.push({type:`thinking_delta`,contentIndex:p(),delta:e,partial:n})}if(r?.delta?.tool_calls){for(let e of r.delta.tool_calls)if((!d||d.type!==`toolCall`||e.id&&d.id!==e.id)&&(m(d),d={type:`toolCall`,id:e.id||``,name:e.function?.name||``,arguments:{},partialArgs:``},n.content.push(d),o.push({type:`toolcall_start`,contentIndex:p(),partial:n})),d.type===`toolCall`){e.id&&(d.id=e.id),e.function?.name&&(d.name=e.function.name);let t=``;e.function?.arguments&&(t=e.function.arguments,d.partialArgs+=e.function.arguments,d.arguments=i(d.partialArgs)),o.push({type:`toolcall_delta`,contentIndex:p(),delta:t,partial:n})}}let a=r.delta.reasoning_details;if(a&&Array.isArray(a)){for(let e of a)if(e.type===`reasoning.encrypted`&&e.id&&e.data){let t=n.content.find(t=>t.type===`toolCall`&&t.id===e.id);t&&(t.thoughtSignature=JSON.stringify(e))}}}}}if(m(d),a?.signal?.aborted||n.stopReason===`aborted`)throw Error(`Request was aborted`);if(n.stopReason===`error`)throw Error(n.errorMessage||`Provider returned an error stop reason`);o.push({type:`done`,reason:n.stopReason,message:n}),o.end()}catch(e){for(let e of n.content)delete e.index;n.stopReason=a?.signal?.aborted?`aborted`:`error`,n.errorMessage=e instanceof Error?e.message:JSON.stringify(e);let t=e?.error?.metadata?.raw;t&&(n.errorMessage+=`\n${t}`),o.push({type:`error`,reason:n.stopReason,error:n}),o.end()}})(),o},m=(e,n,i)=>{let a=i?.apiKey||r(e.provider);if(!a)throw Error(`No API key for provider: ${e.provider}`);let c=s(e,i,a),l=t(e)?i?.reasoning:o(i?.reasoning),u=i?.toolChoice;return p(e,n,{...c,reasoningEffort:l,toolChoice:u})};function h(e,t,n,r){if(!n){if(!{}.OPENAI_API_KEY)throw Error(`OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.`);n={}.OPENAI_API_KEY}let i={...e.headers};if(e.provider===`github-copilot`){let e=l(t.messages),n=u({messages:t.messages,hasImages:e});Object.assign(i,n)}return r&&Object.assign(i,r),new d({apiKey:n,baseURL:e.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:i})}function g(e,t,n){let r=w(e),i=y(e,t,r);v(e,i);let a={model:e.id,messages:i,stream:!0};if(r.supportsUsageInStreaming!==!1&&(a.stream_options={include_usage:!0}),r.supportsStore&&(a.store=!1),n?.maxTokens&&(r.maxTokensField===`max_tokens`?a.max_tokens=n.maxTokens:a.max_completion_tokens=n.maxTokens),n?.temperature!==void 0&&(a.temperature=n.temperature),t.tools?a.tools=b(t.tools,r):f(t.messages)&&(a.tools=[]),n?.toolChoice&&(a.tool_choice=n.toolChoice),r.thinkingFormat===`zai`&&e.reasoning)a.enable_thinking=!!n?.reasoningEffort;else if(r.thinkingFormat===`qwen`&&e.reasoning)a.enable_thinking=!!n?.reasoningEffort;else if(r.thinkingFormat===`qwen-chat-template`&&e.reasoning)a.chat_template_kwargs={enable_thinking:!!n?.reasoningEffort};else if(r.thinkingFormat===`openrouter`&&e.reasoning){let e=a;n?.reasoningEffort?e.reasoning={effort:_(n.reasoningEffort,r.reasoningEffortMap)}:e.reasoning={effort:`none`}}else n?.reasoningEffort&&e.reasoning&&r.supportsReasoningEffort&&(a.reasoning_effort=_(n.reasoningEffort,r.reasoningEffortMap));if(e.baseUrl.includes(`openrouter.ai`)&&e.compat?.openRouterRouting&&(a.provider=e.compat.openRouterRouting),e.baseUrl.includes(`ai-gateway.vercel.sh`)&&e.compat?.vercelGatewayRouting){let t=e.compat.vercelGatewayRouting;if(t.only||t.order){let e={};t.only&&(e.only=t.only),t.order&&(e.order=t.order),a.providerOptions={gateway:e}}}return a}function _(e,t){return t[e]??e}function v(e,t){if(!(e.provider!==`openrouter`||!e.id.startsWith(`anthropic/`)))for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.role!==`user`&&n.role!==`assistant`)continue;let r=n.content;if(typeof r==`string`){n.content=[Object.assign({type:`text`,text:r},{cache_control:{type:`ephemeral`}})];return}if(Array.isArray(r))for(let e=r.length-1;e>=0;e--){let t=r[e];if(t?.type===`text`){Object.assign(t,{cache_control:{type:`ephemeral`}});return}}}}function y(e,t,n){let r=[],i=t=>{if(t.includes(`|`)){let[e]=t.split(`|`);return e.replace(/[^a-zA-Z0-9_-]/g,`_`).slice(0,40)}return e.provider===`openai`&&t.length>40?t.slice(0,40):t},o=c(t.messages,e,e=>i(e));if(t.systemPrompt){let i=e.reasoning&&n.supportsDeveloperRole?`developer`:`system`;r.push({role:i,content:a(t.systemPrompt)})}let s=null;for(let t=0;t<o.length;t++){let i=o[t];if(n.requiresAssistantAfterToolResult&&s===`toolResult`&&i.role===`user`&&r.push({role:`assistant`,content:`I have processed the tool results.`}),i.role===`user`)if(typeof i.content==`string`)r.push({role:`user`,content:a(i.content)});else{let t=i.content.map(e=>e.type===`text`?{type:`text`,text:a(e.text)}:{type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}}),n=e.input.includes(`image`)?t:t.filter(e=>e.type!==`image_url`);if(n.length===0)continue;r.push({role:`user`,content:n})}else if(i.role===`assistant`){let e={role:`assistant`,content:n.requiresAssistantAfterToolResult?``:null},t=i.content.filter(e=>e.type===`text`).filter(e=>e.text&&e.text.trim().length>0);t.length>0&&(e.content=t.map(e=>a(e.text)).join(``));let o=i.content.filter(e=>e.type===`thinking`).filter(e=>e.thinking&&e.thinking.trim().length>0);if(o.length>0)if(n.requiresThinkingAsText){let t=o.map(e=>e.thinking).join(`
2
+
3
+ `),n=e.content;n?n.unshift({type:`text`,text:t}):e.content=[{type:`text`,text:t}]}else{let t=o[0].thinkingSignature;t&&t.length>0&&(e[t]=o.map(e=>e.thinking).join(`
4
+ `))}let s=i.content.filter(e=>e.type===`toolCall`);if(s.length>0){e.tool_calls=s.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments)}}));let t=s.filter(e=>e.thoughtSignature).map(e=>{try{return JSON.parse(e.thoughtSignature)}catch{return null}}).filter(Boolean);t.length>0&&(e.reasoning_details=t)}let c=e.content;if(!(c!=null&&c.length>0)&&!e.tool_calls)continue;r.push(e)}else if(i.role===`toolResult`){let i=[],c=t;for(;c<o.length&&o[c].role===`toolResult`;c++){let t=o[c],s=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
5
+ `),l=t.content.some(e=>e.type===`image`),u={role:`tool`,content:a(s.length>0?s:`(see attached image)`),tool_call_id:t.toolCallId};if(n.requiresToolResultName&&t.toolName&&(u.name=t.toolName),r.push(u),l&&e.input.includes(`image`))for(let e of t.content)e.type===`image`&&i.push({type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}})}t=c-1,i.length>0?(n.requiresAssistantAfterToolResult&&r.push({role:`assistant`,content:`I have processed the tool results.`}),r.push({role:`user`,content:[{type:`text`,text:`Attached image(s) from tool result:`},...i]}),s=`user`):s=`toolResult`;continue}s=i.role}return r}function b(e,t){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters,...t.supportsStrictMode!==!1&&{strict:!1}}}))}function x(t,n){let r=t.prompt_tokens_details?.cached_tokens||0,i=t.completion_tokens_details?.reasoning_tokens||0,a=(t.prompt_tokens||0)-r,o=(t.completion_tokens||0)+i,s={input:a,output:o,cacheRead:r,cacheWrite:0,totalTokens:a+o+r,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return e(n,s),s}function S(e){if(e===null)return{stopReason:`stop`};switch(e){case`stop`:case`end`:return{stopReason:`stop`};case`length`:return{stopReason:`length`};case`function_call`:case`tool_calls`:return{stopReason:`toolUse`};case`content_filter`:return{stopReason:`error`,errorMessage:`Provider finish_reason: content_filter`};case`network_error`:return{stopReason:`error`,errorMessage:`Provider finish_reason: network_error`};default:return{stopReason:`error`,errorMessage:`Provider finish_reason: ${e}`}}}function C(e){let t=e.provider,n=e.baseUrl,r=t===`zai`||n.includes(`api.z.ai`),i=t===`cerebras`||n.includes(`cerebras.ai`)||t===`xai`||n.includes(`api.x.ai`)||n.includes(`chutes.ai`)||n.includes(`deepseek.com`)||r||t===`opencode`||n.includes(`opencode.ai`),a=n.includes(`chutes.ai`),o=t===`xai`||n.includes(`api.x.ai`),s=(t===`groq`||n.includes(`groq.com`))&&e.id===`qwen/qwen3-32b`?{minimal:`default`,low:`default`,medium:`default`,high:`default`,xhigh:`default`}:{};return{supportsStore:!i,supportsDeveloperRole:!i,supportsReasoningEffort:!o&&!r,reasoningEffortMap:s,supportsUsageInStreaming:!0,maxTokensField:a?`max_tokens`:`max_completion_tokens`,requiresToolResultName:!1,requiresAssistantAfterToolResult:!1,requiresThinkingAsText:!1,thinkingFormat:r?`zai`:t===`openrouter`||n.includes(`openrouter.ai`)?`openrouter`:`openai`,openRouterRouting:{},vercelGatewayRouting:{},supportsStrictMode:!0}}function w(e){let t=C(e);return e.compat?{supportsStore:e.compat.supportsStore??t.supportsStore,supportsDeveloperRole:e.compat.supportsDeveloperRole??t.supportsDeveloperRole,supportsReasoningEffort:e.compat.supportsReasoningEffort??t.supportsReasoningEffort,reasoningEffortMap:e.compat.reasoningEffortMap??t.reasoningEffortMap,supportsUsageInStreaming:e.compat.supportsUsageInStreaming??t.supportsUsageInStreaming,maxTokensField:e.compat.maxTokensField??t.maxTokensField,requiresToolResultName:e.compat.requiresToolResultName??t.requiresToolResultName,requiresAssistantAfterToolResult:e.compat.requiresAssistantAfterToolResult??t.requiresAssistantAfterToolResult,requiresThinkingAsText:e.compat.requiresThinkingAsText??t.requiresThinkingAsText,thinkingFormat:e.compat.thinkingFormat??t.thinkingFormat,openRouterRouting:e.compat.openRouterRouting??{},vercelGatewayRouting:e.compat.vercelGatewayRouting??t.vercelGatewayRouting,supportsStrictMode:e.compat.supportsStrictMode??t.supportsStrictMode}:t}export{y as convertMessages,p as streamOpenAICompletions,m as streamSimpleOpenAICompletions};
6
+ //# sourceMappingURL=openai-completions-Bv33lqKL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-completions-Bv33lqKL.js","names":[],"sources":["../../../node_modules/@mariozechner/pi-ai/dist/providers/openai-completions.js"],"sourcesContent":["import OpenAI from \"openai\";\nimport { getEnvApiKey } from \"../env-api-keys.js\";\nimport { calculateCost, supportsXhigh } from \"../models.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\nimport { parseStreamingJson } from \"../utils/json-parse.js\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.js\";\nimport { buildCopilotDynamicHeaders, hasCopilotVisionInput } from \"./github-copilot-headers.js\";\nimport { buildBaseOptions, clampReasoning } from \"./simple-options.js\";\nimport { transformMessages } from \"./transform-messages.js\";\n/**\n * Check if conversation messages contain tool calls or tool results.\n * This is needed because Anthropic (via proxy) requires the tools param\n * to be present when messages include tool_calls or tool role messages.\n */\nfunction hasToolHistory(messages) {\n for (const msg of messages) {\n if (msg.role === \"toolResult\") {\n return true;\n }\n if (msg.role === \"assistant\") {\n if (msg.content.some((block) => block.type === \"toolCall\")) {\n return true;\n }\n }\n }\n return false;\n}\nexport const streamOpenAICompletions = (model, context, options) => {\n const stream = new AssistantMessageEventStream();\n (async () => {\n const output = {\n role: \"assistant\",\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: \"stop\",\n timestamp: Date.now(),\n };\n try {\n const apiKey = options?.apiKey || getEnvApiKey(model.provider) || \"\";\n const client = createClient(model, context, apiKey, options?.headers);\n let params = buildParams(model, context, options);\n const nextParams = await options?.onPayload?.(params, model);\n if (nextParams !== undefined) {\n params = nextParams;\n }\n const openaiStream = await client.chat.completions.create(params, { signal: options?.signal });\n stream.push({ type: \"start\", partial: output });\n let currentBlock = null;\n const blocks = output.content;\n const blockIndex = () => blocks.length - 1;\n const finishCurrentBlock = (block) => {\n if (block) {\n if (block.type === \"text\") {\n stream.push({\n type: \"text_end\",\n contentIndex: blockIndex(),\n content: block.text,\n partial: output,\n });\n }\n else if (block.type === \"thinking\") {\n stream.push({\n type: \"thinking_end\",\n contentIndex: blockIndex(),\n content: block.thinking,\n partial: output,\n });\n }\n else if (block.type === \"toolCall\") {\n block.arguments = parseStreamingJson(block.partialArgs);\n delete block.partialArgs;\n stream.push({\n type: \"toolcall_end\",\n contentIndex: blockIndex(),\n toolCall: block,\n partial: output,\n });\n }\n }\n };\n for await (const chunk of openaiStream) {\n if (!chunk || typeof chunk !== \"object\")\n continue;\n // OpenAI documents ChatCompletionChunk.id as the unique chat completion identifier,\n // and each chunk in a streamed completion carries the same id.\n output.responseId ||= chunk.id;\n if (chunk.usage) {\n output.usage = parseChunkUsage(chunk.usage, model);\n }\n const choice = Array.isArray(chunk.choices) ? chunk.choices[0] : undefined;\n if (!choice)\n continue;\n // Fallback: some providers (e.g., Moonshot) return usage\n // in choice.usage instead of the standard chunk.usage\n if (!chunk.usage && choice.usage) {\n output.usage = parseChunkUsage(choice.usage, model);\n }\n if (choice.finish_reason) {\n const finishReasonResult = mapStopReason(choice.finish_reason);\n output.stopReason = finishReasonResult.stopReason;\n if (finishReasonResult.errorMessage) {\n output.errorMessage = finishReasonResult.errorMessage;\n }\n }\n if (choice.delta) {\n if (choice.delta.content !== null &&\n choice.delta.content !== undefined &&\n choice.delta.content.length > 0) {\n if (!currentBlock || currentBlock.type !== \"text\") {\n finishCurrentBlock(currentBlock);\n currentBlock = { type: \"text\", text: \"\" };\n output.content.push(currentBlock);\n stream.push({ type: \"text_start\", contentIndex: blockIndex(), partial: output });\n }\n if (currentBlock.type === \"text\") {\n currentBlock.text += choice.delta.content;\n stream.push({\n type: \"text_delta\",\n contentIndex: blockIndex(),\n delta: choice.delta.content,\n partial: output,\n });\n }\n }\n // Some endpoints return reasoning in reasoning_content (llama.cpp),\n // or reasoning (other openai compatible endpoints)\n // Use the first non-empty reasoning field to avoid duplication\n // (e.g., chutes.ai returns both reasoning_content and reasoning with same content)\n const reasoningFields = [\"reasoning_content\", \"reasoning\", \"reasoning_text\"];\n let foundReasoningField = null;\n for (const field of reasoningFields) {\n if (choice.delta[field] !== null &&\n choice.delta[field] !== undefined &&\n choice.delta[field].length > 0) {\n if (!foundReasoningField) {\n foundReasoningField = field;\n break;\n }\n }\n }\n if (foundReasoningField) {\n if (!currentBlock || currentBlock.type !== \"thinking\") {\n finishCurrentBlock(currentBlock);\n currentBlock = {\n type: \"thinking\",\n thinking: \"\",\n thinkingSignature: foundReasoningField,\n };\n output.content.push(currentBlock);\n stream.push({ type: \"thinking_start\", contentIndex: blockIndex(), partial: output });\n }\n if (currentBlock.type === \"thinking\") {\n const delta = choice.delta[foundReasoningField];\n currentBlock.thinking += delta;\n stream.push({\n type: \"thinking_delta\",\n contentIndex: blockIndex(),\n delta,\n partial: output,\n });\n }\n }\n if (choice?.delta?.tool_calls) {\n for (const toolCall of choice.delta.tool_calls) {\n if (!currentBlock ||\n currentBlock.type !== \"toolCall\" ||\n (toolCall.id && currentBlock.id !== toolCall.id)) {\n finishCurrentBlock(currentBlock);\n currentBlock = {\n type: \"toolCall\",\n id: toolCall.id || \"\",\n name: toolCall.function?.name || \"\",\n arguments: {},\n partialArgs: \"\",\n };\n output.content.push(currentBlock);\n stream.push({ type: \"toolcall_start\", contentIndex: blockIndex(), partial: output });\n }\n if (currentBlock.type === \"toolCall\") {\n if (toolCall.id)\n currentBlock.id = toolCall.id;\n if (toolCall.function?.name)\n currentBlock.name = toolCall.function.name;\n let delta = \"\";\n if (toolCall.function?.arguments) {\n delta = toolCall.function.arguments;\n currentBlock.partialArgs += toolCall.function.arguments;\n currentBlock.arguments = parseStreamingJson(currentBlock.partialArgs);\n }\n stream.push({\n type: \"toolcall_delta\",\n contentIndex: blockIndex(),\n delta,\n partial: output,\n });\n }\n }\n }\n const reasoningDetails = choice.delta.reasoning_details;\n if (reasoningDetails && Array.isArray(reasoningDetails)) {\n for (const detail of reasoningDetails) {\n if (detail.type === \"reasoning.encrypted\" && detail.id && detail.data) {\n const matchingToolCall = output.content.find((b) => b.type === \"toolCall\" && b.id === detail.id);\n if (matchingToolCall) {\n matchingToolCall.thoughtSignature = JSON.stringify(detail);\n }\n }\n }\n }\n }\n }\n finishCurrentBlock(currentBlock);\n if (options?.signal?.aborted) {\n throw new Error(\"Request was aborted\");\n }\n if (output.stopReason === \"aborted\") {\n throw new Error(\"Request was aborted\");\n }\n if (output.stopReason === \"error\") {\n throw new Error(output.errorMessage || \"Provider returned an error stop reason\");\n }\n stream.push({ type: \"done\", reason: output.stopReason, message: output });\n stream.end();\n }\n catch (error) {\n for (const block of output.content)\n delete block.index;\n output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);\n // Some providers via OpenRouter give additional information in this field.\n const rawMetadata = error?.error?.metadata?.raw;\n if (rawMetadata)\n output.errorMessage += `\\n${rawMetadata}`;\n stream.push({ type: \"error\", reason: output.stopReason, error: output });\n stream.end();\n }\n })();\n return stream;\n};\nexport const streamSimpleOpenAICompletions = (model, context, options) => {\n const apiKey = options?.apiKey || getEnvApiKey(model.provider);\n if (!apiKey) {\n throw new Error(`No API key for provider: ${model.provider}`);\n }\n const base = buildBaseOptions(model, options, apiKey);\n const reasoningEffort = supportsXhigh(model) ? options?.reasoning : clampReasoning(options?.reasoning);\n const toolChoice = options?.toolChoice;\n return streamOpenAICompletions(model, context, {\n ...base,\n reasoningEffort,\n toolChoice,\n });\n};\nfunction createClient(model, context, apiKey, optionsHeaders) {\n if (!apiKey) {\n if (!process.env.OPENAI_API_KEY) {\n throw new Error(\"OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.\");\n }\n apiKey = process.env.OPENAI_API_KEY;\n }\n const headers = { ...model.headers };\n if (model.provider === \"github-copilot\") {\n const hasImages = hasCopilotVisionInput(context.messages);\n const copilotHeaders = buildCopilotDynamicHeaders({\n messages: context.messages,\n hasImages,\n });\n Object.assign(headers, copilotHeaders);\n }\n // Merge options headers last so they can override defaults\n if (optionsHeaders) {\n Object.assign(headers, optionsHeaders);\n }\n return new OpenAI({\n apiKey,\n baseURL: model.baseUrl,\n dangerouslyAllowBrowser: true,\n defaultHeaders: headers,\n });\n}\nfunction buildParams(model, context, options) {\n const compat = getCompat(model);\n const messages = convertMessages(model, context, compat);\n maybeAddOpenRouterAnthropicCacheControl(model, messages);\n const params = {\n model: model.id,\n messages,\n stream: true,\n };\n if (compat.supportsUsageInStreaming !== false) {\n params.stream_options = { include_usage: true };\n }\n if (compat.supportsStore) {\n params.store = false;\n }\n if (options?.maxTokens) {\n if (compat.maxTokensField === \"max_tokens\") {\n params.max_tokens = options.maxTokens;\n }\n else {\n params.max_completion_tokens = options.maxTokens;\n }\n }\n if (options?.temperature !== undefined) {\n params.temperature = options.temperature;\n }\n if (context.tools) {\n params.tools = convertTools(context.tools, compat);\n }\n else if (hasToolHistory(context.messages)) {\n // Anthropic (via LiteLLM/proxy) requires tools param when conversation has tool_calls/tool_results\n params.tools = [];\n }\n if (options?.toolChoice) {\n params.tool_choice = options.toolChoice;\n }\n if (compat.thinkingFormat === \"zai\" && model.reasoning) {\n params.enable_thinking = !!options?.reasoningEffort;\n }\n else if (compat.thinkingFormat === \"qwen\" && model.reasoning) {\n params.enable_thinking = !!options?.reasoningEffort;\n }\n else if (compat.thinkingFormat === \"qwen-chat-template\" && model.reasoning) {\n params.chat_template_kwargs = { enable_thinking: !!options?.reasoningEffort };\n }\n else if (compat.thinkingFormat === \"openrouter\" && model.reasoning) {\n // OpenRouter normalizes reasoning across providers via a nested reasoning object.\n const openRouterParams = params;\n if (options?.reasoningEffort) {\n openRouterParams.reasoning = {\n effort: mapReasoningEffort(options.reasoningEffort, compat.reasoningEffortMap),\n };\n }\n else {\n openRouterParams.reasoning = { effort: \"none\" };\n }\n }\n else if (options?.reasoningEffort && model.reasoning && compat.supportsReasoningEffort) {\n // OpenAI-style reasoning_effort\n params.reasoning_effort = mapReasoningEffort(options.reasoningEffort, compat.reasoningEffortMap);\n }\n // OpenRouter provider routing preferences\n if (model.baseUrl.includes(\"openrouter.ai\") && model.compat?.openRouterRouting) {\n params.provider = model.compat.openRouterRouting;\n }\n // Vercel AI Gateway provider routing preferences\n if (model.baseUrl.includes(\"ai-gateway.vercel.sh\") && model.compat?.vercelGatewayRouting) {\n const routing = model.compat.vercelGatewayRouting;\n if (routing.only || routing.order) {\n const gatewayOptions = {};\n if (routing.only)\n gatewayOptions.only = routing.only;\n if (routing.order)\n gatewayOptions.order = routing.order;\n params.providerOptions = { gateway: gatewayOptions };\n }\n }\n return params;\n}\nfunction mapReasoningEffort(effort, reasoningEffortMap) {\n return reasoningEffortMap[effort] ?? effort;\n}\nfunction maybeAddOpenRouterAnthropicCacheControl(model, messages) {\n if (model.provider !== \"openrouter\" || !model.id.startsWith(\"anthropic/\"))\n return;\n // Anthropic-style caching requires cache_control on a text part. Add a breakpoint\n // on the last user/assistant message (walking backwards until we find text content).\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role !== \"user\" && msg.role !== \"assistant\")\n continue;\n const content = msg.content;\n if (typeof content === \"string\") {\n msg.content = [\n Object.assign({ type: \"text\", text: content }, { cache_control: { type: \"ephemeral\" } }),\n ];\n return;\n }\n if (!Array.isArray(content))\n continue;\n // Find last text part and add cache_control\n for (let j = content.length - 1; j >= 0; j--) {\n const part = content[j];\n if (part?.type === \"text\") {\n Object.assign(part, { cache_control: { type: \"ephemeral\" } });\n return;\n }\n }\n }\n}\nexport function convertMessages(model, context, compat) {\n const params = [];\n const normalizeToolCallId = (id) => {\n // Handle pipe-separated IDs from OpenAI Responses API\n // Format: {call_id}|{id} where {id} can be 400+ chars with special chars (+, /, =)\n // These come from providers like github-copilot, openai-codex, opencode\n // Extract just the call_id part and normalize it\n if (id.includes(\"|\")) {\n const [callId] = id.split(\"|\");\n // Sanitize to allowed chars and truncate to 40 chars (OpenAI limit)\n return callId.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 40);\n }\n if (model.provider === \"openai\")\n return id.length > 40 ? id.slice(0, 40) : id;\n return id;\n };\n const transformedMessages = transformMessages(context.messages, model, (id) => normalizeToolCallId(id));\n if (context.systemPrompt) {\n const useDeveloperRole = model.reasoning && compat.supportsDeveloperRole;\n const role = useDeveloperRole ? \"developer\" : \"system\";\n params.push({ role: role, content: sanitizeSurrogates(context.systemPrompt) });\n }\n let lastRole = null;\n for (let i = 0; i < transformedMessages.length; i++) {\n const msg = transformedMessages[i];\n // Some providers don't allow user messages directly after tool results\n // Insert a synthetic assistant message to bridge the gap\n if (compat.requiresAssistantAfterToolResult && lastRole === \"toolResult\" && msg.role === \"user\") {\n params.push({\n role: \"assistant\",\n content: \"I have processed the tool results.\",\n });\n }\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n params.push({\n role: \"user\",\n content: sanitizeSurrogates(msg.content),\n });\n }\n else {\n const content = msg.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: sanitizeSurrogates(item.text),\n };\n }\n else {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${item.mimeType};base64,${item.data}`,\n },\n };\n }\n });\n const filteredContent = !model.input.includes(\"image\")\n ? content.filter((c) => c.type !== \"image_url\")\n : content;\n if (filteredContent.length === 0)\n continue;\n params.push({\n role: \"user\",\n content: filteredContent,\n });\n }\n }\n else if (msg.role === \"assistant\") {\n // Some providers don't accept null content, use empty string instead\n const assistantMsg = {\n role: \"assistant\",\n content: compat.requiresAssistantAfterToolResult ? \"\" : null,\n };\n const textBlocks = msg.content.filter((b) => b.type === \"text\");\n // Filter out empty text blocks to avoid API validation errors\n const nonEmptyTextBlocks = textBlocks.filter((b) => b.text && b.text.trim().length > 0);\n if (nonEmptyTextBlocks.length > 0) {\n // Always send assistant content as a plain string (OpenAI Chat Completions\n // API standard format). Sending as an array of {type:\"text\", text:\"...\"}\n // objects is non-standard and causes some models (e.g. DeepSeek V3.2 via\n // NVIDIA NIM) to mirror the content-block structure literally in their\n // output, producing recursive nesting like [{'type':'text','text':'[{...}]'}].\n assistantMsg.content = nonEmptyTextBlocks.map((b) => sanitizeSurrogates(b.text)).join(\"\");\n }\n // Handle thinking blocks\n const thinkingBlocks = msg.content.filter((b) => b.type === \"thinking\");\n // Filter out empty thinking blocks to avoid API validation errors\n const nonEmptyThinkingBlocks = thinkingBlocks.filter((b) => b.thinking && b.thinking.trim().length > 0);\n if (nonEmptyThinkingBlocks.length > 0) {\n if (compat.requiresThinkingAsText) {\n // Convert thinking blocks to plain text (no tags to avoid model mimicking them)\n const thinkingText = nonEmptyThinkingBlocks.map((b) => b.thinking).join(\"\\n\\n\");\n const textContent = assistantMsg.content;\n if (textContent) {\n textContent.unshift({ type: \"text\", text: thinkingText });\n }\n else {\n assistantMsg.content = [{ type: \"text\", text: thinkingText }];\n }\n }\n else {\n // Use the signature from the first thinking block if available (for llama.cpp server + gpt-oss)\n const signature = nonEmptyThinkingBlocks[0].thinkingSignature;\n if (signature && signature.length > 0) {\n assistantMsg[signature] = nonEmptyThinkingBlocks.map((b) => b.thinking).join(\"\\n\");\n }\n }\n }\n const toolCalls = msg.content.filter((b) => b.type === \"toolCall\");\n if (toolCalls.length > 0) {\n assistantMsg.tool_calls = toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n },\n }));\n const reasoningDetails = toolCalls\n .filter((tc) => tc.thoughtSignature)\n .map((tc) => {\n try {\n return JSON.parse(tc.thoughtSignature);\n }\n catch {\n return null;\n }\n })\n .filter(Boolean);\n if (reasoningDetails.length > 0) {\n assistantMsg.reasoning_details = reasoningDetails;\n }\n }\n // Skip assistant messages that have no content and no tool calls.\n // Some providers require \"either content or tool_calls, but not none\".\n // Other providers also don't accept empty assistant messages.\n // This handles aborted assistant responses that got no content.\n const content = assistantMsg.content;\n const hasContent = content !== null &&\n content !== undefined &&\n (typeof content === \"string\" ? content.length > 0 : content.length > 0);\n if (!hasContent && !assistantMsg.tool_calls) {\n continue;\n }\n params.push(assistantMsg);\n }\n else if (msg.role === \"toolResult\") {\n const imageBlocks = [];\n let j = i;\n for (; j < transformedMessages.length && transformedMessages[j].role === \"toolResult\"; j++) {\n const toolMsg = transformedMessages[j];\n // Extract text and image content\n const textResult = toolMsg.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n const hasImages = toolMsg.content.some((c) => c.type === \"image\");\n // Always send tool result with text (or placeholder if only images)\n const hasText = textResult.length > 0;\n // Some providers require the 'name' field in tool results\n const toolResultMsg = {\n role: \"tool\",\n content: sanitizeSurrogates(hasText ? textResult : \"(see attached image)\"),\n tool_call_id: toolMsg.toolCallId,\n };\n if (compat.requiresToolResultName && toolMsg.toolName) {\n toolResultMsg.name = toolMsg.toolName;\n }\n params.push(toolResultMsg);\n if (hasImages && model.input.includes(\"image\")) {\n for (const block of toolMsg.content) {\n if (block.type === \"image\") {\n imageBlocks.push({\n type: \"image_url\",\n image_url: {\n url: `data:${block.mimeType};base64,${block.data}`,\n },\n });\n }\n }\n }\n }\n i = j - 1;\n if (imageBlocks.length > 0) {\n if (compat.requiresAssistantAfterToolResult) {\n params.push({\n role: \"assistant\",\n content: \"I have processed the tool results.\",\n });\n }\n params.push({\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: \"Attached image(s) from tool result:\",\n },\n ...imageBlocks,\n ],\n });\n lastRole = \"user\";\n }\n else {\n lastRole = \"toolResult\";\n }\n continue;\n }\n lastRole = msg.role;\n }\n return params;\n}\nfunction convertTools(tools, compat) {\n return tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters, // TypeBox already generates JSON Schema\n // Only include strict if provider supports it. Some reject unknown fields.\n ...(compat.supportsStrictMode !== false && { strict: false }),\n },\n }));\n}\nfunction parseChunkUsage(rawUsage, model) {\n const cachedTokens = rawUsage.prompt_tokens_details?.cached_tokens || 0;\n const reasoningTokens = rawUsage.completion_tokens_details?.reasoning_tokens || 0;\n // OpenAI includes cached tokens in prompt_tokens, so subtract to get non-cached input\n const input = (rawUsage.prompt_tokens || 0) - cachedTokens;\n // Compute totalTokens ourselves since we add reasoning_tokens to output\n // and some providers (e.g., Groq) don't include them in total_tokens\n const outputTokens = (rawUsage.completion_tokens || 0) + reasoningTokens;\n const usage = {\n input,\n output: outputTokens,\n cacheRead: cachedTokens,\n cacheWrite: 0,\n totalTokens: input + outputTokens + cachedTokens,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n calculateCost(model, usage);\n return usage;\n}\nfunction mapStopReason(reason) {\n if (reason === null)\n return { stopReason: \"stop\" };\n switch (reason) {\n case \"stop\":\n case \"end\":\n return { stopReason: \"stop\" };\n case \"length\":\n return { stopReason: \"length\" };\n case \"function_call\":\n case \"tool_calls\":\n return { stopReason: \"toolUse\" };\n case \"content_filter\":\n return { stopReason: \"error\", errorMessage: \"Provider finish_reason: content_filter\" };\n case \"network_error\":\n return { stopReason: \"error\", errorMessage: \"Provider finish_reason: network_error\" };\n default:\n return {\n stopReason: \"error\",\n errorMessage: `Provider finish_reason: ${reason}`,\n };\n }\n}\n/**\n * Detect compatibility settings from provider and baseUrl for known providers.\n * Provider takes precedence over URL-based detection since it's explicitly configured.\n * Returns a fully resolved OpenAICompletionsCompat object with all fields set.\n */\nfunction detectCompat(model) {\n const provider = model.provider;\n const baseUrl = model.baseUrl;\n const isZai = provider === \"zai\" || baseUrl.includes(\"api.z.ai\");\n const isNonStandard = provider === \"cerebras\" ||\n baseUrl.includes(\"cerebras.ai\") ||\n provider === \"xai\" ||\n baseUrl.includes(\"api.x.ai\") ||\n baseUrl.includes(\"chutes.ai\") ||\n baseUrl.includes(\"deepseek.com\") ||\n isZai ||\n provider === \"opencode\" ||\n baseUrl.includes(\"opencode.ai\");\n const useMaxTokens = baseUrl.includes(\"chutes.ai\");\n const isGrok = provider === \"xai\" || baseUrl.includes(\"api.x.ai\");\n const isGroq = provider === \"groq\" || baseUrl.includes(\"groq.com\");\n const reasoningEffortMap = isGroq && model.id === \"qwen/qwen3-32b\"\n ? {\n minimal: \"default\",\n low: \"default\",\n medium: \"default\",\n high: \"default\",\n xhigh: \"default\",\n }\n : {};\n return {\n supportsStore: !isNonStandard,\n supportsDeveloperRole: !isNonStandard,\n supportsReasoningEffort: !isGrok && !isZai,\n reasoningEffortMap,\n supportsUsageInStreaming: true,\n maxTokensField: useMaxTokens ? \"max_tokens\" : \"max_completion_tokens\",\n requiresToolResultName: false,\n requiresAssistantAfterToolResult: false,\n requiresThinkingAsText: false,\n thinkingFormat: isZai\n ? \"zai\"\n : provider === \"openrouter\" || baseUrl.includes(\"openrouter.ai\")\n ? \"openrouter\"\n : \"openai\",\n openRouterRouting: {},\n vercelGatewayRouting: {},\n supportsStrictMode: true,\n };\n}\n/**\n * Get resolved compatibility settings for a model.\n * Uses explicit model.compat if provided, otherwise auto-detects from provider/URL.\n */\nfunction getCompat(model) {\n const detected = detectCompat(model);\n if (!model.compat)\n return detected;\n return {\n supportsStore: model.compat.supportsStore ?? detected.supportsStore,\n supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,\n supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,\n reasoningEffortMap: model.compat.reasoningEffortMap ?? detected.reasoningEffortMap,\n supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,\n maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,\n requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,\n requiresAssistantAfterToolResult: model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,\n requiresThinkingAsText: model.compat.requiresThinkingAsText ?? detected.requiresThinkingAsText,\n thinkingFormat: model.compat.thinkingFormat ?? detected.thinkingFormat,\n openRouterRouting: model.compat.openRouterRouting ?? {},\n vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,\n supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,\n };\n}\n//# sourceMappingURL=openai-completions.js.map"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e,t}from"./event-stream-B8X6sYaV.js";import{g as n}from"./index-XGDpaFxG.js";import{i as r,r as i}from"./transform-messages-XKqwKV3D.js";import{n as a,t as o}from"./github-copilot-headers-CrI0CIJ7.js";import{n as s}from"./openai-Cn7eGqwa.js";import{n as c,r as l,t as u}from"./openai-responses-shared-8nKH8ywL.js";var d=new Set([`openai`,`openai-codex`,`opencode`]);function f(e){return e||(typeof process<`u`&&{}.PI_CACHE_RETENTION===`long`?`long`:`short`)}function p(e,t){if(t===`long`&&e.includes(`api.openai.com`))return`24h`}var m=(e,r,i)=>{let a=new t;return(async()=>{let t={role:`assistant`,content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()};try{let o=g(e,r,i?.apiKey||n(e.provider)||``,i?.headers),s=_(e,r,i),c=await i?.onPayload?.(s,e);c!==void 0&&(s=c);let u=await o.responses.create(s,i?.signal?{signal:i.signal}:void 0);if(a.push({type:`start`,partial:t}),await l(u,t,a,e,{serviceTier:i?.serviceTier,applyServiceTierPricing:y}),i?.signal?.aborted)throw Error(`Request was aborted`);if(t.stopReason===`aborted`||t.stopReason===`error`)throw Error(`An unknown error occurred`);a.push({type:`done`,reason:t.stopReason,message:t}),a.end()}catch(e){for(let e of t.content)delete e.index;t.stopReason=i?.signal?.aborted?`aborted`:`error`,t.errorMessage=e instanceof Error?e.message:JSON.stringify(e),a.push({type:`error`,reason:t.stopReason,error:t}),a.end()}})(),a},h=(t,a,o)=>{let s=o?.apiKey||n(t.provider);if(!s)throw Error(`No API key for provider: ${t.provider}`);let c=i(t,o,s),l=e(t)?o?.reasoning:r(o?.reasoning);return m(t,a,{...c,reasoningEffort:l})};function g(e,t,n,r){if(!n){if(!{}.OPENAI_API_KEY)throw Error(`OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.`);n={}.OPENAI_API_KEY}let i={...e.headers};if(e.provider===`github-copilot`){let e=a(t.messages),n=o({messages:t.messages,hasImages:e});Object.assign(i,n)}return r&&Object.assign(i,r),new s({apiKey:n,baseURL:e.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:i})}function _(e,t,n){let r=u(e,t,d),i=f(n?.cacheRetention),a={model:e.id,input:r,stream:!0,prompt_cache_key:i===`none`?void 0:n?.sessionId,prompt_cache_retention:p(e.baseUrl,i),store:!1};return n?.maxTokens&&(a.max_output_tokens=n?.maxTokens),n?.temperature!==void 0&&(a.temperature=n?.temperature),n?.serviceTier!==void 0&&(a.service_tier=n.serviceTier),t.tools&&(a.tools=c(t.tools)),e.reasoning&&(n?.reasoningEffort||n?.reasoningSummary?(a.reasoning={effort:n?.reasoningEffort||`medium`,summary:n?.reasoningSummary||`auto`},a.include=[`reasoning.encrypted_content`]):e.provider!==`github-copilot`&&(a.reasoning={effort:`none`})),a}function v(e){switch(e){case`flex`:return .5;case`priority`:return 2;default:return 1}}function y(e,t){let n=v(t);n!==1&&(e.cost.input*=n,e.cost.output*=n,e.cost.cacheRead*=n,e.cost.cacheWrite*=n,e.cost.total=e.cost.input+e.cost.output+e.cost.cacheRead+e.cost.cacheWrite)}export{m as streamOpenAIResponses,h as streamSimpleOpenAIResponses};
2
+ //# sourceMappingURL=openai-responses-BPxpapOg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses-BPxpapOg.js","names":[],"sources":["../../../node_modules/@mariozechner/pi-ai/dist/providers/openai-responses.js"],"sourcesContent":["import OpenAI from \"openai\";\nimport { getEnvApiKey } from \"../env-api-keys.js\";\nimport { supportsXhigh } from \"../models.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\nimport { buildCopilotDynamicHeaders, hasCopilotVisionInput } from \"./github-copilot-headers.js\";\nimport { convertResponsesMessages, convertResponsesTools, processResponsesStream } from \"./openai-responses-shared.js\";\nimport { buildBaseOptions, clampReasoning } from \"./simple-options.js\";\nconst OPENAI_TOOL_CALL_PROVIDERS = new Set([\"openai\", \"openai-codex\", \"opencode\"]);\n/**\n * Resolve cache retention preference.\n * Defaults to \"short\" and uses PI_CACHE_RETENTION for backward compatibility.\n */\nfunction resolveCacheRetention(cacheRetention) {\n if (cacheRetention) {\n return cacheRetention;\n }\n if (typeof process !== \"undefined\" && process.env.PI_CACHE_RETENTION === \"long\") {\n return \"long\";\n }\n return \"short\";\n}\n/**\n * Get prompt cache retention based on cacheRetention and base URL.\n * Only applies to direct OpenAI API calls (api.openai.com).\n */\nfunction getPromptCacheRetention(baseUrl, cacheRetention) {\n if (cacheRetention !== \"long\") {\n return undefined;\n }\n if (baseUrl.includes(\"api.openai.com\")) {\n return \"24h\";\n }\n return undefined;\n}\n/**\n * Generate function for OpenAI Responses API\n */\nexport const streamOpenAIResponses = (model, context, options) => {\n const stream = new AssistantMessageEventStream();\n // Start async processing\n (async () => {\n const output = {\n role: \"assistant\",\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: \"stop\",\n timestamp: Date.now(),\n };\n try {\n // Create OpenAI client\n const apiKey = options?.apiKey || getEnvApiKey(model.provider) || \"\";\n const client = createClient(model, context, apiKey, options?.headers);\n let params = buildParams(model, context, options);\n const nextParams = await options?.onPayload?.(params, model);\n if (nextParams !== undefined) {\n params = nextParams;\n }\n const openaiStream = await client.responses.create(params, options?.signal ? { signal: options.signal } : undefined);\n stream.push({ type: \"start\", partial: output });\n await processResponsesStream(openaiStream, output, stream, model, {\n serviceTier: options?.serviceTier,\n applyServiceTierPricing,\n });\n if (options?.signal?.aborted) {\n throw new Error(\"Request was aborted\");\n }\n if (output.stopReason === \"aborted\" || output.stopReason === \"error\") {\n throw new Error(\"An unknown error occurred\");\n }\n stream.push({ type: \"done\", reason: output.stopReason, message: output });\n stream.end();\n }\n catch (error) {\n for (const block of output.content)\n delete block.index;\n output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);\n stream.push({ type: \"error\", reason: output.stopReason, error: output });\n stream.end();\n }\n })();\n return stream;\n};\nexport const streamSimpleOpenAIResponses = (model, context, options) => {\n const apiKey = options?.apiKey || getEnvApiKey(model.provider);\n if (!apiKey) {\n throw new Error(`No API key for provider: ${model.provider}`);\n }\n const base = buildBaseOptions(model, options, apiKey);\n const reasoningEffort = supportsXhigh(model) ? options?.reasoning : clampReasoning(options?.reasoning);\n return streamOpenAIResponses(model, context, {\n ...base,\n reasoningEffort,\n });\n};\nfunction createClient(model, context, apiKey, optionsHeaders) {\n if (!apiKey) {\n if (!process.env.OPENAI_API_KEY) {\n throw new Error(\"OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.\");\n }\n apiKey = process.env.OPENAI_API_KEY;\n }\n const headers = { ...model.headers };\n if (model.provider === \"github-copilot\") {\n const hasImages = hasCopilotVisionInput(context.messages);\n const copilotHeaders = buildCopilotDynamicHeaders({\n messages: context.messages,\n hasImages,\n });\n Object.assign(headers, copilotHeaders);\n }\n // Merge options headers last so they can override defaults\n if (optionsHeaders) {\n Object.assign(headers, optionsHeaders);\n }\n return new OpenAI({\n apiKey,\n baseURL: model.baseUrl,\n dangerouslyAllowBrowser: true,\n defaultHeaders: headers,\n });\n}\nfunction buildParams(model, context, options) {\n const messages = convertResponsesMessages(model, context, OPENAI_TOOL_CALL_PROVIDERS);\n const cacheRetention = resolveCacheRetention(options?.cacheRetention);\n const params = {\n model: model.id,\n input: messages,\n stream: true,\n prompt_cache_key: cacheRetention === \"none\" ? undefined : options?.sessionId,\n prompt_cache_retention: getPromptCacheRetention(model.baseUrl, cacheRetention),\n store: false,\n };\n if (options?.maxTokens) {\n params.max_output_tokens = options?.maxTokens;\n }\n if (options?.temperature !== undefined) {\n params.temperature = options?.temperature;\n }\n if (options?.serviceTier !== undefined) {\n params.service_tier = options.serviceTier;\n }\n if (context.tools) {\n params.tools = convertResponsesTools(context.tools);\n }\n if (model.reasoning) {\n if (options?.reasoningEffort || options?.reasoningSummary) {\n params.reasoning = {\n effort: options?.reasoningEffort || \"medium\",\n summary: options?.reasoningSummary || \"auto\",\n };\n params.include = [\"reasoning.encrypted_content\"];\n }\n else if (model.provider !== \"github-copilot\") {\n params.reasoning = { effort: \"none\" };\n }\n }\n return params;\n}\nfunction getServiceTierCostMultiplier(serviceTier) {\n switch (serviceTier) {\n case \"flex\":\n return 0.5;\n case \"priority\":\n return 2;\n default:\n return 1;\n }\n}\nfunction applyServiceTierPricing(usage, serviceTier) {\n const multiplier = getServiceTierCostMultiplier(serviceTier);\n if (multiplier === 1)\n return;\n usage.cost.input *= multiplier;\n usage.cost.output *= multiplier;\n usage.cost.cacheRead *= multiplier;\n usage.cost.cacheWrite *= multiplier;\n usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;\n}\n//# sourceMappingURL=openai-responses.js.map"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import{n as e}from"./event-stream-B8X6sYaV.js";import{h as t}from"./index-XGDpaFxG.js";import{a as n,t as r}from"./transform-messages-XKqwKV3D.js";import{t as i}from"./hash-Bt1aVMQ3.js";function a(e,t){let n={v:1,id:e};return t&&(n.phase=t),JSON.stringify(n)}function o(e){if(e){if(e.startsWith(`{`))try{let t=JSON.parse(e);if(t.v===1&&typeof t.id==`string`)return t.phase===`commentary`||t.phase===`final_answer`?{id:t.id,phase:t.phase}:{id:t.id}}catch{}return{id:e}}}function s(e,t,a,s){let c=[],l=e=>{let t=e.replace(/[^a-zA-Z0-9_-]/g,`_`);return(t.length>64?t.slice(0,64):t).replace(/_+$/,``)},u=e=>{let t=`fc_${i(e)}`;return t.length>64?t.slice(0,64):t},d=r(t.messages,e,(t,n,r)=>{if(!a.has(e.provider)||!t.includes(`|`))return l(t);let[i,o]=t.split(`|`),s=l(i),c=r.provider!==e.provider||r.api!==e.api?u(o):l(o);return c.startsWith(`fc_`)||(c=l(`fc_${c}`)),`${s}|${c}`});if((s?.includeSystemPrompt??!0)&&t.systemPrompt){let r=e.reasoning?`developer`:`system`;c.push({role:r,content:n(t.systemPrompt)})}let f=0;for(let t of d){if(t.role===`user`)if(typeof t.content==`string`)c.push({role:`user`,content:[{type:`input_text`,text:n(t.content)}]});else{let r=t.content.map(e=>e.type===`text`?{type:`input_text`,text:n(e.text)}:{type:`input_image`,detail:`auto`,image_url:`data:${e.mimeType};base64,${e.data}`}),i=e.input.includes(`image`)?r:r.filter(e=>e.type!==`input_image`);if(i.length===0)continue;c.push({role:`user`,content:i})}else if(t.role===`assistant`){let r=[],a=t,s=a.model!==e.id&&a.provider===e.provider&&a.api===e.api;for(let e of t.content)if(e.type===`thinking`){if(e.thinkingSignature){let t=JSON.parse(e.thinkingSignature);r.push(t)}}else if(e.type===`text`){let t=e,a=o(t.textSignature),s=a?.id;s?s.length>64&&(s=`msg_${i(s)}`):s=`msg_${f}`,r.push({type:`message`,role:`assistant`,content:[{type:`output_text`,text:n(t.text),annotations:[]}],status:`completed`,id:s,phase:a?.phase})}else if(e.type===`toolCall`){let t=e,[n,i]=t.id.split(`|`),a=i;s&&a?.startsWith(`fc_`)&&(a=void 0),r.push({type:`function_call`,id:a,call_id:n,name:t.name,arguments:JSON.stringify(t.arguments)})}if(r.length===0)continue;c.push(...r)}else if(t.role===`toolResult`){let r=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
2
+ `),i=t.content.some(e=>e.type===`image`),a=r.length>0,[o]=t.toolCallId.split(`|`),s;if(i&&e.input.includes(`image`)){let e=[];a&&e.push({type:`input_text`,text:n(r)});for(let n of t.content)n.type===`image`&&e.push({type:`input_image`,detail:`auto`,image_url:`data:${n.mimeType};base64,${n.data}`});s=e}else s=n(a?r:`(see attached image)`);c.push({type:`function_call_output`,call_id:o,output:s})}f++}return c}function c(e,t){let n=t?.strict===void 0?!1:t.strict;return e.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters,strict:n}))}async function l(n,r,i,o,s){let c=null,l=null,d=r.content,f=()=>d.length-1;for await(let d of n)if(d.type===`response.created`)r.responseId=d.response.id;else if(d.type===`response.output_item.added`){let e=d.item;e.type===`reasoning`?(c=e,l={type:`thinking`,thinking:``},r.content.push(l),i.push({type:`thinking_start`,contentIndex:f(),partial:r})):e.type===`message`?(c=e,l={type:`text`,text:``},r.content.push(l),i.push({type:`text_start`,contentIndex:f(),partial:r})):e.type===`function_call`&&(c=e,l={type:`toolCall`,id:`${e.call_id}|${e.id}`,name:e.name,arguments:{},partialJson:e.arguments||``},r.content.push(l),i.push({type:`toolcall_start`,contentIndex:f(),partial:r}))}else if(d.type===`response.reasoning_summary_part.added`)c&&c.type===`reasoning`&&(c.summary=c.summary||[],c.summary.push(d.part));else if(d.type===`response.reasoning_summary_text.delta`){if(c?.type===`reasoning`&&l?.type===`thinking`){c.summary=c.summary||[];let e=c.summary[c.summary.length-1];e&&(l.thinking+=d.delta,e.text+=d.delta,i.push({type:`thinking_delta`,contentIndex:f(),delta:d.delta,partial:r}))}}else if(d.type===`response.reasoning_summary_part.done`){if(c?.type===`reasoning`&&l?.type===`thinking`){c.summary=c.summary||[];let e=c.summary[c.summary.length-1];e&&(l.thinking+=`
3
+
4
+ `,e.text+=`
5
+
6
+ `,i.push({type:`thinking_delta`,contentIndex:f(),delta:`
7
+
8
+ `,partial:r}))}}else if(d.type===`response.content_part.added`)c?.type===`message`&&(c.content=c.content||[],(d.part.type===`output_text`||d.part.type===`refusal`)&&c.content.push(d.part));else if(d.type===`response.output_text.delta`){if(c?.type===`message`&&l?.type===`text`){if(!c.content||c.content.length===0)continue;let e=c.content[c.content.length-1];e?.type===`output_text`&&(l.text+=d.delta,e.text+=d.delta,i.push({type:`text_delta`,contentIndex:f(),delta:d.delta,partial:r}))}}else if(d.type===`response.refusal.delta`){if(c?.type===`message`&&l?.type===`text`){if(!c.content||c.content.length===0)continue;let e=c.content[c.content.length-1];e?.type===`refusal`&&(l.text+=d.delta,e.refusal+=d.delta,i.push({type:`text_delta`,contentIndex:f(),delta:d.delta,partial:r}))}}else if(d.type===`response.function_call_arguments.delta`)c?.type===`function_call`&&l?.type===`toolCall`&&(l.partialJson+=d.delta,l.arguments=t(l.partialJson),i.push({type:`toolcall_delta`,contentIndex:f(),delta:d.delta,partial:r}));else if(d.type===`response.function_call_arguments.done`)c?.type===`function_call`&&l?.type===`toolCall`&&(l.partialJson=d.arguments,l.arguments=t(l.partialJson));else if(d.type===`response.output_item.done`){let e=d.item;if(e.type===`reasoning`&&l?.type===`thinking`)l.thinking=e.summary?.map(e=>e.text).join(`
9
+
10
+ `)||``,l.thinkingSignature=JSON.stringify(e),i.push({type:`thinking_end`,contentIndex:f(),content:l.thinking,partial:r}),l=null;else if(e.type===`message`&&l?.type===`text`)l.text=e.content.map(e=>e.type===`output_text`?e.text:e.refusal).join(``),l.textSignature=a(e.id,e.phase??void 0),i.push({type:`text_end`,contentIndex:f(),content:l.text,partial:r}),l=null;else if(e.type===`function_call`){let n=l?.type===`toolCall`&&l.partialJson?t(l.partialJson):t(e.arguments||`{}`),a={type:`toolCall`,id:`${e.call_id}|${e.id}`,name:e.name,arguments:n};l=null,i.push({type:`toolcall_end`,contentIndex:f(),toolCall:a,partial:r})}}else if(d.type===`response.completed`){let t=d.response;if(t?.id&&(r.responseId=t.id),t?.usage){let e=t.usage.input_tokens_details?.cached_tokens||0;r.usage={input:(t.usage.input_tokens||0)-e,output:t.usage.output_tokens||0,cacheRead:e,cacheWrite:0,totalTokens:t.usage.total_tokens||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}if(e(o,r.usage),s?.applyServiceTierPricing){let e=t?.service_tier??s.serviceTier;s.applyServiceTierPricing(r.usage,e)}r.stopReason=u(t?.status),r.content.some(e=>e.type===`toolCall`)&&r.stopReason===`stop`&&(r.stopReason=`toolUse`)}else if(d.type===`error`)throw Error(`Error Code ${d.code}: ${d.message}`||`Unknown error`);else if(d.type===`response.failed`){let e=d.response?.error,t=d.response?.incomplete_details,n=e?`${e.code||`unknown`}: ${e.message||`no message`}`:t?.reason?`incomplete: ${t.reason}`:`Unknown error (no error details in response)`;throw Error(n)}}function u(e){if(!e)return`stop`;switch(e){case`completed`:return`stop`;case`incomplete`:return`length`;case`failed`:case`cancelled`:return`error`;case`in_progress`:case`queued`:return`stop`;default:throw Error(`Unhandled stop reason: ${e}`)}}export{c as n,l as r,s as t};
11
+ //# sourceMappingURL=openai-responses-shared-8nKH8ywL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses-shared-8nKH8ywL.js","names":[],"sources":["../../../node_modules/@mariozechner/pi-ai/dist/providers/openai-responses-shared.js"],"sourcesContent":["import { calculateCost } from \"../models.js\";\nimport { shortHash } from \"../utils/hash.js\";\nimport { parseStreamingJson } from \"../utils/json-parse.js\";\nimport { sanitizeSurrogates } from \"../utils/sanitize-unicode.js\";\nimport { transformMessages } from \"./transform-messages.js\";\n// =============================================================================\n// Utilities\n// =============================================================================\nfunction encodeTextSignatureV1(id, phase) {\n const payload = { v: 1, id };\n if (phase)\n payload.phase = phase;\n return JSON.stringify(payload);\n}\nfunction parseTextSignature(signature) {\n if (!signature)\n return undefined;\n if (signature.startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(signature);\n if (parsed.v === 1 && typeof parsed.id === \"string\") {\n if (parsed.phase === \"commentary\" || parsed.phase === \"final_answer\") {\n return { id: parsed.id, phase: parsed.phase };\n }\n return { id: parsed.id };\n }\n }\n catch {\n // Fall through to legacy plain-string handling.\n }\n }\n return { id: signature };\n}\n// =============================================================================\n// Message conversion\n// =============================================================================\nexport function convertResponsesMessages(model, context, allowedToolCallProviders, options) {\n const messages = [];\n const normalizeIdPart = (part) => {\n const sanitized = part.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const normalized = sanitized.length > 64 ? sanitized.slice(0, 64) : sanitized;\n return normalized.replace(/_+$/, \"\");\n };\n const buildForeignResponsesItemId = (itemId) => {\n const normalized = `fc_${shortHash(itemId)}`;\n return normalized.length > 64 ? normalized.slice(0, 64) : normalized;\n };\n const normalizeToolCallId = (id, _targetModel, source) => {\n if (!allowedToolCallProviders.has(model.provider))\n return normalizeIdPart(id);\n if (!id.includes(\"|\"))\n return normalizeIdPart(id);\n const [callId, itemId] = id.split(\"|\");\n const normalizedCallId = normalizeIdPart(callId);\n const isForeignToolCall = source.provider !== model.provider || source.api !== model.api;\n let normalizedItemId = isForeignToolCall ? buildForeignResponsesItemId(itemId) : normalizeIdPart(itemId);\n // OpenAI Responses API requires item id to start with \"fc\"\n if (!normalizedItemId.startsWith(\"fc_\")) {\n normalizedItemId = normalizeIdPart(`fc_${normalizedItemId}`);\n }\n return `${normalizedCallId}|${normalizedItemId}`;\n };\n const transformedMessages = transformMessages(context.messages, model, normalizeToolCallId);\n const includeSystemPrompt = options?.includeSystemPrompt ?? true;\n if (includeSystemPrompt && context.systemPrompt) {\n const role = model.reasoning ? \"developer\" : \"system\";\n messages.push({\n role,\n content: sanitizeSurrogates(context.systemPrompt),\n });\n }\n let msgIndex = 0;\n for (const msg of transformedMessages) {\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n messages.push({\n role: \"user\",\n content: [{ type: \"input_text\", text: sanitizeSurrogates(msg.content) }],\n });\n }\n else {\n const content = msg.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"input_text\",\n text: sanitizeSurrogates(item.text),\n };\n }\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${item.mimeType};base64,${item.data}`,\n };\n });\n const filteredContent = !model.input.includes(\"image\")\n ? content.filter((c) => c.type !== \"input_image\")\n : content;\n if (filteredContent.length === 0)\n continue;\n messages.push({\n role: \"user\",\n content: filteredContent,\n });\n }\n }\n else if (msg.role === \"assistant\") {\n const output = [];\n const assistantMsg = msg;\n const isDifferentModel = assistantMsg.model !== model.id &&\n assistantMsg.provider === model.provider &&\n assistantMsg.api === model.api;\n for (const block of msg.content) {\n if (block.type === \"thinking\") {\n if (block.thinkingSignature) {\n const reasoningItem = JSON.parse(block.thinkingSignature);\n output.push(reasoningItem);\n }\n }\n else if (block.type === \"text\") {\n const textBlock = block;\n const parsedSignature = parseTextSignature(textBlock.textSignature);\n // OpenAI requires id to be max 64 characters\n let msgId = parsedSignature?.id;\n if (!msgId) {\n msgId = `msg_${msgIndex}`;\n }\n else if (msgId.length > 64) {\n msgId = `msg_${shortHash(msgId)}`;\n }\n output.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: sanitizeSurrogates(textBlock.text), annotations: [] }],\n status: \"completed\",\n id: msgId,\n phase: parsedSignature?.phase,\n });\n }\n else if (block.type === \"toolCall\") {\n const toolCall = block;\n const [callId, itemIdRaw] = toolCall.id.split(\"|\");\n let itemId = itemIdRaw;\n // For different-model messages, set id to undefined to avoid pairing validation.\n // OpenAI tracks which fc_xxx IDs were paired with rs_xxx reasoning items.\n // By omitting the id, we avoid triggering that validation (like cross-provider does).\n if (isDifferentModel && itemId?.startsWith(\"fc_\")) {\n itemId = undefined;\n }\n output.push({\n type: \"function_call\",\n id: itemId,\n call_id: callId,\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.arguments),\n });\n }\n }\n if (output.length === 0)\n continue;\n messages.push(...output);\n }\n else if (msg.role === \"toolResult\") {\n const textResult = msg.content\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n const hasImages = msg.content.some((c) => c.type === \"image\");\n const hasText = textResult.length > 0;\n const [callId] = msg.toolCallId.split(\"|\");\n let output;\n if (hasImages && model.input.includes(\"image\")) {\n const contentParts = [];\n if (hasText) {\n contentParts.push({\n type: \"input_text\",\n text: sanitizeSurrogates(textResult),\n });\n }\n for (const block of msg.content) {\n if (block.type === \"image\") {\n contentParts.push({\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${block.mimeType};base64,${block.data}`,\n });\n }\n }\n output = contentParts;\n }\n else {\n output = sanitizeSurrogates(hasText ? textResult : \"(see attached image)\");\n }\n messages.push({\n type: \"function_call_output\",\n call_id: callId,\n output,\n });\n }\n msgIndex++;\n }\n return messages;\n}\n// =============================================================================\n// Tool conversion\n// =============================================================================\nexport function convertResponsesTools(tools, options) {\n const strict = options?.strict === undefined ? false : options.strict;\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters, // TypeBox already generates JSON Schema\n strict,\n }));\n}\n// =============================================================================\n// Stream processing\n// =============================================================================\nexport async function processResponsesStream(openaiStream, output, stream, model, options) {\n let currentItem = null;\n let currentBlock = null;\n const blocks = output.content;\n const blockIndex = () => blocks.length - 1;\n for await (const event of openaiStream) {\n if (event.type === \"response.created\") {\n output.responseId = event.response.id;\n }\n else if (event.type === \"response.output_item.added\") {\n const item = event.item;\n if (item.type === \"reasoning\") {\n currentItem = item;\n currentBlock = { type: \"thinking\", thinking: \"\" };\n output.content.push(currentBlock);\n stream.push({ type: \"thinking_start\", contentIndex: blockIndex(), partial: output });\n }\n else if (item.type === \"message\") {\n currentItem = item;\n currentBlock = { type: \"text\", text: \"\" };\n output.content.push(currentBlock);\n stream.push({ type: \"text_start\", contentIndex: blockIndex(), partial: output });\n }\n else if (item.type === \"function_call\") {\n currentItem = item;\n currentBlock = {\n type: \"toolCall\",\n id: `${item.call_id}|${item.id}`,\n name: item.name,\n arguments: {},\n partialJson: item.arguments || \"\",\n };\n output.content.push(currentBlock);\n stream.push({ type: \"toolcall_start\", contentIndex: blockIndex(), partial: output });\n }\n }\n else if (event.type === \"response.reasoning_summary_part.added\") {\n if (currentItem && currentItem.type === \"reasoning\") {\n currentItem.summary = currentItem.summary || [];\n currentItem.summary.push(event.part);\n }\n }\n else if (event.type === \"response.reasoning_summary_text.delta\") {\n if (currentItem?.type === \"reasoning\" && currentBlock?.type === \"thinking\") {\n currentItem.summary = currentItem.summary || [];\n const lastPart = currentItem.summary[currentItem.summary.length - 1];\n if (lastPart) {\n currentBlock.thinking += event.delta;\n lastPart.text += event.delta;\n stream.push({\n type: \"thinking_delta\",\n contentIndex: blockIndex(),\n delta: event.delta,\n partial: output,\n });\n }\n }\n }\n else if (event.type === \"response.reasoning_summary_part.done\") {\n if (currentItem?.type === \"reasoning\" && currentBlock?.type === \"thinking\") {\n currentItem.summary = currentItem.summary || [];\n const lastPart = currentItem.summary[currentItem.summary.length - 1];\n if (lastPart) {\n currentBlock.thinking += \"\\n\\n\";\n lastPart.text += \"\\n\\n\";\n stream.push({\n type: \"thinking_delta\",\n contentIndex: blockIndex(),\n delta: \"\\n\\n\",\n partial: output,\n });\n }\n }\n }\n else if (event.type === \"response.content_part.added\") {\n if (currentItem?.type === \"message\") {\n currentItem.content = currentItem.content || [];\n // Filter out ReasoningText, only accept output_text and refusal\n if (event.part.type === \"output_text\" || event.part.type === \"refusal\") {\n currentItem.content.push(event.part);\n }\n }\n }\n else if (event.type === \"response.output_text.delta\") {\n if (currentItem?.type === \"message\" && currentBlock?.type === \"text\") {\n if (!currentItem.content || currentItem.content.length === 0) {\n continue;\n }\n const lastPart = currentItem.content[currentItem.content.length - 1];\n if (lastPart?.type === \"output_text\") {\n currentBlock.text += event.delta;\n lastPart.text += event.delta;\n stream.push({\n type: \"text_delta\",\n contentIndex: blockIndex(),\n delta: event.delta,\n partial: output,\n });\n }\n }\n }\n else if (event.type === \"response.refusal.delta\") {\n if (currentItem?.type === \"message\" && currentBlock?.type === \"text\") {\n if (!currentItem.content || currentItem.content.length === 0) {\n continue;\n }\n const lastPart = currentItem.content[currentItem.content.length - 1];\n if (lastPart?.type === \"refusal\") {\n currentBlock.text += event.delta;\n lastPart.refusal += event.delta;\n stream.push({\n type: \"text_delta\",\n contentIndex: blockIndex(),\n delta: event.delta,\n partial: output,\n });\n }\n }\n }\n else if (event.type === \"response.function_call_arguments.delta\") {\n if (currentItem?.type === \"function_call\" && currentBlock?.type === \"toolCall\") {\n currentBlock.partialJson += event.delta;\n currentBlock.arguments = parseStreamingJson(currentBlock.partialJson);\n stream.push({\n type: \"toolcall_delta\",\n contentIndex: blockIndex(),\n delta: event.delta,\n partial: output,\n });\n }\n }\n else if (event.type === \"response.function_call_arguments.done\") {\n if (currentItem?.type === \"function_call\" && currentBlock?.type === \"toolCall\") {\n currentBlock.partialJson = event.arguments;\n currentBlock.arguments = parseStreamingJson(currentBlock.partialJson);\n }\n }\n else if (event.type === \"response.output_item.done\") {\n const item = event.item;\n if (item.type === \"reasoning\" && currentBlock?.type === \"thinking\") {\n currentBlock.thinking = item.summary?.map((s) => s.text).join(\"\\n\\n\") || \"\";\n currentBlock.thinkingSignature = JSON.stringify(item);\n stream.push({\n type: \"thinking_end\",\n contentIndex: blockIndex(),\n content: currentBlock.thinking,\n partial: output,\n });\n currentBlock = null;\n }\n else if (item.type === \"message\" && currentBlock?.type === \"text\") {\n currentBlock.text = item.content.map((c) => (c.type === \"output_text\" ? c.text : c.refusal)).join(\"\");\n currentBlock.textSignature = encodeTextSignatureV1(item.id, item.phase ?? undefined);\n stream.push({\n type: \"text_end\",\n contentIndex: blockIndex(),\n content: currentBlock.text,\n partial: output,\n });\n currentBlock = null;\n }\n else if (item.type === \"function_call\") {\n const args = currentBlock?.type === \"toolCall\" && currentBlock.partialJson\n ? parseStreamingJson(currentBlock.partialJson)\n : parseStreamingJson(item.arguments || \"{}\");\n const toolCall = {\n type: \"toolCall\",\n id: `${item.call_id}|${item.id}`,\n name: item.name,\n arguments: args,\n };\n currentBlock = null;\n stream.push({ type: \"toolcall_end\", contentIndex: blockIndex(), toolCall, partial: output });\n }\n }\n else if (event.type === \"response.completed\") {\n const response = event.response;\n if (response?.id) {\n output.responseId = response.id;\n }\n if (response?.usage) {\n const cachedTokens = response.usage.input_tokens_details?.cached_tokens || 0;\n output.usage = {\n // OpenAI includes cached tokens in input_tokens, so subtract to get non-cached input\n input: (response.usage.input_tokens || 0) - cachedTokens,\n output: response.usage.output_tokens || 0,\n cacheRead: cachedTokens,\n cacheWrite: 0,\n totalTokens: response.usage.total_tokens || 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n }\n calculateCost(model, output.usage);\n if (options?.applyServiceTierPricing) {\n const serviceTier = response?.service_tier ?? options.serviceTier;\n options.applyServiceTierPricing(output.usage, serviceTier);\n }\n // Map status to stop reason\n output.stopReason = mapStopReason(response?.status);\n if (output.content.some((b) => b.type === \"toolCall\") && output.stopReason === \"stop\") {\n output.stopReason = \"toolUse\";\n }\n }\n else if (event.type === \"error\") {\n throw new Error(`Error Code ${event.code}: ${event.message}` || \"Unknown error\");\n }\n else if (event.type === \"response.failed\") {\n const error = event.response?.error;\n const details = event.response?.incomplete_details;\n const msg = error\n ? `${error.code || \"unknown\"}: ${error.message || \"no message\"}`\n : details?.reason\n ? `incomplete: ${details.reason}`\n : \"Unknown error (no error details in response)\";\n throw new Error(msg);\n }\n }\n}\nfunction mapStopReason(status) {\n if (!status)\n return \"stop\";\n switch (status) {\n case \"completed\":\n return \"stop\";\n case \"incomplete\":\n return \"length\";\n case \"failed\":\n case \"cancelled\":\n return \"error\";\n // These two are wonky ...\n case \"in_progress\":\n case \"queued\":\n return \"stop\";\n default: {\n const _exhaustive = status;\n throw new Error(`Unhandled stop reason: ${_exhaustive}`);\n }\n }\n}\n//# sourceMappingURL=openai-responses-shared.js.map"],"x_google_ignoreList":[0],"mappings":"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"}