vern-llm 2.8.0 → 2.9.1

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 w(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.type===`tool_calls`&&Array.isArray(t.toolCalls)}function ee(e){return typeof e==`object`&&!!e&&typeof e.then==`function`}function te(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`}function ne(e){if(typeof e!=`object`||!e)return!1;let t=e;return te(t.chunks)&&ee(t.finalResult)}const re=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),ie=e=>e.type===`parse`||e.type===`validation`||e.type===`aborted`||e.type===`quota_exceeded`||e.code&&re.has(e.code)?`stop`:`next`;var T=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 ae(e){return e instanceof T}function oe(){return{}}function se(e){return{debugName:e}}function ce(e){return se(e)}function le(e){return se(e)}function ue(e){return{ref:e}}function E(){let e=new Map;return{get(t){return e.get(t)},set(t,n){e.set(t,n)}}}function de(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 fe(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 pe(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 me(e,t,n,r){return async i=>{try{await e.refundUsage?.({coalesced:t,signal:n})}catch(e){r(i,e)}}}async function D(e,t,n,r,i){if(r?.aborted)throw new p(`LLM request aborted`,`aborted`);let a=await pe(e,t,r),o=me(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 he(e,t,n,r){if(n?.aborted)throw new p(`LLM request aborted`,`aborted`);let i=await pe(e,!1,n),a=me(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 ge(){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 _e(e){return typeof e==`string`?e:JSON.stringify(e)??``}function ve(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:_e(t.content)})}else n.push({type:`text-delta`,delta:_e(e)});return{async*[Symbol.asyncIterator](){for(let e of n)yield e}}}function ye(e,t){return{async*[Symbol.asyncIterator](){yield*ve(await e,t)}}}var be=class{cache;logger;inFlight=ge();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 D(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=D(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:ve(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:ye(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=he(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 xe=1e4;function Se(e){return!e||e<=0||e===1/0?void 0:e}function Ce(e){return Math.min(e,2147483647)}async function we(e,t,n){let r=new AbortController,i=Se(t),a=i===void 0?void 0:setTimeout(()=>{r.abort()},Ce(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 Te(e,t,n,r){let i=Se(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`}))},Ce(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 Ee=[{name:`Retry-After-Ms`,kind:`ms`},{name:`X-Retry-After-Ms`,kind:`ms`},{name:`Retry-After`,kind:`seconds`},{name:`Retry-After`,kind:`date`}];function De(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 Oe(e,t){return e<0?void 0:Math.min(e,t)}function ke(e,t=xe){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 Ee){let i=De(r,e)?.trim();if(i){if(n===`ms`&&/^\d+$/.test(i))return Oe(Number(i),t);if(n===`seconds`&&/^\d+(\.\d+)?$/.test(i))return Oe(Number(i)*1e3,t);if(n===`date`){let e=Date.parse(i);if(!Number.isNaN(e))return Oe(e-Date.now(),t)}}}}function Ae(e){return Math.random()*e}function je(e,t,n=xe,r=!1,i=!1){return Ae(Math.min(e*(r?2:i?1.5:1)*2**t,n))}async function Me(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 Ne(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 Pe(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=ke(i),y=h(i),b=v??je(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 Me(b,o)}async function Fe(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 Ie(e,t=`minCalls`){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer, got ${e}`)}function Le(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 Re(e){if(e===void 0)return;if(typeof e==`function`)return e;let{multiplier:t,maxMs:n=1/0}=e;return(e,r)=>Ae(Math.min(r*t**e,n))}var ze=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)}},Be=class{windowMs;minCalls;failureRatio;ratiosByKey=new Map;constructor(e,t,n){this.windowMs=e,this.minCalls=t,this.failureRatio=n,new O(e),Ie(t),Le(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 Ve(e){return`onFailure`in e?e:e.kind===`consecutive`?new ze(e.threshold):new Be(e.windowMs,e.minCalls,e.failureRatio)}function He(){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 Ue(e,t){return!t||A.get(t.state)===e.trial}function We(e,t){let n=t??`unknown`;e.failuresByReason.set(n,(e.failuresByReason.get(n)??0)+1)}var Ge=class{cooldownMs;onStateChange;isolateByModel;halfOpenProbes;halfOpenSuccessRatio;cooldownBackoff;tripping;sharedBucket=He();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=Re(e.cooldownBackoff),this.tripping=Ve(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&&Ue(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&&Ue(r,t)){r.trial.failures+=1,We(r,n),this.settleTrialIfComplete(r,e,t);return}r.state!==`half-open`&&(r.consecutiveFailures+=1,We(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=He(),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)}},Ke=class{options;ratio;constructor(e){this.options=e,this.ratio=new O(e.windowMs),Ie(e.minCalls),Le(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,t,n){e.error(`[VernLLM] ${t} failed`,{message:n instanceof Error?n.message:`unknown`,stack:n instanceof Error?n.stack:void 0})}function qe(e){return{debug:M(e,`debug`),warn:M(e,`warn`),error:M(e,`error`)}}function M(e,t){let n=e[t].bind(e);return((...e)=>{try{Ye(n(...e))}catch{}})}function Je(e){return typeof e?.then==`function`}function Ye(e){Je(e)&&Promise.resolve(e).catch(()=>{})}function N(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 Xe=new Set([`ECONNREFUSED`,`ENOTFOUND`,`ECONNRESET`,`ETIMEDOUT`,`EAI_AGAIN`,`EPIPE`,`ECONNABORTED`,`EHOSTUNREACH`,`ENETUNREACH`]),Ze=new Set([`fetch failed`,`failed to fetch`,`load failed`,`networkerror when attempting to fetch resource.`]);function Qe(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.code==`string`&&Xe.has(t.code)||typeof t.message==`string`&&Ze.has(t.message.toLowerCase()))return!0;if(t.cause&&typeof t.cause==`object`){let e=t.cause;if(typeof e.code==`string`&&Xe.has(e.code))return!0}return!1}function $e(e){try{return JSON.stringify(e,null,2)??String(e)}catch{try{return String(e)}catch{return`[unprintable error]`}}}function et(e){if(e&&typeof e==`object`)try{let t=e;if(t.error!==void 0)return $e(t.error);if(typeof t.message==`string`)return t.message}catch{}return $e(e)}function tt(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 nt=/\(no body\)/i;function rt(e){return Object.keys(e).length===0}function it(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`&&rt(t);if(!e&&!n)return!1}if(typeof n==`string`){let e=n.trim();return e.length===0||nt.test(e)}return!0}return!0}function P(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=tt(e.status)),e.attempts===void 0&&n!==void 0&&(e.attempts=n),e;let r=N(e),i=ke(e);if(r!==void 0){let t=et(e),a=tt(r),o=a===void 0;return new p(it(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 Qe(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 F(e,t){return e.name??`[${t}]`}function at(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 I(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 at(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 ot=[`temperature`,`max_tokens`,`reasoning_effort`,`budget_tokens`,`tool_choice`,`messages`,`addMessages`,`tools`,`addTools`];function st(e,t){let n=t,r=ot.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 ct(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 lt(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 ut(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=F(t,e),p=u(r,i,a);if(!await I(t,p,d,s,c)){t.enabled!==void 0&&L({kind:`middleware`,requestId:n,middleware:d,hook:`enabled_skip`},p,l,o,s,c);continue}if(!t.transform)continue;let m=await dt(t,structuredClone(f),p,d,s),{request:h,patchedFields:g}=st(f,m);g.length>0&&((m.tools!==void 0||m.addTools?.length)&&ct(h,d),L({kind:`middleware`,requestId:n,middleware:d,hook:`transform`,patchedFields:g},p,l,o,s,c)),f=h}return lt(d,f,`chain`),f}async function dt(e,t,n,r,i){if(!e.transform)return{};let a=e.timeoutMs??i;try{return await at(async()=>e.transform(t,n),a,r)}catch(e){throw ft(e,r,n.signal)}}function ft(e,t,n){let r=P(e,n);return r.type===`unknown`?new p(`middleware "${t}" threw: ${r.message}`,`invalid_params`,{code:`middleware_threw`,cause:e}):r}function L(e,t,n,r,i,a){n(e),r.length!==0&&pt(r,e,t,i,a)}async function pt(e,t,n,r,i){for(let a=0;a<e.length;a++){let o=e[a];if(!o.onEvent)continue;let s=F(o,a);if(await I(o,n,s,r,i))try{Promise.resolve(o.onEvent(t,{...n,own:{}})).catch(e=>{j(i,`middleware "${s}".onEvent`,e)})}catch(e){j(i,`middleware "${s}".onEvent`,e)}}}function R(e,t){return e.name??String(t)}function mt(e){let t=e.map(R),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 ht(e){let t=new Map;e.forEach((n,r)=>{let i=n.ref;if(!i)return;let a=t.get(i);if(a!==void 0)throw Error(`middleware ordering has a ref reused across two entries ("${R(e[a],a)}" and "${R(n,r)}"); each middleware's ref must be unique to that middleware`);t.set(i,r)})}function gt(e){return`ref`in e?{ref:e.ref,required:!0}:{ref:e,required:!1}}function _t(e,t,n,r,i,a){let{ref:o,required:s}=gt(r),c=t.get(o);if(!c){if(s)throw Error(`middleware "${n}" requires ref "${o.debugName}", which is not registered; this dependency is not optional`);a?.warn?.(`[VernLLM] middleware "${n}" references unknown ref "${o.debugName}" in runsAfter/runsBefore, ignoring it`);return}let l=i?c.id:n,u=i?n:c.id;e.get(l).mustPrecede.push(u)}function vt(e,t){let n=e.map(R),r=e.map((e,t)=>({id:n[t],entry:e,index:t,mustPrecede:[]})),i=new Map(r.map(e=>[e.id,e])),a=new Map(r.filter(e=>e.entry.ref).map(e=>[e.entry.ref,e]));for(let e of r){for(let n of e.entry.runsAfter??[])_t(i,a,e.id,n,!0,t);for(let n of e.entry.runsBefore??[])_t(i,a,e.id,n,!1,t)}return r}function yt(e,t){let n=(e.entry.priority??0)-(t.entry.priority??0);return n===0?e.index-t.index:n}function bt(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(yt);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 xt(e,t){mt(e),ht(e);let n=e.some(e=>e.runsAfter?.length||e.runsBefore?.length);return e.length<=1&&!n?[...e]:n?bt(vt(e,t)):e.map((e,t)=>({id:R(e,t),entry:e,index:t,mustPrecede:[]})).sort(yt).map(e=>e.entry)}function St(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 Ct(e,t){let n=xt(e,t);return{transformOrder:n,wrapOrder:St(n),names:Object.freeze(n.map(R))}}function z(e,t){return n=>{if(e)try{e(n)}catch(e){j(t,`onEvent`,e)}}}function B(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 V(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 wt(e,t,n,r,i,a,o,s,c){if(!e)return;let l=typeof e==`object`?e:void 0,u=l?.onStateChange,d=z(r,i);return new Ge({...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?L(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(R)},d,a,o,i):d(m),u)try{u(e,r,l,f,p)}catch(e){j(i,`circuitBreaker.onStateChange`,e)}}})}function Tt(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 H(e,t){let n=e.get(t);if(n===null)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function U(e){let t=e.get(`x-ratelimit-reset-requests`);return{limitRequests:H(e,`x-ratelimit-limit-requests`),remainingRequests:H(e,`x-ratelimit-remaining-requests`),resetAfterMs:t===null?void 0:Tt(t)}}function Et(e){let t=e.get(`anthropic-ratelimit-requests-reset`),n=t===null?NaN:Date.parse(t);return{limitRequests:H(e,`anthropic-ratelimit-requests-limit`),remainingRequests:H(e,`anthropic-ratelimit-requests-remaining`),resetAfterMs:Number.isFinite(n)?Math.max(0,n-Date.now()):void 0}}const Dt=Symbol(`vernLLMProviderRateLimitHint`);function W(e,t){t&&Object.defineProperty(e,Dt,{value:t,enumerable:!1,configurable:!0})}function Ot(e){if(e&&typeof e==`object`)return e[Dt]}function kt(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 At(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function jt(e){return e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments??{})}}))}function Mt(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 Nt(e){return typeof e==`string`?e:JSON.stringify(e)}function Pt(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 Ft(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 It(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 Lt(e){return!e||e===`auto`?`auto`:e===`none`||e===`required`?e:{type:`function`,function:{name:e.name}}}function Rt(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:Nt(e.content)},tool_calls:jt(e.toolCalls)}]:e.role===`assistant`?[{role:`assistant`,content:Nt(e.content===void 0?``:e.content)}]:[{role:e.role,content:e.content??``}]}function zt(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 Bt=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;Pt(s,c);let f=Ft({jsonModeExplicit:e.jsonMode,hasTools:!!s,jsonSchema:o,hasSchema:!!e.schema,supportsJsonObjectMode:this.supportsJsonObjectMode}),p=It(o,f);return zt(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:At(s)}:{},...s?{tool_choice:Lt(c)}:{},messages:[...t?[{role:`system`,content:t}]:[],...r.flatMap(e=>Rt(e)),{role:`user`,content:n}]}}}};function Vt(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 Ht(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 Ut(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=Mt(n);return Ht(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=Vt(f,r.schema,a);return r.tools?{type:`content`,content:m}:m}function Wt(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=Ut({rawContent:e,wireToolCalls:t,params:n,useJson:r,parseJson:m,requestId:a,logger:d,redactText:f}),_=Gt(h,g,{requestId:a,model:c.model,providerName:c.providerName,isFallback:c.isFallback,attempt:o+1,usage:i},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=P(e,n.signal);throw i&&t.type!==`aborted`&&u.reportFailure(i,t,o),t}}function Gt(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 Kt(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 qt=1e4,Jt=1e6;function Yt(){let e=new Map;function t(t){let n=e.get(t.index);if(!n){if(e.size>=qt)throw new p(`Stream contained more than ${qt} distinct tool calls`,`validation`);n={args:``}}let r=t.argumentsDelta??``;if(n.args.length+r.length>Jt)throw new p(`Tool call arguments exceeded the ${Jt}-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 Xt(e,t){try{await e.return?.()}catch{}t.abort()}function Zt(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=Kt({capacity:1e4,logger:l,label:`stream chunk`}),{push:g,finish:_,fail:v}=h,y=h.iterable,b=Yt(),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=fe(t.usage,{requestId:r,model:i,providerName:a,isFallback:o}),g({type:`usage`,usage:S}))),n=await Te(()=>e.next(),s,()=>c.abort(),l)}}catch(t){await Xt(e,c);let r=P(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 Qt(e){let{providerName:t,isFallback:n,maxRetries:r,onUsage:i,onUsageFailure:a,logger:o}=e;function s(e,r,i){if(e.usage)return fe(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){j(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){j(o,`onUsageFailure`,e)}}return{extract:s,actualTokensFor:c,reportSuccess:l,reportFailure:u}}async function $t(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 en(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??E(),g=s.build(t),{useJson:_,model:v}=g,y=await ut({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 $t(l,y,t.signal,(e,i)=>{L({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 tn(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??E(),S=[],C=kt({breaker:s,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,registeredMiddlewareNames:Object.freeze(m.map(R))}),w;try{return await Fe({fn:(e,n)=>(c?.recordAttempt(e>0),t(e,n,x,C)),maxRetries:l,signal:f,onAttempt:p,attempts:S,shouldRetryAttempt:(e,t)=>{if(!Ne(e,d,N,t))return!1;if(c)try{c.assertAvailable()}catch(e){return w=e,!1}return!0},recoverDelayForAttempt:(e,t)=>Pe({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:N,normalizeError:P,emitEvent:L}),normalizeError:P})}catch(e){let t=P(w??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(et(e))}`),t}}function nn(e){try{return JSON.parse(e)}catch{return}}var rn=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??nn,this.logger=r.logger,this.redact=r.redact,this.reportEvent=z(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=Qt({providerName:this.providerName,isFallback:this.isFallback,maxRetries:this.maxRetries,onUsage:r.onUsage,onUsageFailure:r.onUsageFailure,logger:this.logger}),this.requestBuilder=new Bt({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 tn({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 tn({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 en({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 we(e=>this.client.chat.completions.create(o,{signal:e}),this.timeoutMs,e.signal)}catch(e){throw this.reactToRateLimitError(e),e}this.limiter?.reactToRateLimitHint(Ot(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=Wt(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&&N(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 en({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 we(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=Zt(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=Wt(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 an(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=P(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 T(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(R)};L({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 on(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 sn(e,t,n,r,i){return on(await an(e,t,n,i,(e,r)=>e.run(t,n,r,i),r),t)}async function cn(e,t,n,r,i){return on(await an(e,t,n,i,(e,r)=>e.runStream(t,n,r,i),r),t)}function ln(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 G(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=F(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 I(a,i,m,e.middlewareTimeoutMs,e.logger))return a.enabled!==void 0&&L({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=ln(h);try{let t=await a.wrap(d,o.call,i);return o.wasCalled()||L({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 ft(t,m,i.signal)}}}return p()}const un=Symbol(`deadlineExceeded`);function dn(e,t){if(e===void 0)return{signal:t,timer:void 0};let n=new AbortController;if(e<=0)return n.abort(un),{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:void 0};let r=setTimeout(()=>n.abort(un),e);return{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:r}}function fn(e,t){return e instanceof p&&e.type===`aborted`&&e.code===void 0&&t?.reason===un&&(e.code=`deadline_exceeded`),e}var pn=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 mn(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 hn(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 gn(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 _n(e,t){return e===`tpm`?t:1}function vn(e){if(e)return new pn(e,e/6e4)}var yn=class{requests;tokens;concurrency;buckets;maxQueueMs;maxQueueSize;estimateTokensFn;estimateFraction;aimd;queue=[];wakeTimer;constructor(e){this.requests=vn(e.requestsPerMinute),this.tokens=vn(e.tokensPerMinute),e.maxConcurrent&&(this.concurrency=new pn(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??mn,this.estimateFraction=hn(e.estimateFraction),this.aimd=this.requests?gn(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=_n(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(_n(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 K=[`estimate`,`acquire`,`signalRateLimit`,`reactToRateLimitHint`];function bn(e){let t=e;return t.getState!==void 0&&typeof t.getState!=`function`}function xn(e){let t=e;return K.every(e=>typeof t[e]==`function`)&&!bn(e)}function Sn(e){let t=e;return K.some(e=>typeof t[e]==`function`)}function Cn(e){if(e!==void 0){if(xn(e))return e;if(Sn(e)){let t=K.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 (${K.join(`, `)}) are required.`,`invalid_params`)}if(bn(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 yn(e)}}function wn(e,t,n){return[e,...t].map((e,t)=>{let r=t>0,i=e.name??(r?`fallback[${t-1}]`:n.providerName),a=wt(e.circuitBreaker,i,e.model,n.onEvent,n.logger,n.middleware,n.middlewareTimeoutMs,r,e.client.supportsJsonObjectMode??!0),o=e.retryBudget?new Ke(e.retryBudget):void 0;return new rn(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:Cn(e.rateLimit),isFallback:r,middleware:n.middleware,middlewareTimeoutMs:n.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure??n.detectSoftFailure})})}function Tn(e){let t=e;return typeof t.get==`function`&&typeof t.set==`function`}function En(e){if(e===void 0)return new b;if(Tn(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 Dn=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??``)}},On=class{debug(e){}warn(e){}error(e,t){}},kn=class{logger;executors;fallbackOn;reportEvent;cacheOrchestrator;pipeline;middlewareTimeoutMs;cachedCallInnerParams=new WeakMap;cachedCallMeta=new Map;constructor(e){this.logger=qe(e.logger===`silent`?new On:e.logger??new Dn(e.debug??!1));let t=e.name??`primary`;this.cacheOrchestrator=new be(En(e.cache),this.logger),this.fallbackOn=e.fallbackOn??ie,this.reportEvent=z(e.onEvent,this.logger),this.pipeline=Ct(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=wn(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}=dn(e.deadlineMs,e.signal),o=i===e.signal?e:{...e,signal:i},s=n??E();try{let e=this.executors.length===1,n=await G(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 he(o,()=>r(cn(this.logicalCallDependencies,o,t,e,s)),o.signal,(e,t)=>this.logRefundError(e,t)),meta:n}:{value:await D(o,!1,()=>r(sn(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 fn(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=E(),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 G(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 G(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=B(this.executors,e?.index??0,`getCircuitState`);return V(t.isolateByModel,e?.model,`getCircuitState`,this.logger),t.getCircuitState(e?.model??t.model)}getFailureBreakdown(e){let t=B(this.executors,e?.index??0,`getFailureBreakdown`);return V(t.isolateByModel,e?.model,`getFailureBreakdown`,this.logger),t.getFailureBreakdown(e?.model??t.model)}getRetryBudgetState(e){return B(this.executors,e?.index??0,`getRetryBudgetState`).getRetryBudgetState()}getRateLimitState(e){return B(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=B(this.executors,e?.index??0,`openCircuit`);V(t.isolateByModel,e?.model,`openCircuit`,this.logger),t.openCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:E()})}closeCircuit(e){let t=B(this.executors,e?.index??0,`closeCircuit`);V(t.isolateByModel,e?.model,`closeCircuit`,this.logger),t.closeCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:E()})}};function An(e){return e}function jn(e){return e}async function*Mn(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 w(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.type===`tool_calls`&&Array.isArray(t.toolCalls)}function ee(e){return typeof e==`object`&&!!e&&typeof e.then==`function`}function te(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`}function ne(e){if(typeof e!=`object`||!e)return!1;let t=e;return te(t.chunks)&&ee(t.finalResult)}const re=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),ie=e=>e.type===`parse`||e.type===`validation`||e.type===`aborted`||e.type===`quota_exceeded`||e.code&&re.has(e.code)?`stop`:`next`;var T=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 ae(e){return e instanceof T}function oe(){return{}}function se(e){return{debugName:e}}function ce(e){return se(e)}function le(e){return se(e)}function ue(e){return{ref:e}}function E(){let e=new Map;return{get(t){return e.get(t)},set(t,n){e.set(t,n)}}}function de(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 fe(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 pe(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 me(e,t,n,r){return async i=>{try{await e.refundUsage?.({coalesced:t,signal:n})}catch(e){r(i,e)}}}async function he(e,t,n,r,i){if(r?.aborted)throw new p(`LLM request aborted`,`aborted`);let a=await pe(e,t,r),o=me(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 ge(e,t,n,r){if(n?.aborted)throw new p(`LLM request aborted`,`aborted`);let i=await pe(e,!1,n),a=me(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 _e(){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 ve(e){return typeof e==`string`?e:JSON.stringify(e)??``}function ye(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:ve(t.content)})}else n.push({type:`text-delta`,delta:ve(e)});return{async*[Symbol.asyncIterator](){for(let e of n)yield e}}}function be(e,t){return{async*[Symbol.asyncIterator](){yield*ye(await e,t)}}}var xe=class{cache;logger;inFlight=_e();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 he(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=he(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:ye(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:be(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=ge(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}},Se=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 Ce(e,t=`minCalls`){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer, got ${e}`)}function we(e,t){if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`${t} must be a finite number between 0 and 1, got ${e}`)}var Te=class{options;ratio;constructor(e){this.options=e,this.ratio=new Se(e.windowMs),Ce(e.minCalls),we(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 D(e,t,n){e.error(`[VernLLM] ${t} failed`,{message:n instanceof Error?n.message:`unknown`,stack:n instanceof Error?n.stack:void 0})}function O(e,t,n){try{n()}catch(n){D(e,t,n)}}function Ee(e){return{debug:De(e,`debug`),warn:De(e,`warn`),error:De(e,`error`)}}function De(e,t){let n=e[t].bind(e);return((...e)=>{try{ke(n(...e))}catch{}})}function Oe(e){return typeof e?.then==`function`}function ke(e){Oe(e)&&Promise.resolve(e).catch(()=>{})}function k(e,t,n={}){return r=>{e&&O(t,`onEvent`,()=>e(r)),r.kind===`usage`&&n.onUsage&&O(t,`onUsage`,()=>n.onUsage(r.usage)),r.kind===`usage_failure`&&n.onUsageFailure&&O(t,`onUsageFailure`,()=>n.onUsageFailure(r.usage,r.error))}}function A(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 j(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 Ae(e,t,n){Promise.resolve(n).catch(n=>{try{e.error(t,{message:n instanceof Error?n.message:String(n)})}catch{}})}async function je(e,t,n,r){let i=n?.signal;if(i?.aborted)throw new p(`Circuit breaker check aborted`,`aborted`);let a=e.prepareTimeoutMs??1e3,o;try{o=Promise.resolve(e.prepare(t,n))}catch(e){Me(r,e);return}let s,c,l=await Promise.race([o.then(()=>`ready`,e=>({failed:e})),new Promise(e=>{s=setTimeout(()=>e(`timeout`),a)}),new Promise(e=>{i&&(c=()=>e(`aborted`),i.addEventListener(`abort`,c,{once:!0}),i.aborted&&c())})]).finally(()=>{clearTimeout(s),i&&c&&i.removeEventListener(`abort`,c)});if(l===`aborted`)throw new p(`Circuit breaker check aborted`,`aborted`);l===`timeout`?r.warn(`[VernLLM] circuitBreaker.prepare took longer than ${a}ms, continuing with the adapter's local state`):l!==`ready`&&Me(r,l.failed)}function Me(e,t){e.warn(`[VernLLM] circuitBreaker.prepare failed, continuing with the adapter's local state: ${t instanceof Error?t.message:String(t)}`)}function Ne(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 M(e,t){let n=e.get(t);if(n===null)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function N(e){let t=e.get(`x-ratelimit-reset-requests`);return{limitRequests:M(e,`x-ratelimit-limit-requests`),remainingRequests:M(e,`x-ratelimit-remaining-requests`),resetAfterMs:t===null?void 0:Ne(t)}}function Pe(e){let t=e.get(`anthropic-ratelimit-requests-reset`),n=t===null?NaN:Date.parse(t);return{limitRequests:M(e,`anthropic-ratelimit-requests-limit`),remainingRequests:M(e,`anthropic-ratelimit-requests-remaining`),resetAfterMs:Number.isFinite(n)?Math.max(0,n-Date.now()):void 0}}const Fe=Symbol(`vernLLMProviderRateLimitHint`);function P(e,t){t&&Object.defineProperty(e,Fe,{value:t,enumerable:!1,configurable:!0})}function Ie(e){if(e&&typeof e==`object`)return e[Fe]}function Le(e){let{breaker:t,logger:n,requestId:r,model:i,providerName:a,isFallback:o,supportsJsonObjectMode:s,registeredMiddlewareNames:c}=e;function l(e,t,n){return{stage:`attempt`,requestId:r,requestedProvider:a,requestedModel:i,isFallbackAttempt:o,attempt:e+1,capabilities:{supportsJsonObjectMode:s},signal:t,state:n,own:{},registeredMiddlewareNames:c}}function u(e,t,n){return{requestId:r,state:n,signal:t,attempt:e+1}}function d(e,t){Ae(n,`[VernLLM:${r}] circuitBreaker.${e} rejected`,t)}return{buildAttemptContext:l,buildCallContext:u,recordSuccess(e,n,r){d(`recordSuccess`,t?.recordSuccess(i,u(e,n,r)))},recordFailure(e,n,r,a){d(`recordFailure`,t?.recordFailure(i,u(e,n,r),a))},releaseTrial(e,n,r){d(`releaseTrial`,t?.releaseTrial?.(i,u(e,n,r)))}}}function Re(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function ze(e){return e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments??{})}}))}function Be(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 Ve(e){return typeof e==`string`?e:JSON.stringify(e)}function He(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 Ue(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 We(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 Ge(e){return!e||e===`auto`?`auto`:e===`none`||e===`required`?e:{type:`function`,function:{name:e.name}}}function Ke(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:Ve(e.content)},tool_calls:ze(e.toolCalls)}]:e.role===`assistant`?[{role:`assistant`,content:Ve(e.content===void 0?``:e.content)}]:[{role:e.role,content:e.content??``}]}function qe(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 Je=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;He(s,c);let f=Ue({jsonModeExplicit:e.jsonMode,hasTools:!!s,jsonSchema:o,hasSchema:!!e.schema,supportsJsonObjectMode:this.supportsJsonObjectMode}),p=We(o,f);return qe(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:Re(s)}:{},...s?{tool_choice:Ge(c)}:{},messages:[...t?[{role:`system`,content:t}]:[],...r.flatMap(e=>Ke(e)),{role:`user`,content:n}]}}}};const Ye=1e4;function Xe(e){return!e||e<=0||e===1/0?void 0:e}function Ze(e){return Math.min(e,2147483647)}async function Qe(e,t,n){let r=new AbortController,i=Xe(t),a=n?AbortSignal.any([n,r.signal]):r.signal,o=()=>new p(`Request timed out`,`timeout`,{code:`request_timeout`}),s,c=new Promise((e,t)=>{i!==void 0&&(s=setTimeout(()=>{r.abort(),t(o())},Ze(i)))});try{return await Promise.race([e(a),c])}catch(e){throw r.signal.aborted&&!n?.aborted?e instanceof p&&e.type===`timeout`?e:o():e}finally{clearTimeout(s)}}function $e(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`}))},Ze(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 et=[{name:`Retry-After-Ms`,kind:`ms`},{name:`X-Retry-After-Ms`,kind:`ms`},{name:`Retry-After`,kind:`seconds`},{name:`Retry-After`,kind:`date`}];function tt(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 F(e,t){return e<0?void 0:Math.min(e,t)}function nt(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 et){let i=tt(r,e)?.trim();if(i){if(n===`ms`&&/^\d+$/.test(i))return F(Number(i),t);if(n===`seconds`&&/^\d+(\.\d+)?$/.test(i))return F(Number(i)*1e3,t);if(n===`date`){let e=Date.parse(i);if(!Number.isNaN(e))return F(e-Date.now(),t)}}}}function rt(e){return Math.random()*e}function it(e,t,n=Ye,r=!1,i=!1){return rt(Math.min(e*(r?2:i?1.5:1)*2**t,n))}async function at(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 ot(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 st(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=nt(i),y=h(i),b=v??it(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 at(b,o)}async function ct(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}function I(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 lt=new Set([`ECONNREFUSED`,`ENOTFOUND`,`ECONNRESET`,`ETIMEDOUT`,`EAI_AGAIN`,`EPIPE`,`ECONNABORTED`,`EHOSTUNREACH`,`ENETUNREACH`]),ut=new Set([`fetch failed`,`failed to fetch`,`load failed`,`networkerror when attempting to fetch resource.`]);function dt(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.code==`string`&&lt.has(t.code)||typeof t.message==`string`&&ut.has(t.message.toLowerCase()))return!0;if(t.cause&&typeof t.cause==`object`){let e=t.cause;if(typeof e.code==`string`&&lt.has(e.code))return!0}return!1}function ft(e){try{return JSON.stringify(e,null,2)??String(e)}catch{try{return String(e)}catch{return`[unprintable error]`}}}function pt(e){if(e&&typeof e==`object`)try{let t=e;if(t.error!==void 0)return ft(t.error);if(typeof t.message==`string`)return t.message}catch{}return ft(e)}function mt(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 ht=/\(no body\)/i;function gt(e){return Object.keys(e).length===0}function _t(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`&&gt(t);if(!e&&!n)return!1}if(typeof n==`string`){let e=n.trim();return e.length===0||ht.test(e)}return!0}return!0}function L(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=mt(e.status)),e.attempts===void 0&&n!==void 0&&(e.attempts=n),e;let r=I(e),i=nt(e);if(r!==void 0){let t=pt(e),a=mt(r),o=a===void 0;return new p(_t(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 dt(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 vt(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 yt(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=Be(n);return yt(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=vt(f,r.schema,a);return r.tools?{type:`content`,content:m}:m}function xt(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}),_=St(h,g,{requestId:a,model:c.model,providerName:c.providerName,isFallback:c.isFallback,attempt:o+1,usage:i},d);if(_!==void 0)throw new p(`Soft failure detected`,`api`,{code:_});return l.recordSuccess(o,n.signal,s),u.reportSuccess(i,l.buildAttemptContext(o,n.signal,s)),g}catch(e){let t=L(e,n.signal);throw i&&t.type!==`aborted`&&u.reportFailure(i,t,o,l.buildAttemptContext(o,n.signal,s)),t}}function St(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 Ct(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,Tt=1e6;function Et(){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>Tt)throw new p(`Tool call arguments exceeded the ${Tt}-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 Dt(e,t){try{await e.return?.()}catch{}t.abort()}function Ot(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=Ct({capacity:1e4,logger:l,label:`stream chunk`}),{push:g,finish:_,fail:v}=h,y=h.iterable,b=Et(),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=fe(t.usage,{requestId:r,model:i,providerName:a,isFallback:o}),g({type:`usage`,usage:S}))),n=await $e(()=>e.next(),s,()=>c.abort(),l)}}catch(t){await Dt(e,c);let r=L(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 kt(e){let{providerName:t,isFallback:n,maxRetries:r,emitEvent:i,logger:a}=e;function o(e,r,i){if(e.usage)return fe(e.usage,{requestId:r,model:i,providerName:t,isFallback:n})}function s(e){if(e)return e.totalTokens||e.promptTokens+e.completionTokens}function c(e,t){e&&i({kind:`usage`,requestId:e.requestId,usage:e},t)}function l(e,t,n,o,s=!1){let c=e.totalTokens||e.promptTokens+e.completionTokens,l=s?`mid-stream failure (terminal, no further attempts)`:`attempt ${n+1}/${r+1}`;a.warn(`[VernLLM:${e.requestId}] usage failure, ${l}: type=${t.type} tokens=${c}`),i({kind:`usage_failure`,requestId:e.requestId,usage:e,error:t},o)}return{extract:o,actualTokensFor:s,reportSuccess:c,reportFailure:l}}function At(e,t){return e.name??`[${t}]`}function jt(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 Mt(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 jt(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 Nt=[`temperature`,`max_tokens`,`reasoning_effort`,`budget_tokens`,`tool_choice`,`messages`,`addMessages`,`tools`,`addTools`];function Pt(e,t){let n=t,r=Nt.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 Ft(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 It(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=At(t,e),p=u(r,i,a);if(!await Mt(t,p,d,s,c)){t.enabled!==void 0&&R({kind:`middleware`,requestId:n,middleware:d,hook:`enabled_skip`},p,l,o,s,c);continue}if(!t.transform)continue;let m=await Rt(t,structuredClone(f),p,d,s),{request:h,patchedFields:g}=Pt(f,m);g.length>0&&((m.tools!==void 0||m.addTools?.length)&&Ft(h,d),R({kind:`middleware`,requestId:n,middleware:d,hook:`transform`,patchedFields:g},p,l,o,s,c)),f=h}return It(d,f,`chain`),f}async function Rt(e,t,n,r,i){if(!e.transform)return{};let a=e.timeoutMs??i;try{return await jt(async()=>e.transform(t,n),a,r)}catch(e){throw zt(e,r,n.signal)}}function zt(e,t,n){let r=L(e,n);return r.type===`unknown`?new p(`middleware "${t}" threw: ${r.message}`,`invalid_params`,{code:`middleware_threw`,cause:e}):r}function R(e,t,n,r,i,a){n(e),r.length!==0&&Vt(r,e,t,i,a)}function Bt(e,t,n,r,i){try{Promise.resolve(e.onEvent(n,{...r,own:{}})).catch(e=>{D(i,`middleware "${t}".onEvent`,e)})}catch(e){D(i,`middleware "${t}".onEvent`,e)}}function Vt(e,t,n,r,i){for(let a=0;a<e.length;a++){let o=e[a];if(!o.onEvent)continue;let s=At(o,a),{enabled:c}=o;if(c===void 0||c===!0)Bt(o,s,t,n,i);else if(c===!1)continue;else Mt(o,n,s,r,i).then(e=>{e&&Bt(o,s,t,n,i)})}}async function Ht(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 Ut(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??E(),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 Ht(l,y,t.signal,(e,i)=>{R({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}}function z(e,t){return e.name??String(t)}function Wt(e){let t=e.map(z),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 Gt(e){let t=new Map;e.forEach((n,r)=>{let i=n.ref;if(!i)return;let a=t.get(i);if(a!==void 0)throw Error(`middleware ordering has a ref reused across two entries ("${z(e[a],a)}" and "${z(n,r)}"); each middleware's ref must be unique to that middleware`);t.set(i,r)})}function Kt(e){return`ref`in e?{ref:e.ref,required:!0}:{ref:e,required:!1}}function qt(e,t,n,r,i,a){let{ref:o,required:s}=Kt(r),c=t.get(o);if(!c){if(s)throw Error(`middleware "${n}" requires ref "${o.debugName}", which is not registered; this dependency is not optional`);a?.warn?.(`[VernLLM] middleware "${n}" references unknown ref "${o.debugName}" in runsAfter/runsBefore, ignoring it`);return}let l=i?c.id:n,u=i?n:c.id;e.get(l).mustPrecede.push(u)}function Jt(e,t){let n=e.map(z),r=e.map((e,t)=>({id:n[t],entry:e,index:t,mustPrecede:[]})),i=new Map(r.map(e=>[e.id,e])),a=new Map(r.filter(e=>e.entry.ref).map(e=>[e.entry.ref,e]));for(let e of r){for(let n of e.entry.runsAfter??[])qt(i,a,e.id,n,!0,t);for(let n of e.entry.runsBefore??[])qt(i,a,e.id,n,!1,t)}return r}function Yt(e,t){let n=(e.entry.priority??0)-(t.entry.priority??0);return n===0?e.index-t.index:n}function Xt(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(Yt);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 Zt(e,t){Wt(e),Gt(e);let n=e.some(e=>e.runsAfter?.length||e.runsBefore?.length);return e.length<=1&&!n?[...e]:n?Xt(Jt(e,t)):e.map((e,t)=>({id:z(e,t),entry:e,index:t,mustPrecede:[]})).sort(Yt).map(e=>e.entry)}function Qt(e,t){let n=[],r=[],i=[];for(let t of e)t.position===`outermost`?n.push(t):t.position===`innermost`?r.push(t):i.push(t);let a=[...i].sort((e,t)=>(typeof e.position==`number`?e.position:0)-(typeof t.position==`number`?t.position:0)),o=(e,n)=>t.indexOf(e)-t.indexOf(n);return n.sort(o),r.sort(o),[...n,...a,...r]}function $t(e,t){let n=Zt(e,t);return{transformOrder:n,wrapOrder:Qt(n,e),names:Object.freeze(n.map(z))}}async function en(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??E(),S=[],C=Le({breaker:s,logger:g,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,registeredMiddlewareNames:Object.freeze(m.map(z))}),w;try{return await ct({fn:(e,n)=>(c?.recordAttempt(e>0),t(e,n,x,C)),maxRetries:l,signal:f,onAttempt:p,attempts:S,shouldRetryAttempt:(e,t)=>{if(!ot(e,d,I,t))return!1;if(c)try{c.assertAvailable()}catch(e){return w=e,!1}return!0},recoverDelayForAttempt:(e,t)=>st({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:I,normalizeError:L,emitEvent:R}),normalizeError:L})}catch(e){let t=L(w??e,f,S.length>0?S:void 0);throw b(t)?C.recordFailure(S.length,f,x,t.code):C.releaseTrial(S.length,f,x),g.debug(`[VernLLM:${n}] ${v}:\n${y(pt(e))}`),t}}function tn(e){try{return JSON.parse(e)}catch{return}}var nn=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??tn,this.logger=r.logger,this.redact=r.redact,this.reportEvent=k(r.onEvent,this.logger,{onUsage:r.onUsage,onUsageFailure:r.onUsageFailure}),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=kt({providerName:this.providerName,isFallback:this.isFallback,maxRetries:this.maxRetries,emitEvent:(e,t)=>R(e,t,this.reportEvent,this.middleware,this.middlewareTimeoutMs,this.logger),logger:this.logger}),this.requestBuilder=new Je({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)}async readCircuitState(e){return this.breaker?.readState?this.breaker.readState(e):this.breaker?.getState?.(e)}getFailureBreakdown(e){return this.breaker?.getFailureBreakdown?.(e)}getRetryBudgetState(){return this.budget?.getSnapshot()}getRateLimitState(){return this.limiter?.getState?.()}async readRateLimitState(){return this.limiter?.readState?this.limiter.readState():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){let n=this.breaker,r=e??this.model;if(!n?.prepare){n?.assertClosed(r,t);return}return je(n,r,t,this.logger).then(()=>n.assertClosed(r,t))}releaseBreakerTrial(e,t){Ae(this.logger,`[VernLLM] circuitBreaker.releaseTrial rejected`,this.breaker?.releaseTrial?.(e??this.model,t))}async run(e,t,n,r){return en({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 en({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 Ut({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 Qe(e=>this.client.chat.completions.create(o,{signal:e}),this.timeoutMs,e.signal)}catch(e){throw this.reactToRateLimitError(e),e}this.limiter?.reactToRateLimitHint(Ie(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=xt(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&&I(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 Ut({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 Qe(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=Ot(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):a.releaseTrial(n,e.signal,d),r&&t.type!==`aborted`&&this.usageReporter.reportFailure(r,t,n,a.buildAttemptContext(n,e.signal,d),!0),o?.(this.usageReporter.actualTokensFor(r))},finalize:(r,i,s)=>{let c=this.usageReporter.actualTokensFor(s);try{let f=xt(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):a.releaseTrial(n,e.signal,d),t}}});return m=void 0,f}finally{m?.()}}countsTowardBreaker(e){return e.countsTowardBreaker}};async function rn(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{if(!(s===0&&a)){let e=c.assertBreakerClosed(t.model,{requestId:n,state:r,signal:t.signal});e&&await e}return{result:await i(c,()=>{u+=1}),executor:c,index:s,attemptCount:u}}catch(i){let a=L(i,t.signal);c.releaseBreakerTrial(t.model,{requestId:n,state:r,signal: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 T(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(z)};R({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 an(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 on(e,t,n,r,i){return an(await rn(e,t,n,i,(e,r)=>e.run(t,n,r,i),r),t)}async function sn(e,t,n,r,i){return an(await rn(e,t,n,i,(e,r)=>e.runStream(t,n,r,i),r),t)}function cn(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 B(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=At(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 Mt(a,i,m,e.middlewareTimeoutMs,e.logger))return a.enabled!==void 0&&R({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=cn(h);try{let t=await a.wrap(d,o.call,i);return o.wasCalled()||R({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 zt(t,m,i.signal)}}}return p()}const V=Symbol(`deadlineExceeded`);function ln(e,t){if(e===void 0)return{signal:t,timer:void 0};let n=new AbortController;if(e<=0)return n.abort(V),{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:void 0};let r=setTimeout(()=>n.abort(V),e);return{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:r}}function un(e,t){return e instanceof p&&e.type===`aborted`&&e.code===void 0&&t?.reason===V&&(e.code=`deadline_exceeded`),e}function dn(e){if(e===void 0)return;if(typeof e==`function`)return e;let{multiplier:t,maxMs:n=1/0}=e;return(e,r)=>rt(Math.min(r*t**e,n))}var fn=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)}},pn=class{windowMs;minCalls;failureRatio;ratiosByKey=new Map;constructor(e,t,n){this.windowMs=e,this.minCalls=t,this.failureRatio=n,new Se(e),Ce(t),we(n,`failureRatio`)}ratioFor(e){let t=this.ratiosByKey.get(e);return t||(t=new Se(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 mn(e){return`onFailure`in e?e:e.kind===`consecutive`?new fn(e.threshold):new pn(e.windowMs,e.minCalls,e.failureRatio)}function hn(){return{state:`closed`,consecutiveFailures:0,openedAt:0,trial:null,reopenCount:0,failuresByReason:new Map,cooldownMsForOpen:0}}function H(e){return e??``}const U=new WeakMap;function W(e,t){return!t||U.get(t.state)===e.trial}function gn(e,t){let n=t??`unknown`;e.failuresByReason.set(n,(e.failuresByReason.get(n)??0)+1)}var _n=class{cooldownMs;onStateChange;isolateByModel;halfOpenProbes;halfOpenSuccessRatio;cooldownBackoff;tripping;sharedBucket=hn();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=dn(e.cooldownBackoff),this.tripping=mn(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&&U.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&&U.set(t.state,n.trial)}}recordSuccess(e,t){let n=this.lookupBucket(e);if(n){if(n.state===`half-open`&&n.trial&&W(n,t)){t&&U.delete(t.state),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&&W(r,t)){t&&U.delete(t.state),r.trial.failures+=1,gn(r,n),this.settleTrialIfComplete(r,e,t);return}r.state!==`half-open`&&(r.consecutiveFailures+=1,gn(r,n),this.tripping.onFailure(this.trippingKeyFor(e))&&this.openBucket(r,e,t))}releaseTrial(e,t){if(!t)return;let n=this.lookupBucket(e);n&&n.state===`half-open`&&n.trial&&W(n,t)&&(U.delete(t.state),n.trial.slotsRemaining+=1)}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(H(e)):this.sharedBucket}trippingKeyFor(e){return this.isolateByModel?H(e):``}ensureBucketFor(e){if(!this.isolateByModel)return this.sharedBucket;let t=H(e),n=this.bucketsByModel.get(t);return n||(n=hn(),this.bucketsByModel.set(t,n)),n}forgetModel(e){this.bucketsByModel.delete(H(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.reset(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)}};const vn=[`assertClosed`,`recordSuccess`,`recordFailure`,`onStateChange`],yn=[`assertClosed`,`recordSuccess`,`recordFailure`],bn=[`getState`,`getFailureBreakdown`,`open`,`close`,`releaseTrial`,`setLogger`,`prepare`,`readState`];function xn(e){let t=e;return bn.filter(e=>t[e]!==void 0&&typeof t[e]!=`function`)}function Sn(e){let{prepareTimeoutMs:t}=e;return t!==void 0&&(!Number.isFinite(t)||t<=0)}function Cn(e){let t=e;return{attemptsAdapter:yn.some(e=>typeof t[e]==`function`),missing:vn.filter(e=>typeof t[e]!=`function`),invalid:xn(e)}}function wn(e,t,n,r,i,a,o,s,c){return(l,u,d,f,p)=>{let m={kind:`circuit_state`,provider:t,model:f??n,from:l,to:u,consecutiveFailures:d};p?R(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(z)},r,a,o,i):r(m),e&&O(i,`circuitBreaker.onStateChange`,()=>e(l,u,d,f,p))}}const Tn=new WeakMap,En=new WeakSet;function Dn(e,t,n){let r=Tn.get(e);if(r)En.has(e)||(En.add(e),n.warn(`[VernLLM] circuitBreaker: this adapter instance is already wired to another target. circuit_state events for it will now be reported to both, each tagged with its own provider/model. If that's intentional (a breaker genuinely shared across targets or clients), no action needed. If not, e.g. constructing VernLLM repeatedly with the same adapter instance, each wiring is kept for the life of the process, review whether the adapter should be constructed fresh per target instead.`));else{r=new Set,Tn.set(e,r);let t=e.onStateChange,i=r;e.onStateChange=(e,r,a,o,s)=>{for(let t of i)O(n,`circuitBreaker.onStateChange`,()=>t(e,r,a,o,s));O(n,`circuitBreaker.onStateChange`,()=>t(e,r,a,o,s))}}r.add(t)}function On(e,t,n,r,i,a,o,s,c){if(!e)return;let l=k(r,i),u=e=>wn(e,t,n,l,i,a,o,s,c);if(typeof e==`object`){let{attemptsAdapter:t,missing:n,invalid:r}=Cn(e);if(t&&n.length>0)throw new p(`circuitBreaker looks like a CircuitBreakerAdapter but is missing: ${n.join(`, `)}. All four members (${vn.join(`, `)}) are required.`,`invalid_params`);if(t&&Sn(e))throw new p(`circuitBreaker's prepareTimeoutMs (${String(e.prepareTimeoutMs)}) must be a finite number greater than 0. It is optional, omit it to use the default.`,`invalid_params`);if(r.length>0){let t=e;throw new p(`circuitBreaker's ${r.map(e=>`${e} (${typeof t[e]})`).join(`, `)} must be a function when present. ${r.length===1?`It is`:`They are`} optional, omit entirely rather than assigning a non function value.`,`invalid_params`)}if(t){let t=e;return Dn(t,u(void 0),i),Ae(i,`[VernLLM] circuitBreaker.setLogger rejected`,t.setLogger?.(i)),t}}let d=typeof e==`object`?e:void 0;return new _n({...d,onStateChange:u(d?.onStateChange)})}var kn=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 An(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 jn(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 Mn(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 Nn(e,t){return e===`tpm`?t:1}function Pn(e){if(e)return new kn(e,e/6e4)}var Fn=class{requests;tokens;concurrency;buckets;maxQueueMs;maxQueueSize;estimateTokensFn;estimateFraction;aimd;queue=[];wakeTimer;constructor(e){this.requests=Pn(e.requestsPerMinute),this.tokens=Pn(e.tokensPerMinute),e.maxConcurrent&&(this.concurrency=new kn(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??An,this.estimateFraction=jn(e.estimateFraction),this.aimd=this.requests?Mn(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=Nn(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(Nn(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`],In=[`getState`,`readState`,`setLogger`];function Ln(e){let t=e;return In.filter(e=>t[e]!==void 0&&typeof t[e]!=`function`)}function Rn(e){let t=e;return G.every(e=>typeof t[e]==`function`)&&Ln(e).length===0}function zn(e){let t=e;return G.some(e=>typeof t[e]==`function`)}function Bn(e,t){if(e===void 0)return;if(Rn(e))return t&&e.setLogger?.(t),e;if(zn(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`)}let n=Ln(e);if(n.length>0){let t=e;throw new p(`rateLimit's ${n.map(e=>`${e} (${typeof t[e]})`).join(`, `)} must be a function. ${n.length===1?`It is`:`They are`} optional; omit entirely rather than assigning a non-function value.`,`invalid_params`)}return new Fn(e)}function Vn(e,t,n){return[e,...t].map((e,t)=>{let r=t>0,i=e.name??(r?`fallback[${t-1}]`:n.providerName),a=On(e.circuitBreaker,i,e.model,n.onEvent,n.logger,n.middleware,n.middlewareTimeoutMs,r,e.client.supportsJsonObjectMode??!0),o=e.retryBudget?new Te(e.retryBudget):void 0;return new nn(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:Bn(e.rateLimit,n.logger),isFallback:r,middleware:n.middleware,middlewareTimeoutMs:n.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure??n.detectSoftFailure})})}function Hn(e){let t=e;return typeof t.get==`function`&&typeof t.set==`function`}function Un(e){if(e===void 0)return new b;if(Hn(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 Wn=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??``)}},Gn=class{debug(e){}warn(e){}error(e,t){}},Kn=class{logger;executors;fallbackOn;reportEvent;cacheOrchestrator;pipeline;middlewareTimeoutMs;cachedCallInnerParams=new WeakMap;cachedCallMeta=new Map;constructor(e){this.logger=Ee(e.logger===`silent`?new Gn:e.logger??new Wn(e.debug??!1));let t=e.name??`primary`;this.cacheOrchestrator=new xe(Un(e.cache),this.logger),this.fallbackOn=e.fallbackOn??ie,this.reportEvent=k(e.onEvent,this.logger),this.pipeline=$t(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=Vn(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}=ln(e.deadlineMs,e.signal),o=i===e.signal?e:{...e,signal:i},s=n??E();try{let e=this.executors.length===1,n=await B(this.runOperationDependencies,o,t,s,async()=>{if(e){if(o.signal?.aborted)throw new p(`LLM request aborted`,`aborted`);let e=this.executors[0].assertBreakerClosed(o.model,{requestId:t,state:s,signal:o.signal});e&&await e}let n=()=>{e&&this.executors[0].releaseBreakerTrial(o.model,{requestId:t,state:s,signal:o.signal})};try{let n,r=async e=>{let t=await e;return n=t.meta,t.value};return o.stream?{value:await ge(o,()=>r(sn(this.logicalCallDependencies,o,t,e,s)),o.signal,(e,t)=>this.logRefundError(e,t)),meta:n}:{value:await he(o,!1,()=>r(on(this.logicalCallDependencies,o,t,e,s)),o.signal,(e,t)=>this.logRefundError(e,t)),meta:n}}catch(e){throw n(),e}},r);return o.stream,n.value}catch(e){throw un(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=E(),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 B(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 B(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=A(this.executors,e?.index??0,`getCircuitState`);return j(t.isolateByModel,e?.model,`getCircuitState`,this.logger),t.getCircuitState(e?.model??t.model)}getFailureBreakdown(e){let t=A(this.executors,e?.index??0,`getFailureBreakdown`);return j(t.isolateByModel,e?.model,`getFailureBreakdown`,this.logger),t.getFailureBreakdown(e?.model??t.model)}getRetryBudgetState(e){return A(this.executors,e?.index??0,`getRetryBudgetState`).getRetryBudgetState()}getRateLimitState(e){return A(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)}))}async readRateLimitState(e){return A(this.executors,e?.index??0,`readRateLimitState`).readRateLimitState()}async readCircuitStates(e){return Promise.all(this.executors.map(async(t,n)=>({provider:t.providerName,index:n,isFallback:n>0,isolateByModel:t.isolateByModel,state:await t.readCircuitState(e??t.model)})))}openCircuit(e){let t=A(this.executors,e?.index??0,`openCircuit`);j(t.isolateByModel,e?.model,`openCircuit`,this.logger),t.openCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:E()})}closeCircuit(e){let t=A(this.executors,e?.index??0,`closeCircuit`);j(t.isolateByModel,e?.model,`closeCircuit`,this.logger),t.closeCircuit(e?.model??t.model,{requestId:globalThis.crypto.randomUUID(),state:E()})}};function qn(e){return e}function Jn(e){return e}async function*Yn(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=Pn(e);if(t===q)return;t!==J&&(yield t),i=n.indexOf(`
5
+ `);for(;i!==-1;){let e=n.slice(0,i);n=n.slice(i+2);let t=Zn(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=Pn(e);if(t===q)return;t!==J&&(yield t),r=n.indexOf(`
10
+ `);for(;r!==-1;){let e=n.slice(0,r);n=n.slice(r+2);let t=Zn(e);if(t===K)return;t!==q&&(yield t),r=n.indexOf(`
11
11
 
12
- `)}let i=n.trim();if(i){let e=Pn(i);e!==q&&e!==J&&(yield e)}}const q=Symbol(`sse-stream-done`),J=Symbol(`sse-frame-no-data`),Nn=Symbol(`sse-frame-ping`);function Pn(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?Nn:J;let r=t.join(`
14
- `);if(r===`[DONE]`)return q;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 Fn=[`image/png`,`image/jpeg`,`image/gif`,`image/webp`];function Y(e){if(Fn.includes(e))return e;throw new p(`Unsupported image mimeType "${e}": expected one of ${Fn.join(`, `)}`,`invalid_params`)}function In(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 Ln(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 Rn(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 zn(e){let t=Rn(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 Bn(e,t){return zn(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function Vn(e,t){return!Bn(e,t)}function Hn(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 Un(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 Wn(e){return e===`minimal`?`low`:e}function Gn(e,t){return qn(t,e.toUpperCase())}function Kn(e){let t=/gemini-\d+\.(\d+)/.exec(e);return t?Number(t[1]):0}function qn(e,t){if(!e.includes(`pro`))return t;let n=Jn(e);return n===null||n<3?t:Kn(e)===0?t===`HIGH`?`HIGH`:`LOW`:t===`MINIMAL`?`LOW`:t}function Jn(e){let t=/gemini-(\d+)/.exec(e);return t?Number(t[1]):null}function Yn(e){let t=Jn(e);return t!==null&&t>=3}function Xn(e,t){return Yn(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function Zn(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 $n(e){return!e||e===`auto`?{type:`auto`}:e===`none`?{type:`none`}:e===`required`?{type:`any`}:{type:`tool`,name:e.function.name}}function er(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:$n(t)}}function tr(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&&In(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}=er(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}=er(e.tools,e.tool_choice));let m,h;if(e.budget_tokens!==void 0||e.reasoning_effort!==void 0){if(Un(f?.type===`tool`?`toolChoice forcing the "${f.name}" tool`:f?.type===`any`?`toolChoice: 'required' (Anthropic's "any" tool_choice)`:void 0),Vn(e.model,r)){let t=e.budget_tokens??Ln(e.reasoning_effort,n);Hn(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=Wn(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:rr(a.map(e=>ir(e))),...d?{tools:d,tool_choice:f}:{},...u||h?{output_config:{...u?{format:u}:{},...h?{effort:h}:{}}}:{},...m?{thinking:m}:{}},toolName:l}}function nr(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}=tr(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&&W(m,Et(l)),m},async*createStream(t,s){let{body:c,toolName:l}=tr(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=Et(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 rr(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 ir(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)?Zn(e.content):e.content??``}}function ar(e){return e.map(e=>e.type===`image`?{inlineData:{mimeType:Y(e.mimeType),data:e.data}}:{text:e.text})}function or(e,t){return`${e}#${t}`}function sr(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 cr(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 lr(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:dr(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:ur(e.function.arguments,e.function.name)}}))),{role:`model`,parts:t}}return{role:e.role===`assistant`?`model`:`user`,parts:Array.isArray(e.content)?ar(e.content):[{text:e.content??``}]}}function ur(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 dr(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 fr(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 pr(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=sr(e.tool_choice)),Xn(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:Gn(n,e.model)})}else{let n=e.budget_tokens??(e.reasoning_effort?Ln(e.reasoning_effort,t):void 0);n!==void 0&&(o.thinkingConfig={thinkingBudget:n})}let s=cr(i);return{model:e.model,contents:fr(i.map(e=>lr(e,s))),config:o}}function mr(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=pr(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??or(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=pr(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?or(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 hr(e){return e.includes(`claude`)}function gr(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 _r(e){return new Uint8Array(Buffer.from(e,`base64`))}function vr(e){return e.map(e=>e.type===`image`?{image:{format:gr(e.mimeType),source:{bytes:_r(e.data)}}}:{text:e.text})}function yr(e,t){return{tools:e.map(e=>({toolSpec:{name:e.function.name,description:e.function.description,inputSchema:{json:e.function.parameters}}})),toolChoice:Er(t)}}function br(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&&In(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=yr(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(hr(e.model)&&(e.budget_tokens!==void 0||e.reasoning_effort!==void 0)){let t=d?.toolChoice;if(Un(t&&`tool`in t?`toolChoice forcing the "${t.tool?.name}" tool`:t&&`any`in t?`toolChoice: 'required' (Converse's "any" tool_choice)`:void 0),Vn(e.model,i)){let t=e.budget_tokens??Ln(e.reasoning_effort,r);Hn(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=Wn(t)}}let g=m?void 0:e.temperature;return{request:{modelId:e.model,messages:Or(o.map(e=>Dr(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 xr(e){return typeof e.send==`function`}function Sr(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*Cr(e){for await(let t of e){let e=Sr(t);e&&(yield e)}}function wr(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:Cr(a.stream)}}}}function Tr(e,t){let n=xr(e)?wr(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}=br(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}=br(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 Er(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 Dr(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)?vr(e.content):[{text:e.content??``}]}}function Or(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*kr(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 Ar(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:kr(n.body)}}async function jr(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 jr(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??U;return s.headers&&typeof s.headers.get==`function`&&W(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 jr(e,t,e.mapRequest(t)),s=e.parseStreamFrames??Mn,c;if(e.requestStream)c=await e.requestStream(r,{method:i,headers:a,body:o,signal:n.signal});else{let t=await Ar(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??U)(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===Nn){yield{type:`ping`};continue}let n=e.mapStreamEvent(t);n&&(Array.isArray(n)?yield*n:yield n)}}}}}}function Nr(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 Pr(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 Fr(e){return e.messages.map(e=>{if(e.role===`user`&&Array.isArray(e.content))return{...e,content:Pr(e.content)};if(e.role===`tool`){let{is_error:t,...n}=e;return n}return e})}function*Ir(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=Fr(e),o=Nr({...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`&&W(s,U(c.headers)),s},async*createStream(e,t){let s=Fr(e),c=Nr({...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=U(r.headers);(i.remainingRequests!==void 0||i.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:i})}for await(let e of l)yield*Ir(e)}}}}}const 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=$,gi=$,_i=$,vi=$,yi=$,bi=$;export{Ge as CircuitBreaker,ze as ConsecutiveTripping,Dn as ConsoleLogger,T as FallbackExhaustedError,b as InMemoryCacheAdapter,p as LLMError,x as NormalizedCacheAdapter,yn as RateLimiter,Ke as RetryBudget,Be as RollingTripping,Nn as SSE_PING,S as TieredCacheAdapter,kn as VernLLM,de as createMiddleware,le as createMiddlewareRef,E as createMiddlewareStateBag,ce as createStateKey,mn as defaultEstimateTokens,ie as defaultFallbackOn,jn as defineCachedCallParams,An as defineCallParams,C as defineTool,bi as from01AI,nr as fromAnthropic,hi as fromAnyscale,yi as fromAtlasCloud,oi as fromBaseten,Tr as fromBedrock,Vr as fromCerebras,ri as fromCloudflareWorkersAI,qr as fromDeepInfra,Br as fromDeepSeek,si as fromFeatherless,Mr as fromFetch,Ur as fromFireworks,ci as fromFriendli,mr as fromGemini,Rr as fromGroq,Yr as fromHyperbolic,_i as fromInferenceNet,vi as fromInfermatic,Qr as fromLMStudio,pi as fromLambdaLabs,gi as fromLepton,fi as fromMiniMax,zr as fromMistral,Xr as fromMoonshot,ii as fromNebius,Jr as fromNovita,ti as fromNvidiaNIM,Wr as fromOllama,Lr as fromOpenAI,$ as fromOpenAICompatible,Gr as fromOpenRouter,ui as fromParasail,Kr as fromPerplexity,ai as fromSambaNova,li as fromSiliconFlow,mi as fromSnowflakeCortex,di as fromStepFun,Hr as fromTogether,$r as fromVLLM,ni as fromVercelAIGateway,ei as fromXAI,Zr as fromZhipu,h as hasIssues,ae as isFallbackExhaustedError,m as isLLMError,ne as isStreamResult,w as isToolCallResult,oe as metaRef,Mn as parseSseStream,ue as requireRef};
12
+ `)}let i=n.trim();if(i){let e=Zn(i);e!==K&&e!==q&&(yield e)}}const K=Symbol(`sse-stream-done`),q=Symbol(`sse-frame-no-data`),Xn=Symbol(`sse-frame-ping`);function Zn(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?Xn: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`})}}function J(e,t){throw new p(`${e} did not return the required structured output tool "${t}".`,`validation`)}function Qn(e,t,n){if(!n||typeof n!=`object`||Array.isArray(n))throw new p(`${e} returned invalid structured output for tool "${t}". Expected an object.`,`validation`)}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 er(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 tr(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 nr(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 rr(e){let t=nr(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 ir(e,t){return rr(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function ar(e,t){return!ir(e,t)}function or(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 sr(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 cr(e){return e===`minimal`?`low`:e}function lr(e,t){return dr(t,e.toUpperCase())}function ur(e){let t=/gemini-\d+\.(\d+)/.exec(e);return t?Number(t[1]):0}function dr(e,t){if(!e.includes(`pro`))return t;let n=fr(e);return n===null||n<3?t:ur(e)===0?t===`HIGH`?`HIGH`:`LOW`:t===`MINIMAL`?`LOW`:t}function fr(e){let t=/gemini-(\d+)/.exec(e);return t?Number(t[1]):null}function pr(e){let t=fr(e);return t!==null&&t>=3}function mr(e,t){return pr(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function hr(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 gr(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 _r(e){let t=e||`auto`;switch(t){case`auto`:return{type:`auto`};case`none`:return{type:`none`};case`required`:return{type:`any`};default:return{type:`tool`,name:t.function.name}}}function vr(e,t){return{tools:e.map(e=>({name:e.function.name,description:e.function.description,input_schema:gr(e.function.parameters,e.function.name)})),toolChoice:_r(t)}}function yr(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&&er(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}=vr(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:gr(e,l),strict:n}],f={type:`tool`,name:l}}!o&&e.tools?.length&&({tools:d,toolChoice:f}=vr(e.tools,e.tool_choice));let m,h;if(e.budget_tokens!==void 0||e.reasoning_effort!==void 0){if(sr(f?.type===`tool`?`toolChoice forcing the "${f.name}" tool`:f?.type===`any`?`toolChoice: 'required' (Anthropic's "any" tool_choice)`:void 0),ar(e.model,r)){let t=e.budget_tokens??tr(e.reasoning_effort,n);or(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=cr(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:xr(a.map(e=>Sr(e))),...d?{tools:d,tool_choice:f}:{},...u||h?{output_config:{...u?{format:u}:{},...h?{effort:h}:{}}}:{},...m?{thinking:m}:{}},toolName:l}}function br(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}=yr(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);e||J(`Anthropic`,c),Qn(`Anthropic`,c,e.input),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 p={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&&P(p,Pe(l)),p},async*createStream(t,s){let{body:c,toolName:l}=yr(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=Pe(n.headers);(r.remainingRequests!==void 0||r.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:r})}let d=new Map,f=0,p=!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`?p=!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`});l&&!p&&J(`Anthropic`,l)}}}}}function xr(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 Sr(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)?hr(e.content):e.content??``}}function Cr(e){return e.map(e=>e.type===`image`?{inlineData:{mimeType:Y(e.mimeType),data:e.data}}:{text:e.text})}function wr(e,t){return`${e}#${t}`}function Tr(e){let t=e||`auto`;switch(t){case`auto`:return{functionCallingConfig:{mode:`AUTO`}};case`none`:return{functionCallingConfig:{mode:`NONE`}};case`required`:return{functionCallingConfig:{mode:`ANY`}};default:return{functionCallingConfig:{mode:`ANY`,allowedFunctionNames:[t.function.name]}}}}function Er(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 Dr(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:kr(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:Or(e.function.arguments,e.function.name)}}))),{role:`model`,parts:t}}return{role:e.role===`assistant`?`model`:`user`,parts:Array.isArray(e.content)?Cr(e.content):[{text:e.content??``}]}}function Or(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 kr(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 Ar(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 jr(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=Tr(e.tool_choice)),mr(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:lr(n,e.model)})}else{let n=e.budget_tokens??(e.reasoning_effort?tr(e.reasoning_effort,t):void 0);n!==void 0&&(o.thinkingConfig={thinkingBudget:n})}let s=Er(i);return{model:e.model,contents:Ar(i.map(e=>Dr(e,s))),config:o}}function Mr(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=jr(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??wr(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=jr(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?wr(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 Nr(e){return e.includes(`claude`)}function Pr(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 Ir(e){return e.map(e=>e.type===`image`?{image:{format:Pr(e.mimeType),source:{bytes:Fr(e.data)}}}:{text:e.text})}function Lr(e,t){return{tools:e.map(e=>({toolSpec:{name:e.function.name,description:e.function.description,inputSchema:{json:e.function.parameters}}})),toolChoice:Wr(t)}}function Rr(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&&er(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=Lr(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(Nr(e.model)&&(e.budget_tokens!==void 0||e.reasoning_effort!==void 0)){let t=d?.toolChoice;if(sr(t&&`tool`in t?`toolChoice forcing the "${t.tool?.name}" tool`:t&&`any`in t?`toolChoice: 'required' (Converse's "any" tool_choice)`:void 0),ar(e.model,i)){let t=e.budget_tokens??tr(e.reasoning_effort,r);or(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=cr(t)}}let g=m?void 0:e.temperature;return{request:{modelId:e.model,messages:Kr(o.map(e=>Gr(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 zr(e){return typeof e.send==`function`}function Br(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=Br(t);e&&(yield e)}}function Hr(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 Ur(e,t){let n=zr(e)?Hr(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}=Rr(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);e?.toolUse||J(`Bedrock`,c);let{input:t}=e.toolUse;Qn(`Bedrock`,c,t),u=JSON.stringify(t)}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}=Rr(e,r,i,a,o),{stream:l}=await n.converseStream(s,t),u=new Map,d=!1;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===`json-tool`?d=!0: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})}c&&!d&&J(`Bedrock`,c)}}}}}function Wr(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 Gr(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)?Ir(e.content):[{text:e.content??``}]}}function Kr(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*qr(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 Jr(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:qr(n.body)}}async function Yr(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 Xr(e){return{chat:{completions:{async create(t,n){let{url:r,method:i,headers:a,body:o}=await Yr(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??N;return s.headers&&typeof s.headers.get==`function`&&P(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 Yr(e,t,e.mapRequest(t)),s=e.parseStreamFrames??Yn,c;if(e.requestStream)c=await e.requestStream(r,{method:i,headers:a,body:o,signal:n.signal});else{let t=await Jr(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??N)(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===Xn){yield{type:`ping`};continue}let n=e.mapStreamEvent(t);n&&(Array.isArray(n)?yield*n:yield n)}}}}}}function Zr(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 Qr(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:Qr(e.content)};if(e.role===`tool`){let{is_error:t,...n}=e;return n}return e})}function*ei(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=Zr({...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`&&P(s,N(c.headers)),s},async*createStream(e,t){let s=$r(e),c=Zr({...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=N(r.headers);(i.remainingRequests!==void 0||i.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:i})}for await(let e of l)yield*ei(e)}}}}}const ti=$,ni=$,ri=$,ii=$,ai=$,oi=$,si=$,ci=$,li=$,ui=$,di=$,fi=$,pi=$,mi=$,hi=$,gi=$,_i=$,vi=$,yi=$,bi=$,xi=$,Si=$,Ci=$,wi=$,Ti=$,Ei=$,Di=$,Oi=$,ki=$,Ai=$,ji=$,Mi=$,Ni=$,Pi=$,Fi=$,Ii=$,Li=$,Ri=$;export{_n as CircuitBreaker,fn as ConsecutiveTripping,Wn as ConsoleLogger,T as FallbackExhaustedError,b as InMemoryCacheAdapter,p as LLMError,x as NormalizedCacheAdapter,Fn as RateLimiter,Te as RetryBudget,pn as RollingTripping,Xn as SSE_PING,S as TieredCacheAdapter,Kn as VernLLM,de as createMiddleware,le as createMiddlewareRef,E as createMiddlewareStateBag,ce as createStateKey,An as defaultEstimateTokens,ie as defaultFallbackOn,Jn as defineCachedCallParams,qn as defineCallParams,C as defineTool,Ri as from01AI,br as fromAnthropic,Ni as fromAnyscale,Li as fromAtlasCloud,wi as fromBaseten,Ur as fromBedrock,ai as fromCerebras,xi as fromCloudflareWorkersAI,di as fromDeepInfra,ii as fromDeepSeek,Ti as fromFeatherless,Xr as fromFetch,si as fromFireworks,Ei as fromFriendli,Mr as fromGemini,ni as fromGroq,pi as fromHyperbolic,Fi as fromInferenceNet,Ii as fromInfermatic,gi as fromLMStudio,ji as fromLambdaLabs,Pi as fromLepton,Ai as fromMiniMax,ri as fromMistral,mi as fromMoonshot,Si as fromNebius,fi as fromNovita,yi as fromNvidiaNIM,ci as fromOllama,ti as fromOpenAI,$ as fromOpenAICompatible,li as fromOpenRouter,Oi as fromParasail,ui as fromPerplexity,Ci as fromSambaNova,Di as fromSiliconFlow,Mi as fromSnowflakeCortex,ki as fromStepFun,oi as fromTogether,_i as fromVLLM,bi as fromVercelAIGateway,vi as fromXAI,hi as fromZhipu,h as hasIssues,ae as isFallbackExhaustedError,m as isLLMError,ne as isStreamResult,w as isToolCallResult,oe as metaRef,Yn as parseSseStream,ue as requireRef};
15
15
  //# sourceMappingURL=index.mjs.map