vern-llm 2.6.2 → 2.7.0

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.
package/dist/index.mjs CHANGED
@@ -1,15 +1,15 @@
1
- const e=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),t=new Set([`rate_limit_queue_full`,`rate_limit_queue_timeout`,`rate_limit_capacity_exceeded`,`retry_budget_exhausted`]),n=new Set([`middleware_timeout`]),r=new Set([`parse`,`validation`,`invalid_params`,`aborted`]);function i(i,a){return!(r.has(i)||a&&e.has(a)||a&&t.has(a)||a&&n.has(a))}const a=new Set([`quota_exceeded`]);function o(e,t){return!(!i(e,t)||a.has(e))}function s(e){if(e!==void 0)try{return JSON.stringify(e),e}catch{return`[Unserializable: issues contained a circular reference]`}}function c(e){if(e!==void 0)try{return JSON.parse(JSON.stringify(e))}catch{return`[Unserializable: request body contained a circular reference]`}}const l=new Set([`authorization`,`x-api-key`,`x-goog-api-key`,`api-key`]);function u(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))l.has(n.toLowerCase())||(t[n]=r);return t}function d(e,t=0){if(e!==void 0)return t>=20?[]:e.map(e=>({...e,error:{...e.error,issues:s(e.error.issues),attempts:d(e.error.attempts,t+1)},request:e.request&&{...e.request,body:c(e.request.body),headers:u(e.request.headers)}}))}function f(e,t,n,r,i=Date.now()){return{provider:e,model:t,body:c(n),headers:u(r),startedAt:i}}var p=class extends Error{type;status;issues;cause;retryAfterMs;code;attempts;constructor(e,t,n={}){super(e),this.type=t,this.name=`LLMError`,this.status=n.status,this.issues=n.issues,this.cause=n.cause,this.retryAfterMs=n.retryAfterMs,this.code=n.code,this.attempts=n.attempts}get retryable(){return i(this.type,this.code)}get countsTowardBreaker(){return o(this.type,this.code)}toSnapshot(){return{message:this.message,type:this.type,status:this.status,issues:s(this.issues),retryAfterMs:this.retryAfterMs,code:this.code,retryable:this.retryable,attempts:d(this.attempts)}}toJSON(){return{name:this.name,message:this.message,type:this.type,status:this.status,issues:s(this.issues),retryAfterMs:this.retryAfterMs,code:this.code,retryable:this.retryable,attempts:d(this.attempts)}}};function m(e){return e instanceof p}function h(e,t){return e.code===t&&e.issues!==void 0}const g={onAccess(){},onInsert(){},getEvictee:e=>e.keys().next().value};function _(e,t){if(!e.has(t))return;let n=e.get(t);e.delete(t),e.set(t,n)}const v={onAccess:_,onInsert:_,getEvictee:e=>e.keys().next().value};function y(e){return e===`lru`?v:g}var b=class{maxSize;store=new Map;eviction;constructor(e=1e3,t=`fifo`){this.maxSize=e,this.eviction=y(t)}async get(e){let t=this.store.get(e);return t?Date.now()>=t.expiresAt?(this.store.delete(e),{hit:!1,value:null}):(this.eviction.onAccess(this.store,e),{hit:!0,value:t.value}):{hit:!1,value:null}}async set(e,t,n){this.cleanupExpiredEntries(),this.store.set(e,{value:t,expiresAt:Date.now()+n*1e3}),this.eviction.onInsert(this.store,e),this.enforceSizeLimit()}async delete(e){this.store.delete(e)}cleanupExpiredEntries(){let e=Date.now();for(let[t,n]of this.store)e>=n.expiresAt&&this.store.delete(t)}enforceSizeLimit(){for(;this.store.size>this.maxSize;){let e=this.eviction.getEvictee(this.store);if(e===void 0)break;this.store.delete(e)}}},x=class{inner;constructor(e=new b){this.inner=e}normalize(e){return e.toLowerCase().trim().replace(/[^\p{L}\p{N}\s]/gu,` `).replace(/\s+/g,` `).trim()}async resolveKey(e){return this.normalize(e)}async get(e){return this.inner.get(this.normalize(e))}async set(e,t,n){await this.inner.set(this.normalize(e),t,n)}async delete(e){await this.inner.delete?.(this.normalize(e))}},S=class{l1;l2;l1Ttl;constructor(e,t,n){this.l1=e,this.l2=t,this.l1Ttl=n}async resolveKey(e){return this.l1.resolveKey?this.l1.resolveKey(e):this.l2.resolveKey?this.l2.resolveKey(e):e}async get(e){let t=await this.l1.get(e);if(t.hit)return t;let n=await this.l2.get(e);return n.hit&&await this.l1.set(e,n.value,this.l1Ttl??60),n}async set(e,t,n){await Promise.all([this.l1.set(e,t,this.l1Ttl??n),this.l2.set(e,t,n)])}async delete(e){await Promise.all([this.l1.delete?.(e),this.l2.delete?.(e)])}};function C(e){return e}function ee(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.type===`tool_calls`&&Array.isArray(t.toolCalls)}function te(e){return typeof e==`object`&&!!e&&typeof e.then==`function`}function ne(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`}function re(e){if(typeof e!=`object`||!e)return!1;let t=e;return ne(t.chunks)&&te(t.finalResult)}const ie=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),ae=e=>e.type===`parse`||e.type===`validation`||e.type===`aborted`||e.type===`quota_exceeded`||e.code&&ie.has(e.code)?`stop`:`next`;var w=class extends p{attempts;constructor(e){let t=e[e.length-1]?.error;super(`${e.length} provider${e.length===1?``:`s`} attempted and failed: ${e.map(e=>`${e.provider}(${e.error.type})`).join(` then `)}`,`fallback_exhausted`,{status:t?.status,cause:t,retryAfterMs:t?.retryAfterMs,code:`fallback_exhausted`,attempts:e}),this.attempts=e}get retryable(){let e=this.attempts[this.attempts.length-1]?.error;return e?e.retryable:super.retryable}};function oe(e){return e instanceof w}function se(){return{}}function ce(e){return{debugName:e}}function T(){let e=new Map;return{get(t){return e.get(t)},set(t,n){e.set(t,n)}}}function le(e){let{onError:t,...n}=e;return t?{...n,wrap:async(e,n,r)=>{try{return await n()}catch(e){try{await t(e,r)}catch{}throw e}}}:n}function ue(e,t){let n=e.completion_tokens_details?.reasoning_tokens;return{promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,...n===void 0?{}:{reasoningTokens:n},requestId:t.requestId,model:t.model,provider:t.providerName,usedFallback:t.isFallback}}async function de(e,t,n){if(!e.reserveUsage)return!1;try{return await e.reserveUsage({coalesced:t,signal:n}),!0}catch(e){throw n?.aborted?new p(`LLM request aborted`,`aborted`):new p(e instanceof Error?e.message:`Usage reservation failed`,`quota_exceeded`,{cause:e})}}function fe(e,t,n,r){return async i=>{try{await e.refundUsage?.({coalesced:t,signal:n})}catch(e){r(i,e)}}}async function E(e,t,n,r,i){if(r?.aborted)throw new p(`LLM request aborted`,`aborted`);let a=await de(e,t,r),o=fe(e,t,r,i);if(r?.aborted)throw a&&await o(`[VernLLM] refundUsage failed after abort`),new p(`LLM request aborted`,`aborted`);let s;try{s=await n()}catch(e){throw a&&await o(`[VernLLM] refundUsage failed`),e}if(r?.aborted)throw a&&await o(`[VernLLM] refundUsage failed after abort`),new p(`LLM request aborted`,`aborted`);return s}async function pe(e,t,n,r){if(n?.aborted)throw new p(`LLM request aborted`,`aborted`);let i=await de(e,!1,n),a=fe(e,!1,n,r);if(n?.aborted)throw i&&await a(`[VernLLM] refundUsage failed after abort`),new p(`LLM request aborted`,`aborted`);let o;try{o=await t()}catch(e){throw i&&await a(`[VernLLM] refundUsage failed after stream-open failure`),e}let s=o.finalResult.then(e=>e,async e=>{throw i&&await a(`[VernLLM] refundUsage failed after stream error`),e});return s.catch(()=>{}),{chunks:o.chunks,finalResult:s}}function me(){let e=new Map;function t(t){return e.get(t)}function n(t,n){return e.set(t,n),n.catch(()=>{}).finally(()=>{e.get(t)===n&&e.delete(t)}),n}return{get:t,track:n}}function he(e){return typeof e==`string`?e:JSON.stringify(e)??``}function ge(e,t){let n=[];if(t){let t=e;t.type===`tool_calls`?(t.toolCalls.forEach((e,t)=>{n.push({type:`tool_call_delta`,index:t,id:e.id,name:e.name,argsDelta:JSON.stringify(e.arguments??{}),complete:!0})}),t.content&&n.push({type:`text-delta`,delta:t.content})):n.push({type:`text-delta`,delta:he(t.content)})}else n.push({type:`text-delta`,delta:he(e)});return{async*[Symbol.asyncIterator](){for(let e of n)yield e}}}function _e(e,t){return{async*[Symbol.asyncIterator](){yield*ge(await e,t)}}}var ve=class{cache;logger;inFlight=me();constructor(e,t){this.cache=e,this.logger=t}async resolveCacheKey(e){return this.cache.resolveKey?await this.cache.resolveKey(e):e}async deleteCache(e){if(this.cache.delete)try{await this.cache.delete(await this.resolveCacheKey(e))}catch(e){this.logger.warn(`[VernLLM] cache delete failed: ${e instanceof Error?e.message:`unknown`}`)}}logRefundError(e,t){this.logger.error(e,{message:t instanceof Error?t.message:`unknown`})}async getCached(e){try{return await this.cache.get(e)}catch(e){return this.logger.warn(`[VernLLM] cache read failed: ${e instanceof Error?e.message:`unknown`}`),{hit:!1}}}async resolveKeyAndReadCache(e){let t=await this.resolveCacheKey(e.cacheKey);return{resolvedParams:t===e.cacheKey?e:{...e,cacheKey:t},cached:await this.getCached(t)}}joinInFlight(e,t){return E(e,!0,()=>t,e.signal,(e,t)=>this.logRefundError(e,t))}async runCached(e){let{resolvedParams:t,cached:n}=await this.resolveKeyAndReadCache(e);if(n.hit)return n.value;let r=this.inFlight.get(t.cacheKey);return r?this.joinInFlight(t,r):this.registerTrigger(t)}registerTrigger(e){let t=E(e,!1,()=>this.runAndCache(e),e.signal,(e,t)=>this.logRefundError(e,t));return this.inFlight.track(e.cacheKey,t),t}async runAndCache(e){let t=await e.fn();try{await this.cache.set(e.cacheKey,t,e.ttl)}catch(e){this.logger.warn(`[VernLLM] cache write failed: ${e instanceof Error?e.message:`unknown`}`)}return t}async runCachedStream(e,t){let{resolvedParams:n,cached:r}=await this.resolveKeyAndReadCache(e);if(r.hit){let e=r.value;return{chunks:ge(e,t),finalResult:Promise.resolve(e)}}let i=this.inFlight.get(n.cacheKey);if(i){let e=this.joinInFlight(n,i);return e.catch(()=>{}),{chunks:_e(e,t),finalResult:e}}return this.registerStreamTrigger(n)}registerStreamTrigger(e){let t,n,r=new Promise((e,r)=>{t=e,n=r});this.inFlight.track(e.cacheKey,r);let i=pe(e,async()=>{let t=await e.openStream(),n=t.finalResult.then(async t=>{try{await this.cache.set(e.cacheKey,t,e.ttl)}catch(e){this.logger.warn(`[VernLLM] cache write failed: ${e instanceof Error?e.message:`unknown`}`)}return t},e=>{throw e});return{chunks:t.chunks,finalResult:n}},e.signal,(e,t)=>this.logRefundError(e,t));return i.then(e=>{e.finalResult.then(t,n)},e=>{n(e)}),i}};const ye=1e4;function be(e){return!e||e<=0||e===1/0?void 0:e}function xe(e){return Math.min(e,2147483647)}async function Se(e,t,n){let r=new AbortController,i=be(t),a=i===void 0?void 0:setTimeout(()=>{r.abort()},xe(i)),o=n?AbortSignal.any([n,r.signal]):r.signal;try{return await e(o)}catch(e){throw r.signal.aborted&&!n?.aborted&&e instanceof DOMException&&e.name===`AbortError`?new p(`Request timed out`,`timeout`,{code:`request_timeout`}):e}finally{clearTimeout(a)}}function Ce(e,t,n,r){let i=be(t);if(i===void 0)return e();let a=!1;return new Promise((t,o)=>{let s=setTimeout(()=>{a=!0,n?.(),o(new p(`No stream chunk received for ${i}ms (idle timeout)`,`timeout`,{code:`idle_timeout`}))},xe(i));e().then(e=>{if(clearTimeout(s),a){r?.debug(`[VernLLM] chunk resolved after idle timeout already fired; discarding`);return}a=!0,t(e)},e=>{if(clearTimeout(s),a){r?.debug(`[VernLLM] chunk rejection arrived after idle timeout already fired; discarding`);return}a=!0,o(e)})})}const we=[{name:`Retry-After-Ms`,kind:`ms`},{name:`X-Retry-After-Ms`,kind:`ms`},{name:`Retry-After`,kind:`seconds`},{name:`Retry-After`,kind:`date`}];function Te(e,t){let n=e;if(typeof n.get==`function`)return n.get(t)??void 0;let r=Object.entries(e).find(([e])=>e.toLowerCase()===t.toLowerCase())?.[1];return typeof r==`string`?r:void 0}function D(e,t){return e<0?void 0:Math.min(e,t)}function Ee(e,t=ye){if(!e||typeof e!=`object`)return;let n=e,r=n.headers??n.response?.headers;if(!(!r||typeof r!=`object`))for(let{name:e,kind:n}of we){let i=Te(r,e)?.trim();if(i){if(n===`ms`&&/^\d+$/.test(i))return D(Number(i),t);if(n===`seconds`&&/^\d+(\.\d+)?$/.test(i))return D(Number(i)*1e3,t);if(n===`date`){let e=Date.parse(i);if(!Number.isNaN(e))return D(e-Date.now(),t)}}}}function De(e){return Math.random()*e}function Oe(e,t,n=ye,r=!1,i=!1){return De(Math.min(e*(r?2:i?1.5:1)*2**t,n))}async function ke(e,t){if(t?.aborted)throw new p(`Operation aborted`,`aborted`);await new Promise((n,r)=>{let i=()=>{clearTimeout(a),r(new p(`Operation aborted`,`aborted`))},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}function Ae(e,t,n,r){if(r?.aborted||e instanceof p&&!e.retryable)return!1;let i=n(e);return!(i!==void 0&&t.includes(i))}async function je(e){let{requestId:t,model:n,attempt:r,error:i,state:a,signal:o,providerName:s,maxRetries:c,baseDelayMs:l,middleware:u,middlewareTimeoutMs:d,logger:f,reportEvent:p,buildEventContext:m,extractStatus:h,normalizeError:g,emitEvent:_}=e,v=Ee(i),y=h(i),b=v??Oe(l,r,void 0,y===429,y!==void 0&&y>=500&&y<=599),x=v!==void 0;f.warn(`[VernLLM:${t}] recovery attempt ${r}/${c}, waiting ${Math.ceil(b)}ms`+(x?` (honoring Retry-After)`:``)),_({kind:`retry`,requestId:t,provider:s,model:n,attempt:r,maxRetries:c,delayMs:b,retryAfterHonored:x,error:g(i,o)},m(t,n,r,o,a),p,u,d,f),await ke(b,o)}async function Me(e){let{fn:t,maxRetries:n,signal:r,onAttempt:i,attempts:a,shouldRetryAttempt:o,recoverDelayForAttempt:s,normalizeError:c}=e,l,u;for(let e=0;e<=n;e++){u=void 0;try{return e>0&&await s(e,l),i?.(),await t(e,e=>{u=e})}catch(t){if(l=t,!(e<n&&o(t,r)))break;a?.push({index:e,error:c(t,r).toSnapshot(),request:u})}}throw l}var O=class{buckets;bucketStartMs=Date.now();bucketWidthMs;constructor(e){if(!Number.isFinite(e)||e<=0)throw RangeError(`RollingRatio: windowMs must be a finite number > 0, got ${e}`);this.bucketWidthMs=e/10,this.buckets=Array.from({length:10},()=>({total:0,failures:0}))}rotate(){let e=Date.now()-this.bucketStartMs,t=Math.floor(e/this.bucketWidthMs),n=Math.min(10,t);for(let e=0;e<n;e++)this.buckets.shift(),this.buckets.push({total:0,failures:0});t>0&&(this.bucketStartMs+=t*this.bucketWidthMs)}record(e){this.rotate();let t=this.buckets[9];t.total+=1,e&&(t.failures+=1)}getRatio(){this.rotate();let e=this.buckets.reduce((e,t)=>e+t.total,0),t=this.buckets.reduce((e,t)=>e+t.failures,0);return e===0?0:t/e}getCount(){return this.rotate(),this.buckets.reduce((e,t)=>e+t.total,0)}reset(){this.buckets=Array.from({length:10},()=>({total:0,failures:0})),this.bucketStartMs=Date.now()}};function Ne(e,t=`minCalls`){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer, got ${e}`)}function Pe(e,t){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`${t} must be a finite number between 0 and 1, got ${e}`)}function Fe(e){if(e===void 0)return;if(typeof e==`function`)return e;let{multiplier:t,maxMs:n=1/0}=e;return(e,r)=>De(Math.min(r*t**e,n))}var Ie=class{threshold;failuresByKey=new Map;constructor(e){this.threshold=e}onSuccess(e){this.failuresByKey.set(e,0)}onFailure(e){let t=(this.failuresByKey.get(e)??0)+1;return this.failuresByKey.set(e,t),t>=this.threshold}reset(e){this.failuresByKey.set(e,0)}forget(e){this.failuresByKey.delete(e)}},Le=class{windowMs;minCalls;failureRatio;ratiosByKey=new Map;constructor(e,t,n){this.windowMs=e,this.minCalls=t,this.failureRatio=n,new O(e),Ne(t),Pe(n,`failureRatio`)}ratioFor(e){let t=this.ratiosByKey.get(e);return t||(t=new O(this.windowMs),this.ratiosByKey.set(e,t)),t}onSuccess(e){this.ratioFor(e).record(!1)}onFailure(e){let t=this.ratioFor(e);return t.record(!0),t.getCount()>=this.minCalls&&t.getRatio()>=this.failureRatio}reset(e){this.ratiosByKey.delete(e)}forget(e){this.ratiosByKey.delete(e)}};function Re(e){return`onFailure`in e?e:e.kind===`consecutive`?new Ie(e.threshold):new Le(e.windowMs,e.minCalls,e.failureRatio)}function ze(){return{state:`closed`,consecutiveFailures:0,openedAt:0,trial:null,reopenCount:0,failuresByReason:new Map,cooldownMsForOpen:0}}function k(e){return e??``}const A=new WeakMap;function Be(e,t){return!t||A.get(t.state)===e.trial}function Ve(e,t){let n=t??`unknown`;e.failuresByReason.set(n,(e.failuresByReason.get(n)??0)+1)}var He=class{cooldownMs;onStateChange;isolateByModel;halfOpenProbes;halfOpenSuccessRatio;cooldownBackoff;tripping;sharedBucket=ze();bucketsByModel=new Map;constructor(e={}){let t=e.threshold??5;this.cooldownMs=e.cooldownMs??3e4,this.onStateChange=e.onStateChange,this.isolateByModel=e.isolateByModel??!1;let n=e.halfOpenProbes;this.halfOpenProbes=Number.isFinite(n)?Math.max(1,Math.floor(n)):1;let r=e.halfOpenSuccessRatio;this.halfOpenSuccessRatio=Number.isFinite(r)?Math.min(1,Math.max(0,r)):1,this.cooldownBackoff=Fe(e.cooldownBackoff),this.tripping=Re(e.tripping??{kind:`consecutive`,threshold:t})}assertClosed(e,t){let n=this.ensureBucketFor(e);if(n.state!==`closed`){if(n.state===`open`){let r=Date.now()-n.openedAt,i=n.cooldownMsForOpen;if(r<i)throw new p(`Circuit open, provider has failed ${n.consecutiveFailures} times in a row. Retry in ${Math.ceil((i-r)/1e3)}s.`,`circuit_open`,{code:`circuit_cooling_down`});n.trial={slotsRemaining:this.halfOpenProbes-1,successes:0,failures:0},t&&A.set(t.state,n.trial),this.transition(n,`half-open`,e,t);return}if(!n.trial||n.trial.slotsRemaining<=0)throw new p(`Circuit half-open. Every trial slot is already in flight. Try again shortly.`,`circuit_open`,{code:`circuit_trial_in_flight`});--n.trial.slotsRemaining,t&&A.set(t.state,n.trial)}}recordSuccess(e,t){let n=this.lookupBucket(e);if(n){if(n.state===`half-open`&&n.trial&&Be(n,t)){n.trial.successes+=1,this.settleTrialIfComplete(n,e,t);return}n.state!==`half-open`&&(n.consecutiveFailures=0,this.tripping.onSuccess(this.trippingKeyFor(e)),n.trial=null,n.reopenCount=0,n.failuresByReason.clear(),this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.forgetModel(e))}}recordFailure(e,t,n){let r=this.ensureBucketFor(e);if(r.state===`half-open`&&r.trial&&Be(r,t)){r.trial.failures+=1,Ve(r,n),this.settleTrialIfComplete(r,e,t);return}r.state!==`half-open`&&(r.consecutiveFailures+=1,Ve(r,n),this.tripping.onFailure(this.trippingKeyFor(e))&&this.openBucket(r,e,t))}getState(e){return this.lookupBucket(e)?.state??`closed`}getFailureBreakdown(e){let t=this.lookupBucket(e);return t?Object.fromEntries(t.failuresByReason):{}}open(e,t){let n=this.ensureBucketFor(e);n.trial=null,this.openBucket(n,e,t)}close(e,t){let n=this.ensureBucketFor(e);n.consecutiveFailures=0,this.tripping.reset(this.trippingKeyFor(e)),n.trial=null,n.reopenCount=0,n.failuresByReason.clear(),this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.forgetModel(e)}openBucket(e,t,n){e.openedAt=Date.now(),e.cooldownMsForOpen=this.computeCooldown(e),this.transition(e,`open`,t,n)}computeCooldown(e){if(!this.cooldownBackoff)return this.cooldownMs;let t=this.cooldownBackoff(e.reopenCount,this.cooldownMs);return Number.isNaN(t)?0:Math.max(0,t)}lookupBucket(e){return this.isolateByModel?this.bucketsByModel.get(k(e)):this.sharedBucket}trippingKeyFor(e){return this.isolateByModel?k(e):``}ensureBucketFor(e){if(!this.isolateByModel)return this.sharedBucket;let t=k(e),n=this.bucketsByModel.get(t);return n||(n=ze(),this.bucketsByModel.set(t,n)),n}forgetModel(e){this.bucketsByModel.delete(k(e)),this.tripping.forget?.(this.trippingKeyFor(e))}transition(e,t,n,r){if(t===e.state)return;let i=e.state;e.state=t,this.onStateChange?.(i,t,e.consecutiveFailures,n,r)}settleTrialIfComplete(e,t,n){let r=e.trial;if(!r||r.successes+r.failures<this.halfOpenProbes)return;let i=r.successes/this.halfOpenProbes;if(e.trial=null,i>=this.halfOpenSuccessRatio){e.consecutiveFailures=0,this.tripping.onSuccess(this.trippingKeyFor(t)),e.reopenCount=0,e.failuresByReason.clear(),this.transition(e,`closed`,t,n),this.isolateByModel&&e.state===`closed`&&this.forgetModel(t);return}e.reopenCount+=1,this.openBucket(e,t,n)}},Ue=class{options;ratio;constructor(e){this.options=e,this.ratio=new O(e.windowMs),Ne(e.minCalls),Pe(e.retryRatio,`retryRatio`)}assertAvailable(){if(this.ratio.getCount()>=this.options.minCalls&&this.ratio.getRatio()>=this.options.retryRatio)throw new p(`Retry budget exhausted`,`rate_limited`,{code:`retry_budget_exhausted`})}recordAttempt(e){this.ratio.record(e)}getSnapshot(){return{attempts:this.ratio.getCount(),retryRatio:this.ratio.getRatio()}}};function j(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.status==`number`)return t.status;if(typeof t.statusCode==`number`)return t.statusCode;if(typeof t.$metadata?.httpStatusCode==`number`)return t.$metadata.httpStatusCode}const We=new Set([`ECONNREFUSED`,`ENOTFOUND`,`ECONNRESET`,`ETIMEDOUT`,`EAI_AGAIN`,`EPIPE`,`ECONNABORTED`,`EHOSTUNREACH`,`ENETUNREACH`]),Ge=new Set([`fetch failed`,`failed to fetch`,`load failed`,`networkerror when attempting to fetch resource.`]);function Ke(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.code==`string`&&We.has(t.code)||typeof t.message==`string`&&Ge.has(t.message.toLowerCase()))return!0;if(t.cause&&typeof t.cause==`object`){let e=t.cause;if(typeof e.code==`string`&&We.has(e.code))return!0}return!1}function qe(e){try{return JSON.stringify(e,null,2)??String(e)}catch{try{return String(e)}catch{return`[unprintable error]`}}}function Je(e){if(e&&typeof e==`object`)try{let t=e;if(t.error!==void 0)return qe(t.error);if(typeof t.message==`string`)return t.message}catch{}return qe(e)}function Ye(e){switch(e){case 429:return`provider_rate_limited`;case 401:return`authentication`;case 403:return`authorization`;case 404:return`not_found`;case 413:return`payload_too_large`;default:return e>=500?`server_error`:void 0}}const Xe=/\(no body\)/i;function Ze(e){return Object.keys(e).length===0}function Qe(e){if(e&&typeof e==`object`){let{error:t,message:n}=e;if(t!=null){let e=typeof t==`string`&&t.trim().length===0,n=typeof t==`object`&&Ze(t);if(!e&&!n)return!1}if(typeof n==`string`){let e=n.trim();return e.length===0||Xe.test(e)}return!0}return!0}function M(e,t,n){if(t?.aborted)return new p(`LLM request aborted`,`aborted`,{attempts:n});if(e instanceof p)return e.code===void 0&&e.status!==void 0&&(e.code=Ye(e.status)),e.attempts===void 0&&n!==void 0&&(e.attempts=n),e;let r=j(e),i=Ee(e);if(r!==void 0){let t=Je(e),a=Ye(r),o=a===void 0;return new p(Qe(e)?o?`LLM request failed with status ${r} and no error detail from the provider. This usually means a field or value in the request isn't supported by the specific model (for example, a reasoning/thinking parameter the model doesn't accept), rather than a transport or auth problem.`:`LLM request failed with status ${r} and no error detail from the provider.`:`LLM request failed: ${t}`,`api`,{status:r,cause:e,retryAfterMs:i,code:a,attempts:n})}return Ke(e)?new p(`LLM request failed`,`network`,{cause:e,retryAfterMs:i,code:`connection_failed`,attempts:n}):new p(`LLM request failed`,`unknown`,{cause:e,retryAfterMs:i,attempts:n})}function N(e,t){return e.name??`[${t}]`}function $e(e,t,n){return t<=0?e():new Promise((r,i)=>{let a=setTimeout(()=>{i(new p(`middleware "${n}" timed out after ${t}ms`,`timeout`,{code:`middleware_timeout`}))},t);e().then(e=>{clearTimeout(a),r(e)},e=>{clearTimeout(a),i(e)})})}async function P(e,t,n,r,i){let{enabled:a}=e;if(a===void 0)return!0;if(typeof a==`boolean`)return a;let o=e.timeoutMs??r;try{return await $e(async()=>a(t),o,n)}catch(e){return i.error(`[VernLLM] middleware "${n}".enabled threw or timed out, treating as disabled`,{message:e instanceof Error?e.message:`unknown`}),!1}}const et=[`temperature`,`max_tokens`,`reasoning_effort`,`budget_tokens`,`tool_choice`,`messages`,`addMessages`,`tools`,`addTools`];function tt(e,t){let n=t,r=et.filter(e=>t[e]!==void 0);if(n.model!==void 0&&r.push(`model`),n.response_format!==void 0&&r.push(`response_format`),r.length===0)return{request:e,patchedFields:[]};let i={...e};return n.model!==void 0&&(i.model=n.model),n.response_format!==void 0&&(i.response_format=n.response_format),t.temperature!==void 0&&(i.temperature=t.temperature),t.max_tokens!==void 0&&(i.max_tokens=t.max_tokens),t.reasoning_effort!==void 0&&(i.reasoning_effort=t.reasoning_effort),t.budget_tokens!==void 0&&(i.budget_tokens=t.budget_tokens),t.tool_choice!==void 0&&(i.tool_choice=t.tool_choice),t.messages!==void 0&&(i.messages=t.messages),t.addMessages!==void 0&&t.addMessages.length>0&&(i.messages=[...i.messages,...t.addMessages]),t.tools!==void 0&&(i.tools=t.tools),t.addTools!==void 0&&t.addTools.length>0&&(i.tools=[...i.tools??[],...t.addTools]),{request:i,patchedFields:r}}function nt(e,t){if(!e.tools)return;let n=new Set,r=new Set;for(let t of e.tools)n.has(t.function.name)&&r.add(t.function.name),n.add(t.function.name);if(r.size>0)throw new p(`middleware "${t}" added tool(s) with duplicate name(s): [${[...r].join(`, `)}]. Tool names must be unique.`,`invalid_params`,{code:`duplicate_tool_names`,issues:{names:[...r]}})}function rt(e,t,n){if(t.model!==e.model)throw new p(`middleware "${n}" changed \`model\` via transform, which isn't supported. Configure the target's model instead.`,`invalid_params`);if(JSON.stringify(t.response_format)!==JSON.stringify(e.response_format))throw new p(`middleware "${n}" changed \`response_format\` via transform, which isn't supported.`,`invalid_params`)}async function it(e){let{request:t,requestId:n,attempt:r,signal:i,state:a,middleware:o,middlewareTimeoutMs:s,logger:c,reportEvent:l,buildContext:u}=e;if(o.length===0)return t;let d=t,f=t,p=o.map((e,t)=>({middlewareEntry:e,index:t})).sort((e,t)=>(e.middlewareEntry.priority??0)-(t.middlewareEntry.priority??0));for(let{middlewareEntry:e,index:t}of p){let d=N(e,t),p=u(r,i,a);if(!await P(e,p,d,s,c)){e.enabled!==void 0&&F({kind:`middleware`,requestId:n,middleware:d,hook:`enabled_skip`},p,l,o,s,c);continue}if(!e.transform)continue;let m=await at(e,structuredClone(f),p,d,s),{request:h,patchedFields:g}=tt(f,m);g.length>0&&((m.tools!==void 0||m.addTools?.length)&&nt(h,d),F({kind:`middleware`,requestId:n,middleware:d,hook:`transform`,patchedFields:g},p,l,o,s,c)),f=h}return rt(d,f,`chain`),f}async function at(e,t,n,r,i){if(!e.transform)return{};let a=e.timeoutMs??i;try{return await $e(async()=>e.transform(t,n),a,r)}catch(e){throw ot(e,r,n.signal)}}function ot(e,t,n){let r=M(e,n);return r.type===`unknown`?new p(`middleware "${t}" threw: ${r.message}`,`invalid_params`,{code:`middleware_threw`,cause:e}):r}function F(e,t,n,r,i,a){n(e),r.length!==0&&st(r,e,t,i,a)}async function st(e,t,n,r,i){for(let a=0;a<e.length;a++){let o=e[a];if(!o.onEvent)continue;let s=N(o,a);if(await P(o,n,s,r,i))try{Promise.resolve(o.onEvent(t,{...n,own:{}})).catch(e=>{i.error(`[VernLLM] middleware "${s}".onEvent failed`,{message:e instanceof Error?e.message:`unknown`})})}catch(e){i.error(`[VernLLM] middleware "${s}".onEvent failed`,{message:e instanceof Error?e.message:`unknown`})}}}function I(e,t){return n=>{if(e)try{e(n)}catch(e){t.error(`[VernLLM] onEvent failed`,{message:e instanceof Error?e.message:`unknown`})}}}function L(e,t,n){let r=e[t];if(!r)throw RangeError(`${n}: no target at index ${t} (chain has ${e.length} target${e.length===1?``:`s`})`);return r}function R(e,t,n,r){t!==void 0&&!e&&r.warn(`[VernLLM] ${n}: \`model: '${t}'\` has no effect here. This target's circuitBreaker doesn't have isolateByModel on, so it only tracks one shared circuit regardless of \`model\`. Omit \`model\`, or set \`circuitBreaker.isolateByModel: true\` on this target if per-model tracking is what you want.`)}function ct(e,t,n,r,i,a,o,s,c){if(!e)return;let l=typeof e==`object`?e:void 0,u=l?.onStateChange,d=I(r,i);return new He({...l,onStateChange:(e,r,l,f,p)=>{let m={kind:`circuit_state`,provider:t,model:f??n,from:e,to:r,consecutiveFailures:l};if(p?F(m,{stage:`attempt`,requestId:p.requestId,requestedProvider:t,requestedModel:f??n,isFallbackAttempt:s,attempt:p.attempt??1,capabilities:{supportsJsonObjectMode:c},signal:p.signal,state:p.state,own:{}},d,a,o,i):d(m),u)try{u(e,r,l,f,p)}catch(e){i.error(`[VernLLM] circuitBreaker.onStateChange failed`,{message:e instanceof Error?e.message:`unknown`})}}})}function lt(e){let t=/^(?:(\d+(?:\.\d+)?)h)?(?:(\d+(?:\.\d+)?)m)?(?:(\d+(?:\.\d+)?)s)?(?:(\d+)ms)?$/.exec(e.trim());if(!t||t[0]===``)return;let[,n,r,i,a]=t,o=(n?parseFloat(n)*36e5:0)+(r?parseFloat(r)*6e4:0)+(i?parseFloat(i)*1e3:0)+(a?parseInt(a,10):0);return Number.isFinite(o)?o:void 0}function z(e,t){let n=e.get(t);if(n===null)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function B(e){let t=e.get(`x-ratelimit-reset-requests`);return{limitRequests:z(e,`x-ratelimit-limit-requests`),remainingRequests:z(e,`x-ratelimit-remaining-requests`),resetAfterMs:t===null?void 0:lt(t)}}function ut(e){let t=e.get(`anthropic-ratelimit-requests-reset`),n=t===null?NaN:Date.parse(t);return{limitRequests:z(e,`anthropic-ratelimit-requests-limit`),remainingRequests:z(e,`anthropic-ratelimit-requests-remaining`),resetAfterMs:Number.isFinite(n)?Math.max(0,n-Date.now()):void 0}}const dt=Symbol(`vernLLMProviderRateLimitHint`);function ft(e,t){t&&Object.defineProperty(e,dt,{value:t,enumerable:!1,configurable:!0})}function pt(e){if(!(!e||typeof e!=`object`))return e[dt]}function mt(e){let{breaker:t,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o}=e;function s(e,t,s){return{stage:`attempt`,requestId:n,requestedProvider:i,requestedModel:r,isFallbackAttempt:a,attempt:e+1,capabilities:{supportsJsonObjectMode:o},signal:t,state:s,own:{}}}function c(e,t,r){return{requestId:n,state:r,signal:t,attempt:e+1}}return{buildAttemptContext:s,buildCallContext:c,recordSuccess(e,n,i){t?.recordSuccess(r,c(e,n,i))},recordFailure(e,n,i,a){t?.recordFailure(r,c(e,n,i),a)}}}function ht(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function gt(e){return e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments??{})}}))}function _t(e){return e.map(e=>{let t;try{t=e.function.arguments.trim()?JSON.parse(e.function.arguments):{}}catch{throw new p(`Invalid JSON arguments for tool call "${e.function.name}"`,`parse`,{code:`tool_arguments_parse_failed`})}return{id:e.id,name:e.function.name,arguments:t}})}function vt(e){return typeof e==`string`?e:JSON.stringify(e)}function yt(e,t){if(e&&e.length===0)throw new p("`tools` was an empty array. This is almost always a bug (e.g. a filtered tool list that ended up empty). An empty `tools` array still switches on tool-call mode (response shape, jsonMode default, wire format) with nothing for the model to call. Omit `tools` entirely for a normal call, or make sure the array is non-empty.",`invalid_params`);if(e){let t=new Set,n=new Set;for(let r of e)t.has(r.name)&&n.add(r.name),t.add(r.name);if(n.size)throw new p(`\`tools\` has duplicate name(s): [${[...n].join(`, `)}]. Tool names must be unique.`,`invalid_params`,{code:`duplicate_tool_names`,issues:{names:[...n]}})}if(t&&!e)throw new p("`toolChoice` was set without `tools`. There is nothing for it to choose between. Set `tools`, or remove `toolChoice`.",`invalid_params`);if(e&&typeof t==`object`&&!e.some(e=>e.name===t.name))throw new p(`toolChoice names "${t.name}", which is not in \`tools\` ([${e.map(e=>e.name).join(`, `)}]).`,`invalid_params`,{code:`unknown_tool_choice`,issues:{requested:t.name,available:e.map(e=>e.name)}})}function bt(e){let{jsonModeExplicit:t,hasTools:n,jsonSchema:r,hasSchema:i,supportsJsonObjectMode:a}=e,o=t??!n;if(!a&&!r&&t===!0)throw new p('jsonMode: true was set explicitly, but this client does not support `response_format: "json_object"` (see LLMClient.supportsJsonObjectMode). Neither Anthropic nor Bedrock has a field that mechanically guarantees JSON output for this mode. Use `jsonSchema` instead, which maps to a real constraint on both.',`invalid_params`);if(!a&&!r&&t===void 0&&i)throw new p('`schema` was provided, which requires JSON output to validate against, but this client does not support `response_format: "json_object"` (see LLMClient.supportsJsonObjectMode) and no `jsonSchema` was set. Neither Anthropic nor Bedrock has a field that mechanically guarantees JSON output without one. Use `jsonSchema` instead, which maps to a real constraint on both and still runs `schema` against its parsed result.',`invalid_params`);let s=(!a&&!r&&t===void 0?!1:o)||!!r;if(i&&!s)throw new p(`schema was provided but jsonMode: false disables JSON parsing, so nothing would validate it. Remove jsonMode: false, set jsonSchema, or remove schema.`,`invalid_params`);return s}function xt(e,t){return e?{type:`json_schema`,json_schema:{name:e.name,schema:e.schema,strict:e.strict??!0,description:e.description}}:t?{type:`json_object`}:void 0}function St(e){return!e||e===`auto`?`auto`:e===`none`||e===`required`?e:{type:`function`,function:{name:e.name}}}function Ct(e){return e.role===`tool`?(e.toolResults??[]).map(e=>({role:`tool`,tool_call_id:e.toolCallId,content:typeof e.content==`string`?e.content:JSON.stringify(e.content??null),...e.isError?{is_error:!0}:{}})):e.role===`assistant`&&e.toolCalls?.length?[{role:`assistant`,...e.content===void 0?{}:{content:vt(e.content)},tool_calls:gt(e.toolCalls)}]:e.role===`assistant`?[{role:`assistant`,content:vt(e.content===void 0?``:e.content)}]:[{role:e.role,content:e.content??``}]}function wt(e){let t;for(let[n,r]of e.entries()){if(r.role===`tool`){if(t?.role!==`assistant`||!t.toolCalls?.length)throw new p(`history[${n}] is a "tool" turn, but must immediately follow an "assistant" turn that requested tools`,`invalid_params`);if(!r.toolResults?.length)throw new p(`history[${n}] is a "tool" turn but has no toolResults`,`invalid_params`);let e=new Set(t.toolCalls.map(e=>e.id)),i=r.toolResults.map(e=>e.toolCallId),a=i.filter(t=>!e.has(t));if(a.length)throw new p(`history[${n}].toolResults references unknown toolCallId(s) [${a.join(`, `)}]`,`invalid_params`,{code:`unknown_tool_result_ids`,issues:{historyIndex:n,ids:a}});let o=new Set,s=new Set;for(let e of i)o.has(e)&&s.add(e),o.add(e);if(s.size)throw new p(`history[${n}].toolResults has duplicate toolCallId(s) [${[...s].join(`, `)}]`,`invalid_params`,{code:`duplicate_tool_result_ids`,issues:{historyIndex:n,ids:[...s]}});let c=[...e].filter(e=>!i.includes(e));if(c.length)throw new p(`history[${n}] is missing toolResults for toolCallId(s) [${c.join(`, `)}]`,`invalid_params`,{code:`missing_tool_results`,issues:{historyIndex:n,ids:c}})}else{if(r.role===t?.role)throw new p(`history must alternate user/assistant turns: consecutive "${r.role}" turns at history[${n-1}] and history[${n}]`,`invalid_params`);if(t?.role===`assistant`&&t.toolCalls?.length)throw new p(`history[${n}] follows an assistant tool request without tool results`,`invalid_params`)}t=r}if(t?.role===`assistant`&&t.toolCalls?.length)throw new p(`The last entry in history is an assistant tool request without tool results`,`invalid_params`);if(t?.role===`user`)throw new p(`The last entry in history is a "user" turn, which would collide with the current userContent turn.`,`invalid_params`)}var Tt=class{model;defaultMaxTokens;defaultTemperature;defaultReasoningEffort;defaultBudgetTokens;supportsJsonObjectMode;constructor(e){this.model=e.model,this.defaultMaxTokens=e.defaultMaxTokens,this.defaultTemperature=e.defaultTemperature,this.defaultReasoningEffort=e.defaultReasoningEffort,this.defaultBudgetTokens=e.defaultBudgetTokens,this.supportsJsonObjectMode=e.supportsJsonObjectMode}build(e){let{systemPrompt:t,userContent:n,history:r=[],maxTokens:i=this.defaultMaxTokens,model:a=this.model,jsonSchema:o,tools:s,toolChoice:c}=e,l=e.temperature===void 0?this.defaultTemperature:e.temperature,u=e.reasoningEffort===void 0?this.defaultReasoningEffort:e.reasoningEffort,d=e.budgetTokens===void 0?this.defaultBudgetTokens:e.budgetTokens;yt(s,c);let f=bt({jsonModeExplicit:e.jsonMode,hasTools:!!s,jsonSchema:o,hasSchema:!!e.schema,supportsJsonObjectMode:this.supportsJsonObjectMode}),p=xt(o,f);return wt(r),{useJson:f,model:a,request:{model:a,...l===null?{}:{temperature:l},max_tokens:i,...p?{response_format:p}:{},...u?{reasoning_effort:u}:{},...d==null?{}:{budget_tokens:d},...s?{tools:ht(s)}:{},...s?{tool_choice:St(c)}:{},messages:[...t?[{role:`system`,content:t}]:[],...r.flatMap(e=>Ct(e)),{role:`user`,content:n}]}}}};function Et(e,t,n){let r;try{r=n(e)}catch{throw new p(`Invalid JSON response`,`parse`)}if(r==null)throw new p(`Invalid JSON response`,`parse`);if(!t)return r;let i=t.safeParse(r);if(!i.success)throw new p(`Schema validation failed`,`validation`,{issues:i.error});return i.data}function Dt(e,t){let n=new Map(t.map(e=>[e.name,e])),r=new Set,i=[];for(let t of e)r.has(t.id)&&i.push({name:t.name,toolCallId:t.id,code:`duplicate_tool_call_id`}),r.add(t.id),n.has(t.name)||i.push({name:t.name,toolCallId:t.id,code:`unknown_tool`});if(i.length>0){let e=i.find(e=>e.code===`unknown_tool`),t=e?`Model requested tool "${e.name}", which was not in the tools offered ([${[...n.keys()].join(`, `)}]).`:`Duplicate tool call id "${i[0].toolCallId}" in the model's response.`;throw new p(i.length>1?`${t} (${i.length} tool call issues total, see error.issues.)`:t,`validation`,{code:e?`unknown_tool`:`duplicate_tool_call_id`,issues:i})}for(let t of e){let e=n.get(t.name);if(!e?.argumentsSchema)continue;let r=e.argumentsSchema.safeParse(t.arguments);if(!r.success)throw new p(`Arguments for tool call "${t.name}" failed validation`,`validation`,{issues:r.error})}}function Ot(e){let{rawContent:t,wireToolCalls:n,params:r,useJson:i,parseJson:a,requestId:o,logger:s,redactText:c}=e,l=t?.trim();if(!l&&!n?.length)throw new p(`Empty LLM response`,`api`,{code:`empty_response`});if(s.debug(`[VernLLM:${o}] output:\n`+c(l??`[${n?.length??0} tool call(s)]`).slice(0,800)),n?.length){if(!r.tools)throw new p("Provider returned tool_calls but no `tools` were sent with this call.",`validation`,{code:`unexpected_tool_calls`});if(r.toolChoice===`none`)throw new p(`Provider returned tool_calls despite toolChoice: 'none'.`,`validation`,{code:`tool_choice_none_violated`});let e=_t(n);return Dt(e,r.tools),{type:`tool_calls`,toolCalls:e,...l?{content:l}:{}}}let u=l??``;if(!i)return r.tools?{type:`content`,content:u}:u;let d=Et(u,r.schema,a);return r.tools?{type:`content`,content:d}:d}function kt(e,t,n,r,i,a,o,s,c){let{gateway:l,usageReporter:u,logger:d,redactText:f,parseJson:m,detectSoftFailure:h}=c;try{let g=Ot({rawContent:e,wireToolCalls:t,params:n,useJson:r,parseJson:m,requestId:a,logger:d,redactText:f}),_=At(h,g,{requestId:a,model:c.model,providerName:c.providerName,isFallback:c.isFallback,attempt:o+1},d);if(_!==void 0)throw new p(`Soft failure detected`,`api`,{code:_});return l.recordSuccess(o,n.signal,s),u.reportSuccess(i),g}catch(e){let t=M(e,n.signal);throw i&&t.type!==`aborted`&&u.reportFailure(i,t,o),t}}function At(e,t,n,r){if(e)try{return e(t,n)}catch(e){r.warn(`detectSoftFailure threw and was ignored, treated as no soft failure: ${e instanceof Error?e.message:String(e)}`);return}}function jt(e){let{capacity:t,logger:n,label:r}=e,i=[],a=[],o=!1,s=!1,c,l=!1;function u(e){let o=a.shift();if(o){o.resolve({done:!1,value:e});return}i.push(e),i.length>t*2&&(l||(l=!0,n.warn(`[VernLLM] ${r} buffer exceeded cap (${t}), evicting ${i.length-t} oldest item(s); buffered=${i.length}. The iterable was never read (or fell far behind) for this channel.`)),i.splice(0,i.length-t))}function d(){o=!0;for(let e of a.splice(0))e.resolve({done:!0,value:void 0})}function f(e){o=!0,s=!0,c=e;for(let t of a.splice(0))t.reject(e)}return{push:u,finish:d,fail:f,iterable:{[Symbol.asyncIterator](){return{next(){return i.length?Promise.resolve({done:!1,value:i.shift()}):o?s?Promise.reject(c):Promise.resolve({done:!0,value:void 0}):new Promise((e,t)=>{a.push({resolve:e,reject:t})})}}}}}}const Mt=1e4,Nt=1e6;function Pt(){let e=new Map;function t(t){let n=e.get(t.index);if(!n){if(e.size>=Mt)throw new p(`Stream contained more than ${Mt} distinct tool calls`,`validation`);n={args:``}}let r=t.argumentsDelta??``;if(n.args.length+r.length>Nt)throw new p(`Tool call arguments exceeded the ${Nt}-character stream limit`,`validation`);return n.id??=t.id,n.name??=t.name,n.args+=r,e.set(t.index,n),{type:`tool_call_delta`,index:t.index,id:t.id,name:t.name,argsDelta:t.argumentsDelta,complete:t.complete}}function n(){if(e.size)return[...e.entries()].sort(([e],[t])=>e-t).map(([,e])=>({id:e.id??``,type:`function`,function:{name:e.name??``,arguments:e.args}}))}return{apply:t,toWireToolCalls:n}}async function Ft(e,t){try{await e.return?.()}catch{}t.abort()}function It(e,t,n){let{requestId:r,model:i,providerName:a,isFallback:o,chunkIdleTimeoutMs:s,streamController:c,logger:l,signal:u,onRateLimitHint:d}=n,f,p,m=new Promise((e,t)=>{f=e,p=t});m.catch(()=>{});let h=jt({capacity:1e4,logger:l,label:`stream chunk`}),{push:g,finish:_,fail:v}=h,y=h.iterable,b=Pt(),x=``,S;return(async()=>{try{let n=t;for(;!n.done;){let t=n.value;t.type===`ping`||(t.type===`rate_limit_hint`?d?.(t.hint):t.type===`text-delta`?(x+=t.delta,g({type:`text-delta`,delta:t.delta})):t.type===`tool_call_delta`?g(b.apply(t)):t.type===`usage`&&(S=ue(t.usage,{requestId:r,model:i,providerName:a,isFallback:o}),g({type:`usage`,usage:S}))),n=await Ce(()=>e.next(),s,()=>c.abort(),l)}}catch(t){await Ft(e,c);let r=M(t,u);try{n.onStreamFailure(r,S)}catch{}v(r),p(r);return}_();try{n.onStreamSuccess(S)}catch{}try{let e=b.toWireToolCalls(),t=n.finalize(x,e,S);f(t)}catch(e){p(e)}})(),{chunks:y,finalResult:m}}function Lt(e){let{providerName:t,isFallback:n,maxRetries:r,onUsage:i,onUsageFailure:a,logger:o}=e;function s(e,r,i){if(e.usage)return ue(e.usage,{requestId:r,model:i,providerName:t,isFallback:n})}function c(e){if(e)return e.totalTokens||e.promptTokens+e.completionTokens}function l(e){if(!(!e||!i))try{i(e)}catch(e){o.error(`[VernLLM] onUsage failed`,{message:e instanceof Error?e.message:`unknown`})}}function u(e,t,n,i=!1){let s=e.totalTokens||e.promptTokens+e.completionTokens,c=i?`mid-stream failure (terminal, no further attempts)`:`attempt ${n+1}/${r+1}`;if(o.warn(`[VernLLM:${e.requestId}] usage failure, ${c}: type=${t.type} tokens=${s}`),a)try{a(e,t)}catch(e){o.error(`[VernLLM] onUsageFailure failed`,{message:e instanceof Error?e.message:`unknown`})}}return{extract:s,actualTokensFor:c,reportSuccess:l,reportFailure:u}}async function Rt(e,t,n,r){if(!e)return{};let i=await e.acquire(e.estimate(t),n);return i.waitedMs>0&&r(i.waitedMs,i.reason??`rpm`),{release:i.release}}async function zt(e){let{params:t,requestId:n,attempt:r,onRequest:i,middlewareState:a,gateway:o,requestBuilder:s,providerName:c,limiter:l,middleware:u,middlewareTimeoutMs:d,logger:p,reportEvent:m}=e,h=a??T(),g=s.build(t),{useJson:_,model:v}=g,y=await it({request:g.request,requestId:n,attempt:r,signal:t.signal,state:h,middleware:u,middlewareTimeoutMs:d,logger:p,reportEvent:m,buildContext:(e,t,n)=>o.buildAttemptContext(e,t,n)});i?.(f(c,v,y,void 0,Date.now()));let{release:b}=await Rt(l,y,t.signal,(e,i)=>{F({kind:`rate_limited`,requestId:n,provider:c,model:v,waitedMs:e,reason:i},o.buildAttemptContext(r,t.signal,h),m,u,d,p)});return{request:y,model:v,useJson:_,state:h,release:b}}async function Bt(e){let{fn:t,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,breaker:s,budget:c,maxRetries:l,baseDelayMs:u,nonRetryableStatus:d,signal:f,onAttempt:p,middleware:m,middlewareTimeoutMs:h,logger:g,reportEvent:_,logLabel:v,redactText:y,countsTowardBreaker:b}=e,x=e.state??T(),S=[],C=mt({breaker:s,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o}),ee;try{return await Me({fn:(e,n)=>(c?.recordAttempt(e>0),t(e,n,x,C)),maxRetries:l,signal:f,onAttempt:p,attempts:S,shouldRetryAttempt:(e,t)=>{if(!Ae(e,d,j,t))return!1;if(c)try{c.assertAvailable()}catch(e){return ee=e,!1}return!0},recoverDelayForAttempt:(e,t)=>je({requestId:n,model:r,attempt:e,error:t,state:x,signal:f,providerName:i,maxRetries:l,baseDelayMs:u,middleware:m,middlewareTimeoutMs:h,logger:g,reportEvent:_,buildEventContext:(e,t,n,r,i)=>C.buildAttemptContext(n,r,i),extractStatus:j,normalizeError:M,emitEvent:F}),normalizeError:M})}catch(e){let t=M(ee??e,f,S.length>0?S:void 0);throw b(t)&&C.recordFailure(S.length,f,x,t.code),g.debug(`[VernLLM:${n}] ${v}:\n${y(Je(e))}`),t}}function Vt(e){try{return JSON.parse(e)}catch{return}}var Ht=class{providerName;client;model;maxRetries;timeoutMs;chunkIdleTimeoutMs;baseDelayMs;nonRetryableStatus;parseJson;logger;redact;usageReporter;reportEvent;breaker;budget;limiter;isFallback;requestBuilder;middleware;middlewareTimeoutMs;supportsJsonObjectMode;detectSoftFailure;constructor(e,t,n,r){this.providerName=e,this.client=t,this.model=n,this.maxRetries=r.maxRetries,this.timeoutMs=r.timeoutMs,this.chunkIdleTimeoutMs=r.chunkIdleTimeoutMs,this.baseDelayMs=r.baseDelayMs,this.nonRetryableStatus=r.nonRetryableStatus,this.parseJson=r.parseJson??Vt,this.logger=r.logger,this.redact=r.redact,this.reportEvent=I(r.onEvent,this.logger),this.breaker=r.breaker,this.budget=r.budget,this.limiter=r.limiter,this.isFallback=r.isFallback??!1,this.middleware=r.middleware??[],this.middlewareTimeoutMs=r.middlewareTimeoutMs??5e3,this.supportsJsonObjectMode=t.supportsJsonObjectMode??!0,this.detectSoftFailure=r.detectSoftFailure,this.usageReporter=Lt({providerName:this.providerName,isFallback:this.isFallback,maxRetries:this.maxRetries,onUsage:r.onUsage,onUsageFailure:r.onUsageFailure,logger:this.logger}),this.requestBuilder=new Tt({model:n,defaultMaxTokens:r.defaultMaxTokens,defaultTemperature:r.defaultTemperature,defaultReasoningEffort:r.defaultReasoningEffort,defaultBudgetTokens:r.defaultBudgetTokens,supportsJsonObjectMode:this.supportsJsonObjectMode})}previewRequest(e){let{model:t,request:n}=this.requestBuilder.build(e);return{model:t,request:n}}get jsonObjectModeSupported(){return this.supportsJsonObjectMode}getCircuitState(e){return this.breaker?.getState(e)}getFailureBreakdown(e){return this.breaker?.getFailureBreakdown(e)}getRetryBudgetState(){return this.budget?.getSnapshot()}get isolateByModel(){return this.breaker?.isolateByModel??!1}openCircuit(e,t){this.breaker?.open(e,t)}closeCircuit(e,t){this.breaker?.close(e,t)}assertBreakerClosed(e,t){this.breaker?.assertClosed(e??this.model,t)}async run(e,t,n,r){return Bt({fn:(n,r,i,a)=>this.executeCall(e,t,n,r,i,a),requestId:t,model:e.model??this.model,providerName:this.providerName,isFallback:this.isFallback,supportsJsonObjectMode:this.supportsJsonObjectMode,breaker:this.breaker,budget:this.budget,maxRetries:this.maxRetries,baseDelayMs:this.baseDelayMs,nonRetryableStatus:this.nonRetryableStatus,signal:e.signal,onAttempt:n,state:r,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent,logLabel:`error`,redactText:e=>this.redactText(e),countsTowardBreaker:e=>this.countsTowardBreaker(e)})}async runStream(e,t,n,r){return Bt({fn:(n,r,i,a)=>this.executeStreamCall(e,t,n,r,i,a),requestId:t,model:e.model??this.model,providerName:this.providerName,isFallback:this.isFallback,supportsJsonObjectMode:this.supportsJsonObjectMode,breaker:this.breaker,budget:this.budget,maxRetries:this.maxRetries,baseDelayMs:this.baseDelayMs,nonRetryableStatus:this.nonRetryableStatus,signal:e.signal,onAttempt:n,state:r,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent,logLabel:`stream-open error`,redactText:e=>this.redactText(e),countsTowardBreaker:e=>this.countsTowardBreaker(e)})}async executeCall(e,t,n,r,i,a){let{request:o,model:s,useJson:c,state:l,release:u}=await zt({params:e,requestId:t,attempt:n,onRequest:r,middlewareState:i,gateway:a,requestBuilder:this.requestBuilder,providerName:this.providerName,limiter:this.limiter,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent}),d=u;try{let r;try{r=await Se(e=>this.client.chat.completions.create(o,{signal:e}),this.timeoutMs,e.signal)}catch(e){throw this.reactToRateLimitError(e),e}this.limiter?.reactToRateLimitHint(pt(r));let i=this.usageReporter.extract(r,t,s),u=this.usageReporter.actualTokensFor(i),f=r.choices?.[0]?.message?.content,p=r.choices?.[0]?.message?.tool_calls,m;try{m=kt(f,p,e,c,i,t,n,l,{gateway:a,usageReporter:this.usageReporter,logger:this.logger,redactText:e=>this.redactText(e),parseJson:this.parseJson,detectSoftFailure:this.detectSoftFailure,providerName:this.providerName,isFallback:this.isFallback,model:s})}catch(e){throw d?.(u),d=void 0,e}return d?.(u,!0),d=void 0,m}finally{d?.()}}redactText(e){return this.redact?this.redact(e):e}reactToRateLimitError(e){this.limiter&&j(e)===429&&this.limiter.signalRateLimit()}async executeStreamCall(e,t,n,r,i,a){let o=this.client.chat.completions;if(!o.createStream)throw new p(`stream: true requires a client/adapter with createStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`createStream`}});let s=o.createStream.bind(o),{request:c,model:l,useJson:u,state:d,release:f}=await zt({params:e,requestId:t,attempt:n,onRequest:r,middlewareState:i,gateway:a,requestBuilder:this.requestBuilder,providerName:this.providerName,limiter:this.limiter,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent}),m=f,h=new AbortController,g=e.signal?AbortSignal.any([e.signal,h.signal]):h.signal;try{let{iterator:r,first:i}=await(async()=>{try{return await Se(async e=>{let t=s(c,{signal:e})[Symbol.asyncIterator]();return{iterator:t,first:await t.next()}},this.timeoutMs,g)}catch(e){throw this.reactToRateLimitError(e),e}})();if(i.done)throw new p(`Empty LLM response`,`api`);let o=m,f=It(r,i,{requestId:t,model:l,providerName:this.providerName,isFallback:this.isFallback,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs??this.chunkIdleTimeoutMs,streamController:h,logger:this.logger,signal:e.signal,onRateLimitHint:e=>{this.limiter?.reactToRateLimitHint(e)},onStreamSuccess:e=>{},onStreamFailure:(t,r)=>{this.reactToRateLimitError(t),t.type===`timeout`&&a.recordFailure(n,e.signal,d,t.code),r&&t.type!==`aborted`&&this.usageReporter.reportFailure(r,t,n,!0),o?.(this.usageReporter.actualTokensFor(r))},finalize:(r,i,s)=>{let c=this.usageReporter.actualTokensFor(s);try{let f=kt(r,i,e,u,s,t,n,d,{gateway:a,usageReporter:this.usageReporter,logger:this.logger,redactText:e=>this.redactText(e),parseJson:this.parseJson,detectSoftFailure:this.detectSoftFailure,providerName:this.providerName,isFallback:this.isFallback,model:l});return o?.(c,!0),f}catch(t){throw o?.(c),t instanceof p&&this.countsTowardBreaker(t)&&a.recordFailure(n,e.signal,d,t.code),t}}});return m=void 0,f}finally{m?.()}}countsTowardBreaker(e){return e.countsTowardBreaker}};async function Ut(e,t,n,r,i,a=!1){let o=[];for(let s=0;s<e.executors.length;s++){let c=e.executors[s],l=Date.now(),u=0;try{return s===0&&a||c.assertBreakerClosed(t.model,{requestId:n,state:r,signal:t.signal}),{result:await i(c,()=>{u+=1}),executor:c,index:s,attemptCount:u}}catch(i){let a=M(i,t.signal);o.push({index:s-1,provider:c.providerName,model:t.model??c.model,error:a.toSnapshot()});let d=s===e.executors.length-1,f=e.fallbackOn(a,{isLastTarget:d});if((d?`stop`:f)===`stop`)throw o.length>1?new w(o):a;let p=e.executors[s+1],m=t.model??c.model,h={stage:`attempt`,requestId:n,requestedProvider:c.providerName,requestedModel:m,isFallbackAttempt:s>0,attempt:u||1,capabilities:{supportsJsonObjectMode:c.jsonObjectModeSupported},signal:t.signal,state:r,own:{}};F({kind:`fallback`,requestId:n,from:c.providerName,to:p.providerName,fromIndex:s-1,toIndex:s,error:a,elapsedMs:Date.now()-l},h,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger)}}throw new p(`No provider targets configured`,`invalid_params`)}function Wt(e,t){let n={provider:e.executor.providerName,model:t.model??e.executor.model,fallbackIndex:e.index-1,usedFallback:e.index>0,attempts:e.attemptCount};return t.meta&&(t.meta.current=n),{value:e.result,meta:n}}async function Gt(e,t,n,r,i){return Wt(await Ut(e,t,n,i,(e,r)=>e.run(t,n,r,i),r),t)}async function Kt(e,t,n,r,i){return Wt(await Ut(e,t,n,i,(e,r)=>e.runStream(t,n,r,i),r),t)}function qt(e){let t=!1,n,r;function i(){return r||(t=!0,r=e().then(e=>(n=e,e)),r.catch(()=>{}),r)}return{call:i,wasCalled:()=>t,resolvedValue:()=>n}}async function V(e,t,n,r,i,a=!1){if(e.middleware.length===0||a)return i();let o=e.primaryExecutor,{model:s,request:c}=o.previewRequest(t),l=i;for(let i=e.middleware.length-1;i>=0;i--){let a=e.middleware[i],u=N(a,i),d=l;l=async()=>{let i={stage:`pre-dispatch`,requestId:n,primaryProvider:o.providerName,primaryModel:s,capabilities:{supportsJsonObjectMode:o.jsonObjectModeSupported},signal:t.signal,state:r,own:{}};if(!await P(a,i,u,e.middlewareTimeoutMs,e.logger))return a.enabled!==void 0&&F({kind:`middleware`,requestId:n,middleware:u,hook:`enabled_skip`},i,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger),d();if(!a.wrap)return d();let l=qt(d);try{let t=await a.wrap(c,l.call,i);return l.wasCalled()||F({kind:`middleware`,requestId:n,middleware:u,hook:`wrap_short_circuit`},i,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger),t}catch(t){let n=l.resolvedValue();if(n!==void 0)return e.logger.error(`[VernLLM] middleware "${u}".wrap threw after next() resolved; keeping the original result`,{message:t instanceof Error?t.message:`unknown`}),n;throw ot(t,u,i.signal)}}}return l()}const H=Symbol(`deadlineExceeded`);function Jt(e,t){if(e===void 0)return{signal:t,timer:void 0};let n=new AbortController;if(e<=0)return n.abort(H),{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:void 0};let r=setTimeout(()=>n.abort(H),e);return{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:r}}function Yt(e,t){return e instanceof p&&e.type===`aborted`&&e.code===void 0&&t?.reason===H&&(e.code=`deadline_exceeded`),e}var Xt=class{capacity;refillPerMs;available;lastRefill=Date.now();constructor(e,t){this.capacity=e,this.refillPerMs=t,this.available=e}refill(){if(this.refillPerMs===0)return;let e=Date.now(),t=e-this.lastRefill;this.available=Math.min(this.capacity,this.available+Math.max(0,t)*this.refillPerMs),this.lastRefill=e}tryTake(e){return this.refill(),this.available<e?!1:(this.available-=e,!0)}msUntilAvailable(e){return this.refill(),this.available>=e?0:this.refillPerMs===0?1/0:(e-this.available)/this.refillPerMs}give(e){this.available=Math.min(this.capacity,this.available+e)}getCapacity(){return this.capacity}resize(e){this.refill(),this.refillPerMs>0&&(this.refillPerMs=this.refillPerMs/this.capacity*e),this.capacity=e,this.available=Math.min(this.available,e)}};function Zt(e){let t=e.messages.reduce((e,t)=>{let n=t.content;if(typeof n==`string`)return e+n.length;if(n==null)return e;try{return e+JSON.stringify(n).length}catch{return e}},0);return Math.ceil(t/4)+(e.max_tokens??0)}function Qt(e){if(!e)return;let t=t=>{if(!Number.isFinite(e[t]))throw new p(`aimd.${t} (${e[t]}) must be a finite number.`,`invalid_params`)};for(let e of[`minCapacity`,`maxCapacity`,`increaseBy`,`decreaseFactor`])t(e);if(e.minCapacity<1||e.maxCapacity<1)throw new p(`aimd.minCapacity (${e.minCapacity}) and aimd.maxCapacity (${e.maxCapacity}) must both be at least 1, since the requests bucket always takes 1 per acquire; a capacity below 1 could never be satisfied.`,`invalid_params`);if(e.minCapacity>e.maxCapacity)throw new p(`aimd.minCapacity (${e.minCapacity}) must not exceed aimd.maxCapacity (${e.maxCapacity}).`,`invalid_params`);return{increaseBy:Math.max(0,e.increaseBy),decreaseFactor:Math.min(1,Math.max(Number.MIN_VALUE,e.decreaseFactor)),minCapacity:e.minCapacity,maxCapacity:e.maxCapacity,proactiveFloor:e.proactiveFloor??0}}function $t(e,t){return e===`tpm`?t:1}function en(e){if(e)return new Xt(e,e/6e4)}var tn=class{requests;tokens;concurrency;buckets;maxQueueMs;maxQueueSize;estimateTokensFn;aimd;queue=[];wakeTimer;constructor(e){this.requests=en(e.requestsPerMinute),this.tokens=en(e.tokensPerMinute),e.maxConcurrent&&(this.concurrency=new Xt(e.maxConcurrent,0)),this.buckets=[{reason:`concurrency`,bucket:this.concurrency},{reason:`rpm`,bucket:this.requests},{reason:`tpm`,bucket:this.tokens}].flatMap(({reason:e,bucket:t})=>t?[{reason:e,bucket:t}]:[]),this.maxQueueMs=e.maxQueueMs??3e4,this.maxQueueSize=e.maxQueueSize??0,this.estimateTokensFn=e.estimateTokens??Zt,this.aimd=this.requests?Qt(e.aimd):void 0}estimate(e){return this.estimateTokensFn(e)}async acquire(e,t){if(t?.aborted)throw new p(`LLM request aborted`,`aborted`);if(!Number.isFinite(e)||e<0)throw new p(`estimatedTokens must be a finite, non-negative number, got ${String(e)}`,`invalid_params`);if(this.tokens&&e>this.tokens.getCapacity())throw new p(`estimatedTokens (${e}) exceeds the configured tokensPerMinute capacity (${this.tokens.getCapacity()}); this call could never acquire capacity.`,`rate_limited`,{code:`rate_limit_capacity_exceeded`});if(this.queue.length===0){let n=this.tryAcquireBuckets(e);return n.ok?{release:this.makeRelease(e),waitedMs:0}:this.enqueue(e,n.reason,t)}if(this.maxQueueSize>0&&this.queue.length>=this.maxQueueSize)throw this.queueFullError();return this.enqueue(e,void 0,t)}queueFullError(){return new p(`Rate limit queue is full`,`rate_limited`,{code:`rate_limit_queue_full`})}enqueue(e,t,n){return new Promise((r,i)=>{let a={estimatedTokens:e,enqueuedAt:Date.now(),lastReason:t,resolve:e=>{c(),r(e)},reject:e=>{c(),this.wakeTimer&&=(clearTimeout(this.wakeTimer),void 0),this.drain(),i(e)}},o,s=()=>{a.reject(new p(`LLM request aborted`,`aborted`))},c=()=>{o&&clearTimeout(o),n?.removeEventListener(`abort`,s);let e=this.queue.indexOf(a);e!==-1&&this.queue.splice(e,1)};this.maxQueueMs>0&&(o=setTimeout(()=>{a.reject(new p(`Rate limit queue timed out before capacity was available`,`rate_limited`,{code:`rate_limit_queue_timeout`}))},this.maxQueueMs)),n?.addEventListener(`abort`,s,{once:!0}),this.queue.push(a),this.drain()})}tryAcquireBuckets(e){let t=[];for(let{reason:n,bucket:r}of this.buckets){let i=$t(n,e);if(!r.tryTake(i)){for(let e of t)e.bucket.give(e.amount);return{ok:!1,reason:n}}t.push({bucket:r,amount:i})}return{ok:!0}}drain(){for(;this.queue.length>0;){let e=this.queue[0],t=this.tryAcquireBuckets(e.estimatedTokens);if(!t.ok){e.lastReason=t.reason,this.scheduleWake(t.reason,e.estimatedTokens);return}let n=Date.now()-e.enqueuedAt;e.resolve({release:this.makeRelease(e.estimatedTokens),waitedMs:n,reason:e.lastReason})}}scheduleWake(e,t){if(this.wakeTimer||e===`concurrency`)return;let n=(this.buckets.find(t=>t.reason===e)?.bucket)?.msUntilAvailable($t(e,t));if(n===void 0||!Number.isFinite(n))return;let r=Math.min(Math.max(1,Math.ceil(n)),2147483647);this.wakeTimer=setTimeout(()=>{this.wakeTimer=void 0,this.drain()},r)}makeRelease(e){let t=!1;return(n,r=!1)=>{t||(t=!0,this.concurrency?.give(1),this.tokens&&n!==void 0&&Number.isFinite(n)&&this.tokens.give(e-n),r&&this.growOnSuccess(),this.drain())}}resizeRequestsCeiling(e){!this.aimd||!this.requests||this.requests.resize(e(this.aimd,this.requests.getCapacity()))}growOnSuccess(){this.resizeRequestsCeiling((e,t)=>Math.min(t+e.increaseBy,e.maxCapacity))}signalRateLimit(){this.resizeRequestsCeiling((e,t)=>Math.max(t*e.decreaseFactor,e.minCapacity))}reactToRateLimitHint(e){if(!this.aimd||!e||e.remainingRequests===void 0)return;let t=this.aimd.proactiveFloor??0;t>0&&e.remainingRequests<=t&&this.signalRateLimit()}};const U=[`estimate`,`acquire`,`signalRateLimit`,`reactToRateLimitHint`];function nn(e){let t=e;return U.every(e=>typeof t[e]==`function`)}function rn(e){let t=e;return U.some(e=>typeof t[e]==`function`)}function an(e){if(e!==void 0){if(nn(e))return e;if(rn(e))throw new p(`rateLimit looks like a RateLimiterAdapter but is missing: ${U.filter(t=>typeof e[t]!=`function`).join(`, `)}. All four methods (${U.join(`, `)}) are required.`,`invalid_params`);return new tn(e)}}function on(e,t,n){return[e,...t].map((e,t)=>{let r=t>0,i=e.name??(r?`fallback[${t-1}]`:n.providerName),a=ct(e.circuitBreaker,i,e.model,n.onEvent,n.logger,n.middleware,n.middlewareTimeoutMs,r,e.client.supportsJsonObjectMode??!0),o=e.retryBudget?new Ue(e.retryBudget):void 0;return new Ht(i,e.client,e.model,{maxRetries:e.maxRetries??n.maxRetries??1,timeoutMs:e.timeoutMs??n.timeoutMs??25e3,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs??n.chunkIdleTimeoutMs??3e4,baseDelayMs:e.baseDelayMs??n.baseDelayMs??500,defaultMaxTokens:e.defaultMaxTokens??n.defaultMaxTokens??1e3,defaultTemperature:e.defaultTemperature===void 0?n.primaryDefaultTemperature:e.defaultTemperature,defaultReasoningEffort:e.defaultReasoningEffort===void 0?n.primaryDefaultReasoningEffort:e.defaultReasoningEffort,defaultBudgetTokens:e.defaultBudgetTokens===void 0?n.primaryDefaultBudgetTokens:e.defaultBudgetTokens,nonRetryableStatus:e.nonRetryableStatus??n.nonRetryableStatus??[400,401,403,404,422],parseJson:n.parseJson,logger:n.logger,redact:n.redact,onUsage:n.onUsage,onUsageFailure:n.onUsageFailure,onEvent:n.onEvent,breaker:a,budget:o,limiter:an(e.rateLimit),isFallback:r,middleware:n.middleware,middlewareTimeoutMs:n.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure??n.detectSoftFailure})})}function sn(e){let t=e;return typeof t.get==`function`&&typeof t.set==`function`}function cn(e){if(e===void 0)return new b;if(sn(e))return e;if(e.maxSize!==void 0&&(!Number.isFinite(e.maxSize)||e.maxSize<0||!Number.isInteger(e.maxSize)))throw RangeError(`cache.maxSize must be a finite, non-negative integer, got ${String(e.maxSize)}`);return new b(e.maxSize,e.eviction)}function ln(e){return{debug:W(e,`debug`),warn:W(e,`warn`),error:W(e,`error`)}}function W(e,t){let n=e[t].bind(e);return((...e)=>{try{dn(n(...e))}catch{}})}function un(e){return typeof e?.then==`function`}function dn(e){un(e)&&Promise.resolve(e).catch(()=>{})}var fn=class{debugEnabled;constructor(e){this.debugEnabled=e}debug(e){this.debugEnabled&&console.debug(e)}warn(e){console.warn(e)}error(e,t){console.error(e,t??``)}},pn=class{logger;executors;fallbackOn;reportEvent;cacheOrchestrator;middleware;middlewareTimeoutMs;cachedCallInnerParams=new WeakMap;cachedCallMeta=new Map;constructor(e){this.logger=ln(e.logger??new fn(e.debug??!1));let t=e.name??`primary`;this.cacheOrchestrator=new ve(cn(e.cache),this.logger),this.fallbackOn=e.fallbackOn??ae,this.reportEvent=I(e.onEvent,this.logger),this.middleware=[...e.middleware??[]].sort((e,t)=>(e.priority??0)-(t.priority??0)),this.middlewareTimeoutMs=e.middlewareTimeoutMs??5e3;let n=e.defaultTemperature===void 0?.2:e.defaultTemperature,r=e.defaultReasoningEffort,i=e.defaultBudgetTokens,a={client:e.client,model:e.model,name:t,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,baseDelayMs:e.baseDelayMs,defaultMaxTokens:e.defaultMaxTokens,defaultTemperature:n,defaultReasoningEffort:r,defaultBudgetTokens:i,nonRetryableStatus:e.nonRetryableStatus,circuitBreaker:e.circuitBreaker,rateLimit:e.rateLimit,retryBudget:e.retryBudget,detectSoftFailure:e.detectSoftFailure},o=Array.isArray(e.fallback)?e.fallback:e.fallback?[e.fallback]:[];this.executors=on(a,o,{providerName:t,primaryDefaultTemperature:n,primaryDefaultReasoningEffort:r,primaryDefaultBudgetTokens:i,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,baseDelayMs:e.baseDelayMs,defaultMaxTokens:e.defaultMaxTokens,nonRetryableStatus:e.nonRetryableStatus,parseJson:e.parseJson,redact:e.redact,onUsage:e.onUsage,onUsageFailure:e.onUsageFailure,onEvent:e.onEvent,logger:this.logger,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure})}logRefundError(e,t){this.logger.error(e,{message:t instanceof Error?t.message:`unknown`})}get logicalCallDependencies(){return{executors:this.executors,fallbackOn:this.fallbackOn,reportEvent:this.reportEvent,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger}}get runOperationDependencies(){return{middleware:this.middleware,primaryExecutor:this.executors[0],middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent}}async call(e){if(e.signal?.aborted)throw new p(`LLM request aborted`,`aborted`);let t=e.requestId??globalThis.crypto.randomUUID(),n=this.cachedCallInnerParams.get(e),r=n!==void 0,{signal:i,timer:a}=Jt(e.deadlineMs,e.signal),o=i===e.signal?e:{...e,signal:i},s=n??T();try{let e=this.executors.length===1,n=await V(this.runOperationDependencies,o,t,s,async()=>{if(e){if(o.signal?.aborted)throw new p(`LLM request aborted`,`aborted`);this.executors[0].assertBreakerClosed(o.model,{requestId:t,state:s,signal:o.signal})}let n,r=async e=>{let t=await e;return n=t.meta,t.value};return o.stream?{value:await pe(o,()=>r(Kt(this.logicalCallDependencies,o,t,e,s)),o.signal,(e,t)=>this.logRefundError(e,t)),meta:n}:{value:await E(o,!1,()=>r(Gt(this.logicalCallDependencies,o,t,e,s)),o.signal,(e,t)=>this.logRefundError(e,t)),meta:n}},r);return o.stream,n.value}catch(e){throw Yt(e,i)}finally{clearTimeout(a)}}runCached(e){return this.cacheOrchestrator.runCached(e)}async deleteCache(e){await this.cacheOrchestrator.deleteCache(e)}async cachedCall(e){let{call:t,...n}=e,r=t;if(r.reserveUsage||r.refundUsage)throw new p("`reserveUsage`/`refundUsage` were set inside `call`, where cachedCall ignores them. Move them to the top level of the cachedCall() params, alongside cacheKey/ttl, instead.",`invalid_params`);let i=r.requestId??globalThis.crypto.randomUUID(),a=T(),o=await this.cacheOrchestrator.resolveCacheKey(n.cacheKey),s=this.cachedCallMeta.get(o),c=!1;s||(s={},c=!0,this.cachedCallMeta.set(o,s));let l=()=>{c&&this.cachedCallMeta.delete(o)},u=r.meta,d=e=>{let t={...e,meta:s};return this.cachedCallInnerParams.set(t,a),this.call(t).finally(()=>{u&&(u.current=s.current),this.cachedCallInnerParams.delete(t)})};if(r.stream){let e={...r,requestId:i},t;try{t=await V(this.runOperationDependencies,e,i,a,async()=>({value:await this.cacheOrchestrator.runCachedStream({...n,openStream:()=>d(e)},!!r.tools),meta:s.current}))}catch(e){throw l(),e}let o=t.value,c=()=>{u&&(u.current=s.current),l()};return o.finalResult.then(c,c),o}let f={...r,requestId:i};try{let e=await V(this.runOperationDependencies,f,i,a,async()=>({value:await this.runCached({...n,fn:()=>d(f)}),meta:s.current}));return u&&(u.current=s.current),e.value}finally{l()}}getCircuitState(e){let t=L(this.executors,e?.index??0,`getCircuitState`);return R(t.isolateByModel,e?.model,`getCircuitState`,this.logger),t.getCircuitState(e?.model??t.model)}getFailureBreakdown(e){let t=L(this.executors,e?.index??0,`getFailureBreakdown`);return R(t.isolateByModel,e?.model,`getFailureBreakdown`,this.logger),t.getFailureBreakdown(e?.model??t.model)}getRetryBudgetState(e){return L(this.executors,e?.index??0,`getRetryBudgetState`).getRetryBudgetState()}getCircuitStates(e){return this.executors.map((t,n)=>({provider:t.providerName,index:n,isFallback:n>0,isolateByModel:t.isolateByModel,state:t.getCircuitState(e??t.model)}))}openCircuit(e){let t=L(this.executors,e?.index??0,`openCircuit`);R(t.isolateByModel,e?.model,`openCircuit`,this.logger),t.openCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:T()})}closeCircuit(e){let t=L(this.executors,e?.index??0,`closeCircuit`);R(t.isolateByModel,e?.model,`closeCircuit`,this.logger),t.closeCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:T()})}};function mn(e){return e}function hn(e){return e}async function*gn(e){let t=new TextDecoder(`utf-8`,{fatal:!0}),n=``;for await(let r of e){let e;try{e=typeof r==`string`?r:t.decode(r,{stream:!0})}catch(e){throw new p(`Invalid UTF-8 in SSE stream`,`parse`,{cause:e})}n=(n+e).replace(/\r\n/g,`
1
+ const e=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),t=new Set([`rate_limit_queue_full`,`rate_limit_queue_timeout`,`rate_limit_capacity_exceeded`,`retry_budget_exhausted`]),n=new Set([`middleware_timeout`]),r=new Set([`parse`,`validation`,`invalid_params`,`aborted`]);function i(i,a){return!(r.has(i)||a&&e.has(a)||a&&t.has(a)||a&&n.has(a))}const a=new Set([`quota_exceeded`]);function o(e,t){return!(!i(e,t)||a.has(e))}function s(e){if(e!==void 0)try{return JSON.stringify(e),e}catch{return`[Unserializable: issues contained a circular reference]`}}function c(e){if(e!==void 0)try{return JSON.parse(JSON.stringify(e))}catch{return`[Unserializable: request body contained a circular reference]`}}const l=new Set([`authorization`,`x-api-key`,`x-goog-api-key`,`api-key`]);function u(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))l.has(n.toLowerCase())||(t[n]=r);return t}function d(e,t=0){if(e!==void 0)return t>=20?[]:e.map(e=>({...e,error:{...e.error,issues:s(e.error.issues),attempts:d(e.error.attempts,t+1)},request:e.request&&{...e.request,body:c(e.request.body),headers:u(e.request.headers)}}))}function f(e,t,n,r,i=Date.now()){return{provider:e,model:t,body:c(n),headers:u(r),startedAt:i}}var p=class extends Error{type;status;issues;cause;retryAfterMs;code;attempts;constructor(e,t,n={}){super(e),this.type=t,this.name=`LLMError`,this.status=n.status,this.issues=n.issues,this.cause=n.cause,this.retryAfterMs=n.retryAfterMs,this.code=n.code,this.attempts=n.attempts}get retryable(){return i(this.type,this.code)}get countsTowardBreaker(){return o(this.type,this.code)}toSnapshot(){return{message:this.message,type:this.type,status:this.status,issues:s(this.issues),retryAfterMs:this.retryAfterMs,code:this.code,retryable:this.retryable,attempts:d(this.attempts)}}toJSON(){return{name:this.name,message:this.message,type:this.type,status:this.status,issues:s(this.issues),retryAfterMs:this.retryAfterMs,code:this.code,retryable:this.retryable,attempts:d(this.attempts)}}};function m(e){return e instanceof p}function h(e,t){return e.code===t&&e.issues!==void 0}const g={onAccess(){},onInsert(){},getEvictee:e=>e.keys().next().value};function _(e,t){if(!e.has(t))return;let n=e.get(t);e.delete(t),e.set(t,n)}const v={onAccess:_,onInsert:_,getEvictee:e=>e.keys().next().value};function y(e){return e===`lru`?v:g}var b=class{maxSize;store=new Map;eviction;constructor(e=1e3,t=`fifo`){this.maxSize=e,this.eviction=y(t)}async get(e){let t=this.store.get(e);return t?Date.now()>=t.expiresAt?(this.store.delete(e),{hit:!1,value:null}):(this.eviction.onAccess(this.store,e),{hit:!0,value:t.value}):{hit:!1,value:null}}async set(e,t,n){this.cleanupExpiredEntries(),this.store.set(e,{value:t,expiresAt:Date.now()+n*1e3}),this.eviction.onInsert(this.store,e),this.enforceSizeLimit()}async delete(e){this.store.delete(e)}cleanupExpiredEntries(){let e=Date.now();for(let[t,n]of this.store)e>=n.expiresAt&&this.store.delete(t)}enforceSizeLimit(){for(;this.store.size>this.maxSize;){let e=this.eviction.getEvictee(this.store);if(e===void 0)break;this.store.delete(e)}}},x=class{inner;constructor(e=new b){this.inner=e}normalize(e){return e.toLowerCase().trim().replace(/[^\p{L}\p{N}\s]/gu,` `).replace(/\s+/g,` `).trim()}async resolveKey(e){return this.normalize(e)}async get(e){return this.inner.get(this.normalize(e))}async set(e,t,n){await this.inner.set(this.normalize(e),t,n)}async delete(e){await this.inner.delete?.(this.normalize(e))}},S=class{l1;l2;l1Ttl;constructor(e,t,n){this.l1=e,this.l2=t,this.l1Ttl=n}async resolveKey(e){return this.l1.resolveKey?this.l1.resolveKey(e):this.l2.resolveKey?this.l2.resolveKey(e):e}async get(e){let t=await this.l1.get(e);if(t.hit)return t;let n=await this.l2.get(e);return n.hit&&await this.l1.set(e,n.value,this.l1Ttl??60),n}async set(e,t,n){await Promise.all([this.l1.set(e,t,this.l1Ttl??n),this.l2.set(e,t,n)])}async delete(e){await Promise.all([this.l1.delete?.(e),this.l2.delete?.(e)])}};function C(e){return e}function ee(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.type===`tool_calls`&&Array.isArray(t.toolCalls)}function te(e){return typeof e==`object`&&!!e&&typeof e.then==`function`}function ne(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`}function re(e){if(typeof e!=`object`||!e)return!1;let t=e;return ne(t.chunks)&&te(t.finalResult)}const ie=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),ae=e=>e.type===`parse`||e.type===`validation`||e.type===`aborted`||e.type===`quota_exceeded`||e.code&&ie.has(e.code)?`stop`:`next`;var oe=class extends p{attempts;constructor(e){let t=e[e.length-1]?.error;super(`${e.length} provider${e.length===1?``:`s`} attempted and failed: ${e.map(e=>`${e.provider}(${e.error.type})`).join(` then `)}`,`fallback_exhausted`,{status:t?.status,cause:t,retryAfterMs:t?.retryAfterMs,code:`fallback_exhausted`,attempts:e}),this.attempts=e}get retryable(){let e=this.attempts[this.attempts.length-1]?.error;return e?e.retryable:super.retryable}};function se(e){return e instanceof oe}function ce(){return{}}function le(e){return{debugName:e}}function w(){let e=new Map;return{get(t){return e.get(t)},set(t,n){e.set(t,n)}}}function ue(e){let{onError:t,...n}=e;return t?{...n,wrap:async(e,n,r)=>{try{return await n()}catch(e){try{await t(e,r)}catch{}throw e}}}:n}function de(e,t){let n=e.completion_tokens_details?.reasoning_tokens;return{promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,...n===void 0?{}:{reasoningTokens:n},requestId:t.requestId,model:t.model,provider:t.providerName,usedFallback:t.isFallback}}async function fe(e,t,n){if(!e.reserveUsage)return!1;try{return await e.reserveUsage({coalesced:t,signal:n}),!0}catch(e){throw n?.aborted?new p(`LLM request aborted`,`aborted`):new p(e instanceof Error?e.message:`Usage reservation failed`,`quota_exceeded`,{cause:e})}}function pe(e,t,n,r){return async i=>{try{await e.refundUsage?.({coalesced:t,signal:n})}catch(e){r(i,e)}}}async function T(e,t,n,r,i){if(r?.aborted)throw new p(`LLM request aborted`,`aborted`);let a=await fe(e,t,r),o=pe(e,t,r,i);if(r?.aborted)throw a&&await o(`[VernLLM] refundUsage failed after abort`),new p(`LLM request aborted`,`aborted`);let s;try{s=await n()}catch(e){throw a&&await o(`[VernLLM] refundUsage failed`),e}if(r?.aborted)throw a&&await o(`[VernLLM] refundUsage failed after abort`),new p(`LLM request aborted`,`aborted`);return s}async function me(e,t,n,r){if(n?.aborted)throw new p(`LLM request aborted`,`aborted`);let i=await fe(e,!1,n),a=pe(e,!1,n,r);if(n?.aborted)throw i&&await a(`[VernLLM] refundUsage failed after abort`),new p(`LLM request aborted`,`aborted`);let o;try{o=await t()}catch(e){throw i&&await a(`[VernLLM] refundUsage failed after stream-open failure`),e}let s=o.finalResult.then(e=>e,async e=>{throw i&&await a(`[VernLLM] refundUsage failed after stream error`),e});return s.catch(()=>{}),{chunks:o.chunks,finalResult:s}}function he(){let e=new Map;function t(t){return e.get(t)}function n(t,n){return e.set(t,n),n.catch(()=>{}).finally(()=>{e.get(t)===n&&e.delete(t)}),n}return{get:t,track:n}}function ge(e){return typeof e==`string`?e:JSON.stringify(e)??``}function _e(e,t){let n=[];if(t){let t=e;t.type===`tool_calls`?(t.toolCalls.forEach((e,t)=>{n.push({type:`tool_call_delta`,index:t,id:e.id,name:e.name,argsDelta:JSON.stringify(e.arguments??{}),complete:!0})}),t.content&&n.push({type:`text-delta`,delta:t.content})):n.push({type:`text-delta`,delta:ge(t.content)})}else n.push({type:`text-delta`,delta:ge(e)});return{async*[Symbol.asyncIterator](){for(let e of n)yield e}}}function ve(e,t){return{async*[Symbol.asyncIterator](){yield*_e(await e,t)}}}var ye=class{cache;logger;inFlight=he();constructor(e,t){this.cache=e,this.logger=t}async resolveCacheKey(e){return this.cache.resolveKey?await this.cache.resolveKey(e):e}async deleteCache(e){if(this.cache.delete)try{await this.cache.delete(await this.resolveCacheKey(e))}catch(e){this.logger.warn(`[VernLLM] cache delete failed: ${e instanceof Error?e.message:`unknown`}`)}}logRefundError(e,t){this.logger.error(e,{message:t instanceof Error?t.message:`unknown`,stack:t instanceof Error?t.stack:void 0})}async getCached(e){try{return await this.cache.get(e)}catch(e){return this.logger.warn(`[VernLLM] cache read failed: ${e instanceof Error?e.message:`unknown`}`),{hit:!1}}}async resolveKeyAndReadCache(e){let t=await this.resolveCacheKey(e.cacheKey);return{resolvedParams:t===e.cacheKey?e:{...e,cacheKey:t},cached:await this.getCached(t)}}joinInFlight(e,t){return T(e,!0,()=>t,e.signal,(e,t)=>this.logRefundError(e,t))}async runCached(e){let{resolvedParams:t,cached:n}=await this.resolveKeyAndReadCache(e);if(n.hit)return n.value;let r=this.inFlight.get(t.cacheKey);return r?this.joinInFlight(t,r):this.registerTrigger(t)}registerTrigger(e){let t=T(e,!1,()=>this.runAndCache(e),e.signal,(e,t)=>this.logRefundError(e,t));return this.inFlight.track(e.cacheKey,t),t}async runAndCache(e){let t=await e.fn();try{await this.cache.set(e.cacheKey,t,e.ttl)}catch(e){this.logger.warn(`[VernLLM] cache write failed: ${e instanceof Error?e.message:`unknown`}`)}return t}async runCachedStream(e,t){let{resolvedParams:n,cached:r}=await this.resolveKeyAndReadCache(e);if(r.hit){let e=r.value;return{chunks:_e(e,t),finalResult:Promise.resolve(e)}}let i=this.inFlight.get(n.cacheKey);if(i){let e=this.joinInFlight(n,i);return e.catch(()=>{}),{chunks:ve(e,t),finalResult:e}}return this.registerStreamTrigger(n)}registerStreamTrigger(e){let t,n,r=new Promise((e,r)=>{t=e,n=r});this.inFlight.track(e.cacheKey,r);let i=me(e,async()=>{let t=await e.openStream(),n=t.finalResult.then(async t=>{try{await this.cache.set(e.cacheKey,t,e.ttl)}catch(e){this.logger.warn(`[VernLLM] cache write failed: ${e instanceof Error?e.message:`unknown`}`)}return t},e=>{throw e});return{chunks:t.chunks,finalResult:n}},e.signal,(e,t)=>this.logRefundError(e,t));return i.then(e=>{e.finalResult.then(t,n)},e=>{n(e)}),i}};const be=1e4;function xe(e){return!e||e<=0||e===1/0?void 0:e}function Se(e){return Math.min(e,2147483647)}async function Ce(e,t,n){let r=new AbortController,i=xe(t),a=i===void 0?void 0:setTimeout(()=>{r.abort()},Se(i)),o=n?AbortSignal.any([n,r.signal]):r.signal;try{return await e(o)}catch(e){throw r.signal.aborted&&!n?.aborted&&e instanceof DOMException&&e.name===`AbortError`?new p(`Request timed out`,`timeout`,{code:`request_timeout`}):e}finally{clearTimeout(a)}}function we(e,t,n,r){let i=xe(t);if(i===void 0)return e();let a=!1;return new Promise((t,o)=>{let s=setTimeout(()=>{a=!0,n?.(),o(new p(`No stream chunk received for ${i}ms (idle timeout)`,`timeout`,{code:`idle_timeout`}))},Se(i));e().then(e=>{if(clearTimeout(s),a){r?.debug(`[VernLLM] chunk resolved after idle timeout already fired; discarding`);return}a=!0,t(e)},e=>{if(clearTimeout(s),a){r?.debug(`[VernLLM] chunk rejection arrived after idle timeout already fired; discarding`);return}a=!0,o(e)})})}const Te=[{name:`Retry-After-Ms`,kind:`ms`},{name:`X-Retry-After-Ms`,kind:`ms`},{name:`Retry-After`,kind:`seconds`},{name:`Retry-After`,kind:`date`}];function Ee(e,t){let n=e;if(typeof n.get==`function`)return n.get(t)??void 0;let r=Object.entries(e).find(([e])=>e.toLowerCase()===t.toLowerCase())?.[1];return typeof r==`string`?r:void 0}function E(e,t){return e<0?void 0:Math.min(e,t)}function De(e,t=be){if(!e||typeof e!=`object`)return;let n=e,r=n.headers??n.response?.headers;if(!(!r||typeof r!=`object`))for(let{name:e,kind:n}of Te){let i=Ee(r,e)?.trim();if(i){if(n===`ms`&&/^\d+$/.test(i))return E(Number(i),t);if(n===`seconds`&&/^\d+(\.\d+)?$/.test(i))return E(Number(i)*1e3,t);if(n===`date`){let e=Date.parse(i);if(!Number.isNaN(e))return E(e-Date.now(),t)}}}}function Oe(e){return Math.random()*e}function ke(e,t,n=be,r=!1,i=!1){return Oe(Math.min(e*(r?2:i?1.5:1)*2**t,n))}async function Ae(e,t){if(t?.aborted)throw new p(`Operation aborted`,`aborted`);await new Promise((n,r)=>{let i=()=>{clearTimeout(a),r(new p(`Operation aborted`,`aborted`))},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}function je(e,t,n,r){if(r?.aborted||e instanceof p&&!e.retryable)return!1;let i=n(e);return!(i!==void 0&&t.includes(i))}async function Me(e){let{requestId:t,model:n,attempt:r,error:i,state:a,signal:o,providerName:s,maxRetries:c,baseDelayMs:l,middleware:u,middlewareTimeoutMs:d,logger:f,reportEvent:p,buildEventContext:m,extractStatus:h,normalizeError:g,emitEvent:_}=e,v=De(i),y=h(i),b=v??ke(l,r,void 0,y===429,y!==void 0&&y>=500&&y<=599),x=v!==void 0;f.warn(`[VernLLM:${t}] recovery attempt ${r}/${c}, waiting ${Math.ceil(b)}ms`+(x?` (honoring Retry-After)`:``)),_({kind:`retry`,requestId:t,provider:s,model:n,attempt:r,maxRetries:c,delayMs:b,retryAfterHonored:x,error:g(i,o)},m(t,n,r,o,a),p,u,d,f),await Ae(b,o)}async function Ne(e){let{fn:t,maxRetries:n,signal:r,onAttempt:i,attempts:a,shouldRetryAttempt:o,recoverDelayForAttempt:s,normalizeError:c}=e,l,u;for(let e=0;e<=n;e++){u=void 0;try{return e>0&&await s(e,l),i?.(),await t(e,e=>{u=e})}catch(t){if(l=t,!(e<n&&o(t,r)))break;a?.push({index:e,error:c(t,r).toSnapshot(),request:u})}}throw l}var D=class{buckets;bucketStartMs=Date.now();bucketWidthMs;constructor(e){if(!Number.isFinite(e)||e<=0)throw RangeError(`RollingRatio: windowMs must be a finite number > 0, got ${e}`);this.bucketWidthMs=e/10,this.buckets=Array.from({length:10},()=>({total:0,failures:0}))}rotate(){let e=Date.now()-this.bucketStartMs,t=Math.floor(e/this.bucketWidthMs),n=Math.min(10,t);for(let e=0;e<n;e++)this.buckets.shift(),this.buckets.push({total:0,failures:0});t>0&&(this.bucketStartMs+=t*this.bucketWidthMs)}record(e){this.rotate();let t=this.buckets[9];t.total+=1,e&&(t.failures+=1)}getRatio(){this.rotate();let e=this.buckets.reduce((e,t)=>e+t.total,0),t=this.buckets.reduce((e,t)=>e+t.failures,0);return e===0?0:t/e}getCount(){return this.rotate(),this.buckets.reduce((e,t)=>e+t.total,0)}reset(){this.buckets=Array.from({length:10},()=>({total:0,failures:0})),this.bucketStartMs=Date.now()}};function Pe(e,t=`minCalls`){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer, got ${e}`)}function Fe(e,t){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`${t} must be a finite number between 0 and 1, got ${e}`)}function Ie(e){if(e===void 0)return;if(typeof e==`function`)return e;let{multiplier:t,maxMs:n=1/0}=e;return(e,r)=>Oe(Math.min(r*t**e,n))}var Le=class{threshold;failuresByKey=new Map;constructor(e){this.threshold=e}onSuccess(e){this.failuresByKey.set(e,0)}onFailure(e){let t=(this.failuresByKey.get(e)??0)+1;return this.failuresByKey.set(e,t),t>=this.threshold}reset(e){this.failuresByKey.set(e,0)}forget(e){this.failuresByKey.delete(e)}},Re=class{windowMs;minCalls;failureRatio;ratiosByKey=new Map;constructor(e,t,n){this.windowMs=e,this.minCalls=t,this.failureRatio=n,new D(e),Pe(t),Fe(n,`failureRatio`)}ratioFor(e){let t=this.ratiosByKey.get(e);return t||(t=new D(this.windowMs),this.ratiosByKey.set(e,t)),t}onSuccess(e){this.ratioFor(e).record(!1)}onFailure(e){let t=this.ratioFor(e);return t.record(!0),t.getCount()>=this.minCalls&&t.getRatio()>=this.failureRatio}reset(e){this.ratiosByKey.delete(e)}forget(e){this.ratiosByKey.delete(e)}};function ze(e){return`onFailure`in e?e:e.kind===`consecutive`?new Le(e.threshold):new Re(e.windowMs,e.minCalls,e.failureRatio)}function Be(){return{state:`closed`,consecutiveFailures:0,openedAt:0,trial:null,reopenCount:0,failuresByReason:new Map,cooldownMsForOpen:0}}function O(e){return e??``}const Ve=new WeakMap;function He(e,t){return!t||Ve.get(t.state)===e.trial}function Ue(e,t){let n=t??`unknown`;e.failuresByReason.set(n,(e.failuresByReason.get(n)??0)+1)}var We=class{cooldownMs;onStateChange;isolateByModel;halfOpenProbes;halfOpenSuccessRatio;cooldownBackoff;tripping;sharedBucket=Be();bucketsByModel=new Map;constructor(e={}){let t=e.threshold??5;this.cooldownMs=e.cooldownMs??3e4,this.onStateChange=e.onStateChange,this.isolateByModel=e.isolateByModel??!1;let n=e.halfOpenProbes;this.halfOpenProbes=Number.isFinite(n)?Math.max(1,Math.floor(n)):1;let r=e.halfOpenSuccessRatio;this.halfOpenSuccessRatio=Number.isFinite(r)?Math.min(1,Math.max(0,r)):1,this.cooldownBackoff=Ie(e.cooldownBackoff),this.tripping=ze(e.tripping??{kind:`consecutive`,threshold:t})}assertClosed(e,t){let n=this.ensureBucketFor(e);if(n.state!==`closed`){if(n.state===`open`){let r=Date.now()-n.openedAt,i=n.cooldownMsForOpen;if(r<i)throw new p(`Circuit open, provider has failed ${n.consecutiveFailures} times in a row. Retry in ${Math.ceil((i-r)/1e3)}s.`,`circuit_open`,{code:`circuit_cooling_down`});n.trial={slotsRemaining:this.halfOpenProbes-1,successes:0,failures:0},t&&Ve.set(t.state,n.trial),this.transition(n,`half-open`,e,t);return}if(!n.trial||n.trial.slotsRemaining<=0)throw new p(`Circuit half-open. Every trial slot is already in flight. Try again shortly.`,`circuit_open`,{code:`circuit_trial_in_flight`});--n.trial.slotsRemaining,t&&Ve.set(t.state,n.trial)}}recordSuccess(e,t){let n=this.lookupBucket(e);if(n){if(n.state===`half-open`&&n.trial&&He(n,t)){n.trial.successes+=1,this.settleTrialIfComplete(n,e,t);return}n.state!==`half-open`&&(n.consecutiveFailures=0,this.tripping.onSuccess(this.trippingKeyFor(e)),n.trial=null,n.reopenCount=0,n.failuresByReason.clear(),this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.forgetModel(e))}}recordFailure(e,t,n){let r=this.ensureBucketFor(e);if(r.state===`half-open`&&r.trial&&He(r,t)){r.trial.failures+=1,Ue(r,n),this.settleTrialIfComplete(r,e,t);return}r.state!==`half-open`&&(r.consecutiveFailures+=1,Ue(r,n),this.tripping.onFailure(this.trippingKeyFor(e))&&this.openBucket(r,e,t))}getState(e){return this.lookupBucket(e)?.state??`closed`}getFailureBreakdown(e){let t=this.lookupBucket(e);return t?Object.fromEntries(t.failuresByReason):{}}open(e,t){let n=this.ensureBucketFor(e);n.trial=null,this.openBucket(n,e,t)}close(e,t){let n=this.ensureBucketFor(e);n.consecutiveFailures=0,this.tripping.reset(this.trippingKeyFor(e)),n.trial=null,n.reopenCount=0,n.failuresByReason.clear(),this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.forgetModel(e)}openBucket(e,t,n){e.openedAt=Date.now(),e.cooldownMsForOpen=this.computeCooldown(e),this.transition(e,`open`,t,n)}computeCooldown(e){if(!this.cooldownBackoff)return this.cooldownMs;let t=this.cooldownBackoff(e.reopenCount,this.cooldownMs);return Number.isNaN(t)?0:Math.max(0,t)}lookupBucket(e){return this.isolateByModel?this.bucketsByModel.get(O(e)):this.sharedBucket}trippingKeyFor(e){return this.isolateByModel?O(e):``}ensureBucketFor(e){if(!this.isolateByModel)return this.sharedBucket;let t=O(e),n=this.bucketsByModel.get(t);return n||(n=Be(),this.bucketsByModel.set(t,n)),n}forgetModel(e){this.bucketsByModel.delete(O(e)),this.tripping.forget?.(this.trippingKeyFor(e))}transition(e,t,n,r){if(t===e.state)return;let i=e.state;e.state=t,this.onStateChange?.(i,t,e.consecutiveFailures,n,r)}settleTrialIfComplete(e,t,n){let r=e.trial;if(!r||r.successes+r.failures<this.halfOpenProbes)return;let i=r.successes/this.halfOpenProbes;if(e.trial=null,i>=this.halfOpenSuccessRatio){e.consecutiveFailures=0,this.tripping.onSuccess(this.trippingKeyFor(t)),e.reopenCount=0,e.failuresByReason.clear(),this.transition(e,`closed`,t,n),this.isolateByModel&&e.state===`closed`&&this.forgetModel(t);return}e.reopenCount+=1,this.openBucket(e,t,n)}},Ge=class{options;ratio;constructor(e){this.options=e,this.ratio=new D(e.windowMs),Pe(e.minCalls),Fe(e.retryRatio,`retryRatio`)}assertAvailable(){if(this.ratio.getCount()>=this.options.minCalls&&this.ratio.getRatio()>=this.options.retryRatio)throw new p(`Retry budget exhausted`,`rate_limited`,{code:`retry_budget_exhausted`})}recordAttempt(e){this.ratio.record(e)}getSnapshot(){return{attempts:this.ratio.getCount(),retryRatio:this.ratio.getRatio()}}};function k(e,t,n){e.error(`[VernLLM] ${t} failed`,{message:n instanceof Error?n.message:`unknown`,stack:n instanceof Error?n.stack:void 0})}function Ke(e){return{debug:A(e,`debug`),warn:A(e,`warn`),error:A(e,`error`)}}function A(e,t){let n=e[t].bind(e);return((...e)=>{try{Je(n(...e))}catch{}})}function qe(e){return typeof e?.then==`function`}function Je(e){qe(e)&&Promise.resolve(e).catch(()=>{})}function j(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.status==`number`)return t.status;if(typeof t.statusCode==`number`)return t.statusCode;if(typeof t.$metadata?.httpStatusCode==`number`)return t.$metadata.httpStatusCode}const Ye=new Set([`ECONNREFUSED`,`ENOTFOUND`,`ECONNRESET`,`ETIMEDOUT`,`EAI_AGAIN`,`EPIPE`,`ECONNABORTED`,`EHOSTUNREACH`,`ENETUNREACH`]),Xe=new Set([`fetch failed`,`failed to fetch`,`load failed`,`networkerror when attempting to fetch resource.`]);function Ze(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.code==`string`&&Ye.has(t.code)||typeof t.message==`string`&&Xe.has(t.message.toLowerCase()))return!0;if(t.cause&&typeof t.cause==`object`){let e=t.cause;if(typeof e.code==`string`&&Ye.has(e.code))return!0}return!1}function Qe(e){try{return JSON.stringify(e,null,2)??String(e)}catch{try{return String(e)}catch{return`[unprintable error]`}}}function $e(e){if(e&&typeof e==`object`)try{let t=e;if(t.error!==void 0)return Qe(t.error);if(typeof t.message==`string`)return t.message}catch{}return Qe(e)}function et(e){switch(e){case 429:return`provider_rate_limited`;case 401:return`authentication`;case 403:return`authorization`;case 404:return`not_found`;case 413:return`payload_too_large`;default:return e>=500?`server_error`:void 0}}const tt=/\(no body\)/i;function nt(e){return Object.keys(e).length===0}function rt(e){if(e&&typeof e==`object`){let{error:t,message:n}=e;if(t!=null){let e=typeof t==`string`&&t.trim().length===0,n=typeof t==`object`&&nt(t);if(!e&&!n)return!1}if(typeof n==`string`){let e=n.trim();return e.length===0||tt.test(e)}return!0}return!0}function M(e,t,n){if(t?.aborted)return new p(`LLM request aborted`,`aborted`,{attempts:n});if(e instanceof p)return e.code===void 0&&e.status!==void 0&&(e.code=et(e.status)),e.attempts===void 0&&n!==void 0&&(e.attempts=n),e;let r=j(e),i=De(e);if(r!==void 0){let t=$e(e),a=et(r),o=a===void 0;return new p(rt(e)?o?`LLM request failed with status ${r} and no error detail from the provider. This usually means a field or value in the request isn't supported by the specific model (for example, a reasoning/thinking parameter the model doesn't accept), rather than a transport or auth problem.`:`LLM request failed with status ${r} and no error detail from the provider.`:`LLM request failed: ${t}`,`api`,{status:r,cause:e,retryAfterMs:i,code:a,attempts:n})}return Ze(e)?new p(`LLM request failed`,`network`,{cause:e,retryAfterMs:i,code:`connection_failed`,attempts:n}):new p(`LLM request failed`,`unknown`,{cause:e,retryAfterMs:i,attempts:n})}function N(e,t){return e.name??`[${t}]`}function it(e,t,n){return t<=0?e():new Promise((r,i)=>{let a=setTimeout(()=>{i(new p(`middleware "${n}" timed out after ${t}ms`,`timeout`,{code:`middleware_timeout`}))},t);e().then(e=>{clearTimeout(a),r(e)},e=>{clearTimeout(a),i(e)})})}async function P(e,t,n,r,i){let{enabled:a}=e;if(a===void 0)return!0;if(typeof a==`boolean`)return a;let o=e.timeoutMs??r;try{return await it(async()=>a(t),o,n)}catch(e){return i.error(`[VernLLM] middleware "${n}".enabled threw or timed out, treating as disabled`,{message:e instanceof Error?e.message:`unknown`,stack:e instanceof Error?e.stack:void 0}),!1}}const at=[`temperature`,`max_tokens`,`reasoning_effort`,`budget_tokens`,`tool_choice`,`messages`,`addMessages`,`tools`,`addTools`];function ot(e,t){let n=t,r=at.filter(e=>t[e]!==void 0);if(n.model!==void 0&&r.push(`model`),n.response_format!==void 0&&r.push(`response_format`),r.length===0)return{request:e,patchedFields:[]};let i={...e};return n.model!==void 0&&(i.model=n.model),n.response_format!==void 0&&(i.response_format=n.response_format),t.temperature!==void 0&&(i.temperature=t.temperature),t.max_tokens!==void 0&&(i.max_tokens=t.max_tokens),t.reasoning_effort!==void 0&&(i.reasoning_effort=t.reasoning_effort),t.budget_tokens!==void 0&&(i.budget_tokens=t.budget_tokens),t.tool_choice!==void 0&&(i.tool_choice=t.tool_choice),t.messages!==void 0&&(i.messages=t.messages),t.addMessages!==void 0&&t.addMessages.length>0&&(i.messages=[...i.messages,...t.addMessages]),t.tools!==void 0&&(i.tools=t.tools),t.addTools!==void 0&&t.addTools.length>0&&(i.tools=[...i.tools??[],...t.addTools]),{request:i,patchedFields:r}}function st(e,t){if(!e.tools)return;let n=new Set,r=new Set;for(let t of e.tools)n.has(t.function.name)&&r.add(t.function.name),n.add(t.function.name);if(r.size>0)throw new p(`middleware "${t}" added tool(s) with duplicate name(s): [${[...r].join(`, `)}]. Tool names must be unique.`,`invalid_params`,{code:`duplicate_tool_names`,issues:{names:[...r]}})}function ct(e,t,n){if(t.model!==e.model)throw new p(`middleware "${n}" changed \`model\` via transform, which isn't supported. Configure the target's model instead.`,`invalid_params`);if(JSON.stringify(t.response_format)!==JSON.stringify(e.response_format))throw new p(`middleware "${n}" changed \`response_format\` via transform, which isn't supported.`,`invalid_params`)}async function lt(e){let{request:t,requestId:n,attempt:r,signal:i,state:a,middleware:o,middlewareTimeoutMs:s,logger:c,reportEvent:l,buildContext:u}=e;if(o.length===0)return t;let d=t,f=t;for(let[e,t]of o.entries()){let d=N(t,e),p=u(r,i,a);if(!await P(t,p,d,s,c)){t.enabled!==void 0&&F({kind:`middleware`,requestId:n,middleware:d,hook:`enabled_skip`},p,l,o,s,c);continue}if(!t.transform)continue;let m=await ut(t,structuredClone(f),p,d,s),{request:h,patchedFields:g}=ot(f,m);g.length>0&&((m.tools!==void 0||m.addTools?.length)&&st(h,d),F({kind:`middleware`,requestId:n,middleware:d,hook:`transform`,patchedFields:g},p,l,o,s,c)),f=h}return ct(d,f,`chain`),f}async function ut(e,t,n,r,i){if(!e.transform)return{};let a=e.timeoutMs??i;try{return await it(async()=>e.transform(t,n),a,r)}catch(e){throw dt(e,r,n.signal)}}function dt(e,t,n){let r=M(e,n);return r.type===`unknown`?new p(`middleware "${t}" threw: ${r.message}`,`invalid_params`,{code:`middleware_threw`,cause:e}):r}function F(e,t,n,r,i,a){n(e),r.length!==0&&ft(r,e,t,i,a)}async function ft(e,t,n,r,i){for(let a=0;a<e.length;a++){let o=e[a];if(!o.onEvent)continue;let s=N(o,a);if(await P(o,n,s,r,i))try{Promise.resolve(o.onEvent(t,{...n,own:{}})).catch(e=>{k(i,`middleware "${s}".onEvent`,e)})}catch(e){k(i,`middleware "${s}".onEvent`,e)}}}function I(e,t){return e.name??String(t)}function pt(e){let t=e.map(I),n=new Set;for(let e of t){if(n.has(e))throw Error(`middleware ordering has a duplicate name "${e}"; every middleware's resolved name must be unique`);n.add(e)}}function mt(e,t,n,r,i,a){if(!t.has(r)){a?.warn?.(`middleware "${n}" references unknown name "${r}" in runsAfter/runsBefore, ignoring it`);return}let o=i?r:n,s=i?n:r;e.get(o).mustPrecede.push(s)}function ht(e,t){let n=e.map(I),r=new Set(n),i=e.map((e,t)=>({id:n[t],entry:e,index:t,mustPrecede:[]})),a=new Map(i.map(e=>[e.id,e]));for(let e of i){for(let n of e.entry.runsAfter??[])mt(a,r,e.id,n,!0,t);for(let n of e.entry.runsBefore??[])mt(a,r,e.id,n,!1,t)}return i}function gt(e,t){let n=(e.entry.priority??0)-(t.entry.priority??0);return n===0?e.index-t.index:n}function _t(e){let t=new Map(e.map(e=>[e.id,e])),n=new Map(e.map(e=>[e.id,0]));for(let t of e)for(let e of t.mustPrecede)n.set(e,n.get(e)+1);let r=e.filter(e=>n.get(e.id)===0),i=[],a=new Set;for(;r.length>0;){r.sort(gt);let e=r.shift();i.push(e.entry),a.add(e.id);for(let i of e.mustPrecede){let e=n.get(i)-1;n.set(i,e),e===0&&r.push(t.get(i))}}if(i.length<e.length){let t=e.filter(e=>!a.has(e.id)).map(e=>e.id);throw Error(`middleware ordering has a cycle among: ${t.join(`, `)}`)}return i}function vt(e,t){pt(e);let n=e.some(e=>e.runsAfter?.length||e.runsBefore?.length);return e.length<=1&&!n?[...e]:n?_t(ht(e,t)):e.map((e,t)=>({id:I(e,t),entry:e,index:t,mustPrecede:[]})).sort(gt).map(e=>e.entry)}function yt(e){let t=[],n=[],r=[];for(let i of e)i.position===`outermost`?t.push(i):i.position===`innermost`?n.push(i):r.push(i);let i=[...r].sort((e,t)=>(typeof e.position==`number`?e.position:0)-(typeof t.position==`number`?t.position:0));return[...t,...i,...n]}function bt(e,t){let n=vt(e,t);return{transformOrder:n,wrapOrder:yt(n),names:Object.freeze(n.map(I))}}function L(e,t){return n=>{if(e)try{e(n)}catch(e){k(t,`onEvent`,e)}}}function R(e,t,n){let r=e[t];if(!r)throw RangeError(`${n}: no target at index ${t} (chain has ${e.length} target${e.length===1?``:`s`})`);return r}function z(e,t,n,r){t!==void 0&&!e&&r.warn(`[VernLLM] ${n}: \`model: '${t}'\` has no effect here. This target's circuitBreaker doesn't have isolateByModel on, so it only tracks one shared circuit regardless of \`model\`. Omit \`model\`, or set \`circuitBreaker.isolateByModel: true\` on this target if per-model tracking is what you want.`)}function xt(e,t,n,r,i,a,o,s,c){if(!e)return;let l=typeof e==`object`?e:void 0,u=l?.onStateChange,d=L(r,i);return new We({...l,onStateChange:(e,r,l,f,p)=>{let m={kind:`circuit_state`,provider:t,model:f??n,from:e,to:r,consecutiveFailures:l};if(p?F(m,{stage:`attempt`,requestId:p.requestId,requestedProvider:t,requestedModel:f??n,isFallbackAttempt:s,attempt:p.attempt??1,capabilities:{supportsJsonObjectMode:c},signal:p.signal,state:p.state,own:{},registeredMiddlewareNames:a.map(I)},d,a,o,i):d(m),u)try{u(e,r,l,f,p)}catch(e){k(i,`circuitBreaker.onStateChange`,e)}}})}function St(e){let t=/^(?:(\d+(?:\.\d+)?)h)?(?:(\d+(?:\.\d+)?)m)?(?:(\d+(?:\.\d+)?)s)?(?:(\d+)ms)?$/.exec(e.trim());if(!t||t[0]===``)return;let[,n,r,i,a]=t,o=(n?parseFloat(n)*36e5:0)+(r?parseFloat(r)*6e4:0)+(i?parseFloat(i)*1e3:0)+(a?parseInt(a,10):0);return Number.isFinite(o)?o:void 0}function B(e,t){let n=e.get(t);if(n===null)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function V(e){let t=e.get(`x-ratelimit-reset-requests`);return{limitRequests:B(e,`x-ratelimit-limit-requests`),remainingRequests:B(e,`x-ratelimit-remaining-requests`),resetAfterMs:t===null?void 0:St(t)}}function Ct(e){let t=e.get(`anthropic-ratelimit-requests-reset`),n=t===null?NaN:Date.parse(t);return{limitRequests:B(e,`anthropic-ratelimit-requests-limit`),remainingRequests:B(e,`anthropic-ratelimit-requests-remaining`),resetAfterMs:Number.isFinite(n)?Math.max(0,n-Date.now()):void 0}}const wt=Symbol(`vernLLMProviderRateLimitHint`);function H(e,t){t&&Object.defineProperty(e,wt,{value:t,enumerable:!1,configurable:!0})}function Tt(e){if(!(!e||typeof e!=`object`))return e[wt]}function Et(e){let{breaker:t,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,registeredMiddlewareNames:s}=e;function c(e,t,c){return{stage:`attempt`,requestId:n,requestedProvider:i,requestedModel:r,isFallbackAttempt:a,attempt:e+1,capabilities:{supportsJsonObjectMode:o},signal:t,state:c,own:{},registeredMiddlewareNames:s}}function l(e,t,r){return{requestId:n,state:r,signal:t,attempt:e+1}}return{buildAttemptContext:c,buildCallContext:l,recordSuccess(e,n,i){t?.recordSuccess(r,l(e,n,i))},recordFailure(e,n,i,a){t?.recordFailure(r,l(e,n,i),a)}}}function Dt(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function Ot(e){return e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments??{})}}))}function kt(e){return e.map(e=>{let t;try{t=e.function.arguments.trim()?JSON.parse(e.function.arguments):{}}catch{throw new p(`Invalid JSON arguments for tool call "${e.function.name}"`,`parse`,{code:`tool_arguments_parse_failed`})}return{id:e.id,name:e.function.name,arguments:t}})}function At(e){return typeof e==`string`?e:JSON.stringify(e)}function jt(e,t){if(e&&e.length===0)throw new p("`tools` was an empty array. This is almost always a bug (e.g. a filtered tool list that ended up empty). An empty `tools` array still switches on tool-call mode (response shape, jsonMode default, wire format) with nothing for the model to call. Omit `tools` entirely for a normal call, or make sure the array is non-empty.",`invalid_params`);if(e){let t=new Set,n=new Set;for(let r of e)t.has(r.name)&&n.add(r.name),t.add(r.name);if(n.size)throw new p(`\`tools\` has duplicate name(s): [${[...n].join(`, `)}]. Tool names must be unique.`,`invalid_params`,{code:`duplicate_tool_names`,issues:{names:[...n]}})}if(t&&!e)throw new p("`toolChoice` was set without `tools`. There is nothing for it to choose between. Set `tools`, or remove `toolChoice`.",`invalid_params`);if(e&&typeof t==`object`&&!e.some(e=>e.name===t.name))throw new p(`toolChoice names "${t.name}", which is not in \`tools\` ([${e.map(e=>e.name).join(`, `)}]).`,`invalid_params`,{code:`unknown_tool_choice`,issues:{requested:t.name,available:e.map(e=>e.name)}})}function Mt(e){let{jsonModeExplicit:t,hasTools:n,jsonSchema:r,hasSchema:i,supportsJsonObjectMode:a}=e,o=t??!n;if(!a&&!r&&t===!0)throw new p('jsonMode: true was set explicitly, but this client does not support `response_format: "json_object"` (see LLMClient.supportsJsonObjectMode). Neither Anthropic nor Bedrock has a field that mechanically guarantees JSON output for this mode. Use `jsonSchema` instead, which maps to a real constraint on both.',`invalid_params`);if(!a&&!r&&t===void 0&&i)throw new p('`schema` was provided, which requires JSON output to validate against, but this client does not support `response_format: "json_object"` (see LLMClient.supportsJsonObjectMode) and no `jsonSchema` was set. Neither Anthropic nor Bedrock has a field that mechanically guarantees JSON output without one. Use `jsonSchema` instead, which maps to a real constraint on both and still runs `schema` against its parsed result.',`invalid_params`);let s=(!a&&!r&&t===void 0?!1:o)||!!r;if(i&&!s)throw new p(`schema was provided but jsonMode: false disables JSON parsing, so nothing would validate it. Remove jsonMode: false, set jsonSchema, or remove schema.`,`invalid_params`);return s}function Nt(e,t){return e?{type:`json_schema`,json_schema:{name:e.name,schema:e.schema,strict:e.strict??!0,description:e.description}}:t?{type:`json_object`}:void 0}function Pt(e){return!e||e===`auto`?`auto`:e===`none`||e===`required`?e:{type:`function`,function:{name:e.name}}}function Ft(e){return e.role===`tool`?(e.toolResults??[]).map(e=>({role:`tool`,tool_call_id:e.toolCallId,content:typeof e.content==`string`?e.content:JSON.stringify(e.content??null),...e.isError?{is_error:!0}:{}})):e.role===`assistant`&&e.toolCalls?.length?[{role:`assistant`,...e.content===void 0?{}:{content:At(e.content)},tool_calls:Ot(e.toolCalls)}]:e.role===`assistant`?[{role:`assistant`,content:At(e.content===void 0?``:e.content)}]:[{role:e.role,content:e.content??``}]}function It(e){let t;for(let[n,r]of e.entries()){if(r.role===`tool`){if(t?.role!==`assistant`||!t.toolCalls?.length)throw new p(`history[${n}] is a "tool" turn, but must immediately follow an "assistant" turn that requested tools`,`invalid_params`);if(!r.toolResults?.length)throw new p(`history[${n}] is a "tool" turn but has no toolResults`,`invalid_params`);let e=new Set(t.toolCalls.map(e=>e.id)),i=r.toolResults.map(e=>e.toolCallId),a=i.filter(t=>!e.has(t));if(a.length)throw new p(`history[${n}].toolResults references unknown toolCallId(s) [${a.join(`, `)}]`,`invalid_params`,{code:`unknown_tool_result_ids`,issues:{historyIndex:n,ids:a}});let o=new Set,s=new Set;for(let e of i)o.has(e)&&s.add(e),o.add(e);if(s.size)throw new p(`history[${n}].toolResults has duplicate toolCallId(s) [${[...s].join(`, `)}]`,`invalid_params`,{code:`duplicate_tool_result_ids`,issues:{historyIndex:n,ids:[...s]}});let c=[...e].filter(e=>!i.includes(e));if(c.length)throw new p(`history[${n}] is missing toolResults for toolCallId(s) [${c.join(`, `)}]`,`invalid_params`,{code:`missing_tool_results`,issues:{historyIndex:n,ids:c}})}else{if(r.role===t?.role)throw new p(`history must alternate user/assistant turns: consecutive "${r.role}" turns at history[${n-1}] and history[${n}]`,`invalid_params`);if(t?.role===`assistant`&&t.toolCalls?.length)throw new p(`history[${n}] follows an assistant tool request without tool results`,`invalid_params`)}t=r}if(t?.role===`assistant`&&t.toolCalls?.length)throw new p(`The last entry in history is an assistant tool request without tool results`,`invalid_params`);if(t?.role===`user`)throw new p(`The last entry in history is a "user" turn, which would collide with the current userContent turn.`,`invalid_params`)}var Lt=class{model;defaultMaxTokens;defaultTemperature;defaultReasoningEffort;defaultBudgetTokens;supportsJsonObjectMode;constructor(e){this.model=e.model,this.defaultMaxTokens=e.defaultMaxTokens,this.defaultTemperature=e.defaultTemperature,this.defaultReasoningEffort=e.defaultReasoningEffort,this.defaultBudgetTokens=e.defaultBudgetTokens,this.supportsJsonObjectMode=e.supportsJsonObjectMode}build(e){let{systemPrompt:t,userContent:n,history:r=[],maxTokens:i=this.defaultMaxTokens,model:a=this.model,jsonSchema:o,tools:s,toolChoice:c}=e,l=e.temperature===void 0?this.defaultTemperature:e.temperature,u=e.reasoningEffort===void 0?this.defaultReasoningEffort:e.reasoningEffort,d=e.budgetTokens===void 0?this.defaultBudgetTokens:e.budgetTokens;jt(s,c);let f=Mt({jsonModeExplicit:e.jsonMode,hasTools:!!s,jsonSchema:o,hasSchema:!!e.schema,supportsJsonObjectMode:this.supportsJsonObjectMode}),p=Nt(o,f);return It(r),{useJson:f,model:a,request:{model:a,...l===null?{}:{temperature:l},max_tokens:i,...p?{response_format:p}:{},...u?{reasoning_effort:u}:{},...d==null?{}:{budget_tokens:d},...s?{tools:Dt(s)}:{},...s?{tool_choice:Pt(c)}:{},messages:[...t?[{role:`system`,content:t}]:[],...r.flatMap(e=>Ft(e)),{role:`user`,content:n}]}}}};function Rt(e,t,n){let r;try{r=n(e)}catch{throw new p(`Invalid JSON response`,`parse`)}if(r==null)throw new p(`Invalid JSON response`,`parse`);if(!t)return r;let i=t.safeParse(r);if(!i.success)throw new p(`Schema validation failed`,`validation`,{issues:i.error});return i.data}function zt(e,t){let n=new Map(t.map(e=>[e.name,e])),r=new Set,i=[];for(let t of e)r.has(t.id)&&i.push({name:t.name,toolCallId:t.id,code:`duplicate_tool_call_id`}),r.add(t.id),n.has(t.name)||i.push({name:t.name,toolCallId:t.id,code:`unknown_tool`});if(i.length>0){let e=i.find(e=>e.code===`unknown_tool`),t=e?`Model requested tool "${e.name}", which was not in the tools offered ([${[...n.keys()].join(`, `)}]).`:`Duplicate tool call id "${i[0].toolCallId}" in the model's response.`;throw new p(i.length>1?`${t} (${i.length} tool call issues total, see error.issues.)`:t,`validation`,{code:e?`unknown_tool`:`duplicate_tool_call_id`,issues:i})}for(let t of e){let e=n.get(t.name);if(!e?.argumentsSchema)continue;let r=e.argumentsSchema.safeParse(t.arguments);if(!r.success)throw new p(`Arguments for tool call "${t.name}" failed validation`,`validation`,{issues:r.error})}}function Bt(e){let{rawContent:t,wireToolCalls:n,params:r,useJson:i,parseJson:a,requestId:o,logger:s,redactText:c}=e,l=t?.trim();if(!l&&!n?.length)throw new p(`Empty LLM response`,`api`,{code:`empty_response`});let u=c(l??`[${n.length} tool call(s)]`),d=u.length>800;if(s.debug(`[VernLLM:${o}] output:\n`+u.slice(0,800)+(d?`... (truncated, ${u.length} chars total)`:``)),n?.length){if(!r.tools)throw new p("Provider returned tool_calls but no `tools` were sent with this call.",`validation`,{code:`unexpected_tool_calls`});if(r.toolChoice===`none`)throw new p(`Provider returned tool_calls despite toolChoice: 'none'.`,`validation`,{code:`tool_choice_none_violated`});let e=kt(n);return zt(e,r.tools),{type:`tool_calls`,toolCalls:e,...l?{content:l}:{}}}let f=l??``;if(!i)return r.tools?{type:`content`,content:f}:f;let m=Rt(f,r.schema,a);return r.tools?{type:`content`,content:m}:m}function Vt(e,t,n,r,i,a,o,s,c){let{gateway:l,usageReporter:u,logger:d,redactText:f,parseJson:m,detectSoftFailure:h}=c;try{let g=Bt({rawContent:e,wireToolCalls:t,params:n,useJson:r,parseJson:m,requestId:a,logger:d,redactText:f}),_=Ht(h,g,{requestId:a,model:c.model,providerName:c.providerName,isFallback:c.isFallback,attempt:o+1},d);if(_!==void 0)throw new p(`Soft failure detected`,`api`,{code:_});return l.recordSuccess(o,n.signal,s),u.reportSuccess(i),g}catch(e){let t=M(e,n.signal);throw i&&t.type!==`aborted`&&u.reportFailure(i,t,o),t}}function Ht(e,t,n,r){if(e)try{return e(t,n)}catch(e){let t=e instanceof Error?e.message:String(e),n=e instanceof Error&&e.stack?`\n${e.stack}`:``;r.warn(`[VernLLM] detectSoftFailure threw and was ignored, treated as no soft failure: ${t}${n}`);return}}function Ut(e){let{capacity:t,logger:n,label:r}=e,i=[],a=[],o=!1,s=!1,c,l=!1;function u(e){let o=a.shift();if(o){o.resolve({done:!1,value:e});return}i.push(e),i.length>t*2&&(l||(l=!0,n.warn(`[VernLLM] ${r} buffer exceeded cap (${t}), evicting ${i.length-t} oldest item(s); buffered=${i.length}. The iterable was never read (or fell far behind) for this channel.`)),i.splice(0,i.length-t))}function d(){o=!0;for(let e of a.splice(0))e.resolve({done:!0,value:void 0})}function f(e){o=!0,s=!0,c=e;for(let t of a.splice(0))t.reject(e)}return{push:u,finish:d,fail:f,iterable:{[Symbol.asyncIterator](){return{next(){return i.length?Promise.resolve({done:!1,value:i.shift()}):o?s?Promise.reject(c):Promise.resolve({done:!0,value:void 0}):new Promise((e,t)=>{a.push({resolve:e,reject:t})})}}}}}}const Wt=1e4,Gt=1e6;function Kt(){let e=new Map;function t(t){let n=e.get(t.index);if(!n){if(e.size>=Wt)throw new p(`Stream contained more than ${Wt} distinct tool calls`,`validation`);n={args:``}}let r=t.argumentsDelta??``;if(n.args.length+r.length>Gt)throw new p(`Tool call arguments exceeded the ${Gt}-character stream limit`,`validation`);return n.id??=t.id,n.name??=t.name,n.args+=r,e.set(t.index,n),{type:`tool_call_delta`,index:t.index,id:t.id,name:t.name,argsDelta:t.argumentsDelta,complete:t.complete}}function n(){if(e.size)return[...e.entries()].sort(([e],[t])=>e-t).map(([,e])=>({id:e.id??``,type:`function`,function:{name:e.name??``,arguments:e.args}}))}return{apply:t,toWireToolCalls:n}}async function qt(e,t){try{await e.return?.()}catch{}t.abort()}function Jt(e,t,n){let{requestId:r,model:i,providerName:a,isFallback:o,chunkIdleTimeoutMs:s,streamController:c,logger:l,signal:u,onRateLimitHint:d}=n,f,p,m=new Promise((e,t)=>{f=e,p=t});m.catch(()=>{});let h=Ut({capacity:1e4,logger:l,label:`stream chunk`}),{push:g,finish:_,fail:v}=h,y=h.iterable,b=Kt(),x=``,S;return(async()=>{try{let n=t;for(;!n.done;){let t=n.value;t.type===`ping`||(t.type===`rate_limit_hint`?d?.(t.hint):t.type===`text-delta`?(x+=t.delta,g({type:`text-delta`,delta:t.delta})):t.type===`tool_call_delta`?g(b.apply(t)):t.type===`usage`&&(S=de(t.usage,{requestId:r,model:i,providerName:a,isFallback:o}),g({type:`usage`,usage:S}))),n=await we(()=>e.next(),s,()=>c.abort(),l)}}catch(t){await qt(e,c);let r=M(t,u);try{n.onStreamFailure(r,S)}catch{}v(r),p(r);return}_();try{n.onStreamSuccess(S)}catch{}try{let e=b.toWireToolCalls(),t=n.finalize(x,e,S);f(t)}catch(e){p(e)}})(),{chunks:y,finalResult:m}}function Yt(e){let{providerName:t,isFallback:n,maxRetries:r,onUsage:i,onUsageFailure:a,logger:o}=e;function s(e,r,i){if(e.usage)return de(e.usage,{requestId:r,model:i,providerName:t,isFallback:n})}function c(e){if(e)return e.totalTokens||e.promptTokens+e.completionTokens}function l(e){if(!(!e||!i))try{i(e)}catch(e){k(o,`onUsage`,e)}}function u(e,t,n,i=!1){let s=e.totalTokens||e.promptTokens+e.completionTokens,c=i?`mid-stream failure (terminal, no further attempts)`:`attempt ${n+1}/${r+1}`;if(o.warn(`[VernLLM:${e.requestId}] usage failure, ${c}: type=${t.type} tokens=${s}`),a)try{a(e,t)}catch(e){k(o,`onUsageFailure`,e)}}return{extract:s,actualTokensFor:c,reportSuccess:l,reportFailure:u}}async function Xt(e,t,n,r){if(!e)return{};let i=await e.acquire(e.estimate(t),n);return i.waitedMs>0&&r(i.waitedMs,i.reason??`rpm`),{release:i.release}}async function Zt(e){let{params:t,requestId:n,attempt:r,onRequest:i,middlewareState:a,gateway:o,requestBuilder:s,providerName:c,limiter:l,middleware:u,middlewareTimeoutMs:d,logger:p,reportEvent:m}=e,h=a??w(),g=s.build(t),{useJson:_,model:v}=g,y=await lt({request:g.request,requestId:n,attempt:r,signal:t.signal,state:h,middleware:u,middlewareTimeoutMs:d,logger:p,reportEvent:m,buildContext:(e,t,n)=>o.buildAttemptContext(e,t,n)});i?.(f(c,v,y,void 0,Date.now()));let{release:b}=await Xt(l,y,t.signal,(e,i)=>{F({kind:`rate_limited`,requestId:n,provider:c,model:v,waitedMs:e,reason:i},o.buildAttemptContext(r,t.signal,h),m,u,d,p)});return{request:y,model:v,useJson:_,state:h,release:b}}async function Qt(e){let{fn:t,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,breaker:s,budget:c,maxRetries:l,baseDelayMs:u,nonRetryableStatus:d,signal:f,onAttempt:p,middleware:m,middlewareTimeoutMs:h,logger:g,reportEvent:_,logLabel:v,redactText:y,countsTowardBreaker:b}=e,x=e.state??w(),S=[],C=Et({breaker:s,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,registeredMiddlewareNames:Object.freeze(m.map(I))}),ee;try{return await Ne({fn:(e,n)=>(c?.recordAttempt(e>0),t(e,n,x,C)),maxRetries:l,signal:f,onAttempt:p,attempts:S,shouldRetryAttempt:(e,t)=>{if(!je(e,d,j,t))return!1;if(c)try{c.assertAvailable()}catch(e){return ee=e,!1}return!0},recoverDelayForAttempt:(e,t)=>Me({requestId:n,model:r,attempt:e,error:t,state:x,signal:f,providerName:i,maxRetries:l,baseDelayMs:u,middleware:m,middlewareTimeoutMs:h,logger:g,reportEvent:_,buildEventContext:(e,t,n,r,i)=>C.buildAttemptContext(n,r,i),extractStatus:j,normalizeError:M,emitEvent:F}),normalizeError:M})}catch(e){let t=M(ee??e,f,S.length>0?S:void 0);throw b(t)&&C.recordFailure(S.length,f,x,t.code),g.debug(`[VernLLM:${n}] ${v}:\n${y($e(e))}`),t}}function $t(e){try{return JSON.parse(e)}catch{return}}var en=class{providerName;client;model;maxRetries;timeoutMs;chunkIdleTimeoutMs;baseDelayMs;nonRetryableStatus;parseJson;logger;redact;usageReporter;reportEvent;breaker;budget;limiter;isFallback;requestBuilder;middleware;middlewareTimeoutMs;supportsJsonObjectMode;detectSoftFailure;constructor(e,t,n,r){this.providerName=e,this.client=t,this.model=n,this.maxRetries=r.maxRetries,this.timeoutMs=r.timeoutMs,this.chunkIdleTimeoutMs=r.chunkIdleTimeoutMs,this.baseDelayMs=r.baseDelayMs,this.nonRetryableStatus=r.nonRetryableStatus,this.parseJson=r.parseJson??$t,this.logger=r.logger,this.redact=r.redact,this.reportEvent=L(r.onEvent,this.logger),this.breaker=r.breaker,this.budget=r.budget,this.limiter=r.limiter,this.isFallback=r.isFallback??!1,this.middleware=r.middleware??[],this.middlewareTimeoutMs=r.middlewareTimeoutMs??5e3,this.supportsJsonObjectMode=t.supportsJsonObjectMode??!0,this.detectSoftFailure=r.detectSoftFailure,this.usageReporter=Yt({providerName:this.providerName,isFallback:this.isFallback,maxRetries:this.maxRetries,onUsage:r.onUsage,onUsageFailure:r.onUsageFailure,logger:this.logger}),this.requestBuilder=new Lt({model:n,defaultMaxTokens:r.defaultMaxTokens,defaultTemperature:r.defaultTemperature,defaultReasoningEffort:r.defaultReasoningEffort,defaultBudgetTokens:r.defaultBudgetTokens,supportsJsonObjectMode:this.supportsJsonObjectMode})}previewRequest(e){let{model:t,request:n}=this.requestBuilder.build(e);return{model:t,request:n}}get jsonObjectModeSupported(){return this.supportsJsonObjectMode}getCircuitState(e){return this.breaker?.getState(e)}getFailureBreakdown(e){return this.breaker?.getFailureBreakdown(e)}getRetryBudgetState(){return this.budget?.getSnapshot()}getRateLimitState(){return this.limiter?.getState?.()}get isolateByModel(){return this.breaker?.isolateByModel??!1}openCircuit(e,t){this.breaker?.open(e,t)}closeCircuit(e,t){this.breaker?.close(e,t)}assertBreakerClosed(e,t){this.breaker?.assertClosed(e??this.model,t)}async run(e,t,n,r){return Qt({fn:(n,r,i,a)=>this.executeCall(e,t,n,r,i,a),requestId:t,model:e.model??this.model,providerName:this.providerName,isFallback:this.isFallback,supportsJsonObjectMode:this.supportsJsonObjectMode,breaker:this.breaker,budget:this.budget,maxRetries:this.maxRetries,baseDelayMs:this.baseDelayMs,nonRetryableStatus:this.nonRetryableStatus,signal:e.signal,onAttempt:n,state:r,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent,logLabel:`error`,redactText:e=>this.redactText(e),countsTowardBreaker:e=>this.countsTowardBreaker(e)})}async runStream(e,t,n,r){return Qt({fn:(n,r,i,a)=>this.executeStreamCall(e,t,n,r,i,a),requestId:t,model:e.model??this.model,providerName:this.providerName,isFallback:this.isFallback,supportsJsonObjectMode:this.supportsJsonObjectMode,breaker:this.breaker,budget:this.budget,maxRetries:this.maxRetries,baseDelayMs:this.baseDelayMs,nonRetryableStatus:this.nonRetryableStatus,signal:e.signal,onAttempt:n,state:r,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent,logLabel:`stream-open error`,redactText:e=>this.redactText(e),countsTowardBreaker:e=>this.countsTowardBreaker(e)})}async executeCall(e,t,n,r,i,a){let{request:o,model:s,useJson:c,state:l,release:u}=await Zt({params:e,requestId:t,attempt:n,onRequest:r,middlewareState:i,gateway:a,requestBuilder:this.requestBuilder,providerName:this.providerName,limiter:this.limiter,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent}),d=u;try{let r;try{r=await Ce(e=>this.client.chat.completions.create(o,{signal:e}),this.timeoutMs,e.signal)}catch(e){throw this.reactToRateLimitError(e),e}this.limiter?.reactToRateLimitHint(Tt(r));let i=this.usageReporter.extract(r,t,s),u=this.usageReporter.actualTokensFor(i),f=r.choices?.[0]?.message?.content,p=r.choices?.[0]?.message?.tool_calls,m;try{m=Vt(f,p,e,c,i,t,n,l,{gateway:a,usageReporter:this.usageReporter,logger:this.logger,redactText:e=>this.redactText(e),parseJson:this.parseJson,detectSoftFailure:this.detectSoftFailure,providerName:this.providerName,isFallback:this.isFallback,model:s})}catch(e){throw d?.(u),d=void 0,e}return d?.(u,!0),d=void 0,m}finally{d?.()}}redactText(e){return this.redact?this.redact(e):e}reactToRateLimitError(e){this.limiter&&j(e)===429&&this.limiter.signalRateLimit()}async executeStreamCall(e,t,n,r,i,a){let o=this.client.chat.completions;if(!o.createStream)throw new p(`stream: true requires a client/adapter with createStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`createStream`}});let s=o.createStream.bind(o),{request:c,model:l,useJson:u,state:d,release:f}=await Zt({params:e,requestId:t,attempt:n,onRequest:r,middlewareState:i,gateway:a,requestBuilder:this.requestBuilder,providerName:this.providerName,limiter:this.limiter,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent}),m=f,h=new AbortController,g=e.signal?AbortSignal.any([e.signal,h.signal]):h.signal;try{let{iterator:r,first:i}=await(async()=>{try{return await Ce(async e=>{let t=s(c,{signal:e})[Symbol.asyncIterator]();return{iterator:t,first:await t.next()}},this.timeoutMs,g)}catch(e){throw this.reactToRateLimitError(e),e}})();if(i.done)throw new p(`Empty LLM response`,`api`);let o=m,f=Jt(r,i,{requestId:t,model:l,providerName:this.providerName,isFallback:this.isFallback,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs??this.chunkIdleTimeoutMs,streamController:h,logger:this.logger,signal:e.signal,onRateLimitHint:e=>{this.limiter?.reactToRateLimitHint(e)},onStreamSuccess:e=>{},onStreamFailure:(t,r)=>{this.reactToRateLimitError(t),t.type===`timeout`&&a.recordFailure(n,e.signal,d,t.code),r&&t.type!==`aborted`&&this.usageReporter.reportFailure(r,t,n,!0),o?.(this.usageReporter.actualTokensFor(r))},finalize:(r,i,s)=>{let c=this.usageReporter.actualTokensFor(s);try{let f=Vt(r,i,e,u,s,t,n,d,{gateway:a,usageReporter:this.usageReporter,logger:this.logger,redactText:e=>this.redactText(e),parseJson:this.parseJson,detectSoftFailure:this.detectSoftFailure,providerName:this.providerName,isFallback:this.isFallback,model:l});return o?.(c,!0),f}catch(t){throw o?.(c),t instanceof p&&this.countsTowardBreaker(t)&&a.recordFailure(n,e.signal,d,t.code),t}}});return m=void 0,f}finally{m?.()}}countsTowardBreaker(e){return e.countsTowardBreaker}};async function tn(e,t,n,r,i,a=!1){let o=[];for(let s=0;s<e.executors.length;s++){let c=e.executors[s],l=Date.now(),u=0;try{return s===0&&a||c.assertBreakerClosed(t.model,{requestId:n,state:r,signal:t.signal}),{result:await i(c,()=>{u+=1}),executor:c,index:s,attemptCount:u}}catch(i){let a=M(i,t.signal);o.push({index:s-1,provider:c.providerName,model:t.model??c.model,error:a.toSnapshot()});let d=s===e.executors.length-1,f=e.fallbackOn(a,{isLastTarget:d});if((d?`stop`:f)===`stop`)throw o.length>1?new oe(o):a;let p=e.executors[s+1],m=t.model??c.model,h={stage:`attempt`,requestId:n,requestedProvider:c.providerName,requestedModel:m,isFallbackAttempt:s>0,attempt:u||1,capabilities:{supportsJsonObjectMode:c.jsonObjectModeSupported},signal:t.signal,state:r,own:{},registeredMiddlewareNames:e.middleware.map(I)};F({kind:`fallback`,requestId:n,from:c.providerName,to:p.providerName,fromIndex:s-1,toIndex:s,error:a,elapsedMs:Date.now()-l},h,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger)}}throw new p(`No provider targets configured`,`invalid_params`)}function nn(e,t){let n={provider:e.executor.providerName,model:t.model??e.executor.model,fallbackIndex:e.index-1,usedFallback:e.index>0,attempts:e.attemptCount};return t.meta&&(t.meta.current=n),{value:e.result,meta:n}}async function rn(e,t,n,r,i){return nn(await tn(e,t,n,i,(e,r)=>e.run(t,n,r,i),r),t)}async function an(e,t,n,r,i){return nn(await tn(e,t,n,i,(e,r)=>e.runStream(t,n,r,i),r),t)}function on(e){let t=!1,n,r;function i(){return r||(t=!0,r=e().then(e=>(n=e,e)),r.catch(()=>{}),r)}return{call:i,wasCalled:()=>t,resolvedValue:()=>n}}async function U(e,t,n,r,i,a=!1){let{wrapOrder:o,transformOrder:s,names:c}=e.pipeline;if(o.length===0||a)return i();let l=e.primaryExecutor,{model:u,request:d}=l.previewRequest(t),f=new Map(s.map((e,t)=>[e,t])),p=i;for(let i=o.length-1;i>=0;i--){let a=o[i],m=N(a,f.get(a)),h=p;p=async()=>{let i={stage:`pre-dispatch`,requestId:n,primaryProvider:l.providerName,primaryModel:u,capabilities:{supportsJsonObjectMode:l.jsonObjectModeSupported},signal:t.signal,state:r,own:{},registeredMiddlewareNames:c};if(!await P(a,i,m,e.middlewareTimeoutMs,e.logger))return a.enabled!==void 0&&F({kind:`middleware`,requestId:n,middleware:m,hook:`enabled_skip`},i,e.reportEvent,s,e.middlewareTimeoutMs,e.logger),h();if(!a.wrap)return h();let o=on(h);try{let t=await a.wrap(d,o.call,i);return o.wasCalled()||F({kind:`middleware`,requestId:n,middleware:m,hook:`wrap_short_circuit`},i,e.reportEvent,s,e.middlewareTimeoutMs,e.logger),t}catch(t){let n=o.resolvedValue();if(n!==void 0)return e.logger.error(`[VernLLM] middleware "${m}".wrap threw after next() resolved; keeping the original result`,{message:t instanceof Error?t.message:`unknown`,stack:t instanceof Error?t.stack:void 0}),n;throw dt(t,m,i.signal)}}}return p()}const W=Symbol(`deadlineExceeded`);function sn(e,t){if(e===void 0)return{signal:t,timer:void 0};let n=new AbortController;if(e<=0)return n.abort(W),{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:void 0};let r=setTimeout(()=>n.abort(W),e);return{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:r}}function cn(e,t){return e instanceof p&&e.type===`aborted`&&e.code===void 0&&t?.reason===W&&(e.code=`deadline_exceeded`),e}var ln=class{capacity;refillPerMs;available;lastRefill=Date.now();constructor(e,t){this.capacity=e,this.refillPerMs=t,this.available=e}refill(){if(this.refillPerMs===0)return;let e=Date.now(),t=e-this.lastRefill;this.available=Math.min(this.capacity,this.available+Math.max(0,t)*this.refillPerMs),this.lastRefill=e}tryTake(e){return this.refill(),this.available<e?!1:(this.available-=e,!0)}msUntilAvailable(e){return this.refill(),this.available>=e?0:this.refillPerMs===0?1/0:(e-this.available)/this.refillPerMs}give(e){this.available=Math.min(this.capacity,this.available+e)}getCapacity(){return this.capacity}getAvailable(){return this.refill(),this.available}resize(e){this.refill(),this.refillPerMs>0&&(this.refillPerMs=this.refillPerMs/this.capacity*e),this.capacity=e,this.available=Math.min(this.available,e)}};function un(e){let t=e.messages.reduce((e,t)=>{let n=t.content;if(typeof n==`string`)return e+n.length;if(n==null)return e;try{return e+JSON.stringify(n).length}catch{return e}},0);return Math.ceil(t/4)+(e.max_tokens??0)}function dn(e){if(e===void 0)return 1;if(!Number.isFinite(e)||e<=0)throw new p(`estimateFraction (${e}) must be a finite number greater than 0.`,`invalid_params`);return Math.min(e,1)}function fn(e){if(!e)return;let t=t=>{if(!Number.isFinite(e[t]))throw new p(`aimd.${t} (${e[t]}) must be a finite number.`,`invalid_params`)};for(let e of[`minCapacity`,`maxCapacity`,`increaseBy`,`decreaseFactor`])t(e);if(e.minCapacity<1||e.maxCapacity<1)throw new p(`aimd.minCapacity (${e.minCapacity}) and aimd.maxCapacity (${e.maxCapacity}) must both be at least 1, since the requests bucket always takes 1 per acquire; a capacity below 1 could never be satisfied.`,`invalid_params`);if(e.minCapacity>e.maxCapacity)throw new p(`aimd.minCapacity (${e.minCapacity}) must not exceed aimd.maxCapacity (${e.maxCapacity}).`,`invalid_params`);return{increaseBy:Math.max(0,e.increaseBy),decreaseFactor:Math.min(1,Math.max(Number.MIN_VALUE,e.decreaseFactor)),minCapacity:e.minCapacity,maxCapacity:e.maxCapacity,proactiveFloor:e.proactiveFloor??0}}function pn(e,t){return e===`tpm`?t:1}function mn(e){if(e)return new ln(e,e/6e4)}var hn=class{requests;tokens;concurrency;buckets;maxQueueMs;maxQueueSize;estimateTokensFn;estimateFraction;aimd;queue=[];wakeTimer;constructor(e){this.requests=mn(e.requestsPerMinute),this.tokens=mn(e.tokensPerMinute),e.maxConcurrent&&(this.concurrency=new ln(e.maxConcurrent,0)),this.buckets=[{reason:`concurrency`,bucket:this.concurrency},{reason:`rpm`,bucket:this.requests},{reason:`tpm`,bucket:this.tokens}].flatMap(({reason:e,bucket:t})=>t?[{reason:e,bucket:t}]:[]),this.maxQueueMs=e.maxQueueMs??3e4,this.maxQueueSize=e.maxQueueSize??0,this.estimateTokensFn=e.estimateTokens??un,this.estimateFraction=dn(e.estimateFraction),this.aimd=this.requests?fn(e.aimd):void 0}estimate(e){return Math.ceil(this.estimateTokensFn(e)*this.estimateFraction)}async acquire(e,t){if(t?.aborted)throw new p(`LLM request aborted`,`aborted`);if(!Number.isFinite(e)||e<0)throw new p(`estimatedTokens must be a finite, non-negative number, got ${String(e)}`,`invalid_params`);if(this.tokens&&e>this.tokens.getCapacity())throw new p(`estimatedTokens (${e}) exceeds the configured tokensPerMinute capacity (${this.tokens.getCapacity()}); this call could never acquire capacity.`,`rate_limited`,{code:`rate_limit_capacity_exceeded`});if(this.queue.length===0){let n=this.tryAcquireBuckets(e);return n.ok?{release:this.makeRelease(e),waitedMs:0}:this.enqueue(e,n.reason,t)}if(this.maxQueueSize>0&&this.queue.length>=this.maxQueueSize)throw this.queueFullError();return this.enqueue(e,void 0,t)}queueFullError(){return new p(`Rate limit queue is full`,`rate_limited`,{code:`rate_limit_queue_full`})}enqueue(e,t,n){return new Promise((r,i)=>{let a={estimatedTokens:e,enqueuedAt:Date.now(),lastReason:t,resolve:e=>{c(),r(e)},reject:e=>{c(),this.wakeTimer&&=(clearTimeout(this.wakeTimer),void 0),this.drain(),i(e)}},o,s=()=>{a.reject(new p(`LLM request aborted`,`aborted`))},c=()=>{o&&clearTimeout(o),n?.removeEventListener(`abort`,s);let e=this.queue.indexOf(a);e!==-1&&this.queue.splice(e,1)};this.maxQueueMs>0&&(o=setTimeout(()=>{a.reject(new p(`Rate limit queue timed out before capacity was available`,`rate_limited`,{code:`rate_limit_queue_timeout`}))},this.maxQueueMs)),n?.addEventListener(`abort`,s,{once:!0}),this.queue.push(a),this.drain()})}tryAcquireBuckets(e){let t=[];for(let{reason:n,bucket:r}of this.buckets){let i=pn(n,e);if(!r.tryTake(i)){for(let e of t)e.bucket.give(e.amount);return{ok:!1,reason:n}}t.push({bucket:r,amount:i})}return{ok:!0}}drain(){for(;this.queue.length>0;){let e=this.queue[0],t=this.tryAcquireBuckets(e.estimatedTokens);if(!t.ok){e.lastReason=t.reason,this.scheduleWake(t.reason,e.estimatedTokens);return}let n=Date.now()-e.enqueuedAt;e.resolve({release:this.makeRelease(e.estimatedTokens),waitedMs:n,reason:e.lastReason})}}scheduleWake(e,t){if(this.wakeTimer||e===`concurrency`)return;let n=(this.buckets.find(t=>t.reason===e)?.bucket)?.msUntilAvailable(pn(e,t));if(n===void 0||!Number.isFinite(n))return;let r=Math.min(Math.max(1,Math.ceil(n)),2147483647);this.wakeTimer=setTimeout(()=>{this.wakeTimer=void 0,this.drain()},r)}makeRelease(e){let t=!1;return(n,r=!1)=>{t||(t=!0,this.concurrency?.give(1),this.tokens&&n!==void 0&&Number.isFinite(n)&&this.tokens.give(e-n),r&&this.growOnSuccess(),this.drain())}}resizeRequestsCeiling(e){!this.aimd||!this.requests||this.requests.resize(e(this.aimd,this.requests.getCapacity()))}growOnSuccess(){this.resizeRequestsCeiling((e,t)=>Math.min(t+e.increaseBy,e.maxCapacity))}signalRateLimit(){this.resizeRequestsCeiling((e,t)=>Math.max(t*e.decreaseFactor,e.minCapacity))}reactToRateLimitHint(e){if(!this.aimd||!e||e.remainingRequests===void 0)return;let t=this.aimd.proactiveFloor??0;t>0&&e.remainingRequests<=t&&this.signalRateLimit()}getState(){return{requestsRemaining:this.requests?.getAvailable(),tokensRemaining:this.tokens?.getAvailable(),concurrentInFlight:this.concurrency?this.concurrency.getCapacity()-this.concurrency.getAvailable():void 0}}};const G=[`estimate`,`acquire`,`signalRateLimit`,`reactToRateLimitHint`];function gn(e){let t=e;return t.getState!==void 0&&typeof t.getState!=`function`}function _n(e){let t=e;return G.every(e=>typeof t[e]==`function`)&&!gn(e)}function vn(e){let t=e;return G.some(e=>typeof t[e]==`function`)}function yn(e){if(e!==void 0){if(_n(e))return e;if(vn(e)){let t=G.filter(t=>typeof e[t]!=`function`);if(t.length>0)throw new p(`rateLimit looks like a RateLimiterAdapter but is missing: ${t.join(`, `)}. All four methods (${G.join(`, `)}) are required.`,`invalid_params`)}if(gn(e))throw new p(`rateLimit's getState (${typeof e.getState}) must be a function. getState is optional; omit it entirely rather than assigning a non-function value.`,`invalid_params`);return new hn(e)}}function bn(e,t,n){return[e,...t].map((e,t)=>{let r=t>0,i=e.name??(r?`fallback[${t-1}]`:n.providerName),a=xt(e.circuitBreaker,i,e.model,n.onEvent,n.logger,n.middleware,n.middlewareTimeoutMs,r,e.client.supportsJsonObjectMode??!0),o=e.retryBudget?new Ge(e.retryBudget):void 0;return new en(i,e.client,e.model,{maxRetries:e.maxRetries??n.maxRetries??1,timeoutMs:e.timeoutMs??n.timeoutMs??25e3,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs??n.chunkIdleTimeoutMs??3e4,baseDelayMs:e.baseDelayMs??n.baseDelayMs??500,defaultMaxTokens:e.defaultMaxTokens??n.defaultMaxTokens??1e3,defaultTemperature:e.defaultTemperature===void 0?n.primaryDefaultTemperature:e.defaultTemperature,defaultReasoningEffort:e.defaultReasoningEffort===void 0?n.primaryDefaultReasoningEffort:e.defaultReasoningEffort,defaultBudgetTokens:e.defaultBudgetTokens===void 0?n.primaryDefaultBudgetTokens:e.defaultBudgetTokens,nonRetryableStatus:e.nonRetryableStatus??n.nonRetryableStatus??[400,401,403,404,422],parseJson:n.parseJson,logger:n.logger,redact:n.redact,onUsage:n.onUsage,onUsageFailure:n.onUsageFailure,onEvent:n.onEvent,breaker:a,budget:o,limiter:yn(e.rateLimit),isFallback:r,middleware:n.middleware,middlewareTimeoutMs:n.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure??n.detectSoftFailure})})}function xn(e){let t=e;return typeof t.get==`function`&&typeof t.set==`function`}function Sn(e){if(e===void 0)return new b;if(xn(e))return e;if(e.maxSize!==void 0&&(!Number.isFinite(e.maxSize)||e.maxSize<0||!Number.isInteger(e.maxSize)))throw RangeError(`cache.maxSize must be a finite, non-negative integer, got ${String(e.maxSize)}`);return new b(e.maxSize,e.eviction)}var Cn=class{debugEnabled;constructor(e){this.debugEnabled=e}debug(e){this.debugEnabled&&console.debug(e)}warn(e){console.warn(e)}error(e,t){console.error(e,t??``)}},wn=class{debug(e){}warn(e){}error(e,t){}},Tn=class{logger;executors;fallbackOn;reportEvent;cacheOrchestrator;pipeline;middlewareTimeoutMs;cachedCallInnerParams=new WeakMap;cachedCallMeta=new Map;constructor(e){this.logger=Ke(e.logger===`silent`?new wn:e.logger??new Cn(e.debug??!1));let t=e.name??`primary`;this.cacheOrchestrator=new ye(Sn(e.cache),this.logger),this.fallbackOn=e.fallbackOn??ae,this.reportEvent=L(e.onEvent,this.logger),this.pipeline=bt(e.middleware??[],this.logger),this.middlewareTimeoutMs=e.middlewareTimeoutMs??5e3;let n=e.defaultTemperature===void 0?.2:e.defaultTemperature,r=e.defaultReasoningEffort,i=e.defaultBudgetTokens,a={client:e.client,model:e.model,name:t,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,baseDelayMs:e.baseDelayMs,defaultMaxTokens:e.defaultMaxTokens,defaultTemperature:n,defaultReasoningEffort:r,defaultBudgetTokens:i,nonRetryableStatus:e.nonRetryableStatus,circuitBreaker:e.circuitBreaker,rateLimit:e.rateLimit,retryBudget:e.retryBudget,detectSoftFailure:e.detectSoftFailure},o=Array.isArray(e.fallback)?e.fallback:e.fallback?[e.fallback]:[];this.executors=bn(a,o,{providerName:t,primaryDefaultTemperature:n,primaryDefaultReasoningEffort:r,primaryDefaultBudgetTokens:i,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,baseDelayMs:e.baseDelayMs,defaultMaxTokens:e.defaultMaxTokens,nonRetryableStatus:e.nonRetryableStatus,parseJson:e.parseJson,redact:e.redact,onUsage:e.onUsage,onUsageFailure:e.onUsageFailure,onEvent:e.onEvent,logger:this.logger,middleware:this.pipeline.transformOrder,middlewareTimeoutMs:this.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure})}logRefundError(e,t){this.logger.error(e,{message:t instanceof Error?t.message:`unknown`,stack:t instanceof Error?t.stack:void 0})}get logicalCallDependencies(){return{executors:this.executors,fallbackOn:this.fallbackOn,reportEvent:this.reportEvent,middleware:this.pipeline.transformOrder,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger}}get runOperationDependencies(){return{pipeline:this.pipeline,primaryExecutor:this.executors[0],middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent}}async call(e){if(e.signal?.aborted)throw new p(`LLM request aborted`,`aborted`);let t=e.requestId??globalThis.crypto.randomUUID(),n=this.cachedCallInnerParams.get(e),r=n!==void 0,{signal:i,timer:a}=sn(e.deadlineMs,e.signal),o=i===e.signal?e:{...e,signal:i},s=n??w();try{let e=this.executors.length===1,n=await U(this.runOperationDependencies,o,t,s,async()=>{if(e){if(o.signal?.aborted)throw new p(`LLM request aborted`,`aborted`);this.executors[0].assertBreakerClosed(o.model,{requestId:t,state:s,signal:o.signal})}let n,r=async e=>{let t=await e;return n=t.meta,t.value};return o.stream?{value:await me(o,()=>r(an(this.logicalCallDependencies,o,t,e,s)),o.signal,(e,t)=>this.logRefundError(e,t)),meta:n}:{value:await T(o,!1,()=>r(rn(this.logicalCallDependencies,o,t,e,s)),o.signal,(e,t)=>this.logRefundError(e,t)),meta:n}},r);return o.stream,n.value}catch(e){throw cn(e,i)}finally{clearTimeout(a)}}runCached(e){return this.cacheOrchestrator.runCached(e)}async deleteCache(e){await this.cacheOrchestrator.deleteCache(e)}async cachedCall(e){let{call:t,...n}=e,r=t;if(r.reserveUsage||r.refundUsage)throw new p("`reserveUsage`/`refundUsage` were set inside `call`, where cachedCall ignores them. Move them to the top level of the cachedCall() params, alongside cacheKey/ttl, instead.",`invalid_params`);let i=r.requestId??globalThis.crypto.randomUUID(),a=w(),o=await this.cacheOrchestrator.resolveCacheKey(n.cacheKey),s=this.cachedCallMeta.get(o),c=!1;s||(s={},c=!0,this.cachedCallMeta.set(o,s));let l=()=>{c&&this.cachedCallMeta.delete(o)},u=r.meta,d=e=>{let t={...e,meta:s};return this.cachedCallInnerParams.set(t,a),this.call(t).finally(()=>{u&&(u.current=s.current),this.cachedCallInnerParams.delete(t)})};if(r.stream){let e={...r,requestId:i},t;try{t=await U(this.runOperationDependencies,e,i,a,async()=>({value:await this.cacheOrchestrator.runCachedStream({...n,openStream:()=>d(e)},!!r.tools),meta:s.current}))}catch(e){throw l(),e}let o=t.value,c=()=>{u&&(u.current=s.current),l()};return o.finalResult.then(c,c),o}let f={...r,requestId:i};try{let e=await U(this.runOperationDependencies,f,i,a,async()=>({value:await this.runCached({...n,fn:()=>d(f)}),meta:s.current}));return u&&(u.current=s.current),e.value}finally{l()}}getCircuitState(e){let t=R(this.executors,e?.index??0,`getCircuitState`);return z(t.isolateByModel,e?.model,`getCircuitState`,this.logger),t.getCircuitState(e?.model??t.model)}getFailureBreakdown(e){let t=R(this.executors,e?.index??0,`getFailureBreakdown`);return z(t.isolateByModel,e?.model,`getFailureBreakdown`,this.logger),t.getFailureBreakdown(e?.model??t.model)}getRetryBudgetState(e){return R(this.executors,e?.index??0,`getRetryBudgetState`).getRetryBudgetState()}getRateLimitState(e){return R(this.executors,e?.index??0,`getRateLimitState`).getRateLimitState()}getCircuitStates(e){return this.executors.map((t,n)=>({provider:t.providerName,index:n,isFallback:n>0,isolateByModel:t.isolateByModel,state:t.getCircuitState(e??t.model)}))}openCircuit(e){let t=R(this.executors,e?.index??0,`openCircuit`);z(t.isolateByModel,e?.model,`openCircuit`,this.logger),t.openCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:w()})}closeCircuit(e){let t=R(this.executors,e?.index??0,`closeCircuit`);z(t.isolateByModel,e?.model,`closeCircuit`,this.logger),t.closeCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:w()})}};function En(e){return e}function Dn(e){return e}async function*On(e){let t=new TextDecoder(`utf-8`,{fatal:!0}),n=``;for await(let r of e){let e;try{e=typeof r==`string`?r:t.decode(r,{stream:!0})}catch(e){throw new p(`Invalid UTF-8 in SSE stream`,`parse`,{cause:e})}n=(n+e).replace(/\r\n/g,`
2
2
  `).replace(/\r(?!$)/g,`
3
3
  `);let i=n.indexOf(`
4
4
 
5
- `);for(;i!==-1;){let e=n.slice(0,i);n=n.slice(i+2);let t=J(e);if(t===G)return;t!==K&&(yield t),i=n.indexOf(`
5
+ `);for(;i!==-1;){let e=n.slice(0,i);n=n.slice(i+2);let t=kn(e);if(t===K)return;t!==q&&(yield t),i=n.indexOf(`
6
6
 
7
7
  `)}}try{n+=t.decode()}catch(e){throw new p(`Invalid UTF-8 in SSE stream`,`parse`,{cause:e})}n=n.replace(/\r$/,`
8
8
  `);let r=n.indexOf(`
9
9
 
10
- `);for(;r!==-1;){let e=n.slice(0,r);n=n.slice(r+2);let t=J(e);if(t===G)return;t!==K&&(yield t),r=n.indexOf(`
10
+ `);for(;r!==-1;){let e=n.slice(0,r);n=n.slice(r+2);let t=kn(e);if(t===K)return;t!==q&&(yield t),r=n.indexOf(`
11
11
 
12
- `)}let i=n.trim();if(i){let e=J(i);e!==G&&e!==K&&(yield e)}}const G=Symbol(`sse-stream-done`),K=Symbol(`sse-frame-no-data`),q=Symbol(`sse-frame-ping`);function J(e){let t=[],n=!1;for(let r of e.split(`
13
- `)){if(r.startsWith(`:`)){n=!0;continue}r.startsWith(`data:`)&&t.push(r.startsWith(`data: `)?r.slice(6):r.slice(5))}if(!t.length)return n?q:K;let r=t.join(`
14
- `);if(r===`[DONE]`)return G;try{return JSON.parse(r)}catch(e){throw new p(`Invalid JSON in SSE frame: ${r.slice(0,200)}`,`parse`,{cause:e,code:`stream_frame_invalid`})}}const _n=[`image/png`,`image/jpeg`,`image/gif`,`image/webp`];function Y(e){if(_n.includes(e))return e;throw new p(`Unsupported image mimeType "${e}": expected one of ${_n.join(`, `)}`,`invalid_params`)}function vn(e,t){return t?Array.isArray(t)?t.includes(e):t(e):!1}const X={minimal:1024,low:4096,medium:16e3,high:32e3};function Z(e){if(!e)return X;let t={...X,...e};if(!(t.minimal<t.low&&t.low<t.medium&&t.medium<t.high))throw new p(`reasoningEffortTokens must keep tiers in strictly ascending order (minimal < low < medium < high), got ${JSON.stringify(t)}. An out-of-order override doesn't just misrank tiers, it can make some of them unreachable.`,`invalid_params`);return t}function yn(e,t=X){return t[e]}function Q(e,t=X){return e<=t.minimal?`minimal`:e<=t.low?`low`:e<=t.medium?`medium`:`high`}function bn(e){let t=/opus-(\d+)(?:-(\d+))?/.exec(e);if(!t)return null;let n=t[2],r=n===void 0||n.length>=8?0:Number(n);return[Number(t[1]),r]}function xn(e){let t=bn(e);if(t){let[e,n]=t;return e>4||e===4&&n>=7}return[`sonnet-5`,`fable-5`,`mythos`].some(t=>e.includes(t))}function Sn(e,t){return xn(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function Cn(e,t){return!Sn(e,t)}function wn(e,t){if(e<1024)throw new p(`budgetTokens (${e}) is below Anthropic's minimum of 1024. Raise budgetTokens, or use a reasoningEffort tier of 'low' or above with the default conversion table.`,`invalid_params`);if(e>=t)throw new p(`budgetTokens (${e}) must be less than maxTokens (${t}); the thinking budget and the reply share the same max_tokens ceiling on Anthropic. Raise maxTokens, or lower budgetTokens/reasoningEffort.`,`invalid_params`)}function Tn(e){if(e)throw new p(`budgetTokens/reasoningEffort was set alongside ${e}. Anthropic rejects thinking combined with a tool_choice that forces tool use, the model has to be able to reply with plain text for thinking to run. Use toolChoice: 'auto' (or omit toolChoice) for this call, or drop budgetTokens/reasoningEffort for it.`,`invalid_params`)}function En(e){return e===`minimal`?`low`:e}function Dn(e,t){return kn(t,e.toUpperCase())}function On(e){let t=/gemini-\d+\.(\d+)/.exec(e);return t?Number(t[1]):0}function kn(e,t){if(!e.includes(`pro`))return t;let n=An(e);return n===null||n<3?t:On(e)===0?t===`HIGH`?`HIGH`:`LOW`:t===`MINIMAL`?`LOW`:t}function An(e){let t=/gemini-(\d+)/.exec(e);return t?Number(t[1]):null}function jn(e){let t=An(e);return t!==null&&t>=3}function Mn(e,t){return jn(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function Nn(e){return e.map(e=>e.type===`image`?{type:`image`,source:{type:`base64`,media_type:Y(e.mimeType),data:e.data}}:{type:`text`,text:e.text})}function Pn(e,t){if(e.type!==`object`)throw new p(`Tool "${t}"'s schema must have "type": "object" (Anthropic requires object-shaped tool parameters).`,`validation`);return e}function Fn(e){return!e||e===`auto`?{type:`auto`}:e===`none`?{type:`none`}:e===`required`?{type:`any`}:{type:`tool`,name:e.function.name}}function In(e,t){return{tools:e.map(e=>({name:e.function.name,description:e.function.description,input_schema:Pn(e.function.parameters,e.function.name)})),toolChoice:Fn(t)}}function Ln(e,t,n,r){let i=e.messages.find(e=>e.role===`system`),a=e.messages.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool`),o=e.response_format?.type===`json_schema`?e.response_format.json_schema:void 0,s=o?.name.trim();if(o&&!s)throw new p(`json_schema.name must not be empty.`,`validation`);let c=!!o&&vn(e.model,t);if(o&&e.tools?.length&&!c)throw new p(`Anthropic model "${e.model}" is not covered by nativeStructuredOutputModels, so \`jsonSchema\` is emulated as a forced single tool call there, which collides with the \`tools\` you also provided. Either drop \`tools\` or \`jsonSchema\` for this call, or pass this model in fromAnthropic's \`nativeStructuredOutputModels\` option once you've confirmed it supports Anthropic's \`output_config.format\`.`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`tools_with_json_schema`}});if(e.response_format?.type===`json_object`)throw new p('response_format: "json_object" is not supported on Anthropic. Unlike OpenAI, Anthropic has no API-level field that mechanically guarantees valid JSON output for this mode, so it used to be emulated by injecting a "respond with JSON only" instruction into the system prompt, a guarantee this adapter can no longer make. Use `jsonSchema` instead, which maps to a real API-level constraint (Anthropic\'s native output_config.format on covered models, or a forced single tool call otherwise).',`validation`);let l,u,d,f;if(o&&c)u={type:`json_schema`,schema:o.schema},e.tools?.length&&({tools:d,toolChoice:f}=In(e.tools,e.tool_choice));else if(o&&s){let{schema:e,description:t,strict:n}=o;l=s,d=[{name:l,description:t,input_schema:Pn(e,l),strict:n}],f={type:`tool`,name:l}}!o&&e.tools?.length&&({tools:d,toolChoice:f}=In(e.tools,e.tool_choice));let m,h;if(e.budget_tokens!==void 0||e.reasoning_effort!==void 0){if(Tn(f?.type===`tool`?`toolChoice forcing the "${f.name}" tool`:f?.type===`any`?`toolChoice: 'required' (Anthropic's "any" tool_choice)`:void 0),Cn(e.model,r)){let t=e.budget_tokens??yn(e.reasoning_effort,n);wn(t,e.max_tokens),m={type:`enabled`,budget_tokens:t}}else{let t=e.reasoning_effort??Q(e.budget_tokens,n);m={type:`adaptive`},h=En(t)}}let g=i?.content,_=m?void 0:e.temperature;return{body:{model:e.model,max_tokens:e.max_tokens,..._===void 0?{}:{temperature:_},system:g||void 0,messages:zn(a.map(e=>Bn(e))),...d?{tools:d,tool_choice:f}:{},...u||h?{output_config:{...u?{format:u}:{},...h?{effort:h}:{}}}:{},...m?{thinking:m}:{}},toolName:l}}function Rn(e,t){let n=t?.nativeStructuredOutputModels,r=Z(t?.reasoningEffortTokens),i=t?.adaptiveOnlyModels,a=t?.supportsWithResponse??!1,o=e.messages.create.bind(e.messages);return{supportsJsonObjectMode:!1,chat:{completions:{async create(t,o){let{body:s,toolName:c}=Ln(t,n,r,i),l,u=a?await(async()=>{let{data:t,response:n}=await e.messages.create(s,o).withResponse();return l=n.headers,t})():await e.messages.create(s,o),d,f;if(c){let e=u.content.find(e=>e.type===`tool_use`&&e.name===c);if(!e)throw new p(`Anthropic did not return the required structured output tool "${c}".`,`validation`);if(!e.input||typeof e.input!=`object`||Array.isArray(e.input))throw new p(`Anthropic returned invalid structured output for tool "${c}". Expected an object.`,`validation`);d=JSON.stringify(e.input)}else{d=u.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``);let e=u.content.filter(e=>e.type===`tool_use`);e.length&&(f=e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input??{})}})))}let m={choices:[{message:{content:d,...f?{tool_calls:f}:{}}}],usage:{prompt_tokens:u.usage?.input_tokens,completion_tokens:u.usage?.output_tokens,total_tokens:(u.usage?.input_tokens??0)+(u.usage?.output_tokens??0),...u.usage?.output_tokens_details?.thinking_tokens===void 0?{}:{completion_tokens_details:{reasoning_tokens:u.usage.output_tokens_details.thinking_tokens}}}};return l&&ft(m,ut(l)),m},async*createStream(t,s){let{body:c,toolName:l}=Ln(t,n,r,i),u;if(!a)u=await o({...c,stream:!0},s);else{let{data:t,response:n}=await e.messages.create({...c,stream:!0},s).withResponse();u=t;let r=ut(n.headers);(r.remainingRequests!==void 0||r.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:r})}let d=new Map,f=0,m=!1;for await(let e of u)if(e.type===`message_start`)f=e.message.usage?.input_tokens??0;else if(e.type===`content_block_start`){if(e.content_block.type===`tool_use`){let t=e.content_block.name===l?`json-tool`:`tool_use`;d.set(e.index,t),t===`json-tool`?m=!0:l||(yield{type:`tool_call_delta`,index:e.index,id:e.content_block.id,name:e.content_block.name})}else d.set(e.index,`text`)}else if(e.type===`content_block_delta`)e.delta.type===`text_delta`?l||(yield{type:`text-delta`,delta:e.delta.text}):e.delta.type===`input_json_delta`&&(d.get(e.index)===`json-tool`?yield{type:`text-delta`,delta:e.delta.partial_json}:l||(yield{type:`tool_call_delta`,index:e.index,argumentsDelta:e.delta.partial_json}));else if(e.type===`message_delta`){let t=e.usage?.output_tokens??0,n=e.usage?.output_tokens_details?.thinking_tokens;yield{type:`usage`,usage:{prompt_tokens:f,completion_tokens:t,total_tokens:f+t,...n===void 0?{}:{completion_tokens_details:{reasoning_tokens:n}}}}}else e.type===`ping`&&(yield{type:`ping`});if(l&&!m)throw new p(`Anthropic did not return the required structured output tool "${l}".`,`validation`)}}}}}function zn(e){let t=e=>e.role===`user`&&Array.isArray(e.content)&&e.content.length>0&&e.content.every(e=>e.type===`tool_result`),n=[];for(let r of e){let e=n.at(-1);t(r)&&e&&t(e)?e.content.push(...r.content):n.push(r)}return n}function Bn(e){if(e.role===`tool`)return{role:`user`,content:[{type:`tool_result`,tool_use_id:e.tool_call_id,content:e.content,...e.is_error?{is_error:!0}:{}}]};if(e.role===`assistant`&&e.tool_calls?.length){let t=[];e.content&&t.push({type:`text`,text:e.content});for(let n of e.tool_calls){let e;try{e=n.function.arguments.trim()?JSON.parse(n.function.arguments):{}}catch(e){throw new p(`Assistant tool call "${n.function.name}" (${n.id}) has arguments that are not valid JSON.`,`validation`,{cause:e})}if(e===null||Array.isArray(e)||typeof e!=`object`)throw new p(`Assistant tool call "${n.function.name}" (${n.id}) arguments must be a JSON object.`,`validation`);t.push({type:`tool_use`,id:n.id,name:n.function.name,input:e})}return{role:`assistant`,content:t}}return{role:e.role,content:Array.isArray(e.content)?Nn(e.content):e.content??``}}function Vn(e){return e.map(e=>e.type===`image`?{inlineData:{mimeType:Y(e.mimeType),data:e.data}}:{text:e.text})}function Hn(e,t){return`${e}#${t}`}function Un(e){return!e||e===`auto`?{functionCallingConfig:{mode:`AUTO`}}:e===`none`?{functionCallingConfig:{mode:`NONE`}}:e===`required`?{functionCallingConfig:{mode:`ANY`}}:{functionCallingConfig:{mode:`ANY`,allowedFunctionNames:[e.function.name]}}}function Wn(e){let t=new Map;for(let n of e)if(n.role===`assistant`)for(let e of n.tool_calls??[])t.set(e.id,e.function.name);return t}function Gn(e,t){if(e.role===`tool`)return{role:`user`,parts:[{functionResponse:{id:e.tool_call_id,name:t.get(e.tool_call_id)??e.tool_call_id,response:qn(e.content)}}]};if(e.role===`assistant`&&e.tool_calls?.length){let t=[];return typeof e.content==`string`&&e.content&&t.push({text:e.content}),t.push(...e.tool_calls.map(e=>({functionCall:{id:e.id,name:e.function.name,args:Kn(e.function.arguments,e.function.name)}}))),{role:`model`,parts:t}}return{role:e.role===`assistant`?`model`:`user`,parts:Array.isArray(e.content)?Vn(e.content):[{text:e.content??``}]}}function Kn(e,t){let n;try{n=e.trim()?JSON.parse(e):{}}catch(e){throw new p(`Tool call "${t}" arguments are not valid JSON.`,`parse`,{cause:e,code:`tool_arguments_parse_failed`})}if(!n||Array.isArray(n)||typeof n!=`object`)throw new p(`Tool call "${t}" arguments must be a JSON object.`,`validation`);return n}function qn(e){let t;try{t=e.trim()?JSON.parse(e):``}catch{t=e}return t&&!Array.isArray(t)&&typeof t==`object`?t:{output:t}}function Jn(e){let t=e=>e.role===`user`&&e.parts.length>0&&e.parts.every(e=>`functionResponse`in e),n=[];for(let r of e){let e=n.at(-1);t(r)&&e&&t(e)?e.parts.push(...r.parts):n.push(r)}return n}function Yn(e,t,n){let r=e.messages.find(e=>e.role===`system`),i=e.messages.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool`),a=!!e.response_format,o={...e.temperature===void 0?{}:{temperature:e.temperature},maxOutputTokens:e.max_tokens,...r?{systemInstruction:{parts:[{text:r.content}]}}:{}};if(a&&(o.responseMimeType=`application/json`),e.response_format?.type===`json_schema`){let{schema:t,description:n}=e.response_format.json_schema;o.responseSchema={...t,...n?{description:n}:{}}}if(e.tools?.length&&(o.tools=[{functionDeclarations:e.tools.map(e=>({name:e.function.name,description:e.function.description,parameters:e.function.parameters}))}],o.toolConfig=Un(e.tool_choice)),Mn(e.model,n)){let n=e.reasoning_effort??(e.budget_tokens===void 0?void 0:Q(e.budget_tokens,t));n!==void 0&&(o.thinkingConfig={thinkingLevel:Dn(n,e.model)})}else{let n=e.budget_tokens??(e.reasoning_effort?yn(e.reasoning_effort,t):void 0);n!==void 0&&(o.thinkingConfig={thinkingBudget:n})}let s=Wn(i);return{model:e.model,contents:Jn(i.map(e=>Gn(e,s))),config:o}}function Xn(e,t){let n=Z(t?.reasoningEffortTokens),r=t?.thinkingLevelModels,i=e.models??e;if(typeof i.generateContent!=`function`)throw new p(`fromGemini requires a client with generateContent: pass ai.models, or the whole ai client (fromGemini(ai)).`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`generateContent`}});let a=i.generateContent.bind(i),o=typeof i.generateContentStream==`function`?i.generateContentStream.bind(i):void 0;return{chat:{completions:{async create(e,t){let i=Yn(e,n,r);i.config={...i.config,abortSignal:t.signal};let o=await a(i),s=o.candidates?.[0]?.content?.parts??[],c=s.map(e=>e.text??``).join(``),l=s.filter(e=>e.functionCall),u;if(l.length){let e=new Map;u=l.map(t=>{let n=t.functionCall.name,r=t.functionCall.id,i=e.get(n)??0;return e.set(n,i+1),{id:r??Hn(n,i),type:`function`,function:{name:n,arguments:JSON.stringify(t.functionCall.args??{})}}})}return{choices:[{message:{content:c,...u?{tool_calls:u}:{}}}],usage:{prompt_tokens:o.usageMetadata?.promptTokenCount,completion_tokens:o.usageMetadata?.candidatesTokenCount,total_tokens:o.usageMetadata?.totalTokenCount,...o.usageMetadata?.thoughtsTokenCount===void 0?{}:{completion_tokens_details:{reasoning_tokens:o.usageMetadata.thoughtsTokenCount}}}}},async*createStream(e,t){if(!o)throw new p(`stream: true requires a Gemini client with generateContentStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`generateContentStream`}});let i=Yn(e,n,r);i.config={...i.config,abortSignal:t.signal};let a=await o(i),s=0,c=new Map,l;for await(let e of a){let t=e.candidates?.[0]?.content?.parts??[];for(let e of t)if(e.text&&(yield{type:`text-delta`,delta:e.text}),e.functionCall){let t=e.functionCall.name,n=e.functionCall.id,r=t?c.get(t)??0:0;t&&c.set(t,r+1),yield{type:`tool_call_delta`,index:s,id:n??(t?Hn(t,r):void 0),name:e.functionCall.name,argumentsDelta:JSON.stringify(e.functionCall.args??{}),complete:!0},s++}e.usageMetadata&&(l=e.usageMetadata)}l&&(yield{type:`usage`,usage:{prompt_tokens:l.promptTokenCount,completion_tokens:l.candidatesTokenCount,total_tokens:l.totalTokenCount,...l.thoughtsTokenCount===void 0?{}:{completion_tokens_details:{reasoning_tokens:l.thoughtsTokenCount}}}})}}}}}function Zn(e){return e.includes(`claude`)}function Qn(e){switch(Y(e)){case`image/png`:return`png`;case`image/jpeg`:return`jpeg`;case`image/gif`:return`gif`;case`image/webp`:return`webp`}}function $n(e){return new Uint8Array(Buffer.from(e,`base64`))}function er(e){return e.map(e=>e.type===`image`?{image:{format:Qn(e.mimeType),source:{bytes:$n(e.data)}}}:{text:e.text})}function tr(e,t){return{tools:e.map(e=>({toolSpec:{name:e.function.name,description:e.function.description,inputSchema:{json:e.function.parameters}}})),toolChoice:cr(t)}}function nr(e,t,n,r,i){let a=e.messages.find(e=>e.role===`system`),o=e.messages.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool`),s=e.response_format?.type===`json_schema`?e.response_format.json_schema:void 0,c=s?.name.trim();if(s&&!c)throw new p(`json_schema.name must not be empty.`,`validation`);let l=!!s&&vn(e.model,n);if(s&&e.tools?.length&&!l)throw new p(`Bedrock model "${e.model}" is not covered by nativeStructuredOutputModels, so \`jsonSchema\` is emulated as a forced single tool call there (via \`toolConfig\`), which collides with the \`tools\` you also provided. Either drop \`tools\` or \`jsonSchema\` for this call, or pass this model in fromBedrock's \`nativeStructuredOutputModels\` option once you've confirmed it supports Converse's \`outputConfig.textFormat\`.`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`tools_with_json_schema`}});if(e.response_format?.type===`json_object`)throw new p('response_format: "json_object" is not supported on Bedrock. Converse has no field that mechanically guarantees valid JSON output for this mode, so it used to be emulated by injecting a "respond with JSON only" instruction into the system prompt, a guarantee this adapter can no longer make. Use `jsonSchema` instead, which maps to a real constraint (Converse\'s native outputConfig.textFormat on covered models, or a forced tool call otherwise).',`validation`);let u,d,f;if(s&&l){let{schema:e,description:t}=s;f={textFormat:{type:`json_schema`,structure:{jsonSchema:{schema:JSON.stringify(e),name:c,description:t}}}}}else if(s&&c){let{schema:e,description:t,strict:n}=s;u=c,d={tools:[{toolSpec:{name:u,description:t,inputSchema:{json:e},strict:n}}],toolChoice:{tool:{name:u}}}}if(e.tools?.length&&!u&&(d=tr(e.tools,e.tool_choice)),s&&d&&t&&!(Array.isArray(t)?t.includes(e.model):t(e.model)))throw new p(`Bedrock model "${e.model}" is not listed in toolUseSupportedModels, but this call requires Converse tool use (either jsonSchema emulated as a forced tool call, or real \`tools\` sent alongside native structured output).`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`toolUseSupportedModels`}});let m,h;if(Zn(e.model)&&(e.budget_tokens!==void 0||e.reasoning_effort!==void 0)){let t=d?.toolChoice;if(Tn(t&&`tool`in t?`toolChoice forcing the "${t.tool?.name}" tool`:t&&`any`in t?`toolChoice: 'required' (Converse's "any" tool_choice)`:void 0),Cn(e.model,i)){let t=e.budget_tokens??yn(e.reasoning_effort,r);wn(t,e.max_tokens),m={thinking:{type:`enabled`,budget_tokens:t}}}else{let t=e.reasoning_effort??Q(e.budget_tokens,r);m={thinking:{type:`adaptive`}},h=En(t)}}let g=m?void 0:e.temperature;return{request:{modelId:e.model,messages:ur(o.map(e=>lr(e))),system:a?.content?[{text:a.content}]:void 0,inferenceConfig:{...g===void 0?{}:{temperature:g},maxTokens:e.max_tokens},...d?{toolConfig:d}:{},...f||h?{outputConfig:{...f??{},...h?{effort:h}:{}}}:{},...m?{additionalModelRequestFields:m}:{}},toolName:u}}function rr(e){return typeof e.send==`function`}function ir(e){if(`messageStart`in e)return{messageStart:e.messageStart};if(`contentBlockStart`in e)return{contentBlockStart:e.contentBlockStart};if(`contentBlockDelta`in e)return{contentBlockDelta:e.contentBlockDelta};if(`contentBlockStop`in e)return{contentBlockStop:e.contentBlockStop};if(`messageStop`in e)return{messageStop:e.messageStop};if(`metadata`in e)return{metadata:e.metadata};if(`internalServerException`in e)return{internalServerException:e.internalServerException};if(`modelStreamErrorException`in e)return{modelStreamErrorException:e.modelStreamErrorException};if(`validationException`in e)return{validationException:e.validationException};if(`throttlingException`in e)return{throttlingException:e.throttlingException};if(`serviceUnavailableException`in e)return{serviceUnavailableException:e.serviceUnavailableException}}async function*ar(e){for await(let t of e){let e=ir(t);e&&(yield e)}}function or(e){let t;function n(){return t??=import(`@aws-sdk/client-bedrock-runtime`).then(e=>e,e=>{throw t=void 0,new p(`fromBedrock requires "@aws-sdk/client-bedrock-runtime" to be installed to use a raw AWS SDK client (it is not a dependency of vern-llm itself). Install it, or pass your own object with .converse()/.converseStream() methods instead.`,`validation`,{cause:e})}),t}return{converse:async(t,r)=>{let{ConverseCommand:i}=await n();return e.send(new i(t),{abortSignal:r.signal})},converseStream:async(t,r)=>{let{ConverseStreamCommand:i}=await n(),a=await e.send(new i(t),{abortSignal:r.signal});if(!a.stream)throw new p(`Bedrock ConverseStreamCommand response did not include a stream. This can happen if the request or the model doesn't actually support Converse streaming.`,`api`,{code:`server_error`});return{stream:ar(a.stream)}}}}function sr(e,t){let n=rr(e)?or(e):e,r=t?.toolUseSupportedModels,i=t?.nativeStructuredOutputModels,a=Z(t?.reasoningEffortTokens),o=t?.adaptiveOnlyModels;return{supportsJsonObjectMode:!1,chat:{completions:{async create(e,t){let{request:s,toolName:c}=nr(e,r,i,a,o),l=await n.converse(s,t),u,d;if(c){let e=l.output?.message?.content?.find(e=>e.toolUse?.name===c);u=e?.toolUse?JSON.stringify(e.toolUse.input):``}else{let e=l.output?.message?.content??[];u=e.map(e=>e.text??``).join(``);let t=e.filter(e=>!!e.toolUse);t.length&&(d=t.map((e,t)=>{let n=e.toolUse;if(!n.name)throw new p(`Bedrock returned a toolUse block without a name at index ${t}.`,`validation`);return{id:n.toolUseId??`${n.name}_${t}`,type:`function`,function:{name:n.name,arguments:JSON.stringify(n.input??{})}}}))}return{choices:[{message:{content:u,...d?{tool_calls:d}:{}}}],usage:{prompt_tokens:l.usage?.inputTokens,completion_tokens:l.usage?.outputTokens,total_tokens:l.usage?.totalTokens}}},async*createStream(e,t){if(!n.converseStream)throw new p(`stream: true requires a Bedrock client with converseStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`converseStream`}});let{request:s,toolName:c}=nr(e,r,i,a,o),{stream:l}=await n.converseStream(s,t),u=new Map;for await(let e of l)if(`contentBlockStart`in e){let{contentBlockIndex:t,start:n}=e.contentBlockStart;if(n?.toolUse){let e=n.toolUse.name===c?`json-tool`:`tool_use`;u.set(t,e),e===`tool_use`&&!c&&(yield{type:`tool_call_delta`,index:t,id:n.toolUse.toolUseId,name:n.toolUse.name})}else u.set(t,`text`)}else if(`contentBlockDelta`in e){let{contentBlockIndex:t,delta:n}=e.contentBlockDelta;n&&`text`in n&&n.text!==void 0&&!c?yield{type:`text-delta`,delta:n.text}:n&&`toolUse`in n&&n.toolUse?.input!==void 0&&(u.get(t)===`json-tool`?yield{type:`text-delta`,delta:n.toolUse.input}:c||(yield{type:`tool_call_delta`,index:t,argumentsDelta:n.toolUse.input}))}else if(`metadata`in e&&e.metadata.usage)yield{type:`usage`,usage:{prompt_tokens:e.metadata.usage.inputTokens,completion_tokens:e.metadata.usage.outputTokens,total_tokens:e.metadata.usage.totalTokens}};else if(`throttlingException`in e)throw new p(e.throttlingException.message??`Bedrock throttled the request mid-stream`,`api`,{status:429,code:`provider_rate_limited`});else if(`validationException`in e)throw new p(e.validationException.message??`Bedrock rejected the request mid-stream`,`validation`);else if(`internalServerException`in e||`serviceUnavailableException`in e||`modelStreamErrorException`in e){let t=`internalServerException`in e&&e.internalServerException.message||`serviceUnavailableException`in e&&e.serviceUnavailableException.message||`modelStreamErrorException`in e&&e.modelStreamErrorException.message||`Bedrock reported a mid-stream error`,n=`modelStreamErrorException`in e&&e.modelStreamErrorException.originalStatusCode||`serviceUnavailableException`in e&&503||500;throw new p(t,`api`,{status:n,code:n>=500?`server_error`:void 0})}}}}}}function cr(e){if(!e||e===`auto`)return{auto:{}};if(e===`required`)return{any:{}};if(e===`none`)throw new p("'none' is not supported by fromBedrock: Bedrock Converse has no `tool_choice` equivalent to forbidding tool use while tools are still offered. Omit `tools` entirely for this call instead.",`invalid_params`,{code:`unsupported_capability`,issues:{capability:`toolChoice: 'none'`}});return{tool:{name:e.function.name}}}function lr(e){if(e.role===`tool`)return{role:`user`,content:[{toolResult:{toolUseId:e.tool_call_id,content:[{text:e.content}],status:e.is_error?`error`:`success`}}]};if(e.role===`assistant`&&e.tool_calls?.length){let t=[];e.content&&t.push({text:e.content});for(let n of e.tool_calls){let e;if(!n.function.arguments.trim())e={};else try{e=JSON.parse(n.function.arguments)}catch(e){throw new p(`Assistant tool call "${n.function.name}" (${n.id}) has arguments that are not valid JSON.`,`validation`,{cause:e})}t.push({toolUse:{toolUseId:n.id,name:n.function.name,input:e}})}return{role:`assistant`,content:t}}return{role:e.role,content:Array.isArray(e.content)?er(e.content):[{text:e.content??``}]}}function ur(e){let t=e=>e.role===`user`&&e.content.length>0&&e.content.every(e=>`toolResult`in e),n=[];for(let r of e){let e=n.at(-1);t(r)&&e&&t(e)?e.content.push(...r.content):n.push(r)}return n}async function*dr(e){let t=e.getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e)return;n&&(yield n)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}async function fr(e,t){let n=await fetch(e,t);if(!n.ok){let e=await n.text().catch(()=>``),t=Error(`Fetch adapter stream request failed (${n.status}): ${e.slice(0,500)}`);throw t.status=n.status,t.headers=n.headers,t}if(!n.body)throw Error(`Fetch adapter stream request received a response with no body.`);return{headers:n.headers,body:dr(n.body)}}async function pr(e,t,n){let r=typeof e.url==`function`?e.url(t):e.url,i=typeof e.headers==`function`?await e.headers():e.headers,a=e.method??`POST`,o=![`GET`,`HEAD`].includes(a.toUpperCase());return{url:r,method:a,headers:o?{"Content-Type":`application/json`,...i}:{...i},...o?{body:JSON.stringify(n)}:{}}}function mr(e){return{chat:{completions:{async create(t,n){let{url:r,method:i,headers:a,body:o}=await pr(e,t,e.mapRequest(t)),s=await(e.request??fetch)(r,{method:i,headers:a,body:o,signal:n.signal});if(!s.ok){let e=await s.text().catch(()=>``),t=Error(`Fetch adapter request failed (${s.status}): ${e.slice(0,500)}`);throw t.status=s.status,t.headers=s.headers,t}let c=await s.json(),{content:l,usage:u,toolCalls:d}=e.mapResponse(c),f=d?.length?d.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}})):void 0,p={choices:[{message:{content:l,...f?{tool_calls:f}:{}}}],usage:u?{prompt_tokens:u.promptTokens,completion_tokens:u.completionTokens,total_tokens:u.totalTokens}:void 0},m=e.parseRateLimitHint??B;return s.headers&&typeof s.headers.get==`function`&&ft(p,m(s.headers)),p},async*createStream(t,n){if(!e.mapStreamEvent)throw new p(`stream: true requires mapStreamEvent to be configured on fromFetch`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`mapStreamEvent`}});if(e.request&&!e.requestStream)throw new p("`stream: true` requires `requestStream` to be configured on fromFetch when a custom `request` transport is set. `requestStream` does not fall back to `request` (it needs an async-iterable byte stream, which `RequestLike`'s buffered `ResponseLike` has no way to provide), without it, `stream: true` would silently use plain native `fetch` instead of your configured transport. Add a `requestStream` that opens the same connection your `request` does, or omit `request` if native `fetch` is fine for both.",`invalid_params`,{code:`unsupported_capability`,issues:{capability:`requestStream`}});let{url:r,method:i,headers:a,body:o}=await pr(e,t,e.mapRequest(t)),s=e.parseStreamFrames??gn,c;if(e.requestStream)c=await e.requestStream(r,{method:i,headers:a,body:o,signal:n.signal});else{let t=await fr(r,{method:i,headers:a,body:o,signal:n.signal});if(c=t.body,t.headers&&typeof t.headers.get==`function`){let n=(e.parseRateLimitHint??B)(t.headers);(n.remainingRequests!==void 0||n.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:n})}}for await(let t of s(c)){if(t===q){yield{type:`ping`};continue}let n=e.mapStreamEvent(t);n&&(Array.isArray(n)?yield*n:yield n)}}}}}}function hr(e,t){if(e.budget_tokens===void 0)return e;let{budget_tokens:n,...r}=e;return r.reasoning_effort===void 0?{...r,reasoning_effort:Q(n,t)}:r}function gr(e){return e.map(e=>e.type===`image`?{type:`image_url`,image_url:{url:`data:${Y(e.mimeType)};base64,${e.data}`}}:{type:`text`,text:e.text})}function _r(e){return e.messages.map(e=>{if(e.role===`user`&&Array.isArray(e.content))return{...e,content:gr(e.content)};if(e.role===`tool`){let{is_error:t,...n}=e;return n}return e})}function*vr(e){let t=e.choices?.[0]?.delta;if(t?.content&&(yield{type:`text-delta`,delta:t.content}),t?.tool_calls?.length)for(let e of t.tool_calls)yield{type:`tool_call_delta`,index:e.index,id:e.id,name:e.function?.name,argumentsDelta:e.function?.arguments};e.usage&&(yield{type:`usage`,usage:e.usage})}function $(e,t={}){let n=e,{supportsStreamUsage:r=!0,supportsWithResponse:i=!1}=t,a=Z(t.reasoningEffortTokens),o=n.chat.completions.create.bind(n.chat.completions);return{chat:{completions:{async create(e,t){let r=_r(e),o=hr({...e,messages:r},a);if(!i)return n.chat.completions.create(o,t);let{data:s,response:c}=await n.chat.completions.create(o,t).withResponse();return s&&typeof s==`object`&&ft(s,B(c.headers)),s},async*createStream(e,t){let s=_r(e),c=hr({...e,messages:s,stream:!0,...r?{stream_options:{include_usage:!0}}:{}},a),l;if(!i)l=await o(c,t);else{let{data:e,response:r}=await n.chat.completions.create(c,t).withResponse();l=e;let i=B(r.headers);(i.remainingRequests!==void 0||i.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:i})}for await(let e of l)yield*vr(e)}}}}}const yr=$,br=$,xr=$,Sr=$,Cr=$,wr=$,Tr=$,Er=$,Dr=$,Or=$,kr=$,Ar=$,jr=$,Mr=$,Nr=$,Pr=$,Fr=$,Ir=$,Lr=$,Rr=$,zr=$,Br=$,Vr=$,Hr=$,Ur=$,Wr=$,Gr=$,Kr=$,qr=$,Jr=$,Yr=$,Xr=$,Zr=$,Qr=$,$r=$,ei=$,ti=$,ni=$;export{He as CircuitBreaker,Ie as ConsecutiveTripping,fn as ConsoleLogger,w as FallbackExhaustedError,b as InMemoryCacheAdapter,p as LLMError,x as NormalizedCacheAdapter,tn as RateLimiter,Ue as RetryBudget,Le as RollingTripping,q as SSE_PING,S as TieredCacheAdapter,pn as VernLLM,le as createMiddleware,T as createMiddlewareStateBag,ce as createStateKey,Zt as defaultEstimateTokens,ae as defaultFallbackOn,hn as defineCachedCallParams,mn as defineCallParams,C as defineTool,ni as from01AI,Rn as fromAnthropic,Zr as fromAnyscale,ti as fromAtlasCloud,Hr as fromBaseten,sr as fromBedrock,Cr as fromCerebras,zr as fromCloudflareWorkersAI,kr as fromDeepInfra,Sr as fromDeepSeek,Ur as fromFeatherless,mr as fromFetch,Tr as fromFireworks,Wr as fromFriendli,Xn as fromGemini,br as fromGroq,jr as fromHyperbolic,$r as fromInferenceNet,ei as fromInfermatic,Pr as fromLMStudio,Yr as fromLambdaLabs,Qr as fromLepton,Jr as fromMiniMax,xr as fromMistral,Mr as fromMoonshot,Br as fromNebius,Ar as fromNovita,Lr as fromNvidiaNIM,Er as fromOllama,yr as fromOpenAI,$ as fromOpenAICompatible,Dr as fromOpenRouter,Kr as fromParasail,Or as fromPerplexity,Vr as fromSambaNova,Gr as fromSiliconFlow,Xr as fromSnowflakeCortex,qr as fromStepFun,wr as fromTogether,Fr as fromVLLM,Rr as fromVercelAIGateway,Ir as fromXAI,Nr as fromZhipu,h as hasIssues,oe as isFallbackExhaustedError,m as isLLMError,re as isStreamResult,ee as isToolCallResult,se as metaRef,gn as parseSseStream};
12
+ `)}let i=n.trim();if(i){let e=kn(i);e!==K&&e!==q&&(yield e)}}const K=Symbol(`sse-stream-done`),q=Symbol(`sse-frame-no-data`),J=Symbol(`sse-frame-ping`);function kn(e){let t=[],n=!1;for(let r of e.split(`
13
+ `)){if(r.startsWith(`:`)){n=!0;continue}r.startsWith(`data:`)&&t.push(r.startsWith(`data: `)?r.slice(6):r.slice(5))}if(!t.length)return n?J:q;let r=t.join(`
14
+ `);if(r===`[DONE]`)return K;try{return JSON.parse(r)}catch(e){throw new p(`Invalid JSON in SSE frame: ${r.slice(0,200)}`,`parse`,{cause:e,code:`stream_frame_invalid`})}}const An=[`image/png`,`image/jpeg`,`image/gif`,`image/webp`];function Y(e){if(An.includes(e))return e;throw new p(`Unsupported image mimeType "${e}": expected one of ${An.join(`, `)}`,`invalid_params`)}function jn(e,t){return t?Array.isArray(t)?t.includes(e):t(e):!1}const X={minimal:1024,low:4096,medium:16e3,high:32e3};function Z(e){if(!e)return X;let t={...X,...e};if(!(t.minimal<t.low&&t.low<t.medium&&t.medium<t.high))throw new p(`reasoningEffortTokens must keep tiers in strictly ascending order (minimal < low < medium < high), got ${JSON.stringify(t)}. An out-of-order override doesn't just misrank tiers, it can make some of them unreachable.`,`invalid_params`);return t}function Mn(e,t=X){return t[e]}function Q(e,t=X){return e<=t.minimal?`minimal`:e<=t.low?`low`:e<=t.medium?`medium`:`high`}function Nn(e){let t=/opus-(\d+)(?:-(\d+))?/.exec(e);if(!t)return null;let n=t[2],r=n===void 0||n.length>=8?0:Number(n);return[Number(t[1]),r]}function Pn(e){let t=Nn(e);if(t){let[e,n]=t;return e>4||e===4&&n>=7}return[`sonnet-5`,`fable-5`,`mythos`].some(t=>e.includes(t))}function Fn(e,t){return Pn(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function In(e,t){return!Fn(e,t)}function Ln(e,t){if(e<1024)throw new p(`budgetTokens (${e}) is below Anthropic's minimum of 1024. Raise budgetTokens, or use a reasoningEffort tier of 'low' or above with the default conversion table.`,`invalid_params`);if(e>=t)throw new p(`budgetTokens (${e}) must be less than maxTokens (${t}); the thinking budget and the reply share the same max_tokens ceiling on Anthropic. Raise maxTokens, or lower budgetTokens/reasoningEffort.`,`invalid_params`)}function Rn(e){if(e)throw new p(`budgetTokens/reasoningEffort was set alongside ${e}. Anthropic rejects thinking combined with a tool_choice that forces tool use, the model has to be able to reply with plain text for thinking to run. Use toolChoice: 'auto' (or omit toolChoice) for this call, or drop budgetTokens/reasoningEffort for it.`,`invalid_params`)}function zn(e){return e===`minimal`?`low`:e}function Bn(e,t){return Hn(t,e.toUpperCase())}function Vn(e){let t=/gemini-\d+\.(\d+)/.exec(e);return t?Number(t[1]):0}function Hn(e,t){if(!e.includes(`pro`))return t;let n=Un(e);return n===null||n<3?t:Vn(e)===0?t===`HIGH`?`HIGH`:`LOW`:t===`MINIMAL`?`LOW`:t}function Un(e){let t=/gemini-(\d+)/.exec(e);return t?Number(t[1]):null}function Wn(e){let t=Un(e);return t!==null&&t>=3}function Gn(e,t){return Wn(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function Kn(e){return e.map(e=>e.type===`image`?{type:`image`,source:{type:`base64`,media_type:Y(e.mimeType),data:e.data}}:{type:`text`,text:e.text})}function qn(e,t){if(e.type!==`object`)throw new p(`Tool "${t}"'s schema must have "type": "object" (Anthropic requires object-shaped tool parameters).`,`validation`);return e}function Jn(e){return!e||e===`auto`?{type:`auto`}:e===`none`?{type:`none`}:e===`required`?{type:`any`}:{type:`tool`,name:e.function.name}}function Yn(e,t){return{tools:e.map(e=>({name:e.function.name,description:e.function.description,input_schema:qn(e.function.parameters,e.function.name)})),toolChoice:Jn(t)}}function Xn(e,t,n,r){let i=e.messages.find(e=>e.role===`system`),a=e.messages.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool`),o=e.response_format?.type===`json_schema`?e.response_format.json_schema:void 0,s=o?.name.trim();if(o&&!s)throw new p(`json_schema.name must not be empty.`,`validation`);let c=!!o&&jn(e.model,t);if(o&&e.tools?.length&&!c)throw new p(`Anthropic model "${e.model}" is not covered by nativeStructuredOutputModels, so \`jsonSchema\` is emulated as a forced single tool call there, which collides with the \`tools\` you also provided. Either drop \`tools\` or \`jsonSchema\` for this call, or pass this model in fromAnthropic's \`nativeStructuredOutputModels\` option once you've confirmed it supports Anthropic's \`output_config.format\`.`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`tools_with_json_schema`}});if(e.response_format?.type===`json_object`)throw new p('response_format: "json_object" is not supported on Anthropic. Unlike OpenAI, Anthropic has no API-level field that mechanically guarantees valid JSON output for this mode, so it used to be emulated by injecting a "respond with JSON only" instruction into the system prompt, a guarantee this adapter can no longer make. Use `jsonSchema` instead, which maps to a real API-level constraint (Anthropic\'s native output_config.format on covered models, or a forced single tool call otherwise).',`validation`);let l,u,d,f;if(o&&c)u={type:`json_schema`,schema:o.schema},e.tools?.length&&({tools:d,toolChoice:f}=Yn(e.tools,e.tool_choice));else if(o&&s){let{schema:e,description:t,strict:n}=o;l=s,d=[{name:l,description:t,input_schema:qn(e,l),strict:n}],f={type:`tool`,name:l}}!o&&e.tools?.length&&({tools:d,toolChoice:f}=Yn(e.tools,e.tool_choice));let m,h;if(e.budget_tokens!==void 0||e.reasoning_effort!==void 0){if(Rn(f?.type===`tool`?`toolChoice forcing the "${f.name}" tool`:f?.type===`any`?`toolChoice: 'required' (Anthropic's "any" tool_choice)`:void 0),In(e.model,r)){let t=e.budget_tokens??Mn(e.reasoning_effort,n);Ln(t,e.max_tokens),m={type:`enabled`,budget_tokens:t}}else{let t=e.reasoning_effort??Q(e.budget_tokens,n);m={type:`adaptive`},h=zn(t)}}let g=i?.content,_=m?void 0:e.temperature;return{body:{model:e.model,max_tokens:e.max_tokens,..._===void 0?{}:{temperature:_},system:g||void 0,messages:Qn(a.map(e=>$n(e))),...d?{tools:d,tool_choice:f}:{},...u||h?{output_config:{...u?{format:u}:{},...h?{effort:h}:{}}}:{},...m?{thinking:m}:{}},toolName:l}}function Zn(e,t){let n=t?.nativeStructuredOutputModels,r=Z(t?.reasoningEffortTokens),i=t?.adaptiveOnlyModels,a=t?.supportsWithResponse??!1,o=e.messages.create.bind(e.messages);return{supportsJsonObjectMode:!1,chat:{completions:{async create(t,o){let{body:s,toolName:c}=Xn(t,n,r,i),l,u=a?await(async()=>{let{data:t,response:n}=await e.messages.create(s,o).withResponse();return l=n.headers,t})():await e.messages.create(s,o),d,f;if(c){let e=u.content.find(e=>e.type===`tool_use`&&e.name===c);if(!e)throw new p(`Anthropic did not return the required structured output tool "${c}".`,`validation`);if(!e.input||typeof e.input!=`object`||Array.isArray(e.input))throw new p(`Anthropic returned invalid structured output for tool "${c}". Expected an object.`,`validation`);d=JSON.stringify(e.input)}else{d=u.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``);let e=u.content.filter(e=>e.type===`tool_use`);e.length&&(f=e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input??{})}})))}let m={choices:[{message:{content:d,...f?{tool_calls:f}:{}}}],usage:{prompt_tokens:u.usage?.input_tokens,completion_tokens:u.usage?.output_tokens,total_tokens:(u.usage?.input_tokens??0)+(u.usage?.output_tokens??0),...u.usage?.output_tokens_details?.thinking_tokens===void 0?{}:{completion_tokens_details:{reasoning_tokens:u.usage.output_tokens_details.thinking_tokens}}}};return l&&H(m,Ct(l)),m},async*createStream(t,s){let{body:c,toolName:l}=Xn(t,n,r,i),u;if(!a)u=await o({...c,stream:!0},s);else{let{data:t,response:n}=await e.messages.create({...c,stream:!0},s).withResponse();u=t;let r=Ct(n.headers);(r.remainingRequests!==void 0||r.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:r})}let d=new Map,f=0,m=!1;for await(let e of u)if(e.type===`message_start`)f=e.message.usage?.input_tokens??0;else if(e.type===`content_block_start`){if(e.content_block.type===`tool_use`){let t=e.content_block.name===l?`json-tool`:`tool_use`;d.set(e.index,t),t===`json-tool`?m=!0:l||(yield{type:`tool_call_delta`,index:e.index,id:e.content_block.id,name:e.content_block.name})}else d.set(e.index,`text`)}else if(e.type===`content_block_delta`)e.delta.type===`text_delta`?l||(yield{type:`text-delta`,delta:e.delta.text}):e.delta.type===`input_json_delta`&&(d.get(e.index)===`json-tool`?yield{type:`text-delta`,delta:e.delta.partial_json}:l||(yield{type:`tool_call_delta`,index:e.index,argumentsDelta:e.delta.partial_json}));else if(e.type===`message_delta`){let t=e.usage?.output_tokens??0,n=e.usage?.output_tokens_details?.thinking_tokens;yield{type:`usage`,usage:{prompt_tokens:f,completion_tokens:t,total_tokens:f+t,...n===void 0?{}:{completion_tokens_details:{reasoning_tokens:n}}}}}else e.type===`ping`&&(yield{type:`ping`});if(l&&!m)throw new p(`Anthropic did not return the required structured output tool "${l}".`,`validation`)}}}}}function Qn(e){let t=e=>e.role===`user`&&Array.isArray(e.content)&&e.content.length>0&&e.content.every(e=>e.type===`tool_result`),n=[];for(let r of e){let e=n.at(-1);t(r)&&e&&t(e)?e.content.push(...r.content):n.push(r)}return n}function $n(e){if(e.role===`tool`)return{role:`user`,content:[{type:`tool_result`,tool_use_id:e.tool_call_id,content:e.content,...e.is_error?{is_error:!0}:{}}]};if(e.role===`assistant`&&e.tool_calls?.length){let t=[];e.content&&t.push({type:`text`,text:e.content});for(let n of e.tool_calls){let e;try{e=n.function.arguments.trim()?JSON.parse(n.function.arguments):{}}catch(e){throw new p(`Assistant tool call "${n.function.name}" (${n.id}) has arguments that are not valid JSON.`,`validation`,{cause:e})}if(e===null||Array.isArray(e)||typeof e!=`object`)throw new p(`Assistant tool call "${n.function.name}" (${n.id}) arguments must be a JSON object.`,`validation`);t.push({type:`tool_use`,id:n.id,name:n.function.name,input:e})}return{role:`assistant`,content:t}}return{role:e.role,content:Array.isArray(e.content)?Kn(e.content):e.content??``}}function er(e){return e.map(e=>e.type===`image`?{inlineData:{mimeType:Y(e.mimeType),data:e.data}}:{text:e.text})}function tr(e,t){return`${e}#${t}`}function nr(e){return!e||e===`auto`?{functionCallingConfig:{mode:`AUTO`}}:e===`none`?{functionCallingConfig:{mode:`NONE`}}:e===`required`?{functionCallingConfig:{mode:`ANY`}}:{functionCallingConfig:{mode:`ANY`,allowedFunctionNames:[e.function.name]}}}function rr(e){let t=new Map;for(let n of e)if(n.role===`assistant`)for(let e of n.tool_calls??[])t.set(e.id,e.function.name);return t}function ir(e,t){if(e.role===`tool`)return{role:`user`,parts:[{functionResponse:{id:e.tool_call_id,name:t.get(e.tool_call_id)??e.tool_call_id,response:or(e.content)}}]};if(e.role===`assistant`&&e.tool_calls?.length){let t=[];return typeof e.content==`string`&&e.content&&t.push({text:e.content}),t.push(...e.tool_calls.map(e=>({functionCall:{id:e.id,name:e.function.name,args:ar(e.function.arguments,e.function.name)}}))),{role:`model`,parts:t}}return{role:e.role===`assistant`?`model`:`user`,parts:Array.isArray(e.content)?er(e.content):[{text:e.content??``}]}}function ar(e,t){let n;try{n=e.trim()?JSON.parse(e):{}}catch(e){throw new p(`Tool call "${t}" arguments are not valid JSON.`,`parse`,{cause:e,code:`tool_arguments_parse_failed`})}if(!n||Array.isArray(n)||typeof n!=`object`)throw new p(`Tool call "${t}" arguments must be a JSON object.`,`validation`);return n}function or(e){let t;try{t=e.trim()?JSON.parse(e):``}catch{t=e}return t&&!Array.isArray(t)&&typeof t==`object`?t:{output:t}}function sr(e){let t=e=>e.role===`user`&&e.parts.length>0&&e.parts.every(e=>`functionResponse`in e),n=[];for(let r of e){let e=n.at(-1);t(r)&&e&&t(e)?e.parts.push(...r.parts):n.push(r)}return n}function cr(e,t,n){let r=e.messages.find(e=>e.role===`system`),i=e.messages.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool`),a=!!e.response_format,o={...e.temperature===void 0?{}:{temperature:e.temperature},maxOutputTokens:e.max_tokens,...r?{systemInstruction:{parts:[{text:r.content}]}}:{}};if(a&&(o.responseMimeType=`application/json`),e.response_format?.type===`json_schema`){let{schema:t,description:n}=e.response_format.json_schema;o.responseSchema={...t,...n?{description:n}:{}}}if(e.tools?.length&&(o.tools=[{functionDeclarations:e.tools.map(e=>({name:e.function.name,description:e.function.description,parameters:e.function.parameters}))}],o.toolConfig=nr(e.tool_choice)),Gn(e.model,n)){let n=e.reasoning_effort??(e.budget_tokens===void 0?void 0:Q(e.budget_tokens,t));n!==void 0&&(o.thinkingConfig={thinkingLevel:Bn(n,e.model)})}else{let n=e.budget_tokens??(e.reasoning_effort?Mn(e.reasoning_effort,t):void 0);n!==void 0&&(o.thinkingConfig={thinkingBudget:n})}let s=rr(i);return{model:e.model,contents:sr(i.map(e=>ir(e,s))),config:o}}function lr(e,t){let n=Z(t?.reasoningEffortTokens),r=t?.thinkingLevelModels,i=e.models??e;if(typeof i.generateContent!=`function`)throw new p(`fromGemini requires a client with generateContent: pass ai.models, or the whole ai client (fromGemini(ai)).`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`generateContent`}});let a=i.generateContent.bind(i),o=typeof i.generateContentStream==`function`?i.generateContentStream.bind(i):void 0;return{chat:{completions:{async create(e,t){let i=cr(e,n,r);i.config={...i.config,abortSignal:t.signal};let o=await a(i),s=o.candidates?.[0]?.content?.parts??[],c=s.map(e=>e.text??``).join(``),l=s.filter(e=>e.functionCall),u;if(l.length){let e=new Map;u=l.map(t=>{let n=t.functionCall.name,r=t.functionCall.id,i=e.get(n)??0;return e.set(n,i+1),{id:r??tr(n,i),type:`function`,function:{name:n,arguments:JSON.stringify(t.functionCall.args??{})}}})}return{choices:[{message:{content:c,...u?{tool_calls:u}:{}}}],usage:{prompt_tokens:o.usageMetadata?.promptTokenCount,completion_tokens:o.usageMetadata?.candidatesTokenCount,total_tokens:o.usageMetadata?.totalTokenCount,...o.usageMetadata?.thoughtsTokenCount===void 0?{}:{completion_tokens_details:{reasoning_tokens:o.usageMetadata.thoughtsTokenCount}}}}},async*createStream(e,t){if(!o)throw new p(`stream: true requires a Gemini client with generateContentStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`generateContentStream`}});let i=cr(e,n,r);i.config={...i.config,abortSignal:t.signal};let a=await o(i),s=0,c=new Map,l;for await(let e of a){let t=e.candidates?.[0]?.content?.parts??[];for(let e of t)if(e.text&&(yield{type:`text-delta`,delta:e.text}),e.functionCall){let t=e.functionCall.name,n=e.functionCall.id,r=t?c.get(t)??0:0;t&&c.set(t,r+1),yield{type:`tool_call_delta`,index:s,id:n??(t?tr(t,r):void 0),name:e.functionCall.name,argumentsDelta:JSON.stringify(e.functionCall.args??{}),complete:!0},s++}e.usageMetadata&&(l=e.usageMetadata)}l&&(yield{type:`usage`,usage:{prompt_tokens:l.promptTokenCount,completion_tokens:l.candidatesTokenCount,total_tokens:l.totalTokenCount,...l.thoughtsTokenCount===void 0?{}:{completion_tokens_details:{reasoning_tokens:l.thoughtsTokenCount}}}})}}}}}function ur(e){return e.includes(`claude`)}function dr(e){switch(Y(e)){case`image/png`:return`png`;case`image/jpeg`:return`jpeg`;case`image/gif`:return`gif`;case`image/webp`:return`webp`}}function fr(e){return new Uint8Array(Buffer.from(e,`base64`))}function pr(e){return e.map(e=>e.type===`image`?{image:{format:dr(e.mimeType),source:{bytes:fr(e.data)}}}:{text:e.text})}function mr(e,t){return{tools:e.map(e=>({toolSpec:{name:e.function.name,description:e.function.description,inputSchema:{json:e.function.parameters}}})),toolChoice:xr(t)}}function hr(e,t,n,r,i){let a=e.messages.find(e=>e.role===`system`),o=e.messages.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool`),s=e.response_format?.type===`json_schema`?e.response_format.json_schema:void 0,c=s?.name.trim();if(s&&!c)throw new p(`json_schema.name must not be empty.`,`validation`);let l=!!s&&jn(e.model,n);if(s&&e.tools?.length&&!l)throw new p(`Bedrock model "${e.model}" is not covered by nativeStructuredOutputModels, so \`jsonSchema\` is emulated as a forced single tool call there (via \`toolConfig\`), which collides with the \`tools\` you also provided. Either drop \`tools\` or \`jsonSchema\` for this call, or pass this model in fromBedrock's \`nativeStructuredOutputModels\` option once you've confirmed it supports Converse's \`outputConfig.textFormat\`.`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`tools_with_json_schema`}});if(e.response_format?.type===`json_object`)throw new p('response_format: "json_object" is not supported on Bedrock. Converse has no field that mechanically guarantees valid JSON output for this mode, so it used to be emulated by injecting a "respond with JSON only" instruction into the system prompt, a guarantee this adapter can no longer make. Use `jsonSchema` instead, which maps to a real constraint (Converse\'s native outputConfig.textFormat on covered models, or a forced tool call otherwise).',`validation`);let u,d,f;if(s&&l){let{schema:e,description:t}=s;f={textFormat:{type:`json_schema`,structure:{jsonSchema:{schema:JSON.stringify(e),name:c,description:t}}}}}else if(s&&c){let{schema:e,description:t,strict:n}=s;u=c,d={tools:[{toolSpec:{name:u,description:t,inputSchema:{json:e},strict:n}}],toolChoice:{tool:{name:u}}}}if(e.tools?.length&&!u&&(d=mr(e.tools,e.tool_choice)),s&&d&&t&&!(Array.isArray(t)?t.includes(e.model):t(e.model)))throw new p(`Bedrock model "${e.model}" is not listed in toolUseSupportedModels, but this call requires Converse tool use (either jsonSchema emulated as a forced tool call, or real \`tools\` sent alongside native structured output).`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`toolUseSupportedModels`}});let m,h;if(ur(e.model)&&(e.budget_tokens!==void 0||e.reasoning_effort!==void 0)){let t=d?.toolChoice;if(Rn(t&&`tool`in t?`toolChoice forcing the "${t.tool?.name}" tool`:t&&`any`in t?`toolChoice: 'required' (Converse's "any" tool_choice)`:void 0),In(e.model,i)){let t=e.budget_tokens??Mn(e.reasoning_effort,r);Ln(t,e.max_tokens),m={thinking:{type:`enabled`,budget_tokens:t}}}else{let t=e.reasoning_effort??Q(e.budget_tokens,r);m={thinking:{type:`adaptive`}},h=zn(t)}}let g=m?void 0:e.temperature;return{request:{modelId:e.model,messages:Cr(o.map(e=>Sr(e))),system:a?.content?[{text:a.content}]:void 0,inferenceConfig:{...g===void 0?{}:{temperature:g},maxTokens:e.max_tokens},...d?{toolConfig:d}:{},...f||h?{outputConfig:{...f??{},...h?{effort:h}:{}}}:{},...m?{additionalModelRequestFields:m}:{}},toolName:u}}function gr(e){return typeof e.send==`function`}function _r(e){if(`messageStart`in e)return{messageStart:e.messageStart};if(`contentBlockStart`in e)return{contentBlockStart:e.contentBlockStart};if(`contentBlockDelta`in e)return{contentBlockDelta:e.contentBlockDelta};if(`contentBlockStop`in e)return{contentBlockStop:e.contentBlockStop};if(`messageStop`in e)return{messageStop:e.messageStop};if(`metadata`in e)return{metadata:e.metadata};if(`internalServerException`in e)return{internalServerException:e.internalServerException};if(`modelStreamErrorException`in e)return{modelStreamErrorException:e.modelStreamErrorException};if(`validationException`in e)return{validationException:e.validationException};if(`throttlingException`in e)return{throttlingException:e.throttlingException};if(`serviceUnavailableException`in e)return{serviceUnavailableException:e.serviceUnavailableException}}async function*vr(e){for await(let t of e){let e=_r(t);e&&(yield e)}}function yr(e){let t;function n(){return t??=import(`@aws-sdk/client-bedrock-runtime`).then(e=>e,e=>{throw t=void 0,new p(`fromBedrock requires "@aws-sdk/client-bedrock-runtime" to be installed to use a raw AWS SDK client (it is not a dependency of vern-llm itself). Install it, or pass your own object with .converse()/.converseStream() methods instead.`,`validation`,{cause:e})}),t}return{converse:async(t,r)=>{let{ConverseCommand:i}=await n();return e.send(new i(t),{abortSignal:r.signal})},converseStream:async(t,r)=>{let{ConverseStreamCommand:i}=await n(),a=await e.send(new i(t),{abortSignal:r.signal});if(!a.stream)throw new p(`Bedrock ConverseStreamCommand response did not include a stream. This can happen if the request or the model doesn't actually support Converse streaming.`,`api`,{code:`server_error`});return{stream:vr(a.stream)}}}}function br(e,t){let n=gr(e)?yr(e):e,r=t?.toolUseSupportedModels,i=t?.nativeStructuredOutputModels,a=Z(t?.reasoningEffortTokens),o=t?.adaptiveOnlyModels;return{supportsJsonObjectMode:!1,chat:{completions:{async create(e,t){let{request:s,toolName:c}=hr(e,r,i,a,o),l=await n.converse(s,t),u,d;if(c){let e=l.output?.message?.content?.find(e=>e.toolUse?.name===c);u=e?.toolUse?JSON.stringify(e.toolUse.input):``}else{let e=l.output?.message?.content??[];u=e.map(e=>e.text??``).join(``);let t=e.filter(e=>!!e.toolUse);t.length&&(d=t.map((e,t)=>{let n=e.toolUse;if(!n.name)throw new p(`Bedrock returned a toolUse block without a name at index ${t}.`,`validation`);return{id:n.toolUseId??`${n.name}_${t}`,type:`function`,function:{name:n.name,arguments:JSON.stringify(n.input??{})}}}))}return{choices:[{message:{content:u,...d?{tool_calls:d}:{}}}],usage:{prompt_tokens:l.usage?.inputTokens,completion_tokens:l.usage?.outputTokens,total_tokens:l.usage?.totalTokens}}},async*createStream(e,t){if(!n.converseStream)throw new p(`stream: true requires a Bedrock client with converseStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`converseStream`}});let{request:s,toolName:c}=hr(e,r,i,a,o),{stream:l}=await n.converseStream(s,t),u=new Map;for await(let e of l)if(`contentBlockStart`in e){let{contentBlockIndex:t,start:n}=e.contentBlockStart;if(n?.toolUse){let e=n.toolUse.name===c?`json-tool`:`tool_use`;u.set(t,e),e===`tool_use`&&!c&&(yield{type:`tool_call_delta`,index:t,id:n.toolUse.toolUseId,name:n.toolUse.name})}else u.set(t,`text`)}else if(`contentBlockDelta`in e){let{contentBlockIndex:t,delta:n}=e.contentBlockDelta;n&&`text`in n&&n.text!==void 0&&!c?yield{type:`text-delta`,delta:n.text}:n&&`toolUse`in n&&n.toolUse?.input!==void 0&&(u.get(t)===`json-tool`?yield{type:`text-delta`,delta:n.toolUse.input}:c||(yield{type:`tool_call_delta`,index:t,argumentsDelta:n.toolUse.input}))}else if(`metadata`in e&&e.metadata.usage)yield{type:`usage`,usage:{prompt_tokens:e.metadata.usage.inputTokens,completion_tokens:e.metadata.usage.outputTokens,total_tokens:e.metadata.usage.totalTokens}};else if(`throttlingException`in e)throw new p(e.throttlingException.message??`Bedrock throttled the request mid-stream`,`api`,{status:429,code:`provider_rate_limited`});else if(`validationException`in e)throw new p(e.validationException.message??`Bedrock rejected the request mid-stream`,`validation`);else if(`internalServerException`in e||`serviceUnavailableException`in e||`modelStreamErrorException`in e){let t=`internalServerException`in e&&e.internalServerException.message||`serviceUnavailableException`in e&&e.serviceUnavailableException.message||`modelStreamErrorException`in e&&e.modelStreamErrorException.message||`Bedrock reported a mid-stream error`,n=`modelStreamErrorException`in e&&e.modelStreamErrorException.originalStatusCode||`serviceUnavailableException`in e&&503||500;throw new p(t,`api`,{status:n,code:n>=500?`server_error`:void 0})}}}}}}function xr(e){if(!e||e===`auto`)return{auto:{}};if(e===`required`)return{any:{}};if(e===`none`)throw new p("'none' is not supported by fromBedrock: Bedrock Converse has no `tool_choice` equivalent to forbidding tool use while tools are still offered. Omit `tools` entirely for this call instead.",`invalid_params`,{code:`unsupported_capability`,issues:{capability:`toolChoice: 'none'`}});return{tool:{name:e.function.name}}}function Sr(e){if(e.role===`tool`)return{role:`user`,content:[{toolResult:{toolUseId:e.tool_call_id,content:[{text:e.content}],status:e.is_error?`error`:`success`}}]};if(e.role===`assistant`&&e.tool_calls?.length){let t=[];e.content&&t.push({text:e.content});for(let n of e.tool_calls){let e;if(!n.function.arguments.trim())e={};else try{e=JSON.parse(n.function.arguments)}catch(e){throw new p(`Assistant tool call "${n.function.name}" (${n.id}) has arguments that are not valid JSON.`,`validation`,{cause:e})}t.push({toolUse:{toolUseId:n.id,name:n.function.name,input:e}})}return{role:`assistant`,content:t}}return{role:e.role,content:Array.isArray(e.content)?pr(e.content):[{text:e.content??``}]}}function Cr(e){let t=e=>e.role===`user`&&e.content.length>0&&e.content.every(e=>`toolResult`in e),n=[];for(let r of e){let e=n.at(-1);t(r)&&e&&t(e)?e.content.push(...r.content):n.push(r)}return n}async function*wr(e){let t=e.getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e)return;n&&(yield n)}}finally{try{await t.cancel()}catch{}t.releaseLock()}}async function Tr(e,t){let n=await fetch(e,t);if(!n.ok){let e=await n.text().catch(()=>``),t=Error(`Fetch adapter stream request failed (${n.status}): ${e.slice(0,500)}`);throw t.status=n.status,t.headers=n.headers,t}if(!n.body)throw Error(`Fetch adapter stream request received a response with no body.`);return{headers:n.headers,body:wr(n.body)}}async function Er(e,t,n){let r=typeof e.url==`function`?e.url(t):e.url,i=typeof e.headers==`function`?await e.headers():e.headers,a=e.method??`POST`,o=![`GET`,`HEAD`].includes(a.toUpperCase());return{url:r,method:a,headers:o?{"Content-Type":`application/json`,...i}:{...i},...o?{body:JSON.stringify(n)}:{}}}function Dr(e){return{chat:{completions:{async create(t,n){let{url:r,method:i,headers:a,body:o}=await Er(e,t,e.mapRequest(t)),s=await(e.request??fetch)(r,{method:i,headers:a,body:o,signal:n.signal});if(!s.ok){let e=await s.text().catch(()=>``),t=Error(`Fetch adapter request failed (${s.status}): ${e.slice(0,500)}`);throw t.status=s.status,t.headers=s.headers,t}let c=await s.json(),{content:l,usage:u,toolCalls:d}=e.mapResponse(c),f=d?.length?d.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}})):void 0,p={choices:[{message:{content:l,...f?{tool_calls:f}:{}}}],usage:u?{prompt_tokens:u.promptTokens,completion_tokens:u.completionTokens,total_tokens:u.totalTokens}:void 0},m=e.parseRateLimitHint??V;return s.headers&&typeof s.headers.get==`function`&&H(p,m(s.headers)),p},async*createStream(t,n){if(!e.mapStreamEvent)throw new p(`stream: true requires mapStreamEvent to be configured on fromFetch`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`mapStreamEvent`}});if(e.request&&!e.requestStream)throw new p("`stream: true` requires `requestStream` to be configured on fromFetch when a custom `request` transport is set. `requestStream` does not fall back to `request` (it needs an async-iterable byte stream, which `RequestLike`'s buffered `ResponseLike` has no way to provide), without it, `stream: true` would silently use plain native `fetch` instead of your configured transport. Add a `requestStream` that opens the same connection your `request` does, or omit `request` if native `fetch` is fine for both.",`invalid_params`,{code:`unsupported_capability`,issues:{capability:`requestStream`}});let{url:r,method:i,headers:a,body:o}=await Er(e,t,e.mapRequest(t)),s=e.parseStreamFrames??On,c;if(e.requestStream)c=await e.requestStream(r,{method:i,headers:a,body:o,signal:n.signal});else{let t=await Tr(r,{method:i,headers:a,body:o,signal:n.signal});if(c=t.body,t.headers&&typeof t.headers.get==`function`){let n=(e.parseRateLimitHint??V)(t.headers);(n.remainingRequests!==void 0||n.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:n})}}for await(let t of s(c)){if(t===J){yield{type:`ping`};continue}let n=e.mapStreamEvent(t);n&&(Array.isArray(n)?yield*n:yield n)}}}}}}function Or(e,t){if(e.budget_tokens===void 0)return e;let{budget_tokens:n,...r}=e;return r.reasoning_effort===void 0?{...r,reasoning_effort:Q(n,t)}:r}function kr(e){return e.map(e=>e.type===`image`?{type:`image_url`,image_url:{url:`data:${Y(e.mimeType)};base64,${e.data}`}}:{type:`text`,text:e.text})}function Ar(e){return e.messages.map(e=>{if(e.role===`user`&&Array.isArray(e.content))return{...e,content:kr(e.content)};if(e.role===`tool`){let{is_error:t,...n}=e;return n}return e})}function*jr(e){let t=e.choices?.[0]?.delta;if(t?.content&&(yield{type:`text-delta`,delta:t.content}),t?.tool_calls?.length)for(let e of t.tool_calls)yield{type:`tool_call_delta`,index:e.index,id:e.id,name:e.function?.name,argumentsDelta:e.function?.arguments};e.usage&&(yield{type:`usage`,usage:e.usage})}function $(e,t={}){let n=e,{supportsStreamUsage:r=!0,supportsWithResponse:i=!1}=t,a=Z(t.reasoningEffortTokens),o=n.chat.completions.create.bind(n.chat.completions);return{chat:{completions:{async create(e,t){let r=Ar(e),o=Or({...e,messages:r},a);if(!i)return n.chat.completions.create(o,t);let{data:s,response:c}=await n.chat.completions.create(o,t).withResponse();return s&&typeof s==`object`&&H(s,V(c.headers)),s},async*createStream(e,t){let s=Ar(e),c=Or({...e,messages:s,stream:!0,...r?{stream_options:{include_usage:!0}}:{}},a),l;if(!i)l=await o(c,t);else{let{data:e,response:r}=await n.chat.completions.create(c,t).withResponse();l=e;let i=V(r.headers);(i.remainingRequests!==void 0||i.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:i})}for await(let e of l)yield*jr(e)}}}}}const Mr=$,Nr=$,Pr=$,Fr=$,Ir=$,Lr=$,Rr=$,zr=$,Br=$,Vr=$,Hr=$,Ur=$,Wr=$,Gr=$,Kr=$,qr=$,Jr=$,Yr=$,Xr=$,Zr=$,Qr=$,$r=$,ei=$,ti=$,ni=$,ri=$,ii=$,ai=$,oi=$,si=$,ci=$,li=$,ui=$,di=$,fi=$,pi=$,mi=$,hi=$;export{We as CircuitBreaker,Le as ConsecutiveTripping,Cn as ConsoleLogger,oe as FallbackExhaustedError,b as InMemoryCacheAdapter,p as LLMError,x as NormalizedCacheAdapter,hn as RateLimiter,Ge as RetryBudget,Re as RollingTripping,J as SSE_PING,S as TieredCacheAdapter,Tn as VernLLM,ue as createMiddleware,w as createMiddlewareStateBag,le as createStateKey,un as defaultEstimateTokens,ae as defaultFallbackOn,Dn as defineCachedCallParams,En as defineCallParams,C as defineTool,hi as from01AI,Zn as fromAnthropic,ui as fromAnyscale,mi as fromAtlasCloud,ti as fromBaseten,br as fromBedrock,Ir as fromCerebras,Qr as fromCloudflareWorkersAI,Hr as fromDeepInfra,Fr as fromDeepSeek,ni as fromFeatherless,Dr as fromFetch,Rr as fromFireworks,ri as fromFriendli,lr as fromGemini,Nr as fromGroq,Wr as fromHyperbolic,fi as fromInferenceNet,pi as fromInfermatic,qr as fromLMStudio,ci as fromLambdaLabs,di as fromLepton,si as fromMiniMax,Pr as fromMistral,Gr as fromMoonshot,$r as fromNebius,Ur as fromNovita,Xr as fromNvidiaNIM,zr as fromOllama,Mr as fromOpenAI,$ as fromOpenAICompatible,Br as fromOpenRouter,ai as fromParasail,Vr as fromPerplexity,ei as fromSambaNova,ii as fromSiliconFlow,li as fromSnowflakeCortex,oi as fromStepFun,Lr as fromTogether,Jr as fromVLLM,Zr as fromVercelAIGateway,Yr as fromXAI,Kr as fromZhipu,h as hasIssues,se as isFallbackExhaustedError,m as isLLMError,re as isStreamResult,ee as isToolCallResult,ce as metaRef,On as parseSseStream};
15
15
  //# sourceMappingURL=index.mjs.map