@pen.dev/cli 0.3.5 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  import{a as e}from"./diagnostics-B0j2bfEp.mjs";import{n as t,t as n}from"./models-BBd5zwn6.mjs";import{n as r}from"./json-parse-BzRcyI3e.mjs";import{t as i}from"./headers-DlpC0ues.mjs";import{f as a,p as o,r as s,t as c,u as l}from"./transform-messages-1ulTEFY1.mjs";import{t as u}from"./sanitize-unicode-D-15laVS.mjs";import{t as d}from"./hash-DNYCELl4.mjs";const f=(t,n,r)=>{let i=new e;return(async()=>{let e=m(t);try{let a=r?.apiKey;if(!a)throw Error(`No API key for provider: ${t.provider}`);let o=h(),s=P(t,n,c(n.messages,t,e=>o(e)),r),l=await r?.onPayload?.(s,t);l!==void 0&&(s=l);let u=await b(t,s,a,r);if(i.push({type:`start`,partial:e}),await L(t,e,i,u),r?.signal?.aborted)throw Error(`Request was aborted`);if(e.stopReason===`pending`)throw Error(`Mistral stream ended without a finish reason`);if(e.stopReason===`aborted`||e.stopReason===`error`)throw Error(e.errorMessage||`An unknown error occurred`);i.push({type:`done`,reason:e.stopReason,message:e}),i.end()}catch(t){for(let t of e.content)delete t.partialArgs;e.stopReason=r?.signal?.aborted?`aborted`:`error`,e.errorMessage=_(t),i.push({type:`error`,reason:e.stopReason,error:e}),i.end()}})(),i},p=(e,n,r)=>{let i=r?.apiKey;if(!i)throw Error(`No API key for provider: ${e.provider}`);let a={...s(e,n,r,i),toolChoice:r?.toolChoice},o=r?.reasoning?t(e,r.reasoning):void 0,c=o===`off`?void 0:o,l=e.reasoning&&c!==void 0;return f(e,n,{...a,promptMode:l&&U(e)?`reasoning`:void 0,reasoningEffort:l&&H(e)?W(e,c):void 0})};function m(e){return{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:`pending`,timestamp:Date.now()}}function h(){let e=new Map,t=new Map;return n=>{let r=e.get(n);if(r)return r;let i=0;for(;;){let r=g(n,i),a=t.get(r);if(!a||a===n)return e.set(n,r),t.set(r,n),r;i++}}}function g(e,t){let n=e.replace(/[^a-zA-Z0-9]/g,``);if(t===0&&n.length===9)return n;let r=n||e;return d(t===0?r:`${r}:${t}`).replace(/[^a-zA-Z0-9]/g,``).slice(0,9)}function _(e){if(e instanceof Error){let t=e,n=typeof t.statusCode==`number`?t.statusCode:void 0,r=typeof t.body==`string`?t.body.trim():void 0;return n!==void 0&&r?`Mistral API error (${n}): ${v(r,4e3)}`:n===void 0?e.message:`Mistral API error (${n}): ${e.message}`}return y(e)}function v(e,t){return e.length<=t?e:`${e.slice(0,t)}... [truncated ${e.length-t} chars]`}function y(e){try{let t=JSON.stringify(e);return t===void 0?String(e):t}catch{return String(e)}}async function b(e,t,n,r){let a=new URL(e.baseUrl);a.pathname=`${a.pathname.replace(/\/+$/u,``)}/`;let o=new URL(`v1/chat/completions`,a),s=S(e,n,r),c=AbortSignal.timeout(r?.timeoutMs??6e4),l=r?.signal?AbortSignal.any([r.signal,c]):c,u=await(r?.fetch??globalThis.fetch)(o,{method:`POST`,headers:s,body:JSON.stringify(T(t)),signal:l});if(await r?.onResponse?.({status:u.status,headers:i(u.headers)},e),!u.ok){let e=await u.text();throw new x(u.status,e,u.statusText)}if(!u.body)throw Error(`Mistral response has no body`);return j(u.body,l)}var x=class extends Error{statusCode;body;constructor(e,t,n){super(n||`Request failed with status ${e}`),this.name=`MistralHttpError`,this.statusCode=e,this.body=t}};function S(e,t,n){let r=new Headers({"User-Agent":o(),accept:`text/event-stream`,authorization:`Bearer ${t}`,"content-type":`application/json`});C(r,e.headers),C(r,n?.headers);let i=w(e.headers,`x-affinity`)||w(n?.headers,`x-affinity`);return F(n)&&!i&&r.set(`x-affinity`,n.sessionId),r}function C(e,t){if(t)for(let[n,r]of Object.entries(t))r===null?e.delete(n):e.set(n,r)}function w(e,t){return!!e&&Object.keys(e).some(e=>e.toLowerCase()===t)}function T(e){let t={...e};for(let[e,n]of[[`topP`,`top_p`],[`maxTokens`,`max_tokens`],[`randomSeed`,`random_seed`],[`responseFormat`,`response_format`],[`toolChoice`,`tool_choice`],[`presencePenalty`,`presence_penalty`],[`frequencyPenalty`,`frequency_penalty`],[`parallelToolCalls`,`parallel_tool_calls`],[`reasoningEffort`,`reasoning_effort`],[`promptMode`,`prompt_mode`],[`promptCacheKey`,`prompt_cache_key`],[`safePrompt`,`safe_prompt`]])O(t,e,n);t.messages=e.messages.map(e=>E(e));let n=t.response_format;if(k(n)){let e={...n};O(e,`jsonSchema`,`json_schema`);let r=e.json_schema;if(k(r)){let t={...r};O(t,`schemaDefinition`,`schema`),e.json_schema=t}t.response_format=e}return t}function E(e){let t={...e};return O(t,`toolCalls`,`tool_calls`),O(t,`toolCallId`,`tool_call_id`),Array.isArray(e.content)&&(t.content=e.content.map(e=>D(e))),t}function D(e){let t={...e};for(let[e,n]of[[`imageUrl`,`image_url`],[`documentUrl`,`document_url`],[`documentName`,`document_name`],[`fileId`,`file_id`],[`referenceIds`,`reference_ids`],[`inputAudio`,`input_audio`]])O(t,e,n);return t}function O(e,t,n){t in e&&(e[n]=e[t],delete e[t])}function k(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const A=Symbol(`mistral-stream-done`);async function*j(e,t){let n=e.getReader(),r=new TextDecoder,i=``,a=()=>{n.cancel().catch(()=>{})};t.addEventListener(`abort`,a,{once:!0});try{for(;;){if(t.aborted)throw t.reason;let{done:e,value:a}=await n.read();if(t.aborted)throw t.reason;i+=e?r.decode():r.decode(a,{stream:!0});let o=M(i);for(;o;){let e=N(i.slice(0,o.index));if(i=i.slice(o.index+o.length),e===A)return;e&&(yield e),o=M(i)}if(e)break}if(i.trim()){let e=N(i);e!==A&&e&&(yield e)}}finally{t.removeEventListener(`abort`,a);try{await n.cancel()}catch{}try{n.releaseLock()}catch{}}}function M(e){let t=/\r\n\r\n|\r\n\r|\r\n\n|\r\r\n|\n\r\n|\r\r|\n\r|\n\n/u.exec(e);return t?.index===void 0?void 0:{index:t.index,length:t[0].length}}function N(e){let t=e.split(/\r\n|\r|\n/u).filter(e=>e.startsWith(`data:`)).map(e=>e.slice(5).trimStart()).join(`
3
- `).trim();if(!t)return;if(t===`[DONE]`)return A;let n=JSON.parse(t);if(!k(n)||!Array.isArray(n.choices))throw Error(`Invalid Mistral streaming event`);return{data:n}}function P(e,t,n,r){let i={model:e.id,stream:!0,messages:B(n,e.input.includes(`image`))};return t.tools?.length&&(i.tools=R(t.tools)),r?.temperature!==void 0&&(i.temperature=r.temperature),r?.maxTokens!==void 0&&(i.maxTokens=r.maxTokens),r?.toolChoice&&(i.toolChoice=G(r.toolChoice)),r?.promptMode&&(i.promptMode=r.promptMode),r?.reasoningEffort&&(i.reasoningEffort=r.reasoningEffort),F(r)&&(i.promptCacheKey=r.sessionId),t.systemPrompt&&i.messages.unshift({role:`system`,content:u(t.systemPrompt)}),i}function F(e){return e?.cacheRetention!==`none`&&!!e?.sessionId}function I(e,t){let n=e,r=n.promptTokensDetails?.cachedTokens??n.prompt_tokens_details?.cached_tokens??n.promptTokenDetails?.cachedTokens??n.prompt_token_details?.cached_tokens??n.numCachedTokens??n.num_cached_tokens??0,i=typeof r==`number`&&Number.isFinite(r)?r:0;return Math.min(t,Math.max(0,i))}async function L(e,t,i,a){let o=null,s=t.content,c=()=>s.length-1,l=new Map,d=e=>{if(e){if(e.type===`text`){i.push({type:`text_end`,contentIndex:c(),content:e.text,partial:t});return}e.type===`thinking`&&i.push({type:`thinking_end`,contentIndex:c(),content:e.thinking,partial:t})}};for await(let s of a){let a=s.data;if(t.responseId||=a.id,a.usage){let r=a.usage.prompt_tokens||0,i=I(a.usage,r);t.usage.input=Math.max(0,r-i),t.usage.output=a.usage.completion_tokens||0,t.usage.cacheRead=i,t.usage.cacheWrite=0,t.usage.totalTokens=a.usage.total_tokens||t.usage.input+t.usage.output+t.usage.cacheRead+t.usage.cacheWrite,n(e,t.usage)}let f=a.choices[0];if(!f)continue;if(f.finish_reason){t.rawStopReason=f.finish_reason;let e=K(f.finish_reason);t.stopReason=e.stopReason,e.errorMessage&&(t.errorMessage=e.errorMessage)}let p=f.delta;if(p.content!==null&&p.content!==void 0){let e=typeof p.content==`string`?[p.content]:p.content;for(let n of e){if(typeof n==`string`){let e=u(n);(!o||o.type!==`text`)&&(d(o),o={type:`text`,text:``},t.content.push(o),i.push({type:`text_start`,contentIndex:c(),partial:t})),o.text+=e,i.push({type:`text_delta`,contentIndex:c(),delta:e,partial:t});continue}if(n.type===`thinking`){let e=u((n.thinking??[]).map(e=>e.text??``).filter(e=>e.length>0).join(``));if(!e)continue;(!o||o.type!==`thinking`)&&(d(o),o={type:`thinking`,thinking:``},t.content.push(o),i.push({type:`thinking_start`,contentIndex:c(),partial:t})),o.thinking+=e,i.push({type:`thinking_delta`,contentIndex:c(),delta:e,partial:t});continue}if(n.type===`text`){let e=u(n.text??``);(!o||o.type!==`text`)&&(d(o),o={type:`text`,text:``},t.content.push(o),i.push({type:`text_start`,contentIndex:c(),partial:t})),o.text+=e,i.push({type:`text_delta`,contentIndex:c(),delta:e,partial:t})}}}let m=p.tool_calls||[];for(let e of m){o&&=(d(o),null);let n=e.id&&e.id!==`null`?e.id:g(`toolcall:${e.index??0}`,0),a=`${n}:${e.index||0}`,s=l.get(a),c;if(s!==void 0){let e=t.content[s];e?.type===`toolCall`&&(c=e)}c||(c={type:`toolCall`,id:n,name:e.function.name,arguments:{},partialArgs:``},t.content.push(c),l.set(a,t.content.length-1),i.push({type:`toolcall_start`,contentIndex:t.content.length-1,partial:t}));let u=typeof e.function.arguments==`string`?e.function.arguments:JSON.stringify(e.function.arguments||{});c.partialArgs=(c.partialArgs||``)+u,c.arguments=r(c.partialArgs),i.push({type:`toolcall_delta`,contentIndex:l.get(a),delta:u,partial:t})}}d(o);for(let e of l.values()){let n=t.content[e];if(n.type!==`toolCall`)continue;let a=n;a.arguments=r(a.partialArgs),delete a.partialArgs,i.push({type:`toolcall_end`,contentIndex:e,toolCall:a,partial:t})}}function R(e){return e.map(e=>{let t=a(e,!0);return{type:`function`,function:{name:e.name,description:e.description,parameters:z(l(e,t)),strict:t??!1}}})}function z(e){if(Array.isArray(e))return e.map(e=>z(e));if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=z(r);return t}return e}function B(e,t){let n=[];for(let r of e){if(r.role===`user`){if(typeof r.content==`string`){n.push({role:`user`,content:u(r.content)});continue}let e=r.content.some(e=>e.type===`image`),i=r.content.filter(e=>e.type===`text`||t).map(e=>e.type===`text`?{type:`text`,text:u(e.text)}:{type:`image_url`,imageUrl:`data:${e.mimeType};base64,${e.data}`});if(i.length>0){n.push({role:`user`,content:i});continue}e&&!t&&n.push({role:`user`,content:`(image omitted: model does not support images)`});continue}if(r.role===`assistant`){let e=[],t=[];for(let n of r.content){if(n.type===`text`){n.text.trim().length>0&&e.push({type:`text`,text:u(n.text)});continue}if(n.type===`thinking`){n.thinking.trim().length>0&&e.push({type:`thinking`,thinking:[{type:`text`,text:u(n.thinking)}]});continue}t.push({id:n.id,type:`function`,function:{name:n.name,arguments:JSON.stringify(n.arguments||{})},index:0})}let i={role:`assistant`,prefix:!1};e.length>0&&(i.content=e),t.length>0&&(i.toolCalls=t),(e.length>0||t.length>0)&&n.push(i);continue}let e=[],i=V(r.content.filter(e=>e.type===`text`).map(e=>e.type===`text`?u(e.text):``).join(`
3
+ `).trim();if(!t)return;if(t===`[DONE]`)return A;let n=JSON.parse(t);if(!k(n)||!Array.isArray(n.choices))throw Error(`Invalid Mistral streaming event`);return{data:n}}function P(e,t,n,r){let i={model:e.id,stream:!0,messages:B(n,e.input.includes(`image`))};return t.tools?.length&&(i.tools=R(t.tools)),r?.temperature!==void 0&&(i.temperature=r.temperature),r?.maxTokens!==void 0&&(i.maxTokens=r.maxTokens),r?.toolChoice&&(i.toolChoice=G(r.toolChoice)),r?.promptMode&&(i.promptMode=r.promptMode),r?.reasoningEffort&&(i.reasoningEffort=r.reasoningEffort),F(r)&&(i.promptCacheKey=r.sessionId),t.systemPrompt&&i.messages.unshift({role:`system`,content:u(t.systemPrompt)}),i}function F(e){return e?.cacheRetention!==`none`&&!!e?.sessionId}function I(e,t){let n=e,r=n.promptTokensDetails?.cachedTokens??n.prompt_tokens_details?.cached_tokens??n.promptTokenDetails?.cachedTokens??n.prompt_token_details?.cached_tokens??n.numCachedTokens??n.num_cached_tokens??0,i=typeof r==`number`&&Number.isFinite(r)?r:0;return Math.min(t,Math.max(0,i))}async function L(e,t,i,a){let o=null,s=t.content,c=()=>s.length-1,l=new Map,d=e=>{if(e){if(e.type===`text`){i.push({type:`text_end`,contentIndex:c(),content:e.text,partial:t});return}e.type===`thinking`&&i.push({type:`thinking_end`,contentIndex:c(),content:e.thinking,partial:t})}};for await(let s of a){let a=s.data;if(t.responseId||=a.id,a.usage){let r=a.usage.prompt_tokens||0,i=I(a.usage,r);t.usage.input=Math.max(0,r-i),t.usage.output=a.usage.completion_tokens||0,t.usage.cacheRead=i,t.usage.cacheWrite=0,t.usage.totalTokens=a.usage.total_tokens||t.usage.input+t.usage.output+t.usage.cacheRead+t.usage.cacheWrite,n(e,t.usage)}let f=a.choices[0];if(!f)continue;if(f.finish_reason){t.rawStopReason=f.finish_reason;let e=K(f.finish_reason);t.stopReason=e.stopReason,e.errorMessage&&(t.errorMessage=e.errorMessage)}let p=f.delta;if(p.content!==null&&p.content!==void 0){let e=typeof p.content==`string`?[p.content]:p.content;for(let n of e){if(typeof n==`string`){let e=u(n);(!o||o.type!==`text`)&&(d(o),o={type:`text`,text:``},t.content.push(o),i.push({type:`text_start`,contentIndex:c(),partial:t})),o.text+=e,i.push({type:`text_delta`,contentIndex:c(),delta:e,partial:t});continue}if(n.type===`thinking`){let e=u((n.thinking??[]).map(e=>e.text??``).filter(e=>e.length>0).join(``));if(!e)continue;(!o||o.type!==`thinking`)&&(d(o),o={type:`thinking`,thinking:``},t.content.push(o),i.push({type:`thinking_start`,contentIndex:c(),partial:t})),o.thinking+=e,i.push({type:`thinking_delta`,contentIndex:c(),delta:e,partial:t});continue}if(n.type===`text`){let e=u(n.text??``);(!o||o.type!==`text`)&&(d(o),o={type:`text`,text:``},t.content.push(o),i.push({type:`text_start`,contentIndex:c(),partial:t})),o.text+=e,i.push({type:`text_delta`,contentIndex:c(),delta:e,partial:t})}}}let m=p.tool_calls||[];for(let e of m){o&&=(d(o),null);let n=e.id&&e.id!==`null`?e.id:g(`toolcall:${e.index??0}`,0),a=e.index??n,s=l.get(a),c;if(s!==void 0){let e=t.content[s];e?.type===`toolCall`&&(c=e)}c||(c={type:`toolCall`,id:n,name:e.function.name,arguments:{},partialArgs:``},t.content.push(c),l.set(a,t.content.length-1),i.push({type:`toolcall_start`,contentIndex:t.content.length-1,partial:t}));let u=typeof e.function.arguments==`string`?e.function.arguments:JSON.stringify(e.function.arguments||{});c.partialArgs=(c.partialArgs||``)+u,c.arguments=r(c.partialArgs),i.push({type:`toolcall_delta`,contentIndex:l.get(a),delta:u,partial:t})}}d(o);for(let e of l.values()){let n=t.content[e];if(n.type!==`toolCall`)continue;let a=n;a.arguments=r(a.partialArgs),delete a.partialArgs,i.push({type:`toolcall_end`,contentIndex:e,toolCall:a,partial:t})}}function R(e){return e.map(e=>{let t=a(e,!0);return{type:`function`,function:{name:e.name,description:e.description,parameters:z(l(e,t)),strict:t??!1}}})}function z(e){if(Array.isArray(e))return e.map(e=>z(e));if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=z(r);return t}return e}function B(e,t){let n=[];for(let r of e){if(r.role===`user`){if(typeof r.content==`string`){n.push({role:`user`,content:u(r.content)});continue}let e=r.content.some(e=>e.type===`image`),i=r.content.filter(e=>e.type===`text`||t).map(e=>e.type===`text`?{type:`text`,text:u(e.text)}:{type:`image_url`,imageUrl:`data:${e.mimeType};base64,${e.data}`});if(i.length>0){n.push({role:`user`,content:i});continue}e&&!t&&n.push({role:`user`,content:`(image omitted: model does not support images)`});continue}if(r.role===`assistant`){let e=[],t=[];for(let n of r.content){if(n.type===`text`){n.text.trim().length>0&&e.push({type:`text`,text:u(n.text)});continue}if(n.type===`thinking`){n.thinking.trim().length>0&&e.push({type:`thinking`,thinking:[{type:`text`,text:u(n.thinking)}]});continue}t.push({id:n.id,type:`function`,function:{name:n.name,arguments:JSON.stringify(n.arguments||{})},index:0})}let i={role:`assistant`,prefix:!1};e.length>0&&(i.content=e),t.length>0&&(i.toolCalls=t),(e.length>0||t.length>0)&&n.push(i);continue}let e=[],i=V(r.content.filter(e=>e.type===`text`).map(e=>e.type===`text`?u(e.text):``).join(`
4
4
  `),r.content.some(e=>e.type===`image`),t,r.isError);e.push({type:`text`,text:i});for(let n of r.content)t&&n.type===`image`&&e.push({type:`image_url`,imageUrl:`data:${n.mimeType};base64,${n.data}`});n.push({role:`tool`,toolCallId:r.toolCallId,name:r.toolName,content:e})}return n}function V(e,t,n,r){let i=e.trim(),a=r?`[tool error] `:``;return i.length>0?`${a}${i}${t&&!n?`
5
5
  [tool image omitted: model does not support images]`:``}`:t?n?r?`[tool error] (see attached image)`:`(see attached image)`:r?`[tool error] (image omitted: model does not support images)`:`(image omitted: model does not support images)`:r?`[tool error] (no tool output)`:`(no tool output)`}function H(e){return e.id===`mistral-small-2603`||e.id===`mistral-small-latest`||e.id===`mistral-medium-3.5`}function U(e){return e.reasoning&&!H(e)}function W(e,t){return e.thinkingLevelMap?.[t]??`high`}function G(e){if(e)return e===`auto`||e===`none`||e===`any`||e===`required`?e:{type:`function`,function:{name:e.function.name}}}function K(e){if(e===null)return{stopReason:`stop`};switch(e){case`stop`:return{stopReason:`stop`};case`length`:case`model_length`:return{stopReason:`length`};case`tool_calls`:return{stopReason:`toolUse`};case`error`:return{stopReason:`error`,errorMessage:`Provider stopped with: error`};default:return{stopReason:`error`,errorMessage:`Provider stopped with: ${e}`}}}export{f as stream,p as streamSimple};
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import{a as e}from"./diagnostics-B0j2bfEp.mjs";import{n as t,t as n}from"./models-BBd5zwn6.mjs";import{n as r}from"./json-parse-BzRcyI3e.mjs";import{t as i}from"./provider-env-CL5ShLlj.mjs";import{t as a}from"./headers-DlpC0ues.mjs";import{a as o,c as s,d as c,f as l,l as u,o as d,p as f,r as p,s as m,t as h,u as g}from"./transform-messages-1ulTEFY1.mjs";import{t as _}from"./provider-retry-GaV_ioT7.mjs";import{t as v}from"./sanitize-unicode-D-15laVS.mjs";import{n as y,t as b}from"./github-copilot-headers-DCj7hJoC.mjs";import{n as x}from"./openai-CbFQ5q5I.mjs";import{n as S,t as C}from"./error-body-BBlqjbe7.mjs";import{t as w}from"./openai-prompt-cache-tVHrB8oW.mjs";import{t as T}from"./hash-DNYCELl4.mjs";function E(e,t){if(!e)return!1;let n=t.toLowerCase();for(let[t,r]of Object.entries(e))if(t.toLowerCase()===n&&r!==null&&r.trim().length>0)return!0;return!1}function D(e,t,n){if(t)return t;if(E(n,`authorization`)||E(n,`cf-aig-authorization`))return`unused`;throw Error(`No API key for provider: ${e}`)}function O(e){for(let t of e)if(t.role===`toolResult`||t.role===`assistant`&&t.content.some(e=>e.type===`toolCall`))return!0;return!1}function k(e){let t=new Set;for(let n of e)if(n.role===`toolResult`)for(let e of n.addedToolNames??[])t.add(e);return t}function A(e,t){if(!e)return[];let n=new Map(e.map(e=>[e.name,e]));return Array.from(t).map(e=>n.get(e)).filter(e=>e!==void 0)}function j(e){return e.type===`text`}function M(e){return e.type===`thinking`}function N(e){return e.type===`toolCall`}function P(e){return e.type===`image`}function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function I(e){return(e.id===void 0||e.id===null||typeof e.id==`string`)&&(e.format===void 0||typeof e.format==`string`)&&(e.index===void 0||typeof e.index==`number`)}function L(e){if(!F(e)||!I(e))return!1;switch(e.type){case`reasoning.summary`:return typeof e.summary==`string`;case`reasoning.encrypted`:return typeof e.data==`string`;case`reasoning.text`:return typeof e.text==`string`&&(e.signature===void 0||e.signature===null||typeof e.signature==`string`);default:return!1}}function ee(e){if(e)try{let t=JSON.parse(e);return Array.isArray(t)&&t.length>0&&t.every(L)?t:void 0}catch{return}}function te(e){if(e)try{let t=JSON.parse(e);return L(t)&&t.type===`reasoning.encrypted`&&typeof t.id==`string`&&t.id.length>0&&t.data.length>0?t:void 0}catch{return}}function R(e,t){e.id??=t.id,e.format||=t.format,e.index??=t.index}function ne(e,t){let n=e[e.length-1];if(t.type===`reasoning.text`&&n?.type===`reasoning.text`){n.text+=t.text,n.signature||=t.signature,R(n,t);return}if(t.type===`reasoning.summary`&&n?.type===`reasoning.summary`){n.summary+=t.summary,R(n,t);return}e.push({...t})}const re=[`reasoning`,`reasoning_content`,`reasoning_text`];function ie(e){return re.includes(e)}function z(e,t){return e||(i(`PI_CACHE_RETENTION`,t)===`long`?`long`:`short`)}const B=(t,n,i)=>{let o=new e;return(async()=>{let e={role:`assistant`,content:[],api:t.api,provider:t.provider,model:t.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`pending`,timestamp:Date.now()},c,l=e=>{c!==void 0&&(e.thinkingSignature=JSON.stringify(c))};try{let u=D(t.provider,i?.apiKey,i?.headers),d=$(t),f=s(n.tools,d.supportsOpenAIGrammarTools),p=z(i?.cacheRetention,i?.env),h=p===`none`?void 0:i?.sessionId,g=H(t,n,u,i?.headers,i?.fetch,h,d),v=U(t,n,i,d,p,f),y=await i?.onPayload?.(v,t);y!==void 0&&(v=y);let b={...i?.signal?{signal:i.signal}:{},...i?.timeoutMs===void 0?{}:{timeout:i.timeoutMs},maxRetries:0},{data:x,response:S}=await _(()=>g.chat.completions.create(v,b).withResponse(),{maxRetries:i?.maxRetries,maxRetryDelayMs:i?.maxRetryDelayMs,signal:i?.signal});await i?.onResponse?.({status:S.status,headers:a(S.headers)},t),o.push({type:`start`,partial:e});let C=null,w=null,T=!1,E=new Map,O=new Map,k=e.content,A=e=>k.indexOf(e),j=e=>{let t=e.customInput?.property;if(t===void 0)return``;let n=e.arguments[t];return typeof n==`string`?n:``},M=(e,t,n)=>{let r=e.customInput;if(!r)return;let i=m(r.jsonBuffer,r.property,t,n);return e.arguments={[r.property]:t},i},N=t=>{let n=A(t);if(n!==-1){if(t.type===`text`)o.push({type:`text_end`,contentIndex:n,content:t.text,partial:e});else if(t.type===`thinking`)l(t),o.push({type:`thinking_end`,contentIndex:n,content:t.thinking,partial:e});else if(t.type===`toolCall`){if(t.customInput){let r=M(t,j(t),!0);r!==void 0&&o.push({type:`toolcall_delta`,contentIndex:n,delta:r,partial:e})}else t.arguments=r(t.partialArgs);delete t.partialArgs,delete t.customInput,delete t.streamIndex,o.push({type:`toolcall_end`,contentIndex:n,toolCall:t,partial:e})}}},P=()=>(C||(C={type:`text`,text:``},k.push(C),o.push({type:`text_start`,contentIndex:A(C),partial:e})),C),F=t=>(w||(w={type:`thinking`,thinking:``,thinkingSignature:t},k.push(w),o.push({type:`thinking_start`,contentIndex:A(w),partial:e})),w),I=t=>{let n=typeof t.index==`number`?t.index:void 0,r=t.function?.name??t.custom?.name??``,i=n===void 0?void 0:E.get(n);if(!i&&t.id&&(i=O.get(t.id)),!i){let a=t.custom&&!t.function?f.get(r)??`input`:void 0,s=a!==void 0;i={type:`toolCall`,id:t.id||``,name:r,arguments:s?{[a]:``}:{},partialArgs:s?void 0:``,customInput:s?{property:a,jsonBuffer:{input:``,started:!1,closed:!1}}:void 0,streamIndex:n},n!==void 0&&E.set(n,i),t.id&&O.set(t.id,i),k.push(i),o.push({type:`toolcall_start`,contentIndex:A(i),partial:e})}if(n!==void 0&&i.streamIndex===void 0&&(i.streamIndex=n,E.set(n,i)),t.id&&O.set(t.id,i),!i.name&&r&&(i.name=r),t.custom&&!t.function&&!i.customInput){let e=f.get(i.name)??`input`;i.arguments={[e]:``},i.customInput={property:e,jsonBuffer:{input:``,started:!1,closed:!1}},delete i.partialArgs}return i};for await(let n of x){if(!n||typeof n!=`object`)continue;e.responseId||=n.id,typeof n.model==`string`&&n.model.length>0&&n.model!==t.id&&(e.responseModel||=n.model),n.usage&&(e.usage=Q(n.usage,t));let i=Array.isArray(n.choices)?n.choices[0]:void 0;if(i){if(!n.usage&&i.usage&&(e.usage=Q(i.usage,t)),i.finish_reason){e.rawStopReason=i.finish_reason;let t=de(i.finish_reason);e.stopReason=t.stopReason,t.errorMessage&&(e.errorMessage=t.errorMessage),T=!0}if(i.delta){if(i.delta.content!==null&&i.delta.content!==void 0&&i.delta.content.length>0){let t=P();t.text+=i.delta.content,o.push({type:`text_delta`,contentIndex:A(t),delta:i.delta.content,partial:e})}let n=[`reasoning_content`,`reasoning`,`reasoning_text`],a=i.delta,s=null;for(let e of n){let t=a[e];if(typeof t==`string`&&t.length>0){s=e;break}}if(s){let n=a[s];if(typeof n==`string`&&n.length>0){let r=F(t.provider===`opencode-go`&&s===`reasoning`?`reasoning_content`:s);r.thinking+=n,o.push({type:`thinking_delta`,contentIndex:A(r),delta:n,partial:e})}}if(i?.delta?.tool_calls)for(let t of i.delta.tool_calls){let n=I(t);!n.id&&t.id&&(n.id=t.id,O.set(t.id,n));let i=t.function?.name??t.custom?.name;!n.name&&i&&(n.name=i);let a=``;t.function?.arguments?(a=t.function.arguments,n.partialArgs=(n.partialArgs??``)+t.function.arguments,n.arguments=r(n.partialArgs)):t.custom?.input&&(a=M(n,j(n)+t.custom.input,!1)??``),o.push({type:`toolcall_delta`,contentIndex:A(n),delta:a,partial:e})}let l=i.delta.reasoning_details;if(Array.isArray(l))for(let e of l)L(e)&&(F(``),c??=[],ne(c,e))}}}for(let e of k)N(e);if(i?.signal?.aborted||e.stopReason===`aborted`)throw Error(`Request was aborted`);if(!T&&!d.supportsFinishReason&&(e.stopReason=e.content.some(e=>e.type===`toolCall`)?`toolUse`:`stop`),e.stopReason===`error`)throw Error(e.errorMessage||`Provider returned an error stop reason`);if(d.supportsFinishReason&&!T||e.stopReason===`pending`)throw Error(`Stream ended without finish_reason`);o.push({type:`done`,reason:e.stopReason,message:e}),o.end()}catch(t){for(let t of e.content)t.type===`thinking`&&l(t),delete t.index,delete t.partialArgs,delete t.customInput,delete t.streamIndex;e.stopReason=i?.signal?.aborted?`aborted`:`error`,e.errorMessage=C(S(t));let n=t?.error?.metadata?.raw;n&&!e.errorMessage.includes(String(n))&&(e.errorMessage+=`\n${n}`),o.push({type:`error`,reason:e.stopReason,error:e}),o.end()}})(),o},V=(e,n,r)=>{D(e.provider,r?.apiKey,r?.headers);let i={...p(e,n,r,r?.apiKey),toolChoice:r?.toolChoice},a=r?.reasoning?t(e,r.reasoning):void 0,o=a===`off`?void 0:a;return B(e,n,{...i,reasoningEffort:o,thinkingBudgets:r?.thinkingBudgets})};function H(e,t,n,r,i,a,o=$(e)){let s={"User-Agent":f(),...e.headers};if(e.provider===`github-copilot`){let e=y(t.messages),n=b({messages:t.messages,hasImages:e});Object.assign(s,n)}return a&&o.sendSessionAffinityHeaders&&(o.sessionAffinityFormat===`openrouter`?s[`x-session-id`]=a:(o.sessionAffinityFormat===`openai`&&(s.session_id=a),s[`x-client-request-id`]=a,s[`x-session-affinity`]=a)),r&&Object.assign(s,r),new x({apiKey:n,baseURL:e.baseUrl,dangerouslyAllowBrowser:!0,fetch:i,defaultHeaders:s})}function U(e,t,n,r=$(e),i=z(n?.cacheRetention,n?.env),a=s(t.tools,r.supportsOpenAIGrammarTools)){let o=X(e,t,r,{grammarToolInputProperties:a}),c=J(r,i),l={model:e.id,messages:o,stream:!0,prompt_cache_key:e.baseUrl.includes(`api.openai.com`)&&i!==`none`||i===`long`&&r.supportsLongCacheRetention?w(n?.sessionId):void 0,prompt_cache_retention:i===`long`&&r.supportsLongCacheRetention?`24h`:void 0};r.supportsUsageInStreaming!==!1&&(l.stream_options={include_usage:!0}),r.supportsStore&&(l.store=!1),n?.maxTokens&&(r.maxTokensField===`max_tokens`?l.max_tokens=n.maxTokens:l.max_completion_tokens=n.maxTokens),n?.temperature!==void 0&&(l.temperature=n.temperature);let u=r.deferredToolsMode===`kimi`?k(t.messages):new Set,d=t.tools?.filter(e=>!u.has(e.name));d&&d.length>0?(l.tools=Z(d,r),r.zaiToolStream&&(l.tool_stream=!0)):O(t.messages)&&(l.tools=[]),c&&ae(o,l.tools,c),n?.toolChoice&&(l.tool_choice=n.toolChoice);let f=W(r),p=G(e,n,l);if(r.thinkingFormat===`zai`&&e.reasoning){let t=l;if(t.thinking=n?.reasoningEffort?{type:`enabled`,clear_thinking:!1}:{type:`disabled`},n?.reasoningEffort&&r.supportsReasoningEffort){let r=e.thinkingLevelMap?.[n.reasoningEffort],i=r===void 0?n.reasoningEffort:r;typeof i==`string`&&(t.reasoning_effort=i)}}else if(r.thinkingFormat===`qwen`&&e.reasoning){if(l.enable_thinking=!!n?.reasoningEffort,n?.reasoningEffort&&r.supportsReasoningEffort){let t=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort;typeof t==`string`&&(l.reasoning_effort=t)}}else if(r.thinkingFormat===`qwen-chat-template`&&e.reasoning)l.chat_template_kwargs={enable_thinking:!!n?.reasoningEffort,preserve_thinking:!0};else if(r.thinkingFormat===`chat-template`&&e.reasoning){let t=K(e,n,r.chatTemplateKwargs,p);t&&(l.chat_template_kwargs=t)}else if(r.thinkingFormat===`baseten`&&e.reasoning){let t=l,i=K(e,n,r.chatTemplateArgs,p);if(i&&(t.chat_template_args=i),r.supportsReasoningEffort){let r=n?.reasoningEffort,i=r?e.thinkingLevelMap?.[r]:e.thinkingLevelMap?.off,a=i===void 0?r:i;typeof a==`string`&&(t.reasoning_effort=a)}}else if(r.thinkingFormat===`deepseek`&&e.reasoning)n?.reasoningEffort?l.thinking={type:`enabled`}:e.thinkingLevelMap?.off!==null&&(l.thinking={type:`disabled`}),n?.reasoningEffort&&r.supportsReasoningEffort&&(l.reasoning_effort=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort);else if(r.thinkingFormat===`openrouter`&&e.reasoning){let t=l;n?.reasoningEffort?t.reasoning={effort:e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort}:e.thinkingLevelMap?.off!==null&&(t.reasoning={effort:e.thinkingLevelMap?.off??`none`})}else if(r.thinkingFormat===`ant-ling`&&e.reasoning&&n?.reasoningEffort){let t=e.thinkingLevelMap?.[n.reasoningEffort];typeof t==`string`&&(l.reasoning={effort:t})}else if(r.thinkingFormat===`together`&&e.reasoning){let t=l;t.reasoning={enabled:!!n?.reasoningEffort},n?.reasoningEffort&&r.supportsReasoningEffort&&(t.reasoning_effort=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort)}else if(r.thinkingFormat===`string-thinking`&&e.reasoning){let t=l;n?.reasoningEffort?t.thinking=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort:e.thinkingLevelMap?.off!==null&&(t.thinking=e.thinkingLevelMap?.off??`none`)}else if(n?.reasoningEffort&&e.reasoning&&r.supportsReasoningEffort)l.reasoning_effort=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort;else if(!n?.reasoningEffort&&e.reasoning&&r.supportsReasoningEffort){let t=e.thinkingLevelMap?.off;typeof t==`string`&&(l.reasoning_effort=t)}if(f&&p!==void 0&&Object.assign(l,{[f]:p}),e.compat?.openRouterRouting&&(l.provider=e.compat.openRouterRouting),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),l.providerOptions={gateway:e}}}return n?.samplingParams&&Object.assign(l,n.samplingParams),l}function W(e){if(e.thinkingTokenBudgetField)return e.thinkingTokenBudgetField;if(e.supportsThinkingTokenBudget)return`thinking_token_budget`}function G(e,t,n){if(!t?.reasoningEffort||!e.reasoning)return;let r=n.max_tokens??n.max_completion_tokens??e.maxTokens,i=o(d(t.reasoningEffort,t.thinkingBudgets),r);return i>0?i:void 0}function K(e,t,n,r){let i={};for(let[a,o]of Object.entries(n)){let n=q(e,t,o,r);n!==void 0&&(i[a]=n)}return Object.keys(i).length>0?i:void 0}function q(e,t,n,r){if(typeof n!=`object`||!n)return n;let i=t?.reasoningEffort;if(!i&&n.omitWhenOff)return;if(n.$var===`thinking.enabled`)return!!i;if(n.$var===`thinking.budget`)return r;let a=i?e.thinkingLevelMap?.[i]:e.thinkingLevelMap?.off;return a===void 0?i:typeof a==`string`?a:void 0}function J(e,t){if(e.cacheControlFormat!==`anthropic`||t===`none`)return;let n=t===`long`&&e.supportsLongCacheRetention?`1h`:void 0;return{type:`ephemeral`,...n?{ttl:n}:{}}}function ae(e,t,n){oe(e,n),ce(t,n),se(e,n)}function oe(e,t){for(let n of e)if(n.role===`system`||n.role===`developer`){le(n,t);return}}function se(e,t){for(let n=e.length-1;n>=0;n--){let r=e[n];if((r.role===`user`||r.role===`assistant`||r.role===`tool`)&&ue(r,t))return}}function ce(e,t){if(!e||e.length===0)return;let n=e[e.length-1];n.cache_control=t}function le(e,t){return Y(e,t)}function ue(e,t){return e.role===`user`||e.role===`assistant`||e.role===`tool`?Y(e,t):!1}function Y(e,t){let n=e.content;if(typeof n==`string`)return n.length===0?!1:(e.content=[{type:`text`,text:n,cache_control:t}],!0);if(!Array.isArray(n))return!1;for(let e=n.length-1;e>=0;e--){let r=n[e];if(r?.type===`text`){let e=r;return e.cache_control=t,!0}}return!1}function X(e,t,n,r){let i=[],a=t=>{if(t.includes(`|`)){let e=t.indexOf(`|`),n=t.slice(0,e).replace(/[^a-zA-Z0-9_-]/g,`_`),r=t.slice(e+1).replace(/[^a-zA-Z0-9_-]/g,`_`),i=r.length>0?`${n}_${r}`:n;if(i.length<=40)return i;let a=T(t).slice(0,8);return`${n.slice(0,Math.max(1,40-a.length-1))}_${a}`}return e.provider===`openai`&&t.length>40?t.slice(0,40):t},o=h(t.messages,e,e=>a(e));if(t.systemPrompt){let r=e.reasoning&&n.supportsDeveloperRole?`developer`:`system`;i.push({role:r,content:v(t.systemPrompt)})}let s=null;for(let a=0;a<o.length;a++){let c=o[a];if(n.requiresAssistantAfterToolResult&&s===`toolResult`&&c.role===`user`&&i.push({role:`assistant`,content:`I have processed the tool results.`}),c.role===`user`)if(typeof c.content==`string`)i.push({role:`user`,content:v(c.content)});else{let e=c.content.map(e=>e.type===`text`?{type:`text`,text:v(e.text)}:{type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}});if(e.length===0)continue;i.push({role:`user`,content:e})}else if(c.role===`assistant`){let t={role:`assistant`,content:n.requiresAssistantAfterToolResult?``:null},a=c.content.filter(j).filter(e=>e.text.trim().length>0).map(e=>({type:`text`,text:v(e.text)})),o=a.map(e=>e.text).join(``),s=c.content.filter(M),l=c.content.filter(N),d=s.map(e=>ee(e.thinkingSignature)).find(e=>e!==void 0),f=l.map(e=>te(e.thoughtSignature)).filter(e=>e!==void 0),p=d??(f.length>0?f:void 0),m=s.filter(e=>e.thinking.trim().length>0);if(m.length>0){if(n.requiresThinkingAsText)t.content=[{type:`text`,text:m.map(e=>v(e.thinking)).join(`
3
+
4
+ `)},...a];else if(o.length>0&&(t.content=o),!p){let n=m[0].thinkingSignature;e.provider===`opencode-go`&&n===`reasoning`&&(n=`reasoning_content`),n&&ie(n)&&(t[n]=m.map(e=>e.thinking).join(`
5
+ `))}}else o.length>0&&(t.content=o);l.length>0&&(t.tool_calls=l.map(e=>{let t=r?.grammarToolInputProperties?.get(e.name);return t===void 0?{id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments)}}:{id:e.id,type:`custom`,custom:{name:e.name,input:v(u(e.name,e.arguments,t))}}})),p&&(t.reasoning_details=p),n.requiresReasoningContentOnAssistantMessages&&e.reasoning&&t.reasoning_content===void 0&&(t.reasoning_content=``);let h=t.content;if(!(h!=null&&h.length>0)&&!t.tool_calls)continue;i.push(t)}else if(c.role===`toolResult`){let r=[],c=new Set,l=a;for(;l<o.length&&o[l].role===`toolResult`;l++){let t=o[l],a=t.content.filter(j).map(e=>e.text).join(`
6
+ `),s=t.content.some(e=>e.type===`image`),u={role:`tool`,content:v(a.length>0?a:s?`(see attached image)`:`(no tool output)`),tool_call_id:t.toolCallId};if(n.requiresToolResultName&&t.toolName&&(u.name=t.toolName),i.push(u),n.deferredToolsMode===`kimi`)for(let e of t.addedToolNames??[])c.add(e);if(s&&e.input.includes(`image`))for(let e of t.content)P(e)&&r.push({type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}})}if(a=l-1,r.length>0?(n.requiresAssistantAfterToolResult&&i.push({role:`assistant`,content:`I have processed the tool results.`}),i.push({role:`user`,content:[{type:`text`,text:`Attached image(s) from tool result:`},...r]}),s=`user`):s=`toolResult`,c.size>0){let e=A(t.tools,c);if(e.length>0){let t={role:`system`,tools:Z(e,n)};i.push(t)}}continue}s=c.role}return i}function Z(e,t){return e.map(e=>{let n=c(e,t.supportsOpenAIGrammarTools);if(n)return{type:`custom`,custom:{name:e.name,description:e.description,format:{type:`grammar`,grammar:{syntax:n.format,definition:n.definition}}}};let r=l(e,t.supportsStrictMode!==!1);return{type:`function`,function:{name:e.name,description:e.description,parameters:g(e,r),...t.supportsStrictMode!==!1&&{strict:r??!1}}}})}function Q(e,t){let r=e.prompt_tokens||0,i=e.prompt_tokens_details?.cached_tokens??e.prompt_cache_hit_tokens??e.cached_tokens??0,a=e.prompt_tokens_details?.cache_write_tokens||0,o=Math.max(0,r-i-a),s=e.completion_tokens||0,c={input:o,output:s,cacheRead:i,cacheWrite:a,reasoning:e.completion_tokens_details?.reasoning_tokens||0,totalTokens:o+s+i+a,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return n(t,c),c}function de(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 fe(e){let t=e.provider,n=e.baseUrl,r=t===`zai`||t===`zai-coding-cn`||n.includes(`api.z.ai`)||n.includes(`open.bigmodel.cn`),i=t===`together`||n.includes(`api.together.ai`)||n.includes(`api.together.xyz`),a=t===`moonshotai`||t===`moonshotai-cn`||n.includes(`api.moonshot.`),o=t===`openrouter`||n.includes(`openrouter.ai`),s=t===`cloudflare-workers-ai`||n.includes(`api.cloudflare.com`),c=t===`cloudflare-ai-gateway`||n.includes(`gateway.ai.cloudflare.com`),l=t===`nvidia`||n.includes(`integrate.api.nvidia.com`),u=t===`ant-ling`||n.includes(`api.ant-ling.com`),d=t===`deepseek`||n.toLowerCase().includes(`deepseek.com`),f=l||t===`cerebras`||n.includes(`cerebras.ai`)||t===`xai`||n.includes(`api.x.ai`)||i||n.includes(`chutes.ai`)||d||r||a||t===`opencode`||n.includes(`opencode.ai`)||s||c||u,p=n.includes(`chutes.ai`)||d||a||c||i||l||u||r,m=t===`xai`||n.includes(`api.x.ai`),h=o&&(e.id.startsWith(`anthropic/`)||e.id.startsWith(`openai/`)),g=t===`openrouter`&&e.id.startsWith(`anthropic/`)?`anthropic`:void 0;return{supportsStore:!f,supportsDeveloperRole:h||!f&&!o,supportsReasoningEffort:!m&&!r&&!a&&!i&&!c&&!l&&!u,supportsUsageInStreaming:!0,supportsFinishReason:!0,maxTokensField:p?`max_tokens`:`max_completion_tokens`,requiresToolResultName:!1,requiresAssistantAfterToolResult:!1,requiresThinkingAsText:!1,requiresReasoningContentOnAssistantMessages:d,thinkingFormat:d?`deepseek`:r?`zai`:i?`together`:u?`ant-ling`:o?`openrouter`:`openai`,openRouterRouting:{},vercelGatewayRouting:{},chatTemplateKwargs:{},chatTemplateArgs:{},zaiToolStream:!1,supportsThinkingTokenBudget:!1,thinkingTokenBudgetField:void 0,supportsStrictMode:!a&&!i&&!c&&!l,supportsOpenAIGrammarTools:!1,cacheControlFormat:g,sendSessionAffinityHeaders:!1,deferredToolsMode:void 0,sessionAffinityFormat:o?`openrouter`:`openai`,supportsLongCacheRetention:!(i||s||c||l||u)}}function $(e){let t=fe(e);return e.compat?{supportsStore:e.compat.supportsStore??t.supportsStore,supportsDeveloperRole:e.compat.supportsDeveloperRole??t.supportsDeveloperRole,supportsReasoningEffort:e.compat.supportsReasoningEffort??t.supportsReasoningEffort,supportsUsageInStreaming:e.compat.supportsUsageInStreaming??t.supportsUsageInStreaming,supportsFinishReason:e.compat.supportsFinishReason??t.supportsFinishReason,maxTokensField:e.compat.maxTokensField??t.maxTokensField,requiresToolResultName:e.compat.requiresToolResultName??t.requiresToolResultName,requiresAssistantAfterToolResult:e.compat.requiresAssistantAfterToolResult??t.requiresAssistantAfterToolResult,requiresThinkingAsText:e.compat.requiresThinkingAsText??t.requiresThinkingAsText,requiresReasoningContentOnAssistantMessages:e.compat.requiresReasoningContentOnAssistantMessages??t.requiresReasoningContentOnAssistantMessages,thinkingFormat:e.compat.thinkingFormat??t.thinkingFormat,openRouterRouting:e.compat.openRouterRouting??{},vercelGatewayRouting:e.compat.vercelGatewayRouting??t.vercelGatewayRouting,chatTemplateKwargs:e.compat.chatTemplateKwargs??t.chatTemplateKwargs,chatTemplateArgs:e.compat.chatTemplateArgs??t.chatTemplateArgs,zaiToolStream:e.compat.zaiToolStream??t.zaiToolStream,supportsThinkingTokenBudget:e.compat.supportsThinkingTokenBudget??t.supportsThinkingTokenBudget,thinkingTokenBudgetField:e.compat.thinkingTokenBudgetField??t.thinkingTokenBudgetField,supportsStrictMode:e.compat.supportsStrictMode??t.supportsStrictMode,supportsOpenAIGrammarTools:e.compat.supportsOpenAIGrammarTools??t.supportsOpenAIGrammarTools,cacheControlFormat:e.compat.cacheControlFormat??t.cacheControlFormat,sendSessionAffinityHeaders:e.compat.sendSessionAffinityHeaders??t.sendSessionAffinityHeaders,deferredToolsMode:e.compat.deferredToolsMode??t.deferredToolsMode,sessionAffinityFormat:e.compat.sessionAffinityFormat??t.sessionAffinityFormat,supportsLongCacheRetention:e.compat.supportsLongCacheRetention??t.supportsLongCacheRetention}:t}export{X as convertMessages,B as stream,V as streamSimple};
@@ -59,7 +59,8 @@ After reviewing the design, do NOT delete it to make changes. If you want to fix
59
59
  - Avoid wrapping every element in its own box or card. This is a common AI habit that makes designs look generic. Use a container only when it has a real structural or functional purpose.
60
60
  - Avoid excessive gradients, shadows, and rounded corners unless requested or when part of the brand identity. Be refined and intentional with effects and decorations
61
61
  - All Google fonts are available.
62
- - Never draw logos, illustrations, mascots, or other freeform artwork yourself out of paths and shapes - hand-built drawings always look bad. Whenever the user asks you to draw something, or a design needs a logo, illustration, or decorative graphic, use the `Generate` function with `type: "svg"` on a frame instead.
62
+ - Never draw logos, illustrations, or mascots yourself out of paths and shapes - hand-built drawings always look bad. When a design genuinely calls for one, use the `Generate` function with `type: "svg"` on a frame.
63
+ - Most designs need no custom artwork at all. Use `icon` nodes for iconography, frames/shapes/gradient fills for decoration and backgrounds, and image fills for photography. Reserve SVG generation for artwork none of those can express.
63
64
 
64
65
  #### Style archetypes
65
66
 
@@ -271,20 +271,36 @@ Export([pageId], "html-tailwind", "./landing.html")
271
271
  - `"stock"` fills are applied during the call; if no matching photo is found,
272
272
  a warning is returned and the node is left without an image fill.
273
273
 
274
+ ```js
275
+ const pos = FindEmptySpace({width: 1440, height: 800, padding: 80, nodeId: logoFrameId})
276
+ heroId = Insert(document, {type: "frame", name: "Section", x: pos.x, y: pos.y, width: 1440, height: 800, placeholder: true})
277
+ Generate(heroId, "ai", "Tropical jungle canopy, dense green foliage, sunlight filtering through trees, cinematic aerial view, vibrant greens, moody atmospheric lighting, nature photography")
278
+ ```
279
+
274
280
  #### Generating an SVG (`type: "svg"`)
275
281
 
276
- - Use SVG generation for ANY drawing task: logos, illustrations, mascots,
277
- badges, decorative artwork, abstract patterns, or anything the user asks you
278
- to "draw". This applies both when drawing is the request itself and when a
279
- logo or illustration is one part of a larger design you are working on.
280
- - Never create these manually by assembling `path`, `polygon`, or other shape
281
- nodes - hand-built artwork always looks crude. Your only drawing tool for
282
- freeform artwork is Generate.
283
- - To display an SVG: first Insert a frame with the desired width and height
284
- (no other element type is allowed), then use Generate. The resulting path elements are scaled to fit the frame's bounding box and inserted as its children.
282
+ - SVG generation is the only way to produce freeform vector artwork, and it is currently the slowest and most expensive operation in Pencil. Use it deliberately - it is not the default way to fill visual space.
283
+ - Generate an SVG only when the artwork itself is the point:
284
+ - the user asks you to draw, illustrate, or create a logo, mark, mascot, or illustration,
285
+ - the design is for a brand or product that needs its own logo mark and the document doesn't already contain one,
286
+ - a section is carried by a custom illustration or diagram that cannot be assembled from icons, shapes, or an image.
287
+ - Do NOT generate an SVG for these - each has a cheaper, better option:
288
+ - icons, arrows, chevrons, checkmarks, UI glyphs -> an `icon` node (`lucide`, `feather`, `Material Symbols`, `phosphor`)
289
+ - photos, textures, hero and background imagery, avatars, product shots -> an image fill via `Generate` with `type: "stock"` or `type: "ai"`
290
+ - badges, tags, pills, buttons, cards, dividers, blobs, glows, gradient backgrounds, abstract patterns, charts -> frames, shapes, strokes, gradient fills, and layout
291
+ - artwork that already exists in the document -> `Copy` it or instance it
292
+ - Budget: be mindful about the number of generated SVG per design. Turn it into a component and reuse it whenever needed. Never generate a variant per screen, section, or card.
293
+ - When you're unsure whether artwork is needed, build the design without it first. Adding one generated graphic afterwards is cheap; deleting several that weren't wanted is not.
294
+ - To display an SVG: first Insert a frame with the desired width and height (no other element type is allowed), then use Generate. The resulting path elements are scaled to fit the frame's bounding box and inserted as its children.
285
295
  - `nodeId`: The ID of the frame to insert the SVG into.
286
296
  - `type`: "svg".
287
- - `prompt`: a detailed descriptive prompt.
297
+ - `prompt`: a detailed descriptive prompt. The generator sees nothing of the document, so state the subject, composition, line/fill style, and colors explicitly. One generation per prompt - don't ask for a set of variants.
298
+
299
+ ```js
300
+ const pos = FindEmptySpace({width: 400, height: 400, padding: 80})
301
+ logoFrameId = Insert(document, {type: "frame", name: "Logo", x: pos.x, y: pos.y, width: 400, height: 400, placeholder: true})
302
+ Generate(logoFrameId, "svg", "A cute fox logo, minimalist vector style, colourful, simple, clean, modern flat design, suitable for a brand logo.")
303
+ ```
288
304
 
289
305
  ### FindEmptySpace
290
306
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pen.dev/cli",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "description": "CLI tool for running the pen.dev AI agent manipulating .pen design files",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -35,7 +35,7 @@
35
35
  "author": "High Agency, Inc.",
36
36
  "license": "UNLICENSED",
37
37
  "dependencies": {
38
- "@anthropic-ai/claude-agent-sdk": "^0.3.222",
38
+ "@anthropic-ai/claude-agent-sdk": "^0.3.257",
39
39
  "@inquirer/prompts": "^8.3.0",
40
40
  "@node-ipc/node-ipc": "^11.0.3",
41
41
  "@openai/codex-sdk": "^0.144.1",
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env node
2
- import{a as e}from"./diagnostics-B0j2bfEp.mjs";import{n as t,t as n}from"./models-BBd5zwn6.mjs";import{n as r}from"./json-parse-BzRcyI3e.mjs";import{t as i}from"./provider-env-CL5ShLlj.mjs";import{t as a}from"./headers-DlpC0ues.mjs";import{a as o,c as s,d as c,f as l,l as u,o as d,p as f,r as p,s as m,t as h,u as g}from"./transform-messages-1ulTEFY1.mjs";import{t as ee}from"./provider-retry-GaV_ioT7.mjs";import{t as _}from"./sanitize-unicode-D-15laVS.mjs";import{n as v,t as y}from"./github-copilot-headers-DCj7hJoC.mjs";import{n as b}from"./openai-CbFQ5q5I.mjs";import{n as x,t as S}from"./error-body-BBlqjbe7.mjs";import{t as C}from"./openai-prompt-cache-tVHrB8oW.mjs";import{t as w}from"./hash-DNYCELl4.mjs";function T(e,t){if(!e)return!1;let n=t.toLowerCase();for(let[t,r]of Object.entries(e))if(t.toLowerCase()===n&&r!==null&&r.trim().length>0)return!0;return!1}function E(e,t,n){if(t)return t;if(T(n,`authorization`)||T(n,`cf-aig-authorization`))return`unused`;throw Error(`No API key for provider: ${e}`)}function D(e){for(let t of e)if(t.role===`toolResult`||t.role===`assistant`&&t.content.some(e=>e.type===`toolCall`))return!0;return!1}function O(e){let t=new Set;for(let n of e)if(n.role===`toolResult`)for(let e of n.addedToolNames??[])t.add(e);return t}function k(e,t){if(!e)return[];let n=new Map(e.map(e=>[e.name,e]));return Array.from(t).map(e=>n.get(e)).filter(e=>e!==void 0)}function A(e){return e.type===`text`}function j(e){return e.type===`thinking`}function M(e){return e.type===`toolCall`}function N(e){return e.type===`image`}function P(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function te(e){return(e.id===void 0||e.id===null||typeof e.id==`string`)&&(e.format===void 0||typeof e.format==`string`)&&(e.index===void 0||typeof e.index==`number`)}function F(e){if(!P(e)||!te(e))return!1;switch(e.type){case`reasoning.summary`:return typeof e.summary==`string`;case`reasoning.encrypted`:return typeof e.data==`string`;case`reasoning.text`:return typeof e.text==`string`&&(e.signature===void 0||e.signature===null||typeof e.signature==`string`);default:return!1}}function I(e){if(e)try{let t=JSON.parse(e);return Array.isArray(t)&&t.length>0&&t.every(F)?t:void 0}catch{return}}function ne(e){if(e)try{let t=JSON.parse(e);return F(t)&&t.type===`reasoning.encrypted`&&typeof t.id==`string`&&t.id.length>0&&t.data.length>0?t:void 0}catch{return}}const re=[`reasoning`,`reasoning_content`,`reasoning_text`];function ie(e){return re.includes(e)}function L(e,t){return e||(i(`PI_CACHE_RETENTION`,t)===`long`?`long`:`short`)}const R=(t,n,i)=>{let o=new e;return(async()=>{let e={role:`assistant`,content:[],api:t.api,provider:t.provider,model:t.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`pending`,timestamp:Date.now()};try{let c=E(t.provider,i?.apiKey,i?.headers),l=$(t),u=s(n.tools,l.supportsOpenAIGrammarTools),d=L(i?.cacheRetention,i?.env),f=d===`none`?void 0:i?.sessionId,p=z(t,n,c,i?.headers,i?.fetch,f,l),h=B(t,n,i,l,d,u),g=await i?.onPayload?.(h,t);g!==void 0&&(h=g);let _={...i?.signal?{signal:i.signal}:{},...i?.timeoutMs===void 0?{}:{timeout:i.timeoutMs},maxRetries:0},{data:v,response:y}=await ee(()=>p.chat.completions.create(h,_).withResponse(),{maxRetries:i?.maxRetries,maxRetryDelayMs:i?.maxRetryDelayMs,signal:i?.signal});await i?.onResponse?.({status:y.status,headers:a(y.headers)},t),o.push({type:`start`,partial:e});let b=null,x=null,S=!1,C=new Map,w=new Map,T=e.content,D=e=>T.indexOf(e),O=e=>{let t=e.customInput?.property;if(t===void 0)return``;let n=e.arguments[t];return typeof n==`string`?n:``},k=(e,t,n)=>{let r=e.customInput;if(!r)return;let i=m(r.jsonBuffer,r.property,t,n);return e.arguments={[r.property]:t},i},A=t=>{let n=D(t);if(n!==-1){if(t.type===`text`)o.push({type:`text_end`,contentIndex:n,content:t.text,partial:e});else if(t.type===`thinking`)o.push({type:`thinking_end`,contentIndex:n,content:t.thinking,partial:e});else if(t.type===`toolCall`){if(t.customInput){let r=k(t,O(t),!0);r!==void 0&&o.push({type:`toolcall_delta`,contentIndex:n,delta:r,partial:e})}else t.arguments=r(t.partialArgs);delete t.partialArgs,delete t.customInput,delete t.streamIndex,o.push({type:`toolcall_end`,contentIndex:n,toolCall:t,partial:e})}}},j=()=>(b||(b={type:`text`,text:``},T.push(b),o.push({type:`text_start`,contentIndex:D(b),partial:e})),b),M=t=>(x||(x={type:`thinking`,thinking:``,thinkingSignature:t},T.push(x),o.push({type:`thinking_start`,contentIndex:D(x),partial:e})),x),N=t=>{let n=typeof t.index==`number`?t.index:void 0,r=t.function?.name??t.custom?.name??``,i=n===void 0?void 0:C.get(n);if(!i&&t.id&&(i=w.get(t.id)),!i){let a=t.custom&&!t.function?u.get(r)??`input`:void 0,s=a!==void 0;i={type:`toolCall`,id:t.id||``,name:r,arguments:s?{[a]:``}:{},partialArgs:s?void 0:``,customInput:s?{property:a,jsonBuffer:{input:``,started:!1,closed:!1}}:void 0,streamIndex:n},n!==void 0&&C.set(n,i),t.id&&w.set(t.id,i),T.push(i),o.push({type:`toolcall_start`,contentIndex:D(i),partial:e})}if(n!==void 0&&i.streamIndex===void 0&&(i.streamIndex=n,C.set(n,i)),t.id&&w.set(t.id,i),!i.name&&r&&(i.name=r),t.custom&&!t.function&&!i.customInput){let e=u.get(i.name)??`input`;i.arguments={[e]:``},i.customInput={property:e,jsonBuffer:{input:``,started:!1,closed:!1}},delete i.partialArgs}return i};for await(let n of v){if(!n||typeof n!=`object`)continue;e.responseId||=n.id,typeof n.model==`string`&&n.model.length>0&&n.model!==t.id&&(e.responseModel||=n.model),n.usage&&(e.usage=Z(n.usage,t));let i=Array.isArray(n.choices)?n.choices[0]:void 0;if(i){if(!n.usage&&i.usage&&(e.usage=Z(i.usage,t)),i.finish_reason){e.rawStopReason=i.finish_reason;let t=ue(i.finish_reason);e.stopReason=t.stopReason,t.errorMessage&&(e.errorMessage=t.errorMessage),S=!0}if(i.delta){if(i.delta.content!==null&&i.delta.content!==void 0&&i.delta.content.length>0){let t=j();t.text+=i.delta.content,o.push({type:`text_delta`,contentIndex:D(t),delta:i.delta.content,partial:e})}let n=[`reasoning_content`,`reasoning`,`reasoning_text`],a=i.delta,s=null;for(let e of n){let t=a[e];if(typeof t==`string`&&t.length>0){s=e;break}}if(s){let n=a[s];if(typeof n==`string`&&n.length>0){let r=M(t.provider===`opencode-go`&&s===`reasoning`?`reasoning_content`:s);r.thinking+=n,o.push({type:`thinking_delta`,contentIndex:D(r),delta:n,partial:e})}}if(i?.delta?.tool_calls)for(let t of i.delta.tool_calls){let n=N(t);!n.id&&t.id&&(n.id=t.id,w.set(t.id,n));let i=t.function?.name??t.custom?.name;!n.name&&i&&(n.name=i);let a=``;t.function?.arguments?(a=t.function.arguments,n.partialArgs=(n.partialArgs??``)+t.function.arguments,n.arguments=r(n.partialArgs)):t.custom?.input&&(a=k(n,O(n)+t.custom.input,!1)??``),o.push({type:`toolcall_delta`,contentIndex:D(n),delta:a,partial:e})}let c=i.delta.reasoning_details;if(Array.isArray(c))for(let e of c){if(!F(e))continue;let t=M(``),n=I(t.thinkingSignature)??[];n.push(e),t.thinkingSignature=JSON.stringify(n)}}}}for(let e of T)A(e);if(i?.signal?.aborted||e.stopReason===`aborted`)throw Error(`Request was aborted`);if(!S&&!l.supportsFinishReason&&(e.stopReason=e.content.some(e=>e.type===`toolCall`)?`toolUse`:`stop`),e.stopReason===`error`)throw Error(e.errorMessage||`Provider returned an error stop reason`);if(l.supportsFinishReason&&!S||e.stopReason===`pending`)throw Error(`Stream ended without finish_reason`);o.push({type:`done`,reason:e.stopReason,message:e}),o.end()}catch(t){for(let t of e.content)delete t.index,delete t.partialArgs,delete t.customInput,delete t.streamIndex;e.stopReason=i?.signal?.aborted?`aborted`:`error`,e.errorMessage=S(x(t));let n=t?.error?.metadata?.raw;n&&!e.errorMessage.includes(String(n))&&(e.errorMessage+=`\n${n}`),o.push({type:`error`,reason:e.stopReason,error:e}),o.end()}})(),o},ae=(e,n,r)=>{E(e.provider,r?.apiKey,r?.headers);let i={...p(e,n,r,r?.apiKey),toolChoice:r?.toolChoice},a=r?.reasoning?t(e,r.reasoning):void 0,o=a===`off`?void 0:a;return R(e,n,{...i,reasoningEffort:o,thinkingBudgets:r?.thinkingBudgets})};function z(e,t,n,r,i,a,o=$(e)){let s={"User-Agent":f(),...e.headers};if(e.provider===`github-copilot`){let e=v(t.messages),n=y({messages:t.messages,hasImages:e});Object.assign(s,n)}return a&&o.sendSessionAffinityHeaders&&(o.sessionAffinityFormat===`openrouter`?s[`x-session-id`]=a:(o.sessionAffinityFormat===`openai`&&(s.session_id=a),s[`x-client-request-id`]=a,s[`x-session-affinity`]=a)),r&&Object.assign(s,r),new b({apiKey:n,baseURL:e.baseUrl,dangerouslyAllowBrowser:!0,fetch:i,defaultHeaders:s})}function B(e,t,n,r=$(e),i=L(n?.cacheRetention,n?.env),a=s(t.tools,r.supportsOpenAIGrammarTools)){let o=Y(e,t,r,{grammarToolInputProperties:a}),c=G(r,i),l={model:e.id,messages:o,stream:!0,prompt_cache_key:e.baseUrl.includes(`api.openai.com`)&&i!==`none`||i===`long`&&r.supportsLongCacheRetention?C(n?.sessionId):void 0,prompt_cache_retention:i===`long`&&r.supportsLongCacheRetention?`24h`:void 0};r.supportsUsageInStreaming!==!1&&(l.stream_options={include_usage:!0}),r.supportsStore&&(l.store=!1),n?.maxTokens&&(r.maxTokensField===`max_tokens`?l.max_tokens=n.maxTokens:l.max_completion_tokens=n.maxTokens),n?.temperature!==void 0&&(l.temperature=n.temperature);let u=r.deferredToolsMode===`kimi`?O(t.messages):new Set,d=t.tools?.filter(e=>!u.has(e.name));d&&d.length>0?(l.tools=X(d,r),r.zaiToolStream&&(l.tool_stream=!0)):D(t.messages)&&(l.tools=[]),c&&K(o,l.tools,c),n?.toolChoice&&(l.tool_choice=n.toolChoice);let f=V(r),p=H(e,n,l);if(r.thinkingFormat===`zai`&&e.reasoning){let t=l;if(t.thinking=n?.reasoningEffort?{type:`enabled`,clear_thinking:!1}:{type:`disabled`},n?.reasoningEffort&&r.supportsReasoningEffort){let r=e.thinkingLevelMap?.[n.reasoningEffort],i=r===void 0?n.reasoningEffort:r;typeof i==`string`&&(t.reasoning_effort=i)}}else if(r.thinkingFormat===`qwen`&&e.reasoning){if(l.enable_thinking=!!n?.reasoningEffort,n?.reasoningEffort&&r.supportsReasoningEffort){let t=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort;typeof t==`string`&&(l.reasoning_effort=t)}}else if(r.thinkingFormat===`qwen-chat-template`&&e.reasoning)l.chat_template_kwargs={enable_thinking:!!n?.reasoningEffort,preserve_thinking:!0};else if(r.thinkingFormat===`chat-template`&&e.reasoning){let t=U(e,n,r.chatTemplateKwargs,p);t&&(l.chat_template_kwargs=t)}else if(r.thinkingFormat===`baseten`&&e.reasoning){let t=l,i=U(e,n,r.chatTemplateArgs,p);if(i&&(t.chat_template_args=i),r.supportsReasoningEffort){let r=n?.reasoningEffort,i=r?e.thinkingLevelMap?.[r]:e.thinkingLevelMap?.off,a=i===void 0?r:i;typeof a==`string`&&(t.reasoning_effort=a)}}else if(r.thinkingFormat===`deepseek`&&e.reasoning)n?.reasoningEffort?l.thinking={type:`enabled`}:e.thinkingLevelMap?.off!==null&&(l.thinking={type:`disabled`}),n?.reasoningEffort&&r.supportsReasoningEffort&&(l.reasoning_effort=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort);else if(r.thinkingFormat===`openrouter`&&e.reasoning){let t=l;n?.reasoningEffort?t.reasoning={effort:e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort}:e.thinkingLevelMap?.off!==null&&(t.reasoning={effort:e.thinkingLevelMap?.off??`none`})}else if(r.thinkingFormat===`ant-ling`&&e.reasoning&&n?.reasoningEffort){let t=e.thinkingLevelMap?.[n.reasoningEffort];typeof t==`string`&&(l.reasoning={effort:t})}else if(r.thinkingFormat===`together`&&e.reasoning){let t=l;t.reasoning={enabled:!!n?.reasoningEffort},n?.reasoningEffort&&r.supportsReasoningEffort&&(t.reasoning_effort=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort)}else if(r.thinkingFormat===`string-thinking`&&e.reasoning){let t=l;n?.reasoningEffort?t.thinking=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort:e.thinkingLevelMap?.off!==null&&(t.thinking=e.thinkingLevelMap?.off??`none`)}else if(n?.reasoningEffort&&e.reasoning&&r.supportsReasoningEffort)l.reasoning_effort=e.thinkingLevelMap?.[n.reasoningEffort]??n.reasoningEffort;else if(!n?.reasoningEffort&&e.reasoning&&r.supportsReasoningEffort){let t=e.thinkingLevelMap?.off;typeof t==`string`&&(l.reasoning_effort=t)}if(f&&p!==void 0&&Object.assign(l,{[f]:p}),e.compat?.openRouterRouting&&(l.provider=e.compat.openRouterRouting),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),l.providerOptions={gateway:e}}}return n?.samplingParams&&Object.assign(l,n.samplingParams),l}function V(e){if(e.thinkingTokenBudgetField)return e.thinkingTokenBudgetField;if(e.supportsThinkingTokenBudget)return`thinking_token_budget`}function H(e,t,n){if(!t?.reasoningEffort||!e.reasoning)return;let r=n.max_tokens??n.max_completion_tokens??e.maxTokens,i=o(d(t.reasoningEffort,t.thinkingBudgets),r);return i>0?i:void 0}function U(e,t,n,r){let i={};for(let[a,o]of Object.entries(n)){let n=W(e,t,o,r);n!==void 0&&(i[a]=n)}return Object.keys(i).length>0?i:void 0}function W(e,t,n,r){if(typeof n!=`object`||!n)return n;let i=t?.reasoningEffort;if(!i&&n.omitWhenOff)return;if(n.$var===`thinking.enabled`)return!!i;if(n.$var===`thinking.budget`)return r;let a=i?e.thinkingLevelMap?.[i]:e.thinkingLevelMap?.off;return a===void 0?i:typeof a==`string`?a:void 0}function G(e,t){if(e.cacheControlFormat!==`anthropic`||t===`none`)return;let n=t===`long`&&e.supportsLongCacheRetention?`1h`:void 0;return{type:`ephemeral`,...n?{ttl:n}:{}}}function K(e,t,n){q(e,n),se(t,n),oe(e,n)}function q(e,t){for(let n of e)if(n.role===`system`||n.role===`developer`){ce(n,t);return}}function oe(e,t){for(let n=e.length-1;n>=0;n--){let r=e[n];if((r.role===`user`||r.role===`assistant`||r.role===`tool`)&&le(r,t))return}}function se(e,t){if(!e||e.length===0)return;let n=e[e.length-1];n.cache_control=t}function ce(e,t){return J(e,t)}function le(e,t){return e.role===`user`||e.role===`assistant`||e.role===`tool`?J(e,t):!1}function J(e,t){let n=e.content;if(typeof n==`string`)return n.length===0?!1:(e.content=[{type:`text`,text:n,cache_control:t}],!0);if(!Array.isArray(n))return!1;for(let e=n.length-1;e>=0;e--){let r=n[e];if(r?.type===`text`){let e=r;return e.cache_control=t,!0}}return!1}function Y(e,t,n,r){let i=[],a=t=>{if(t.includes(`|`)){let e=t.indexOf(`|`),n=t.slice(0,e).replace(/[^a-zA-Z0-9_-]/g,`_`),r=t.slice(e+1).replace(/[^a-zA-Z0-9_-]/g,`_`),i=r.length>0?`${n}_${r}`:n;if(i.length<=40)return i;let a=w(t).slice(0,8);return`${n.slice(0,Math.max(1,40-a.length-1))}_${a}`}return e.provider===`openai`&&t.length>40?t.slice(0,40):t},o=h(t.messages,e,e=>a(e));if(t.systemPrompt){let r=e.reasoning&&n.supportsDeveloperRole?`developer`:`system`;i.push({role:r,content:_(t.systemPrompt)})}let s=null;for(let a=0;a<o.length;a++){let c=o[a];if(n.requiresAssistantAfterToolResult&&s===`toolResult`&&c.role===`user`&&i.push({role:`assistant`,content:`I have processed the tool results.`}),c.role===`user`)if(typeof c.content==`string`)i.push({role:`user`,content:_(c.content)});else{let e=c.content.map(e=>e.type===`text`?{type:`text`,text:_(e.text)}:{type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}});if(e.length===0)continue;i.push({role:`user`,content:e})}else if(c.role===`assistant`){let t={role:`assistant`,content:n.requiresAssistantAfterToolResult?``:null},a=c.content.filter(A).filter(e=>e.text.trim().length>0).map(e=>({type:`text`,text:_(e.text)})),o=a.map(e=>e.text).join(``),s=c.content.filter(j),l=c.content.filter(M),d=s.map(e=>I(e.thinkingSignature)).find(e=>e!==void 0),f=l.map(e=>ne(e.thoughtSignature)).filter(e=>e!==void 0),p=d??(f.length>0?f:void 0),m=s.filter(e=>e.thinking.trim().length>0);if(m.length>0){if(n.requiresThinkingAsText)t.content=[{type:`text`,text:m.map(e=>_(e.thinking)).join(`
3
-
4
- `)},...a];else if(o.length>0&&(t.content=o),!p){let n=m[0].thinkingSignature;e.provider===`opencode-go`&&n===`reasoning`&&(n=`reasoning_content`),n&&ie(n)&&(t[n]=m.map(e=>e.thinking).join(`
5
- `))}}else o.length>0&&(t.content=o);l.length>0&&(t.tool_calls=l.map(e=>{let t=r?.grammarToolInputProperties?.get(e.name);return t===void 0?{id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments)}}:{id:e.id,type:`custom`,custom:{name:e.name,input:_(u(e.name,e.arguments,t))}}})),p&&(t.reasoning_details=p),n.requiresReasoningContentOnAssistantMessages&&e.reasoning&&t.reasoning_content===void 0&&(t.reasoning_content=``);let h=t.content;if(!(h!=null&&h.length>0)&&!t.tool_calls)continue;i.push(t)}else if(c.role===`toolResult`){let r=[],c=new Set,l=a;for(;l<o.length&&o[l].role===`toolResult`;l++){let t=o[l],a=t.content.filter(A).map(e=>e.text).join(`
6
- `),s=t.content.some(e=>e.type===`image`),u={role:`tool`,content:_(a.length>0?a:s?`(see attached image)`:`(no tool output)`),tool_call_id:t.toolCallId};if(n.requiresToolResultName&&t.toolName&&(u.name=t.toolName),i.push(u),n.deferredToolsMode===`kimi`)for(let e of t.addedToolNames??[])c.add(e);if(s&&e.input.includes(`image`))for(let e of t.content)N(e)&&r.push({type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}})}if(a=l-1,r.length>0?(n.requiresAssistantAfterToolResult&&i.push({role:`assistant`,content:`I have processed the tool results.`}),i.push({role:`user`,content:[{type:`text`,text:`Attached image(s) from tool result:`},...r]}),s=`user`):s=`toolResult`,c.size>0){let e=k(t.tools,c);if(e.length>0){let t={role:`system`,tools:X(e,n)};i.push(t)}}continue}s=c.role}return i}function X(e,t){return e.map(e=>{let n=c(e,t.supportsOpenAIGrammarTools);if(n)return{type:`custom`,custom:{name:e.name,description:e.description,format:{type:`grammar`,grammar:{syntax:n.format,definition:n.definition}}}};let r=l(e,t.supportsStrictMode!==!1);return{type:`function`,function:{name:e.name,description:e.description,parameters:g(e,r),...t.supportsStrictMode!==!1&&{strict:r??!1}}}})}function Z(e,t){let r=e.prompt_tokens||0,i=e.prompt_tokens_details?.cached_tokens??e.prompt_cache_hit_tokens??e.cached_tokens??0,a=e.prompt_tokens_details?.cache_write_tokens||0,o=Math.max(0,r-i-a),s=e.completion_tokens||0,c={input:o,output:s,cacheRead:i,cacheWrite:a,reasoning:e.completion_tokens_details?.reasoning_tokens||0,totalTokens:o+s+i+a,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return n(t,c),c}function ue(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 Q(e){let t=e.provider,n=e.baseUrl,r=t===`zai`||t===`zai-coding-cn`||n.includes(`api.z.ai`)||n.includes(`open.bigmodel.cn`),i=t===`together`||n.includes(`api.together.ai`)||n.includes(`api.together.xyz`),a=t===`moonshotai`||t===`moonshotai-cn`||n.includes(`api.moonshot.`),o=t===`openrouter`||n.includes(`openrouter.ai`),s=t===`cloudflare-workers-ai`||n.includes(`api.cloudflare.com`),c=t===`cloudflare-ai-gateway`||n.includes(`gateway.ai.cloudflare.com`),l=t===`nvidia`||n.includes(`integrate.api.nvidia.com`),u=t===`ant-ling`||n.includes(`api.ant-ling.com`),d=t===`deepseek`||n.toLowerCase().includes(`deepseek.com`),f=l||t===`cerebras`||n.includes(`cerebras.ai`)||t===`xai`||n.includes(`api.x.ai`)||i||n.includes(`chutes.ai`)||d||r||a||t===`opencode`||n.includes(`opencode.ai`)||s||c||u,p=n.includes(`chutes.ai`)||d||a||c||i||l||u||r,m=t===`xai`||n.includes(`api.x.ai`),h=o&&(e.id.startsWith(`anthropic/`)||e.id.startsWith(`openai/`)),g=t===`openrouter`&&e.id.startsWith(`anthropic/`)?`anthropic`:void 0;return{supportsStore:!f,supportsDeveloperRole:h||!f&&!o,supportsReasoningEffort:!m&&!r&&!a&&!i&&!c&&!l&&!u,supportsUsageInStreaming:!0,supportsFinishReason:!0,maxTokensField:p?`max_tokens`:`max_completion_tokens`,requiresToolResultName:!1,requiresAssistantAfterToolResult:!1,requiresThinkingAsText:!1,requiresReasoningContentOnAssistantMessages:d,thinkingFormat:d?`deepseek`:r?`zai`:i?`together`:u?`ant-ling`:o?`openrouter`:`openai`,openRouterRouting:{},vercelGatewayRouting:{},chatTemplateKwargs:{},chatTemplateArgs:{},zaiToolStream:!1,supportsThinkingTokenBudget:!1,thinkingTokenBudgetField:void 0,supportsStrictMode:!a&&!i&&!c&&!l,supportsOpenAIGrammarTools:!1,cacheControlFormat:g,sendSessionAffinityHeaders:!1,deferredToolsMode:void 0,sessionAffinityFormat:o?`openrouter`:`openai`,supportsLongCacheRetention:!(i||s||c||l||u)}}function $(e){let t=Q(e);return e.compat?{supportsStore:e.compat.supportsStore??t.supportsStore,supportsDeveloperRole:e.compat.supportsDeveloperRole??t.supportsDeveloperRole,supportsReasoningEffort:e.compat.supportsReasoningEffort??t.supportsReasoningEffort,supportsUsageInStreaming:e.compat.supportsUsageInStreaming??t.supportsUsageInStreaming,supportsFinishReason:e.compat.supportsFinishReason??t.supportsFinishReason,maxTokensField:e.compat.maxTokensField??t.maxTokensField,requiresToolResultName:e.compat.requiresToolResultName??t.requiresToolResultName,requiresAssistantAfterToolResult:e.compat.requiresAssistantAfterToolResult??t.requiresAssistantAfterToolResult,requiresThinkingAsText:e.compat.requiresThinkingAsText??t.requiresThinkingAsText,requiresReasoningContentOnAssistantMessages:e.compat.requiresReasoningContentOnAssistantMessages??t.requiresReasoningContentOnAssistantMessages,thinkingFormat:e.compat.thinkingFormat??t.thinkingFormat,openRouterRouting:e.compat.openRouterRouting??{},vercelGatewayRouting:e.compat.vercelGatewayRouting??t.vercelGatewayRouting,chatTemplateKwargs:e.compat.chatTemplateKwargs??t.chatTemplateKwargs,chatTemplateArgs:e.compat.chatTemplateArgs??t.chatTemplateArgs,zaiToolStream:e.compat.zaiToolStream??t.zaiToolStream,supportsThinkingTokenBudget:e.compat.supportsThinkingTokenBudget??t.supportsThinkingTokenBudget,thinkingTokenBudgetField:e.compat.thinkingTokenBudgetField??t.thinkingTokenBudgetField,supportsStrictMode:e.compat.supportsStrictMode??t.supportsStrictMode,supportsOpenAIGrammarTools:e.compat.supportsOpenAIGrammarTools??t.supportsOpenAIGrammarTools,cacheControlFormat:e.compat.cacheControlFormat??t.cacheControlFormat,sendSessionAffinityHeaders:e.compat.sendSessionAffinityHeaders??t.sendSessionAffinityHeaders,deferredToolsMode:e.compat.deferredToolsMode??t.deferredToolsMode,sessionAffinityFormat:e.compat.sessionAffinityFormat??t.sessionAffinityFormat,supportsLongCacheRetention:e.compat.supportsLongCacheRetention??t.supportsLongCacheRetention}:t}export{Y as convertMessages,R as stream,ae as streamSimple};