vern-llm 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/index.cjs +7 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +412 -176
- package/dist/index.d.cts.map +1 -1
- package/dist/{index.d.ts → index.d.mts} +413 -177
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +15 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +26 -24
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -15
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<a href="https://github.com/LakBud/vernLLM">GitHub</a> ·
|
|
9
|
-
<a href="https://vernllm.
|
|
9
|
+
<a href="https://vernllm.dev">Documentation</a> ·
|
|
10
10
|
<a href="https://www.npmjs.com/package/vern-llm">npm</a>
|
|
11
11
|
</p>
|
|
12
12
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
<a href="https://github.com/LakBud/vernLLM/actions/workflows/typecheck.yml"><img src="https://github.com/LakBud/vernLLM/actions/workflows/typecheck.yml/badge.svg" alt="typecheck status" /></a>
|
|
18
18
|
<a href="https://github.com/LakBud/vernLLM/actions/workflows/test-unit.yml"><img src="https://github.com/LakBud/vernLLM/actions/workflows/test-unit.yml/badge.svg" alt="unit test status" /></a>
|
|
19
19
|
<a href="https://github.com/LakBud/vernLLM/actions/workflows/test-integration.yml"><img src="https://github.com/LakBud/vernLLM/actions/workflows/test-integration.yml/badge.svg" alt="integration test status" /></a>
|
|
20
|
+
<a href="https://codecov.io/gh/LakBud/vernLLM" ><img src="https://codecov.io/gh/LakBud/vernLLM/graph/badge.svg?token=NKKW54MODY"/></a>
|
|
20
21
|
<a href="https://github.com/LakBud/vernLLM/actions/workflows/lint.yml"><img src="https://github.com/LakBud/vernLLM/actions/workflows/lint.yml/badge.svg" alt="lint status" /></a>
|
|
21
22
|
<a href="https://github.com/LakBud/vernLLM/blob/main/LICENSE.md"><img src="https://img.shields.io/npm/l/vern-llm.svg" alt="license" /></a>
|
|
22
23
|
<img src="https://img.shields.io/node/v/vern-llm.svg" alt="node version" />
|
|
@@ -27,7 +28,7 @@
|
|
|
27
28
|
|
|
28
29
|
<p align="center">Retries, timeouts, circuit breaking, provider fallback, rate limiting, caching, middleware plug-ins, structured output, usage metering, usage tracking, observability events and even more, with one interface across OpenAI-compatible, Anthropic, Gemini, and Bedrock providers.</p>
|
|
29
30
|
|
|
30
|
-
**Full documentation: [vernllm.
|
|
31
|
+
**Full documentation: [vernllm.dev](https://vernllm.dev)** -> installation, structured output, caching, circuit breaker, provider fallback, rate limiting, observability, every adapter, and the complete API reference all live there and are kept up to date. This README is a quick pitch, not the manual.
|
|
31
32
|
|
|
32
33
|
## Install
|
|
33
34
|
|
|
@@ -99,7 +100,7 @@ const result = await finalResult; // cached, retried, and streamed, tool calls i
|
|
|
99
100
|
- **One interface, every provider**: OpenAI, Groq, Mistral, DeepSeek, Cerebras, Together, Fireworks, Ollama, Anthropic, Gemini, Bedrock, or raw HTTP via `fromFetch`
|
|
100
101
|
- **Zero runtime dependencies**: `zod` and provider SDKs are not required dependencies; vern-llm relies on compatible interfaces rather than specific implementations.
|
|
101
102
|
|
|
102
|
-
See the [docs](https://vernllm.
|
|
103
|
+
See the [docs](https://vernllm.dev) for adapter setup, caching, the circuit breaker, provider fallback, rate limiting, and structured output in depth.
|
|
103
104
|
|
|
104
105
|
## License
|
|
105
106
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
"use strict";var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const c=s(require(`crypto`)),l=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),u=new Set([`rate_limit_queue_full`,`rate_limit_queue_timeout`,`rate_limit_capacity_exceeded`]),d=new Set([`middleware_timeout`]),f=new Set([`parse`,`validation`,`invalid_params`,`aborted`]);function p(e,t){return!(f.has(e)||t&&l.has(t)||t&&u.has(t)||t&&d.has(t))}function m(e){if(e!==void 0)try{return JSON.stringify(e),e}catch{return`[Unserializable: issues contained a circular reference]`}}function h(e){if(e!==void 0)try{return JSON.parse(JSON.stringify(e))}catch{return`[Unserializable: request body contained a circular reference]`}}const g=new Set([`authorization`,`x-api-key`,`x-goog-api-key`,`api-key`]);function _(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))g.has(n.toLowerCase())||(t[n]=r);return t}const v=20;function y(e,t=0){if(e!==void 0)return t>=v?[]:e.map(e=>({...e,error:{...e.error,issues:m(e.error.issues),attempts:y(e.error.attempts,t+1)},request:e.request&&{...e.request,body:h(e.request.body),headers:_(e.request.headers)}}))}function b(e,t,n,r,i=Date.now()){return{provider:e,model:t,body:h(n),headers:_(r),startedAt:i}}var x=class extends Error{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 p(this.type,this.code)}toSnapshot(){return{message:this.message,type:this.type,status:this.status,issues:m(this.issues),retryAfterMs:this.retryAfterMs,code:this.code,retryable:this.retryable,attempts:y(this.attempts)}}toJSON(){return{name:this.name,message:this.message,type:this.type,status:this.status,issues:m(this.issues),retryAfterMs:this.retryAfterMs,code:this.code,retryable:this.retryable,attempts:y(this.attempts)}}};function S(e){return e instanceof x}function ee(e,t){return e.code===t&&e.issues!==void 0}var C=class{store=new Map;constructor(e=1e3){this.maxSize=e}async get(e){let t=this.store.get(e);return t?Date.now()>=t.expiresAt?(this.store.delete(e),{hit:!1,value:null}):{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.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.store.keys().next().value;if(e===void 0)break;this.store.delete(e)}}},te=class{constructor(e=new C){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))}},ne=class{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 re(e){return e}function ie(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`tool_calls`&&Array.isArray(e.toolCalls)}const ae=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),oe=e=>e.type===`parse`||e.type===`validation`||e.type===`aborted`||e.type===`quota_exceeded`||e.code&&ae.has(e.code)?`stop`:`next`;var w=class extends x{constructor(e){let t=e[e.length-1]?.error;super(`${e.length} provider${e.length===1?``:`s`} attempted and failed: ${e.map(e=>`${e.provider}(${e.error.type})`).join(` then `)}`,`fallback_exhausted`,{status:t?.status,cause:t,retryAfterMs:t?.retryAfterMs,code:`fallback_exhausted`,attempts:e}),this.attempts=e}get retryable(){let e=this.attempts[this.attempts.length-1]?.error;return e?e.retryable:super.retryable}};function se(e){return e instanceof w}function ce(){return{}}function le(e){return{debugName:e}}function T(){let e=new Map;return{get(t){return e.get(t)},set(t,n){e.set(t,n)}}}function ue(e){let{onError:t,...n}=e;return t?{...n,wrap:async(e,n,r)=>{try{return await n()}catch(e){try{await t(e,r)}catch{}throw e}}}:n}function de(e,t){let n=e.completion_tokens_details?.reasoning_tokens;return{promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,...n===void 0?{}:{reasoningTokens:n},requestId:t.requestId,model:t.model,provider:t.providerName,usedFallback:t.isFallback}}async function fe(e,t,n){if(!e.reserveUsage)return!1;try{return await e.reserveUsage({coalesced:t,signal:n}),!0}catch(e){throw n?.aborted?new x(`LLM request aborted`,`aborted`):new x(e instanceof Error?e.message:`Usage reservation failed`,`quota_exceeded`,{cause:e})}}function pe(e,t,n,r){return async i=>{try{await e.refundUsage?.({coalesced:t,signal:n})}catch(e){r(i,e)}}}async function E(e,t,n,r,i){if(r?.aborted)throw new x(`LLM request aborted`,`aborted`);let a=await fe(e,t,r),o=pe(e,t,r,i);if(r?.aborted)throw a&&await o(`[VernLLM] refundUsage failed after abort`),new x(`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 x(`LLM request aborted`,`aborted`);return s}async function me(e,t,n,r){if(n?.aborted)throw new x(`LLM request aborted`,`aborted`);let i=await fe(e,!1,n),a=pe(e,!1,n,r);if(n?.aborted)throw i&&await a(`[VernLLM] refundUsage failed after abort`),new x(`LLM request aborted`,`aborted`);let o;try{o=await t()}catch(e){throw i&&await a(`[VernLLM] refundUsage failed after stream-open failure`),e}let s=o.finalResult.then(e=>e,async e=>{throw i&&await a(`[VernLLM] refundUsage failed after stream error`),e});return s.catch(()=>{}),{chunks:o.chunks,finalResult:s}}function he(){let e=new Map;function t(t){return e.get(t)}function n(t,n){return e.set(t,n),n.catch(()=>{}).finally(()=>{e.get(t)===n&&e.delete(t)}),n}return{get:t,track:n}}function ge(e){return typeof e==`string`?e:JSON.stringify(e)??``}function _e(e,t){let n=[];if(t){let t=e;t.type===`tool_calls`?(t.toolCalls.forEach((e,t)=>{n.push({type:`tool_call_delta`,index:t,id:e.id,name:e.name,argsDelta:JSON.stringify(e.arguments??{}),complete:!0})}),t.content&&n.push({type:`text-delta`,delta:t.content})):n.push({type:`text-delta`,delta:ge(t.content)})}else n.push({type:`text-delta`,delta:ge(e)});return{async*[Symbol.asyncIterator](){for(let e of n)yield e}}}function ve(e,t){return{async*[Symbol.asyncIterator](){let n=await e;yield*_e(n,t)}}}var ye=class{inFlight=he();constructor(e,t){this.cache=e,this.logger=t}async resolveCacheKey(e){return this.cache.resolveKey?await this.cache.resolveKey(e):e}async deleteCache(e){if(this.cache.delete)try{await this.cache.delete(await this.resolveCacheKey(e))}catch(e){this.logger.warn(`[VernLLM] cache delete failed: ${e instanceof Error?e.message:`unknown`}`)}}logRefundError(e,t){this.logger.error(e,{message:t instanceof Error?t.message:`unknown`})}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),n=t===e.cacheKey?e:{...e,cacheKey:t};return{resolvedParams:n,cached:await this.getCached(t)}}joinInFlight(e,t){return E(e,!0,()=>t,e.signal,(e,t)=>this.logRefundError(e,t))}async runCached(e){let{resolvedParams:t,cached:n}=await this.resolveKeyAndReadCache(e);if(n.hit)return n.value;let r=this.inFlight.get(t.cacheKey);return r?this.joinInFlight(t,r):this.registerTrigger(t)}registerTrigger(e){let t=E(e,!1,()=>this.runAndCache(e),e.signal,(e,t)=>this.logRefundError(e,t));return this.inFlight.track(e.cacheKey,t),t}async runAndCache(e){let t=await e.fn();try{await this.cache.set(e.cacheKey,t,e.ttl)}catch(e){this.logger.warn(`[VernLLM] cache write failed: ${e instanceof Error?e.message:`unknown`}`)}return t}async runCachedStream(e,t){let{resolvedParams:n,cached:r}=await this.resolveKeyAndReadCache(e);if(r.hit){let e=r.value;return{chunks:_e(e,t),finalResult:Promise.resolve(e)}}let i=this.inFlight.get(n.cacheKey);if(i){let e=this.joinInFlight(n,i);return e.catch(()=>{}),{chunks:ve(e,t),finalResult:e}}return this.registerStreamTrigger(n)}registerStreamTrigger(e){let t,n,r=new Promise((e,r)=>{t=e,n=r});this.inFlight.track(e.cacheKey,r);let i=me(e,async()=>{let t=await e.openStream(),n=t.finalResult.then(async t=>{try{await this.cache.set(e.cacheKey,t,e.ttl)}catch(e){this.logger.warn(`[VernLLM] cache write failed: ${e instanceof Error?e.message:`unknown`}`)}return t},e=>{throw e});return{chunks:t.chunks,finalResult:n}},e.signal,(e,t)=>this.logRefundError(e,t));return i.then(e=>{e.finalResult.then(t,n)},e=>{n(e)}),i}};const be=1e4,xe=2147483647;function Se(e){return!e||e<=0||e===1/0?void 0:e}function Ce(e){return Math.min(e,xe)}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 x(`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 x(`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 D(e,t){return e<0?void 0:Math.min(e,t)}function Oe(e,t=be){if(!e||typeof e!=`object`)return;let n=e,r=n.headers??n.response?.headers;if(!(!r||typeof r!=`object`))for(let{name:e,kind:n}of Ee){let i=De(r,e)?.trim();if(!i)continue;if(n===`ms`&&/^\d+$/.test(i))return D(Number(i),t);if(n===`seconds`&&/^\d+(\.\d+)?$/.test(i))return D(Number(i)*1e3,t);if(n===`date`){let e=Date.parse(i);if(!Number.isNaN(e))return D(e-Date.now(),t)}}}function ke(e,t,n=be,r=!1,i=!1){let a=r?2:i?1.5:1,o=Math.min(e*a*2**t,n);return o/2+Math.random()*(o/2)}async function Ae(e,t){if(t?.aborted)throw new x(`Operation aborted`,`aborted`);await new Promise((n,r)=>{let i=()=>{clearTimeout(a),r(new x(`Operation aborted`,`aborted`))},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}function je(e,t,n,r){if(r?.aborted||e instanceof x&&!e.retryable)return!1;let i=n(e);return!(i!==void 0&&t.includes(i))}async function Me(e){let{requestId:t,model:n,attempt:r,error:i,state:a,signal:o,providerName:s,maxRetries:c,baseDelayMs:l,middleware:u,middlewareTimeoutMs:d,logger:f,reportEvent:p,buildEventContext:m,extractStatus:h,normalizeError:g,emitEvent:_}=e,v=Oe(i),y=h(i),b=v??ke(l,r,void 0,y===429,y!==void 0&&y>=500&&y<=599),x=v!==void 0;f.warn(`[VernLLM:${t}] recovery attempt ${r}/${c}, waiting ${Math.ceil(b)}ms`+(x?` (honoring Retry-After)`:``)),_({kind:`retry`,requestId:t,provider:s,model:n,attempt:r,maxRetries:c,delayMs:b,retryAfterHonored:x,error:g(i,o)},m(t,n,r,o,a),p,u,d,f),await Ae(b,o)}async function Ne(e){let{fn:t,maxRetries:n,signal:r,onAttempt:i,attempts:a,shouldRetryAttempt:o,recoverDelayForAttempt:s,normalizeError:c}=e,l,u;for(let e=0;e<=n;e++){u=void 0;try{return e>0&&await s(e,l),i?.(),await t(e,e=>{u=e})}catch(t){l=t;let i=e<n&&o(t,r);if(!i)break;a?.push({index:e,error:c(t,r).toSnapshot(),request:u})}}throw l}function O(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 Pe=new Set([`ECONNREFUSED`,`ENOTFOUND`,`ECONNRESET`,`ETIMEDOUT`,`EAI_AGAIN`,`EPIPE`,`ECONNABORTED`,`EHOSTUNREACH`,`ENETUNREACH`]),Fe=new Set([`fetch failed`,`failed to fetch`,`load failed`,`networkerror when attempting to fetch resource.`]);function Ie(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.code==`string`&&Pe.has(t.code)||typeof t.message==`string`&&Fe.has(t.message.toLowerCase()))return!0;if(t.cause&&typeof t.cause==`object`){let e=t.cause;if(typeof e.code==`string`&&Pe.has(e.code))return!0}return!1}function Le(e){try{return JSON.stringify(e,null,2)??String(e)}catch{try{return String(e)}catch{return`[unprintable error]`}}}function k(e){if(e&&typeof e==`object`)try{let t=e;if(t.error!==void 0)return Le(t.error);if(typeof t.message==`string`)return t.message}catch{}return Le(e)}function A(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 Re=/\(no body\)/i;function ze(e){return Object.keys(e).length===0}function Be(e){if(e&&typeof e==`object`){let{error:t,message:n}=e;if(t!=null){let e=typeof t==`string`&&t.trim().length===0,n=typeof t==`object`&&ze(t);if(!e&&!n)return!1}if(typeof n==`string`){let e=n.trim();return e.length===0||Re.test(e)}return!0}return!0}function j(e,t,n){if(t?.aborted)return new x(`LLM request aborted`,`aborted`,{attempts:n});if(e instanceof x)return e.code===void 0&&e.status!==void 0&&(e.code=A(e.status)),e.attempts===void 0&&n!==void 0&&(e.attempts=n),e;let r=O(e),i=Oe(e);if(r!==void 0){let t=k(e),a=A(r),o=a===void 0,s=Be(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}`;return new x(s,`api`,{status:r,cause:e,retryAfterMs:i,code:a,attempts:n})}return Ie(e)?new x(`LLM request failed`,`network`,{cause:e,retryAfterMs:i,code:`connection_failed`,attempts:n}):new x(`LLM request failed`,`unknown`,{cause:e,retryAfterMs:i,attempts:n})}const Ve=5e3;function M(e,t){return e.name??`[${t}]`}function He(e,t,n){return t<=0?e():new Promise((r,i)=>{let a=setTimeout(()=>{i(new x(`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 N(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 He(async()=>a(t),o,n)}catch(e){return i.error(`[VernLLM] middleware "${n}".enabled threw or timed out, treating as disabled`,{message:e instanceof Error?e.message:`unknown`}),!1}}const Ue=[`temperature`,`max_tokens`,`reasoning_effort`,`budget_tokens`,`tool_choice`,`messages`,`addMessages`,`tools`,`addTools`];function We(e,t){let n=t,r=Ue.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 Ge(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 x(`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 Ke(e,t,n){if(t.model!==e.model)throw new x(`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 x(`middleware "${n}" changed \`response_format\` via transform, which isn't supported.`,`invalid_params`)}async function qe(e){let{request:t,requestId:n,attempt:r,signal:i,state:a,middleware:o,middlewareTimeoutMs:s,logger:c,reportEvent:l,buildContext:u}=e;if(o.length===0)return t;let d=t,f=t,p=o.map((e,t)=>({middlewareEntry:e,index:t})).sort((e,t)=>(e.middlewareEntry.priority??0)-(t.middlewareEntry.priority??0));for(let{middlewareEntry:e,index:t}of p){let d=M(e,t),p=u(r,i,a),m=await N(e,p,d,s,c);if(!m){e.enabled!==void 0&&P({kind:`middleware`,requestId:n,middleware:d,hook:`enabled_skip`},p,l,o,s,c);continue}if(!e.transform)continue;let h=await Je(e,structuredClone(f),p,d,s),{request:g,patchedFields:_}=We(f,h);_.length>0&&((h.tools!==void 0||h.addTools?.length)&&Ge(g,d),P({kind:`middleware`,requestId:n,middleware:d,hook:`transform`,patchedFields:_},p,l,o,s,c)),f=g}return Ke(d,f,`chain`),f}async function Je(e,t,n,r,i){if(!e.transform)return{};let a=e.timeoutMs??i;try{return await He(async()=>e.transform(t,n),a,r)}catch(e){throw Ye(e,r,n.signal)}}function Ye(e,t,n){let r=j(e,n);return r.type===`unknown`?new x(`middleware "${t}" threw: ${r.message}`,`invalid_params`,{code:`middleware_threw`,cause:e}):r}function P(e,t,n,r,i,a){n(e),r.length!==0&&Xe(r,e,t,i,a)}async function Xe(e,t,n,r,i){for(let a=0;a<e.length;a++){let o=e[a];if(!o.onEvent)continue;let s=M(o,a),c=await N(o,n,s,r,i);if(c)try{Promise.resolve(o.onEvent(t,{...n,own:{}})).catch(e=>{i.error(`[VernLLM] middleware "${s}".onEvent failed`,{message:e instanceof Error?e.message:`unknown`})})}catch(e){i.error(`[VernLLM] middleware "${s}".onEvent failed`,{message:e instanceof Error?e.message:`unknown`})}}}async function Ze(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{s===0&&a||c.assertBreakerClosed(t.model,{requestId:n,state:r,signal:t.signal});let e=await i(c,()=>{u+=1});return{result:e,executor:c,index:s,attemptCount:u}}catch(i){let a=j(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}),p=d?`stop`:f;if(p===`stop`)throw o.length>1?new w(o):a;let m=e.executors[s+1],h=t.model??c.model,g={stage:`attempt`,requestId:n,requestedProvider:c.providerName,requestedModel:h,isFallbackAttempt:s>0,attempt:u||1,capabilities:{supportsJsonObjectMode:c.jsonObjectModeSupported},signal:t.signal,state:r,own:{}};P({kind:`fallback`,requestId:n,from:c.providerName,to:m.providerName,fromIndex:s-1,toIndex:s,error:a,elapsedMs:Date.now()-l},g,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger)}}throw new x(`No provider targets configured`,`invalid_params`)}function Qe(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 $e(e,t,n,r,i){let a=await Ze(e,t,n,i,(e,r)=>e.run(t,n,r,i),r);return Qe(a,t)}async function et(e,t,n,r,i){let a=await Ze(e,t,n,i,(e,r)=>e.runStream(t,n,r,i),r);return Qe(a,t)}function tt(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 F(e,t,n,r,i,a=!1){if(e.middleware.length===0||a)return i();let o=e.primaryExecutor,{model:s,request:c}=o.previewRequest(t),l=i;for(let i=e.middleware.length-1;i>=0;i--){let a=e.middleware[i],u=M(a,i),d=l;l=async()=>{let i={stage:`pre-dispatch`,requestId:n,primaryProvider:o.providerName,primaryModel:s,capabilities:{supportsJsonObjectMode:o.jsonObjectModeSupported},signal:t.signal,state:r,own:{}},l=await N(a,i,u,e.middlewareTimeoutMs,e.logger);if(!l)return a.enabled!==void 0&&P({kind:`middleware`,requestId:n,middleware:u,hook:`enabled_skip`},i,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger),d();if(!a.wrap)return d();let f=tt(d);try{let t=await a.wrap(c,f.call,i);return f.wasCalled()||P({kind:`middleware`,requestId:n,middleware:u,hook:`wrap_short_circuit`},i,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger),t}catch(t){let n=f.resolvedValue();if(n!==void 0)return e.logger.error(`[VernLLM] middleware "${u}".wrap threw after next() resolved; keeping the original result`,{message:t instanceof Error?t.message:`unknown`}),n;throw Ye(t,u,i.signal)}}}return l()}const I=Symbol(`deadlineExceeded`);function nt(e,t){if(e===void 0)return{signal:t,timer:void 0};let n=new AbortController;if(e<=0){n.abort(I);let e=t?AbortSignal.any([t,n.signal]):n.signal;return{signal:e,timer:void 0}}let r=setTimeout(()=>n.abort(I),e),i=t?AbortSignal.any([t,n.signal]):n.signal;return{signal:i,timer:r}}function rt(e,t){return e instanceof x&&e.type===`aborted`&&e.code===void 0&&t?.reason===I&&(e.code=`deadline_exceeded`),e}var L=class{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}};function it(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)}const at=2147483647;var ot=class{requests;tokens;concurrency;maxQueueMs;maxQueueSize;estimateTokensFn;queue=[];wakeTimer;constructor(e){e.requestsPerMinute&&(this.requests=new L(e.requestsPerMinute,e.requestsPerMinute/6e4)),e.tokensPerMinute&&(this.tokens=new L(e.tokensPerMinute,e.tokensPerMinute/6e4)),e.maxConcurrent&&(this.concurrency=new L(e.maxConcurrent,0)),this.maxQueueMs=e.maxQueueMs??3e4,this.maxQueueSize=e.maxQueueSize??0,this.estimateTokensFn=e.estimateTokens??it}estimate(e){return this.estimateTokensFn(e)}async acquire(e,t){if(t?.aborted)throw new x(`LLM request aborted`,`aborted`);if(!Number.isFinite(e)||e<0)throw new x(`estimatedTokens must be a finite, non-negative number, got ${String(e)}`,`invalid_params`);if(this.tokens&&e>this.tokens.getCapacity())throw new x(`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 x(`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),this.wakeTimer=void 0),this.drain(),i(e)}},o,s=()=>{a.reject(new x(`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 x(`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=[],n=(e,n)=>e?e.tryTake(n)?(t.push({bucket:e,amount:n}),!0):!1:!0;if(!n(this.concurrency,1))return{ok:!1,reason:`concurrency`};if(!n(this.requests,1)){for(let e of t)e.bucket.give(e.amount);return{ok:!1,reason:`rpm`}}if(!n(this.tokens,e)){for(let e of t)e.bucket.give(e.amount);return{ok:!1,reason:`tpm`}}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)return;let n=e===`rpm`?this.requests?.msUntilAvailable(1):e===`tpm`?this.tokens?.msUntilAvailable(t):void 0;if(n===void 0||!Number.isFinite(n))return;let r=Math.min(Math.max(1,Math.ceil(n)),at);this.wakeTimer=setTimeout(()=>{this.wakeTimer=void 0,this.drain()},r)}makeRelease(e){let t=!1;return n=>{t||(t=!0,this.concurrency?.give(1),this.tokens&&n!==void 0&&Number.isFinite(n)&&this.tokens.give(e-n),this.drain())}}};function st(){return{state:`closed`,consecutiveFailures:0,openedAt:0,trialInFlight:!1}}const R=``;var ct=class{threshold;cooldownMs;onStateChange;isolateByModel;sharedBucket=st();bucketsByModel=new Map;constructor(e={}){this.threshold=e.threshold??5,this.cooldownMs=e.cooldownMs??3e4,this.onStateChange=e.onStateChange,this.isolateByModel=e.isolateByModel??!1}lookupBucket(e){if(!this.isolateByModel)return this.sharedBucket;let t=e??R;return this.bucketsByModel.get(t)}ensureBucketFor(e){if(!this.isolateByModel)return this.sharedBucket;let t=e??R,n=this.bucketsByModel.get(t);return n||(n=st(),this.bucketsByModel.set(t,n)),n}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)}assertClosed(e,t){let n=this.ensureBucketFor(e);if(n.state!==`closed`){if(n.state===`open`){let r=Date.now()-n.openedAt;if(r<this.cooldownMs)throw new x(`Circuit open, provider has failed ${n.consecutiveFailures} times in a row. Retry in ${Math.ceil((this.cooldownMs-r)/1e3)}s.`,`circuit_open`,{code:`circuit_cooling_down`});n.trialInFlight=!0,this.transition(n,`half-open`,e,t);return}if(n.trialInFlight)throw new x(`Circuit half-open. A trial request is already in flight. Try again shortly.`,`circuit_open`,{code:`circuit_trial_in_flight`});n.trialInFlight=!0}}recordSuccess(e,t){let n=this.lookupBucket(e);n&&(n.consecutiveFailures=0,n.trialInFlight=!1,this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.bucketsByModel.delete(e??R))}recordFailure(e,t){let n=this.ensureBucketFor(e);if(n.consecutiveFailures+=1,n.trialInFlight=!1,n.state===`half-open`){n.openedAt=Date.now(),this.transition(n,`open`,e,t);return}n.consecutiveFailures>=this.threshold&&(n.openedAt=Date.now(),this.transition(n,`open`,e,t))}getState(e){return this.lookupBucket(e)?.state??`closed`}open(e,t){let n=this.ensureBucketFor(e);n.openedAt=Date.now(),n.trialInFlight=!1,this.transition(n,`open`,e,t)}close(e,t){let n=this.ensureBucketFor(e);n.consecutiveFailures=0,n.trialInFlight=!1,this.transition(n,`closed`,e,t),this.isolateByModel&&n.state===`closed`&&n.consecutiveFailures===0&&this.bucketsByModel.delete(e??R)}};function z(e,t){return n=>{if(e)try{e(n)}catch(e){t.error(`[VernLLM] onEvent failed`,{message:e instanceof Error?e.message:`unknown`})}}}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 lt(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 ct({...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){let e={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:{}};P(m,e,d,a,o,i)}else d(m);if(u)try{u(e,r,l,f,p)}catch(e){i.error(`[VernLLM] circuitBreaker.onStateChange failed`,{message:e instanceof Error?e.message:`unknown`})}}})}function ut(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function dt(e){return e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments??{})}}))}function ft(e){return e.map(e=>{let t;try{t=e.function.arguments.trim()?JSON.parse(e.function.arguments):{}}catch{throw new x(`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 pt(e){return typeof e==`string`?e:JSON.stringify(e)}function mt(e,t){if(e&&e.length===0)throw new x("`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 x(`\`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 x("`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 x(`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 ht(e){let{jsonModeExplicit:t,hasTools:n,jsonSchema:r,hasSchema:i,supportsJsonObjectMode:a}=e,o=t??!n;if(!a&&!r&&t===!0)throw new x('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 x('`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,c=s||!!r;if(i&&!c)throw new x(`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 c}function gt(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 _t(e){return!e||e===`auto`?`auto`:e===`none`||e===`required`?e:{type:`function`,function:{name:e.name}}}function vt(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:pt(e.content)},tool_calls:dt(e.toolCalls)}]:e.role===`assistant`?[{role:`assistant`,content:pt(e.content===void 0?``:e.content)}]:[{role:e.role,content:e.content??``}]}function yt(e){let t;for(let[n,r]of e.entries()){if(r.role===`tool`){if(t?.role!==`assistant`||!t.toolCalls?.length)throw new x(`history[${n}] is a "tool" turn, but must immediately follow an "assistant" turn that requested tools`,`invalid_params`);if(!r.toolResults?.length)throw new x(`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 x(`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 x(`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 x(`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 x(`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 x(`history[${n}] follows an assistant tool request without tool results`,`invalid_params`)}t=r}if(t?.role===`assistant`&&t.toolCalls?.length)throw new x(`The last entry in history is an assistant tool request without tool results`,`invalid_params`);if(t?.role===`user`)throw new x(`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;mt(s,c);let f=ht({jsonModeExplicit:e.jsonMode,hasTools:!!s,jsonSchema:o,hasSchema:!!e.schema,supportsJsonObjectMode:this.supportsJsonObjectMode}),p=gt(o,f);yt(r);let m={model:a,...l===null?{}:{temperature:l},max_tokens:i,...p?{response_format:p}:{},...u?{reasoning_effort:u}:{},...d==null?{}:{budget_tokens:d},...s?{tools:ut(s)}:{},...s?{tool_choice:_t(c)}:{},messages:[...t?[{role:`system`,content:t}]:[],...r.flatMap(e=>vt(e)),{role:`user`,content:n}]};return{useJson:f,model:a,request:m}}};function xt(e,t,n){let r;try{r=n(e)}catch{throw new x(`Invalid JSON response`,`parse`)}if(r==null)throw new x(`Invalid JSON response`,`parse`);if(!t)return r;let i=t.safeParse(r);if(!i.success)throw new x(`Schema validation failed`,`validation`,{issues:i.error});return i.data}function St(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.`,r=i.length>1?`${t} (${i.length} tool call issues total, see error.issues.)`:t;throw new x(r,`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 x(`Arguments for tool call "${t.name}" failed validation`,`validation`,{issues:r.error})}}function Ct(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 x(`Empty LLM response`,`api`,{code:`empty_response`});if(s.debug(`[VernLLM:${o}] output:\n`+c(l??`[${n?.length??0} tool call(s)]`).slice(0,800)),n?.length){if(!r.tools)throw new x("Provider returned tool_calls but no `tools` were sent with this call.",`validation`,{code:`unexpected_tool_calls`});if(r.toolChoice===`none`)throw new x(`Provider returned tool_calls despite toolChoice: 'none'.`,`validation`,{code:`tool_choice_none_violated`});let e=ft(n);return St(e,r.tools),{type:`tool_calls`,toolCalls:e,...l?{content:l}:{}}}let u=l??``;if(!i)return r.tools?{type:`content`,content:u}:u;let d=xt(u,r.schema,a);return r.tools?{type:`content`,content:d}:d}function wt(e,t,n,r,i,a,o,s,c){let{gateway:l,usageReporter:u,logger:d,redactText:f,parseJson:p}=c;try{let c=Ct({rawContent:e,wireToolCalls:t,params:n,useJson:r,parseJson:p,requestId:a,logger:d,redactText:f});return l.recordSuccess(o,n.signal,s),u.reportSuccess(i),c}catch(e){let t=j(e,n.signal);throw i&&t.type!==`aborted`&&u.reportFailure(i,t,o),t}}function Tt(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)}let p={[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})})}}}};return{push:u,finish:d,fail:f,iterable:p}}const Et=1e4,Dt=1e6;function Ot(){let e=new Map;function t(t){let n=e.get(t.index);if(!n){if(e.size>=Et)throw new x(`Stream contained more than ${Et} distinct tool calls`,`validation`);n={args:``}}let r=t.argumentsDelta??``;if(n.args.length+r.length>Dt)throw new x(`Tool call arguments exceeded the ${Dt}-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 kt(e,t){try{await e.return?.()}catch{}t.abort()}function At(e,t,n){let{requestId:r,model:i,providerName:a,isFallback:o,chunkIdleTimeoutMs:s,streamController:c,logger:l,signal:u}=n,d,f,p=new Promise((e,t)=>{d=e,f=t});p.catch(()=>{});let m=1e4,h=Tt({capacity:m,logger:l,label:`stream chunk`}),{push:g,finish:_,fail:v}=h,y=h.iterable,b=Ot(),x=``,S;return(async()=>{try{let n=t;for(;!n.done;){let t=n.value;t.type===`ping`||(t.type===`text-delta`?(x+=t.delta,g({type:`text-delta`,delta:t.delta})):t.type===`tool_call_delta`?g(b.apply(t)):t.type===`usage`&&(S=de(t.usage,{requestId:r,model:i,providerName:a,isFallback:o}),g({type:`usage`,usage:S}))),n=await Te(()=>e.next(),s,()=>c.abort(),l)}}catch(t){await kt(e,c);let r=j(t,u);try{n.onStreamFailure(r,S)}catch{}v(r),f(r);return}_();try{n.onStreamSuccess(S)}catch{}try{let e=b.toWireToolCalls(),t=n.finalize(x,e,S);d(t)}catch(e){f(e)}})(),{chunks:y,finalResult:p}}function jt(e){let{providerName:t,isFallback:n,maxRetries:r,onUsage:i,onUsageFailure:a,logger:o}=e;function s(e,r,i){if(e.usage)return de(e.usage,{requestId:r,model:i,providerName:t,isFallback:n})}function c(e){if(e)return e.totalTokens||e.promptTokens+e.completionTokens}function l(e){if(!(!e||!i))try{i(e)}catch(e){o.error(`[VernLLM] onUsage failed`,{message:e instanceof Error?e.message:`unknown`})}}function u(e,t,n,i=!1){let s=e.totalTokens||e.promptTokens+e.completionTokens,c=i?`mid-stream failure (terminal, no further attempts)`:`attempt ${n+1}/${r+1}`;if(o.warn(`[VernLLM:${e.requestId}] usage failure, ${c}: type=${t.type} tokens=${s}`),a)try{a(e,t)}catch(e){o.error(`[VernLLM] onUsageFailure failed`,{message:e instanceof Error?e.message:`unknown`})}}return{extract:s,actualTokensFor:c,reportSuccess:l,reportFailure:u}}async function Mt(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 Nt(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:f,reportEvent:p}=e,m=a??T(),h=s.build(t),{useJson:g,model:_}=h,v=await qe({request:h.request,requestId:n,attempt:r,signal:t.signal,state:m,middleware:u,middlewareTimeoutMs:d,logger:f,reportEvent:p,buildContext:(e,t,n)=>o.buildAttemptContext(e,t,n)});i?.(b(c,_,v,void 0,Date.now()));let{release:y}=await Mt(l,v,t.signal,(e,i)=>{P({kind:`rate_limited`,requestId:n,provider:c,model:_,waitedMs:e,reason:i},o.buildAttemptContext(r,t.signal,m),p,u,d,f)});return{request:v,model:_,useJson:g,state:m,release:y}}function Pt(e){let{breaker:t,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o}=e;function s(e,t,s){return{stage:`attempt`,requestId:n,requestedProvider:i,requestedModel:r,isFallbackAttempt:a,attempt:e+1,capabilities:{supportsJsonObjectMode:o},signal:t,state:s,own:{}}}function c(e,t,r){return{requestId:n,state:r,signal:t,attempt:e+1}}return{buildAttemptContext:s,buildCallContext:c,recordSuccess(e,n,i){t?.recordSuccess(r,c(e,n,i))},recordFailure(e,n,i){t?.recordFailure(r,c(e,n,i))}}}async function Ft(e){let{fn:t,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,breaker:s,maxRetries:c,baseDelayMs:l,nonRetryableStatus:u,signal:d,onAttempt:f,middleware:p,middlewareTimeoutMs:m,logger:h,reportEvent:g,logLabel:_,redactText:v,countsTowardBreaker:y}=e,b=e.state??T(),x=[],S=Pt({breaker:s,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o});try{return await Ne({fn:(e,n)=>t(e,n,b,S),maxRetries:c,signal:d,onAttempt:f,attempts:x,shouldRetryAttempt:(e,t)=>je(e,u,O,t),recoverDelayForAttempt:(e,t)=>Me({requestId:n,model:r,attempt:e,error:t,state:b,signal:d,providerName:i,maxRetries:c,baseDelayMs:l,middleware:p,middlewareTimeoutMs:m,logger:h,reportEvent:g,buildEventContext:(e,t,n,r,i)=>S.buildAttemptContext(n,r,i),extractStatus:O,normalizeError:j,emitEvent:P}),normalizeError:j})}catch(e){let t=j(e,d,x.length>0?x:void 0);throw y(t)&&S.recordFailure(x.length,d,b),h.debug(`[VernLLM:${n}] ${_}:\n${v(k(e))}`),t}}function It(e){try{return JSON.parse(e)}catch{return}}var Lt=class{maxRetries;timeoutMs;chunkIdleTimeoutMs;baseDelayMs;nonRetryableStatus;parseJson;logger;redact;usageReporter;reportEvent;breaker;limiter;isFallback;requestBuilder;middleware;middlewareTimeoutMs;supportsJsonObjectMode;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??It,this.logger=r.logger,this.redact=r.redact,this.reportEvent=z(r.onEvent,this.logger),this.breaker=r.breaker,this.limiter=r.limiter,this.isFallback=r.isFallback??!1,this.middleware=r.middleware??[],this.middlewareTimeoutMs=r.middlewareTimeoutMs??Ve,this.supportsJsonObjectMode=t.supportsJsonObjectMode??!0,this.usageReporter=jt({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)}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 Ft({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,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 Ft({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,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 Nt({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=await we(e=>this.client.chat.completions.create(o,{signal:e}),this.timeoutMs,e.signal),i=this.usageReporter.extract(r,t,s);d?.(this.usageReporter.actualTokensFor(i)),d=void 0;let u=r.choices?.[0]?.message?.content,f=r.choices?.[0]?.message?.tool_calls;return wt(u,f,e,c,i,t,n,l,{gateway:a,usageReporter:this.usageReporter,logger:this.logger,redactText:e=>this.redactText(e),parseJson:this.parseJson})}finally{d?.()}}redactText(e){return this.redact?this.redact(e):e}async executeStreamCall(e,t,n,r,i,a){let o=this.client.chat.completions;if(!o.createStream)throw new x(`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 Nt({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}),p=f,m=new AbortController,h=e.signal?AbortSignal.any([e.signal,m.signal]):m.signal;try{let{iterator:r,first:i}=await we(async e=>{let t=s(c,{signal:e})[Symbol.asyncIterator](),n=await t.next();return{iterator:t,first:n}},this.timeoutMs,h);if(i.done)throw new x(`Empty LLM response`,`api`);let o=p,f=At(r,i,{requestId:t,model:l,providerName:this.providerName,isFallback:this.isFallback,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs??this.chunkIdleTimeoutMs,streamController:m,logger:this.logger,signal:e.signal,onStreamSuccess:t=>{a.recordSuccess(n,e.signal,d),o?.(this.usageReporter.actualTokensFor(t))},onStreamFailure:(t,r)=>{t.type===`timeout`&&a.recordFailure(n,e.signal,d),r&&t.type!==`aborted`&&this.usageReporter.reportFailure(r,t,n,!0),o?.(this.usageReporter.actualTokensFor(r))},finalize:(r,i,o)=>wt(r,i,e,u,o,t,n,d,{gateway:a,usageReporter:this.usageReporter,logger:this.logger,redactText:e=>this.redactText(e),parseJson:this.parseJson})});return p=void 0,f}finally{p?.()}}countsTowardBreaker(e){return e.retryable}};function Rt(e,t,n){let r=[e,...t];return r.map((e,t)=>{let r=t>0,i=e.name??(r?`fallback[${t-1}]`:n.providerName),a=lt(e.circuitBreaker,i,e.model,n.onEvent,n.logger,n.middleware,n.middlewareTimeoutMs,r,e.client.supportsJsonObjectMode??!0);return new Lt(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,limiter:e.rateLimit?new ot(e.rateLimit):void 0,isFallback:r,middleware:n.middleware,middlewareTimeoutMs:n.middlewareTimeoutMs})})}function zt(e){return{debug:H(e,`debug`),warn:H(e,`warn`),error:H(e,`error`)}}function H(e,t){let n=e[t].bind(e);return(...e)=>{try{Vt(n(...e))}catch{}}}function Bt(e){return typeof e?.then==`function`}function Vt(e){Bt(e)&&Promise.resolve(e).catch(()=>{})}var U=class{constructor(e){this.debugEnabled=e}debug(e){this.debugEnabled&&console.debug(e)}warn(e){console.warn(e)}error(e,t){console.error(e,t??``)}},Ht=class{logger;executors;fallbackOn;reportEvent;cacheOrchestrator;middleware;middlewareTimeoutMs;cachedCallInnerParams=new WeakMap;cachedCallMeta=new Map;constructor(e){this.logger=zt(e.logger??new U(e.debug??!1));let t=e.name??`primary`;this.cacheOrchestrator=new ye(e.cache??new C,this.logger),this.fallbackOn=e.fallbackOn??oe,this.reportEvent=z(e.onEvent,this.logger),this.middleware=[...e.middleware??[]].sort((e,t)=>(e.priority??0)-(t.priority??0)),this.middlewareTimeoutMs=e.middlewareTimeoutMs??Ve;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},o=Array.isArray(e.fallback)?e.fallback:e.fallback?[e.fallback]:[];this.executors=Rt(a,o,{providerName:t,primaryDefaultTemperature:n,primaryDefaultReasoningEffort:r,primaryDefaultBudgetTokens:i,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,baseDelayMs:e.baseDelayMs,defaultMaxTokens:e.defaultMaxTokens,nonRetryableStatus:e.nonRetryableStatus,parseJson:e.parseJson,redact:e.redact,onUsage:e.onUsage,onUsageFailure:e.onUsageFailure,onEvent:e.onEvent,logger:this.logger,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs})}logRefundError(e,t){this.logger.error(e,{message:t instanceof Error?t.message:`unknown`})}get logicalCallDependencies(){return{executors:this.executors,fallbackOn:this.fallbackOn,reportEvent:this.reportEvent,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger}}get runOperationDependencies(){return{middleware:this.middleware,primaryExecutor:this.executors[0],middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent}}async call(e){if(e.signal?.aborted)throw new x(`LLM request aborted`,`aborted`);let t=e.requestId??(0,c.randomUUID)(),n=this.cachedCallInnerParams.get(e),r=n!==void 0,{signal:i,timer:a}=nt(e.deadlineMs,e.signal),o=i===e.signal?e:{...e,signal:i},s=n??T();try{let e=this.executors.length===1,n=await F(this.runOperationDependencies,o,t,s,async()=>{if(e){if(o.signal?.aborted)throw new x(`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};if(o.stream){let i=await me(o,()=>r(et(this.logicalCallDependencies,o,t,e,s)),o.signal,(e,t)=>this.logRefundError(e,t));return{value:i,meta:n}}let i=await E(o,!1,()=>r($e(this.logicalCallDependencies,o,t,e,s)),o.signal,(e,t)=>this.logRefundError(e,t));return{value:i,meta:n}},r);return o.stream,n.value}catch(e){throw rt(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 x("`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??(0,c.randomUUID)(),a=T(),o=await this.cacheOrchestrator.resolveCacheKey(n.cacheKey),s=this.cachedCallMeta.get(o),l=!1;s||(s={},l=!0,this.cachedCallMeta.set(o,s));let u=()=>{l&&this.cachedCallMeta.delete(o)},d=r.meta,f=e=>{let t={...e,meta:s};return this.cachedCallInnerParams.set(t,a),this.call(t).finally(()=>{d&&(d.current=s.current),this.cachedCallInnerParams.delete(t)})};if(r.stream){let e={...r,requestId:i},t;try{t=await F(this.runOperationDependencies,e,i,a,async()=>{let t=await this.cacheOrchestrator.runCachedStream({...n,openStream:()=>f(e)},!!r.tools);return{value:t,meta:s.current}})}catch(e){throw u(),e}let o=t.value,c=()=>{d&&(d.current=s.current),u()};return o.finalResult.then(c,c),o}let p={...r,requestId:i};try{let e=await F(this.runOperationDependencies,p,i,a,async()=>{let e=await this.runCached({...n,fn:()=>f(p)});return{value:e,meta:s.current}});return d&&(d.current=s.current),e.value}finally{u()}}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)}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:(0,c.randomUUID)(),state:T()})}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:(0,c.randomUUID)(),state:T()})}};function Ut(e){return e}function Wt(e){return e}async function*Gt(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 x(`Invalid UTF-8 in SSE stream`,`parse`,{cause:e})}n=(n+e).replace(/\r\n/g,`
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("crypto");const t=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),n=new Set([`rate_limit_queue_full`,`rate_limit_queue_timeout`,`rate_limit_capacity_exceeded`,`retry_budget_exhausted`]),r=new Set([`middleware_timeout`]),i=new Set([`parse`,`validation`,`invalid_params`,`aborted`]);function a(e,a){return!(i.has(e)||a&&t.has(a)||a&&n.has(a)||a&&r.has(a))}const o=new Set([`quota_exceeded`]);function s(e,t){return!(!a(e,t)||o.has(e))}function c(e){if(e!==void 0)try{return JSON.stringify(e),e}catch{return`[Unserializable: issues contained a circular reference]`}}function l(e){if(e!==void 0)try{return JSON.parse(JSON.stringify(e))}catch{return`[Unserializable: request body contained a circular reference]`}}const u=new Set([`authorization`,`x-api-key`,`x-goog-api-key`,`api-key`]);function d(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))u.has(n.toLowerCase())||(t[n]=r);return t}function f(e,t=0){if(e!==void 0)return t>=20?[]:e.map(e=>({...e,error:{...e.error,issues:c(e.error.issues),attempts:f(e.error.attempts,t+1)},request:e.request&&{...e.request,body:l(e.request.body),headers:d(e.request.headers)}}))}function p(e,t,n,r,i=Date.now()){return{provider:e,model:t,body:l(n),headers:d(r),startedAt:i}}var m=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 a(this.type,this.code)}get countsTowardBreaker(){return s(this.type,this.code)}toSnapshot(){return{message:this.message,type:this.type,status:this.status,issues:c(this.issues),retryAfterMs:this.retryAfterMs,code:this.code,retryable:this.retryable,attempts:f(this.attempts)}}toJSON(){return{name:this.name,message:this.message,type:this.type,status:this.status,issues:c(this.issues),retryAfterMs:this.retryAfterMs,code:this.code,retryable:this.retryable,attempts:f(this.attempts)}}};function h(e){return e instanceof m}function g(e,t){return e.code===t&&e.issues!==void 0}const _={onAccess(){},onInsert(){},getEvictee:e=>e.keys().next().value};function v(e,t){if(!e.has(t))return;let n=e.get(t);e.delete(t),e.set(t,n)}const y={onAccess:v,onInsert:v,getEvictee:e=>e.keys().next().value};function b(e){return e===`lru`?y:_}var x=class{maxSize;store=new Map;eviction;constructor(e=1e3,t=`fifo`){this.maxSize=e,this.eviction=b(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)}}},S=class{inner;constructor(e=new x){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))}},C=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 ee(e){return e}function te(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`tool_calls`&&Array.isArray(e.toolCalls)}const ne=new Set([`unknown_tool`,`duplicate_tool_call_id`,`tool_choice_none_violated`,`unexpected_tool_calls`]),re=e=>e.type===`parse`||e.type===`validation`||e.type===`aborted`||e.type===`quota_exceeded`||e.code&&ne.has(e.code)?`stop`:`next`;var w=class extends m{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 ie(e){return e instanceof w}function ae(){return{}}function oe(e){return{debugName:e}}function T(){let e=new Map;return{get(t){return e.get(t)},set(t,n){e.set(t,n)}}}function se(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 ce(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 le(e,t,n){if(!e.reserveUsage)return!1;try{return await e.reserveUsage({coalesced:t,signal:n}),!0}catch(e){throw n?.aborted?new m(`LLM request aborted`,`aborted`):new m(e instanceof Error?e.message:`Usage reservation failed`,`quota_exceeded`,{cause:e})}}function ue(e,t,n,r){return async i=>{try{await e.refundUsage?.({coalesced:t,signal:n})}catch(e){r(i,e)}}}async function E(e,t,n,r,i){if(r?.aborted)throw new m(`LLM request aborted`,`aborted`);let a=await le(e,t,r),o=ue(e,t,r,i);if(r?.aborted)throw a&&await o(`[VernLLM] refundUsage failed after abort`),new m(`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 m(`LLM request aborted`,`aborted`);return s}async function de(e,t,n,r){if(n?.aborted)throw new m(`LLM request aborted`,`aborted`);let i=await le(e,!1,n),a=ue(e,!1,n,r);if(n?.aborted)throw i&&await a(`[VernLLM] refundUsage failed after abort`),new m(`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 fe(){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 pe(e){return typeof e==`string`?e:JSON.stringify(e)??``}function me(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:pe(t.content)})}else n.push({type:`text-delta`,delta:pe(e)});return{async*[Symbol.asyncIterator](){for(let e of n)yield e}}}function he(e,t){return{async*[Symbol.asyncIterator](){yield*me(await e,t)}}}var ge=class{cache;logger;inFlight=fe();constructor(e,t){this.cache=e,this.logger=t}async resolveCacheKey(e){return this.cache.resolveKey?await this.cache.resolveKey(e):e}async deleteCache(e){if(this.cache.delete)try{await this.cache.delete(await this.resolveCacheKey(e))}catch(e){this.logger.warn(`[VernLLM] cache delete failed: ${e instanceof Error?e.message:`unknown`}`)}}logRefundError(e,t){this.logger.error(e,{message:t instanceof Error?t.message:`unknown`})}async getCached(e){try{return await this.cache.get(e)}catch(e){return this.logger.warn(`[VernLLM] cache read failed: ${e instanceof Error?e.message:`unknown`}`),{hit:!1}}}async resolveKeyAndReadCache(e){let t=await this.resolveCacheKey(e.cacheKey);return{resolvedParams:t===e.cacheKey?e:{...e,cacheKey:t},cached:await this.getCached(t)}}joinInFlight(e,t){return E(e,!0,()=>t,e.signal,(e,t)=>this.logRefundError(e,t))}async runCached(e){let{resolvedParams:t,cached:n}=await this.resolveKeyAndReadCache(e);if(n.hit)return n.value;let r=this.inFlight.get(t.cacheKey);return r?this.joinInFlight(t,r):this.registerTrigger(t)}registerTrigger(e){let t=E(e,!1,()=>this.runAndCache(e),e.signal,(e,t)=>this.logRefundError(e,t));return this.inFlight.track(e.cacheKey,t),t}async runAndCache(e){let t=await e.fn();try{await this.cache.set(e.cacheKey,t,e.ttl)}catch(e){this.logger.warn(`[VernLLM] cache write failed: ${e instanceof Error?e.message:`unknown`}`)}return t}async runCachedStream(e,t){let{resolvedParams:n,cached:r}=await this.resolveKeyAndReadCache(e);if(r.hit){let e=r.value;return{chunks:me(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:he(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=de(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 _e=1e4;function ve(e){return!e||e<=0||e===1/0?void 0:e}function ye(e){return Math.min(e,2147483647)}async function be(e,t,n){let r=new AbortController,i=ve(t),a=i===void 0?void 0:setTimeout(()=>{r.abort()},ye(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 m(`Request timed out`,`timeout`,{code:`request_timeout`}):e}finally{clearTimeout(a)}}function xe(e,t,n,r){let i=ve(t);if(i===void 0)return e();let a=!1;return new Promise((t,o)=>{let s=setTimeout(()=>{a=!0,n?.(),o(new m(`No stream chunk received for ${i}ms (idle timeout)`,`timeout`,{code:`idle_timeout`}))},ye(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 Se=[{name:`Retry-After-Ms`,kind:`ms`},{name:`X-Retry-After-Ms`,kind:`ms`},{name:`Retry-After`,kind:`seconds`},{name:`Retry-After`,kind:`date`}];function Ce(e,t){let n=e;if(typeof n.get==`function`)return n.get(t)??void 0;let r=Object.entries(e).find(([e])=>e.toLowerCase()===t.toLowerCase())?.[1];return typeof r==`string`?r:void 0}function D(e,t){return e<0?void 0:Math.min(e,t)}function we(e,t=_e){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 Se){let i=Ce(r,e)?.trim();if(i){if(n===`ms`&&/^\d+$/.test(i))return D(Number(i),t);if(n===`seconds`&&/^\d+(\.\d+)?$/.test(i))return D(Number(i)*1e3,t);if(n===`date`){let e=Date.parse(i);if(!Number.isNaN(e))return D(e-Date.now(),t)}}}}function Te(e){return Math.random()*e}function Ee(e,t,n=_e,r=!1,i=!1){return Te(Math.min(e*(r?2:i?1.5:1)*2**t,n))}async function De(e,t){if(t?.aborted)throw new m(`Operation aborted`,`aborted`);await new Promise((n,r)=>{let i=()=>{clearTimeout(a),r(new m(`Operation aborted`,`aborted`))},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}function Oe(e,t,n,r){if(r?.aborted||e instanceof m&&!e.retryable)return!1;let i=n(e);return!(i!==void 0&&t.includes(i))}async function ke(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=we(i),y=h(i),b=v??Ee(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 De(b,o)}async function Ae(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 je(e,t=`minCalls`){if(!Number.isInteger(e)||e<0)throw RangeError(`${t} must be a non-negative integer, got ${e}`)}function Me(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 Ne(e){if(e===void 0)return;if(typeof e==`function`)return e;let{multiplier:t,maxMs:n=1/0}=e;return(e,r)=>Te(Math.min(r*t**e,n))}var Pe=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)}},Fe=class{windowMs;minCalls;failureRatio;ratiosByKey=new Map;constructor(e,t,n){this.windowMs=e,this.minCalls=t,this.failureRatio=n,new O(e),je(t),Me(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 Ie(e){return`onFailure`in e?e:e.kind===`consecutive`?new Pe(e.threshold):new Fe(e.windowMs,e.minCalls,e.failureRatio)}function Le(){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 Re(e,t){return!t||A.get(t.state)===e.trial}function ze(e,t){let n=t??`unknown`;e.failuresByReason.set(n,(e.failuresByReason.get(n)??0)+1)}var Be=class{cooldownMs;onStateChange;isolateByModel;halfOpenProbes;halfOpenSuccessRatio;cooldownBackoff;tripping;sharedBucket=Le();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=Ne(e.cooldownBackoff),this.tripping=Ie(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 m(`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 m(`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&&Re(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&&Re(r,t)){r.trial.failures+=1,ze(r,n),this.settleTrialIfComplete(r,e,t);return}r.state!==`half-open`&&(r.consecutiveFailures+=1,ze(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=Le(),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)}},Ve=class{options;ratio;constructor(e){this.options=e,this.ratio=new O(e.windowMs),je(e.minCalls),Me(e.retryRatio,`retryRatio`)}assertAvailable(){if(this.ratio.getCount()>=this.options.minCalls&&this.ratio.getRatio()>=this.options.retryRatio)throw new m(`Retry budget exhausted`,`rate_limited`,{code:`retry_budget_exhausted`})}recordAttempt(e){this.ratio.record(e)}getSnapshot(){return{attempts:this.ratio.getCount(),retryRatio:this.ratio.getRatio()}}};function j(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.status==`number`)return t.status;if(typeof t.statusCode==`number`)return t.statusCode;if(typeof t.$metadata?.httpStatusCode==`number`)return t.$metadata.httpStatusCode}const He=new Set([`ECONNREFUSED`,`ENOTFOUND`,`ECONNRESET`,`ETIMEDOUT`,`EAI_AGAIN`,`EPIPE`,`ECONNABORTED`,`EHOSTUNREACH`,`ENETUNREACH`]),Ue=new Set([`fetch failed`,`failed to fetch`,`load failed`,`networkerror when attempting to fetch resource.`]);function We(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.code==`string`&&He.has(t.code)||typeof t.message==`string`&&Ue.has(t.message.toLowerCase()))return!0;if(t.cause&&typeof t.cause==`object`){let e=t.cause;if(typeof e.code==`string`&&He.has(e.code))return!0}return!1}function Ge(e){try{return JSON.stringify(e,null,2)??String(e)}catch{try{return String(e)}catch{return`[unprintable error]`}}}function Ke(e){if(e&&typeof e==`object`)try{let t=e;if(t.error!==void 0)return Ge(t.error);if(typeof t.message==`string`)return t.message}catch{}return Ge(e)}function qe(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 Je=/\(no body\)/i;function Ye(e){return Object.keys(e).length===0}function Xe(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`&&Ye(t);if(!e&&!n)return!1}if(typeof n==`string`){let e=n.trim();return e.length===0||Je.test(e)}return!0}return!0}function M(e,t,n){if(t?.aborted)return new m(`LLM request aborted`,`aborted`,{attempts:n});if(e instanceof m)return e.code===void 0&&e.status!==void 0&&(e.code=qe(e.status)),e.attempts===void 0&&n!==void 0&&(e.attempts=n),e;let r=j(e),i=we(e);if(r!==void 0){let t=Ke(e),a=qe(r),o=a===void 0;return new m(Xe(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 We(e)?new m(`LLM request failed`,`network`,{cause:e,retryAfterMs:i,code:`connection_failed`,attempts:n}):new m(`LLM request failed`,`unknown`,{cause:e,retryAfterMs:i,attempts:n})}function N(e,t){return e.name??`[${t}]`}function Ze(e,t,n){return t<=0?e():new Promise((r,i)=>{let a=setTimeout(()=>{i(new m(`middleware "${n}" timed out after ${t}ms`,`timeout`,{code:`middleware_timeout`}))},t);e().then(e=>{clearTimeout(a),r(e)},e=>{clearTimeout(a),i(e)})})}async function P(e,t,n,r,i){let{enabled:a}=e;if(a===void 0)return!0;if(typeof a==`boolean`)return a;let o=e.timeoutMs??r;try{return await Ze(async()=>a(t),o,n)}catch(e){return i.error(`[VernLLM] middleware "${n}".enabled threw or timed out, treating as disabled`,{message:e instanceof Error?e.message:`unknown`}),!1}}const Qe=[`temperature`,`max_tokens`,`reasoning_effort`,`budget_tokens`,`tool_choice`,`messages`,`addMessages`,`tools`,`addTools`];function $e(e,t){let n=t,r=Qe.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 et(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 m(`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 tt(e,t,n){if(t.model!==e.model)throw new m(`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 m(`middleware "${n}" changed \`response_format\` via transform, which isn't supported.`,`invalid_params`)}async function nt(e){let{request:t,requestId:n,attempt:r,signal:i,state:a,middleware:o,middlewareTimeoutMs:s,logger:c,reportEvent:l,buildContext:u}=e;if(o.length===0)return t;let d=t,f=t,p=o.map((e,t)=>({middlewareEntry:e,index:t})).sort((e,t)=>(e.middlewareEntry.priority??0)-(t.middlewareEntry.priority??0));for(let{middlewareEntry:e,index:t}of p){let d=N(e,t),p=u(r,i,a);if(!await P(e,p,d,s,c)){e.enabled!==void 0&&F({kind:`middleware`,requestId:n,middleware:d,hook:`enabled_skip`},p,l,o,s,c);continue}if(!e.transform)continue;let m=await rt(e,structuredClone(f),p,d,s),{request:h,patchedFields:g}=$e(f,m);g.length>0&&((m.tools!==void 0||m.addTools?.length)&&et(h,d),F({kind:`middleware`,requestId:n,middleware:d,hook:`transform`,patchedFields:g},p,l,o,s,c)),f=h}return tt(d,f,`chain`),f}async function rt(e,t,n,r,i){if(!e.transform)return{};let a=e.timeoutMs??i;try{return await Ze(async()=>e.transform(t,n),a,r)}catch(e){throw it(e,r,n.signal)}}function it(e,t,n){let r=M(e,n);return r.type===`unknown`?new m(`middleware "${t}" threw: ${r.message}`,`invalid_params`,{code:`middleware_threw`,cause:e}):r}function F(e,t,n,r,i,a){n(e),r.length!==0&&at(r,e,t,i,a)}async function at(e,t,n,r,i){for(let a=0;a<e.length;a++){let o=e[a];if(!o.onEvent)continue;let s=N(o,a);if(await P(o,n,s,r,i))try{Promise.resolve(o.onEvent(t,{...n,own:{}})).catch(e=>{i.error(`[VernLLM] middleware "${s}".onEvent failed`,{message:e instanceof Error?e.message:`unknown`})})}catch(e){i.error(`[VernLLM] middleware "${s}".onEvent failed`,{message:e instanceof Error?e.message:`unknown`})}}}function I(e,t){return n=>{if(e)try{e(n)}catch(e){t.error(`[VernLLM] onEvent failed`,{message:e instanceof Error?e.message:`unknown`})}}}function L(e,t,n){let r=e[t];if(!r)throw RangeError(`${n}: no target at index ${t} (chain has ${e.length} target${e.length===1?``:`s`})`);return r}function R(e,t,n,r){t!==void 0&&!e&&r.warn(`[VernLLM] ${n}: \`model: '${t}'\` has no effect here. This target's circuitBreaker doesn't have isolateByModel on, so it only tracks one shared circuit regardless of \`model\`. Omit \`model\`, or set \`circuitBreaker.isolateByModel: true\` on this target if per-model tracking is what you want.`)}function ot(e,t,n,r,i,a,o,s,c){if(!e)return;let l=typeof e==`object`?e:void 0,u=l?.onStateChange,d=I(r,i);return new Be({...l,onStateChange:(e,r,l,f,p)=>{let m={kind:`circuit_state`,provider:t,model:f??n,from:e,to:r,consecutiveFailures:l};if(p?F(m,{stage:`attempt`,requestId:p.requestId,requestedProvider:t,requestedModel:f??n,isFallbackAttempt:s,attempt:p.attempt??1,capabilities:{supportsJsonObjectMode:c},signal:p.signal,state:p.state,own:{}},d,a,o,i):d(m),u)try{u(e,r,l,f,p)}catch(e){i.error(`[VernLLM] circuitBreaker.onStateChange failed`,{message:e instanceof Error?e.message:`unknown`})}}})}function st(e){let t=/^(?:(\d+(?:\.\d+)?)h)?(?:(\d+(?:\.\d+)?)m)?(?:(\d+(?:\.\d+)?)s)?(?:(\d+)ms)?$/.exec(e.trim());if(!t||t[0]===``)return;let[,n,r,i,a]=t,o=(n?parseFloat(n)*36e5:0)+(r?parseFloat(r)*6e4:0)+(i?parseFloat(i)*1e3:0)+(a?parseInt(a,10):0);return Number.isFinite(o)?o:void 0}function z(e,t){let n=e.get(t);if(n===null)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function B(e){let t=e.get(`x-ratelimit-reset-requests`);return{limitRequests:z(e,`x-ratelimit-limit-requests`),remainingRequests:z(e,`x-ratelimit-remaining-requests`),resetAfterMs:t===null?void 0:st(t)}}function ct(e){let t=e.get(`anthropic-ratelimit-requests-reset`),n=t===null?NaN:Date.parse(t);return{limitRequests:z(e,`anthropic-ratelimit-requests-limit`),remainingRequests:z(e,`anthropic-ratelimit-requests-remaining`),resetAfterMs:Number.isFinite(n)?Math.max(0,n-Date.now()):void 0}}const lt=Symbol(`vernLLMProviderRateLimitHint`);function ut(e,t){t&&Object.defineProperty(e,lt,{value:t,enumerable:!1,configurable:!0})}function dt(e){if(!(!e||typeof e!=`object`))return e[lt]}function ft(e){let{breaker:t,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o}=e;function s(e,t,s){return{stage:`attempt`,requestId:n,requestedProvider:i,requestedModel:r,isFallbackAttempt:a,attempt:e+1,capabilities:{supportsJsonObjectMode:o},signal:t,state:s,own:{}}}function c(e,t,r){return{requestId:n,state:r,signal:t,attempt:e+1}}return{buildAttemptContext:s,buildCallContext:c,recordSuccess(e,n,i){t?.recordSuccess(r,c(e,n,i))},recordFailure(e,n,i,a){t?.recordFailure(r,c(e,n,i),a)}}}function pt(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function mt(e){return e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments??{})}}))}function ht(e){return e.map(e=>{let t;try{t=e.function.arguments.trim()?JSON.parse(e.function.arguments):{}}catch{throw new m(`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 gt(e){return typeof e==`string`?e:JSON.stringify(e)}function _t(e,t){if(e&&e.length===0)throw new m("`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 m(`\`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 m("`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 m(`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 vt(e){let{jsonModeExplicit:t,hasTools:n,jsonSchema:r,hasSchema:i,supportsJsonObjectMode:a}=e,o=t??!n;if(!a&&!r&&t===!0)throw new m('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 m('`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 m(`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 yt(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 bt(e){return!e||e===`auto`?`auto`:e===`none`||e===`required`?e:{type:`function`,function:{name:e.name}}}function xt(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:gt(e.content)},tool_calls:mt(e.toolCalls)}]:e.role===`assistant`?[{role:`assistant`,content:gt(e.content===void 0?``:e.content)}]:[{role:e.role,content:e.content??``}]}function St(e){let t;for(let[n,r]of e.entries()){if(r.role===`tool`){if(t?.role!==`assistant`||!t.toolCalls?.length)throw new m(`history[${n}] is a "tool" turn, but must immediately follow an "assistant" turn that requested tools`,`invalid_params`);if(!r.toolResults?.length)throw new m(`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 m(`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 m(`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 m(`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 m(`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 m(`history[${n}] follows an assistant tool request without tool results`,`invalid_params`)}t=r}if(t?.role===`assistant`&&t.toolCalls?.length)throw new m(`The last entry in history is an assistant tool request without tool results`,`invalid_params`);if(t?.role===`user`)throw new m(`The last entry in history is a "user" turn, which would collide with the current userContent turn.`,`invalid_params`)}var Ct=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;_t(s,c);let f=vt({jsonModeExplicit:e.jsonMode,hasTools:!!s,jsonSchema:o,hasSchema:!!e.schema,supportsJsonObjectMode:this.supportsJsonObjectMode}),p=yt(o,f);return St(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:pt(s)}:{},...s?{tool_choice:bt(c)}:{},messages:[...t?[{role:`system`,content:t}]:[],...r.flatMap(e=>xt(e)),{role:`user`,content:n}]}}}};function wt(e,t,n){let r;try{r=n(e)}catch{throw new m(`Invalid JSON response`,`parse`)}if(r==null)throw new m(`Invalid JSON response`,`parse`);if(!t)return r;let i=t.safeParse(r);if(!i.success)throw new m(`Schema validation failed`,`validation`,{issues:i.error});return i.data}function Tt(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 m(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 m(`Arguments for tool call "${t.name}" failed validation`,`validation`,{issues:r.error})}}function Et(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 m(`Empty LLM response`,`api`,{code:`empty_response`});if(s.debug(`[VernLLM:${o}] output:\n`+c(l??`[${n?.length??0} tool call(s)]`).slice(0,800)),n?.length){if(!r.tools)throw new m("Provider returned tool_calls but no `tools` were sent with this call.",`validation`,{code:`unexpected_tool_calls`});if(r.toolChoice===`none`)throw new m(`Provider returned tool_calls despite toolChoice: 'none'.`,`validation`,{code:`tool_choice_none_violated`});let e=ht(n);return Tt(e,r.tools),{type:`tool_calls`,toolCalls:e,...l?{content:l}:{}}}let u=l??``;if(!i)return r.tools?{type:`content`,content:u}:u;let d=wt(u,r.schema,a);return r.tools?{type:`content`,content:d}:d}function Dt(e,t,n,r,i,a,o,s,c){let{gateway:l,usageReporter:u,logger:d,redactText:f,parseJson:p,detectSoftFailure:h}=c;try{let g=Et({rawContent:e,wireToolCalls:t,params:n,useJson:r,parseJson:p,requestId:a,logger:d,redactText:f}),_=Ot(h,g,{requestId:a,model:c.model,providerName:c.providerName,isFallback:c.isFallback,attempt:o+1},d);if(_!==void 0)throw new m(`Soft failure detected`,`api`,{code:_});return l.recordSuccess(o,n.signal,s),u.reportSuccess(i),g}catch(e){let t=M(e,n.signal);throw i&&t.type!==`aborted`&&u.reportFailure(i,t,o),t}}function Ot(e,t,n,r){if(e)try{return e(t,n)}catch(e){r.warn(`detectSoftFailure threw and was ignored, treated as no soft failure: ${e instanceof Error?e.message:String(e)}`);return}}function 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 At=1e4,jt=1e6;function Mt(){let e=new Map;function t(t){let n=e.get(t.index);if(!n){if(e.size>=At)throw new m(`Stream contained more than ${At} distinct tool calls`,`validation`);n={args:``}}let r=t.argumentsDelta??``;if(n.args.length+r.length>jt)throw new m(`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 Nt(e,t){try{await e.return?.()}catch{}t.abort()}function Pt(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=Mt(),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=ce(t.usage,{requestId:r,model:i,providerName:a,isFallback:o}),g({type:`usage`,usage:S}))),n=await xe(()=>e.next(),s,()=>c.abort(),l)}}catch(t){await Nt(e,c);let r=M(t,u);try{n.onStreamFailure(r,S)}catch{}v(r),p(r);return}_();try{n.onStreamSuccess(S)}catch{}try{let e=b.toWireToolCalls(),t=n.finalize(x,e,S);f(t)}catch(e){p(e)}})(),{chunks:y,finalResult:m}}function Ft(e){let{providerName:t,isFallback:n,maxRetries:r,onUsage:i,onUsageFailure:a,logger:o}=e;function s(e,r,i){if(e.usage)return ce(e.usage,{requestId:r,model:i,providerName:t,isFallback:n})}function c(e){if(e)return e.totalTokens||e.promptTokens+e.completionTokens}function l(e){if(!(!e||!i))try{i(e)}catch(e){o.error(`[VernLLM] onUsage failed`,{message:e instanceof Error?e.message:`unknown`})}}function u(e,t,n,i=!1){let s=e.totalTokens||e.promptTokens+e.completionTokens,c=i?`mid-stream failure (terminal, no further attempts)`:`attempt ${n+1}/${r+1}`;if(o.warn(`[VernLLM:${e.requestId}] usage failure, ${c}: type=${t.type} tokens=${s}`),a)try{a(e,t)}catch(e){o.error(`[VernLLM] onUsageFailure failed`,{message:e instanceof Error?e.message:`unknown`})}}return{extract:s,actualTokensFor:c,reportSuccess:l,reportFailure:u}}async function It(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 Lt(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:f,reportEvent:m}=e,h=a??T(),g=s.build(t),{useJson:_,model:v}=g,y=await nt({request:g.request,requestId:n,attempt:r,signal:t.signal,state:h,middleware:u,middlewareTimeoutMs:d,logger:f,reportEvent:m,buildContext:(e,t,n)=>o.buildAttemptContext(e,t,n)});i?.(p(c,v,y,void 0,Date.now()));let{release:b}=await It(l,y,t.signal,(e,i)=>{F({kind:`rate_limited`,requestId:n,provider:c,model:v,waitedMs:e,reason:i},o.buildAttemptContext(r,t.signal,h),m,u,d,f)});return{request:y,model:v,useJson:_,state:h,release:b}}async function Rt(e){let{fn:t,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o,breaker:s,budget:c,maxRetries:l,baseDelayMs:u,nonRetryableStatus:d,signal:f,onAttempt:p,middleware:m,middlewareTimeoutMs:h,logger:g,reportEvent:_,logLabel:v,redactText:y,countsTowardBreaker:b}=e,x=e.state??T(),S=[],C=ft({breaker:s,requestId:n,model:r,providerName:i,isFallback:a,supportsJsonObjectMode:o}),ee;try{return await Ae({fn:(e,n)=>(c?.recordAttempt(e>0),t(e,n,x,C)),maxRetries:l,signal:f,onAttempt:p,attempts:S,shouldRetryAttempt:(e,t)=>{if(!Oe(e,d,j,t))return!1;if(c)try{c.assertAvailable()}catch(e){return ee=e,!1}return!0},recoverDelayForAttempt:(e,t)=>ke({requestId:n,model:r,attempt:e,error:t,state:x,signal:f,providerName:i,maxRetries:l,baseDelayMs:u,middleware:m,middlewareTimeoutMs:h,logger:g,reportEvent:_,buildEventContext:(e,t,n,r,i)=>C.buildAttemptContext(n,r,i),extractStatus:j,normalizeError:M,emitEvent:F}),normalizeError:M})}catch(e){let t=M(ee??e,f,S.length>0?S:void 0);throw b(t)&&C.recordFailure(S.length,f,x,t.code),g.debug(`[VernLLM:${n}] ${v}:\n${y(Ke(e))}`),t}}function zt(e){try{return JSON.parse(e)}catch{return}}var Bt=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??zt,this.logger=r.logger,this.redact=r.redact,this.reportEvent=I(r.onEvent,this.logger),this.breaker=r.breaker,this.budget=r.budget,this.limiter=r.limiter,this.isFallback=r.isFallback??!1,this.middleware=r.middleware??[],this.middlewareTimeoutMs=r.middlewareTimeoutMs??5e3,this.supportsJsonObjectMode=t.supportsJsonObjectMode??!0,this.detectSoftFailure=r.detectSoftFailure,this.usageReporter=Ft({providerName:this.providerName,isFallback:this.isFallback,maxRetries:this.maxRetries,onUsage:r.onUsage,onUsageFailure:r.onUsageFailure,logger:this.logger}),this.requestBuilder=new Ct({model:n,defaultMaxTokens:r.defaultMaxTokens,defaultTemperature:r.defaultTemperature,defaultReasoningEffort:r.defaultReasoningEffort,defaultBudgetTokens:r.defaultBudgetTokens,supportsJsonObjectMode:this.supportsJsonObjectMode})}previewRequest(e){let{model:t,request:n}=this.requestBuilder.build(e);return{model:t,request:n}}get jsonObjectModeSupported(){return this.supportsJsonObjectMode}getCircuitState(e){return this.breaker?.getState(e)}getFailureBreakdown(e){return this.breaker?.getFailureBreakdown(e)}getRetryBudgetState(){return this.budget?.getSnapshot()}get isolateByModel(){return this.breaker?.isolateByModel??!1}openCircuit(e,t){this.breaker?.open(e,t)}closeCircuit(e,t){this.breaker?.close(e,t)}assertBreakerClosed(e,t){this.breaker?.assertClosed(e??this.model,t)}async run(e,t,n,r){return Rt({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 Rt({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 Lt({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 be(e=>this.client.chat.completions.create(o,{signal:e}),this.timeoutMs,e.signal)}catch(e){throw this.reactToRateLimitError(e),e}this.limiter?.reactToRateLimitHint(dt(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=Dt(f,p,e,c,i,t,n,l,{gateway:a,usageReporter:this.usageReporter,logger:this.logger,redactText:e=>this.redactText(e),parseJson:this.parseJson,detectSoftFailure:this.detectSoftFailure,providerName:this.providerName,isFallback:this.isFallback,model:s})}catch(e){throw d?.(u),d=void 0,e}return d?.(u,!0),d=void 0,m}finally{d?.()}}redactText(e){return this.redact?this.redact(e):e}reactToRateLimitError(e){this.limiter&&j(e)===429&&this.limiter.signalRateLimit()}async executeStreamCall(e,t,n,r,i,a){let o=this.client.chat.completions;if(!o.createStream)throw new m(`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 Lt({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}),p=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 be(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 m(`Empty LLM response`,`api`);let o=p,f=Pt(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=Dt(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 m&&this.countsTowardBreaker(t)&&a.recordFailure(n,e.signal,d,t.code),t}}});return p=void 0,f}finally{p?.()}}countsTowardBreaker(e){return e.countsTowardBreaker}};async function Vt(e,t,n,r,i,a=!1){let o=[];for(let s=0;s<e.executors.length;s++){let c=e.executors[s],l=Date.now(),u=0;try{return s===0&&a||c.assertBreakerClosed(t.model,{requestId:n,state:r,signal:t.signal}),{result:await i(c,()=>{u+=1}),executor:c,index:s,attemptCount:u}}catch(i){let a=M(i,t.signal);o.push({index:s-1,provider:c.providerName,model:t.model??c.model,error:a.toSnapshot()});let d=s===e.executors.length-1,f=e.fallbackOn(a,{isLastTarget:d});if((d?`stop`:f)===`stop`)throw o.length>1?new w(o):a;let p=e.executors[s+1],m=t.model??c.model,h={stage:`attempt`,requestId:n,requestedProvider:c.providerName,requestedModel:m,isFallbackAttempt:s>0,attempt:u||1,capabilities:{supportsJsonObjectMode:c.jsonObjectModeSupported},signal:t.signal,state:r,own:{}};F({kind:`fallback`,requestId:n,from:c.providerName,to:p.providerName,fromIndex:s-1,toIndex:s,error:a,elapsedMs:Date.now()-l},h,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger)}}throw new m(`No provider targets configured`,`invalid_params`)}function Ht(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 Ut(e,t,n,r,i){return Ht(await Vt(e,t,n,i,(e,r)=>e.run(t,n,r,i),r),t)}async function Wt(e,t,n,r,i){return Ht(await Vt(e,t,n,i,(e,r)=>e.runStream(t,n,r,i),r),t)}function Gt(e){let t=!1,n,r;function i(){return r||(t=!0,r=e().then(e=>(n=e,e)),r.catch(()=>{}),r)}return{call:i,wasCalled:()=>t,resolvedValue:()=>n}}async function V(e,t,n,r,i,a=!1){if(e.middleware.length===0||a)return i();let o=e.primaryExecutor,{model:s,request:c}=o.previewRequest(t),l=i;for(let i=e.middleware.length-1;i>=0;i--){let a=e.middleware[i],u=N(a,i),d=l;l=async()=>{let i={stage:`pre-dispatch`,requestId:n,primaryProvider:o.providerName,primaryModel:s,capabilities:{supportsJsonObjectMode:o.jsonObjectModeSupported},signal:t.signal,state:r,own:{}};if(!await P(a,i,u,e.middlewareTimeoutMs,e.logger))return a.enabled!==void 0&&F({kind:`middleware`,requestId:n,middleware:u,hook:`enabled_skip`},i,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger),d();if(!a.wrap)return d();let l=Gt(d);try{let t=await a.wrap(c,l.call,i);return l.wasCalled()||F({kind:`middleware`,requestId:n,middleware:u,hook:`wrap_short_circuit`},i,e.reportEvent,e.middleware,e.middlewareTimeoutMs,e.logger),t}catch(t){let n=l.resolvedValue();if(n!==void 0)return e.logger.error(`[VernLLM] middleware "${u}".wrap threw after next() resolved; keeping the original result`,{message:t instanceof Error?t.message:`unknown`}),n;throw it(t,u,i.signal)}}}return l()}const H=Symbol(`deadlineExceeded`);function Kt(e,t){if(e===void 0)return{signal:t,timer:void 0};let n=new AbortController;if(e<=0)return n.abort(H),{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:void 0};let r=setTimeout(()=>n.abort(H),e);return{signal:t?AbortSignal.any([t,n.signal]):n.signal,timer:r}}function qt(e,t){return e instanceof m&&e.type===`aborted`&&e.code===void 0&&t?.reason===H&&(e.code=`deadline_exceeded`),e}var Jt=class{capacity;refillPerMs;available;lastRefill=Date.now();constructor(e,t){this.capacity=e,this.refillPerMs=t,this.available=e}refill(){if(this.refillPerMs===0)return;let e=Date.now(),t=e-this.lastRefill;this.available=Math.min(this.capacity,this.available+Math.max(0,t)*this.refillPerMs),this.lastRefill=e}tryTake(e){return this.refill(),this.available<e?!1:(this.available-=e,!0)}msUntilAvailable(e){return this.refill(),this.available>=e?0:this.refillPerMs===0?1/0:(e-this.available)/this.refillPerMs}give(e){this.available=Math.min(this.capacity,this.available+e)}getCapacity(){return this.capacity}resize(e){this.refill(),this.refillPerMs>0&&(this.refillPerMs=this.refillPerMs/this.capacity*e),this.capacity=e,this.available=Math.min(this.available,e)}};function Yt(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 Xt(e){if(!e)return;let t=t=>{if(!Number.isFinite(e[t]))throw new m(`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 m(`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 m(`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 Zt(e,t){return e===`tpm`?t:1}function Qt(e){if(e)return new Jt(e,e/6e4)}var $t=class{requests;tokens;concurrency;buckets;maxQueueMs;maxQueueSize;estimateTokensFn;aimd;queue=[];wakeTimer;constructor(e){this.requests=Qt(e.requestsPerMinute),this.tokens=Qt(e.tokensPerMinute),e.maxConcurrent&&(this.concurrency=new Jt(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??Yt,this.aimd=this.requests?Xt(e.aimd):void 0}estimate(e){return this.estimateTokensFn(e)}async acquire(e,t){if(t?.aborted)throw new m(`LLM request aborted`,`aborted`);if(!Number.isFinite(e)||e<0)throw new m(`estimatedTokens must be a finite, non-negative number, got ${String(e)}`,`invalid_params`);if(this.tokens&&e>this.tokens.getCapacity())throw new m(`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 m(`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 m(`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 m(`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=Zt(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(Zt(e,t));if(n===void 0||!Number.isFinite(n))return;let r=Math.min(Math.max(1,Math.ceil(n)),2147483647);this.wakeTimer=setTimeout(()=>{this.wakeTimer=void 0,this.drain()},r)}makeRelease(e){let t=!1;return(n,r=!1)=>{t||(t=!0,this.concurrency?.give(1),this.tokens&&n!==void 0&&Number.isFinite(n)&&this.tokens.give(e-n),r&&this.growOnSuccess(),this.drain())}}resizeRequestsCeiling(e){!this.aimd||!this.requests||this.requests.resize(e(this.aimd,this.requests.getCapacity()))}growOnSuccess(){this.resizeRequestsCeiling((e,t)=>Math.min(t+e.increaseBy,e.maxCapacity))}signalRateLimit(){this.resizeRequestsCeiling((e,t)=>Math.max(t*e.decreaseFactor,e.minCapacity))}reactToRateLimitHint(e){if(!this.aimd||!e||e.remainingRequests===void 0)return;let t=this.aimd.proactiveFloor??0;t>0&&e.remainingRequests<=t&&this.signalRateLimit()}};const U=[`estimate`,`acquire`,`signalRateLimit`,`reactToRateLimitHint`];function en(e){let t=e;return U.every(e=>typeof t[e]==`function`)}function tn(e){let t=e;return U.some(e=>typeof t[e]==`function`)}function nn(e){if(e!==void 0){if(en(e))return e;if(tn(e))throw new m(`rateLimit looks like a RateLimiterAdapter but is missing: ${U.filter(t=>typeof e[t]!=`function`).join(`, `)}. All four methods (${U.join(`, `)}) are required.`,`invalid_params`);return new $t(e)}}function rn(e,t,n){return[e,...t].map((e,t)=>{let r=t>0,i=e.name??(r?`fallback[${t-1}]`:n.providerName),a=ot(e.circuitBreaker,i,e.model,n.onEvent,n.logger,n.middleware,n.middlewareTimeoutMs,r,e.client.supportsJsonObjectMode??!0),o=e.retryBudget?new Ve(e.retryBudget):void 0;return new Bt(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:nn(e.rateLimit),isFallback:r,middleware:n.middleware,middlewareTimeoutMs:n.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure??n.detectSoftFailure})})}function an(e){let t=e;return typeof t.get==`function`&&typeof t.set==`function`}function on(e){if(e===void 0)return new x;if(an(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 x(e.maxSize,e.eviction)}function sn(e){return{debug:W(e,`debug`),warn:W(e,`warn`),error:W(e,`error`)}}function W(e,t){let n=e[t].bind(e);return((...e)=>{try{ln(n(...e))}catch{}})}function cn(e){return typeof e?.then==`function`}function ln(e){cn(e)&&Promise.resolve(e).catch(()=>{})}var un=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??``)}},dn=class{logger;executors;fallbackOn;reportEvent;cacheOrchestrator;middleware;middlewareTimeoutMs;cachedCallInnerParams=new WeakMap;cachedCallMeta=new Map;constructor(e){this.logger=sn(e.logger??new un(e.debug??!1));let t=e.name??`primary`;this.cacheOrchestrator=new ge(on(e.cache),this.logger),this.fallbackOn=e.fallbackOn??re,this.reportEvent=I(e.onEvent,this.logger),this.middleware=[...e.middleware??[]].sort((e,t)=>(e.priority??0)-(t.priority??0)),this.middlewareTimeoutMs=e.middlewareTimeoutMs??5e3;let n=e.defaultTemperature===void 0?.2:e.defaultTemperature,r=e.defaultReasoningEffort,i=e.defaultBudgetTokens,a={client:e.client,model:e.model,name:t,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,baseDelayMs:e.baseDelayMs,defaultMaxTokens:e.defaultMaxTokens,defaultTemperature:n,defaultReasoningEffort:r,defaultBudgetTokens:i,nonRetryableStatus:e.nonRetryableStatus,circuitBreaker:e.circuitBreaker,rateLimit:e.rateLimit,retryBudget:e.retryBudget,detectSoftFailure:e.detectSoftFailure},o=Array.isArray(e.fallback)?e.fallback:e.fallback?[e.fallback]:[];this.executors=rn(a,o,{providerName:t,primaryDefaultTemperature:n,primaryDefaultReasoningEffort:r,primaryDefaultBudgetTokens:i,maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,chunkIdleTimeoutMs:e.chunkIdleTimeoutMs,baseDelayMs:e.baseDelayMs,defaultMaxTokens:e.defaultMaxTokens,nonRetryableStatus:e.nonRetryableStatus,parseJson:e.parseJson,redact:e.redact,onUsage:e.onUsage,onUsageFailure:e.onUsageFailure,onEvent:e.onEvent,logger:this.logger,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,detectSoftFailure:e.detectSoftFailure})}logRefundError(e,t){this.logger.error(e,{message:t instanceof Error?t.message:`unknown`})}get logicalCallDependencies(){return{executors:this.executors,fallbackOn:this.fallbackOn,reportEvent:this.reportEvent,middleware:this.middleware,middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger}}get runOperationDependencies(){return{middleware:this.middleware,primaryExecutor:this.executors[0],middlewareTimeoutMs:this.middlewareTimeoutMs,logger:this.logger,reportEvent:this.reportEvent}}async call(t){if(t.signal?.aborted)throw new m(`LLM request aborted`,`aborted`);let n=t.requestId??(0,e.randomUUID)(),r=this.cachedCallInnerParams.get(t),i=r!==void 0,{signal:a,timer:o}=Kt(t.deadlineMs,t.signal),s=a===t.signal?t:{...t,signal:a},c=r??T();try{let e=this.executors.length===1,t=await V(this.runOperationDependencies,s,n,c,async()=>{if(e){if(s.signal?.aborted)throw new m(`LLM request aborted`,`aborted`);this.executors[0].assertBreakerClosed(s.model,{requestId:n,state:c,signal:s.signal})}let t,r=async e=>{let n=await e;return t=n.meta,n.value};return s.stream?{value:await de(s,()=>r(Wt(this.logicalCallDependencies,s,n,e,c)),s.signal,(e,t)=>this.logRefundError(e,t)),meta:t}:{value:await E(s,!1,()=>r(Ut(this.logicalCallDependencies,s,n,e,c)),s.signal,(e,t)=>this.logRefundError(e,t)),meta:t}},i);return s.stream,t.value}catch(e){throw qt(e,a)}finally{clearTimeout(o)}}runCached(e){return this.cacheOrchestrator.runCached(e)}async deleteCache(e){await this.cacheOrchestrator.deleteCache(e)}async cachedCall(t){let{call:n,...r}=t,i=n;if(i.reserveUsage||i.refundUsage)throw new m("`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 a=i.requestId??(0,e.randomUUID)(),o=T(),s=await this.cacheOrchestrator.resolveCacheKey(r.cacheKey),c=this.cachedCallMeta.get(s),l=!1;c||(c={},l=!0,this.cachedCallMeta.set(s,c));let u=()=>{l&&this.cachedCallMeta.delete(s)},d=i.meta,f=e=>{let t={...e,meta:c};return this.cachedCallInnerParams.set(t,o),this.call(t).finally(()=>{d&&(d.current=c.current),this.cachedCallInnerParams.delete(t)})};if(i.stream){let e={...i,requestId:a},t;try{t=await V(this.runOperationDependencies,e,a,o,async()=>({value:await this.cacheOrchestrator.runCachedStream({...r,openStream:()=>f(e)},!!i.tools),meta:c.current}))}catch(e){throw u(),e}let n=t.value,s=()=>{d&&(d.current=c.current),u()};return n.finalResult.then(s,s),n}let p={...i,requestId:a};try{let e=await V(this.runOperationDependencies,p,a,o,async()=>({value:await this.runCached({...r,fn:()=>f(p)}),meta:c.current}));return d&&(d.current=c.current),e.value}finally{u()}}getCircuitState(e){let t=L(this.executors,e?.index??0,`getCircuitState`);return R(t.isolateByModel,e?.model,`getCircuitState`,this.logger),t.getCircuitState(e?.model??t.model)}getFailureBreakdown(e){let t=L(this.executors,e?.index??0,`getFailureBreakdown`);return R(t.isolateByModel,e?.model,`getFailureBreakdown`,this.logger),t.getFailureBreakdown(e?.model??t.model)}getRetryBudgetState(e){return L(this.executors,e?.index??0,`getRetryBudgetState`).getRetryBudgetState()}getCircuitStates(e){return this.executors.map((t,n)=>({provider:t.providerName,index:n,isFallback:n>0,isolateByModel:t.isolateByModel,state:t.getCircuitState(e??t.model)}))}openCircuit(t){let n=L(this.executors,t?.index??0,`openCircuit`);R(n.isolateByModel,t?.model,`openCircuit`,this.logger),n.openCircuit(t?.model??n.model,{requestId:(0,e.randomUUID)(),state:T()})}closeCircuit(t){let n=L(this.executors,t?.index??0,`closeCircuit`);R(n.isolateByModel,t?.model,`closeCircuit`,this.logger),n.closeCircuit(t?.model??n.model,{requestId:(0,e.randomUUID)(),state:T()})}};function fn(e){return e}function pn(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 m(`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=
|
|
5
|
+
`);for(;i!==-1;){let e=n.slice(0,i);n=n.slice(i+2);let t=J(e);if(t===G)return;t!==K&&(yield t),i=n.indexOf(`
|
|
6
6
|
|
|
7
|
-
`)}}try{n+=t.decode()}catch(e){throw new
|
|
7
|
+
`)}}try{n+=t.decode()}catch(e){throw new m(`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=
|
|
10
|
+
`);for(;r!==-1;){let e=n.slice(0,r);n=n.slice(r+2);let t=J(e);if(t===G)return;t!==K&&(yield t),r=n.indexOf(`
|
|
11
11
|
|
|
12
|
-
`)}let i=n.trim();if(i){let e=
|
|
13
|
-
`)){if(r.startsWith(`:`)){n=!0;continue}
|
|
14
|
-
`);if(r===`[DONE]`)return W;try{return JSON.parse(r)}catch(e){throw new x(`Invalid JSON in SSE frame: ${r.slice(0,200)}`,`parse`,{cause:e,code:`stream_frame_invalid`})}}const Kt=[`image/png`,`image/jpeg`,`image/gif`,`image/webp`];function J(e){if(Kt.includes(e))return e;throw new x(`Unsupported image mimeType "${e}": expected one of ${Kt.join(`, `)}`,`invalid_params`)}function qt(e,t){return t?Array.isArray(t)?t.includes(e):t(e):!1}const Y={minimal:1024,low:4096,medium:16e3,high:32e3};function X(e){if(!e)return Y;let t={...Y,...e};if(!(t.minimal<t.low&&t.low<t.medium&&t.medium<t.high))throw new x(`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 Z(e,t=Y){return t[e]}function Q(e,t=Y){return e<=t.minimal?`minimal`:e<=t.low?`low`:e<=t.medium?`medium`:`high`}function Jt(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 Yt(e){let t=Jt(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 Xt(e,t){return Yt(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function Zt(e,t){return!Xt(e,t)}function Qt(e,t){if(e<1024)throw new x(`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 x(`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 $t(e){if(e)throw new x(`budgetTokens/reasoningEffort was set alongside ${e}. Anthropic rejects thinking combined with a tool_choice that forces tool use, the model has to be able to reply with plain text for thinking to run. Use toolChoice: 'auto' (or omit toolChoice) for this call, or drop budgetTokens/reasoningEffort for it.`,`invalid_params`)}function en(e){return e===`minimal`?`low`:e}function tn(e,t){return rn(t,e.toUpperCase())}function nn(e){let t=/gemini-\d+\.(\d+)/.exec(e);return t?Number(t[1]):0}function rn(e,t){if(!e.includes(`pro`))return t;let n=an(e);if(n===null||n<3)return t;let r=nn(e);return r===0?t===`HIGH`?`HIGH`:`LOW`:t===`MINIMAL`?`LOW`:t}function an(e){let t=/gemini-(\d+)/.exec(e);return t?Number(t[1]):null}function on(e){let t=an(e);return t!==null&&t>=3}function sn(e,t){return on(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function cn(e){return e.map(e=>e.type===`image`?{type:`image`,source:{type:`base64`,media_type:J(e.mimeType),data:e.data}}:{type:`text`,text:e.text})}function ln(e,t){if(e.type!==`object`)throw new x(`Tool "${t}"'s schema must have "type": "object" (Anthropic requires object-shaped tool parameters).`,`validation`);return e}function un(e){return!e||e===`auto`?{type:`auto`}:e===`none`?{type:`none`}:e===`required`?{type:`any`}:{type:`tool`,name:e.function.name}}function dn(e,t){return{tools:e.map(e=>({name:e.function.name,description:e.function.description,input_schema:ln(e.function.parameters,e.function.name)})),toolChoice:un(t)}}function fn(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 x(`json_schema.name must not be empty.`,`validation`);let c=!!o&&qt(e.model,t);if(o&&e.tools?.length&&!c)throw new x(`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 x('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}=dn(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:ln(e,l),strict:n}],f={type:`tool`,name:l}}!o&&e.tools?.length&&({tools:d,toolChoice:f}=dn(e.tools,e.tool_choice));let p,m;if(e.budget_tokens!==void 0||e.reasoning_effort!==void 0)if($t(f?.type===`tool`?`toolChoice forcing the "${f.name}" tool`:f?.type===`any`?`toolChoice: 'required' (Anthropic's "any" tool_choice)`:void 0),Zt(e.model,r)){let t=e.budget_tokens??Z(e.reasoning_effort,n);Qt(t,e.max_tokens),p={type:`enabled`,budget_tokens:t}}else{let t=e.reasoning_effort??Q(e.budget_tokens,n);p={type:`adaptive`},m=en(t)}let h=i?.content,g=p?void 0:e.temperature,_={model:e.model,max_tokens:e.max_tokens,...g===void 0?{}:{temperature:g},system:h||void 0,messages:mn(a.map(e=>hn(e))),...d?{tools:d,tool_choice:f}:{},...u||m?{output_config:{...u?{format:u}:{},...m?{effort:m}:{}}}:{},...p?{thinking:p}:{}};return{body:_,toolName:l}}function pn(e,t){let n=t?.nativeStructuredOutputModels,r=X(t?.reasoningEffortTokens),i=t?.adaptiveOnlyModels,a=e.messages.create.bind(e.messages);return{supportsJsonObjectMode:!1,chat:{completions:{async create(t,a){let{body:o,toolName:s}=fn(t,n,r,i),c=await e.messages.create(o,a),l,u;if(s){let e=c.content.find(e=>e.type===`tool_use`&&e.name===s);if(!e)throw new x(`Anthropic did not return the required structured output tool "${s}".`,`validation`);if(!e.input||typeof e.input!=`object`||Array.isArray(e.input))throw new x(`Anthropic returned invalid structured output for tool "${s}". Expected an object.`,`validation`);l=JSON.stringify(e.input)}else{l=c.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``);let e=c.content.filter(e=>e.type===`tool_use`);e.length&&(u=e.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input??{})}})))}return{choices:[{message:{content:l,...u?{tool_calls:u}:{}}}],usage:{prompt_tokens:c.usage?.input_tokens,completion_tokens:c.usage?.output_tokens,total_tokens:(c.usage?.input_tokens??0)+(c.usage?.output_tokens??0),...c.usage?.output_tokens_details?.thinking_tokens===void 0?{}:{completion_tokens_details:{reasoning_tokens:c.usage.output_tokens_details.thinking_tokens}}}}},async*createStream(e,t){let{body:o,toolName:s}=fn(e,n,r,i),c=await a({...o,stream:!0},t),l=new Map,u=0,d=!1;for await(let e of c)if(e.type===`message_start`)u=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===s?`json-tool`:`tool_use`;l.set(e.index,t),t===`json-tool`?d=!0:s||(yield{type:`tool_call_delta`,index:e.index,id:e.content_block.id,name:e.content_block.name})}else l.set(e.index,`text`);else if(e.type===`content_block_delta`){if(e.delta.type===`text_delta`)s||(yield{type:`text-delta`,delta:e.delta.text});else if(e.delta.type===`input_json_delta`){let t=l.get(e.index);t===`json-tool`?yield{type:`text-delta`,delta:e.delta.partial_json}:s||(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:u,completion_tokens:t,total_tokens:u+t,...n===void 0?{}:{completion_tokens_details:{reasoning_tokens:n}}}}}else e.type===`ping`&&(yield{type:`ping`});if(s&&!d)throw new x(`Anthropic did not return the required structured output tool "${s}".`,`validation`)}}}}}function mn(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 hn(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 x(`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 x(`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)?cn(e.content):e.content??``}}function gn(e){return e.map(e=>e.type===`image`?{inlineData:{mimeType:J(e.mimeType),data:e.data}}:{text:e.text})}function _n(e,t){return`${e}#${t}`}function vn(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 yn(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 bn(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:Sn(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:xn(e.function.arguments,e.function.name)}}))),{role:`model`,parts:t}}return{role:e.role===`assistant`?`model`:`user`,parts:Array.isArray(e.content)?gn(e.content):[{text:e.content??``}]}}function xn(e,t){let n;try{n=e.trim()?JSON.parse(e):{}}catch(e){throw new x(`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 x(`Tool call "${t}" arguments must be a JSON object.`,`validation`);return n}function Sn(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 Cn(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 wn(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=vn(e.tool_choice)),sn(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:tn(n,e.model)})}else{let n=e.budget_tokens??(e.reasoning_effort?Z(e.reasoning_effort,t):void 0);n!==void 0&&(o.thinkingConfig={thinkingBudget:n})}let s=yn(i);return{model:e.model,contents:Cn(i.map(e=>bn(e,s))),config:o}}function Tn(e,t){let n=X(t?.reasoningEffortTokens),r=t?.thinkingLevelModels,i=e.models??e;if(typeof i.generateContent!=`function`)throw new x(`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=wn(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??_n(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 x(`stream: true requires a Gemini client with generateContentStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`generateContentStream`}});let i=wn(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?_n(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 En(e){return e.includes(`claude`)}function Dn(e){switch(J(e)){case`image/png`:return`png`;case`image/jpeg`:return`jpeg`;case`image/gif`:return`gif`;case`image/webp`:return`webp`}}function On(e){return new Uint8Array(Buffer.from(e,`base64`))}function kn(e){return e.map(e=>e.type===`image`?{image:{format:Dn(e.mimeType),source:{bytes:On(e.data)}}}:{text:e.text})}function An(e,t){return{tools:e.map(e=>({toolSpec:{name:e.function.name,description:e.function.description,inputSchema:{json:e.function.parameters}}})),toolChoice:Ln(t)}}function jn(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 x(`json_schema.name must not be empty.`,`validation`);let l=!!s&&qt(e.model,n);if(s&&e.tools?.length&&!l)throw new x(`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 x('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=An(e.tools,e.tool_choice)),s&&d&&t){let n=Array.isArray(t)?t.includes(e.model):t(e.model);if(!n)throw new x(`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 p,m;if(En(e.model)&&(e.budget_tokens!==void 0||e.reasoning_effort!==void 0)){let t=d?.toolChoice;if($t(t&&`tool`in t?`toolChoice forcing the "${t.tool?.name}" tool`:t&&`any`in t?`toolChoice: 'required' (Converse's "any" tool_choice)`:void 0),Zt(e.model,i)){let t=e.budget_tokens??Z(e.reasoning_effort,r);Qt(t,e.max_tokens),p={thinking:{type:`enabled`,budget_tokens:t}}}else{let t=e.reasoning_effort??Q(e.budget_tokens,r);p={thinking:{type:`adaptive`}},m=en(t)}}let h=p?void 0:e.temperature,g={modelId:e.model,messages:zn(o.map(e=>Rn(e))),system:a?.content?[{text:a.content}]:void 0,inferenceConfig:{...h===void 0?{}:{temperature:h},maxTokens:e.max_tokens},...d?{toolConfig:d}:{},...f||m?{outputConfig:{...f??{},...m?{effort:m}:{}}}:{},...p?{additionalModelRequestFields:p}:{}};return{request:g,toolName:u}}function Mn(e){return typeof e.send==`function`}function Nn(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*Pn(e){for await(let t of e){let e=Nn(t);e&&(yield e)}}function Fn(e){let t;function n(){return t??=import(`@aws-sdk/client-bedrock-runtime`).then(e=>e,e=>{throw t=void 0,new x(`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 x(`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:Pn(a.stream)}}}}function In(e,t){let n=Mn(e)?Fn(e):e,r=t?.toolUseSupportedModels,i=t?.nativeStructuredOutputModels,a=X(t?.reasoningEffortTokens),o=t?.adaptiveOnlyModels;return{supportsJsonObjectMode:!1,chat:{completions:{async create(e,t){let{request:s,toolName:c}=jn(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 x(`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 x(`stream: true requires a Bedrock client with converseStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`converseStream`}});let{request:s,toolName:c}=jn(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;if(n&&`text`in n&&n.text!==void 0&&!c)yield{type:`text-delta`,delta:n.text};else if(n&&`toolUse`in n&&n.toolUse?.input!==void 0){let e=u.get(t);e===`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 x(e.throttlingException.message??`Bedrock throttled the request mid-stream`,`api`,{status:429,code:`provider_rate_limited`});else if(`validationException`in e)throw new x(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 x(t,`api`,{status:n,code:n>=500?`server_error`:void 0})}}}}}}function Ln(e){if(!e||e===`auto`)return{auto:{}};if(e===`required`)return{any:{}};if(e===`none`)throw new x("'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 Rn(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 x(`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)?kn(e.content):[{text:e.content??``}]}}function zn(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*Bn(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 Vn(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 Bn(n.body)}async function Hn(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 Un(e){return{chat:{completions:{async create(t,n){let{url:r,method:i,headers:a,body:o}=await Hn(e,t,e.mapRequest(t)),s=e.request??fetch,c=await s(r,{method:i,headers:a,body:o,signal:n.signal});if(!c.ok){let e=await c.text().catch(()=>``),t=Error(`Fetch adapter request failed (${c.status}): ${e.slice(0,500)}`);throw t.status=c.status,t.headers=c.headers,t}let l=await c.json(),{content:u,usage:d,toolCalls:f}=e.mapResponse(l),p=f?.length?f.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}})):void 0;return{choices:[{message:{content:u,...p?{tool_calls:p}:{}}}],usage:d?{prompt_tokens:d.promptTokens,completion_tokens:d.completionTokens,total_tokens:d.totalTokens}:void 0}},async*createStream(t,n){if(!e.mapStreamEvent)throw new x(`stream: true requires mapStreamEvent to be configured on fromFetch`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`mapStreamEvent`}});if(e.request&&!e.requestStream)throw new x("`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 Hn(e,t,e.mapRequest(t)),s=e.requestStream??Vn,c=e.parseStreamFrames??Gt,l=await s(r,{method:i,headers:a,body:o,signal:n.signal});for await(let t of c(l)){if(t===K){yield{type:`ping`};continue}let n=e.mapStreamEvent(t);if(!n)continue;Array.isArray(n)?yield*n:yield n}}}}}}function Wn(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 Gn(e){return e.map(e=>e.type===`image`?{type:`image_url`,image_url:{url:`data:${J(e.mimeType)};base64,${e.data}`}}:{type:`text`,text:e.text})}function Kn(e){return e.messages.map(e=>{if(e.role===`user`&&Array.isArray(e.content))return{...e,content:Gn(e.content)};if(e.role===`tool`){let{is_error:t,...n}=e;return n}return e})}function*qn(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}=t,i=X(t.reasoningEffortTokens),a=n.chat.completions.create.bind(n.chat.completions);return{chat:{completions:{async create(e,t){let r=Kn(e);return n.chat.completions.create(Wn({...e,messages:r},i),t)},async*createStream(e,t){let n=Kn(e),o=await a(Wn({...e,messages:n,stream:!0,...r?{stream_options:{include_usage:!0}}:{}},i),t);for await(let e of o)yield*qn(e)}}}}}const Jn=$,Yn=$,Xn=$,Zn=$,Qn=$,$n=$,er=$,tr=$,nr=$,rr=$,ir=$,ar=$,or=$,sr=$,cr=$,lr=$,ur=$,dr=$,fr=$,pr=$,mr=$,hr=$,gr=$,_r=$,vr=$,yr=$,br=$,xr=$,Sr=$,Cr=$,wr=$,Tr=$,Er=$,Dr=$,Or=$,kr=$,Ar=$,jr=$;exports.CircuitBreaker=ct,exports.ConsoleLogger=U,exports.FallbackExhaustedError=w,exports.InMemoryCacheAdapter=C,exports.LLMError=x,exports.NormalizedCacheAdapter=te,exports.RateLimiter=ot,exports.SSE_PING=K,exports.TieredCacheAdapter=ne,exports.VernLLM=Ht,exports.createMiddleware=ue,exports.createMiddlewareStateBag=T,exports.createStateKey=le,exports.defaultEstimateTokens=it,exports.defaultFallbackOn=oe,exports.defineCachedCallParams=Wt,exports.defineCallParams=Ut,exports.defineTool=re,exports.from01AI=jr,exports.fromAnthropic=pn,exports.fromAnyscale=Er,exports.fromAtlasCloud=Ar,exports.fromBaseten=_r,exports.fromBedrock=In,exports.fromCerebras=Qn,exports.fromCloudflareWorkersAI=mr,exports.fromDeepInfra=ir,exports.fromDeepSeek=Zn,exports.fromFeatherless=vr,exports.fromFetch=Un,exports.fromFireworks=er,exports.fromFriendli=yr,exports.fromGemini=Tn,exports.fromGroq=Yn,exports.fromHyperbolic=or,exports.fromInferenceNet=Or,exports.fromInfermatic=kr,exports.fromLMStudio=lr,exports.fromLambdaLabs=wr,exports.fromLepton=Dr,exports.fromMiniMax=Cr,exports.fromMistral=Xn,exports.fromMoonshot=sr,exports.fromNebius=hr,exports.fromNovita=ar,exports.fromNvidiaNIM=fr,exports.fromOllama=tr,exports.fromOpenAI=Jn,exports.fromOpenAICompatible=$,exports.fromOpenRouter=nr,exports.fromParasail=xr,exports.fromPerplexity=rr,exports.fromSambaNova=gr,exports.fromSiliconFlow=br,exports.fromSnowflakeCortex=Tr,exports.fromStepFun=Sr,exports.fromTogether=$n,exports.fromVLLM=ur,exports.fromVercelAIGateway=pr,exports.fromXAI=dr,exports.fromZhipu=cr,exports.hasIssues=ee,exports.isFallbackExhaustedError=se,exports.isLLMError=S,exports.isToolCallResult=ie,exports.metaRef=ce,exports.parseSseStream=Gt;
|
|
12
|
+
`)}let i=n.trim();if(i){let e=J(i);e!==G&&e!==K&&(yield e)}}const G=Symbol(`sse-stream-done`),K=Symbol(`sse-frame-no-data`),q=Symbol(`sse-frame-ping`);function J(e){let t=[],n=!1;for(let r of e.split(`
|
|
13
|
+
`)){if(r.startsWith(`:`)){n=!0;continue}r.startsWith(`data:`)&&t.push(r.startsWith(`data: `)?r.slice(6):r.slice(5))}if(!t.length)return n?q:K;let r=t.join(`
|
|
14
|
+
`);if(r===`[DONE]`)return G;try{return JSON.parse(r)}catch(e){throw new m(`Invalid JSON in SSE frame: ${r.slice(0,200)}`,`parse`,{cause:e,code:`stream_frame_invalid`})}}const hn=[`image/png`,`image/jpeg`,`image/gif`,`image/webp`];function Y(e){if(hn.includes(e))return e;throw new m(`Unsupported image mimeType "${e}": expected one of ${hn.join(`, `)}`,`invalid_params`)}function gn(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 m(`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 _n(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 vn(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 yn(e){let t=vn(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 yn(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function xn(e,t){return!bn(e,t)}function Sn(e,t){if(e<1024)throw new m(`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 m(`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 Cn(e){if(e)throw new m(`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 Tn(e,t){return Dn(t,e.toUpperCase())}function En(e){let t=/gemini-\d+\.(\d+)/.exec(e);return t?Number(t[1]):0}function Dn(e,t){if(!e.includes(`pro`))return t;let n=On(e);return n===null||n<3?t:En(e)===0?t===`HIGH`?`HIGH`:`LOW`:t===`MINIMAL`?`LOW`:t}function On(e){let t=/gemini-(\d+)/.exec(e);return t?Number(t[1]):null}function kn(e){let t=On(e);return t!==null&&t>=3}function An(e,t){return kn(e)?!0:t?Array.isArray(t)?t.includes(e):t(e):!1}function jn(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 Mn(e,t){if(e.type!==`object`)throw new m(`Tool "${t}"'s schema must have "type": "object" (Anthropic requires object-shaped tool parameters).`,`validation`);return e}function Nn(e){return!e||e===`auto`?{type:`auto`}:e===`none`?{type:`none`}:e===`required`?{type:`any`}:{type:`tool`,name:e.function.name}}function Pn(e,t){return{tools:e.map(e=>({name:e.function.name,description:e.function.description,input_schema:Mn(e.function.parameters,e.function.name)})),toolChoice:Nn(t)}}function Fn(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 m(`json_schema.name must not be empty.`,`validation`);let c=!!o&&gn(e.model,t);if(o&&e.tools?.length&&!c)throw new m(`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 m('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}=Pn(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:Mn(e,l),strict:n}],f={type:`tool`,name:l}}!o&&e.tools?.length&&({tools:d,toolChoice:f}=Pn(e.tools,e.tool_choice));let p,h;if(e.budget_tokens!==void 0||e.reasoning_effort!==void 0){if(Cn(f?.type===`tool`?`toolChoice forcing the "${f.name}" tool`:f?.type===`any`?`toolChoice: 'required' (Anthropic's "any" tool_choice)`:void 0),xn(e.model,r)){let t=e.budget_tokens??_n(e.reasoning_effort,n);Sn(t,e.max_tokens),p={type:`enabled`,budget_tokens:t}}else{let t=e.reasoning_effort??Q(e.budget_tokens,n);p={type:`adaptive`},h=wn(t)}}let g=i?.content,_=p?void 0:e.temperature;return{body:{model:e.model,max_tokens:e.max_tokens,..._===void 0?{}:{temperature:_},system:g||void 0,messages:Ln(a.map(e=>Rn(e))),...d?{tools:d,tool_choice:f}:{},...u||h?{output_config:{...u?{format:u}:{},...h?{effort:h}:{}}}:{},...p?{thinking:p}:{}},toolName:l}}function In(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}=Fn(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 m(`Anthropic did not return the required structured output tool "${c}".`,`validation`);if(!e.input||typeof e.input!=`object`||Array.isArray(e.input))throw new m(`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 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&&ut(p,ct(l)),p},async*createStream(t,s){let{body:c,toolName:l}=Fn(t,n,r,i),u;if(!a)u=await o({...c,stream:!0},s);else{let{data:t,response:n}=await e.messages.create({...c,stream:!0},s).withResponse();u=t;let r=ct(n.headers);(r.remainingRequests!==void 0||r.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:r})}let d=new Map,f=0,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`});if(l&&!p)throw new m(`Anthropic did not return the required structured output tool "${l}".`,`validation`)}}}}}function Ln(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 Rn(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 m(`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 m(`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)?jn(e.content):e.content??``}}function zn(e){return e.map(e=>e.type===`image`?{inlineData:{mimeType:Y(e.mimeType),data:e.data}}:{text:e.text})}function Bn(e,t){return`${e}#${t}`}function Vn(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 Hn(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 Un(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:Gn(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:Wn(e.function.arguments,e.function.name)}}))),{role:`model`,parts:t}}return{role:e.role===`assistant`?`model`:`user`,parts:Array.isArray(e.content)?zn(e.content):[{text:e.content??``}]}}function Wn(e,t){let n;try{n=e.trim()?JSON.parse(e):{}}catch(e){throw new m(`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 m(`Tool call "${t}" arguments must be a JSON object.`,`validation`);return n}function Gn(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 Kn(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 qn(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=Vn(e.tool_choice)),An(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:Tn(n,e.model)})}else{let n=e.budget_tokens??(e.reasoning_effort?_n(e.reasoning_effort,t):void 0);n!==void 0&&(o.thinkingConfig={thinkingBudget:n})}let s=Hn(i);return{model:e.model,contents:Kn(i.map(e=>Un(e,s))),config:o}}function Jn(e,t){let n=Z(t?.reasoningEffortTokens),r=t?.thinkingLevelModels,i=e.models??e;if(typeof i.generateContent!=`function`)throw new m(`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=qn(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??Bn(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 m(`stream: true requires a Gemini client with generateContentStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`generateContentStream`}});let i=qn(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?Bn(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 Yn(e){return e.includes(`claude`)}function Xn(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 Zn(e){return new Uint8Array(Buffer.from(e,`base64`))}function Qn(e){return e.map(e=>e.type===`image`?{image:{format:Xn(e.mimeType),source:{bytes:Zn(e.data)}}}:{text:e.text})}function $n(e,t){return{tools:e.map(e=>({toolSpec:{name:e.function.name,description:e.function.description,inputSchema:{json:e.function.parameters}}})),toolChoice:or(t)}}function er(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 m(`json_schema.name must not be empty.`,`validation`);let l=!!s&&gn(e.model,n);if(s&&e.tools?.length&&!l)throw new m(`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 m('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=$n(e.tools,e.tool_choice)),s&&d&&t&&!(Array.isArray(t)?t.includes(e.model):t(e.model)))throw new m(`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 p,h;if(Yn(e.model)&&(e.budget_tokens!==void 0||e.reasoning_effort!==void 0)){let t=d?.toolChoice;if(Cn(t&&`tool`in t?`toolChoice forcing the "${t.tool?.name}" tool`:t&&`any`in t?`toolChoice: 'required' (Converse's "any" tool_choice)`:void 0),xn(e.model,i)){let t=e.budget_tokens??_n(e.reasoning_effort,r);Sn(t,e.max_tokens),p={thinking:{type:`enabled`,budget_tokens:t}}}else{let t=e.reasoning_effort??Q(e.budget_tokens,r);p={thinking:{type:`adaptive`}},h=wn(t)}}let g=p?void 0:e.temperature;return{request:{modelId:e.model,messages:cr(o.map(e=>sr(e))),system:a?.content?[{text:a.content}]:void 0,inferenceConfig:{...g===void 0?{}:{temperature:g},maxTokens:e.max_tokens},...d?{toolConfig:d}:{},...f||h?{outputConfig:{...f??{},...h?{effort:h}:{}}}:{},...p?{additionalModelRequestFields:p}:{}},toolName:u}}function tr(e){return typeof e.send==`function`}function nr(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*rr(e){for await(let t of e){let e=nr(t);e&&(yield e)}}function ir(e){let t;function n(){return t??=import(`@aws-sdk/client-bedrock-runtime`).then(e=>e,e=>{throw t=void 0,new m(`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 m(`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:rr(a.stream)}}}}function ar(e,t){let n=tr(e)?ir(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}=er(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 m(`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 m(`stream: true requires a Bedrock client with converseStream`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`converseStream`}});let{request:s,toolName:c}=er(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 m(e.throttlingException.message??`Bedrock throttled the request mid-stream`,`api`,{status:429,code:`provider_rate_limited`});else if(`validationException`in e)throw new m(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 m(t,`api`,{status:n,code:n>=500?`server_error`:void 0})}}}}}}function or(e){if(!e||e===`auto`)return{auto:{}};if(e===`required`)return{any:{}};if(e===`none`)throw new m("'none' is not supported by fromBedrock: Bedrock Converse has no `tool_choice` equivalent to forbidding tool use while tools are still offered. Omit `tools` entirely for this call instead.",`invalid_params`,{code:`unsupported_capability`,issues:{capability:`toolChoice: 'none'`}});return{tool:{name:e.function.name}}}function sr(e){if(e.role===`tool`)return{role:`user`,content:[{toolResult:{toolUseId:e.tool_call_id,content:[{text:e.content}],status:e.is_error?`error`:`success`}}]};if(e.role===`assistant`&&e.tool_calls?.length){let t=[];e.content&&t.push({text:e.content});for(let n of e.tool_calls){let e;if(!n.function.arguments.trim())e={};else try{e=JSON.parse(n.function.arguments)}catch(e){throw new m(`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)?Qn(e.content):[{text:e.content??``}]}}function cr(e){let t=e=>e.role===`user`&&e.content.length>0&&e.content.every(e=>`toolResult`in e),n=[];for(let r of e){let e=n.at(-1);t(r)&&e&&t(e)?e.content.push(...r.content):n.push(r)}return n}async function*lr(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 ur(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:lr(n.body)}}async function dr(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 fr(e){return{chat:{completions:{async create(t,n){let{url:r,method:i,headers:a,body:o}=await dr(e,t,e.mapRequest(t)),s=await(e.request??fetch)(r,{method:i,headers:a,body:o,signal:n.signal});if(!s.ok){let e=await s.text().catch(()=>``),t=Error(`Fetch adapter request failed (${s.status}): ${e.slice(0,500)}`);throw t.status=s.status,t.headers=s.headers,t}let c=await s.json(),{content:l,usage:u,toolCalls:d}=e.mapResponse(c),f=d?.length?d.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}})):void 0,p={choices:[{message:{content:l,...f?{tool_calls:f}:{}}}],usage:u?{prompt_tokens:u.promptTokens,completion_tokens:u.completionTokens,total_tokens:u.totalTokens}:void 0},m=e.parseRateLimitHint??B;return s.headers&&typeof s.headers.get==`function`&&ut(p,m(s.headers)),p},async*createStream(t,n){if(!e.mapStreamEvent)throw new m(`stream: true requires mapStreamEvent to be configured on fromFetch`,`invalid_params`,{code:`unsupported_capability`,issues:{capability:`mapStreamEvent`}});if(e.request&&!e.requestStream)throw new m("`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 dr(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 ur(r,{method:i,headers:a,body:o,signal:n.signal});if(c=t.body,t.headers&&typeof t.headers.get==`function`){let n=(e.parseRateLimitHint??B)(t.headers);(n.remainingRequests!==void 0||n.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:n})}}for await(let t of s(c)){if(t===q){yield{type:`ping`};continue}let n=e.mapStreamEvent(t);n&&(Array.isArray(n)?yield*n:yield n)}}}}}}function pr(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 mr(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 hr(e){return e.messages.map(e=>{if(e.role===`user`&&Array.isArray(e.content))return{...e,content:mr(e.content)};if(e.role===`tool`){let{is_error:t,...n}=e;return n}return e})}function*gr(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=hr(e),o=pr({...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`&&ut(s,B(c.headers)),s},async*createStream(e,t){let s=hr(e),c=pr({...e,messages:s,stream:!0,...r?{stream_options:{include_usage:!0}}:{}},a),l;if(!i)l=await o(c,t);else{let{data:e,response:r}=await n.chat.completions.create(c,t).withResponse();l=e;let i=B(r.headers);(i.remainingRequests!==void 0||i.limitRequests!==void 0)&&(yield{type:`rate_limit_hint`,hint:i})}for await(let e of l)yield*gr(e)}}}}}const _r=$,vr=$,yr=$,br=$,xr=$,Sr=$,Cr=$,wr=$,Tr=$,Er=$,Dr=$,Or=$,kr=$,Ar=$,jr=$,Mr=$,Nr=$,Pr=$,Fr=$,Ir=$,Lr=$,Rr=$,zr=$,Br=$,Vr=$,Hr=$,Ur=$,Wr=$,Gr=$,Kr=$,qr=$,Jr=$,Yr=$,Xr=$,Zr=$,Qr=$,$r=$,ei=$;exports.CircuitBreaker=Be,exports.ConsecutiveTripping=Pe,exports.ConsoleLogger=un,exports.FallbackExhaustedError=w,exports.InMemoryCacheAdapter=x,exports.LLMError=m,exports.NormalizedCacheAdapter=S,exports.RateLimiter=$t,exports.RetryBudget=Ve,exports.RollingTripping=Fe,exports.SSE_PING=q,exports.TieredCacheAdapter=C,exports.VernLLM=dn,exports.createMiddleware=se,exports.createMiddlewareStateBag=T,exports.createStateKey=oe,exports.defaultEstimateTokens=Yt,exports.defaultFallbackOn=re,exports.defineCachedCallParams=pn,exports.defineCallParams=fn,exports.defineTool=ee,exports.from01AI=ei,exports.fromAnthropic=In,exports.fromAnyscale=Yr,exports.fromAtlasCloud=$r,exports.fromBaseten=Br,exports.fromBedrock=ar,exports.fromCerebras=xr,exports.fromCloudflareWorkersAI=Lr,exports.fromDeepInfra=Dr,exports.fromDeepSeek=br,exports.fromFeatherless=Vr,exports.fromFetch=fr,exports.fromFireworks=Cr,exports.fromFriendli=Hr,exports.fromGemini=Jn,exports.fromGroq=vr,exports.fromHyperbolic=kr,exports.fromInferenceNet=Zr,exports.fromInfermatic=Qr,exports.fromLMStudio=Mr,exports.fromLambdaLabs=qr,exports.fromLepton=Xr,exports.fromMiniMax=Kr,exports.fromMistral=yr,exports.fromMoonshot=Ar,exports.fromNebius=Rr,exports.fromNovita=Or,exports.fromNvidiaNIM=Fr,exports.fromOllama=wr,exports.fromOpenAI=_r,exports.fromOpenAICompatible=$,exports.fromOpenRouter=Tr,exports.fromParasail=Wr,exports.fromPerplexity=Er,exports.fromSambaNova=zr,exports.fromSiliconFlow=Ur,exports.fromSnowflakeCortex=Jr,exports.fromStepFun=Gr,exports.fromTogether=Sr,exports.fromVLLM=Nr,exports.fromVercelAIGateway=Ir,exports.fromXAI=Pr,exports.fromZhipu=jr,exports.hasIssues=g,exports.isFallbackExhaustedError=ie,exports.isLLMError=h,exports.isToolCallResult=te,exports.metaRef=ae,exports.parseSseStream=mn;
|
|
15
15
|
//# sourceMappingURL=index.cjs.map
|