@bivelio/savings-layer 0.4.21 → 0.4.24
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 +173 -24
- package/dist/gateway/bin.js +746 -360
- package/dist/index.d.ts +463 -16
- package/dist/index.js +928 -731
- package/docs/terminales/README.md +83 -12
- package/docs/terminales/claude-code.md +4 -2
- package/docs/terminales/cline.md +1 -1
- package/docs/terminales/codex.md +12 -11
- package/docs/terminales/crush.md +1 -1
- package/docs/terminales/droid.md +1 -1
- package/docs/terminales/goose.md +1 -1
- package/docs/terminales/kilo.md +1 -1
- package/docs/terminales/opencode.md +1 -1
- package/docs/terminales/qwen-code.md +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var xa="2026-09-25",jt={"gpt-4.1":{inputPer1k:.002,outputPer1k:.008,cachedInputPer1k:5e-4},"gpt-4.1-mini":{inputPer1k:4e-4,outputPer1k:.0016,cachedInputPer1k:1e-4},"gpt-4.1-nano":{inputPer1k:1e-4,outputPer1k:4e-4,
|
|
2
2
|
cachedInputPer1k:25e-6},"gpt-4o":{inputPer1k:.0025,outputPer1k:.01,cachedInputPer1k:.00125},"gpt-4o-mini":{inputPer1k:15e-5,outputPer1k:6e-4,cachedInputPer1k:75e-6},"gpt-4-turbo":{inputPer1k:.01,outputPer1k:.03},
|
|
3
3
|
"gpt-4":{inputPer1k:.03,outputPer1k:.06},"gpt-3.5-turbo":{inputPer1k:5e-4,outputPer1k:.0015},"gpt-5":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5-codex":{inputPer1k:.00125,outputPer1k:.01,
|
|
4
4
|
cachedInputPer1k:125e-6},"gpt-5-mini":{inputPer1k:25e-5,outputPer1k:.002,cachedInputPer1k:25e-6},"gpt-5-nano":{inputPer1k:5e-5,outputPer1k:4e-4,cachedInputPer1k:5e-6},"gpt-5.1-codex":{inputPer1k:.00125,
|
|
@@ -6,288 +6,344 @@ outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5.1-codex-max":{inputPer1k:.00125,
|
|
|
6
6
|
"gpt-5.1-thinking":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gpt-5.2":{inputPer1k:.00175,outputPer1k:.014,cachedInputPer1k:175e-6},"gpt-5.2-codex":{inputPer1k:.00175,outputPer1k:.014,
|
|
7
7
|
cachedInputPer1k:175e-6},"gpt-5.3-codex":{inputPer1k:.00175,outputPer1k:.014,cachedInputPer1k:175e-6},"gpt-5.4":{inputPer1k:.0025,outputPer1k:.015,cachedInputPer1k:25e-5},"gpt-5.4-mini":{inputPer1k:75e-5,
|
|
8
8
|
outputPer1k:.0045,cachedInputPer1k:75e-6},"gpt-5.4-nano":{inputPer1k:2e-4,outputPer1k:.00125,cachedInputPer1k:2e-5},"gpt-5.5":{inputPer1k:.005,outputPer1k:.03,cachedInputPer1k:5e-4},"gpt-5.6-luna":{inputPer1k:2e-4,
|
|
9
|
-
outputPer1k:.0012,cachedInputPer1k:2e-5},"gpt-5.6-sol":{inputPer1k:.004,outputPer1k:.02,cachedInputPer1k:4e-4},"gpt-5.6-terra":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},
|
|
10
|
-
|
|
11
|
-
"claude-opus-4-
|
|
12
|
-
"claude-
|
|
13
|
-
cachedInputPer1k
|
|
14
|
-
outputPer1k:.
|
|
15
|
-
|
|
16
|
-
"claude-
|
|
17
|
-
cachedInputPer1k:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
0
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
39
|
-
|
|
9
|
+
outputPer1k:.0012,cachedInputPer1k:2e-5},"gpt-5.6-sol":{inputPer1k:.004,outputPer1k:.02,cachedInputPer1k:4e-4},"gpt-5.6-terra":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},o3:{inputPer1k:.002,
|
|
10
|
+
outputPer1k:.008,cachedInputPer1k:5e-4},"o3-mini":{inputPer1k:.0011,outputPer1k:.0044,cachedInputPer1k:55e-5},"o3-pro":{inputPer1k:.02,outputPer1k:.08},"o4-mini":{inputPer1k:.0011,outputPer1k:.0044,cachedInputPer1k:275e-6},
|
|
11
|
+
"claude-opus-4-5":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-6":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4-7":{inputPer1k:.005,outputPer1k:.025,
|
|
12
|
+
cachedInputPer1k:5e-4},"claude-opus-4-8":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-5":{inputPer1k:.005,outputPer1k:.025,cachedInputPer1k:5e-4},"claude-opus-4":{inputPer1k:.015,
|
|
13
|
+
outputPer1k:.075,cachedInputPer1k:.0015},"claude-sonnet-4-5":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-sonnet-4-6":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"clau\
|
|
14
|
+
de-sonnet-5":{inputPer1k:.002,outputPer1k:.01,cachedInputPer1k:2e-4},"claude-fable-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-fable-5-1":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:25e-5},
|
|
15
|
+
"claude-mythos-5-1":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:25e-5},"claude-mythos-5":{inputPer1k:.01,outputPer1k:.05,cachedInputPer1k:.001},"claude-sonnet-4":{inputPer1k:.003,outputPer1k:.015,
|
|
16
|
+
cachedInputPer1k:3e-4},"claude-haiku-4-5":{inputPer1k:.001,outputPer1k:.005,cachedInputPer1k:1e-4},"claude-3-5-sonnet":{inputPer1k:.003,outputPer1k:.015,cachedInputPer1k:3e-4},"claude-3-5-haiku":{inputPer1k:8e-4,
|
|
17
|
+
outputPer1k:.004,cachedInputPer1k:8e-5},"claude-3-opus":{inputPer1k:.015,outputPer1k:.075,cachedInputPer1k:.0015},"claude-3-haiku":{inputPer1k:25e-5,outputPer1k:.00125,cachedInputPer1k:3e-5},"gemini-3\
|
|
18
|
+
.7-flash":{inputPer1k:75e-5,outputPer1k:.00375,cachedInputPer1k:75e-6},"gemini-3.5-flash":{inputPer1k:.0015,outputPer1k:.009,cachedInputPer1k:15e-5},"gemini-3.5-flash-lite":{inputPer1k:3e-4,outputPer1k:.0025,
|
|
19
|
+
cachedInputPer1k:3e-5},"gemini-3.1-pro-preview":{inputPer1k:.002,outputPer1k:.012,cachedInputPer1k:2e-4},"gemini-2.5-pro":{inputPer1k:.00125,outputPer1k:.01,cachedInputPer1k:125e-6},"gemini-2.5-flash":{
|
|
20
|
+
inputPer1k:3e-4,outputPer1k:.0025,cachedInputPer1k:3e-5}};function Bt(t,e,n){if(!n)return;let r=t[n];if(r)return r;let o=n.lastIndexOf("/"),s=o>=0?n.slice(o+1):n,i=t[s];if(i)return i;for(let a of e){if(!s.
|
|
21
|
+
startsWith(a))continue;let c=s.charAt(a.length);if(c!==""&&c!=="-"&&c!=="."&&c!=="_")continue;let u=s.slice(a.length+1);if(!(/^\d/.test(u)&&!/^\d{4}/.test(u)))return t[a]}}function $n(t){return Object.
|
|
22
|
+
keys(t).sort((e,n)=>n.length-e.length)}var ka=["o3-deep-research","o4-mini-deep-research"],Nt={...jt,...Object.fromEntries(ka.map(t=>[t,null]))},To=$n(Nt);function Ft(t){return Bt(Nt,To,t)??void 0}var wa=Object.
|
|
23
|
+
fromEntries(Object.keys(Nt).map(t=>[t,Nt[t]===null?null:t]));function Vn(t){return Bt(wa,To,t)??void 0}var Sa=/^\d{4}-?\d{2}-?\d{2}$/;function Un(t){let e=Vn(t);if(e===void 0)return;let n=t.lastIndexOf(
|
|
24
|
+
"/"),r=n>=0?t.slice(n+1):t;if(!(e!==t&&e!==r&&!Sa.test(r.slice(e.length+1))))return jt[e]}var lt="0.4.24",zt="x-bvsala-version";var Ta=0;function dt(){let t=globalThis.crypto;if(t?.randomUUID)return t.randomUUID();let e=new Uint8Array(16);if(t?.getRandomValues)t.getRandomValues(e);else {let r=++Ta,o=Date.now?Date.now():0;for(let s=0;s<
|
|
25
|
+
16;s++)e[s]=(s<6?r>>>s*8:o>>>(s-6)*8)&255;}e[6]=e[6]&15|64,e[8]=e[8]&63|128;let n=[];for(let r=0;r<16;r++)n.push(e[r].toString(16).padStart(2,"0"));return `${n[0]}${n[1]}${n[2]}${n[3]}-${n[4]}${n[5]}-${n[6]}${n[7]}\
|
|
26
|
+
-${n[8]}${n[9]}-${n[10]}${n[11]}${n[12]}${n[13]}${n[14]}${n[15]}`}var Bl=["exact","task_equivalent","not_verified","bounded_degradation","rejected"];function zl(t){return {v:1,task:t.task,goal:t.goal,rules:t.rules??[],facts:t.facts??[],refs:t.refs??[],...t.delta?{delta:t.delta}:{},outputContract:t.outputContract}}var qn=class{id;exact=false;constructor(e="heuristic"){this.id=e;}count(e){if(e.length===0)return 0;let n=e.match(/[A-Za-z]+|\d+|\s+|[^\sA-Za-z\d]/g)??[],r=0;for(let o of n){let s=o[0];if(/\s/.test(s)){let i=(o.
|
|
27
|
+
match(/\n/g)??[]).length;r+=i+Math.floor(Math.max(0,o.length-1)/2);}else /[A-Za-z]/.test(s)?r+=Math.max(1,Math.ceil(o.length/4)):/\d/.test(s)?r+=Math.max(1,Math.ceil(o.length/2)):r+=1;}return Math.max(r,
|
|
28
|
+
Math.ceil(e.length/4))}},qe=new qn;var Hn=class{estimators=new Map;modelToTokenizer=new Map;fallbackId;constructor(e=qe){this.fallbackId=e.id,this.estimators.set(e.id,e);}register(e){return this.estimators.set(e.id,e),this}mapModel(e,n){
|
|
29
|
+
return this.modelToTokenizer.set(e,n),this}resolve(e){let n=e.tokenizer?this.estimators.get(e.tokenizer):void 0;if(n)return n;if(e.model){let r=this.modelToTokenizer.get(e.model);if(r){let o=this.estimators.
|
|
30
|
+
get(r);if(o)return o}}return this.estimators.get(this.fallbackId)}count(e,n){return this.resolve(n).count(e)}},Kn=new Hn;var Jn=class{constructor(e,n){this.encoder=n;this.id=e;}encoder;id;exact=true;count(e){return e.length===0?0:this.encoder.encode(e).length}},$t={o200k_base:["gpt-4o","gpt-4o-mini","gpt-4.1","gpt-4.1-mini",
|
|
31
|
+
"gpt-4.1-nano","o1","o1-mini","o3","o3-mini","o4-mini"],cl100k_base:["gpt-4","gpt-4-turbo","gpt-3.5-turbo","text-embedding-3-small","text-embedding-3-large"]};async function Wn(t,e={}){let n=e.codificaciones??
|
|
32
|
+
["o200k_base","cl100k_base"],r=false;for(let o of n){let s;try{s=await import(`gpt-tokenizer/encoding/${o}`);}catch{continue}if(typeof s.encode=="function"){t.register(new Jn(o,s)),r=true;for(let i of $t[o]??
|
|
33
|
+
[])t.mapModel(i,o),t.mapModel(`openai/${i}`,o);}}return r}var Gl=$t,Yl=Wn;var Ro=2592e6,Co=.95,Io=8,He=class{avoidedLlm=0;baselineLlm=1;actualLlm=0;baselineRetrieval=0;actualRetrieval=0;baselineTools=0;actualTools=0;retries=0;baselineInput=0;actualInput=0;eliminatedInput=0;compressedInput=0;baselineOutput=0;actualOutput=0;eliminatedOutput=0;providerCachedInput=0;cacheWriteInputTokens=0;cacheWritePremiumUsd=0;sentInputLocal=0;removedInputLocal=0;elididoLocal=0;estimatorExact=false;repairOutput=0;repairInput=0;callsWithoutUsage=0;discoveryInput=0;discoveryOutput=0;extraCostUsd=0;cascadeInput=0;cascadeOutput=0;cascadeAttempt(e,n){
|
|
34
|
+
this.cascadeInput+=Math.max(0,e.inputTokens),this.cascadeOutput+=Math.max(0,e.outputTokens),this.extraCostUsd+=Math.max(0,e.inputTokens)/1e3*n.inputPer1k+Math.max(0,e.outputTokens)/1e3*n.outputPer1k;}cacheWritePremium(e,n,r){
|
|
35
|
+
let o=Math.max(0,e);this.cacheWriteInputTokens+=o,this.cacheWritePremiumUsd+=o/1e3*r.inputPer1k*Math.max(0,n-1);}compressionReport=void 0;eliminate(e){this.eliminatedInput+=Math.max(0,e);}compress(e,n){
|
|
36
|
+
this.compressedInput+=Math.max(0,e-n);}providerCached(e){this.providerCachedInput+=Math.max(0,e);}reference=null;referenceRejected=null;avoidCallByReference(e){this.avoidCall(e.creditedInputTokens,e.creditedOutputTokens),
|
|
37
|
+
this.reference=e;}avoidCall(e,n){this.avoidedLlm+=1,this.actualLlm=0,this.baselineInput=e,this.baselineOutput=n;}get publishedBaselineOutput(){return this.avoidedLlm===0?Math.max(0,this.actualOutput-this.
|
|
38
|
+
repairOutput-this.discoveryOutput):this.baselineOutput}estimateCost(e){let n=this.avoidedLlm===0,r="estimated";if(n)if(this.callsWithoutUsage>0)this.baselineInput=0,r="unmeasured";else if(this.actualInput>
|
|
39
|
+
0&&this.sentInputLocal>0){let m=this.actualInput/this.sentInputLocal,f=Math.max(0,this.actualInput-this.repairInput-this.discoveryInput);this.baselineInput=f+Math.round(m*this.removedInputLocal),r=this.
|
|
40
|
+
removedInputLocal===0?"measured":"estimated";}else this.actualInput>0?(this.baselineInput=this.actualInput,r="measured"):(this.baselineInput=0,r="unmeasured");let o=n?Math.max(0,this.actualOutput-this.
|
|
41
|
+
repairOutput-this.discoveryOutput):this.baselineOutput,s=e.cachedInputPer1k??e.inputPer1k,i=Math.min(this.providerCachedInput,this.actualInput),a=m=>Math.max(0,m-i)/1e3*e.inputPer1k+i/1e3*s,c=n?null:this.
|
|
42
|
+
reference,u=c?c.tierFactor*(this.baselineInput/1e3*c.cachedInputPer1k+this.baselineOutput/1e3*c.outputPer1k):a(this.baselineInput)+o/1e3*e.outputPer1k;c&&(r=u>0?"reference":"estimated");let l=a(this.actualInput)+
|
|
43
|
+
this.actualOutput/1e3*e.outputPer1k+this.extraCostUsd+this.cacheWritePremiumUsd,d=u===0?0:1-l/u;return {baselineEstimate:Eo(u),actual:Eo(l),netSavings:Ea(d),basis:r}}};function Eo(t){return Math.round(
|
|
44
|
+
t*1e10)/1e10}function Ea(t){return Math.round(t*1e6)/1e6}var Ra=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,
|
|
40
45
|
4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,
|
|
41
46
|
1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,
|
|
42
|
-
1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),
|
|
43
|
-
8,
|
|
44
|
-
[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),a=new Uint32Array(64);for(let
|
|
45
|
-
64;b++){let x=a[b-15],
|
|
46
|
-
h,6)^
|
|
47
|
-
i[4]=i[4]+h|0,i[5]=i[5]+g|0,i[6]=i[6]+p|0,i[7]=i[7]+
|
|
48
|
-
|
|
49
|
-
normalize("NFC"),e=e.replace(
|
|
50
|
-
|
|
51
|
-
t)}function
|
|
52
|
-
function
|
|
47
|
+
1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Ca=new TextEncoder;function ie(t,e){return t>>>e|t<<32-e}function _o(t){let e=Ca.encode(t),n=e.length*
|
|
48
|
+
8,r=(e.length+8>>6)+1,o=new Uint8Array(r*64);o.set(e),o[e.length]=128;let s=new DataView(o.buffer);s.setUint32(o.length-8,Math.floor(n/4294967296)),s.setUint32(o.length-4,n>>>0);let i=new Uint32Array(
|
|
49
|
+
[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),a=new Uint32Array(64);for(let u=0;u<o.length;u+=64){for(let b=0;b<16;b++)a[b]=s.getUint32(u+b*4);for(let b=16;b<
|
|
50
|
+
64;b++){let x=a[b-15],y=a[b-2],k=ie(x,7)^ie(x,18)^x>>>3,E=ie(y,17)^ie(y,19)^y>>>10;a[b]=a[b-16]+k+a[b-7]+E|0;}let l=i[0],d=i[1],m=i[2],f=i[3],h=i[4],g=i[5],p=i[6],v=i[7];for(let b=0;b<64;b++){let x=ie(
|
|
51
|
+
h,6)^ie(h,11)^ie(h,25),y=h&g^~h&p,k=v+x+y+Ra[b]+a[b]|0,E=ie(l,2)^ie(l,13)^ie(l,22),w=l&d^l&m^d&m,I=E+w|0;v=p,p=g,g=h,h=f+k|0,f=m,m=d,d=l,l=k+I|0;}i[0]=i[0]+l|0,i[1]=i[1]+d|0,i[2]=i[2]+m|0,i[3]=i[3]+f|0,
|
|
52
|
+
i[4]=i[4]+h|0,i[5]=i[5]+g|0,i[6]=i[6]+p|0,i[7]=i[7]+v|0;}let c="";for(let u=0;u<8;u++)c+=(i[u]>>>0).toString(16).padStart(8,"0");return c}var Ia=/\s+/g,_a=[[/′′/g,'"'],[/[‘’‚‛′´`]/g,"'"],[/[“”„‟″«»]/g,'"'],[/[‐-―−]/g,"-"],[/⁄/g,"/"],[/…/g,""]],Pa=/[¿?¡!;.,:'"·•]/g,Da=/([a-z])\p{M}+/gu,Oa=/(^|\s)\p{M}+/gu,
|
|
53
|
+
Gn=/\p{L}/u;function X(t){return t>="0"&&t<="9"}function Vt(t){let e=t.normalize("NFKC").toLowerCase();for(let[n,r]of _a)e=e.replace(n,r);return e=e.normalize("NFD").replace(Da,"$1").replace(Oa,"$1").
|
|
54
|
+
normalize("NFC"),e=e.replace(Pa,(n,r,o)=>{let s=o[r-1]??"",i=o[r+1]??"";switch(n){case "\xBF":case "?":case "\xA1":case ";":return X(s)&&X(i)?n:"";case "!":return X(s)?n:"";case ".":case ",":return X(s)&&X(i)||
|
|
55
|
+
X(i)&&!X(s)&&!Gn.test(s)?n:"";case ":":return X(s)&&X(i)?n:"";case "'":case '"':return Gn.test(s)&&Gn.test(i)||X(s)||X(i)?n:"";default:return X(s)||X(i)?n:""}}),e.replace(Ia," ").trim()}function G(t){return _o(
|
|
56
|
+
t)}function ae(t){return JSON.stringify(Yn(t))}function Yn(t){if(Array.isArray(t))return t.map(Yn);if(t&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=Yn(t[n]);return e}return t}
|
|
57
|
+
function Zn(t){return t.replace(/[-_]?\d{4,}.*$/,"").replace(/[-_](mini|nano|small|large|latest)$/i,"")}function Xn(t){let e=t.context??{},n=t.messages.filter(s=>s.role==="system").map(s=>s.content).join(
|
|
53
58
|
`
|
|
54
|
-
`),
|
|
55
|
-
`),
|
|
56
|
-
systemPromptHash:
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
`),r=t.messages.filter(s=>s.role!=="system").map(s=>`${s.role}:${Vt(s.content)}`).join(`
|
|
60
|
+
`),o=(t.tools??[]).map(s=>({id:s.id,risk:s.risk,parameters:s.parameters??null})).sort((s,i)=>s.id.localeCompare(i.id));return {model:t.model,modelFamily:Zn(t.model),messages:t.messages,normalizedText:r,
|
|
61
|
+
systemPromptHash:G(n),toolsetHash:G(ae(o)),structuredDataHash:t.structuredData!==void 0?G(ae(t.structuredData)):"none",schemaVersion:t.response?.version??t.response?.contractId??"none",contractId:t.response?.
|
|
62
|
+
contractId??null,temperature:t.temperature??null,seed:t.seed??null,tenantId:e.tenantId??"anonymous",authorizationScope:e.authorizationScope??"default",principal:e.sessionId??null,locale:e.locale??"und",
|
|
63
|
+
knowledgeEpoch:e.knowledgeEpoch??"none",freshnessBucket:e.freshnessBucket??"any",safetyPolicyVersion:e.safetyPolicyVersion??"none",tokenizer:t.tokenizer,original:t}}var Po="n2";function Qn(t,e={}){let n=e.servedModel??t.model,r=ae({tenant:t.tenantId,scope:t.authorizationScope,principal:t.principal,text:t.normalizedText,modelFamily:n===t.model?t.modelFamily:Zn(n),
|
|
59
64
|
model:n,system:t.systemPromptHash,contract:t.contractId,schema:t.schemaVersion,tools:t.toolsetHash,data:t.structuredDataHash,locale:t.locale,temperature:t.temperature,seed:t.seed,knowledgeEpoch:t.knowledgeEpoch,
|
|
60
|
-
freshness:t.freshnessBucket,safety:t.safetyPolicyVersion});return `bvsala:exact:${
|
|
65
|
+
freshness:t.freshnessBucket,safety:t.safetyPolicyVersion});return `bvsala:exact:${Po}:${G(r)}`}function Do(t,e={}){let n=ae({tenant:t.tenantId,scope:t.authorizationScope,principal:t.principal,text:t.normalizedText,
|
|
61
66
|
model:e.servedModel??t.model,system:t.systemPromptHash,contract:t.contractId,schema:t.schemaVersion,tools:t.toolsetHash,data:t.structuredDataHash,temperature:t.temperature,seed:t.seed,deferrable:e.deferrable===
|
|
62
|
-
true,toolDiscovery:e.toolDiscovery===true,maxOut:e.maxOutputTokens??null});return `bvsala:inflight:${
|
|
67
|
+
true,toolDiscovery:e.toolDiscovery===true,maxOut:e.maxOutputTokens??null});return `bvsala:inflight:${Po}:${G(n)}`}var Aa=new RegExp("\\b("+["now|today|current|currently|latest|live|price|prices|stock|availability|weather|score|breaking","ahora|hoy|actual|actualmente|ultimo|\xFAltimo|precio|precios|disponibilidad|cot\
|
|
63
68
|
izacion|cotizaci\xF3n","ara|avui|preu|preus|disponibilitat|darrer","maintenant|aujourd'hui|actuel|actuelle|dernier|prix|disponibilite|disponibilit\xE9|meteo|m\xE9t\xE9o","jetzt|heute|aktuell|aktuelle|\
|
|
64
69
|
neueste|preis|preise|verfugbarkeit|verf\xFCgbarkeit|wetter|kurs","adesso|oggi|attuale|ultimo|prezzo|prezzi|disponibilita|disponibilit\xE0|meteo","agora|hoje|atual|ultimo|\xFAltimo|preco|pre\xE7o|precos|pre\xE7\
|
|
65
70
|
os|disponibilidade|cotacao|cota\xE7\xE3o","nu|vandaag|huidige|laatste|prijs|prijzen|beschikbaarheid|weer|koers","teraz|dzisiaj|dzis|dzi\u015B|aktualny|aktualna|najnowszy|cena|ceny|dostepnosc|dost\u0119pno\u015B\u0107|pog\
|
|
66
71
|
oda","simdi|\u015Fimdi|bugun|bug\xFCn|guncel|g\xFCncel|son|fiyat|fiyatlar|stok|hava","sekarang|hari ini|terkini|terbaru|harga|ketersediaan|cuaca","bay gio|b\xE2y gi\u1EDD|hom nay|h\xF4m nay|hien tai|hi\u1EC7n t\u1EA1i|moi\
|
|
67
|
-
nhat|m\u1EDBi nh\u1EA5t|gia|gi\xE1|thoi tiet|th\u1EDDi ti\u1EBFt"].join("|")+")\\b","i"),
|
|
72
|
+
nhat|m\u1EDBi nh\u1EA5t|gia|gi\xE1|thoi tiet|th\u1EDDi ti\u1EBFt"].join("|")+")\\b","i"),Ma=new RegExp("\\b("+["my|mine|our|ours|account|balance|subscription|invoice|order|profile","mi|mis|mio|m\xEDo|nu\
|
|
68
73
|
estro|nuestra|cuenta|factura|pedido|saldo|suscripcion|suscripci\xF3n|perfil","meu|meva|nostre|compte|factura|comanda|saldo|subscripcio|subscripci\xF3|perfil","mon|ma|mes|notre|nos|compte|solde|facture\
|
|
69
74
|
|commande|abonnement|profil","mein|meine|meinem|unser|unsere|konto|kontostand|saldo|rechnung|bestellung|abo|abonnement|profil","mio|mia|miei|nostro|nostra|conto|saldo|fattura|ordine|abbonamento|profil\
|
|
70
75
|
o","meu|minha|meus|nosso|nossa|conta|saldo|fatura|pedido|assinatura|perfil","mijn|onze|ons|rekening|saldo|factuur|bestelling|abonnement|profiel","moj|m\xF3j|moja|moje|nasz|nasza|konto|saldo|faktura|zamow\
|
|
71
76
|
ienie|zam\xF3wienie|subskrypcja|profil","benim|bizim|hesap|hesabim|hesab\u0131m|bakiye|fatura|siparis|sipari\u015F|abonelik|profil","saya|kami|akun|saldo|tagihan|pesanan|langganan|profil","cua toi|c\u1EE7a\
|
|
72
|
-
t\xF4i|tai khoan|t\xE0i kho\u1EA3n|so du|s\u1ED1 d\u01B0|hoa don|h\xF3a \u0111\u01A1n|don hang|\u0111\u01A1n h\xE0ng|thue bao|thu\xEA bao"].join("|")+")\\b","i");function
|
|
73
|
-
|
|
74
|
-
push("write/destructive tools present"),
|
|
75
|
-
null||t.freshnessBucket==="any"),c=t.freshnessBucket==="live",
|
|
76
|
-
"freshnessBucket=live \u2192 exact cache off (answer must be current)"),a&&e.push("freshness-sensitive without a freshness bucket \u2192 exact cache off"),
|
|
77
|
-
ipal (context.sessionId) \u2192 exact cache off");let d=!o&&!
|
|
78
|
-
allowSingleflight:!
|
|
79
|
-
now()>n.expiresAtMs?(this.store.delete(e),null):(this.store.delete(e),this.store.set(e,n),
|
|
80
|
-
next().value;
|
|
81
|
-
try{return structuredClone(t)}catch{return t}}var
|
|
82
|
-
inflight.set(e,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
77
|
+
t\xF4i|tai khoan|t\xE0i kho\u1EA3n|so du|s\u1ED1 d\u01B0|hoa don|h\xF3a \u0111\u01A1n|don hang|\u0111\u01A1n h\xE0ng|thue bao|thu\xEA bao"].join("|")+")\\b","i");function er(t){let e=[],n=t.normalizedText,
|
|
78
|
+
r=(t.original.tools??[]).some(f=>f.risk==="write"||f.risk==="destructive"),o=t.freshnessBucket==="live"||t.freshnessBucket==="hour"||Aa.test(n),s=Ma.test(n),i=(t.temperature??0)>.3&&t.seed==null;r&&e.
|
|
79
|
+
push("write/destructive tools present"),o&&e.push("freshness-sensitive request"),s&&e.push("personalized/account-scoped request"),i&&e.push("stochastic sampling (temp>0.3, no seed)");let a=o&&(t.freshnessBucket==
|
|
80
|
+
null||t.freshnessBucket==="any"),c=t.freshnessBucket==="live",u=s&&t.principal==null,l=!i&&!a&&!c&&!u&&!r;r&&e.push("write/destructive tools \u2192 exact cache off (side effects must execute)"),c&&e.push(
|
|
81
|
+
"freshnessBucket=live \u2192 exact cache off (answer must be current)"),a&&e.push("freshness-sensitive without a freshness bucket \u2192 exact cache off"),u&&e.push("personalized request with no princ\
|
|
82
|
+
ipal (context.sessionId) \u2192 exact cache off");let d=!r&&!o&&!s&&!i&&t.freshnessBucket!=="day",m=!r&&!o&&!s&&!i&&t.freshnessBucket!=="day";return {allowExactCache:l,allowSemanticCache:d,allowElision:m,
|
|
83
|
+
allowSingleflight:!r&&!u,allowCompression:true,requiresFreshData:o,hasSideEffects:r,isPersonalized:s,maxCacheAgeMs:t.freshnessBucket==="hour"?36e5:t.freshnessBucket==="day"?864e5:null,reasons:e}}var Ut=class{store=new Map;maxEntries;now;constructor(e={}){this.maxEntries=e.maxEntries??1e4,this.now=e.now??(()=>Date.now());}async get(e){let n=this.store.get(e);return n?n.expiresAtMs!==null&&this.
|
|
84
|
+
now()>n.expiresAtMs?(this.store.delete(e),null):(this.store.delete(e),this.store.set(e,n),Oo(n.value)):null}async set(e,n,r){if(this.store.size>=this.maxEntries&&!this.store.has(e)){let o=this.store.keys().
|
|
85
|
+
next().value;o!==void 0&&this.store.delete(o);}this.store.set(e,{value:Oo(n),expiresAtMs:r!=null?this.now()+r:null});}async delete(e){this.store.delete(e);}get size(){return this.store.size}};function Oo(t){
|
|
86
|
+
try{return structuredClone(t)}catch{return t}}var qt=class{inflight=new Map;waiters=new Map;async run(e,n){let r=this.inflight.get(e);if(r)return this.waiters.set(e,(this.waiters.get(e)??1)+1),{value:await r,coalesced:true};let o=(async()=>n())();this.
|
|
87
|
+
inflight.set(e,o),this.waiters.set(e,1);try{return {value:await o,coalesced:!1}}finally{this.inflight.delete(e),this.waiters.delete(e);}}join(e){let n=this.inflight.get(e);return n&&this.waiters.set(e,(this.
|
|
88
|
+
waiters.get(e)??1)+1),n}get activeKeys(){return this.inflight.size}};function La(t){let e=2166136261;for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=Math.imul(e,16777619)>>>0;return e}function Na(t){return t.toLowerCase().normalize("NFKC").split(/[^\p{L}\p{N}]+/u).filter(
|
|
89
|
+
Boolean)}function ja(t){let e=new Array(256).fill(0),n=Na(t);if(n.length===0)return e;let r=new Map;for(let s=0;s<n.length;s++){let i=n[s];if(r.set(i,(r.get(i)??0)+1),s+1<n.length){let a=`${i}\0${n[s+
|
|
90
|
+
1]}`;r.set(a,(r.get(a)??0)+1);}}for(let[s,i]of r){let a=La(s),c=a%256,u=a>>>31===1?-1:1;e[c]+=u*(1+Math.log(i));}let o=0;for(let s of e)o+=s*s;if(o=Math.sqrt(o),o===0)return e;for(let s=0;s<e.length;s++)
|
|
91
|
+
e[s]/=o;return e}function Ao(t){return ja(t)}var Mo=.72;function Ba(t,e){if(t.length!==e.length)return 0;let n=t.length,r=0,o=0,s=0;for(let i=0;i<n;i++){let a=t[i],c=e[i];r+=a*c,o+=a*a,s+=c*c;}return o===0||s===0?0:r/(Math.sqrt(o)*Math.sqrt(s))}var Fa=new Set(
|
|
86
92
|
["no","not","never","none","cannot","cant","without","nor","nt","isnt","arent","wasnt","werent","dont","doesnt","didnt","wont","shouldnt","sin","nunca","jamas","jam\xE1s","tampoco","ni","ningun","ning\
|
|
87
|
-
\xFAn","ninguna","ninguno","nada","nadie","sense","mai","tampoc","cap","gens","ningu","ning\xFA","res"]),
|
|
93
|
+
\xFAn","ninguna","ninguno","nada","nadie","sense","mai","tampoc","cap","gens","ningu","ning\xFA","res"]),za=new Set(["the","a","an","of","to","in","on","for","and","or","is","are","was","were","what",
|
|
88
94
|
"whats","which","who","whom","how","when","where","me","my","i","you","please","tell","give","show","find","do","does","did","be","that","this","it","with","as","at","by","from","about","into","over",
|
|
89
95
|
"than","then","s","el","la","los","las","un","una","unos","unas","de","del","al","en","por","para","con","sin","sobre","y","o","u","es","son","era","eran","ser","estar","esta","este","esto","estos","e\
|
|
90
96
|
stas","ese","esa","eso","que","cual","cuales","quien","quienes","como","cuando","donde","dame","dime","quiero","necesito","puedes","podrias","favor","porfavor","gracias","me","mi","mis","tu","tus","su",
|
|
91
97
|
"sus","lo","le","se","hay","el","la","els","les","un","una","uns","unes","de","del","dels","al","als","en","per","amb","sense","sobre","i","o","es","son","era","eren","ser","estar","aquest","aquesta",
|
|
92
|
-
"aquests","aquestes","aquell","aquella","que","quin","quina","qui","com","quan","on","dona","vull","necessito","pots","podries","sisplau","gracies","meu","meva","seu","seva","hi"]);function
|
|
93
|
-
match(/\d[\d.,:/-]*/g)??[]).map(e=>e.replace(/[.,:/-]+$/,""))}function
|
|
94
|
-
return false;n.set(o
|
|
95
|
-
function
|
|
96
|
-
`).map(e=>{let n
|
|
97
|
-
o
|
|
98
|
-
n.filter(
|
|
99
|
-
let n=e.embed==null;this.embed=e.embed??
|
|
100
|
-
e.maxRecords??5e3,this.now=e.now??(()=>Date.now());}async find(e){if(this.records.length===0)return null;let n=await this.embed(e.normalizedText),
|
|
101
|
-
|
|
102
|
-
structuredDataHash!==e.structuredDataHash||
|
|
103
|
-
let s=
|
|
104
|
-
a>
|
|
105
|
-
this.records.shift(),this.records.push({embedding:
|
|
98
|
+
"aquests","aquestes","aquell","aquella","que","quin","quina","qui","com","quan","on","dona","vull","necessito","pots","podries","sisplau","gracies","meu","meva","seu","seva","hi"]);function pt(t){return (t.
|
|
99
|
+
match(/\d[\d.,:/-]*/g)??[]).map(e=>e.replace(/[.,:/-]+$/,""))}function tr(t,e){if(t.length!==e.length)return false;let n=new Map;for(let r of t)n.set(r,(n.get(r)??0)+1);for(let r of e){let o=n.get(r);if(!o)
|
|
100
|
+
return false;n.set(r,o-1);}return true}function ft(t){return t.split(/\s+/).filter(Boolean)}function mt(t){return t.filter(e=>Fa.has(e.replace(/'/g,""))||e.endsWith("n't")).length}var $a=/^(system|user|assistant|tool):/;
|
|
101
|
+
function Lo(t){return t.split(`
|
|
102
|
+
`).map(e=>{let n=$a.exec(e);return n?{rol:n[1],texto:e.slice(n[0].length)}:{rol:"",texto:e}})}function Va(t,e){let n=Lo(t),r=Lo(e);if(n.length!==r.length)return false;for(let o=0;o<n.length;o++)if(n[o].rol!==
|
|
103
|
+
r[o].rol||!Ua(n[o].texto,r[o].texto))return false;return true}function Ua(t,e){if(!tr(pt(t),pt(e)))return false;let n=ft(t),r=ft(e);if(mt(n)!==mt(r))return false;let o=u=>u.length>1&&!za.has(u)&&!/^\d/.test(u),s=new Set(
|
|
104
|
+
n.filter(o)),i=new Set(r.filter(o));if(s.size===0&&i.size===0)return true;let a=0;for(let u of s)i.has(u)&&a++;let c=s.size+i.size-a;return c===0?true:a/c>=.75}var No=class{records=[];embed;verify;similarityThreshold;acceptThreshold;ttlMs;maxRecords;now;constructor(e={}){
|
|
105
|
+
let n=e.embed==null;this.embed=e.embed??Ao,this.verify=e.verify,this.similarityThreshold=e.similarityThreshold??(n?Mo:.9),this.acceptThreshold=e.acceptThreshold??.85,this.ttlMs=e.ttlMs,this.maxRecords=
|
|
106
|
+
e.maxRecords??5e3,this.now=e.now??(()=>Date.now());}async find(e){if(this.records.length===0)return null;let n=await this.embed(e.normalizedText),r=null;for(let o of this.records){if(o.tenantId!==e.tenantId||
|
|
107
|
+
o.authorizationScope!==e.authorizationScope||o.principal!==e.principal||o.knowledgeEpoch!==e.knowledgeEpoch||o.contractId!==e.contractId||o.model!==e.model||o.systemPromptHash!==e.systemPromptHash||o.
|
|
108
|
+
structuredDataHash!==e.structuredDataHash||o.locale!==e.locale||o.schemaVersion!==e.schemaVersion||o.safetyPolicyVersion!==e.safetyPolicyVersion||this.ttlMs!=null&&this.now()-o.storedAtMs>this.ttlMs)continue;
|
|
109
|
+
let s=Ba(n,o.embedding);if(s<this.similarityThreshold||!Va(e.normalizedText,o.query))continue;let i=this.verify?await this.verify(e.normalizedText,o.query):s,a=Math.min(s,i);a<this.acceptThreshold||(!r||
|
|
110
|
+
a>r.confidence)&&(r={record:o,similarity:s,verifierScore:i,confidence:a,ageMs:this.now()-o.storedAtMs});}return r}async store(e,n){let r=await this.embed(e.normalizedText);this.records.length>=this.maxRecords&&
|
|
111
|
+
this.records.shift(),this.records.push({embedding:r,query:e.normalizedText,answer:n,tenantId:e.tenantId,authorizationScope:e.authorizationScope,principal:e.principal,knowledgeEpoch:e.knowledgeEpoch,contractId:e.
|
|
106
112
|
contractId,model:e.model,systemPromptHash:e.systemPromptHash,structuredDataHash:e.structuredDataHash,locale:e.locale,schemaVersion:e.schemaVersion,safetyPolicyVersion:e.safetyPolicyVersion,storedAtMs:this.
|
|
107
|
-
now()});}invalidateEpoch(e){let n=0;for(let
|
|
108
|
-
|
|
109
|
-
let
|
|
110
|
-
return Number.isInteger(t)?String(t):String(Math.round(t*1e9)/1e9)}function
|
|
111
|
-
"*":2,"/":2,"%":2},s=a=>{let c=n.pop(),
|
|
112
|
-
0?false:(n.push(
|
|
113
|
-
|
|
114
|
-
i=true;}for(;
|
|
115
|
-
|
|
116
|
-
classifier=e.classifier,this.maxRounds=e.maxRounds??2;}classify(e){let n=e.original.retrieval?.mode,
|
|
117
|
-
test(
|
|
118
|
-
.8,"self-contained transformation",0);let s=this.classifier?.classify(
|
|
119
|
-
e"?
|
|
120
|
-
d question",Math.min(this.maxRounds,2)):
|
|
121
|
-
"SINGLE_RETRIEVAL"?1:t==="MULTI_HOP_RETRIEVAL"?Math.min(e,2):0}function
|
|
122
|
-
return !t.some(e=>Array.isArray(e.intents)&&e.intents.length>0)&&!t.some(e=>typeof e.risk=="string")}var
|
|
123
|
-
8,this.scoreIntentMatch=e.scoreIntentMatch??
|
|
124
|
-
rovided",setIsStable:true};let n=e.slice(0,this.maxTools),
|
|
125
|
-
, capped at maxTools=${this.maxTools}; risk gating is the caller's responsibility while routing is off)`,setIsStable:true}}select(e,n,o
|
|
126
|
-
ols provided",setIsStable:true};if(
|
|
127
|
-
, capped at maxTools=${this.maxTools}). Declare ToolDescriptor.intents/risk to enable pruning`}}let s=
|
|
128
|
-
filter(p=>a(p)),u
|
|
129
|
-
score-p.score).map(p=>p.tool),
|
|
130
|
-
let p=this.freezer.read(
|
|
131
|
-
filter(
|
|
132
|
-
let b=[...new Set([...p?.ids??[],...
|
|
133
|
-
reason:`selected ${
|
|
134
|
-
[]){let s=
|
|
135
|
-
0)-(i.score??0));if(
|
|
136
|
-
i);else break}return s}async function
|
|
137
|
-
let n=t.execution==="MULTI_HOP_RETRIEVAL"?Math.min(t.maxRounds,2):1,
|
|
138
|
-
(
|
|
139
|
-
...t.userPreferences},decisions:[...t.decisions],openItems:[...t.openItems],evidenceRefs:[...t.evidenceRefs]};for(let[o
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
${
|
|
113
|
+
now()});}invalidateEpoch(e){let n=0;for(let r=this.records.length-1;r>=0;r--)this.records[r].knowledgeEpoch===e&&(this.records.splice(r,1),n++);return n}get size(){return this.records.length}};var nr=class{resolvers=[];register(e){return this.resolvers.push(e),this}try(e){for(let n of this.resolvers)try{let r=n.try(e);if(r)return r}catch{}return null}get size(){return this.resolvers.length}},
|
|
114
|
+
qa={name:"arithmetic",try(t){let n=(t.normalizedText.match(/(?:what\s+is|calculate|compute|how\s+much\s+is|cu[aá]nto\s+es)\s+([0-9+\-*/%.()\s]+)\??$/i)?.[1]??Ha(t.normalizedText))?.trim();if(!n)return null;
|
|
115
|
+
let r=Ja(n);return r===null||!Number.isFinite(r)?null:{text:Ka(r),data:{value:r},resolver:"arithmetic"}}};function Ha(t){return /^[0-9+\-*/%.()\s]+$/.test(t.trim())&&/[+\-*/%]/.test(t)?t.trim():null}function Ka(t){
|
|
116
|
+
return Number.isInteger(t)?String(t):String(Math.round(t*1e9)/1e9)}function Ja(t){let e=t.match(/\d+\.?\d*|[+\-*/%()]/g);if(!e||e.join("")!==t.replace(/\s+/g,""))return null;let n=[],r=[],o={"+":1,"-":1,
|
|
117
|
+
"*":2,"/":2,"%":2},s=a=>{let c=n.pop(),u=n.pop();if(u===void 0||c===void 0)return false;switch(a){case "+":return n.push(u+c),true;case "-":return n.push(u-c),true;case "*":return n.push(u*c),true;case "/":return c===
|
|
118
|
+
0?false:(n.push(u/c),true);case "%":return c===0?false:(n.push(u%c),true);default:return false}},i=true;for(let a of e)if(/^\d/.test(a))n.push(Number(a)),i=false;else if(a==="(")r.push(a),i=true;else if(a===")"){for(;r.length&&
|
|
119
|
+
r[r.length-1]!=="(";)if(!s(r.pop()))return null;if(r.pop()!=="(")return null;i=false;}else {if(i)return null;for(;r.length&&r[r.length-1]!=="("&&o[r[r.length-1]]>=o[a];)if(!s(r.pop()))return null;r.push(a),
|
|
120
|
+
i=true;}for(;r.length;){let a=r.pop();if(a==="("||!s(a))return null}return n.length===1?n[0]:null}function jo(){return new nr().register(qa)}var Wa=/\b(compare|versus|\bvs\b|difference between|both|and then|after that|which is (?:better|cheaper|faster)|compar[ae]|diferencia entre)\b/i,Bo=/\b(who|what|when|where|which|how many|how much|define|definition|qui[eé]n|qu[eé]|cu[aá]ndo|d[oó]nde|cu[aá]nto)\b/i,
|
|
121
|
+
Ga=/\b(summarize|rewrite|translate|classify|extract|reformat|fix|convert|the following|below|above|this text|resume|reescribe|traduce|clasifica)\b/i,Ht=class{classifier;maxRounds;constructor(e={}){this.
|
|
122
|
+
classifier=e.classifier,this.maxRounds=e.maxRounds??2;}classify(e){let n=e.original.retrieval?.mode,r=e.normalizedText;if((e.original.tools??[]).some(i=>i.risk==="write"||i.risk==="destructive")&&/\b(create|update|delete|send|pay|book|cancel|crea|actualiza|elimina|env[ií]a|paga)\b/i.
|
|
123
|
+
test(r))return be("TOOL_ACTION",.9,"imperative + write tool available",0);if(n==="off")return be("NO_RETRIEVAL",1,"retrieval disabled by caller",0);if(Ga.test(r)&&!Bo.test(r))return be("NO_RETRIEVAL",
|
|
124
|
+
.8,"self-contained transformation",0);let s=this.classifier?.classify(r);return s&&s.confidence>=.75?be(s.executionClass,s.confidence,"local classifier",Ya(s.executionClass,this.maxRounds)):n==="singl\
|
|
125
|
+
e"?be("SINGLE_RETRIEVAL",.7,"caller hint: single",1):n==="multi"?be("MULTI_HOP_RETRIEVAL",.7,"caller hint: multi",Math.min(this.maxRounds,2)):Wa.test(r)?be("MULTI_HOP_RETRIEVAL",.7,"comparison/compoun\
|
|
126
|
+
d question",Math.min(this.maxRounds,2)):Bo.test(r)?be("SINGLE_RETRIEVAL",.65,"single factual lookup",1):be("NO_RETRIEVAL",.5,"no retrieval signal (conservative default)",0)}};function Ya(t,e){return t===
|
|
127
|
+
"SINGLE_RETRIEVAL"?1:t==="MULTI_HOP_RETRIEVAL"?Math.min(e,2):0}function be(t,e,n,r){return {executionClass:t,confidence:e,reason:n,rounds:r}}var rr=class{constructor(e=512){this.cap=e;}cap;map=new Map;read(e){return this.map.get(e)}record(e,n,r){this.map.size>=this.cap&&!this.map.has(e)&&this.map.clear(),this.map.set(e,{ids:n,turns:r});}};function Za(t){
|
|
128
|
+
return !t.some(e=>Array.isArray(e.intents)&&e.intents.length>0)&&!t.some(e=>typeof e.risk=="string")}var Kt=class{maxTools;scoreIntentMatch;learningTurns;freezer;constructor(e={}){this.maxTools=e.maxTools??
|
|
129
|
+
8,this.scoreIntentMatch=e.scoreIntentMatch??Xa,this.learningTurns=e.learningTurns??16,this.freezer=e.freezer??new rr;}passthrough(e){if(!e||e.length===0)return {tools:[],droppedIds:[],reason:"no tools p\
|
|
130
|
+
rovided",setIsStable:true};let n=e.slice(0,this.maxTools),r=e.slice(this.maxTools).map(o=>o.id);return {tools:n,droppedIds:r,reason:`router off: caller tools passed through unfiltered (${n.length}/${e.length}\
|
|
131
|
+
, capped at maxTools=${this.maxTools}; risk gating is the caller's responsibility while routing is off)`,setIsStable:true}}select(e,n,r,o){if(!n||n.length===0)return {tools:[],droppedIds:[],reason:"no to\
|
|
132
|
+
ols provided",setIsStable:true};if(Za(n)){let p=this.passthrough(n);return {...p,reason:`catalogue declares no \`intents\` and no \`risk\`: nothing to select on, passed through (${p.tools.length}/${n.length}\
|
|
133
|
+
, capped at maxTools=${this.maxTools}). Declare ToolDescriptor.intents/risk to enable pruning`}}let s=r==="TOOL_ACTION",i=n.filter(p=>s||p.risk==="read"),a=p=>s&&p.risk!=="read",c=i.filter(p=>!a(p)),u=i.
|
|
134
|
+
filter(p=>a(p)),l=u.map(p=>({tool:p,score:this.scoreIntentMatch(e,p)})).sort((p,v)=>v.score-p.score).map(p=>p.tool),d=c.map(p=>({tool:p,score:this.scoreIntentMatch(e,p)})).filter(p=>p.score>0).sort((p,v)=>v.
|
|
135
|
+
score-p.score).map(p=>p.tool),f=[...l.slice(0,this.maxTools),...d.slice(0,Math.max(0,this.maxTools-u.length))].map(p=>({tool:p})).map(p=>p.tool).sort((p,v)=>p.id<v.id?-1:p.id>v.id?1:0);if(o!==void 0){
|
|
136
|
+
let p=this.freezer.read(o),v=(p?.turns??0)+1;if(p&&v>this.learningTurns){let x=new Set(p.ids),y=n.filter(E=>x.has(E.id));this.freezer.record(o,p.ids,v);let k=new Set(y.map(E=>E.id));return {tools:y,droppedIds:n.
|
|
137
|
+
filter(E=>!k.has(E.id)).map(E=>E.id),reason:`frozen tool set after ${this.learningTurns} turns (${y.length}/${n.length}): it no longer depends on this request's text, so the prefix cache survives`,setIsStable:true}}
|
|
138
|
+
let b=[...new Set([...p?.ids??[],...f.map(x=>x.id)])].sort().slice(0,this.maxTools);this.freezer.record(o,b,v);}let h=new Set(f.map(p=>p.id)),g=n.filter(p=>!h.has(p.id)).map(p=>p.id);return {tools:f,droppedIds:g,
|
|
139
|
+
reason:`selected ${f.length}/${n.length} by intent match (writes ${s?"allowed":"blocked"})`,setIsStable:g.length===0}}};function Xa(t,e){let n=Vt(t),r=0;for(let o of Array.isArray(e.intents)?e.intents:
|
|
140
|
+
[]){let s=Vt(o);s&&(n.includes(s)?r+=2:s.split(/\s+/).some(i=>i.length>3&&n.includes(i))&&(r+=1));}return r}function Qa(t){let e=new Set,n=[];for(let r of t){let o=r.hash??tc(r.text);e.has(o)||(e.add(o),n.push(r));}return n}function ec(t,e={maxDocuments:5}){let n=e.minDocuments??1,r=[...t].sort((i,a)=>(a.score??
|
|
141
|
+
0)-(i.score??0));if(r.length<=n)return r;let o=r[0]?.score??0;if(o<=0)return r.slice(0,e.maxDocuments);let s=[];for(let i of r){let a=(i.score??0)/o;if(s.length<n||a>=.4&&s.length<e.maxDocuments)s.push(
|
|
142
|
+
i);else break}return s}async function Fo(t,e){if(t.execution==="NO_RETRIEVAL"||t.execution==="TOOL_ACTION"||t.execution==="NON_CACHEABLE"||!e.retriever)return {docs:[],rounds:0,retrievedCount:0,keptCount:0};
|
|
143
|
+
let n=t.execution==="MULTI_HOP_RETRIEVAL"?Math.min(t.maxRounds,2):1,r=[];for(let i=0;i<n;i++){let a=await e.retriever.retrieve(t.query,t.maxDocuments*2);r.push(...a);}let o=r.length;r=Qa(r),e.reranker&&
|
|
144
|
+
(r=await e.reranker.rerank(t.query,r));let s=ec(r,{maxDocuments:t.maxDocuments});return {docs:s,rounds:n,retrievedCount:o,keptCount:s.length}}function tc(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function jd(){return {goals:[],confirmedFacts:{},userPreferences:{},decisions:[],openItems:[],evidenceRefs:[]}}function Bd(t,e){let n={goals:[...t.goals],confirmedFacts:{...t.confirmedFacts},userPreferences:{
|
|
145
|
+
...t.userPreferences},decisions:[...t.decisions],openItems:[...t.openItems],evidenceRefs:[...t.evidenceRefs]};for(let[r,o]of Object.entries(e.set??{}))r==="userPreferences"&&sc(o)?Object.assign(n.userPreferences,
|
|
146
|
+
o):n.confirmedFacts[r]=o;for(let[r,o]of Object.entries(e.append??{})){let s=rc(n,r);s?s.push(...o.map(String)):n.confirmedFacts[r]=o;}for(let r of e.remove??[])delete n.confirmedFacts[r],delete n.userPreferences[r],
|
|
147
|
+
oc(n,r);return n}function Fd(t){let e=t.rawTurns??3,n=[],r=nc(t.state);r&&n.push({role:"system",content:`Conversation state:
|
|
148
|
+
${r}`});let o=t.history.slice(-e);return n.push(...o,t.current),n}function nc(t){let e=[];return t.goals.length&&e.push(`goals: ${t.goals.join("; ")}`),Object.keys(t.confirmedFacts).length&&e.push(`fa\
|
|
143
149
|
cts: ${JSON.stringify(t.confirmedFacts)}`),Object.keys(t.userPreferences).length&&e.push(`preferences: ${JSON.stringify(t.userPreferences)}`),t.decisions.length&&e.push(`decisions: ${t.decisions.join(
|
|
144
150
|
"; ")}`),t.openItems.length&&e.push(`open: ${t.openItems.join("; ")}`),e.join(`
|
|
145
|
-
`)}function
|
|
146
|
-
for(let n of ["goals","decisions","openItems","evidenceRefs"]){let
|
|
147
|
-
`).filter(c=>c.trim().length>0).map(c=>({indent:
|
|
148
|
-
c[2],n),d=Number(c[1]),
|
|
149
|
-
match(/^\[(\d+)\]:\s*(.*)$/);if(
|
|
150
|
-
function
|
|
151
|
-
kind:
|
|
152
|
-
s<t.length;d++,s++){let
|
|
153
|
-
s]}function
|
|
154
|
-
let s=Number(
|
|
155
|
-
|
|
156
|
-
'"'?(
|
|
157
|
-
'"'):t==="null"?null:t==="true"?true:t==="false"?false:/^-?\d+$/.test(t)||/^-?\d*\.\d+$/.test(t)?Number(t):t}function
|
|
158
|
-
'"'):e}function
|
|
159
|
-
`)}function
|
|
160
|
-
e))
|
|
161
|
-
join(
|
|
162
|
-
return}
|
|
163
|
-
|
|
164
|
-
|
|
151
|
+
`)}function rc(t,e){switch(e){case "goals":return t.goals;case "decisions":return t.decisions;case "openItems":return t.openItems;case "evidenceRefs":return t.evidenceRefs;default:return null}}function oc(t,e){
|
|
152
|
+
for(let n of ["goals","decisions","openItems","evidenceRefs"]){let r=t[n].indexOf(e);r>=0&&t[n].splice(r,1);}}function sc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var zo={format:"json-compact",supports(){return true},encode(t){return JSON.stringify(t)},instruction(){return ""}};function $o(t,e={}){let n=e.delimiter??",",r=e.indent??" ",s=t.split(`
|
|
153
|
+
`).filter(c=>c.trim().length>0).map(c=>({indent:ic(c,r),content:c.slice(Vo(c,r))}));if(s.length===0)return {};let i=s[0];if(i.indent===0){let c=i.content.match(/^\[(\d+)\]\{(.*)\}:\s*$/);if(c){let l=Ke(
|
|
154
|
+
c[2],n),d=Number(c[1]),m=[];for(let f=0,h=1;f<d&&h<s.length;f++,h++){let g=s[h];if(g.indent!==1)break;let p=Ke(g.content,n),v={};l.forEach((b,x)=>{v[b]=ht(p[x]??"null");}),m.push(v);}return m}let u=i.content.
|
|
155
|
+
match(/^\[(\d+)\]:\s*(.*)$/);if(u){let l=u[2];return Number(u[1])===0||l.trim()===""?[]:Ke(l,n).map(ht)}}let[a]=Uo(s,0,0,n);return a}function Vo(t,e){let n=0;for(;t.startsWith(e,n);)n+=e.length;return n}
|
|
156
|
+
function ic(t,e){return Vo(t,e)/e.length}function Uo(t,e,n,r){let o={},s=e;for(;s<t.length;){let i=t[s];if(i.indent<n)break;if(i.indent>n){s++;continue}let a=ac(i.content,r);if(!a){s++;continue}let{key:c,
|
|
157
|
+
kind:u}=a;if(u.type==="scalar")o[c]=u.value,s++;else if(u.type==="inlineArray")o[c]=u.values,s++;else if(u.type==="emptyArray")o[c]=[],s++;else if(u.type==="table"){let l=[];s++;for(let d=0;d<u.count&&
|
|
158
|
+
s<t.length;d++,s++){let m=t[s];if(m.indent!==n+1)break;let f=Ke(m.content,r),h={};u.columns.forEach((g,p)=>{h[g]=ht(f[p]??"null");}),l.push(h);}o[c]=l;}else {let[l,d]=Uo(t,s+1,n+1,r);o[c]=l,s=d;}}return [o,
|
|
159
|
+
s]}function ac(t,e){let n=t.match(/^([^[:]+)\[(\d+)\]\{(.*)\}:\s*$/);if(n)return {key:Jt(n[1]),kind:{type:"table",count:Number(n[2]),columns:Ke(n[3],e)}};let r=t.match(/^([^[:]+)\[(\d+)\]:\s*(.*)$/);if(r){
|
|
160
|
+
let s=Number(r[2]),i=r[3];return s===0||i.trim()===""?{key:Jt(r[1]),kind:{type:"emptyArray"}}:{key:Jt(r[1]),kind:{type:"inlineArray",values:Ke(i,e).map(ht)}}}let o=t.match(/^([^:]+):\s*(.*)$/);if(o){let s=Jt(
|
|
161
|
+
o[1]),i=o[2];return i===""?{key:s,kind:{type:"object"}}:{key:s,kind:{type:"scalar",value:ht(i)}}}return null}function Ke(t,e){let n=[],r="",o=false;for(let s=0;s<t.length;s++){let i=t[s];o?i==='"'?t[s+1]===
|
|
162
|
+
'"'?(r+='"',s++):o=false:r+=i:i==='"'?o=true:i===e?(n.push(r),r=""):r+=i;}return n.push(r),n.map(s=>s.trim())}function ht(t){return t.startsWith('"')&&t.endsWith('"')&&t.length>=2?t.slice(1,-1).replace(/""/g,
|
|
163
|
+
'"'):t==="null"?null:t==="true"?true:t==="false"?false:/^-?\d+$/.test(t)||/^-?\d*\.\d+$/.test(t)?Number(t):t}function Jt(t){let e=t.trim();return e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1).replace(/""/g,
|
|
164
|
+
'"'):e}function cc(t,e={}){let n=e.delimiter??",",r=e.indent??" ",o=[];return ir(null,t,0,o,n,r),o.join(`
|
|
165
|
+
`)}function ir(t,e,n,r,o,s){let i=s.repeat(n),a=t===null?"":`${lc(t)}`;if(Array.isArray(e)){uc(a,e,n,r,o,s);return}if(sr(e)){t!==null&&r.push(`${i}${a}:`);let c=t===null?n:n+1;for(let[u,l]of Object.entries(
|
|
166
|
+
e))ir(u,l,c,r,o,s);return}r.push(`${i}${a}: ${Wt(e,o)}`);}function uc(t,e,n,r,o,s){let i=s.repeat(n),a=t===""?"":t;if(e.length===0){r.push(`${i}${a}[0]:`);return}if(e.every(or)){let d=e.map(m=>Wt(m,o)).
|
|
167
|
+
join(o);r.push(`${i}${a}[${e.length}]: ${d}`);return}let c=Gt(e);if(c){r.push(`${i}${a}[${e.length}]{${c.join(o)}}:`);let d=s.repeat(n+1);for(let m of e){let f=c.map(h=>Wt(m[h],o)).join(o);r.push(`${d}${f}`);}
|
|
168
|
+
return}r.push(`${i}${a}[${e.length}]:`);let u=n+1,l=s.repeat(u);for(let d of e)if(or(d))r.push(`${l}- ${Wt(d,o)}`);else {let m=[];ir(null,d,0,m,o,s);let[f,...h]=m;r.push(`${l}- ${f??""}`);for(let g of h)
|
|
169
|
+
r.push(`${l}${s}${g}`);}}function Gt(t){if(t.length===0)return null;let e=t[0];if(!sr(e))return null;let n=Object.keys(e);if(n.length===0)return null;let r=n.slice().sort().join("\0");for(let o of t){if(!sr(
|
|
170
|
+
o))return null;let s=Object.keys(o);if(s.slice().sort().join("\0")!==r)return null;for(let i of s)if(!or(o[i]))return null}return n}function lc(t){return /^[A-Za-z_][A-Za-z0-9_]*$/.test(t)?t:qo(t)}function Wt(t,e){
|
|
165
171
|
if(t==null)return "null";if(typeof t=="number")return Number.isFinite(t)?String(t):"null";if(typeof t=="boolean")return t?"true":"false";let n=String(t);return n===""||n.includes(e)||n.includes(`
|
|
166
|
-
`)||n.includes('"')||n!==n.trim()||/^(true|false|null)$/.test(n)||/^-?\d/.test(n)?
|
|
167
|
-
"number"||typeof t=="boolean"}function
|
|
168
|
-
ch following indented line is one row of delimiter-separated values. `key[N]: a,b` is an inline list. Quoted values use CSV-style escaping.";function
|
|
169
|
-
encode(e){return
|
|
170
|
-
`)},instruction(){return "Data is CSV: first line is the header row; each subsequent line is one record."}};function
|
|
171
|
-
'""')}"`:e}var
|
|
172
|
-
64,this.minSavingsRatio=e.minimumSavingsRatio??.08,this.qualityPenalty=e.qualityPenalty??(()=>0);}choose(e,n){let
|
|
173
|
-
e))continue;let u
|
|
174
|
-
|
|
175
|
-
return
|
|
176
|
-
ulted to JSON"}}let a=s,c="json baseline (no challenger cleared thresholds)";for(let
|
|
177
|
-
d>=this.minSavingsRatio&&
|
|
178
|
-
n)}catch{return false}}function
|
|
179
|
-
length)return false;for(let i=0;i<t.length;i++)if(!
|
|
180
|
-
call(e,i)||!
|
|
181
|
-
string":return "string";case "number":return "number";case "boolean":return "boolean";default:return}}function
|
|
182
|
-
e.type??
|
|
183
|
-
message:"expected boolean"});break;case "null":t!==null&&
|
|
184
|
-
message:"expected object"});return}let
|
|
185
|
-
Object.keys(e.properties));for(let i of Object.keys(
|
|
186
|
-
|
|
187
|
-
ms ${e.maxItems}`}),e.minItems!=null&&t.length<e.minItems&&
|
|
188
|
-
"string"){
|
|
189
|
-
minLength&&
|
|
190
|
-
sion: ${e.pattern}`});}
|
|
191
|
-
e.type==="integer"&&!Number.isInteger(t)&&
|
|
192
|
-
minimum&&
|
|
193
|
-
e,n,
|
|
194
|
-
.${
|
|
195
|
-
tring should set maxLength or use an enum`);}function
|
|
196
|
-
ate + repair"}}function
|
|
197
|
-
return
|
|
198
|
-
let
|
|
199
|
-
span:
|
|
200
|
-
originalTokens,protectedSpans:n.length,fidelityPassed:false,skipped:true,reason:"protected span lost during compression; fell back to original"}}}}var
|
|
201
|
-
compressedTokens:0,protectedSpans:(t.protectedSpans??[]).length,fidelityPassed:true,skipped:true,reason:"no compressor configured (noop)"}}};function
|
|
202
|
-
" ").replace(/\s+/g," ").trim(),
|
|
203
|
-
`)){let u
|
|
204
|
-
`)})(t)),s=n(e);return !(!
|
|
205
|
-
`),o=
|
|
206
|
-
options.data??
|
|
207
|
-
inputTokens:o,outputTokens:
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
172
|
+
`)||n.includes('"')||n!==n.trim()||/^(true|false|null)$/.test(n)||/^-?\d/.test(n)?qo(n):n}function qo(t){return `"${t.replace(/"/g,'""')}"`}function or(t){return t===null||typeof t=="string"||typeof t==
|
|
173
|
+
"number"||typeof t=="boolean"}function sr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var dc="Data is the compact encoder: `key[N]{c1,c2}:` declares an N-row table with columns c1,c2; ea\
|
|
174
|
+
ch following indented line is one row of delimiter-separated values. `key[N]: a,b` is an inline list. Quoted values use CSV-style escaping.";function pc(t={}){return {format:"compact-rows",supports(){return true},
|
|
175
|
+
encode(e){return cc(e,t)},instruction(){return dc},decode(e){return $o(e,t)}}}var Ho=pc();var Jo={format:"csv",supports(t){return Array.isArray(t)&&Gt(t)!==null},encode(t){let e=t,n=Gt(e),r=n.map(Ko).join(","),o=e.map(s=>n.map(i=>Ko(s[i])).join(","));return [r,...o].join(`
|
|
176
|
+
`)},instruction(){return "Data is CSV: first line is the header row; each subsequent line is one record."}};function Ko(t){if(t==null)return "";let e=String(t);return /[",\n]/.test(e)?`"${e.replace(/"/g,
|
|
177
|
+
'""')}"`:e}var Yt=class{tokenizer;serializers;minSavingsTokens;minSavingsRatio;qualityPenalty;constructor(e){this.tokenizer=e.tokenizer,this.serializers=e.serializers??[zo,Ho,Jo],this.minSavingsTokens=e.minimumSavingsTokens??
|
|
178
|
+
64,this.minSavingsRatio=e.minimumSavingsRatio??.08,this.qualityPenalty=e.qualityPenalty??(()=>0);}choose(e,n){let r={model:n.model,tokenizer:n.tokenizer},o=[];for(let u of this.serializers){if(!u.supports(
|
|
179
|
+
e))continue;let l=u.encode(e);if(u.format!=="json-compact"&&!fc(u,l,e))continue;let d=u.instruction(e),m=this.tokenizer.count(l,r),f=d?this.tokenizer.count(d,r):0,h=this.qualityPenalty(n.model??"",u.format);
|
|
180
|
+
o.push({format:u.format,encoded:l,instruction:d,payloadTokens:m,instructionTokens:f,penalty:h,total:m+f+h});}let s=o.find(u=>u.format==="json-compact"),i={};for(let u of o)i[u.format]=u.total;if(!s){let u=o[0];
|
|
181
|
+
return u?Wo(u,i,"json baseline unavailable"):{chosen:"json-compact",encoded:JSON.stringify(e),instruction:"",candidateTokens:i,instructionOverheadTokens:0,reason:"no serializer supported payload; defa\
|
|
182
|
+
ulted to JSON"}}let a=s,c="json baseline (no challenger cleared thresholds)";for(let u of o){if(u.format==="json-compact")continue;let l=s.total-u.total,d=s.total===0?0:l/s.total;l>=this.minSavingsTokens&&
|
|
183
|
+
d>=this.minSavingsRatio&&u.total<a.total&&(a=u,c=`${u.format} saved ${l} tokens (${(d*100).toFixed(1)}%) vs json`);}return Wo(a,i,c)}};function fc(t,e,n){if(!t.decode)return false;try{return ar(t.decode(e),
|
|
184
|
+
n)}catch{return false}}function ar(t,e){if(t===e)return true;if(t===null||e===null||typeof t!="object"||typeof e!="object")return false;let n=Array.isArray(t),r=Array.isArray(e);if(n||r){if(!n||!r||t.length!==e.
|
|
185
|
+
length)return false;for(let i=0;i<t.length;i++)if(!ar(t[i],e[i]))return false;return true}let o=Object.keys(t),s=Object.keys(e);if(o.length!==s.length)return false;for(let i of o)if(!Object.prototype.hasOwnProperty.
|
|
186
|
+
call(e,i)||!ar(t[i],e[i]))return false;return true}function Wo(t,e,n){return {chosen:t.format,encoded:t.encoded,instruction:t.instruction,candidateTokens:e,instructionOverheadTokens:t.instructionTokens,reason:n}}function ee(t,e,n="$"){let r=[];return cr(t,e,n,r),{valid:r.length===0,errors:r}}function mc(t){if(Array.isArray(t))return "array";if(t===null)return "null";switch(typeof t){case "object":return "object";case "\
|
|
187
|
+
string":return "string";case "number":return "number";case "boolean":return "boolean";default:return}}function cr(t,e,n,r){switch(e.enum&&!e.enum.some(s=>yc(s,t))&&r.push({path:n,message:"value not in enum"}),
|
|
188
|
+
e.type??mc(t)){case "object":hc(t,e,n,r);break;case "array":gc(t,e,n,r);break;case "string":bc(t,e,n,r);break;case "number":case "integer":vc(t,e,n,r);break;case "boolean":typeof t!="boolean"&&r.push({path:n,
|
|
189
|
+
message:"expected boolean"});break;case "null":t!==null&&r.push({path:n,message:"expected null"});break;}}function hc(t,e,n,r){if(typeof t!="object"||t===null||Array.isArray(t)){r.push({path:n,
|
|
190
|
+
message:"expected object"});return}let o=t;for(let s of e.required??[])s in o||r.push({path:`${n}.${s}`,message:"missing required property"});if(e.additionalProperties===false&&e.properties){let s=new Set(
|
|
191
|
+
Object.keys(e.properties));for(let i of Object.keys(o))s.has(i)||r.push({path:`${n}.${i}`,message:"additional property not allowed"});}if(e.properties)for(let[s,i]of Object.entries(e.properties))s in o&&
|
|
192
|
+
cr(o[s],i,`${n}.${s}`,r);}function gc(t,e,n,r){if(!Array.isArray(t)){r.push({path:n,message:"expected array"});return}e.maxItems!=null&&t.length>e.maxItems&&r.push({path:n,message:`array exceeds maxIte\
|
|
193
|
+
ms ${e.maxItems}`}),e.minItems!=null&&t.length<e.minItems&&r.push({path:n,message:`array below minItems ${e.minItems}`}),e.items&&t.forEach((o,s)=>cr(o,e.items,`${n}[${s}]`,r));}function bc(t,e,n,r){if(typeof t!=
|
|
194
|
+
"string"){r.push({path:n,message:"expected string"});return}if(e.maxLength!=null&&t.length>e.maxLength&&r.push({path:n,message:`string exceeds maxLength ${e.maxLength}`}),e.minLength!=null&&t.length<e.
|
|
195
|
+
minLength&&r.push({path:n,message:`string below minLength ${e.minLength}`}),e.pattern){let o=null;try{o=new RegExp(e.pattern);}catch{r.push({path:n,message:`schema pattern is not a valid regular expres\
|
|
196
|
+
sion: ${e.pattern}`});}o&&!o.test(t)&&r.push({path:n,message:"string does not match pattern"});}}function vc(t,e,n,r){if(typeof t!="number"||Number.isNaN(t)){r.push({path:n,message:"expected number"});return}
|
|
197
|
+
e.type==="integer"&&!Number.isInteger(t)&&r.push({path:n,message:"expected integer"}),e.maximum!=null&&t>e.maximum&&r.push({path:n,message:`number exceeds maximum ${e.maximum}`}),e.minimum!=null&&t<e.
|
|
198
|
+
minimum&&r.push({path:n,message:`number below minimum ${e.minimum}`});}function yc(t,e){return t===e?true:typeof t!=typeof e?false:t&&e&&typeof t=="object"?JSON.stringify(t)===JSON.stringify(e):false}var Zt=class{contracts=new Map;register(e){return this.contracts.set(e.contractId,e),this}resolve(e){return this.contracts.get(e)}has(e){return this.contracts.has(e)}static lint(e,n="$"){let r=[];return ur(
|
|
199
|
+
e,n,r),r}};function ur(t,e,n){if(t.type==="object"){t.additionalProperties!==false&&n.push(`${e}: object should set additionalProperties:false`);for(let[r,o]of Object.entries(t.properties??{}))ur(o,`${e}\
|
|
200
|
+
.${r}`,n);}t.type==="array"&&(t.maxItems==null&&n.push(`${e}: array should set maxItems to bound output`),t.items&&ur(t.items,`${e}[]`,n)),t.type==="string"&&t.maxLength==null&&!t.enum&&n.push(`${e}: s\
|
|
201
|
+
tring should set maxLength or use an enum`);}function Go(t,e,n){for(let r of n)if(r.supports(t,e))return {backend:r.id,reason:`first supporting backend: ${r.id}`};return {backend:"none",reason:"no constrained-decoding backend available; will valid\
|
|
202
|
+
ate + repair"}}function cp(t=()=>true){return {id:"provider-native",supports:t}}function lr(t){let e=t.minimumContextTokens??2e3,n=t.minimumNetTokens??200;if(t.contextTokens<e)return {compress:false,reason:`context ${t.contextTokens} < ${e} min`};let r=t.projectedEliminable-t.compressorCostTokens;
|
|
203
|
+
return r<n?{compress:false,reason:`net saving ${r} < ${n} min`}:{compress:true,reason:`net saving ${r} tokens`}}function hp(t){return {async compress(e){let n=e.protectedSpans??[],r=e.text,o=[];n.forEach((c,u)=>{
|
|
204
|
+
let l=`\0PROTECT_${u}\0`;o.push({token:l,span:c}),r=r.split(c.text).join(l);});let s=await t.compress({text:r,...e.targetRatio!=null?{targetRatio:e.targetRatio}:{}}),i=s.compressed,a=true;for(let{token:c,
|
|
205
|
+
span:u}of o){if(!i.includes(c)){a=false;break}i=i.split(c).join(u.text);}return a?{...s,compressed:i,protectedSpans:n.length,fidelityPassed:true}:{compressed:e.text,originalTokens:s.originalTokens,compressedTokens:s.
|
|
206
|
+
originalTokens,protectedSpans:n.length,fidelityPassed:false,skipped:true,reason:"protected span lost during compression; fell back to original"}}}}var gp={async compress(t){return {compressed:t.text,originalTokens:0,
|
|
207
|
+
compressedTokens:0,protectedSpans:(t.protectedSpans??[]).length,fidelityPassed:true,skipped:true,reason:"no compressor configured (noop)"}}};function Yo(t,e){let n=i=>i.toLowerCase().replace(/[.,;:!¡?¿()[\]{}"«»…]/g,
|
|
208
|
+
" ").replace(/\s+/g," ").trim(),o=n((i=>{let a=new Set,c=[];for(let u of i.split(`
|
|
209
|
+
`)){let l=u.trim();l&&a.has(l)||(l&&a.add(l),c.push(u));}return c.join(`
|
|
210
|
+
`)})(t)),s=n(e);return !(!tr(pt(o),pt(s))||mt(ft(o))!==mt(ft(s)))}var Zo=new WeakSet;function Xo(t){Zo.add(t);}function dr(t){return typeof t=="object"&&t!==null&&Zo.has(t)}var pr=class{id="mock";options;constructor(e={}){this.options=e,Xo(this);}async generate(e,n){let r=e.messages.map(c=>c.content).join(`
|
|
211
|
+
`),o=qe.count(r);if(e.tools&&e.tools.length>0){let c=JSON.stringify(e.tools.map(u=>({name:u.id,description:u.description,parameters:u.parameters??{}})));o+=qe.count(c);}let s,i=false;if(e.schema){let c=this.
|
|
212
|
+
options.data??Xt(e.schema);s=JSON.stringify(c),i=true;}else s=this.options.answer??`mock-response(${e.model})`;let a=Math.min(e.maxOutputTokens??Number.MAX_SAFE_INTEGER,qe.count(s));return {text:s,usage:{
|
|
213
|
+
inputTokens:o,outputTokens:a,...this.options.cachedInputTokens!=null?{cachedInputTokens:this.options.cachedInputTokens}:{}},structuredNatively:i}}async*generateStream(e){let n=await this.generate(e),r=Math.
|
|
214
|
+
max(1,this.options.streamChunkChars??8);for(let o=0;o<n.text.length;o+=r)yield {type:"text",delta:n.text.slice(o,o+r)};yield {type:"done",response:n};}};function Xt(t){if(t.enum&&t.enum.length>0)return t.
|
|
215
|
+
enum[0];switch(t.type){case "object":{let e={};for(let n of t.required??[]){let r=t.properties?.[n];e[n]=r?Xt(r):null;}for(let[n,r]of Object.entries(t.properties??{}))n in e||(e[n]=Xt(r));return e}case "\
|
|
216
|
+
array":return t.items?[Xt(t.items)]:[];case "string":return "mock";case "number":case "integer":return t.minimum??0;case "boolean":return true;case "null":return null;default:return null}}function Sp(t){return new pr(
|
|
217
|
+
t)}var Qo={flex:.5,default:1,auto:1,priority:1,fast:1,scale:1,standard:1,batch:.5},es=Math.min(...Object.values(Qo).filter(t=>t<1)),Qt="flex";function en(t){if(t==null||t==="")return null;let e=Qo[t];return e==
|
|
218
|
+
null?{servido:t,factor:null,conDescuento:false}:{servido:t,factor:e,conDescuento:e<1}}function ts(t,e){return !t||t.factor==null||!t.conDescuento||!Number.isFinite(e)||e<=0?null:e*(1-t.factor)}var xc="slo\
|
|
219
|
+
wer and variable: OpenAI publishes no latency commitment for the flex tier. What IS documented is the failure shape \u2014 the default SDK timeout is 10 minutes and a request that exceeds it returns 408, a\
|
|
220
|
+
nd when flex capacity is short the request returns 429 and is not charged. Do not put a deferrable request on a user-facing path.",kc="unchanged: this provider has no cheaper synchronous processing ti\
|
|
221
|
+
er, so nothing was asked for and the request was scheduled exactly as it would have been.",ns="this provider has no cheaper synchronous processing tier, so the request was sent unchanged and nothing i\
|
|
222
|
+
s credited; on this provider the deferred discount lives only in the asynchronous batch API, which is not a request/response call";function rs(t){return t==null||t===""?kc:t===Qt?xc:`unknown: this lay\
|
|
223
|
+
er has no published latency statement for the "${t}" tier.`}var os=new Set;function F(t,e){os.has(t)||(os.add(t),console.warn(e));}function gt(t){return {esquemaEnFormatoNativo:false,esquemaEstricto:false,esquemaPorPrompt:false,piezasDelAdaptador:t}}var wc=2;function Je(t){return wc*(t??[]).filter(e=>e.parameters==null).length}var tn=new WeakMap;
|
|
224
|
+
function We(t,e){return tn.set(t,e),t}function ss(t){return typeof t=="object"&&t!==null?tn.get(t):void 0}function is(t,e){let n=tn.get(t);return n&&tn.set(e,n),e}var fr=class{decoder;resto="";crPendiente=false;alPrincipio=true;datos="";evento="";ultimoId;push(e){let n=typeof e=="string"?e:(this.decoder??=new TextDecoder("utf-8")).decode(e,{stream:true});return this.procesar(
|
|
225
|
+
n)}end(){let e=[];if(this.decoder){let n=this.decoder.decode();n!==""&&e.push(...this.procesar(n));}return this.resto!==""&&(this.linea(this.resto,e),this.resto=""),this.despachar(e),this.crPendiente=false,
|
|
226
|
+
e}procesar(e){let n=[];if(e==="")return n;let r=e;if(this.alPrincipio&&(this.alPrincipio=false,r.charCodeAt(0)===65279&&(r=r.slice(1)),r===""))return n;let o=0;this.crPendiente&&(this.crPendiente=false,r.charCodeAt(
|
|
227
|
+
0)===10&&(o=1));let s=o;for(;o<r.length;){let i=r.charCodeAt(o);if(i!==10&&i!==13){o++;continue}this.linea(this.resto+r.slice(s,o),n),this.resto="",i===13&&(o+1<r.length?r.charCodeAt(o+1)===10&&o++:this.
|
|
228
|
+
crPendiente=true),o++,s=o;}return this.resto+=r.slice(s),n}linea(e,n){if(e===""){this.despachar(n);return}if(e.charCodeAt(0)===58)return;let r=e.indexOf(":"),o,s;switch(r===-1?(o=e,s=""):(o=e.slice(0,r),
|
|
229
|
+
s=e.slice(r+1),s.charCodeAt(0)===32&&(s=s.slice(1))),o){case "data":this.datos+=s+`
|
|
230
|
+
`;break;case "event":this.evento=s;break;case "id":s.includes("\0")||(this.ultimoId=s);break;}}despachar(e){if(this.datos===""){this.evento="";return}e.push({event:this.evento===""?"message":
|
|
231
|
+
this.evento,data:this.datos.slice(0,-1),...this.ultimoId!==void 0?{id:this.ultimoId}:{}}),this.datos="",this.evento="";}};async function*nn(t){let e=new fr;if(typeof t=="string"){yield*e.push(t),yield*e.
|
|
232
|
+
end();return}let n=t.getReader();try{for(;;){let{done:r,value:o}=await n.read();if(r)break;o!==void 0&&(yield*e.push(o));}yield*e.end();}finally{try{await n.cancel();}catch{}}}function Re(t){if(t==null||typeof t!="object")return true;let e=t,n=e.properties;if(n&&typeof n=="object"){if(e.additionalProperties!==false)return false;let o=Object.keys(n),s=Array.isArray(e.required)?e.required.
|
|
233
|
+
map(String):[];if(o.some(i=>!s.includes(i)))return false;for(let i of Object.values(n))if(!Re(i))return false}if(e.items!==void 0&&!Re(e.items))return false;for(let o of ["anyOf","oneOf","allOf"]){let s=e[o];if(Array.
|
|
234
|
+
isArray(s)&&s.some(i=>!Re(i)))return false}let r=e.$defs??e.definitions;return !(r&&typeof r=="object"&&Object.values(r).some(o=>!Re(o)))}function Sc(t){return !/response_format/i.test(t)||/invalid schema/i.
|
|
235
|
+
test(t)?false:/invalid parameter|not supported|unsupported|unrecognized request argument|unknown parameter/i.test(t)}function Tc(t){return `Respond with a single JSON object and nothing else: no prose, no\
|
|
219
236
|
explanation, no markdown code fences. The object must validate against this JSON Schema:
|
|
220
|
-
`+JSON.stringify(t)}var
|
|
221
|
-
opts
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
i.
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
(
|
|
230
|
-
|
|
231
|
-
no
|
|
232
|
-
n.
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
:
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
,
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
let
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
{}}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
let
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
237
|
+
`+JSON.stringify(t)}var Ec=/(^|\.)api\.openai\.com$|\.openai\.azure\.com$/i;function as(t,e,n){return e??Rc(n)?t.replace(/^[^/]+\//,""):t}function Rc(t){try{return Ec.test(new URL(t).hostname)}catch{return false}}
|
|
238
|
+
var cs=class{id;opts;fetchImpl;sinResponseFormat=new Set;streamOptionsRejected=false;constructor(e){this.opts=e,this.id=`openai-compatible:${e.baseUrl}`,this.fetchImpl=e.fetchImpl??fetch;}async generate(e,n){
|
|
239
|
+
let r=as(e.model,this.opts.stripProviderPrefix,this.opts.baseUrl),o=n?.signal,s=e.schema!=null&&!this.sinResponseFormat.has(r),i=await this.enviar(r,e,s,void 0,o);if(!i.ok&&i.status===400&&s){let a=await on(
|
|
240
|
+
i);if(!Sc(a))throw new Error(`provider ${i.status}: ${a}`);this.sinResponseFormat.add(r),F(`sin-response-format:${r}`,`[bvsala] Model "${r}" rejects \`response_format\` with a 400: it has no structured \
|
|
241
|
+
outputs. The request is repeated asking for the JSON via prompt (once only: the model is noted and the following requests go straight there). The schema still travels and the layer still validates, bu\
|
|
242
|
+
t the guarantee comes from the layer, not the provider, and the report says so: \`constraints.backend: "none"\`. To recover the native guarantee, use a model with structured outputs (gpt-4o or later).`),
|
|
243
|
+
s=false,i=await this.enviar(r,e,false,void 0,o);}if(!i.ok){let a=await on(i);throw new Error(`provider ${i.status}: ${a}`)}return this.leer(i,e,s)}async*generateStream(e,n={}){if(e.schema!=null||e.deferrable===
|
|
244
|
+
true){let y=await this.generate(e);y.text!==""&&(yield {type:"text",delta:y.text}),yield {type:"done",response:y};return}let r=as(e.model,this.opts.stripProviderPrefix,this.opts.baseUrl),o=n.signal,s=!this.
|
|
245
|
+
streamOptionsRejected,i=await this.enviar(r,e,false,{includeUsage:s,...o?{signal:o}:{}});if(!i.ok&&s&&(i.status===400||i.status===422)){let y=await on(i);if(i.status!==422&&!/stream_options|include_usage/i.
|
|
246
|
+
test(y))throw new Error(`provider ${i.status}: ${y}`);if(this.opts.requireUsage)throw new Error(`provider ${i.status}: this endpoint rejects stream_options, so a streamed answer would carry no usage a\
|
|
247
|
+
nd requireUsage is set. ${y}`);i=await this.enviar(r,e,false,{includeUsage:false,...o?{signal:o}:{}}),i.ok&&(this.streamOptionsRejected=true,F(`sin-stream-options:${this.opts.baseUrl}`,"[bvsala] This endpoint\
|
|
248
|
+
rejects `stream_options`, so streamed answers from it carry no usage: they are reported as `unmeasured` and never billed. Use `generate()` for a measured figure, or an endpoint that reports usage whe\
|
|
249
|
+
n streaming."));}if(!i.ok)throw new Error(`provider ${i.status}: ${await on(i)}`);if((i.headers.get("content-type")??"").includes("application/json")){let y=await this.leer(i,e,false);y.text!==""&&(yield {
|
|
250
|
+
type:"text",delta:y.text}),yield {type:"done",response:y};return}let a=i.body,c=a&&typeof a.getReader=="function"?a:await i.text(),u="",l=new Map,d,m,f,h=false;for await(let y of nn(c)){if(y.data==="[DONE\
|
|
251
|
+
]")break;let k;try{k=JSON.parse(y.data);}catch{continue}if(k===null||typeof k!="object")continue;if(k.error!=null){let I=k.error,O=typeof I.message=="string"?I.message:JSON.stringify(k.error);throw new Error(
|
|
252
|
+
`provider stream error: ${O}`)}let E=k.choices?.[0],w=E?.delta;(rn(w?.reasoning_content)||rn(w?.reasoning))&&(h=true),typeof w?.content=="string"&&w.content!==""&&(u+=w.content,yield {type:"text",delta:w.
|
|
253
|
+
content});for(let I of w?.tool_calls??[]){let O=typeof I.index=="number"?I.index:0,C=l.get(O)??{args:""};!C.id&&typeof I.id=="string"&&I.id!==""&&(C.id=I.id);let _=I.function?.name;!C.name&&typeof _==
|
|
254
|
+
"string"&&_!==""&&(C.name=_),typeof I.function?.arguments=="string"&&(C.args+=I.function.arguments),l.set(O,C);}E?.finish_reason!=null&&(d=E.finish_reason),k.usage!=null&&typeof k.usage=="object"&&(m=k.
|
|
255
|
+
usage),typeof k.service_tier=="string"&&k.service_tier!==""&&(f=k.service_tier);}if(d===void 0)throw new Error("provider stream ended before completion (no finish_reason)");let g=typeof m?.prompt_tokens!=
|
|
256
|
+
"number",p=typeof m?.completion_tokens!="number";if(this.opts.requireUsage&&(g||p))throw new Error(ls(m?.prompt_tokens,m?.completion_tokens));let v=us(m,h),b={inputTokens:m?.prompt_tokens??0,outputTokens:m?.
|
|
257
|
+
completion_tokens??0,...m?.prompt_tokens_details?.cached_tokens!=null?{cachedInputTokens:m.prompt_tokens_details.cached_tokens}:{},...v!==void 0?{reasoningTokens:v}:{},...g||p?{complete:false}:{}},x=[...l.
|
|
258
|
+
entries()].sort((y,k)=>y[0]-k[0]).map(([,y])=>({...y.id?{id:y.id}:{},name:y.name??"",arguments:y.args})).filter(y=>y.name!=="");yield {type:"done",response:We({text:u,...x.length>0?{toolCalls:x}:{},finishReason:d,
|
|
259
|
+
...f?{servedServiceTier:f}:{},usage:b,structuredNatively:false,raw:m??null},gt(Je(e.tools)))};}async enviar(e,n,r,o,s){let i=n.messages.map(c=>c.role==="tool"?{role:"tool",content:c.content,tool_call_id:c.
|
|
260
|
+
toolCallId??c.metadata?.tool_call_id,...c.name?{name:c.name}:{}}:c.role==="assistant"&&c.toolCalls&&c.toolCalls.length>0?{role:"assistant",content:c.content||null,tool_calls:c.toolCalls.map((u,l)=>({id:u.
|
|
261
|
+
id??`call_${l}`,type:"function",function:{name:u.name,arguments:u.arguments}}))}:{role:c.role,content:c.content});n.schema&&!r&&i.push({role:"system",content:Tc(n.schema)});let a={model:e,messages:i};
|
|
262
|
+
if(n.maxOutputTokens!=null&&(a.max_tokens=n.maxOutputTokens),n.temperature!=null&&(a.temperature=n.temperature),n.seed!=null&&(a.seed=n.seed),n.promptCacheKey!=null&&(a.prompt_cache_key=n.promptCacheKey),
|
|
263
|
+
n.deferrable===true&&(a.service_tier=Qt),n.schema&&r){let c=Re(n.schema);c||F("strict-incompatible","[bvsala] The response contract does not meet OpenAI's `strict` mode (in strict, `required` must list \
|
|
264
|
+
ALL the keys in `properties`, and every object needs `additionalProperties: false`). The schema is sent with `strict: false`: the model is still guided and the layer still validates, but the guarantee\
|
|
265
|
+
comes from the layer, not the provider. To recover it, make every key in the contract required."),a.response_format={type:"json_schema",json_schema:{name:"bvsala_contract",schema:n.schema,strict:c}};}
|
|
266
|
+
return n.tools&&n.tools.length>0&&(a.tools=n.tools.map(c=>({type:"function",function:{name:c.id,...c.description?{description:c.description}:{},parameters:c.parameters??{type:"object",properties:{}}}}))),
|
|
267
|
+
o&&(a.stream=true,o.includeUsage&&(a.stream_options={include_usage:true})),await this.fetchImpl(`${this.opts.baseUrl.replace(/\/$/,"")}/chat/completions`,{method:"POST",headers:{"content-type":"applicatio\
|
|
268
|
+
n/json",...this.opts.apiKey?{authorization:`Bearer ${this.opts.apiKey}`}:{},...this.opts.headers},body:JSON.stringify(a),...o?.signal?{signal:o.signal}:!o&&s?{signal:s}:{}})}async leer(e,n,r){let o=await e.
|
|
269
|
+
json(),s=o.choices?.[0]?.message,i=s?.content??"",a=(s?.tool_calls??[]).map(p=>({...p.id?{id:p.id}:{},name:p.function?.name??"",arguments:p.function?.arguments??""})).filter(p=>p.name!==""),c=o.usage??
|
|
270
|
+
{},u=c.prompt_tokens??0,l=c.completion_tokens??0,d=typeof c.prompt_tokens!="number",m=typeof c.completion_tokens!="number";if(this.opts.requireUsage&&(d||m))throw new Error(ls(c.prompt_tokens,c.completion_tokens));
|
|
271
|
+
let f=o.choices?.[0]?.finish_reason,h=typeof o.service_tier=="string"&&o.service_tier!==""?o.service_tier:void 0,g=us(c,rn(s?.reasoning_content)||rn(s?.reasoning));return We({text:i,...a.length>0?{toolCalls:a}:
|
|
272
|
+
{},...f?{finishReason:f}:{},...h?{servedServiceTier:h}:{},...n.deferrable===true?{requestedServiceTier:Qt}:{},usage:{inputTokens:u,outputTokens:l,...c.prompt_tokens_details?.cached_tokens!=null?{cachedInputTokens:c.
|
|
273
|
+
prompt_tokens_details.cached_tokens}:{},...g!==void 0?{reasoningTokens:g}:{},...d||m?{complete:false}:{}},structuredNatively:n.schema!=null&&r,raw:o},{esquemaEnFormatoNativo:n.schema!=null&&r,esquemaEstricto:n.
|
|
274
|
+
schema!=null&&r&&Re(n.schema),esquemaPorPrompt:n.schema!=null&&!r,piezasDelAdaptador:Je(n.tools)})}};function us(t,e){let n=t?.completion_tokens_details?.reasoning_tokens;if(!(typeof n!="number"||!Number.
|
|
275
|
+
isInteger(n)||n<0)&&!(n===0&&e))return n}function rn(t){return typeof t=="string"&&t!==""}function ls(t,e){return `provider returned incomplete usage (prompt=${t??"absent"}, completion=${e??"absent"});\
|
|
276
|
+
cannot measure cost. For gateways/streaming, ensure usage reporting is enabled.`}async function on(t){try{return (await t.text()).slice(0,500)}catch{return "<no body>"}}function ds(t){return `Respond with a single JSON object and nothing else: no prose, no explanation, no markdown code fences. The object must validate against this JSON Schema:
|
|
277
|
+
`+JSON.stringify(t)}var sn=4,Le="bvsala_contract",ps=class{id;opts;fetchImpl;constructor(e={}){this.opts=e,this.id=`anthropic:${e.baseUrl??"https://api.anthropic.com/v1"}`,this.fetchImpl=e.fetchImpl??fetch;}modeloEnElCable(e){
|
|
278
|
+
let n=this.opts.baseUrl??"https://api.anthropic.com/v1",r=false;try{r=/(^|\.)api\.anthropic\.com$/i.test(new URL(n).hostname);}catch{r=false;}return this.opts.stripProviderPrefix??r?e.replace(/^[^/]+\//,""):e}async generate(e,n){
|
|
279
|
+
let r=this.construirCuerpo(e),o=await this.enviar(r.body,n?.signal);if(!o.ok)throw new Error(`provider ${o.status}: ${await bs(o)}`);return this.leer(o,e,r.contratoNativo,r.turnoAnadido,r.esquemaPorPrompt)}async*generateStream(e,n={}){
|
|
280
|
+
if(e.schema!=null||e.deferrable===true){let y=await this.generate(e);y.text!==""&&(yield {type:"text",delta:y.text}),yield {type:"done",response:y};return}let r=this.construirCuerpo(e),o=r.body;o.stream=true;
|
|
281
|
+
let s=await this.enviar(o,n.signal);if(!s.ok)throw new Error(`provider ${s.status}: ${await bs(s)}`);if((s.headers.get("content-type")??"").includes("application/json")){let y=await this.leer(s,e,r.contratoNativo,
|
|
282
|
+
r.turnoAnadido,r.esquemaPorPrompt);y.text!==""&&(yield {type:"text",delta:y.text}),yield {type:"done",response:y};return}let i=s.body,a=i&&typeof i.getReader=="function"?i:await s.text(),c="",u=new Map,
|
|
283
|
+
l,d,m=false,f=false,h,g=false;for await(let y of nn(a)){let k;try{k=JSON.parse(y.data);}catch{continue}if(k===null||typeof k!="object")continue;let E=y.event!=="message"?y.event:k.type??y.event;if(E==="message_\
|
|
284
|
+
start")l=k.message?.usage??l;else if(E==="content_block_start"){let w=k.content_block;fs(w?.type)&&(g=true),typeof k.index=="number"&&w&&u.set(k.index,{tipo:w.type??"",...typeof w.id=="string"?{id:w.id}:
|
|
285
|
+
{},...typeof w.name=="string"?{name:w.name}:{},json:""});}else if(E==="content_block_delta"){let w=k.delta;if(w?.type==="text_delta"&&typeof w.text=="string"&&w.text!=="")c+=w.text,yield {type:"text",delta:w.
|
|
286
|
+
text};else if(w?.type==="input_json_delta"&&typeof w.partial_json=="string"){let I=typeof k.index=="number"?u.get(k.index):void 0;I&&(I.json+=w.partial_json);}}else if(E==="message_delta")m=true,h=k.delta?.
|
|
287
|
+
stop_reason??h,k.usage&&(d=hs(d,k.usage));else if(E==="message_stop"){f=true;break}else if(E==="error")throw new Error(`provider stream error: ${k.error?.type}: ${k.error?.message}`)}if(!f&&!m)throw new Error(
|
|
288
|
+
"provider stream ended before completion (no message_delta)");let p=hs(l,d),v;if(!m)v={inputTokens:0,outputTokens:0,complete:false};else {let y=p.cache_read_input_tokens,k=p.cache_creation_input_tokens;v=
|
|
289
|
+
{inputTokens:(p.input_tokens??0)+(k??0)+(y??0),outputTokens:d?.output_tokens??0,...y!=null?{cachedInputTokens:y}:{},...k!=null?{cacheWriteInputTokens:k}:{},...g||typeof d?.output_tokens!="number"?{}:{
|
|
290
|
+
reasoningTokens:0},...typeof p.input_tokens!="number"||typeof d?.output_tokens!="number"?{complete:false}:{}};}if(this.opts.requireUsage&&v.complete===false)throw new Error(gs(m?p.input_tokens:void 0,m?d?.output_tokens:
|
|
291
|
+
void 0));let b=[...u.entries()].sort((y,k)=>y[0]-k[0]).map(([,y])=>y).filter(y=>y.tipo==="tool_use"&&y.name!==Le).map(y=>({...y.id?{id:y.id}:{},name:y.name??"",arguments:Ic(y.json)})).filter(y=>y.name!==
|
|
292
|
+
""),x=typeof p.service_tier=="string"&&p.service_tier!==""?p.service_tier:void 0;yield {type:"done",response:We({text:c,...b.length>0?{toolCalls:b}:{},...h?{finishReason:ms(h)}:{},...x?{servedServiceTier:x}:
|
|
293
|
+
{},usage:v,structuredNatively:false,raw:{usage:p,stop_reason:h}},gt((r.turnoAnadido?1:0)+Je(e.tools)))};}async enviar(e,n){let r=(this.opts.baseUrl??"https://api.anthropic.com/v1").replace(/\/$/,"");return await this.
|
|
294
|
+
fetchImpl(`${r}/messages`,{method:"POST",headers:{"content-type":"application/json","anthropic-version":this.opts.apiVersion??"2023-06-01",...this.opts.apiKey?{"x-api-key":this.opts.apiKey}:{},...this.
|
|
295
|
+
opts.headers},body:JSON.stringify(e),...n?{signal:n}:{}})}construirCuerpo(e){let{system:n,messages:r,prefijoEnMensajes:o,prefijoEnSystem:s,turnoAnadido:i}=Cc(e);if(r.length===0)throw new Error("anthro\
|
|
296
|
+
pic: the request has no user/assistant message. The Messages API needs at least one, and system prompts travel in the `system` field \u2014 they do not count.");let a=(e.tools??[]).map(f=>({name:f.id,
|
|
297
|
+
...f.description?{description:f.description}:{},input_schema:f.parameters??{type:"object",properties:{}}})),c=false,u=false,l=false;if(e.schema){let f=a.length>0,h=a.some(p=>p.name===Le),g=Re(e.schema);h?(n.push(
|
|
298
|
+
{type:"text",text:ds(e.schema)}),u=true,F("anthropic-contrato-nombre-ocupado",`[bvsala] One of your tools is already named \`${Le}\`, so the output contract cannot travel as a tool without colliding with\
|
|
299
|
+
it (duplicate tool names are a provider error). The schema is sent as prompt text instead, which is measurably more expensive on this API. Rename that tool to get the cheaper path.`)):(!g&&!f&&F("ant\
|
|
300
|
+
hropic-strict-incompatible","[bvsala] The response contract does not meet `strict` mode (in strict, `required` must list ALL the keys in `properties`, and every object needs `additionalProperties: fal\
|
|
301
|
+
se`). The schema is sent without `strict`: the model is still guided and the layer still validates, but the guarantee comes from the layer, not the provider."),c=g&&!f,a.push({name:Le,description:f?"R\
|
|
302
|
+
eturn the final answer in the required shape. Use the other tools first if you need data; call this one instead of writing the answer as text.":"Return the final answer in the required shape.",input_schema:e.
|
|
303
|
+
schema,...c?{strict:true}:{}}),f&&(l=this.opts.forceAnswerThroughTool!==false,F("anthropic-contrato-con-herramientas","[bvsala] This request carries BOTH your tools and an output contract. On Anthropic's M\
|
|
304
|
+
essages API a specific shape is only GUARANTEED by forcing that exact tool, and forcing ours would leave the model unable to call yours. The contract travels as one extra tool"+(l?' and the request is\
|
|
305
|
+
sent with `tool_choice: {type: "any"}`, so the model must answer through SOME tool \u2014 yours or the contract \u2014 and can no longer reply in prose. Your tool turn is untouched. The guarantee is still the \
|
|
306
|
+
layer\'s, not the provider\'s (`constraints.backend: "none"`), because the model may pick one of your tools and defer the final answer to the next turn.':", not forced (`forceAnswerThroughTool: false`\
|
|
307
|
+
). The guarantee is the layer's, not the provider's (`constraints.backend: \"none\"`), and if the model answers in prose the layer pays a second full call to repair it \u2014 on this API that second call re-\
|
|
308
|
+
pays the whole tool-use overhead.")+" Dropping either the tools or the contract from this request is what makes the guarantee free.")));}let d={model:this.modeloEnElCable(e.model),max_tokens:e.maxOutputTokens??
|
|
309
|
+
this.opts.defaultMaxOutputTokens??4096,messages:r};n.length>0&&(d.system=n),e.temperature!=null&&(d.temperature=e.temperature),a.length>0&&(d.tools=a),c?d.tool_choice={type:"tool",name:Le}:l&&(d.tool_choice=
|
|
310
|
+
{type:"any"}),e.deferrable===true&&F("anthropic-sin-tier-diferible","[bvsala] This request was declared deferrable, but the Anthropic Messages API has NO cheaper synchronous tier: its `service_tier` cho\
|
|
311
|
+
oses between priority capacity (more expensive) and standard, not a flex. The request goes out unchanged and the report credits no discount. The 50% for deferring exists in the Message Batches API, wh\
|
|
312
|
+
ich is asynchronous and does not fit a request/response call.");let m=this.marcarCache(e,n,r,o,s);return this.opts.automaticCache===true&&e.stablePrefixMessages!=null&&m<Math.min(this.opts.maxCacheBreakpoints??
|
|
313
|
+
sn,sn)&&(d.cache_control={type:"ephemeral"}),{body:d,contratoNativo:c,turnoAnadido:i,esquemaPorPrompt:u}}marcarCache(e,n,r,o,s){if(e.promptCacheKey!=null,e.stablePrefixMessages==null)return 0;let i=Math.
|
|
314
|
+
min(this.opts.maxCacheBreakpoints??sn,sn);if(i<=0)return 0;let a=i,c=s>0?n[s-1]:void 0;if(c&&(c.cache_control={type:"ephemeral"},i-=1),i>0&&o>0){let u=r[Math.min(o,r.length)-1],l=u?.content[u.content.
|
|
315
|
+
length-1];l&&(l.cache_control={type:"ephemeral"},i-=1);}return a-i}async leer(e,n,r,o,s){let i=await e.json(),a=i.content??[],c=a.some(k=>fs(k.type)),u=a.filter(k=>k.type==="text").map(k=>k.text??"").join(
|
|
316
|
+
""),l=a.filter(k=>k.type==="tool_use"&&k.name!==Le).map(k=>({...k.id?{id:k.id}:{},name:k.name??"",arguments:JSON.stringify(k.input??{})})).filter(k=>k.name!==""),d=a.find(k=>k.type==="tool_use"&&k.name===
|
|
317
|
+
Le),m=d?JSON.stringify(d.input??{}):u,f=i.usage??{},h=f.cache_read_input_tokens,g=f.cache_creation_input_tokens,p=(f.input_tokens??0)+(g??0)+(h??0),v=f.output_tokens??0,b=typeof f.input_tokens!="numbe\
|
|
318
|
+
r",x=typeof f.output_tokens!="number";if(this.opts.requireUsage&&(b||x))throw new Error(gs(f.input_tokens,f.output_tokens));let y=typeof f.service_tier=="string"&&f.service_tier!==""?f.service_tier:void 0;
|
|
319
|
+
return We({text:m,...l.length>0?{toolCalls:l}:{},...i.stop_reason?{finishReason:ms(i.stop_reason)}:{},...y?{servedServiceTier:y}:{},usage:{inputTokens:p,outputTokens:v,...h!=null?{cachedInputTokens:h}:
|
|
320
|
+
{},...g!=null?{cacheWriteInputTokens:g}:{},...c||x?{}:{reasoningTokens:0},...b||x?{complete:false}:{}},structuredNatively:n.schema!=null&&r,raw:i},{...gt((o?1:0)+Je(n.tools)),esquemaPorPrompt:s})}};function Cc(t){
|
|
321
|
+
let e=[],n=[],r=t.stablePrefixMessages??0,o=0,s=0,i=true;t.messages.forEach((c,u)=>{if(c.role==="system"&&i){e.push({type:"text",text:c.content}),u<r&&(s=e.length);return}i=false,n.push({role:c.role==="ass\
|
|
322
|
+
istant"?"assistant":"user",content:[{type:"text",text:c.content}]}),u<r&&(o=n.length);});let a=false;return n.length>0&&n[0].role==="assistant"&&(n.unshift({role:"user",content:[{type:"text",text:"(contin\
|
|
323
|
+
ue)"}]}),o>0&&(o+=1),a=true),{system:e,messages:n,prefijoEnMensajes:o,prefijoEnSystem:s,turnoAnadido:a}}function fs(t){return t==="thinking"||t==="redacted_thinking"}function ms(t){switch(t){case "end_tu\
|
|
324
|
+
rn":return "stop";case "max_tokens":return "length";case "tool_use":return "tool_calls";case "refusal":return "content_filter";default:return t}}function hs(t,e){let n=Object.fromEntries(Object.entries(e??{}).
|
|
325
|
+
filter(([,o])=>o!=null)),r=t?.cache_creation||e?.cache_creation?{...t?.cache_creation??{},...e?.cache_creation??{}}:void 0;return {...t??{},...n,...r?{cache_creation:r}:{}}}function Ic(t){try{return JSON.
|
|
326
|
+
stringify(JSON.parse(t===""?"{}":t))}catch{return t}}function gs(t,e){return `provider returned incomplete usage (input=${t??"absent"}, output=${e??"absent"}); cannot measure cost.`}async function bs(t){
|
|
327
|
+
try{return (await t.text()).slice(0,500)}catch{return "<no body>"}}var bt=class{events=[];start;now;constructor(e=()=>Date.now()){this.now=e,this.start=e();}record(e,n,r){this.events.push({stage:e,outcome:n,...r?{detail:r}:{},atMs:this.now()-this.start});}elapsed(){return this.
|
|
328
|
+
now()-this.start}all(){return this.events}};var Ce=class extends Error{status;constructor(e,n){super(e),this.name="LicenseError",n&&(this.status=n);}};function mr(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"&&"BYTES_PER_ELEMENT"in t&&t.BYTES_PER_ELEMENT===1}function an(t,e=""){if(typeof t!="number"){let n=e&&
|
|
329
|
+
`"${e}" `;throw new TypeError(`${n}expected number, got ${typeof t}`)}if(!Number.isSafeInteger(t)||t<0){let n=e&&`"${e}" `;throw new RangeError(`${n}expected integer >= 0, got ${t}`)}}function ne(t,e,n=""){
|
|
330
|
+
let r=mr(t),o=t?.length,s=e!==void 0;if(!r||s&&o!==e){let i=n&&`"${n}" `,a=s?` of length ${e}`:"",c=r?`length=${o}`:`type=${typeof t}`,u=i+"expected Uint8Array"+a+", got "+c;throw r?new RangeError(u):
|
|
331
|
+
new TypeError(u)}return t}function hr(t,e=true){if(t.destroyed)throw new Error("Hash instance has been destroyed");if(e&&t.finished)throw new Error("Hash#digest() has already been called")}function ys(t,e){ne(t,void 0,"digestInt\
|
|
332
|
+
o() output");let n=e.outputLen;if(t.length<n)throw new RangeError('"digestInto() output" expected to be of length >='+n)}function vt(...t){for(let e=0;e<t.length;e++)t[e].fill(0);}function cn(t){return new DataView(t.buffer,t.byteOffset,t.byteLength)}var xs=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",_c=Array.from({length:256},(t,e)=>e.toString(16).padStart(2,"0"));function un(t){if(ne(t),xs)return t.toHex();
|
|
333
|
+
let e="";for(let n=0;n<t.length;n++)e+=_c[t[n]];return e}var ve={_0:48,_9:57,A:65,F:70,a:97,f:102};function vs(t){if(t>=ve._0&&t<=ve._9)return t-ve._0;if(t>=ve.A&&t<=ve.F)return t-(ve.A-10);if(t>=ve.a&&
|
|
334
|
+
t<=ve.f)return t-(ve.a-10)}function yt(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);if(xs)try{return Uint8Array.fromHex(t)}catch(o){throw o instanceof SyntaxError?
|
|
335
|
+
new RangeError(o.message):o}let e=t.length,n=e/2;if(e%2)throw new RangeError("hex string expected, got unpadded hex of length "+e);let r=new Uint8Array(n);for(let o=0,s=0;o<n;o++,s+=2){let i=vs(t.charCodeAt(
|
|
336
|
+
s)),a=vs(t.charCodeAt(s+1));if(i===void 0||a===void 0){let c=t[s]+t[s+1];throw new RangeError('hex string expected, got non-hex character "'+c+'" at index '+s)}r[o]=i*16+a;}return r}function gr(...t){let e=0;for(let r=0;r<t.length;r++){let o=t[r];ne(o),e+=o.length;}let n=new Uint8Array(e);for(let r=0,o=0;r<t.length;r++){let s=t[r];n.set(s,o),o+=s.length;}return n}function ks(t,e={}){let n=(o,s)=>t(s).update(o).digest(),r=t(void 0);return n.outputLen=r.outputLen,n.blockLen=r.blockLen,n.canXOF=r.canXOF,n.create=o=>t(o),Object.assign(n,e),Object.freeze(n)}function ws(t=32){
|
|
337
|
+
an(t,"bytesLength");let e=typeof globalThis=="object"?globalThis.crypto:null;if(typeof e?.getRandomValues!="function")throw new Error("crypto.getRandomValues must be defined");if(t>65536)throw new RangeError(
|
|
338
|
+
`"bytesLength" expected <= 65536, got ${t}`);return e.getRandomValues(new Uint8Array(t))}var Ss=t=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,t])});var ln=class{blockLen;outputLen;canXOF=false;padOffset;isLE;buffer;view;finished=false;length=0;pos=0;destroyed=false;constructor(e,n,r,o){this.blockLen=e,this.outputLen=n,this.padOffset=r,this.isLE=o,this.buffer=
|
|
339
|
+
new Uint8Array(e),this.view=cn(this.buffer);}update(e){hr(this),ne(e);let{view:n,buffer:r,blockLen:o}=this,s=e.length;for(let i=0;i<s;){let a=Math.min(o-this.pos,s-i);if(a===o){let c=cn(e);for(;o<=s-i;i+=
|
|
340
|
+
o)this.process(c,i);continue}r.set(e.subarray(i,i+a),this.pos),this.pos+=a,i+=a,this.pos===o&&(this.process(n,0),this.pos=0);}return this.length+=e.length,this.roundClean(),this}digestInto(e){hr(this),
|
|
341
|
+
ys(e,this),this.finished=true;let{buffer:n,view:r,blockLen:o,isLE:s}=this,{pos:i}=this;n[i++]=128,vt(this.buffer.subarray(i)),this.padOffset>o-i&&(this.process(r,0),i=0);for(let d=i;d<o;d++)n[d]=0;r.setBigUint64(
|
|
342
|
+
o-8,BigInt(this.length*8),s),this.process(r,0);let a=cn(e),c=this.outputLen;if(c%4)throw new Error("_sha2: outputLen must be aligned to 32bit");let u=c/4,l=this.get();if(u>l.length)throw new Error("_s\
|
|
343
|
+
ha2: outputLen bigger than state");for(let d=0;d<u;d++)a.setUint32(4*d,l[d],s);}digest(){let{buffer:e,outputLen:n}=this;this.digestInto(e);let r=e.slice(0,n);return this.destroy(),r}_cloneInto(e){e||=new this.
|
|
344
|
+
constructor,e.set(...this.get());let{blockLen:n,buffer:r,length:o,finished:s,destroyed:i,pos:a}=this;return e.destroyed=i,e.finished=s,e.length=o,e.pos=a,o%n&&e.buffer.set(r),e}clone(){return this._cloneInto()}};var J=Uint32Array.from([1779033703,4089235720,3144134277,2227873595,1013904242,4271175723,2773480762,1595750129,1359893119,2917565137,2600822924,725511199,528734635,4215389547,1541459225,327033209]);var dn=BigInt(4294967295),Ts=BigInt(32);function Pc(t,e=false){return e?{h:Number(t&dn),l:Number(t>>Ts&dn)}:{h:Number(t>>Ts&dn)|0,l:Number(t&dn)|0}}function Es(t,e=false){let n=t.length,r=new Uint32Array(n),
|
|
345
|
+
o=new Uint32Array(n);for(let s=0;s<n;s++){let{h:i,l:a}=Pc(t[s],e);[r[s],o[s]]=[i,a];}return [r,o]}var br=(t,e,n)=>t>>>n,vr=(t,e,n)=>t<<32-n|e>>>n,Ne=(t,e,n)=>t>>>n|e<<32-n,je=(t,e,n)=>t<<32-n|e>>>n,xt=(t,e,n)=>t<<64-n|e>>>n-32,kt=(t,e,n)=>t>>>n-32|e<<64-n;function ce(t,e,n,r){let o=(e>>>0)+(r>>>0);return {h:t+n+(o/2**32|0)|0,l:o|0}}var Rs=(t,e,n)=>(t>>>0)+(e>>>0)+(n>>>0),Cs=(t,e,n,r)=>e+n+r+(t/2**32|0)|0,Is=(t,e,n,r)=>(t>>>0)+(e>>>0)+(n>>>0)+(r>>>0),_s=(t,e,n,r,o)=>e+
|
|
346
|
+
n+r+o+(t/2**32|0)|0,Ps=(t,e,n,r,o)=>(t>>>0)+(e>>>0)+(n>>>0)+(r>>>0)+(o>>>0),Ds=(t,e,n,r,o,s)=>e+n+r+o+s+(t/2**32|0)|0;var Os=Es(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242",
|
|
291
347
|
"0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc6\
|
|
292
348
|
8b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","\
|
|
293
349
|
0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3\
|
|
@@ -295,294 +351,369 @@ c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a6
|
|
|
295
351
|
x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5d\
|
|
296
352
|
efb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0x\
|
|
297
353
|
eada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c1\
|
|
298
|
-
00d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map(t=>BigInt(t))),
|
|
299
|
-
super(128,e,16,false);}get(){let{Ah:e,Al:n,Bh:
|
|
300
|
-
e|0,this.Al=n|0,this.Bh=
|
|
301
|
-
16;x++,n+=4)
|
|
302
|
-
|
|
303
|
-
Gh:g,Gl:p,Hh:
|
|
304
|
-
|
|
305
|
-
let
|
|
306
|
-
|
|
307
|
-
f,
|
|
308
|
-
0;Dh=
|
|
309
|
-
xpected boolean, got type="+typeof t)}return t}function
|
|
310
|
-
"number"){let n=e&&`"${e}" `;throw new TypeError(n+"expected number, got type="+typeof t)}if(!Number.isSafeInteger(t)){let n=e&&`"${e}" `;throw new RangeError(n+"expected safe integer, got "+t)}}function
|
|
311
|
-
function
|
|
312
|
-
return
|
|
313
|
-
"expected valid "+t+": "+n+" <= n < "+
|
|
314
|
-
`param "${s}" is invalid: expected own property`);let c=t[s];if(a&&c===void 0)return;let
|
|
315
|
-
entries(s).forEach(([a,c])=>
|
|
316
|
-
ulus, got "+e);let n=t%e;return n>=
|
|
317
|
-
umber");if(e<=
|
|
318
|
-
"invert: does not exist");return
|
|
319
|
-
e),
|
|
320
|
-
e.ONE)),
|
|
321
|
-
eql(
|
|
322
|
-
1;)if(
|
|
323
|
-
"Cannot find square root");let d=n,
|
|
324
|
-
"Cannot find square root");let
|
|
325
|
-
t,e)&
|
|
326
|
-
reduce((o
|
|
327
|
-
id field: expected ORDER > 1, got "+t.ORDER);return t}function
|
|
328
|
-
for(;n>
|
|
329
|
-
reduceRight((a,c,
|
|
330
|
-
let n=
|
|
331
|
-
|
|
332
|
-
BITS=="number"&&(
|
|
333
|
-
freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));let{nBitLength:
|
|
334
|
-
048 bytes");this.ORDER=e,this.BITS=
|
|
335
|
-
"+typeof e);return
|
|
336
|
-
e*e,this.ORDER)}add(e,n){return
|
|
337
|
-
return e*e}addN(e,n){return e+n}subN(e,n){return e-n}mulN(e,n){return e*n}inv(e){return
|
|
338
|
-
isLE?
|
|
339
|
-
: expected "+
|
|
340
|
-
|
|
341
|
-
freeze(
|
|
342
|
-
throw new Error("invalid window size, expected [1.."+e+"], got W="+t)}function
|
|
343
|
-
shiftBy:i}}function
|
|
344
|
-
isNeg:
|
|
345
|
-
e.ZERO,this.Fn=e.Fn,this.bits=n;}_unsafeLadder(e,n,
|
|
346
|
-
i=e,a=i;for(let c=0;c<
|
|
347
|
-
i=
|
|
348
|
-
ZERO){let s=
|
|
349
|
-
get(n);return
|
|
350
|
-
e);return s===1?this._unsafeLadder(e,n,
|
|
351
|
-
ds"),!e||typeof e!="object")throw new Error(`expected valid ${t} CURVE object`);for(let c of ["p","n","h"]){let
|
|
352
|
-
let
|
|
353
|
-
freeze(Object.assign({},e)),{CURVE:e,Fp:
|
|
354
|
-
let n=e,
|
|
355
|
-
sqrt(
|
|
356
|
-
b,c),p}function
|
|
357
|
-
this.X=d("x",p),this.Y=d("y",
|
|
358
|
-
x:
|
|
359
|
-
|
|
360
|
-
"bad point: x=0 and x_0=1");return
|
|
361
|
-
return h.createCache(this,p),
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
let{a:p}=i,{X:
|
|
365
|
-
Y:
|
|
366
|
-
this.add(p.negate())}multiply(p){if(!s.isValidNot0(p))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");let{p:
|
|
367
|
-
if(!s.isValid(p))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return p===
|
|
368
|
-
return h.unsafe(this,i.n).is0()}toAffine(p){let
|
|
369
|
-
was invalid");return {x:
|
|
370
|
-
return `<Point ${this.is0()?"ZERO":this.toHex()}>`}}let h=new
|
|
371
|
-
this.ep=e;}static fromBytes(e){
|
|
372
|
-
return this.ep.toAffine(e)}toHex(){return
|
|
354
|
+
00d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map(t=>BigInt(t))),Oc=Os[0],Ac=Os[1],Ie=new Uint32Array(80),_e=new Uint32Array(80),yr=class extends ln{constructor(e){
|
|
355
|
+
super(128,e,16,false);}get(){let{Ah:e,Al:n,Bh:r,Bl:o,Ch:s,Cl:i,Dh:a,Dl:c,Eh:u,El:l,Fh:d,Fl:m,Gh:f,Gl:h,Hh:g,Hl:p}=this;return [e,n,r,o,s,i,a,c,u,l,d,m,f,h,g,p]}set(e,n,r,o,s,i,a,c,u,l,d,m,f,h,g,p){this.Ah=
|
|
356
|
+
e|0,this.Al=n|0,this.Bh=r|0,this.Bl=o|0,this.Ch=s|0,this.Cl=i|0,this.Dh=a|0,this.Dl=c|0,this.Eh=u|0,this.El=l|0,this.Fh=d|0,this.Fl=m|0,this.Gh=f|0,this.Gl=h|0,this.Hh=g|0,this.Hl=p|0;}process(e,n){for(let x=0;x<
|
|
357
|
+
16;x++,n+=4)Ie[x]=e.getUint32(n),_e[x]=e.getUint32(n+=4);for(let x=16;x<80;x++){let y=Ie[x-15]|0,k=_e[x-15]|0,E=Ne(y,k,1)^Ne(y,k,8)^br(y,k,7),w=je(y,k,1)^je(y,k,8)^vr(y,k,7),I=Ie[x-2]|0,O=_e[x-2]|0,C=Ne(
|
|
358
|
+
I,O,19)^xt(I,O,61)^br(I,O,6),_=je(I,O,19)^kt(I,O,61)^vr(I,O,6),T=Is(w,_,_e[x-7],_e[x-16]),R=_s(T,E,C,Ie[x-7],Ie[x-16]);Ie[x]=R|0,_e[x]=T|0;}let{Ah:r,Al:o,Bh:s,Bl:i,Ch:a,Cl:c,Dh:u,Dl:l,Eh:d,El:m,Fh:f,Fl:h,
|
|
359
|
+
Gh:g,Gl:p,Hh:v,Hl:b}=this;for(let x=0;x<80;x++){let y=Ne(d,m,14)^Ne(d,m,18)^xt(d,m,41),k=je(d,m,14)^je(d,m,18)^kt(d,m,41),E=d&f^~d&g,w=m&h^~m&p,I=Ps(b,k,w,Ac[x],_e[x]),O=Ds(I,v,y,E,Oc[x],Ie[x]),C=I|0,
|
|
360
|
+
_=Ne(r,o,28)^xt(r,o,34)^xt(r,o,39),T=je(r,o,28)^kt(r,o,34)^kt(r,o,39),R=r&s^r&a^s&a,D=o&i^o&c^i&c;v=g|0,b=p|0,g=f|0,p=h|0,f=d|0,h=m|0,{h:d,l:m}=ce(u|0,l|0,O|0,C|0),u=a|0,l=c|0,a=s|0,c=i|0,s=r|0,i=o|0;
|
|
361
|
+
let M=Rs(C,T,D);r=Cs(M,O,_,R),o=M|0;}(({h:r,l:o}=ce(this.Ah|0,this.Al|0,r|0,o|0))),{h:s,l:i}=ce(this.Bh|0,this.Bl|0,s|0,i|0),{h:a,l:c}=ce(this.Ch|0,this.Cl|0,a|0,c|0),{h:u,l}=ce(this.Dh|0,this.Dl|0,u|0,l|
|
|
362
|
+
0),{h:d,l:m}=ce(this.Eh|0,this.El|0,d|0,m|0),{h:f,l:h}=ce(this.Fh|0,this.Fl|0,f|0,h|0),{h:g,l:p}=ce(this.Gh|0,this.Gl|0,g|0,p|0),{h:v,l:b}=ce(this.Hh|0,this.Hl|0,v|0,b|0),this.set(r,o,s,i,a,c,u,l,d,m,
|
|
363
|
+
f,h,g,p,v,b);}roundClean(){vt(Ie,_e);}destroy(){this.destroyed=true,vt(this.buffer),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}},xr=class extends yr{Ah=J[0]|0;Al=J[1]|0;Bh=J[2]|0;Bl=J[3]|0;Ch=J[4]|0;Cl=J[5]|
|
|
364
|
+
0;Dh=J[6]|0;Dl=J[7]|0;Eh=J[8]|0;El=J[9]|0;Fh=J[10]|0;Fl=J[11]|0;Gh=J[12]|0;Gl=J[13]|0;Hh=J[14]|0;Hl=J[15]|0;constructor(){super(64);}};var pn=ks(()=>new xr,Ss(3));var U=(t,e,n)=>ne(t,e,n),wr=an,Sr=un,ue=(...t)=>gr(...t),As=t=>yt(t),hn=mr,Ms=t=>ws(t),mn=BigInt(0),kr=BigInt(1);function Ge(t,e=""){if(typeof t!="boolean"){let n=e&&`"${e}" `;throw new TypeError(n+"e\
|
|
365
|
+
xpected boolean, got type="+typeof t)}return t}function Mc(t){if(typeof t=="bigint"){if(!fn(t))throw new RangeError("positive bigint expected, got "+t)}else wr(t);return t}function ye(t,e=""){if(typeof t!=
|
|
366
|
+
"number"){let n=e&&`"${e}" `;throw new TypeError(n+"expected number, got type="+typeof t)}if(!Number.isSafeInteger(t)){let n=e&&`"${e}" `;throw new RangeError(n+"expected safe integer, got "+t)}}function Ls(t){if(typeof t!="string")throw new TypeError("hex string expected, got "+typeof t);return t===""?mn:BigInt("0x"+t)}function Tr(t){return Ls(un(t))}function xe(t){return Ls(un(wt(ne(t)).reverse()))}
|
|
367
|
+
function Er(t,e){if(an(e),e===0)throw new RangeError("zero length");t=Mc(t);let n=t.toString(16);if(n.length>e*2)throw new RangeError("number too large");return yt(n.padStart(e*2,"0"))}function Ns(t,e){
|
|
368
|
+
return Er(t,e).reverse()}function js(t,e){if(t=U(t),e=U(e),t.length!==e.length)return false;let n=0;for(let r=0;r<t.length;r++)n|=t[r]^e[r];return n===0}function wt(t){return Uint8Array.from(U(t))}var fn=t=>typeof t=="bigint"&&mn<=t;function Lc(t,e,n){return fn(t)&&fn(e)&&fn(n)&&e<=t&&t<n}function Rr(t,e,n,r){if(!Lc(e,n,r))throw new RangeError(
|
|
369
|
+
"expected valid "+t+": "+n+" <= n < "+r+", got "+e)}function Cr(t){if(t<mn)throw new Error("expected non-negative bigint, got "+t);let e;for(e=0;t>mn;t>>=kr,e+=1);return e}var Bs=t=>(kr<<BigInt(t))-kr;function Be(t,e={},n={}){if(Object.prototype.toString.call(t)!=="[object Object]")throw new TypeError("expected valid options object");function r(s,i,a){if(!a&&i!=="function"&&!Object.hasOwn(t,s))throw new TypeError(
|
|
370
|
+
`param "${s}" is invalid: expected own property`);let c=t[s];if(a&&c===void 0)return;let u=typeof c;if(u!==i||c===null)throw new TypeError(`param "${s}" is invalid: expected ${i}, got ${u}`)}let o=(s,i)=>Object.
|
|
371
|
+
entries(s).forEach(([a,c])=>r(a,c,i));o(e,false),o(n,true);}var Ir=()=>{throw new Error("not implemented")};var W=BigInt(0),H=BigInt(1),Fe=BigInt(2),Vs=BigInt(3),Us=BigInt(4),qs=BigInt(5),Nc=BigInt(7),Hs=BigInt(8),jc=BigInt(9),Ks=BigInt(16);function z(t,e){if(e<=W)throw new Error("mod: expected positive mod\
|
|
372
|
+
ulus, got "+e);let n=t%e;return n>=W?n:e+n}function re(t,e,n){if(e<W)throw new Error("pow2: expected non-negative exponent, got "+e);let r=t;for(;e-- >W;)r*=r,r%=n;return r}function Fs(t,e){if(t===W)throw new Error("invert: expected non-zero n\
|
|
373
|
+
umber");if(e<=W)throw new Error("invert: expected positive modulus, got "+e);let n=z(t,e),r=e,o=W,i=H;for(;n!==W;){let u=r/n,l=r-n*u,d=o-i*u;r=n,n=l,o=i,i=d;}if(r!==H)throw new Error(
|
|
374
|
+
"invert: does not exist");return z(o,e)}function _r(t,e,n){let r=t;if(!r.eql(r.sqr(e),n))throw new Error("Cannot find square root")}function Js(t,e){let n=t,r=(n.ORDER+H)/Us,o=n.pow(e,r);return _r(n,o,
|
|
375
|
+
e),o}function Bc(t,e){let n=t,r=(n.ORDER-qs)/Hs,o=n.mul(e,Fe),s=n.pow(o,r),i=n.mul(e,s),a=n.mul(n.mul(i,Fe),s),c=n.mul(i,n.sub(a,n.ONE));return _r(n,c,e),c}function Fc(t){let e=yn(t),n=Ws(t),r=n(e,e.neg(
|
|
376
|
+
e.ONE)),o=n(e,r),s=n(e,e.neg(r)),i=(t+Nc)/Ks;return((a,c)=>{let u=a,l=u.pow(c,i),d=u.mul(l,r),m=u.mul(l,o),f=u.mul(l,s),h=u.eql(u.sqr(d),c),g=u.eql(u.sqr(m),c);l=u.cmov(l,d,h),d=u.cmov(f,m,g);let p=u.
|
|
377
|
+
eql(u.sqr(d),c),v=u.cmov(l,d,p);return _r(u,v,c),v})}function Ws(t){if(t<Vs)throw new Error("sqrt is not defined for small field");let e=t-H,n=0;for(;e%Fe===W;)e/=Fe,n++;let r=Fe,o=yn(t);for(;zs(o,r)===
|
|
378
|
+
1;)if(r++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(n===1)return Js;let s=o.pow(r,e),i=(e+H)/Fe;return function(c,u){let l=c;if(l.is0(u))return u;if(zs(l,u)!==1)throw new Error(
|
|
379
|
+
"Cannot find square root");let d=n,m=l.mul(l.ONE,s),f=l.pow(u,e),h=l.pow(u,i);for(;!l.eql(f,l.ONE);){if(l.is0(f))return l.ZERO;let g=1,p=l.sqr(f);for(;!l.eql(p,l.ONE);)if(g++,p=l.sqr(p),g===d)throw new Error(
|
|
380
|
+
"Cannot find square root");let v=H<<BigInt(d-g-1),b=l.pow(m,v);d=g,m=l.sqr(b),f=l.mul(f,m),h=l.mul(h,b);}return h}}function zc(t){return t%Us===Vs?Js:t%Hs===qs?Bc:t%Ks===jc?Fc(t):Ws(t)}var ke=(t,e)=>(z(
|
|
381
|
+
t,e)&H)===H,$c=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function Gs(t){let e={ORDER:"bigint",BYTES:"number",BITS:"number"},n=$c.
|
|
382
|
+
reduce((r,o)=>(r[o]="function",r),e);if(Be(t,n),ye(t.BYTES,"BYTES"),ye(t.BITS,"BITS"),t.BYTES<1||t.BITS<1)throw new Error("invalid field: expected BYTES/BITS > 0");if(t.ORDER<=H)throw new Error("inval\
|
|
383
|
+
id field: expected ORDER > 1, got "+t.ORDER);return t}function Vc(t,e,n){let r=t;if(n<W)throw new Error("invalid exponent, negatives unsupported");if(n===W)return r.ONE;if(n===H)return e;let o=r.ONE,s=e;
|
|
384
|
+
for(;n>W;)n&H&&(o=r.mul(o,s)),s=r.sqr(s),n>>=H;return o}function vn(t,e,n=false){let r=t,o=new Array(e.length).fill(n?r.ZERO:void 0),s=e.reduce((a,c,u)=>r.is0(c)?a:(o[u]=a,r.mul(a,c)),r.ONE),i=r.inv(s);return e.
|
|
385
|
+
reduceRight((a,c,u)=>r.is0(c)?a:(o[u]=r.mul(a,o[u]),r.mul(a,c)),i),o}function zs(t,e){let n=t,r=(n.ORDER-H)/Fe,o=n.pow(e,r),s=n.eql(o,n.ONE),i=n.eql(o,n.ZERO),a=n.eql(o,n.neg(n.ONE));if(!s&&!i&&!a)throw new Error("invalid Legendre symbol result");return s?1:i?0:-1}function Uc(t,e){if(e!==void 0&&wr(e),t<=W)throw new Error("invalid n length: expected positive n, got "+t);if(e!==void 0&&e<1)throw new Error("invalid n length: expected positive bit length, got "+e);
|
|
386
|
+
let n=Cr(t);if(e!==void 0&&e<n)throw new Error(`invalid n length: expected bit length (${n}) >= n.length (${e})`);let r=e!==void 0?e:n,o=Math.ceil(r/8);return {nBitLength:r,nByteLength:o}}var $s=new WeakMap,
|
|
387
|
+
bn=class{ORDER;BITS;BYTES;isLE;ZERO=W;ONE=H;_lengths;_mod;constructor(e,n={}){if(e<=H)throw new Error("invalid field: expected ORDER > 1, got "+e);let r;this.isLE=false,n!=null&&typeof n=="object"&&(typeof n.
|
|
388
|
+
BITS=="number"&&(r=n.BITS),typeof n.sqrt=="function"&&Object.defineProperty(this,"sqrt",{value:n.sqrt,enumerable:true}),typeof n.isLE=="boolean"&&(this.isLE=n.isLE),n.allowedLengths&&(this._lengths=Object.
|
|
389
|
+
freeze(n.allowedLengths.slice())),typeof n.modFromBytes=="boolean"&&(this._mod=n.modFromBytes));let{nBitLength:o,nByteLength:s}=Uc(e,r);if(s>2048)throw new Error("invalid field: expected ORDER of <= 2\
|
|
390
|
+
048 bytes");this.ORDER=e,this.BITS=o,this.BYTES=s,Object.freeze(this);}create(e){return z(e,this.ORDER)}isValid(e){if(typeof e!="bigint")throw new TypeError("invalid field element: expected bigint, got\
|
|
391
|
+
"+typeof e);return W<=e&&e<this.ORDER}is0(e){return e===W}isValidNot0(e){return !this.is0(e)&&this.isValid(e)}isOdd(e){return (e&H)===H}neg(e){return z(-e,this.ORDER)}eql(e,n){return e===n}sqr(e){return z(
|
|
392
|
+
e*e,this.ORDER)}add(e,n){return z(e+n,this.ORDER)}sub(e,n){return z(e-n,this.ORDER)}mul(e,n){return z(e*n,this.ORDER)}pow(e,n){return Vc(this,e,n)}div(e,n){return z(e*Fs(n,this.ORDER),this.ORDER)}sqrN(e){
|
|
393
|
+
return e*e}addN(e,n){return e+n}subN(e,n){return e-n}mulN(e,n){return e*n}inv(e){return Fs(e,this.ORDER)}sqrt(e){let n=$s.get(this);return n||$s.set(this,n=zc(this.ORDER)),n(this,e)}toBytes(e){return this.
|
|
394
|
+
isLE?Ns(e,this.BYTES):Er(e,this.BYTES)}fromBytes(e,n=false){U(e);let{_lengths:r,BYTES:o,isLE:s,ORDER:i,_mod:a}=this;if(r){if(e.length<1||!r.includes(e.length)||e.length>o)throw new Error("Field.fromBytes\
|
|
395
|
+
: expected "+r+" bytes, got "+e.length);let u=new Uint8Array(o);u.set(e,s?0:u.length-e.length),e=u;}if(e.length!==o)throw new Error("Field.fromBytes: expected "+o+" bytes, got "+e.length);let c=s?xe(e):
|
|
396
|
+
Tr(e);if(a&&(c=z(c,i)),!n&&!this.isValid(c))throw new Error("invalid field element: outside of range 0..ORDER");return c}invertBatch(e){return vn(this,e)}cmov(e,n,r){return Ge(r,"condition"),r?n:e}};Object.
|
|
397
|
+
freeze(bn.prototype);function yn(t,e={}){return new bn(t,e)}var xn=BigInt(0),Ar=BigInt(1);function Ys(t,e){let n=e.negate();return t?n:e}function wn(t,e){let n=vn(t.Fp,e.map(r=>r.Z));return e.map((r,o)=>t.fromAffine(r.toAffine(n[o])))}function ei(t,e){if(!Number.isSafeInteger(t)||t<=0||t>e)
|
|
398
|
+
throw new Error("invalid window size, expected [1.."+e+"], got W="+t)}function Pr(t,e){ei(t,e);let n=Math.ceil(e/t)+1,r=2**(t-1),o=2**t,s=Bs(t),i=BigInt(t);return {windows:n,windowSize:r,mask:s,maxNumber:o,
|
|
399
|
+
shiftBy:i}}function Zs(t,e,n){let{windowSize:r,mask:o,maxNumber:s,shiftBy:i}=n,a=Number(t&o),c=t>>i;a>r&&(a-=s,c+=Ar);let u=e*r,l=u+Math.abs(a)-1,d=a===0,m=a<0,f=e%2!==0;return {nextN:c,offset:l,isZero:d,
|
|
400
|
+
isNeg:m,isNegF:f,offsetF:u}}var Dr=new WeakMap,ti=new WeakMap;function Or(t){return ti.get(t)||1}function Xs(t){if(t!==xn)throw new Error("invalid wNAF")}var kn=class{BASE;ZERO;Fn;bits;constructor(e,n){this.BASE=e.BASE,this.ZERO=
|
|
401
|
+
e.ZERO,this.Fn=e.Fn,this.bits=n;}_unsafeLadder(e,n,r=this.ZERO){let o=e;for(;n>xn;)n&Ar&&(r=r.add(o)),o=o.double(),n>>=Ar;return r}precomputeWindow(e,n){let{windows:r,windowSize:o}=Pr(n,this.bits),s=[],
|
|
402
|
+
i=e,a=i;for(let c=0;c<r;c++){a=i,s.push(a);for(let u=1;u<o;u++)a=a.add(i),s.push(a);i=a.double();}return s}wNAF(e,n,r){if(!this.Fn.isValid(r))throw new Error("invalid scalar");let o=this.ZERO,s=this.BASE,
|
|
403
|
+
i=Pr(e,this.bits);for(let a=0;a<i.windows;a++){let{nextN:c,offset:u,isZero:l,isNeg:d,isNegF:m,offsetF:f}=Zs(r,a,i);r=c,l?s=s.add(Ys(m,n[f])):o=o.add(Ys(d,n[u]));}return Xs(r),{p:o,f:s}}wNAFUnsafe(e,n,r,o=this.
|
|
404
|
+
ZERO){let s=Pr(e,this.bits);for(let i=0;i<s.windows&&r!==xn;i++){let{nextN:a,offset:c,isZero:u,isNeg:l}=Zs(r,i,s);if(r=a,!u){let d=n[c];o=o.add(l?d.negate():d);}}return Xs(r),o}getPrecomputes(e,n,r){let o=Dr.
|
|
405
|
+
get(n);return o||(o=this.precomputeWindow(n,e),e!==1&&(typeof r=="function"&&(o=r(o)),Dr.set(n,o))),o}cached(e,n,r){let o=Or(e);return this.wNAF(o,this.getPrecomputes(o,e,r),n)}unsafe(e,n,r,o){let s=Or(
|
|
406
|
+
e);return s===1?this._unsafeLadder(e,n,o):this.wNAFUnsafe(s,this.getPrecomputes(s,e,r),n,o)}createCache(e,n){ei(n,this.bits),ti.set(e,n),Dr.delete(e);}hasCache(e){return Or(e)!==1}};function Qs(t,e,n){if(e){if(e.ORDER!==t)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return Gs(e),e}else return yn(t,{isLE:n})}function ni(t,e,n={},r){if(r===void 0&&(r=t==="edwar\
|
|
407
|
+
ds"),!e||typeof e!="object")throw new Error(`expected valid ${t} CURVE object`);for(let c of ["p","n","h"]){let u=e[c];if(!(typeof u=="bigint"&&u>xn))throw new Error(`CURVE.${c} must be positive bigint`)}
|
|
408
|
+
let o=Qs(e.p,n.Fp,r),s=Qs(e.n,n.Fn,r),a=["Gx","Gy","a","d"];for(let c of a)if(!o.isValid(e[c]))throw new Error(`CURVE.${c} must be valid field element of CURVE.Fp`);return e=Object.
|
|
409
|
+
freeze(Object.assign({},e)),{CURVE:e,Fp:o,Fn:s}}function ri(t,e){return function(r){let o=t(r);return {secretKey:o,publicKey:e(o)}}}var Pe=BigInt(0),K=BigInt(1),Mr=BigInt(2),qc=BigInt(8);function Hc(t,e,n,r){let o=t.sqr(n),s=t.sqr(r),i=t.add(t.mul(e.a,o),s),a=t.add(t.ONE,t.mul(e.d,t.mul(o,s)));return t.eql(i,a)}function oi(t,e={}){
|
|
410
|
+
let n=e,r=ni("edwards",t,n,n.FpFnLE),{Fp:o,Fn:s}=r,i=r.CURVE,{h:a}=i;Be(n,{},{uvRatio:"function"});let c=Mr<<BigInt(s.BYTES*8)-K,u=g=>o.create(g),l=n.uvRatio===void 0?(g,p)=>{try{return {isValid:!0,value:o.
|
|
411
|
+
sqrt(o.div(g,p))}}catch{return {isValid:false,value:Pe}}}:n.uvRatio;if(!Hc(o,i,i.Gx,i.Gy))throw new Error("bad curve params: generator point");function d(g,p,v=false){let b=v?K:Pe;return Rr("coordinate "+g,p,
|
|
412
|
+
b,c),p}function m(g){if(!(g instanceof f))throw new Error("EdwardsPoint expected")}class f{static BASE=new f(i.Gx,i.Gy,K,u(i.Gx*i.Gy));static ZERO=new f(Pe,K,K,Pe);static Fp=o;static Fn=s;X;Y;Z;T;constructor(p,v,b,x){
|
|
413
|
+
this.X=d("x",p),this.Y=d("y",v),this.Z=d("z",b,true),this.T=d("t",x),Object.freeze(this);}static CURVE(){return i}static fromAffine(p){if(p instanceof f)throw new Error("extended point not allowed");let{
|
|
414
|
+
x:v,y:b}=p||{};return d("x",v),d("y",b),new f(v,b,K,u(v*b))}static fromBytes(p,v=false){let b=o.BYTES,{a:x,d:y}=i;p=wt(U(p,b,"point")),Ge(v,"zip215");let k=wt(p),E=p[b-1];k[b-1]=E&-129;let w=xe(k),I=v?c:
|
|
415
|
+
o.ORDER;Rr("point.y",w,Pe,I);let O=u(w*w),C=u(O-K),_=u(y*O-x),{isValid:T,value:R}=l(C,_);if(!T)throw new Error("bad point: invalid y coordinate");let D=(R&K)===K,M=(E&128)!==0;if(!v&&R===Pe&&M)throw new Error(
|
|
416
|
+
"bad point: x=0 and x_0=1");return M!==D&&(R=u(-R)),f.fromAffine({x:R,y:w})}static fromHex(p,v=false){return f.fromBytes(As(p),v)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(p=8,v=true){
|
|
417
|
+
return h.createCache(this,p),v||this.multiply(Mr),this}assertValidity(){let p=this,{a:v,d:b}=i;if(p.is0())throw new Error("bad point: ZERO");let{X:x,Y:y,Z:k,T:E}=p,w=u(x*x),I=u(y*y),O=u(k*k),C=u(O*O),
|
|
418
|
+
_=u(w*v),T=u(O*u(_+I)),R=u(C+u(b*u(w*I)));if(T!==R)throw new Error("bad point: equation left != right (1)");let D=u(x*y),M=u(k*E);if(D!==M)throw new Error("bad point: equation left != right (2)")}equals(p){
|
|
419
|
+
m(p);let{X:v,Y:b,Z:x}=this,{X:y,Y:k,Z:E}=p,w=u(v*E),I=u(y*x),O=u(b*E),C=u(k*x);return w===I&&O===C}is0(){return this.equals(f.ZERO)}negate(){return new f(u(-this.X),this.Y,this.Z,u(-this.T))}double(){
|
|
420
|
+
let{a:p}=i,{X:v,Y:b,Z:x}=this,y=u(v*v),k=u(b*b),E=u(Mr*u(x*x)),w=u(p*y),I=v+b,O=u(u(I*I)-y-k),C=w+k,_=C-E,T=w-k,R=u(O*_),D=u(C*T),M=u(O*T),j=u(_*C);return new f(R,D,j,M)}add(p){m(p);let{a:v,d:b}=i,{X:x,
|
|
421
|
+
Y:y,Z:k,T:E}=this,{X:w,Y:I,Z:O,T:C}=p,_=u(x*w),T=u(y*I),R=u(E*b*C),D=u(k*O),M=u((x+y)*(w+I)-_-T),j=D-R,$=D+R,Y=u(T-v*_),oe=u(M*j),P=u($*Y),se=u(M*Y),B=u(j*$);return new f(oe,P,B,se)}subtract(p){return m(
|
|
422
|
+
p),this.add(p.negate())}multiply(p){if(!s.isValidNot0(p))throw new RangeError("invalid scalar: expected 1 <= sc < curve.n");let{p:v,f:b}=h.cached(this,p,x=>wn(f,x));return wn(f,[v,b])[0]}multiplyUnsafe(p){
|
|
423
|
+
if(!s.isValid(p))throw new RangeError("invalid scalar: expected 0 <= sc < curve.n");return p===Pe?f.ZERO:this.is0()||p===K?this:h.unsafe(this,p,v=>wn(f,v))}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){
|
|
424
|
+
return h.unsafe(this,i.n).is0()}toAffine(p){let v=this,b=p,{X:x,Y:y,Z:k}=v,E=v.is0();b==null&&(b=E?qc:o.inv(k));let w=u(x*b),I=u(y*b),O=o.mul(k,b);if(E)return {x:Pe,y:K};if(O!==K)throw new Error("invZ \
|
|
425
|
+
was invalid");return {x:w,y:I}}clearCofactor(){return a===K?this:this.multiplyUnsafe(a)}toBytes(){let{x:p,y:v}=this.toAffine(),b=o.toBytes(v);return b[b.length-1]|=p&K?128:0,b}toHex(){return Sr(this.toBytes())}toString(){
|
|
426
|
+
return `<Point ${this.is0()?"ZERO":this.toHex()}>`}}let h=new kn(f,s.BITS);return s.BITS>=8&&f.BASE.precompute(8),Object.freeze(f.prototype),Object.freeze(f),f}var Sn=class{static BASE;static ZERO;static Fp;static Fn;ep;constructor(e){
|
|
427
|
+
this.ep=e;}static fromBytes(e){Ir();}static fromHex(e){Ir();}get x(){return this.toAffine().x}get y(){return this.toAffine().y}clearCofactor(){return this}assertValidity(){this.ep.assertValidity();}toAffine(e){
|
|
428
|
+
return this.ep.toAffine(e)}toHex(){return Sr(this.toBytes())}toString(){return this.toHex()}isTorsionFree(){return true}isSmallOrder(){return false}add(e){return this.assertSame(e),this.init(this.ep.add(e.ep))}subtract(e){
|
|
373
429
|
return this.assertSame(e),this.init(this.ep.subtract(e.ep))}multiply(e){return this.init(this.ep.multiply(e))}multiplyUnsafe(e){return this.init(this.ep.multiplyUnsafe(e))}double(){return this.init(this.
|
|
374
|
-
ep.double())}negate(){return this.init(this.ep.negate())}precompute(e,n){return this.ep.precompute(e,n),this}};function
|
|
375
|
-
equired');let
|
|
376
|
-
outputLen,
|
|
377
|
-
|
|
378
|
-
let w
|
|
379
|
-
|
|
380
|
-
"context"),!!s)))}function x(
|
|
381
|
-
if(!c.isValid(
|
|
382
|
-
!!
|
|
383
|
-
|
|
384
|
-
is0()}let
|
|
385
|
-
try{return !!t.fromBytes(
|
|
386
|
-
|
|
387
|
-
|
|
430
|
+
ep.double())}negate(){return this.init(this.ep.negate())}precompute(e,n){return this.ep.precompute(e,n),this}};function si(t,e,n={}){if(typeof e!="function")throw new Error('"hash" function param is r\
|
|
431
|
+
equired');let r=e,o=n;Be(o,{},{adjustScalarBytes:"function",randomBytes:"function",domain:"function",prehash:"function",zip215:"boolean",mapToCurve:"function"});let{prehash:s}=o,{BASE:i,Fp:a,Fn:c}=t,u=r.
|
|
432
|
+
outputLen,l=2*a.BYTES;if(u!==void 0&&(ye(u,"hash.outputLen"),u!==l))throw new Error(`hash.outputLen must be ${l}, got ${u}`);let d=o.randomBytes===void 0?Ms:o.randomBytes,m=o.adjustScalarBytes===void 0?
|
|
433
|
+
T=>T:o.adjustScalarBytes,f=o.domain===void 0?(T,R,D)=>{if(Ge(D,"phflag"),R.length||D)throw new Error("Contexts/pre-hash are not supported");return T}:o.domain;function h(T){return c.create(xe(T))}function g(T){
|
|
434
|
+
let R=w.secretKey;U(T,w.secretKey,"secretKey");let D=U(r(T),2*R,"hashedSecretKey"),M=m(D.slice(0,R)),j=D.slice(R,2*R),$=h(M);return {head:M,prefix:j,scalar:$}}function p(T){let{head:R,prefix:D,scalar:M}=g(
|
|
435
|
+
T),j=i.multiply(M),$=j.toBytes();return {head:R,prefix:D,scalar:M,point:j,pointBytes:$}}function v(T){return p(T).pointBytes}function b(T=Uint8Array.of(),...R){let D=ue(...R);return h(r(f(D,U(T,void 0,
|
|
436
|
+
"context"),!!s)))}function x(T,R,D={}){T=U(T,void 0,"message"),s&&(T=s(T));let{prefix:M,scalar:j,pointBytes:$}=p(R),Y=b(D.context,M,T),oe=i.multiply(Y).toBytes(),P=b(D.context,oe,$,T),se=c.create(Y+P*
|
|
437
|
+
j);if(!c.isValid(se))throw new Error("sign failed: invalid s");let B=ue(oe,c.toBytes(se));return U(B,w.signature,"result")}let y={zip215:o.zip215};function k(T,R,D,M=y){let{context:j}=M,$=M.zip215===void 0?
|
|
438
|
+
!!y.zip215:M.zip215,Y=w.signature;T=U(T,Y,"signature"),R=U(R,void 0,"message"),D=U(D,w.publicKey,"publicKey"),$!==void 0&&Ge($,"zip215"),s&&(R=s(R));let oe=Y/2,P=T.subarray(0,oe),se=xe(T.subarray(oe,Y)),
|
|
439
|
+
B,Se,de;try{B=t.fromBytes(D,$),Se=t.fromBytes(P,$),de=i.multiplyUnsafe(se);}catch{return false}if(!$&&B.isSmallOrder())return false;let pe=b(j,P,D,R);return Se.add(B.multiplyUnsafe(pe)).subtract(de).clearCofactor().
|
|
440
|
+
is0()}let E=a.BYTES,w={secretKey:E,publicKey:E,signature:2*E,seed:E};function I(T){return T=T===void 0?d(w.seed):T,U(T,w.seed,"seed")}function O(T){return hn(T)&&T.length===w.secretKey}function C(T,R){
|
|
441
|
+
try{return !!t.fromBytes(T,R===void 0?y.zip215:R)}catch{return false}}let _={getExtendedPublicKey:p,randomSecretKey:I,isValidSecretKey:O,isValidPublicKey:C,toMontgomery(T){let{y:R}=t.fromBytes(T),D=w.publicKey,
|
|
442
|
+
M=D===32;if(!M&&D!==57)throw new Error("only defined for 25519 and 448");let j=M?a.div(K+R,K-R):a.div(R-K,R+K);return a.toBytes(j)},toMontgomerySecret(T){let R=w.secretKey;U(T,R);let D=r(T.subarray(0,
|
|
443
|
+
R));return m(D).subarray(0,R)}};return Object.freeze(w),Object.freeze(_),Object.freeze({keygen:ri(I,v),getPublicKey:v,sign:x,verify:k,utils:_,Point:t,lengths:w})}var Wc=BigInt(0),we=BigInt(1),ai=BigInt(2);var Gc=BigInt(5),Yc=BigInt(8),Ye=BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed"),Fr={p:Ye,n:BigInt("0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"),h:Yc,
|
|
388
444
|
a:BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec"),d:BigInt("0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3"),Gx:BigInt("0x216936d3cd6e53fec0a4e231fdd6d\
|
|
389
|
-
c5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function
|
|
390
|
-
s*t%s,c=re(a,
|
|
391
|
-
return t[0]&=248,t[31]&=127,t[31]|=64,t}var
|
|
392
|
-
i=
|
|
393
|
-
"1159843021668779879193775521855586647937357759715417654439879720876111806838");BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952");var
|
|
394
|
-
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),
|
|
395
|
-
|
|
396
|
-
oint expected")}init(e){return new t(e)}static fromBytes(e){
|
|
397
|
-
let a=s(i*i),c=s(
|
|
398
|
-
"invalid ristretto255 encoding 2");return new t(new
|
|
399
|
-
|
|
400
|
-
g)}equals(e){this.assertSame(e);let{X:n,Y:
|
|
401
|
-
|
|
445
|
+
c5c692cc7609525a7b2c9562d608f25d51a"),Gy:BigInt("0x6666666666666666666666666666666666666666666666666666666666666658")};function Zc(t){let e=BigInt(10),n=BigInt(20),r=BigInt(40),o=BigInt(80),s=Ye,a=t*t%
|
|
446
|
+
s*t%s,c=re(a,ai,s)*a%s,u=re(c,we,s)*t%s,l=re(u,Gc,s)*u%s,d=re(l,e,s)*l%s,m=re(d,n,s)*d%s,f=re(m,r,s)*m%s,h=re(f,o,s)*f%s,g=re(h,o,s)*f%s,p=re(g,e,s)*l%s;return {pow_p_5_8:re(p,ai,s)*t%s,b2:a}}function Xc(t){
|
|
447
|
+
return t[0]&=248,t[31]&=127,t[31]|=64,t}var Nr=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");function zr(t,e){let n=Ye,r=z(e*e*e,n),o=z(r*r*e,n),s=Zc(t*o).pow_p_5_8,
|
|
448
|
+
i=z(t*r*s,n),a=z(e*i*i,n),c=i,u=z(i*Nr,n),l=a===t,d=a===z(-t,n),m=a===z(-t*Nr,n);return l&&(i=c),(d||m)&&(i=u),ke(i,n)&&(i=z(-i,n)),{isValid:l||d,value:i}}var Oe=oi(Fr,{uvRatio:zr}),De=Oe.Fp,li=Oe.Fn;function Qc(t){return si(Oe,pn,Object.assign({adjustScalarBytes:Xc,zip215:true},t))}var di=Qc({});var jr=Nr;BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235");var tu=BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578");BigInt(
|
|
449
|
+
"1159843021668779879193775521855586647937357759715417654439879720876111806838");BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952");var ci=t=>zr(we,t),ou=BigInt("0x7\
|
|
450
|
+
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),Br=t=>De.create(xe(t)&ou);var Ae=class t extends Sn{static BASE=new t(
|
|
451
|
+
Oe.BASE);static ZERO=new t(Oe.ZERO);static Fp=De;static Fn=li;constructor(e){super(e);}static fromAffine(e){return new t(Oe.fromAffine(e))}assertSame(e){if(!(e instanceof t))throw new Error("RistrettoP\
|
|
452
|
+
oint expected")}init(e){return new t(e)}static fromBytes(e){ne(e,32);let{a:n,d:r}=Fr,o=Ye,s=y=>De.create(y),i=Br(e);if(!js(De.toBytes(i),e)||ke(i,o))throw new Error("invalid ristretto255 encoding 1");
|
|
453
|
+
let a=s(i*i),c=s(we+n*a),u=s(we-n*a),l=s(c*c),d=s(u*u),m=s(n*r*l-d),{isValid:f,value:h}=ci(s(m*d)),g=s(h*u),p=s(h*g*m),v=s((i+i)*g);ke(v,o)&&(v=s(-v));let b=s(c*p),x=s(v*b);if(!f||ke(x,o)||b===Wc)throw new Error(
|
|
454
|
+
"invalid ristretto255 encoding 2");return new t(new Oe(v,b,we,x))}static fromHex(e){return t.fromBytes(yt(e))}toBytes(){let{X:e,Y:n,Z:r,T:o}=this.ep,s=Ye,i=p=>De.create(p),a=i(i(r+n)*i(r-n)),c=i(e*n),
|
|
455
|
+
u=i(c*c),{value:l}=ci(i(a*u)),d=i(l*a),m=i(l*c),f=i(d*m*o),h;if(ke(o*f,s)){let p=i(n*jr),v=i(e*jr);e=p,n=v,h=i(d*tu);}else h=m;ke(e*f,s)&&(n=i(-n));let g=i((r-n)*h);return ke(g,s)&&(g=i(-g)),De.toBytes(
|
|
456
|
+
g)}equals(e){this.assertSame(e);let{X:n,Y:r}=this.ep,{X:o,Y:s}=e.ep,i=u=>De.create(u),a=i(n*s)===i(r*o),c=i(r*s)===i(n*o);return a||c}is0(){return this.equals(t.ZERO)}};Object.freeze(Ae.BASE);Object.freeze(
|
|
457
|
+
Ae.ZERO);Object.freeze(Ae.prototype);Object.freeze(Ae);var pi=`-----BEGIN PUBLIC KEY-----
|
|
402
458
|
MCowBQYDK2VwAyEAWBiklf0kmDIVmM7nMiCxwiEAkwQIiqWGuRiRDJonsFY=
|
|
403
|
-
-----END PUBLIC KEY-----`;function
|
|
404
|
-
length%4?"=".repeat(4-e.length%4):"";return
|
|
405
|
-
function
|
|
406
|
-
function
|
|
407
|
-
oken"};let n=t.split("."),
|
|
408
|
-
d=e.keys[
|
|
409
|
-
return {ok:false,reason:"invalid public key"}}let
|
|
410
|
-
{ok:false,reason:"bad signature"}}function
|
|
411
|
-
n.payloadBytes))}}catch{return {signatureValid:false,reason:"payload is not valid JSON"}}}function
|
|
412
|
-
active":e<=
|
|
413
|
-
{reason:s.reason}:{}};let i=s.payload,a=n.nowSeconds??Math.floor(Date.now()/1e3),c=
|
|
414
|
-
if(
|
|
415
|
-
seq!="number"||typeof s.asOf!="number"||!Array.isArray(s.revoked))return
|
|
416
|
-
nowSeconds??Math.floor(Date.now()/1e3),c=n.maxSkewSeconds??
|
|
459
|
+
-----END PUBLIC KEY-----`;function fi(t){let e=atob(t),n=new Uint8Array(e.length);for(let r=0;r<e.length;r++)n[r]=e.charCodeAt(r);return n}function $r(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.
|
|
460
|
+
length%4?"=".repeat(4-e.length%4):"";return fi(e+n)}function iu(t){let e=t.replace(/-----[^-]+-----/g,"").replace(/\s+/g,""),n=fi(e);return n.subarray(n.length-32)}var au=new TextEncoder,mi=new TextDecoder;
|
|
461
|
+
function cu(t){return typeof t=="object"&&t!==null&&"keys"in t}function Ze(t){let e=t.trim(),n=/^(["'])([\s\S]*)\1$/.exec(e);return n&&(e=n[2].trim()),e=e.replace(/^bearer\s+/i,""),e.trim()}var uu=/^[A-Za-z0-9_-]+$/;
|
|
462
|
+
function hi(t){let e=t.split(".");return e.length===3&&e.every(n=>uu.test(n))}function Vr(t){return t===""?"empty":hi(t)?"token":"malformed"}function Ur(t,e){if(!hi(t))return {ok:false,reason:"malformed t\
|
|
463
|
+
oken"};let n=t.split("."),r=n[0],o=n[1],s=n[2],i;try{i=JSON.parse(mi.decode($r(r)));}catch{return {ok:false,reason:"header is not valid JSON"}}let a;if(cu(e)){let l=typeof i.kid=="string"?i.kid:e.defaultKid,
|
|
464
|
+
d=e.keys[l];if(!d)return {ok:false,reason:`unknown key id "${l}"`};a=d;}else {if(!e)return {ok:false,reason:"no verification key"};a=e;}let c;try{if(c=iu(a),c.length!==32)return {ok:!1,reason:"invalid public key"}}catch{
|
|
465
|
+
return {ok:false,reason:"invalid public key"}}let u=false;try{u=di.verify($r(s),au.encode(`${r}.${o}`),c);}catch{return {ok:false,reason:"signature verification error"}}return u?{ok:true,header:i,payloadBytes:$r(o)}:
|
|
466
|
+
{ok:false,reason:"bad signature"}}function Xe(t,e){let n=Ur(t,e);if(!n.ok||!n.payloadBytes)return {signatureValid:false,...n.reason?{reason:n.reason}:{}};try{return {signatureValid:!0,payload:JSON.parse(mi.decode(
|
|
467
|
+
n.payloadBytes))}}catch{return {signatureValid:false,reason:"payload is not valid JSON"}}}function qr(t,e,n){if(n?.has(t.jti))return "revoked";let r=t.expires_at+t.grace_days*86400;return e<=t.expires_at?"\
|
|
468
|
+
active":e<=r?"grace":"expired"}function Df(t,e,n={}){let r=Ze(t);if(Vr(r)==="empty")return {status:"none",reason:"empty"};let s=Xe(r,e);if(!s.signatureValid||!s.payload)return {status:"invalid",...s.reason?
|
|
469
|
+
{reason:s.reason}:{}};let i=s.payload,a=n.nowSeconds??Math.floor(Date.now()/1e3),c=qr(i,a,n.revoked);return c==="revoked"?{status:c,payload:i,reason:"license revoked"}:{status:c,payload:i}}var gi="BVSALA-REVOC",lu=300,du=new TextDecoder;function bi(t,e,n={}){let r=u=>({ok:false,seq:-1,asOf:0,revoked:new Set,reason:u}),o=Ur(t,e);if(!o.ok||!o.payloadBytes)return r(o.reason??"bad signature");
|
|
470
|
+
if(o.header?.typ!==gi)return r(`unexpected token type "${String(o.header?.typ??"")}" (want ${gi})`);let s;try{s=JSON.parse(du.decode(o.payloadBytes));}catch{return r("payload is not valid JSON")}if(typeof s.
|
|
471
|
+
seq!="number"||typeof s.asOf!="number"||!Array.isArray(s.revoked))return r("malformed revocation payload");let i=n.minSeq??0;if(s.seq<i)return r(`stale/rolled-back list (seq ${s.seq} < ${i})`);let a=n.
|
|
472
|
+
nowSeconds??Math.floor(Date.now()/1e3),c=n.maxSkewSeconds??lu;return s.asOf>a+c?r(`asOf too far in the future (${s.asOf} > ${a+c})`):{ok:true,seq:s.seq,asOf:s.asOf,revoked:new Set(s.revoked)}}var Qe=class{_seq=-1;_asOf=0;_lastContactAt=0;set=new Set;get seq(){
|
|
417
473
|
return this._seq}get asOf(){return this._asOf}get lastContactAt(){return this._lastContactAt}markContact(e){e>this._lastContactAt&&(this._lastContactAt=e);}has(e){return this.set.has(e)}snapshot(){return this.
|
|
418
|
-
set}apply(e){if(e.seq<this._seq)return false;let n=this.set.size;for(let s of e.revoked)this.set.add(s);let
|
|
419
|
-
(this._asOf=e.asOf),o
|
|
420
|
-
c?.features??[]),
|
|
421
|
-
86400,h=Math.min(
|
|
422
|
-
|
|
423
|
-
0){let
|
|
424
|
-
|
|
474
|
+
set}apply(e){if(e.seq<this._seq)return false;let n=this.set.size;for(let s of e.revoked)this.set.add(s);let r=this.set.size>n,o=e.seq>this._seq;return e.seq>this._seq&&(this._seq=e.seq),e.asOf>this._asOf&&
|
|
475
|
+
(this._asOf=e.asOf),r||o}};function Tn(t,e,n){let r=()=>Math.floor((n.now?n.now():Date.now())/1e3),o=n.startedAt??r(),s=Ze(t),i=Vr(s),a=i==="token"?Xe(s,e):{signatureValid:false,reason:i},c=a.signatureValid?a.payload:void 0,u=new Set(
|
|
476
|
+
c?.features??[]),l=()=>{if(i==="empty")return "none";if(!c)return "invalid";let m=qr(c,r(),n.revocation.snapshot());if(n.maxStalenessSeconds!=null&&(m==="active"||m==="grace")){let f=c.expires_at+c.grace_days*
|
|
477
|
+
86400,h=Math.min(o,f),g=Math.max(n.revocation.lastContactAt,h);if(r()-g>n.maxStalenessSeconds)return "stale"}return m},d=()=>{let m=l();return m==="active"||m==="grace"};return {isEntitled:m=>d()&&u.has(
|
|
478
|
+
m),isActive:()=>d(),status:l,reason:()=>c?void 0:a.reason,refreshAfter:()=>{if(c)return Math.min(c.expires_at,r()+86400)}}}function vi(t,e,n){return Tn(t,e,{revocation:new Qe,...n?{now:n}:{}})}var et={pollIntervalSeconds:900,floorSeconds:300,maxIntervalSeconds:3600,jitterRatio:.1,maxSkewSeconds:300,requestTimeoutMs:3e4},yi=3,pu=12;function fu(t){let e=t.random??Math.random,n;if(t.consecutiveFailures>
|
|
479
|
+
0){let o=Math.pow(2,Math.min(t.consecutiveFailures,4));n=Math.min(t.maxIntervalSeconds,t.floorSeconds*o);}else {let o=t.refreshAfter!=null?t.refreshAfter-t.nowSeconds:t.pollIntervalSeconds,s=o<0?t.pollIntervalSeconds:
|
|
480
|
+
o;n=Math.min(t.pollIntervalSeconds,Math.max(t.floorSeconds,s));}let r=1+(e()*2-1)*t.jitterRatio;return Math.max(t.floorSeconds,n*r)}var mu=10,En=class{constructor(e){this.opts=e;}opts;timer=null;controller=null;consecutiveFailures=0;stopped=false;started=false;warnedNoFetch=false;lastEtag=null;consecutive304=0;now(){
|
|
425
481
|
return this.opts.nowSeconds?this.opts.nowSeconds():Math.floor(Date.now()/1e3)}resolveFetch(){return this.opts.fetchImpl?this.opts.fetchImpl:typeof fetch<"u"?fetch:void 0}async pollOnce(){let e=this.resolveFetch();
|
|
426
482
|
if(!e){this.warnedNoFetch||(this.warnedNoFetch=true,console.warn("[bv-sala] no global fetch available; revocation call-home disabled (offline). License expiry is still enforced from the token.")),this.opts.
|
|
427
|
-
onEvent?.({type:"no-fetch"});return}let n=new AbortController;this.controller=n;let
|
|
483
|
+
onEvent?.({type:"no-fetch"});return}let n=new AbortController;this.controller=n;let r=this.opts.requestTimeoutMs??et.requestTimeoutMs,o=setTimeout(()=>n.abort(),r);o.unref?.();let s={accept:"applicati\
|
|
428
484
|
on/json"};this.lastEtag&&(s["if-none-match"]=this.lastEtag);try{let i=await e(this.opts.url,{signal:n.signal,headers:s});if(i.status===304){this.consecutiveFailures=0,this.opts.snapshot.markContact(this.
|
|
429
|
-
now()),this.opts.onEvent?.({type:"unchanged",seq:this.opts.snapshot.seq}),this.consecutive304+=1,this.consecutive304>=
|
|
430
|
-
ok)throw new Error(`revocations HTTP ${i.status}`);let a=i.headers.get("etag"),c=await i.json();if(!c.list)throw new Error("response missing `list`");this.consecutiveFailures=0;let
|
|
431
|
-
publicKeyPem,{minSeq:this.opts.snapshot.seq,nowSeconds:this.now(),maxSkewSeconds:this.opts.maxSkewSeconds??
|
|
432
|
-
reason:d}),this.avisar(`rechazada:${d}`,`[bv-sala]
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
485
|
+
now()),this.opts.onEvent?.({type:"unchanged",seq:this.opts.snapshot.seq}),this.consecutive304+=1,this.consecutive304>=mu&&(this.consecutive304=0,this.lastEtag=null);return}if(this.consecutive304=0,!i.
|
|
486
|
+
ok)throw new Error(`revocations HTTP ${i.status}`);let a=i.headers.get("etag"),c=await i.json();if(!c.list)throw new Error("response missing `list`");this.consecutiveFailures=0;let u=bi(c.list,this.opts.
|
|
487
|
+
publicKeyPem,{minSeq:this.opts.snapshot.seq,nowSeconds:this.now(),maxSkewSeconds:this.opts.maxSkewSeconds??et.maxSkewSeconds});if(!u.ok){let d=u.reason??"rejected";this.opts.onEvent?.({type:"rejected",
|
|
488
|
+
reason:d}),this.avisar(`rechazada:${d}`,`[bv-sala] the revocation list does NOT verify (${d}). The last known-good list is kept, so revocations ALREADY known still apply, but new ones are not arriving\
|
|
489
|
+
. Check ${this.opts.url}.`);return}a&&(this.lastEtag=a),this.opts.snapshot.markContact(this.now());let l=this.opts.snapshot.apply(u);this.opts.onEvent?.(l?{type:"applied",seq:u.seq,size:this.opts.snapshot.
|
|
490
|
+
snapshot().size}:{type:"unchanged",seq:u.seq});}catch(i){this.consecutiveFailures++,this.opts.onEvent?.({type:"error",error:i}),this.avisarFalloDeRed(i);}finally{clearTimeout(o),this.controller=null;}}callado(){
|
|
491
|
+
return !!(this.opts.silenceWarnings??this.opts.silenciarAvisos)}avisar(e,n){this.callado()||F(`poller:${this.opts.url}:${e}`,n);}avisarFalloDeRed(e){if(this.callado())return;let n=this.consecutiveFailures;
|
|
492
|
+
if(n<yi||(n-yi)%pu!==0)return;let r=e instanceof Error?e.message:String(e);console.warn(`[bv-sala] could not reach the revocation server ${n} times in a row (${r}). The license KEEPS working and known\
|
|
493
|
+
revocations still apply, but NEW ones are not arriving. Check egress to ${this.opts.url}.`);}start(){this.started||this.stopped||(this.started=true,this.pollOnce().finally(()=>this.schedule()));}schedule(){
|
|
494
|
+
if(this.stopped)return;let e=fu({refreshAfter:this.opts.getRefreshAfter?.(),nowSeconds:this.now(),consecutiveFailures:this.consecutiveFailures,floorSeconds:this.opts.floorSeconds??et.floorSeconds,pollIntervalSeconds:this.
|
|
495
|
+
opts.pollIntervalSeconds??et.pollIntervalSeconds,maxIntervalSeconds:this.opts.maxIntervalSeconds??et.maxIntervalSeconds,jitterRatio:this.opts.jitterRatio??et.jitterRatio,...this.opts.random?{random:this.
|
|
496
|
+
opts.random}:{}});this.timer=setTimeout(()=>{this.pollOnce().finally(()=>this.schedule());},e*1e3),this.timer.unref?.();}stop(){this.stopped=true,this.timer&&(clearTimeout(this.timer),this.timer=null),this.
|
|
497
|
+
controller?.abort();}};var Tt=class{options;now;flushIntervalMs;maxBatch;maxBuffer;buffer=[];seatId;ci;timer;inflight=null;fallosSeguidos=0;constructor(e){this.options=e,this.now=e.now??(()=>Date.now()),this.flushIntervalMs=
|
|
442
498
|
e.flushIntervalMs??15e3,this.maxBatch=e.maxBatch??50,this.maxBuffer=e.maxBuffer??1e3,this.ci=e.ci??false;}setSeat(e,n){e&&(this.seatId=e),this.ci=n;}record(e){this.buffer.push({report:e,at:this.now()}),this.
|
|
443
499
|
buffer.length>this.maxBuffer&&this.buffer.splice(0,this.buffer.length-this.maxBuffer),this.buffer.length>=this.maxBatch&&this.flush();}start(){this.timer||(this.timer=setInterval(()=>{this.flush();},this.
|
|
444
500
|
flushIntervalMs),this.timer.unref?.());}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0),this.flush();}async stopAndDrain(e){this.timer&&(clearInterval(this.timer),this.timer=void 0);let n=e??
|
|
445
|
-
Math.ceil(this.maxBuffer/this.maxBatch)+4,
|
|
501
|
+
Math.ceil(this.maxBuffer/this.maxBatch)+4,r=0;for(let o=0;o<n&&this.buffer.length>0;o++){let s=this.buffer.length;if(await this.flush(),r=this.buffer.length>=s?r+1:0,r>=2)break}}async flush(){if(this.
|
|
446
502
|
inflight)return this.inflight;if(this.buffer.length!==0){this.inflight=this.hacerFlush();try{await this.inflight;}finally{this.inflight=null;}}}async hacerFlush(){let e=this.options.fetchImpl??globalThis.
|
|
447
|
-
fetch;if(!e)return;let n=this.buffer.splice(0,this.maxBatch);try{let
|
|
448
|
-
er ${this.options.serviceAccountKey}`,[
|
|
449
|
-
`
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
t.
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
503
|
+
fetch;if(!e)return;let n=this.buffer.splice(0,this.maxBatch);try{let r=n.map(s=>this.toWire(s)),o=await e(this.options.url,{method:"POST",headers:{"content-type":"application/json",authorization:`Bear\
|
|
504
|
+
er ${this.options.serviceAccountKey}`,[zt]:`${this.options.surface??"sdk"}/${lt}`},body:JSON.stringify(r)});o.ok?this.fallosSeguidos=0:o.status>=500?(this.fallosSeguidos++,this.requeue(n),this.avisarDeFallo(
|
|
505
|
+
`the server responded ${o.status}`)):o.status===401||o.status===403?(F(`metering-auth-${o.status}`,`[bv-sala] usage reporting is being rejected with HTTP ${o.status} at ${this.options.url}. Check 'ser\
|
|
506
|
+
viceAccountKey' (rotated? revoked? from another organization?). Until it works, no usage is reported: the dashboard will say it sees no traffic and billable seats will show zero.`),this.options.onAuthError?.(
|
|
507
|
+
o.status)):(this.fallosSeguidos++,this.avisarDeFallo(o.status===404||o.status===405?`HTTP ${o.status}: the reporting URL looks wrong`:`the server rejected the batch with HTTP ${o.status}`));}catch(r){this.
|
|
508
|
+
fallosSeguidos++,this.requeue(n),this.avisarDeFallo(r instanceof Error?r.message:"network error");}}avisarDeFallo(e){if(this.options.silenceWarnings)return;let n=this.fallosSeguidos;n<3||(n-3)%12!==0||
|
|
509
|
+
console.warn(`[bv-sala] usage reporting has failed ${n} times in a row against ${this.options.url} (${e}). Requests keep working, but usage is not arriving: the dashboard will say it sees no traffic a\
|
|
510
|
+
nd billable seats will show zero. Check 'meteringUrl' \u2014 by default it is \`\${licenseServerUrl}/api/metering/usage\`.`);}requeue(e){this.buffer=[...e,...this.buffer],this.buffer.length>this.maxBuffer&&
|
|
511
|
+
(this.buffer.length=this.maxBuffer);}toWire(e){let n=e.report;return {orgId:this.options.orgId??"self",...this.seatId?{seatId:this.seatId}:{},...this.ci?{ci:true}:{},requestId:n.requestId,model:n.model,at:e.
|
|
512
|
+
at,avoidedLlm:n.calls.avoidedLlm,actualLlm:n.calls.actualLlm,baselineInputTokens:n.tokens.baselineInput,actualInputTokens:n.tokens.actualInput,eliminatedInputTokens:n.tokens.eliminatedInput,compressedInputTokens:n.
|
|
513
|
+
tokens.compressedInput,baselineOutputTokens:n.tokens.baselineOutput,actualOutputTokens:n.tokens.actualOutput,providerCachedInputTokens:n.tokens.providerCachedInput??0,cacheResult:n.cache.result,...n.cost.
|
|
514
|
+
eliminatedInputFloorCost!==void 0&&Number.isFinite(n.cost.eliminatedInputFloorCost)&&n.cost.eliminatedInputFloorCost>0&&n.tokens.eliminatedInput>0?{eliminatedInputFloorCost:n.cost.eliminatedInputFloorCost}:
|
|
515
|
+
{},baselineCost:n.cost.baselineEstimate,actualCost:n.cost.actual,netSavings:n.cost.netSavings,...n.cost.basis?{basis:n.cost.basis}:{},...n.cost.basis==="reference"&&n.cache.reference&&/^[A-Za-z0-9._:/-]{1,128}$/.
|
|
516
|
+
test(n.cache.reference.requestId)&&Number.isInteger(n.cache.reference.at)?{referenceRequestId:n.cache.reference.requestId,referenceAt:n.cache.reference.at}:{},...n.attribution?.sessionId?{sessionId:n.
|
|
517
|
+
attribution.sessionId}:{},...n.attribution?.agentId?{agentId:n.attribution.agentId}:{}}}};function Rn(){return globalThis.process}function hu(t){if(/^[0-9a-f]{12}$/.test(t)||/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||/^ip-\d{1,3}(-\d{1,3}){3}$/i.test(t))return true;let e="[bcdfghjklmnpqrstvwxz2456789\
|
|
518
|
+
]";return new RegExp(`-${e}{8,10}-${e}{5}$`).test(t)}function gu(t){return !!(t.AWS_LAMBDA_FUNCTION_NAME??t.LAMBDA_TASK_ROOT??t.VERCEL??t.VERCEL_ENV??t.K_SERVICE??t.FUNCTION_TARGET??t.FUNCTIONS_WORKER_RUNTIME??
|
|
519
|
+
t.NETLIFY)}async function bu(){if(Rn()?.execPath)try{let e=await import(["node","os"].join(":")),n=typeof e.hostname=="function"?e.hostname():"";return n.length>0?n:void 0}catch{return}}async function vu(t,e=bu){
|
|
520
|
+
if(t.KUBERNETES_SERVICE_HOST||gu(t))return;let n=t.HOSTNAME??t.COMPUTERNAME??await e();if(!(!n||hu(n)))return n}async function yu(){let t=Rn();if(!t||!t.env)return;let e=t.env,n=await vu(e),r=[t.platform,
|
|
521
|
+
t.arch,t.execPath,n,e.USER??e.USERNAME??e.LOGNAME,e.HOME??e.USERPROFILE].filter(o=>typeof o=="string"&&o.length>0);return r.length?r.join("|"):void 0}var xu=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTI\
|
|
522
|
+
ONS","GITLAB_CI","CIRCLECI","TRAVIS","JENKINS_URL","BUILDKITE","TF_BUILD","TEAMCITY_VERSION","BITBUCKET_BUILD_NUMBER","CODEBUILD_BUILD_ID","HEROKU_TEST_RUN_ID","DRONE"];function Hr(){let t=Rn()?.env;if(!t)
|
|
523
|
+
return false;for(let e of xu){let n=t[e];if(n&&n!=="false"&&n!=="0")return true}return false}async function ku(t,e){let n=globalThis.crypto,r=new TextEncoder;if(n?.subtle)try{let i=await n.subtle.importKey("raw",
|
|
524
|
+
r.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),a=await n.subtle.sign("HMAC",i,r.encode(e));return [...new Uint8Array(a)].map(c=>c.toString(16).padStart(2,"0")).join("")}catch{}let o=2166136261,s=`${t}\
|
|
525
|
+
|${e}`;for(let i=0;i<s.length;i++)o^=s.charCodeAt(i),o=Math.imul(o,16777619);return (o>>>0).toString(16).padStart(8,"0")}async function Kr(t){let n=Rn()?.env?.BVSALA_SEAT_ID;if(n&&wu.test(n))return n;let r=await yu();
|
|
526
|
+
if(!r)return;let o=await ku(t,r);if(o)return `m-${o.slice(0,32)}`}var wu=/^[A-Za-z0-9._:/-]{1,128}$/;var xi={inputPer1k:5e-4,outputPer1k:.0015,cachedInputPer1k:5e-5};function ki(t){return {exactCache:t.exactCache??new Ut,semanticCache:t.semanticCache,singleflight:t.singleflight??new qt,resolvers:t.resolvers??jo(),router:t.router??new Ht,toolSelector:t.toolSelector??
|
|
527
|
+
new Kt,formatSelector:t.formatSelector??new Yt({tokenizer:t.tokenizer}),schemaRegistry:t.schemaRegistry??new Zt,constraintBackends:t.constraintBackends??[]}}var Su=36e5,Tu=7*86400,Eu=3e4,Cn=class{opts;pollIntervalMs;refreshLeadSeconds;timer=null;enVuelo=false;parado=false;controller=null;avisadoDeCredencial=false;currentExpiresAt;currentOrg;constructor(e){this.opts=
|
|
528
|
+
e,this.pollIntervalMs=e.pollIntervalMs??Su,this.refreshLeadSeconds=e.refreshLeadSeconds??Tu;let n=Xe(Ze(e.initialToken),e.publicKey);this.currentExpiresAt=n.signatureValid&&n.payload?n.payload.expires_at:
|
|
472
529
|
0,this.currentOrg=n.signatureValid?n.payload?.org_id:void 0;}start(){this.timer||(this.checkNow(),this.timer=setInterval(()=>{this.checkNow();},this.pollIntervalMs),this.timer.unref?.());}stop(){this.parado=
|
|
473
530
|
true,this.timer&&clearInterval(this.timer),this.timer=null,this.controller?.abort(),this.controller=null;}nowSeconds(){return Math.floor((this.opts.now?this.opts.now():Date.now())/1e3)}async checkNow(){if(this.
|
|
474
531
|
enVuelo||this.parado||this.currentExpiresAt-this.nowSeconds()>this.refreshLeadSeconds)return false;this.enVuelo=true;let e=new AbortController;this.controller=e;let n=setTimeout(()=>e.abort(),this.opts.requestTimeoutMs??
|
|
475
|
-
|
|
476
|
-
n/json"}});if(!
|
|
477
|
-
|
|
478
|
-
|
|
532
|
+
Eu);n.unref?.();try{let o=await(this.opts.fetchImpl??globalThis.fetch.bind(globalThis))(this.opts.url,{signal:e.signal,headers:{authorization:`Bearer ${this.opts.serviceAccountKey}`,accept:"applicatio\
|
|
533
|
+
n/json"}});if(!o.ok)return (o.status===401||o.status===403||o.status===404)&&!this.avisadoDeCredencial&&(this.avisadoDeCredencial=!0,console.warn(`[bv-sala] automatic pickup of the renewed license is f\
|
|
534
|
+
ailing with HTTP ${o.status} at ${this.opts.url}. Check 'serviceAccountKey' (rotated? from another organization?) and 'licenseServerUrl': until this works, the token will NOT renew itself and the SDK \
|
|
535
|
+
will stop operating when the grace period ends.`)),!1;let s=await o.json();if(typeof s.token!="string")return !1;let i=Ze(s.token),a=Xe(i,this.opts.publicKey);return !a.signatureValid||!a.payload||a.payload.
|
|
479
536
|
expires_at<=this.currentExpiresAt||this.currentOrg&&a.payload.org_id!==this.currentOrg||this.opts.revocados?.snapshot().has(a.payload.jti)||this.parado?!1:(this.currentExpiresAt=a.payload.expires_at,this.
|
|
480
|
-
currentOrg=a.payload.org_id,this.opts.onNewToken(i),!0)}catch{return false}finally{clearTimeout(n),this.controller===e&&(this.controller=null),this.enVuelo=false;}}};var
|
|
537
|
+
currentOrg=a.payload.org_id,this.opts.onNewToken(i),!0)}catch{return false}finally{clearTimeout(n),this.controller===e&&(this.controller=null),this.enVuelo=false;}}};var Ru={"gpt-4.1":false,"gpt-4.1-mini":false,"gpt-4.1-nano":false,"gpt-4o":false,"gpt-4o-mini":false,"gpt-4-turbo":false,"gpt-4":false,"gpt-3.5-turbo":false,"gpt-5":true,"gpt-5-codex":true,"gpt-5-mini":true,"gpt-5-nano":true,"gpt-5.\
|
|
538
|
+
1-codex":true,"gpt-5.1-codex-max":true,"gpt-5.1-codex-mini":true,"gpt-5.1-thinking":true,"gpt-5.2":true,"gpt-5.2-codex":true,"gpt-5.3-codex":true,"gpt-5.4":true,"gpt-5.4-mini":true,"gpt-5.4-nano":true,"gpt-5.5":true,"gpt-5\
|
|
539
|
+
.6-luna":true,"gpt-5.6-sol":true,"gpt-5.6-terra":true,o3:true,"o3-mini":true,"o3-pro":true,"o4-mini":true,"claude-opus-4-5":false,"claude-opus-4-6":false,"claude-opus-4-7":false,"claude-opus-4-8":false,"claude-opus-5":true,"clau\
|
|
540
|
+
de-opus-4":false,"claude-sonnet-4-5":false,"claude-sonnet-4-6":false,"claude-sonnet-5":true,"claude-fable-5":true,"claude-fable-5-1":true,"claude-mythos-5-1":true,"claude-mythos-5":true,"claude-sonnet-4":false,"claude-haik\
|
|
541
|
+
u-4-5":false,"claude-3-5-sonnet":false,"claude-3-5-haiku":false,"claude-3-opus":false,"claude-3-haiku":false,"gemini-3.7-flash":true,"gemini-3.5-flash":true,"gemini-3.5-flash-lite":true,"gemini-3.1-pro-preview":true,"gemini\
|
|
542
|
+
-2.5-pro":true,"gemini-2.5-flash":true},Cu=new Set(["claude-opus-4-7","claude-opus-4-8"]),Iu=[/^o\d/,/^gpt-5/,/^gpt-oss/,/^gemini-(2\.5|[3-9])/,/^claude-[a-z]+-([5-9]|\d{2})/,/^grok-(3-mini|[4-9])/,/reason/,
|
|
543
|
+
/think/,/(^|[-_.])r\d($|[-_.])/,/^qwq/,/^qwen3/,/^glm-(4\.[5-9]|[5-9])/,/magistral/];function wi(t){let e=t.lastIndexOf("/"),n=(e>=0?t.slice(e+1):t).toLowerCase();if(Iu.some(s=>s.test(n)))return "reaso\
|
|
544
|
+
ning-model";let r=Vn(t);if(r===void 0)return "unclassified-model";let o=Ru[r];if(o===true)return "reasoning-model";if(o!==false)return "unclassified-model";if(Cu.has(r))return "temperature-ignored"}var Jr={minimumCacheTokens:1024,cacheReadMultiplier:.5,cacheWriteMultiplier:1},Si={minimumCacheTokens:1024,cacheReadMultiplier:.1,cacheWriteMultiplier:1.25},_u=[["claude-fable-5-1",512],["claude-mytho\
|
|
481
545
|
s-5-1",512],["claude-fable-5",512],["claude-mythos-5",512],["claude-opus-5",512],["claude-opus-4-7",2048],["claude-opus-4-6",4096],["claude-opus-4-5",4096],["claude-haiku-4-5",4096],["claude-3-5-haiku",
|
|
482
|
-
2048]];function
|
|
483
|
-
n)),c=a*s*
|
|
484
|
-
0),
|
|
485
|
-
< ${
|
|
546
|
+
2048]];function Wr(t){for(let[e,n]of _u)if(t===e||t.startsWith(`${e}-`))return {...Si,minimumCacheTokens:n};return Si}var Gr={minimumCacheTokens:1024,cacheReadMultiplier:.1,cacheWriteMultiplier:1};var Ti={minimumCacheTokens:1024,cacheReadMultiplier:1,cacheWriteMultiplier:1};function In(t,e,n,r){let o=r.minimumCacheTokens;if(o==null||t<o)return t;let s=Math.min(e,t),i=t-s,a=Math.min(1,Math.max(0,
|
|
547
|
+
n)),c=a*s*r.cacheReadMultiplier+(1-a)*s*r.cacheWriteMultiplier;return i+c}function Yr(t){let e=In(t.originalTokens,t.stablePrefixTokens,t.prefixHitRate,t.tier),n=In(t.compressedTokens,0,0,t.tier)+(t.compressorCostTokens??
|
|
548
|
+
0),r=e-n,o=t.tier.minimumCacheTokens,i=o!=null&&t.originalTokens>=o&&t.compressedTokens<o,a;if(r<=0){let c=e<t.originalTokens;a=i?`compressing drops the prompt out of the cacheable tier (${t.compressedTokens}\
|
|
549
|
+
< ${o}) and costs more than it saves`:c?`not compressing is cheaper: the provider's prefix cache already discounts this prompt (${e.toFixed(0)} vs ${n.toFixed(0)} equivalent tokens, at a ${(t.prefixHitRate*
|
|
486
550
|
100).toFixed(0)}% hit rate)`:"the saving does not cover the compressor's cost";}else i?a=`pays off even after losing the prefix cache (${(t.prefixHitRate*100).toFixed(0)}% hit rate)`:a="pays off and do\
|
|
487
|
-
es not touch the cache tier";return {comprimir:
|
|
488
|
-
|
|
489
|
-
totalTokens?null:1)}var
|
|
490
|
-
1)*e}estado(e){return this.estados.get(e)}decidir(e,n){let
|
|
491
|
-
{marcar:true,razon:"marking cannot lose money at this tier (no write premium)",umbral:
|
|
492
|
-
|
|
493
|
-
is only observable on requests that were marked`,umbral:
|
|
494
|
-
razon:`prefix-cache marking OFF: measured hit rate ${
|
|
495
|
-
tokensLeidos:0,tokensEscritos:0,apagada:false};
|
|
496
|
-
if(!t)return null;let e=t.tokensLeidos+t.tokensEscritos;return e<=0?t.marcadas>0?0:null:t.tokensLeidos/e}function
|
|
497
|
-
if(!t||!e)return null;let
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
for(let n of
|
|
503
|
-
e)}decidir(e,n){let
|
|
504
|
-
ation rate ${i(
|
|
505
|
-
); the escalation rate is only observable on requests that were actually routed`,observada:
|
|
506
|
-
n.equilibrio)} break-even (this is a MONEY check, not a quality one)`,observada:
|
|
507
|
-
is at or above the ${i(n.equilibrio)} break-even, so routing was costing money`,observada:
|
|
508
|
-
n&&(
|
|
509
|
-
for(let
|
|
510
|
-
[]).filter(
|
|
551
|
+
es not touch the cache tier";return {comprimir:r>0,costeComprimido:n,costeSinComprimir:e,ganancia:r,razon:a}}function Ei(t){let e=o=>Yr({...t,prefixHitRate:o}).ganancia;if(e(0)<=0||e(1)>0)return null;let n=0,
|
|
552
|
+
r=1;for(let o=0;o<40;o++){let s=(n+r)/2;e(s)>0?n=s:r=s;}return (n+r)/2}function Pu(t){let e=Ei({originalTokens:t.totalTokens,compressedTokens:t.totalTokens,stablePrefixTokens:t.stablePrefixTokens,tier:t.tier});return e??(In(t.totalTokens,t.stablePrefixTokens,0,t.tier)<=t.
|
|
553
|
+
totalTokens?null:1)}var _n=class{exploracion;estados=new Map;constructor(e={}){this.exploracion=Math.max(1,e.exploracion??8);}costeDeExploracion(e,n){return this.exploracion*Math.max(0,n.cacheWriteMultiplier-
|
|
554
|
+
1)*e}estado(e){return this.estados.get(e)}decidir(e,n){let r=Pu(n),o=this.estados.get(e),s=Du(o);return n.stablePrefixTokens<=0?{marcar:false,razon:"no stable prefix to cache",umbral:r,observada:s}:r==null?
|
|
555
|
+
{marcar:true,razon:"marking cannot lose money at this tier (no write premium)",umbral:r,observada:s}:o?.apagada?{marcar:false,razon:`prefix-cache marking OFF: measured hit rate ${tt(s)} did not reach the ${tt(
|
|
556
|
+
r)} break-even, so marking was costing money`,umbral:r,observada:s}:o==null||o.marcadas<this.exploracion?{marcar:true,razon:`exploring the prefix cache (${o?.marcadas??0}/${this.exploracion}); hit rate \
|
|
557
|
+
is only observable on requests that were marked`,umbral:r,observada:s}:s!=null&&s>r?{marcar:true,razon:`measured hit rate ${tt(s)} beats the ${tt(r)} break-even`,umbral:r,observada:s}:(o.apagada=true,{marcar:false,
|
|
558
|
+
razon:`prefix-cache marking OFF: measured hit rate ${tt(s)} did not reach the ${tt(r)} break-even, so marking was costing money`,umbral:r,observada:s})}registrar(e,n){let r=this.estados.get(e)??{marcadas:0,
|
|
559
|
+
tokensLeidos:0,tokensEscritos:0,apagada:false};r.marcadas+=1,r.tokensLeidos+=Math.max(0,n.cachedInputTokens??0),r.tokensEscritos+=Math.max(0,n.cacheWriteInputTokens??0),this.estados.set(e,r);}};function Du(t){
|
|
560
|
+
if(!t)return null;let e=t.tokensLeidos+t.tokensEscritos;return e<=0?t.marcadas>0?0:null:t.tokensLeidos/e}function tt(t){return t==null?"n/a":`${(t*100).toFixed(1)}%`}var Ri=.5;function Ou(t,e){return e.inputPer1k<=0||e.outputPer1k<=0?null:Math.max(t.inputPer1k/e.inputPer1k,t.outputPer1k/e.outputPer1k)}function Au(t){return 1-t}function Mu(t,e=Ri){return e-t}function Ci(t,e,n=Ri){
|
|
561
|
+
if(!t||!e)return null;let r=Ou(t,e);if(r==null||!Number.isFinite(r))return null;let o=Au(r),s=Mu(r,n),i=s>0,a=c=>`${(c*100).toFixed(1)}%`;return {r,equilibrio:o,escaladoMaximo:s,viable:i,razon:i?`the c\
|
|
562
|
+
heap model costs ${a(r)} of the strong one, so routing pays off while escalations stay under ${a(s)} (it stops saving money at ${a(o)})`:`the cheap model costs ${a(r)} of the strong one: even with zer\
|
|
563
|
+
o escalations it cannot reach the ${a(n)} target, so this pair is not worth the quality risk`}}var Zr={"gpt-4":"gpt-4o","gpt-4-turbo":"gpt-4o-mini","gpt-4o":"gpt-4o-mini","gpt-4.1":"gpt-4.1-mini","cla\
|
|
564
|
+
ude-opus-4":"claude-haiku-4-5","claude-sonnet-4":"claude-haiku-4-5","claude-3-opus":"claude-3-haiku","claude-3-5-sonnet":"claude-3-5-haiku"};function Lu(t){return Object.keys(t).sort((e,n)=>n.length-e.
|
|
565
|
+
length||e.localeCompare(n))}function Ii(t,e=Zr){if(!t)return null;let n=t.lastIndexOf("/"),r=n>=0?t.slice(0,n+1):"",o=n>=0?t.slice(n+1):t,s=e[t]??e[o]??Nu(o,e);return !s||s===o?null:r+s}function Nu(t,e){
|
|
566
|
+
for(let n of Lu(e))if(t.startsWith(n)&&t.charAt(n.length)==="-"&&/^\d{4}/.test(t.slice(n.length+1)))return e[n]}var Pn=class{exploracion;estados=new Map;constructor(e={}){this.exploracion=Math.max(1,e.exploracion??20);}costeDeExploracion(e){return this.exploracion*Math.max(0,e)}estado(e){return this.estados.get(
|
|
567
|
+
e)}decidir(e,n){let r=this.estados.get(e),o=ju(r),s=r?.enrutadas??0,i=a=>a==null?"n/a":`${(a*100).toFixed(1)}%`;return r?.apagada?{enrutar:false,razon:`model cascade OFF for this workload: measured escal\
|
|
568
|
+
ation rate ${i(o)} is at or above the ${i(n.equilibrio)} break-even, so routing was costing money`,observada:o,muestras:s}:s<this.exploracion?{enrutar:true,razon:`measuring this workload (${s}/${this.exploracion}\
|
|
569
|
+
); the escalation rate is only observable on requests that were actually routed`,observada:o,muestras:s}:o!=null&&o<n.equilibrio?{enrutar:true,razon:`measured escalation rate ${i(o)} stays under the ${i(
|
|
570
|
+
n.equilibrio)} break-even (this is a MONEY check, not a quality one)`,observada:o,muestras:s}:(r&&(r.apagada=true),{enrutar:false,razon:`model cascade OFF for this workload: measured escalation rate ${i(o)}\
|
|
571
|
+
is at or above the ${i(n.equilibrio)} break-even, so routing was costing money`,observada:o,muestras:s})}registrar(e,n){let r=this.estados.get(e)??{enrutadas:0,escaladas:0,apagada:false};r.enrutadas+=1,
|
|
572
|
+
n&&(r.escaladas+=1),this.estados.set(e,r);}};function ju(t){return !t||t.enrutadas<=0?null:t.escaladas/t.enrutadas}var Bu=["enum","pattern","maximum","minimum","maxLength","minLength","maxItems","minItems"];function Fu(t){return t?Xr(t)?"value-constrained":"structural":"none"}function Xr(t,e=0){if(e>12)return false;let n=t;
|
|
573
|
+
for(let r of Bu)if(n[r]!==void 0)return true;if(t.properties){for(let r of Object.values(t.properties))if(Xr(r,e+1))return true}return !!(t.items&&Xr(t.items,e+1))}function _i(t){let e=Fu(t.schema),n=(t.tools??
|
|
574
|
+
[]).filter(r=>r.risk==="write"||r.risk==="destructive");return n.length>0?{elegible:false,fuerza:e,razon:`the request carries ${n.length} write/destructive tool(s); a cheaper model's choice of ACTION can\
|
|
511
575
|
not be checked by an output contract, so the cascade never applies here`}:e==="none"?{elegible:false,fuerza:e,razon:"no output contract: the deterministic verifier would accept anything, which would repo\
|
|
512
576
|
rt a perfect escalation rate over answers nobody checked. Declare `response.schema` to route"}:{elegible:true,fuerza:e,razon:e==="value-constrained"?"output contract carries value constraints, so wrong \
|
|
513
|
-
content has somewhere to fall":"output contract checks shape only: a well-formed answer with wrong content passes"}}function
|
|
577
|
+
content has somewhere to fall":"output contract checks shape only: a well-formed answer with wrong content passes"}}function Qr(t){let e=[];if(e.push("non-empty"),t.texto.trim()==="")return {acepta:false,
|
|
514
578
|
motivo:"the cheap model returned an empty answer",comprobaciones:e};if(e.push("final-answer"),t.pidioHerramientas)return {acepta:false,motivo:"the cheap model asked to run tools: that is an action, not a \
|
|
515
579
|
final answer, and the output contract cannot check it",comprobaciones:e};if(e.push("not-truncated"),t.finishReason==="length")return {acepta:false,motivo:"the cheap model's answer was cut off by maxOutput\
|
|
516
580
|
Tokens",comprobaciones:e};if(e.push("output-contract"),!t.schema)return {acepta:false,motivo:"no output contract to verify against",comprobaciones:e};let n;try{n=JSON.parse(t.texto);}catch{return {acepta:false,
|
|
517
|
-
motivo:"the cheap model's answer is not valid JSON",comprobaciones:e}}let
|
|
518
|
-
acepta:false,motivo:`the cheap model's answer does not satisfy the output contract (${
|
|
519
|
-
JSON.parse(t),
|
|
520
|
-
le facts (free prose only)"}
|
|
521
|
-
of a false valid \u2014 it is a reason to look, never a verdict"}}var
|
|
522
|
-
an")n.push(`b:${t}`);else if(typeof t=="string"){let
|
|
523
|
-
t")for(let
|
|
524
|
-
, because a number nobody can check is not a number at all but a promise, and this product exists to stop making those. ";function
|
|
525
|
-
0,t)}function
|
|
526
|
-
"object":t.items?"array":void 0)){case "string":return t.maxLength!=null?{valor:
|
|
527
|
-
{valor:Math.trunc(t.maximum)}:void 0;case "number":return;case "array":{if(t.maxItems==null||!t.items)return;let n=
|
|
528
|
-
ject":{if(t.additionalProperties!==false||!t.properties)return;let n={};for(let[o
|
|
529
|
-
t);return e?JSON.stringify(e.valor):null}function
|
|
530
|
-
let r
|
|
581
|
+
motivo:"the cheap model's answer is not valid JSON",comprobaciones:e}}let r=ee(n,t.schema);return r.valid?{acepta:true,motivo:"the cheap model's answer satisfies the output contract",comprobaciones:e}:{
|
|
582
|
+
acepta:false,motivo:`the cheap model's answer does not satisfy the output contract (${r.errors.slice(0,3).map(s=>`${s.path}: ${s.message}`).join("; ")})`,comprobaciones:e}}function Pi(t,e){let n,r;try{n=
|
|
583
|
+
JSON.parse(t),r=JSON.parse(e);}catch{return {divergen:false,motivo:"not comparable (at least one answer is not JSON)"}}let o=Dn(n),s=Dn(r);return o.length===0&&s.length===0?{divergen:false,motivo:"no comparab\
|
|
584
|
+
le facts (free prose only)"}:$u(o,s)?{divergen:false,motivo:"the hard values agree"}:{divergen:true,motivo:"both answers satisfy the contract but disagree on at least one hard value; this is the signature \
|
|
585
|
+
of a false valid \u2014 it is a reason to look, never a verdict"}}var zu=40;function Dn(t,e=0,n=[]){if(e>12)return n;if(typeof t=="number"&&Number.isFinite(t))n.push(`n:${t}`);else if(typeof t=="boole\
|
|
586
|
+
an")n.push(`b:${t}`);else if(typeof t=="string"){let r=t.trim();r.length>0&&r.length<=zu&&n.push(`s:${r.toLowerCase()}`);}else if(Array.isArray(t))for(let r of t)Dn(r,e+1,n);else if(t&&typeof t=="objec\
|
|
587
|
+
t")for(let r of Object.keys(t).sort())Dn(t[r],e+1,n);return n.sort()}function $u(t,e){if(t.length!==e.length)return false;for(let n=0;n<t.length;n++)if(t[n]!==e[n])return false;return true}var Di="the layer measures both worlds against the same provider so that no baseline can be fabricated, keeps one ledger per lever, and refuses to publish a saving whose answer got worse along the way\
|
|
588
|
+
, because a number nobody can check is not a number at all but a promise, and this product exists to stop making those. ";function Vu(t){if(t<=0)return "";let e=Di;for(;e.length<t;)e+=Di;return e.slice(
|
|
589
|
+
0,t)}function Uu(t){let e=t[0],n=-1;for(let r of t){let o=JSON.stringify(r)?.length??0;o>n&&(n=o,e=r);}return e}function eo(t){if(t.enum&&t.enum.length>0)return {valor:Uu(t.enum)};switch(t.type??(t.properties?
|
|
590
|
+
"object":t.items?"array":void 0)){case "string":return t.maxLength!=null?{valor:Vu(t.maxLength)}:void 0;case "boolean":return {valor:false};case "null":return {valor:null};case "integer":return t.maximum!=null?
|
|
591
|
+
{valor:Math.trunc(t.maximum)}:void 0;case "number":return;case "array":{if(t.maxItems==null||!t.items)return;let n=eo(t.items);return n?{valor:Array.from({length:t.maxItems},()=>n.valor)}:void 0}case "ob\
|
|
592
|
+
ject":{if(t.additionalProperties!==false||!t.properties)return;let n={};for(let[r,o]of Object.entries(t.properties)){let s=eo(o);if(!s)return;n[r]=s.valor;}return {valor:n}}default:return}}function qu(t){let e=eo(
|
|
593
|
+
t);return e?JSON.stringify(e.valor):null}function Oi(t,e){let n=qu(t);return n===null?null:e(n)}var On=16,Ai=64,Hu=8,Ku="measured live on the same triage contract, 8 paired reps each: gpt-4o-mini wrote 16 tokens MORE (-8.2% net) and gpt-4o wrote 3 tokens FEWER (+8.0% net)";function Mi(t,e,n,r={}){
|
|
594
|
+
let o=r.minimumSavingsTokens??Hu,s;try{if(ro(t,0))return {applied:!1,reason:"schema has a pattern; no witness can be synthesised to prove the round trip"};s=so(t,0);}catch(C){return {applied:false,reason:C instanceof
|
|
531
595
|
RangeError?"schema too deep or cyclic":"schema could not be compacted"}}if(s.renamed===0&&s.coded===0)return {applied:false,reason:"nothing to compact (no renameable keys, no codeable enums)"};let i=s.node;
|
|
532
|
-
if(!i)return {applied:false,reason:"nothing to compact"};let a=
|
|
533
|
-
s.compact)),
|
|
534
|
-
|
|
535
|
-
evidencia;if(
|
|
536
|
-
e model, not of the schema: ${
|
|
537
|
-
chmarks/ab-live.ts) and pass it in`};let
|
|
538
|
-
he input win is capped by the size of the schema while the output loss grows with the answer and is billed ${
|
|
539
|
-
n.inputPer1k:
|
|
540
|
-
ut tokens ($${
|
|
541
|
-
1)} input tokens equivalent): the compact contract saves ${
|
|
542
|
-
codedEnumValues:s.coded,schemaTokensOriginal:d,schemaTokensCompact:
|
|
543
|
-
function
|
|
544
|
-
ok:false,reason:"compact witness does not validate against the compact schema"};if(!
|
|
545
|
-
ject"||t.type==null&&t.properties!=null}function
|
|
546
|
-
ng")?null:e}function
|
|
547
|
-
coded:0};let
|
|
548
|
-
enumBack:s},renamed:0,coded:
|
|
549
|
-
let
|
|
550
|
-
let c={};for(let[
|
|
551
|
-
h,g]of a)h!==g&&(
|
|
552
|
-
if(!t.items)return {compact:t,renamed:0,coded:0};let n=
|
|
553
|
-
...t].sort(),
|
|
554
|
-
!
|
|
555
|
-
t;if(e.items&&Array.isArray(t))return t.map(s=>
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
if(n>
|
|
559
|
-
0)return [];let
|
|
560
|
-
let
|
|
561
|
-
"integer"?Math.round(
|
|
562
|
-
values(t.properties??{}))if(
|
|
563
|
-
isArray(t),
|
|
564
|
-
return false;for(let i of
|
|
565
|
-
enums)",pares:8}},
|
|
566
|
-
Number.isFinite(
|
|
567
|
-
origen:"remembered",procedencia:`measured by the caller on an earlier request for this contract on ${e}`};let s=
|
|
568
|
-
Velio on ${e} (${
|
|
569
|
-
|
|
570
|
-
n)}:${
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
get(
|
|
574
|
-
(o
|
|
575
|
-
|
|
596
|
+
if(!i)return {applied:false,reason:"nothing to compact"};let a=C=>nt(C,i,true),c=C=>nt(C,i,false),u=Xu(t),l=Ju(t,s.compact,i,u);if(!l.ok)return {applied:false,reason:l.reason};let d=e(JSON.stringify(t)),m=e(JSON.stringify(
|
|
597
|
+
s.compact)),f=d-m,h=Number.POSITIVE_INFINITY;for(let C of u){let _=e(JSON.stringify(C))-e(JSON.stringify(a(C)));_<h&&(h=_);}Number.isFinite(h)||(h=0);let g=C=>C/1e3*n.inputPer1k,p=C=>C/1e3*n.outputPer1k,
|
|
598
|
+
v=g(o),b=n.outputPer1k>0?(o-f)*n.inputPer1k/n.outputPer1k:Number.NEGATIVE_INFINITY,x=Number.isFinite(b)?b.toFixed(1):"any",y=n.inputPer1k>0?`${(n.outputPer1k/n.inputPer1k).toFixed(1)}x`:"more than",k=r.
|
|
599
|
+
evidencia;if(k==null)return {applied:false,reason:`no measured output delta for this model, so the codebook is not applied. Short field names change how much the model WRITES, and that is a property of th\
|
|
600
|
+
e model, not of the schema: ${Ku}. Here the compact contract saves ${f} input tokens and output is billed ${y} input, so it only pays while the output delta stays above ${x} tokens. Measure yours (ben\
|
|
601
|
+
chmarks/ab-live.ts) and pass it in`};let E=k.deltaTokens;if(E<0)return {applied:false,reason:`the measured output delta is ${E} tokens: this model writes MORE from a compact contract (${k.procedencia}). T\
|
|
602
|
+
he input win is capped by the size of the schema while the output loss grows with the answer and is billed ${y} input, so no schema is big enough to buy it back`};let w=g(f)+p(E),I=n.inputPer1k>0?w*1e3/
|
|
603
|
+
n.inputPer1k:f,O=`+${E} tokens (${E>0?"the model wrote LESS":"no measured change"}), ${k.procedencia}`;return w<v?{applied:false,reason:`net saving $${w.toFixed(9)}/request is below the floor of ${o} inp\
|
|
604
|
+
ut tokens ($${v.toFixed(9)}): the compact contract saves ${f} input tokens and the measured output delta is ${O}; break-even at ${x}`}:{applied:true,reason:`net saving $${w.toFixed(9)}/request (${I.toFixed(
|
|
605
|
+
1)} input tokens equivalent): the compact contract saves ${f} input tokens and the measured output delta is ${O}; break-even at ${x}`,plan:{compactSchema:s.compact,expand:c,compact:a,renamedKeys:s.renamed,
|
|
606
|
+
codedEnumValues:s.coded,schemaTokensOriginal:d,schemaTokensCompact:m,modelledShapeSavingTokens:h,measuredOutputDeltaTokens:E,outputDeltaProvenance:k.procedencia,breakEvenOutputDeltaTokens:b,netSavingUsd:w}}}
|
|
607
|
+
function Ju(t,e,n,r){for(let o of r){if(!ee(o,t).valid)return {ok:false,reason:"synthesised witness does not satisfy the caller's own schema; nothing can be proven"};let s=nt(o,n,true);if(!ee(s,e).valid)return {
|
|
608
|
+
ok:false,reason:"compact witness does not validate against the compact schema"};if(!oo(nt(s,n,false),o))return {ok:false,reason:"round trip is not the identity"}}return {ok:true}}function Li(t){return t.type==="ob\
|
|
609
|
+
ject"||t.type==null&&t.properties!=null}function Ni(t){return t.type==="array"||t.type==null&&t.items!=null}function Wu(t){let e=t.enum;return !e||e.length===0||e.length>Ai||!e.every(n=>typeof n=="stri\
|
|
610
|
+
ng")?null:e}function so(t,e){if(e>On)throw new RangeError("schema too deep");let n=Wu(t);if(n){if(t.minLength!=null)return {compact:t,renamed:0,coded:0};let r=ji(n,true);if(!r)return {compact:t,renamed:0,
|
|
611
|
+
coded:0};let o=[...r].filter(([i,a])=>i!==a).length;if(o===0)return {compact:t,renamed:0,coded:0};let s=new Map;for(let[i,a]of r)s.set(a,i);return {compact:{...t,enum:n.map(i=>r.get(i))},node:{enumFwd:r,
|
|
612
|
+
enumBack:s},renamed:0,coded:o}}return Li(t)?Gu(t,e):Ni(t)?Yu(t,e):{compact:t,renamed:0,coded:0}}function Gu(t,e){let n=Object.entries(t.properties??{});if(n.length===0)return {compact:t,renamed:0,coded:0};
|
|
613
|
+
let r=0,o=0,s=new Map,i=new Map;for(let[m,f]of n){let h=so(f,e+1);i.set(m,h.compact),h.node&&s.set(m,h.node),r+=h.renamed,o+=h.coded;}let a=null;t.additionalProperties===false&&(a=ji(n.map(([m])=>m),false));
|
|
614
|
+
let c={};for(let[m]of n)c[a?.get(m)??m]=i.get(m);let u={...t,properties:c};t.required&&(u.required=t.required.map(m=>a?.get(m)??m));let l={};if(a){let m=new Map;for(let[h,g]of a)m.set(g,h);let f=false;for(let[
|
|
615
|
+
h,g]of a)h!==g&&(f=true);if(f){l.keysFwd=a,l.keysBack=m;for(let[h,g]of a)h!==g&&(r+=1);}}s.size>0&&(l.props=s);let d=!l.keysFwd&&!l.props;return {compact:u,...d?{}:{node:l},renamed:r,coded:o}}function Yu(t,e){
|
|
616
|
+
if(!t.items)return {compact:t,renamed:0,coded:0};let n=so(t.items,e+1);return {compact:{...t,items:n.compact},...n.node?{node:{items:n.node}}:{},renamed:n.renamed,coded:n.coded}}function ji(t,e){let n=[
|
|
617
|
+
...t].sort(),r=new Set,o=new Map;n.forEach((i,a)=>{let c=e?i.toUpperCase():i,u=i;for(let l=1;l<i.length;l++){let d=c.slice(0,l);if(!r.has(d)){u=d;break}}if(u===i){let l=a.toString(36);l.length<i.length&&
|
|
618
|
+
!r.has(l)&&(u=l);}r.add(u),o.set(i,u);});let s=new Set(t);for(let[i,a]of o)if(a!==i&&s.has(a))return null;return o}function nt(t,e,n){let r=n?e.enumFwd:e.enumBack;if(r&&typeof t=="string")return r.get(t)??
|
|
619
|
+
t;if(e.items&&Array.isArray(t))return t.map(s=>nt(s,e.items,n));let o=n?e.keysFwd:e.keysBack;if((o||e.props)&&Zu(t)){let s={};for(let[i,a]of Object.entries(t)){let c=o?.get(i)??i,u=n?i:c,l=e.props?.get(
|
|
620
|
+
u);s[c]=l?nt(a,l,n):a;}return s}return t}function Zu(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Xu(t){let e=Math.min(Ai,Math.max(1,to(t,0))),n=[];for(let r=0;r<e;r++)n.push(no(t,
|
|
621
|
+
r,0));return n}function to(t,e){if(e>On)return 0;let n=t.enum?.length??0;for(let r of Object.values(t.properties??{}))n=Math.max(n,to(r,e+1));return t.items&&(n=Math.max(n,to(t.items,e+1))),n}function no(t,e,n){
|
|
622
|
+
if(n>On)return null;if(t.enum&&t.enum.length>0)return t.enum[Math.min(e,t.enum.length-1)];if(Li(t)){let r={};for(let[o,s]of Object.entries(t.properties??{}))r[o]=no(s,e,n+1);return r}if(Ni(t)){if(t.maxItems===
|
|
623
|
+
0)return [];let r=Math.max(1,t.minItems??1),o=t.maxItems!=null?Math.min(r,t.maxItems):r,s=t.items;return Array.from({length:o},()=>s?no(s,e,n+1):null)}switch(t.type){case "string":{if(t.maxLength===0)return "";
|
|
624
|
+
let r=Math.max(1,t.minLength??1),o=t.maxLength!=null?Math.min(r,t.maxLength):r;return "x".repeat(o)}case "number":case "integer":{let r=t.minimum??1;return t.maximum!=null&&r>t.maximum&&(r=t.maximum),t.type===
|
|
625
|
+
"integer"?Math.round(r):r}case "boolean":return true;case "null":return null;default:return null}}function ro(t,e){if(e>On)throw new RangeError("schema too deep");if(t.pattern!=null)return true;for(let n of Object.
|
|
626
|
+
values(t.properties??{}))if(ro(n,e+1))return true;return !!(t.items&&ro(t.items,e+1))}function oo(t,e){if(t===e)return true;if(t===null||e===null||typeof t!="object"||typeof e!="object")return false;let n=Array.
|
|
627
|
+
isArray(t),r=Array.isArray(e);if(n||r){if(!n||!r||t.length!==e.length)return false;for(let i=0;i<t.length;i++)if(!oo(t[i],e[i]))return false;return true}let o=Object.keys(t),s=Object.keys(e);if(o.length!==s.length)
|
|
628
|
+
return false;for(let i of o)if(!Object.prototype.hasOwnProperty.call(e,i)||!oo(t[i],e[i]))return false;return true}var Qu="2026-08-14",Bi={"gpt-4o-mini":{deltaTokens:-16,salidaDelBrazoA:72,contrato:"triage (6 fields, long enums)",pares:8},"gpt-4o":{deltaTokens:3,salidaDelBrazoA:75,contrato:"triage (6 fields, long \
|
|
629
|
+
enums)",pares:8}},el=$n(Bi);function tl(t){return Bt(Bi,el,t)}var An=class t{deltas=new Map;static clave(e,n){return `${e}\0${n}`}recordar(e,n,r){this.deltas.set(t.clave(e,n),r);}resolver(e,n,r){if(r!=null&&
|
|
630
|
+
Number.isFinite(r))return this.recordar(e,n,r),{deltaTokens:r,origen:"caller",procedencia:`measured by the caller for this contract on ${e}`};let o=this.deltas.get(t.clave(e,n));if(o!=null)return {deltaTokens:o,
|
|
631
|
+
origen:"remembered",procedencia:`measured by the caller on an earlier request for this contract on ${e}`};let s=tl(e);return s?{deltaTokens:s.deltaTokens,origen:"catalogue",procedencia:`measured by Bi\
|
|
632
|
+
Velio on ${e} (${Qu}, ${s.pares} paired reps, ${s.contrato}, ${s.salidaDelBrazoA}-token answers) \u2014 NOT measured on YOUR contract`}:null}};var ao="[BiVelio Savings: an older tool result was trimmed here to lower the cost; the most recent results travel in full.]",nl=new TextEncoder;function rl(t){return nl.encode(t).length}function ol(t,e){if(!t)return null;let n=(e??"").trim();if(n===""||n==="{}"||n==="[]")return null;let r;try{let o=JSON.parse(n);if(o&&typeof o=="object"&&!Array.isArray(o)&&Object.keys(o).length===0)return null;
|
|
633
|
+
r=io(o);}catch{r=n;}return `${t} ${r}`}function io(t){return t===null||typeof t!="object"?JSON.stringify(t)??"null":Array.isArray(t)?`[${t.map(io).join(",")}]`:`{${Object.keys(t).sort().map(n=>`${JSON.stringify(
|
|
634
|
+
n)}:${io(t[n])}`).join(",")}}`}function Fi(t){let e=new Map,n=new Map;for(let u of t)if(u.role==="assistant"&&u.toolCalls)for(let l of u.toolCalls)l.id&&(e.set(l.id,l.arguments),n.set(l.id,l.name));let r=[],
|
|
635
|
+
o=new Map;for(let u=0;u<t.length;u++){let l=t[u];if(l.role!=="tool")continue;r.push(u);let d=(l.toolCallId?n.get(l.toolCallId):void 0)??l.name,m=l.toolCallId?e.get(l.toolCallId):void 0,f=ol(d,m);f!==null&&
|
|
636
|
+
o.set(u,f);}let s=r.length?r[r.length-1]:-1,i=new Map;for(let u of r){let l=o.get(u);if(l===void 0)continue;let d=i.get(l);(d===void 0||u>d)&&i.set(l,u);}let a=[],c=0;for(let u of r){if(u===s)continue;let l=o.
|
|
637
|
+
get(u);if(l===void 0||i.get(l)===u)continue;let d=rl(t[u].content);d<1024||(a.push(u),c+=d);}return {indices:a,bytesOriginales:c}}function zi(t,e){if(e.length===0)return t;let n=new Set(e);return t.map(
|
|
638
|
+
(r,o)=>n.has(o)?{...r,content:ao}:r)}function co(t,e){if(e?.cacheTier)return e.cacheTier;let n=t.toLowerCase(),r=n.indexOf("/"),o=r>0?n.slice(0,r):"",s=r>=0?n.slice(r+1):n;return o==="openai"||o==="azure-openai"?Jr:o==="anthropic"?Wr(s):
|
|
639
|
+
o==="google"||o==="google-vertex"?Gr:/^(gpt-|o[1-9](-|$)|chatgpt)/.test(s)?Jr:s.startsWith("claude")?Wr(s):s.startsWith("gemini")?Gr:Ti}function $i(t){let e=t.prefix!=null,n=Yr({originalTokens:t.originalTokens,
|
|
576
640
|
compressedTokens:t.compressedTokens,stablePrefixTokens:t.prefix?.stableTokens??0,prefixHitRate:t.prefix?.hitRate??0,tier:t.tier,...t.compressorCostTokens!=null?{compressorCostTokens:t.compressorCostTokens}:
|
|
577
|
-
{}});if(e)return n;let
|
|
578
|
-
compressedTokens} < ${
|
|
579
|
-
s=
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
costeDeDosLlamadas:s,ganancia:i,perdidaSiDegrada:a,razon:
|
|
583
|
-
0,
|
|
584
|
-
get(c);if(!
|
|
585
|
-
let n=0,
|
|
641
|
+
{}});if(e)return n;let r=t.tier.minimumCacheTokens;return r!=null&&t.originalTokens>=r&&t.compressedTokens<r?{...n,comprimir:false,razon:`compressing would drop the prompt out of the cacheable tier (${t.
|
|
642
|
+
compressedTokens} < ${r}) and nobody has measured the prefix hit rate, so it cannot be claimed to pay for itself. Declare it in \`compressionEconomics.prefix\` to unlock the full decision`}:n}function Ui(t){let e=l=>l/1e3*t.precio.inputPer1k,n=l=>l/1e3*t.precio.outputPer1k,r=e(t.promptTokens+t.descriptoresLigeros)+n(t.salidaDelSondeo),o=e(t.promptTokens+t.esquemasCompletos)+n(t.salidaFinal),
|
|
643
|
+
s=r+e(t.promptTokens+t.esquemasDeLaSegunda)+n(t.salidaFinal),i=o-s,a=r,c=i>0&&i>=a,u;return i<=0?u=`discovery costs more than it saves: the prompt (${t.promptTokens} tokens) is paid twice and the sche\
|
|
644
|
+
mas avoided (${t.esquemasCompletos-t.esquemasDeLaSegunda}) do not cover it`:c?u=`${t.esquemasCompletos-t.esquemasDeLaSegunda} schema tokens avoided in the worst case, enough to pay for the repeated pr\
|
|
645
|
+
ompt and the probe`:u="the gain does not cover the cost of degrading: if the probe does not choose, the request goes out unchanged with every schema and the probe is pure cost",{aplicar:c,costeDeUnaLlamada:o,
|
|
646
|
+
costeDeDosLlamadas:s,ganancia:i,perdidaSiDegrada:a,razon:u}}function qi(t){let n=(t.description??(Array.isArray(t.intents)?t.intents.join("; "):"")).trim().split(/\r?\n/,1)[0]??"",r=n.length>Vi?n.slice(
|
|
647
|
+
0,Vi-1).trimEnd()+"\u2026":n;return {id:t.id,intents:t.intents,risk:t.risk,...r?{description:r}:{}}}var Vi=200;function Hi(t,e,n){let r=new Map(e.map(c=>[c.id,c])),o=[],s=[],i=new Set;for(let c of t){let u=r.
|
|
648
|
+
get(c);if(!u){s.push(c);continue}o.includes(u.id)||(o.push(u.id),u.risk==="read"&&i.size<Math.max(0,n)&&i.add(u.id));}return {tools:e.filter(c=>c.risk!=="read"||i.has(c.id)),reconocidos:o,ignorados:s}}function Ki(t,e){
|
|
649
|
+
let n=0,r=[];for(let o of t)o.risk==="read"?r.push(o.tokens):n+=o.tokens;r.sort((o,s)=>s-o);for(let o of r.slice(0,Math.max(0,e)))n+=o;return n}var il=2;function uo(t){return G(ae({messages:t.messages,structuredData:t.structuredData??null,tools:t.tools??[],schema:t.response?.schema??null}))}function Ji(t){return t.temperature===0}var Me=t=>typeof t==
|
|
650
|
+
"number"&&Number.isInteger(t)&&t>=0;function al(t,e){if(Me(t.reasoningTokens)){if(!e)return t.reasoningTokens;if(Me(e.reasoningTokens))return t.reasoningTokens+e.reasoningTokens}}function Wi(t){if(t.contadorSimulado)
|
|
651
|
+
return "simulated-provider";let e=t.usoPrimario;if(!e||e.complete===false||!Me(e.inputTokens)||e.inputTokens<=0||!Me(e.outputTokens))return "no-usage";let n=t.usoReparacion;if(n&&(n.complete===false||!Me(n.outputTokens)))
|
|
652
|
+
return "no-usage";if(t.eliminatedInput!==0||t.compressedInput!==0||t.elididoLocal!==0||Math.abs(t.sentLocalSinSondeo-t.baselineInput)>il)return "layer-changed-request";if(t.codebookAplicado)return "codeb\
|
|
653
|
+
ook";if(t.tokensDelSondeo!==0||t.sondeoAplicado)return "tool-discovery";if(t.hayEsquema&&(!t.esquemaNativo||t.esquemaPorPrompt))return "schema-in-prompt";if(t.hayEsquema&&!t.esquemaEnFormatoNativo)return "\
|
|
654
|
+
schema-not-verbatim";if(t.hayEsquema&&!t.esquemaEstricto)return "schema-not-strict";if(t.modeloServido!==t.modeloPedido)return "cheaper-model-served";if(!t.cacheable)return "not-cacheable";let r=en(t.tierServido),
|
|
655
|
+
o=r?.conDescuento&&r.factor!=null&&r.factor>0&&r.factor<1?r.factor:void 0,s=al(e,n);return {v:2,requestId:t.requestId,at:t.at,model:t.modeloPedido,inputTokens:e.inputTokens,outputTokens:n?Math.min(e.outputTokens,
|
|
656
|
+
n.outputTokens):e.outputTokens,...o!==void 0?{tierFactor:o}:{},layerInsertions:Math.max(0,t.mensajesDeLaCapa)+Math.max(0,t.piezasDelAdaptador)+(t.hayEsquema?1:0),...s!==void 0?{reasoningTokens:s}:{},requestFingerprint:t.
|
|
657
|
+
huella(),textSha256:G(t.textoServido)}}var Mn=t=>typeof t=="string"&&t.length>0;function Gi(t){if(t==null||typeof t!="object")return "absent";let e=t.reference;if(e==null)return "absent";if(typeof e!="o\
|
|
658
|
+
bject"||Array.isArray(e))return "malformed";let n=e,r=n.tierFactor,o=n.reasoningTokens;return n.v===2&&typeof n.inputTokens=="number"&&Number.isInteger(n.inputTokens)&&n.inputTokens>0&&Me(n.outputTokens)&&
|
|
659
|
+
typeof n.at=="number"&&Number.isFinite(n.at)&&(r===void 0||typeof r=="number"&&r>0&&r<1)&&Me(n.layerInsertions)&&(o===void 0||Me(o))&&Mn(n.requestId)&&Mn(n.model)&&Mn(n.requestFingerprint)&&Mn(n.textSha256)?
|
|
660
|
+
{v:2,requestId:n.requestId,at:n.at,model:n.model,inputTokens:n.inputTokens,outputTokens:n.outputTokens,...r!==void 0?{tierFactor:r}:{},layerInsertions:n.layerInsertions,...o!==void 0?{reasoningTokens:o}:
|
|
661
|
+
{},requestFingerprint:n.requestFingerprint,textSha256:n.textSha256,...typeof n.cacheKey=="string"?{cacheKey:n.cacheKey}:{}}:"malformed"}function cl(t,e){if(!e.determinista)return "sampled";if(e.salidaDelModelo!==
|
|
662
|
+
void 0)return e.salidaDelModelo;if(t.reasoningTokens===void 0)return "reasoning-not-reported";if(t.reasoningTokens!==0)return "reasoning-reported"}function Yi(t,e){if(e.textoServidoSha256!==t.textSha256)
|
|
663
|
+
return {ok:false,reason:"witness"};if(e.claveLeida!==void 0&&t.cacheKey!==e.claveLeida)return {ok:false,reason:"witness"};if(t.model!==e.modeloPedido||e.modeloServido!==e.modeloPedido)return {ok:false,reason:"mod\
|
|
664
|
+
el-mismatch"};let n=e.ahoraMs-t.at;if(!(n>=-3e5&&n<=2592e6))return {ok:false,reason:"expired"};if(e.huella!==t.requestFingerprint)return {ok:false,reason:"different-request"};if(!e.calidadOk)return {ok:false,reason:"\
|
|
665
|
+
quality"};let r=e.precio,o=r?.cachedInputPer1k;if(!r||typeof o!="number"||!Number.isFinite(o)||!(o>0)||!Number.isFinite(r.inputPer1k)||o>r.inputPer1k||typeof r.outputPer1k!="number"||!Number.isFinite(
|
|
666
|
+
r.outputPer1k)||r.outputPer1k<0)return {ok:false,reason:"no-cached-price"};let s=t.inputTokens-8*t.layerInsertions;if(!(s>0))return {ok:false,reason:"no-credit"};let i=typeof e.topeDeSalida=="number"&&Number.
|
|
667
|
+
isFinite(e.topeDeSalida)?Math.max(0,e.topeDeSalida):Number.POSITIVE_INFINITY,a=cl(t,e),c=a===void 0?Math.floor(.95*Math.min(t.outputTokens,i)):0,u=Math.min(1,t.tierFactor??1,e.diferible?es:1);return {ok:true,
|
|
668
|
+
...a!==void 0?{outputNotCredited:a}:{},credit:{requestId:t.requestId,at:t.at,inputTokens:t.inputTokens,outputTokens:t.outputTokens,creditedInputTokens:s,creditedOutputTokens:c,cachedInputPer1k:o,outputPer1k:r.
|
|
669
|
+
outputPer1k,tierFactor:u}}}var Et={done:true,value:void 0},Rt=class{handle;sumidero;now;inicio;controlador=new AbortController;resolver;rechazar;cola=[];esperas=[];cerrada=false;errorPendiente=null;consumidorSalio=false;iterado=false;_abortado=false;vivo=false;proveedorTerminado=false;terminado=false;primerEventoAt;quitarEscucha;constructor(e,n){
|
|
670
|
+
this.now=e,this.inicio=e();let r,o,s=new Promise((a,c)=>{r=a,o=c;});s.catch(()=>{}),this.resolver=r,this.rechazar=o;let i=this;if(this.sumidero={senal:this.controlador.signal,texto(a){i.recibirTexto(a);},
|
|
671
|
+
proveedorTermino(){i.proveedorTerminado=true;},sirvioEnVivo:false},this.handle={result:s,abort:a=>this.abort(a),[Symbol.asyncIterator]:()=>this.iterador()},n)if(n.aborted)this.abort(n.reason);else {let a=()=>this.
|
|
672
|
+
abort(n.reason);n.addEventListener("abort",a,{once:true}),this.quitarEscucha=()=>n.removeEventListener("abort",a);}}get abortado(){return this._abortado}entrarEnVivo(){this.vivo=true;}completar(e,n){if(this.
|
|
673
|
+
terminado)return;let r=e.toolCalls?.length??0,o=this.primerEventoAt??(n.vivo&&r>0?this.now():void 0),s=n.vivo?{delivery:"live",...o!==void 0?{firstEventMs:o-this.inicio}:{}}:{delivery:"whole",...n.motivo?
|
|
674
|
+
{wholeReason:n.motivo}:{}},i={...e,report:{...e.report,streaming:s}};if(this.resolver(i),!this._abortado){!n.vivo&&i.text!==""&&this.encolar({type:"text",delta:i.text});for(let a of i.toolCalls??[])this.
|
|
675
|
+
encolar({type:"tool_call",call:a});this.encolar({type:"done",result:i});}this.cerrar(),this.acabar();}fallar(e){this.terminado||(this.rechazar(e),this._abortado?this.cerrar():this.fallarCola(e),this.acabar());}acabar(){
|
|
676
|
+
this.terminado=true,this.quitarEscucha?.(),this.quitarEscucha=void 0;}abort(e){this.terminado||this._abortado||(this._abortado=true,this.cola.length=0,this.cerrar(),this.vivo&&!this.proveedorTerminado&&this.
|
|
677
|
+
controlador.abort(e));}recibirTexto(e){e===""||this._abortado||this.terminado||(this.primerEventoAt===void 0&&(this.primerEventoAt=this.now()),this.encolar({type:"text",delta:e}));}encolar(e){if(this.cerrada)
|
|
678
|
+
return;let n=this.esperas.shift();n?n.resolve({done:false,value:e}):this.cola.push(e);}cerrar(){this.cerrada=true;for(let e of this.esperas.splice(0))e.resolve(Et);}fallarCola(e){this.cerrada=true;let[n,...r]=this.
|
|
679
|
+
esperas.splice(0);if(n){n.reject(e);for(let o of r)o.resolve(Et);}else this.errorPendiente={valor:e};}siguiente(){if(this.consumidorSalio)return Promise.resolve(Et);let e=this.cola.shift();if(e)return Promise.
|
|
680
|
+
resolve({done:false,value:e});if(this.errorPendiente){let{valor:n}=this.errorPendiente;return this.errorPendiente=null,Promise.reject(n)}return this.cerrada?Promise.resolve(Et):new Promise((n,r)=>{this.esperas.
|
|
681
|
+
push({resolve:n,reject:r});})}iterador(){if(this.iterado)throw new Error("[bvsala] a SavingsStream can be iterated only once");return this.iterado=true,{next:()=>this.siguiente(),return:()=>(this.abort(),
|
|
682
|
+
this.consumidorSalio=true,this.cola.length=0,Promise.resolve(Et))}}};var le=class extends Error{requestSent;constructor(e){super(e?"[bvsala] stream aborted: the provider request was cancelled before its final usage; nothing was cached or recorded":"[bvsala] stream abor\
|
|
683
|
+
ted before any provider request was sent"),this.name="StreamAbortedError",this.requestSent=e;}};function Ln(t){if(t==null)return {activo:false,motivo:"ausente"};if(typeof t!="object")return {activo:false,motivo:"invalido"};let e=t.sampleRate;if(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)return {activo:false,
|
|
684
|
+
motivo:"invalido"};let n=t.maxCheckCostUsd;if(n!==void 0&&(typeof n!="number"||!Number.isFinite(n)||n<=0))return {activo:false,motivo:"invalido"};if(e===0)return {activo:false,motivo:"cero"};let r=typeof t.onCheck==
|
|
685
|
+
"function"?t.onCheck:void 0,o=typeof t.waitUntil=="function"?t.waitUntil:void 0;return {activo:true,tasa:e,...n!==void 0?{tope:n}:{},...r?{onCheck:r}:{},...o?{waitUntil:o}:{}}}function ul(t){let e=t*100,
|
|
686
|
+
n=Math.round(e*100)/100;return n===0?"<0.01%":Number.isInteger(n)?`${n}%`:`${n.toFixed(2).replace(/0+$/,"").replace(/\.$/,"")}%`}function Zi(t){let e=ul(t);return `[bvsala] Verification sampling is ON \
|
|
687
|
+
(sampleRate ${t}): about ${e} of eligible requests are sent a second time, unoptimized, to your own provider \u2014 in the background, after your answer is returned \u2014 and the second answer is discarded. Yo\
|
|
688
|
+
u pay your provider for those calls: roughly ${e} of what that traffic would cost without the layer. The pairs appear under Proof \u203A Your bench in your dashboard; they are informational and never enter\
|
|
689
|
+
your statement or any commission.`}function Xi(t){let e;try{let n=t?.sampleRate;e=typeof n=="string"?JSON.stringify(n):String(n);}catch{e="an unreadable value";}return `[bvsala] \`verification.sampleRate\
|
|
690
|
+
\` must be a number from 0 to 1 and \`verification.maxCheckCostUsd\`, when set, a positive number (got sampleRate ${e}); verification sampling is OFF.`}var Qi="[bvsala] Verification sampling is set, b\
|
|
691
|
+
ut its pairs have nowhere to go: set `serviceAccountKey` and `licenseServerUrl` (with metering on) to see them in your dashboard \u2014 a custom `meteringUrl` is followed only when it ends in `/api/meterin\
|
|
692
|
+
g/usage` \u2014 or pass `verification.onCheck` to receive them yourself. No request will be sent twice until then.",ea="[bvsala] verification sampling hit an internal error and skipped a request; your\
|
|
693
|
+
request was not affected.";function ta(t){let e=t.messages.map(n=>({...n}));return t.structuredData!==void 0&&e.push({role:"user",content:JSON.stringify(t.structuredData)}),{model:t.model,messages:e,...t.tools&&t.tools.length>0?
|
|
694
|
+
{tools:[...t.tools]}:{},...t.response?.schema?{schema:t.response.schema}:{},...t.response?.maxOutputTokens!=null?{maxOutputTokens:t.response.maxOutputTokens}:{},...t.temperature!==void 0?{temperature:t.
|
|
695
|
+
temperature}:{},...t.seed!==void 0?{seed:t.seed}:{}}}function na(t){let{request:e,result:n,via:r}=t,o=n.report;if(r==="fail-open")return {excluida:"fail_open"};if(e.savings?.verification===false)return {excluida:"opted_out"};let s=n.finishReason;return s==="\
|
|
696
|
+
length"?{excluida:"truncated"}:s!==void 0&&s!=="stop"&&s!=="tool_calls"?{excluida:"incomplete"}:o.constraints.structurallyValid===false||o.qualityStatus==="rejected"?{excluida:"contract_failed"}:o.cost.basis===
|
|
697
|
+
"unmeasured"?{excluida:"unmeasured"}:o.calls.actualRetrieval>0?{excluida:"retrieval"}:t.precio(e.model)===void 0||t.precio(o.model)===void 0?{excluida:"no_price"}:t.tope!==void 0&&o.cost.baselineEstimate>
|
|
698
|
+
t.tope?{excluida:"over_cap"}:o.calls.avoidedLlm>0?{estrato:"avoided_call"}:o.model!==e.model?{estrato:"cheaper_model"}:o.tokens.eliminatedInput>0?{estrato:"tokens_removed"}:o.tokens.compressedInput>0?
|
|
699
|
+
{estrato:"tokens_compressed"}:{estrato:"unchanged"}}function ra(t,e){if(!(e>0))return false;if(e>=1)return true;let n=G(`${t}:verification-sample`);return Number.parseInt(n.slice(0,13),16)/2**52<e}function oa(t,e){let n=t.inputTokens,r=Math.min(t.cachedInputTokens??0,n),o=e.cachedInputPer1k??e.inputPer1k,s=Math.max(0,n-r)/1e3*e.inputPer1k+r/1e3*o+t.outputTokens/1e3*e.outputPer1k;return Math.round(
|
|
700
|
+
s*1e10)/1e10}var ll=32,dl=6e5;function pl(t){return new Date(t).toISOString().slice(0,10)}var Nn=class{tasa;tope;onCheck;waitUntil;provider;precio;contrato;now;sumidero;avisar;enVuelo=new Set;cerrado=false;constructor(e){
|
|
701
|
+
this.tasa=e.ajustes.tasa,this.tope=e.ajustes.tope,this.onCheck=e.ajustes.onCheck,this.waitUntil=e.ajustes.waitUntil,this.provider=e.provider,this.precio=e.precio,this.contrato=e.contrato,this.now=e.now,
|
|
702
|
+
this.sumidero=e.sumidero,this.avisar=e.avisar;}get copiasEnVuelo(){return this.enVuelo.size}decidir(e,n,r){if(this.cerrado)return n;try{let o=n.report,s=ra(o.requestId,this.tasa),i=na({request:e,result:n,
|
|
703
|
+
via:r,precio:this.precio,...this.tope!==void 0?{tope:this.tope}:{}}),a;if(s&&"estrato"in i){let l=this.precio(e.model);if(!l)throw new Error("price vanished between classification and launch");a={peticion:ta(
|
|
704
|
+
e),precios:l,estrato:i.estrato};}let c=this.now();this.sumidero.contar?.(pl(c),"estrato"in i?i.estrato:i.excluida),a&&this.lanzar(e,n,c,a);let u="estrato"in i?{sampled:s,stratum:i.estrato}:{sampled:s,excluded:i.
|
|
705
|
+
excluida};return {...n,report:{...o,verification:u}}}catch{return this.avisar("verificacion-fallo-interno",ea),n}}cerrar(){this.cerrado=true;let e=[...this.enVuelo];this.enVuelo.clear();for(let n of e)if(!n.
|
|
706
|
+
decidido){n.decidido=true,n.reloj&&clearTimeout(n.reloj);try{n.abortar.abort();}catch{}this.registrar({...n.base,outcome:"abandoned"}),n.terminar();}}lanzar(e,n,r,o){let s=n.report,i=o.precios,a={requestId:s.
|
|
707
|
+
requestId,at:r,stratum:o.estrato,requestedModel:e.model,servedModel:s.model,cacheResult:s.cache.result,optimized:{cost:s.cost.actual,inputTokens:s.tokens.actualInput,cachedInputTokens:s.tokens.providerCachedInput??
|
|
708
|
+
0,outputTokens:s.tokens.actualOutput},prices:{inputPer1k:i.inputPer1k,...i.cachedInputPer1k!==void 0?{cachedInputPer1k:i.cachedInputPer1k}:{},outputPer1k:i.outputPer1k}};if(this.enVuelo.size>=ll){this.
|
|
709
|
+
registrar({...a,outcome:"dropped"});return}let c=()=>{},u=new Promise(d=>{c=d;}),l={base:a,abortar:new AbortController,decidido:false,reloj:void 0,terminar:c};if(this.enVuelo.add(l),l.reloj=setTimeout(()=>{
|
|
710
|
+
try{l.abortar.abort();}catch{}this.resolverVuelo(l,{...a,outcome:"check_failed"});},dl),l.reloj.unref?.(),setTimeout(()=>{if(l.decidido)return;let d;try{d=Promise.resolve(this.provider.generate(o.peticion,
|
|
711
|
+
{signal:l.abortar.signal}));}catch(m){d=Promise.reject(m);}d.then(m=>{let f;try{f=this.checkDeLaRespuesta(a,o.peticion,m,i);}catch{f={...a,outcome:"check_failed"};}this.resolverVuelo(l,f);},()=>{this.resolverVuelo(
|
|
712
|
+
l,{...a,outcome:"check_failed"});});},0),this.waitUntil)try{this.waitUntil(u.catch(()=>{}));}catch{}}checkDeLaRespuesta(e,n,r,o){let s=r?.usage,i=s?.inputTokens,a=s?.outputTokens,c=s?.cachedInputTokens??
|
|
713
|
+
0,u=f=>typeof f=="number"&&Number.isSafeInteger(f)&&f>=0;if(!s||s.complete===false||!u(i)||!u(a)||!u(c)||i===0&&a===0)return {...e,outcome:"check_unmeasured"};let l=Math.min(c,i),d=r.finishReason,m=typeof d==
|
|
714
|
+
"string"?/^[a-z_]{1,32}$/.test(d)?d:"other":void 0;return {...e,outcome:"paired",naive:{cost:oa({inputTokens:i,outputTokens:a,cachedInputTokens:l},o),inputTokens:i,cachedInputTokens:l,outputTokens:a,...m!==
|
|
715
|
+
void 0?{finishReason:m}:{},contract:this.contrato(n,r)}}}async resolverVuelo(e,n){if(!e.decidido){if(e.decidido=true,e.reloj&&clearTimeout(e.reloj),this.enVuelo.delete(e),this.registrar(n),this.enVuelo.
|
|
716
|
+
size===0)try{await this.sumidero.enReposo();}catch{}e.terminar();}}registrar(e){try{this.sumidero.encolar(e);}catch{}if(this.onCheck)try{this.onCheck(e);}catch{}}};var lo=true,ua=new WeakSet;function fl(t){typeof t=="object"&&t!==null&&ua.add(t);}function aa(t){return typeof t=="object"&&t!==null&&ua.has(t)}function ca(t,e){switch(t){case "none":return ml();case "inv\
|
|
586
717
|
alid":return e==="malformed"?"BiVelio license key is not a license token (malformed): a BiVelio license key looks like `xxxx.yyyy.zzzz` \u2014 three dot-separated base64url segments, several hundred charac\
|
|
587
718
|
ters long \u2014 did you paste the `bvk_` service-account key by mistake? That one goes in `serviceAccountKey`; the license key is the other value on https://savings.bivelio.com/dashboard/install (license \
|
|
588
719
|
status: invalid)":"BiVelio license key is not valid (it does not verify). Check you pasted the WHOLE key, and that it is the license key from your dashboard \u2014 not the `bvk_` service-account key, which\
|
|
@@ -590,222 +721,288 @@ status: invalid)":"BiVelio license key is not valid (it does not verify). Check
|
|
|
590
721
|
lling status at https://savings.bivelio.com/dashboard/account or write to support@bivelio.com (license status: revoked)";case "stale":return "BiVelio could not confirm your license with the control plan\
|
|
591
722
|
e in time \u2014 this is a connectivity problem, not a billing one: your license is still valid. Allow outbound HTTPS to your `licenseServerUrl` (https://savings.bivelio.com by default) and retry. (license\
|
|
592
723
|
status: stale)";case "expired":case "grace":return `BiVelio license is not active. Renew your subscription at https://savings.bivelio.com/dashboard/account (license status: ${t})`;default:return `BiVelio\
|
|
593
|
-
license is not active. See https://savings.bivelio.com/dashboard/account${t?` (license status: ${t})`:""}`}}function
|
|
724
|
+
license is not active. See https://savings.bivelio.com/dashboard/account${t?` (license status: ${t})`:""}`}}function ml(){return "BiVelio license required: none was configured. Pass { licenseKey } \u2014 t\
|
|
594
725
|
he signed token from your subscription, verified offline. This published package has no unlicensed mode. Copy your key and a ready-to-paste snippet at https://savings.bivelio.com/dashboard/install (li\
|
|
595
|
-
cense status: none)"}function
|
|
596
|
-
path at all \u2014 pass { licenseKey } instead, from https://savings.bivelio.com/dashboard/install (license status: invalid)"}var
|
|
597
|
-
this.config=e,this.deps=
|
|
598
|
-
exploration!=null?{exploracion:e.modelCascade.exploration}:{});
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
"off (
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
"
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
"
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
726
|
+
cense status: none)"}function hl(){return "licenseGate must implement isActive(): a gate that cannot prove the license is live is refused. In this published package an injected gate is not a licensing \
|
|
727
|
+
path at all \u2014 pass { licenseKey } instead, from https://savings.bivelio.com/dashboard/install (license status: invalid)"}var jn=class{deps;config;now;generateId;contratosQueIncumplen;verjaDeCache=new _n;verjaDeCascada;memoriaDelCodebook=new An;referenciasDeLider=new WeakMap;comprobador;constructor(e,n={}){
|
|
728
|
+
this.config=e,this.deps=ki(e),this.now=e.now??(()=>Date.now()),this.generateId=e.generateId??(()=>dt()),this.contratosQueIncumplen=e.constraintMemory??new Set,this.verjaDeCascada=new Pn(e.modelCascade?.
|
|
729
|
+
exploration!=null?{exploracion:e.modelCascade.exploration}:{});let r=Ln(e.verification);this.comprobador=r.activo&&n.verificacion?new Nn({ajustes:r,provider:e.provider,precio:o=>this.precioConocido(o),
|
|
730
|
+
contrato:(o,s)=>gl(o,s),now:this.now,sumidero:n.verificacion,avisar:(o,s)=>this.avisar(o,s)}):void 0;}conVerificacion(e,n,r){return this.comprobador?this.comprobador.decidir(e,n,r):n}cerrarVerificacion(){
|
|
731
|
+
this.comprobador?.cerrar();}async generate(e){this.assertLicensed();let n={llamadas:0,falloDelProveedor:false,sinContador:0},r;try{r=await this.generateOptimized(e,n);}catch(o){if(o instanceof Ce||this.config.
|
|
732
|
+
failOpen===false||n.falloDelProveedor||n.llamadas>0||aa(o))throw o;return this.conVerificacion(e,await this.failOpenDirect(e,o),"fail-open")}return this.conVerificacion(e,r,"optimizado")}generateStream(e,n={},r){
|
|
733
|
+
let o;try{o=new Rt(this.now,n?.signal);}catch(s){let i=new Rt(this.now);return i.fallar(s),i.handle}return this.ejecutarStream(e,o,r),o.handle}async ejecutarStream(e,n,r){try{if(r&&await r,n.abortado)throw new le(
|
|
734
|
+
!1);let o=this.motivoDeEntregaEntera(e);if(o){let a=await this.generate(e);n.completar(a,{vivo:!1,motivo:o});return}this.assertLicensed(),n.entrarEnVivo();let s={llamadas:0,falloDelProveedor:!1,sinContador:0},
|
|
735
|
+
i;try{i=await this.generateOptimized(e,s,n.sumidero);}catch(a){if(a instanceof Ce||a instanceof le)throw a;if(n.sumidero.senal.aborted)throw new le(s.llamadas>0);if(this.config.failOpen===!1||s.falloDelProveedor||
|
|
736
|
+
s.llamadas>0||aa(a))throw a;let c=this.conVerificacion(e,await this.failOpenDirect(e,a),"fail-open");n.completar(c,{vivo:!1,motivo:"fail-open"});return}i=this.conVerificacion(e,i,"optimizado"),n.completar(
|
|
737
|
+
i,n.sumidero.sirvioEnVivo?{vivo:!0}:{vivo:!1,motivo:"shortcut"});}catch(o){n.fallar(o);}}motivoDeEntregaEntera(e){return e.response?.schema!=null?"output-contract":e.savings?.deferrable===true?"deferrable":
|
|
738
|
+
typeof this.config.provider.generateStream!="function"?"provider-without-streaming":null}async llamarProveedor(e,n){n.llamadas+=1;let r;try{r=await this.config.provider.generate(e);}catch(o){throw n.falloDelProveedor=
|
|
739
|
+
true,o}return r.usage.complete===false&&(n.sinContador+=1),r}async llamarProveedorEnStream(e,n,r){if(r.senal.aborted)throw new le(n.llamadas>0);n.llamadas+=1;let o="",s;try{for await(let i of this.config.provider.
|
|
740
|
+
generateStream(e,{signal:r.senal})){if(r.senal.aborted)break;if(i.type==="text")i.delta!==""&&(o+=i.delta,r.texto(i.delta));else if(i.type==="done"){s=i.response;break}}}catch(i){throw r.senal.aborted?
|
|
741
|
+
new le(true):(n.falloDelProveedor=true,i)}if(!s)throw r.senal.aborted?new le(true):(n.falloDelProveedor=true,new Error(`provider "${this.config.provider.id}" stream ended without a final response`));return r.
|
|
742
|
+
proveedorTermino(),s.usage.complete===false&&(n.sinContador+=1),s.text!==o&&(this.avisar(`stream-texto-distinto:${this.config.provider.id}`,`[bvsala] provider "${this.config.provider.id}" streamed text t\
|
|
743
|
+
hat differs from its final response; the streamed text is what the caller received, so it is what is reported and cached. Its generateStream must end with a done whose response.text equals the concate\
|
|
744
|
+
nated deltas.`),s=is(s,{...s,text:o})),r.sirvioEnVivo=true,s}decidirMarcadoDeCache(e,n,r,o,s,i,a){let c={marcar:false,huella:"",mensajesDePrefijo:0,cacheWriteMultiplier:1},u=Tl(n,this.config.compressionEconomics);
|
|
745
|
+
if(!u)return a.record("prefix-cache","skipped",{reason:`no cache read discount for model "${n}" (unrecognised provider, or a declared tier that does not discount reads): not claiming a cacheable prefi\
|
|
746
|
+
x`}),c;if(!o.setIsStable)return a.record("prefix-cache","skipped",{reason:"the tool SET is selected per request; tools render first, so the prefix cannot hit. Pruning wins here (it is a measured savin\
|
|
747
|
+
g); pass the tools you want fixed."}),c;if(s)return a.record("prefix-cache","skipped",{reason:"savings.toolDiscovery is on: which schemas travel is decided by a non-deterministic probe, so the tool bl\
|
|
748
|
+
ock \u2014 which renders first \u2014 varies across requests that would share a prefix fingerprint. Marking would pay the 1.25x write premium for a prefix that cannot hit. Turn tool discovery off to reclaim the\
|
|
749
|
+
prefix cache."}),c;if(i<=0)return c;let l=r.slice(0,i),d=this.tokensFor(this.assemblePromptText(l,o.tools),e),m=this.tokensFor(this.assemblePromptText(r,o.tools),e),f=G(ae({model:n,tools:(o.tools??[]).
|
|
750
|
+
map(g=>g.id),prefijo:l.map(g=>`${g.role}:${g.content}`)})),h=this.verjaDeCache.decidir(f,{totalTokens:m,stablePrefixTokens:d,tier:u});return a.record("prefix-cache",h.marcar?"marked":"skipped",{reason:h.
|
|
751
|
+
razon,stablePrefixTokens:d,breakEvenHitRate:h.umbral,observedHitRate:h.observada}),h.marcar?{marcar:true,huella:f,mensajesDePrefijo:i,cacheWriteMultiplier:u.cacheWriteMultiplier}:c}decidirCascada(e,n,r,o){
|
|
752
|
+
let s=r.modelCascade??"off",i={modo:"off",modeloPedido:e.model,modeloServido:e.model,candidato:null,enruta:false,elegible:false,razon:"the model cascade is off",fuerza:"none",bucket:"",economia:null,observada:null,
|
|
753
|
+
muestras:0,precioBarato:null,tasaDeMuestreo:0};if(s==="off")return i;let a=_i({schema:e.response?.schema,tools:e.tools}),c=Ii(e.model,this.config.modelCascade?.pairs??Zr),u=this.precioConocido(e.model),
|
|
754
|
+
l=c?this.precioConocido(c):void 0,d=Ci(l,u),m=G(ae({tenant:n.tenantId,scope:n.authorizationScope,contract:n.contractId,schema:n.schemaVersion,fuerte:e.model,barato:c,tools:n.toolsetHash})),f=this.verjaDeCascada.
|
|
755
|
+
estado(m),h={modo:s,modeloPedido:e.model,modeloServido:e.model,candidato:c,enruta:false,elegible:false,razon:a.razon,fuerza:a.fuerza,bucket:m,economia:d,observada:f&&f.enrutadas>0?f.escaladas/f.enrutadas:null,
|
|
756
|
+
muestras:f?.enrutadas??0,precioBarato:l??null,tasaDeMuestreo:0},g=b=>(o.record("model-cascade",s==="on"?"not routed":"not eligible",{reason:b}),{...h,razon:b});if(!a.elegible)return g(a.razon);if(!c)return g(
|
|
757
|
+
`no cheaper model is paired with "${e.model}"; declare one in createSavingsLayer({ modelCascade: { pairs } }) if your provider has one`);if(!d){let b=[...this.precioConocido(e.model)?[]:[e.model],...l?
|
|
758
|
+
[]:[c]];return g(`no known price for ${b.map(x=>`"${x}"`).join(" or ")||"this pair"}, so the arithmetic that decides whether routing pays cannot be run. The illustrative default price is deliberately \
|
|
759
|
+
NOT used here: it would approve a pair nobody has priced. Pass \`costModels\` for both models to enable the cascade for them`)}if(!d.viable)return g(d.razon);let p=Math.min(1,Math.max(0,this.config.modelCascade?.
|
|
760
|
+
shadowSampleRate??0));if(s==="shadow")return o.record("model-cascade","shadow",{candidateModel:c,costRatio:d.r,breakEvenEscalationRate:d.equilibrio,verifier:a.fuerza,workload:m,note:"measuring only: t\
|
|
761
|
+
he request goes to the model you asked for. The escalation rate is not a quality score \u2014 a well-formed answer with wrong content passes the verifier."}),{...h,elegible:true,razon:a.razon,tasaDeMuestreo:p};
|
|
762
|
+
let v=this.verjaDeCascada.decidir(m,d);return v.enrutar?(this.avisar(`cascada:${e.model}->${c}`,`[bv-sala] model cascade ON: requests for "${e.model}" may be answered by "${c}" when a deterministic ga\
|
|
763
|
+
te accepts the answer. The gate checks the SHAPE of the answer against your output contract, never its meaning, so a well-formed answer with wrong content is served and counted as a success. report.mo\
|
|
764
|
+
del always names the model that answered, and report.qualityStatus reads "bounded_degradation".`),o.record("model-cascade","routed",{candidateModel:c,costRatio:d.r,breakEvenEscalationRate:d.equilibrio,
|
|
765
|
+
observedEscalationRate:v.observada,verifier:a.fuerza,workload:m,reason:v.razon}),{...h,modeloServido:c,enruta:true,elegible:true,razon:v.razon,observada:v.observada,muestras:v.muestras,tasaDeMuestreo:0}):
|
|
766
|
+
(o.record("model-cascade","off (gate)",{reason:v.razon,observedEscalationRate:v.observada,breakEvenEscalationRate:d.equilibrio}),{...h,elegible:true,razon:v.razon,observada:v.observada,muestras:v.muestras})}devOpen(){
|
|
767
|
+
return false}assertLicensed(){if(this.devOpen())return;let e=this.config.licenseGate;if(e&&typeof e.isActive=="function"){if(e.isActive())return;let n=typeof e.status=="function"?e.status():void 0,r=typeof e.
|
|
768
|
+
reason=="function"?e.reason():void 0;throw new Ce(ca(n,r),n)}throw e?new Ce(hl(),"invalid"):new Ce(ca("none"),"none")}avisar(e,n){this.config.silenceWarnings||F(e,n);}avisarDeTruncado(e,n,r,o,s){let i=e.
|
|
769
|
+
response?.maxOutputTokens,a=Pt(e)||"(no contractId)",c=s?" The layer has NOTED it: the next requests for this contract will carry their value limits written into the prompt, which is the only thing th\
|
|
770
|
+
at can fix it without touching your cap. If it still gets cut off, the task does not fit the contract: widen the schema and raise the cap with it.":"",u=o===null?" The schema does not bound the respon\
|
|
771
|
+
se (no `maxLength`/`maxItems`), so there is no way to know in advance how much it needs: bound it and the cap stops being a guess.":i==null?` The contract allows ~${o} tokens and this request declares\
|
|
772
|
+
no cap, so the cut came from a PROVIDER cap (the Anthropic API requires \`max_tokens\` and the adapter sends 4096 by default). Declare \`maxOutputTokens\` and the cut stops being a surprise.`:o>i?` T\
|
|
773
|
+
he contract allows responses of up to ~${o} tokens with this model (what its \`maxLength\`/\`maxItems\` permit) and the cap is ${i}: no response that uses what the schema itself permits fits. A cap ca\
|
|
774
|
+
librated with another model is NOT inherited \u2014 the schema bounds CHARACTERS, which are the same everywhere, and the cap bounds TOKENS, which differ per tokenizer.`:` The contract allows ~${o} tok\
|
|
775
|
+
ens and the cap is ${i}, so the cap is not the problem: this model is writing more than its own schema permits (no structured mode enforces \`maxLength\`).${c}`;this.avisar(`salida-truncada:${a}:${n}`,
|
|
776
|
+
`[bvsala] The response was cut off after exhausting \`maxOutputTokens\`${i!=null?` (${i})`:""} with model ${n} and contract "${a}": the provider returned finish_reason "length" and ${r} output tokens,\
|
|
777
|
+
so the JSON does not validate. NOT retried: with the same cap it would be cut off again, a paid call for the same failure.${u}`);}avisarDePalancasSinConfigurar(e){this.config.silenceWarnings||((e.compression===
|
|
778
|
+
true||e.compression==="auto")&&!this.config.compressor&&this.avisar("palanca-sin-compresor","[bv-sala] `savings.compression` was requested but this layer has no compressor, so NOTHING is compressed: the\
|
|
779
|
+
long context travels and is paid in full. In the report, `report.compression` is ABSENT and `tokens.eliminatedInput` is 0 \u2014 the same as when there was nothing to compress. The compressor is a sidecar\
|
|
780
|
+
because it adds latency and compute that only you should decide to pay for: plug it in with `createSavingsLayer({ compressor })`, any object with `compress({ text })`. If your plan does not include `\
|
|
781
|
+
long_context_compression`, that feature is needed too. The rest of the layer keeps saving as usual."),e.semanticCache&&!this.deps.semanticCache&&this.avisar("palanca-sin-cache-semantica",'[bv-sala] `s\
|
|
782
|
+
avings.semanticCache` was requested but this layer has no semantic cache, so every rephrased question will come out `cache: "miss"` and be paid to the provider again. It is not on by default because i\
|
|
783
|
+
t needs an embedder, which is your own cost and provider: plug it in with `createSavingsLayer({ semanticCache: new InMemorySemanticCache({ embed }) })`. The exact cache and the rest of the layer keep \
|
|
784
|
+
working.'));}async generateOptimized(e,n={llamadas:0,falloDelProveedor:false,sinContador:0},r=null){this.assertLicensed();let o=new bt(this.now),s=new He,i=Xn(e),a=er(i),c=e.savings??{};this.avisarDePalancasSinConfigurar(
|
|
785
|
+
c);let u=this.decidirCascada(e,i,c,o),l=this.costModelFor(u.modeloServido);o.record("canonicalize","done",{tenant:i.tenantId,contract:i.contractId}),o.record("policy",a.reasons.join("; ")||"no restric\
|
|
786
|
+
tions",{allowExactCache:a.allowExactCache,allowSemanticCache:a.allowSemanticCache});let d=this.tokensFor(this.assembleBaselinePrompt(e),e),m=e.response?.maxOutputTokens??256,f,h=()=>f??=uo(e);if(s.baselineInput=
|
|
787
|
+
d,s.baselineOutput=m,s.baselineTools=e.tools?.length??0,c.deterministicResolvers!==false){let b=this.deps.resolvers.try(i);if(b)return s.avoidCall(d,this.tokensFor(b.text,e)),o.record("resolver",b.resolver,
|
|
788
|
+
{avoided:true}),this.finish(e,i,{text:b.text,data:b.data,storedAtMs:this.now()},"deterministic",s,l,o,It(),_t(),void 0,void 0,void 0,void 0,void 0,this.informeDeCascada(u,{servedModel:e.model}))}let g=Qn(
|
|
789
|
+
i,{servedModel:u.modeloServido});if(a.allowExactCache&&c.exactCache!==false){let b=await this.deps.exactCache.get(g);if(b){let x=this.creditoPorReferencia(Gi(b.meta),{request:e,cascada:u,toggles:c,huella:h,
|
|
790
|
+
texto:b.text,claveLeida:g,calidad:()=>{let y=e.response?.schema;return !y||ee(b.data,y).valid}});return x.ok?s.avoidCallByReference(x.credit):(s.avoidCall(d,this.tokensFor(b.text,e)),s.referenceRejected=
|
|
791
|
+
x.reason),o.record("exact-cache","hit",{ageMs:this.now()-b.storedAtMs,basis:x.ok?"reference":"estimated",...x.ok?{}:{referenceRejected:x.reason},...x.ok&&x.outputNotCredited?{outputNotCredited:x.outputNotCredited}:
|
|
792
|
+
{}}),this.finish(e,i,b,"exact",s,l,o,It(),_t(),this.now()-b.storedAtMs,void 0,void 0,void 0,void 0,this.informeDeCascada(u))}o.record("exact-cache","miss");}let p=Do(i,{servedModel:u.modeloServido,deferrable:c.
|
|
793
|
+
deferrable===true,toolDiscovery:c.toolDiscovery===true,...e.response?.maxOutputTokens!=null?{maxOutputTokens:e.response.maxOutputTokens}:{}}),v=async()=>{try{return await this.expensivePath(n,e,i,a,c,s,l,
|
|
794
|
+
o,g,d,u,r)}catch(b){throw (n.falloDelProveedor||n.llamadas>0)&&fl(b),b}};if(a.allowSingleflight&&c.singleflight!==false){if(r){let y=this.deps.singleflight,k=typeof y.join=="function"?y.join(p):void 0;if(k){
|
|
795
|
+
let E=await k;return o.record("singleflight","coalesced",{key:p}),this.asCoalescedFollower(E,d,this.tokensFor(E.text??"",e),l,e)}return o.record("singleflight","skipped (streaming: a streamed request \
|
|
796
|
+
never leads)"),v()}let{value:b,coalesced:x}=await this.deps.singleflight.run(p,v);if(x){o.record("singleflight","coalesced",{key:p});let y=this.creditoPorReferencia(this.referenciasDeLider.get(b)??"ab\
|
|
797
|
+
sent",{request:e,cascada:u,toggles:c,huella:h,texto:b.text??"",claveLeida:void 0,calidad:()=>b.report.constraints.structurallyValid!==false&&b.report.qualityStatus!=="rejected"});return this.asCoalescedFollower(
|
|
798
|
+
b,d,this.tokensFor(b.text??"",e),l,e,y)}return b}return v()}async expensivePath(e,n,r,o,s,i,a,c,u,l,d,m){let f=this.entitled("semantic_cache");if(o.allowSemanticCache&&s.semanticCache&&this.deps.semanticCache&&
|
|
799
|
+
!f&&c.record("semantic-cache","degraded: feature not licensed (free tier)"),o.allowSemanticCache&&s.semanticCache&&this.deps.semanticCache&&f){let S=await this.deps.semanticCache.find(r);if(S)return i.
|
|
800
|
+
avoidCall(l,this.tokensFor(S.record.answer.text,n)),c.record("semantic-cache","hit",{confidence:S.confidence,similarity:S.similarity}),this.finish(n,r,S.record.answer,"semantic",i,a,c,It(),_t(),S.ageMs,
|
|
801
|
+
S.confidence,void 0,void 0,void 0,this.informeDeCascada(d,{servedModel:n.model}));c.record("semantic-cache","miss");}let h=s.router===false,g=h?It():this.deps.router.classify(r);c.record("router",g.executionClass,
|
|
802
|
+
{confidence:g.confidence,reason:g.reason});let p=h?this.deps.toolSelector.passthrough(n.tools):this.deps.toolSelector.select(r.normalizedText,n.tools,g.executionClass,r.toolsetHash);if(i.actualTools=p.
|
|
803
|
+
tools.length,p.droppedIds.length){let S=new Set(p.droppedIds),A=(n.tools??[]).filter(L=>S.has(L.id)).reduce((L,q)=>L+this.tokensFor(po(q),n),0);i.eliminate(A),c.record("tool-selector",p.reason,{dropped:p.
|
|
804
|
+
droppedIds,eliminatedTokens:A});}i.baselineRetrieval=this.config.retriever?g.rounds:0;let v=await Fo({execution:g.executionClass,query:r.normalizedText,maxRounds:n.retrieval?.maxRounds??g.rounds,maxDocuments:n.
|
|
805
|
+
retrieval?.maxDocuments??5},{...this.config.retriever?{retriever:this.config.retriever}:{},...this.config.reranker?{reranker:this.config.reranker}:{}});i.actualRetrieval=v.rounds,v.retrievedCount>0&&c.
|
|
806
|
+
record("retrieval",`kept ${v.keptCount}/${v.retrievedCount}`,{rounds:v.rounds});let b=_t(),x=[...n.messages],y=mo(n.messages),k=false,E=v.docs.length>0?{role:"system",content:`Retrieved context \u2014 answer \
|
|
807
|
+
using only this evidence and cite sources by [id]:
|
|
659
808
|
|
|
660
|
-
`+
|
|
661
|
-
${
|
|
809
|
+
`+v.docs.map((S,A)=>`[${S.source??S.id??`doc${A+1}`}]
|
|
810
|
+
${S.text}`).join(`
|
|
662
811
|
|
|
663
|
-
`)}:null,
|
|
664
|
-
JSON limits (not API-enforced): ${
|
|
665
|
-
{model:n.model,...n.tokenizer?{tokenizer:n.tokenizer}:{}});let
|
|
666
|
-
`:"")+
|
|
667
|
-
disabled; sent compact JSON"});}if(E&&
|
|
668
|
-
{},A=
|
|
669
|
-
{}},
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
this.assemblePromptText(
|
|
673
|
-
compressorCostTokens});
|
|
674
|
-
|
|
675
|
-
prefixRewritten:
|
|
676
|
-
if(
|
|
677
|
-
|
|
678
|
-
e tool_result over the age\xD7size threshold"});}let
|
|
679
|
-
null;
|
|
680
|
-
schemaTokensCompact:
|
|
681
|
-
breakEvenOutputDeltaTokens:
|
|
682
|
-
deps.constraintBackends):{backend:"none",reason:"no output contract"};c.record("constraints",
|
|
683
|
-
|
|
684
|
-
null?{maxOutputTokens:n.response.maxOutputTokens}:{},...n.temperature!=null?{temperature:n.temperature}:{},...n.seed!=null?{seed:n.seed}:
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
verjaDeCascada.registrar(d.bucket,!
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
i.
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
c.record("validation","
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
812
|
+
`)}:null,w=Pt(n),I=n.response?.maxOutputTokens!=null?Math.floor(n.response.maxOutputTokens*3.2):null,O=this.contratosQueIncumplen.has(w)?fo(n.response?.schema,"",I):"";if(O&&Dt(x,{role:"system",content:`\
|
|
813
|
+
JSON limits (not API-enforced): ${O}`}),n.structuredData!==void 0){let S=JSON.stringify(n.structuredData),A=this.tokensFor(S,n);if(s.serialization!==false){b=this.deps.formatSelector.choose(n.structuredData,
|
|
814
|
+
{model:n.model,...n.tokenizer?{tokenizer:n.tokenizer}:{}});let L=this.tokensFor(b.encoded+b.instruction,n);i.compress(A,L),Dt(x,{role:"system",content:(b.instruction?b.instruction+`
|
|
815
|
+
`:"")+b.encoded}),c.record("serialization",b.chosen,{reason:b.reason,jsonTokens:A,chosenTokens:L});}else Dt(x,{role:"system",content:S}),c.record("serialization","json-compact",{reason:"format selector\
|
|
816
|
+
disabled; sent compact JSON"});}if(E&&Dt(x,E),(s.compression===true||s.compression==="auto")&&o.allowCompression&&this.config.compressor&&this.entitled("long_context_compression")){let S=this.config.compressionEconomics??
|
|
817
|
+
{},A=co(n.model,S),L={compressorCostTokens:S.compressorCostTokens??0,...S.minimumContextTokens!=null?{minimumContextTokens:S.minimumContextTokens}:{},...S.minimumNetTokens!=null?{minimumNetTokens:S.minimumNetTokens}:
|
|
818
|
+
{}},q=0,N=0;for(let V of x)V.role==="system"?q+=1:N+=this.tokensFor(V.content,n);let Ee=this.tokensFor(this.assemblePromptText(x,p.tools),n),fe=lr({...L,contextTokens:N,projectedEliminable:N}),te=0,me=0,
|
|
819
|
+
at=false,he=fe.reason;if(fe.compress){let V=[];for(let ge of x){if(ge.role==="system"){V.push(ge);continue}let ct=this.tokensFor(ge.content,n),ut=await this.config.compressor.compress({text:ge.content}),
|
|
820
|
+
wo=!ut.skipped&&ut.fidelityPassed&&Yo(ge.content,ut.compressed),So=wo?this.tokensFor(ut.compressed,n):ct;wo&&So<ct?(V.push({...ge,content:ut.compressed}),te+=ct,me+=So):V.push(ge);}let ko=this.tokensFor(
|
|
821
|
+
this.assemblePromptText(V,p.tools),n),Q=lr({...L,contextTokens:N,projectedEliminable:te-me}),zn=$i({originalTokens:Ee,compressedTokens:ko,tier:A,...S.prefix?{prefix:S.prefix}:{},compressorCostTokens:L.
|
|
822
|
+
compressorCostTokens});me>=te?he="no fidelity-passed net reduction":Q.compress?zn.comprimir?(at=true,he=zn.razon,k=V.slice(0,y).some((ge,ct)=>ge.content!==x[ct]?.content),x=V,i.compress(te,me)):he=zn.razon:
|
|
823
|
+
he=Q.reason;}at||(te=0,me=0),c.record("compression",at?"applied":"skipped",{reason:he,before:te,after:me,contextTokens:N,promptTokens:Ee,cacheTierMinimum:A.minimumCacheTokens,protectedSystemMessages:q,
|
|
824
|
+
prefixRewritten:k}),i.compressionReport={originalTokens:te,compressedTokens:me,protectedSpans:q,fidelityPassed:true};}if(s.elision!==false&&o.allowElision&&this.entitled("tool_result_elision")){let S=Fi(x);
|
|
825
|
+
if(S.indices.length>0){let A=this.tokensFor(ao,n),L=0;for(let q of S.indices){let N=this.tokensFor(x[q].content,n);L+=Math.max(0,N-A);}(S.indices.some(q=>q<y)&&(k=true),x=zi(x,S.indices),i.eliminate(
|
|
826
|
+
L),i.elididoLocal+=L),c.record("elision","applied",{elided:S.indices.length,eliminatedTokens:L,grossBytes:S.bytesOriginales,live:lo});}else c.record("elision","skipped",{reason:"no old/larg\
|
|
827
|
+
e tool_result over the age\xD7size threshold"});}let C=n.response?.schema,_=C&&s.outputCodebook===true?Mi(C,S=>this.tokensFor(S,n),a,{evidencia:this.memoriaDelCodebook.resolver(d.modeloServido,Pt(n),s.outputCodebookMeasuredOutputDeltaTokens)}):
|
|
828
|
+
null;_&&c.record("output-codebook",_.applied?"applied":"skipped",{reason:_.reason,..._.applied?{renamedKeys:_.plan.renamedKeys,codedEnumValues:_.plan.codedEnumValues,schemaTokensOriginal:_.plan.schemaTokensOriginal,
|
|
829
|
+
schemaTokensCompact:_.plan.schemaTokensCompact,modelledShapeSavingTokens:_.plan.modelledShapeSavingTokens,measuredOutputDeltaTokens:_.plan.measuredOutputDeltaTokens,outputDeltaProvenance:_.plan.outputDeltaProvenance,
|
|
830
|
+
breakEvenOutputDeltaTokens:_.plan.breakEvenOutputDeltaTokens,netSavingUsd:_.plan.netSavingUsd,pricedForModel:d.modeloServido}:{}});let T=_?.applied?_.plan.compactSchema:C,R=T?Go(d.modeloServido,T,this.
|
|
831
|
+
deps.constraintBackends):{backend:"none",reason:"no output contract"};c.record("constraints",R.backend,{reason:R.reason});let D=this.decidirMarcadoDeCache(n,d.modeloServido,x,p,s.toolDiscovery===true,k?
|
|
832
|
+
mo(x,true):y,c),M=this.now();if(m?.senal.aborted)throw new le(e.llamadas>0);let j=await this.descubrirHerramientas(e,n,s,p.tools,x,i,a,c),$=j.tools;i.actualTools=$.length;let Y={messages:x,...$.length?{
|
|
833
|
+
tools:$}:{},...T?{schema:T}:{},...n.response?.maxOutputTokens!=null?{maxOutputTokens:n.response.maxOutputTokens}:{},...n.temperature!=null?{temperature:n.temperature}:{},...n.seed!=null?{seed:n.seed}:
|
|
834
|
+
{},...s.deferrable?{deferrable:true}:{},constraintBackend:R.backend},oe={model:d.modeloServido,...Y,...D.marcar?{stablePrefixMessages:D.mensajesDePrefijo,promptCacheKey:D.huella}:{}},P=m?await this.llamarProveedorEnStream(
|
|
835
|
+
oe,e,m):await this.llamarProveedor(oe,e);i.actualLlm+=1;let se=S=>{if(!_?.applied)return S;let A=ze(S);return A.ok?JSON.stringify(_.plan.expand(A.value)):S},B=se(P.text),Se=P.usage,de=false;if(d.enruta){
|
|
836
|
+
let S=Qr({texto:B,schema:C,finishReason:P.finishReason,pidioHerramientas:(P.toolCalls?.length??0)>0});this.verjaDeCascada.registrar(d.bucket,!S.acepta),c.record("model-cascade",S.acepta?"accepted":"es\
|
|
837
|
+
calating",{servedModel:d.modeloServido,reason:S.motivo,checks:S.comprobaciones}),S.acepta||(de=true,i.cascadeAttempt(P.usage,d.precioBarato??a),i.actualLlm+=1,P=await this.llamarProveedor({model:n.model,
|
|
838
|
+
...Y},e),B=se(P.text));}let pe=de?n.model:d.modeloServido,$e=de?this.costModelFor(n.model):a;i.actualInput+=P.usage.inputTokens,i.actualOutput+=P.usage.outputTokens;let go=P.usage,ma=P.servedServiceTier,
|
|
839
|
+
ha=P.structuredNatively===true,At=ss(P),bo;_?.applied&&c.record("output-codebook",ze(P.text).ok?"expanded":"not-expanded (response was not JSON)",ze(P.text).ok?{localOutputTokensCompact:this.tokensFor(P.
|
|
840
|
+
text,n),localOutputTokensExpanded:this.tokensFor(B,n),creditedLedger:"none",note:"local count of the served answer in both shapes; not credited to any ledger"}:{}),C&&R.backend==="provider-native"&&P.
|
|
841
|
+
structuredNatively===false&&(R={backend:"none",reason:"provider did not enforce the contract natively; the schema travelled in the prompt and the layer is the only validator"},c.record("constraints","non\
|
|
842
|
+
e",{downgradedFrom:"provider-native",reason:R.reason})),i.sentInputLocal=this.tokensFor(this.assemblePromptText(x,$),n),i.removedInputLocal=Math.max(0,l-i.sentInputLocal-i.elididoLocal);let ga=i.sentInputLocal;
|
|
843
|
+
i.sentInputLocal+=j.tokensLocalesDelSondeo,i.estimatorExact=this.estimatorEsExacto(n),P.usage.cachedInputTokens&&i.providerCached(P.usage.cachedInputTokens),D.marcar&&Se.complete===false?c.record("prefix\
|
|
844
|
+
-cache","not measured: the provider reported no usage for this call"):D.marcar&&(i.cacheWritePremium(Se.cacheWriteInputTokens??0,D.cacheWriteMultiplier,d.precioBarato??a),this.verjaDeCache.registrar(D.
|
|
845
|
+
huella,Se),c.record("prefix-cache","measured",{cacheRead:Se.cachedInputTokens??0,cacheWritePremiumTokens:Se.cacheWriteInputTokens??0}));let Ve=null;if(d.modo==="shadow"&&d.elegible&&d.candidato&&d.precioBarato&&
|
|
846
|
+
wl(u,d.tasaDeMuestreo))try{let S=await this.llamarProveedor({model:d.candidato,...Y},e);i.actualLlm+=1;let A=i.extraCostUsd;i.cascadeAttempt(S.usage,d.precioBarato);let L=se(S.text),q=Qr({texto:L,schema:C,
|
|
847
|
+
finishReason:S.finishReason,pidioHerramientas:(S.toolCalls?.length??0)>0});this.verjaDeCascada.registrar(d.bucket,!q.acepta);let N=q.acepta?Pi(L,B):null;Ve={coste:i.extraCostUsd-A,divergio:N?N.divergen:
|
|
848
|
+
null},c.record("model-cascade",q.acepta?"sample accepted":"sample escalated",{candidateModel:d.candidato,reason:q.motivo,sampleCost:Ve.coste,...N?{diverged:N.divergen,divergence:N.motivo}:{},note:"mea\
|
|
849
|
+
surement only: this answer was NEVER served. The escalation rate it feeds is a money figure, not a quality one"});}catch(S){c.record("model-cascade","sample failed (measurement only; the answer is unaf\
|
|
850
|
+
fected)",{error:S instanceof Error?S.message:String(S)});}let Mt=B,Ue=true,ot=(P.toolCalls?.length??0)>0;if(ot&&(Ue=null,C&&c.record("validation","n/a: model requested tool calls (the output contract app\
|
|
851
|
+
lies to the final answer)")),C&&!ot){let S=ze(B),A=S.ok?ee(S.value,C):{valid:false,errors:[{path:"$",message:"not valid JSON"}]};S.ok&&S.rescatado!=null&&A.valid&&(B=S.rescatado,c.record("validation","re\
|
|
852
|
+
scued-locally",{reason:"the model wrapped valid JSON in prose or a markdown fence; it was extracted locally instead of paying a repair call"})),!A.valid&&Sl(A.errors)&&this.contratosQueIncumplen.add(Pt(
|
|
853
|
+
n));let L=P.finishReason==="length",q=!A.valid&&A.errors.some(N=>/not a valid regular expression/.test(N.message));if(!A.valid&&q)c.record("validation","repair-skipped",{reason:"schema defect (uncompi\
|
|
854
|
+
lable pattern); no output can satisfy it, a retry is a wasted call",errors:A.errors}),this.avisar("esquema-roto","[bvsala] The response contract has a `pattern` that is not a valid regex, so no respon\
|
|
855
|
+
se can satisfy it. NOT retried (it would be a paid call for the same failure). Fix the schema's `pattern`.");else if(!A.valid&&L){let N=Oi(C,te=>this.tokensFor(te,n)),Ee=n.response?.maxOutputTokens??null,
|
|
856
|
+
fe=N!==null&&Ee!=null&&N<=Ee;fe&&this.contratosQueIncumplen.add(Pt(n)),c.record("validation","repair-skipped",{reason:"output truncated by maxOutputTokens; a retry with the same cap would truncate aga\
|
|
857
|
+
in",maxOutputTokens:n.response?.maxOutputTokens??null,outputTokens:P.usage.outputTokens,model:pe,...N!==null?{schemaAllowsTokens:N}:{},learnedValueLimits:fe}),this.avisarDeTruncado(n,pe,P.usage.outputTokens,
|
|
858
|
+
N,fe);}else if(!A.valid&&R.backend==="none"){let N=A.errors.slice(0,5).map(Q=>`- ${Q.path}: ${Q.message}`).join(`
|
|
859
|
+
`),Ee=[{role:"user",content:`Your previous reply did not satisfy the required JSON contract.
|
|
709
860
|
|
|
710
861
|
Previous reply:
|
|
711
|
-
${
|
|
862
|
+
${B}
|
|
712
863
|
|
|
713
864
|
Problems found:
|
|
714
|
-
${
|
|
865
|
+
${N}
|
|
715
866
|
|
|
716
|
-
Return ONLY the corrected JSON object. Keep the same content; fix only what is listed.`}],
|
|
717
|
-
round(
|
|
718
|
-
|
|
719
|
-
lid answer is served as-is and reported as invalid",errors:A.errors,baselineUsd:
|
|
720
|
-
The answer did not satisfy the output contract, and repairing it would have cost MORE than sending this request without the layer at all (baseline ~$${
|
|
721
|
-
, repair ~$${
|
|
722
|
-
rrying both tools and an output contract; see the adapter warning for the cheaper shapes.`);else {i.retries=1,c.record("validation","repair-attempt",{errors:A.errors}),
|
|
723
|
-
messages:
|
|
724
|
-
|
|
725
|
-
null&&A.valid&&(
|
|
726
|
-
informeDeDiferido(s,
|
|
727
|
-
none",reason:
|
|
728
|
-
|
|
729
|
-
:
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
"tool-discovery","
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
{
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
{},...
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
867
|
+
Return ONLY the corrected JSON object. Keep the same content; fix only what is listed.`}],fe=this.tokensFor(this.assemblePromptText(Ee),n),te=i.sentInputLocal>0?i.actualInput/i.sentInputLocal:1,me=Math.
|
|
868
|
+
round(te*fe),at=Math.min(P.usage.outputTokens,n.response?.maxOutputTokens??Number.POSITIVE_INFINITY),he=me/1e3*$e.inputPer1k+at/1e3*$e.outputPer1k,V=this.config.skipRepairAboveBaseline?i.estimateCost(
|
|
869
|
+
$e):void 0;if(V!=null&&V.baselineEstimate>0&&V.actual+he>V.baselineEstimate&&V!=null)c.record("validation","repair-skipped",{reason:"repairing would cost more than not using the layer at all; the inva\
|
|
870
|
+
lid answer is served as-is and reported as invalid",errors:A.errors,baselineUsd:V.baselineEstimate,actualUsd:V.actual,repairEstimateUsd:he}),this.avisar("reparacion-mas-cara-que-el-baseline",`[bvsala]\
|
|
871
|
+
The answer did not satisfy the output contract, and repairing it would have cost MORE than sending this request without the layer at all (baseline ~$${V.baselineEstimate}, already spent ~$${V.actual}\
|
|
872
|
+
, repair ~$${he.toFixed(6)}). The repair was skipped and the invalid answer is returned with \`constraints.structurallyValid: false\` \u2014 check it before using it. This combination is usually a request ca\
|
|
873
|
+
rrying both tools and an output contract; see the adapter warning for the cheaper shapes.`);else {i.retries=1,c.record("validation","repair-attempt",{errors:A.errors}),P=await this.llamarProveedor({model:pe,
|
|
874
|
+
messages:Ee,schema:C,...n.response?.maxOutputTokens!=null?{maxOutputTokens:n.response.maxOutputTokens}:{}},e),bo=P.usage,i.actualLlm+=1,i.actualInput+=P.usage.inputTokens,i.actualOutput+=P.usage.outputTokens,
|
|
875
|
+
i.repairOutput+=P.usage.outputTokens,i.repairInput+=P.usage.inputTokens,i.sentInputLocal+=fe,B=P.text;let Q=ze(B);A=Q.ok?ee(Q.value,C):{valid:false,errors:[{path:"$",message:"not valid JSON"}]},Q.ok&&(Mt=
|
|
876
|
+
Q.value,Q.rescatado!=null&&A.valid&&(B=Q.rescatado));}}else S.ok&&(Mt=S.value);Ue=A.valid,c.record("validation",Ue?"valid":"invalid");}let ba=this.now()-M,va=yl(Mt),st={text:B,data:Mt,rendered:va,storedAtMs:this.
|
|
877
|
+
now()},Te=this.informeDeDiferido(s,P,$e);Te&&c.record("deferred-tier",Te.credited?"credited":"not-credited",{...Te.requestedTier?{requestedTier:Te.requestedTier}:{},...Te.servedTier?{servedTier:Te.servedTier}:
|
|
878
|
+
{},creditedLedger:"none",reason:Te.reason});let ya=j.aplicado,vo=P.finishReason==="length",it=Ue!==false&&!ot&&!ya&&!vo,yo=this.generateId(),Z;try{Z=Wi({contadorSimulado:dr(this.config.provider),usoPrimario:go,
|
|
879
|
+
usoReparacion:bo,tierServido:ma,eliminatedInput:i.eliminatedInput,compressedInput:i.compressedInput,elididoLocal:i.elididoLocal,sentLocalSinSondeo:ga,baselineInput:l,codebookAplicado:_?.applied===!0,tokensDelSondeo:j.
|
|
880
|
+
tokensLocalesDelSondeo,sondeoAplicado:j.aplicado,hayEsquema:C!=null,esquemaNativo:ha,esquemaEnFormatoNativo:At?.esquemaEnFormatoNativo===!0&&T===C,esquemaEstricto:At?.esquemaEstricto===!0,esquemaPorPrompt:At?.
|
|
881
|
+
esquemaPorPrompt===!0,piezasDelAdaptador:At?.piezasDelAdaptador??0,modeloPedido:n.model,modeloServido:pe,cacheable:it,mensajesDeLaCapa:x.length-n.messages.length,requestId:yo,at:this.now(),textoServido:B,
|
|
882
|
+
huella:()=>uo(n)});}catch{Z="fingerprint-failed";}let xo=it&&o.allowExactCache&&s.exactCache!==false;typeof Z=="object"?c.record("reference","written",{inputTokens:Z.inputTokens,outputTokens:Z.outputTokens,
|
|
883
|
+
layerInsertions:Z.layerInsertions,...Z.reasoningTokens!==void 0?{reasoningTokens:Z.reasoningTokens}:{},exactCache:xo}):c.record("reference","not-written",{reason:Z});try{it||c.record("cache-write",ot?
|
|
884
|
+
"skipped: tool-call turn (an action request must not be replayed from cache)":Ue===!1?"skipped: response fails its output contract":vo?'skipped: answer cut off by the output cap (finish_reason "length\
|
|
885
|
+
"); replaying half an answer would bill it as a 100% avoided call':"skipped: answered with a reduced tool view (tool discovery), so it must not be replayed");let S=de?Qn(r,{servedModel:pe}):u;if(xo){let L=this.
|
|
886
|
+
config.exactCacheTtlMs??864e5,q=o.maxCacheAgeMs==null?L:Math.min(L,o.maxCacheAgeMs);await this.deps.exactCache.set(S,typeof Z=="object"?{...st,meta:{...st.meta??{},reference:{...Z,cacheKey:S}}}:st,q);}
|
|
887
|
+
let A=pe!==n.model;it&&!A&&o.allowSemanticCache&&s.semanticCache&&this.deps.semanticCache?await this.deps.semanticCache.store(r,st):it&&A&&s.semanticCache&&c.record("cache-write","semantic write skipp\
|
|
888
|
+
ed: a cheaper model answered, and this cache keys on the model the caller asked for");}catch(S){c.record("cache-write","failed (non-fatal; answer already served)",{error:S instanceof Error?S.message:String(
|
|
889
|
+
S)});}i.callsWithoutUsage=e.sinContador;let Lt=this.finish(n,r,st,"miss",i,$e,c,g,b,void 0,void 0,Ue,R.backend,ba,this.informeDeCascada(d,{servedModel:pe,...d.enruta?{escalated:de}:{},...d.elegible&&d.
|
|
890
|
+
precioBarato?{estimatedSwapSaving:kl(i,de,d.precioBarato,this.costModelFor(n.model))}:{},...Ve?{sampled:true,sampleCost:Bn(Ve.coste),...Ve.divergio!==null?{divergedOnSample:Ve.divergio}:{}}:{},...i.cascadeInput>
|
|
891
|
+
0||i.cascadeOutput>0?{cascadeInputTokens:i.cascadeInput,cascadeOutputTokens:i.cascadeOutput}:{}}),Te,yo);return typeof Z=="object"&&this.referenciasDeLider.set(Lt,Z),ot&&(Lt.toolCalls=P.toolCalls),P.finishReason!==
|
|
892
|
+
void 0&&(Lt.finishReason=P.finishReason),Lt}async descubrirHerramientas(e,n,r,o,s,i,a,c){let u={tools:o,tokensLocalesDelSondeo:0,aplicado:false};if(r.toolDiscovery!==true)return u;if(o.length<2)return c.record(
|
|
893
|
+
"tool-discovery","skipped (nothing to discover)",{candidates:o.length}),u;let l=p=>this.tokensFor(po(p),n),d=o.map(qi),m=Ui({promptTokens:this.tokensFor(this.assemblePromptText(s),n),esquemasCompletos:o.
|
|
894
|
+
reduce((p,v)=>p+l(v),0),descriptoresLigeros:d.reduce((p,v)=>p+l(v),0),esquemasDeLaSegunda:Ki(o.map(p=>({risk:p.risk,tokens:l(p)})),3),salidaFinal:n.response?.maxOutputTokens??256,salidaDelSondeo:96,precio:a});
|
|
895
|
+
if(!m.aplicar)return c.record("tool-discovery","skipped (not worth a second call)",{reason:m.razon,oneCall:m.costeDeUnaLlamada,twoCalls:m.costeDeDosLlamadas}),u;let f,h=this.tokensFor(this.assemblePromptText(
|
|
896
|
+
s,d),n);try{f=await this.llamarProveedor({model:n.model,messages:s,tools:d,maxOutputTokens:96,...n.temperature!=null?{temperature:n.temperature}:{},...n.seed!=null?{seed:n.seed}:{}},e);}catch(p){return c.
|
|
897
|
+
record("tool-discovery","failed (falling back to a single call with every schema)",{error:p instanceof Error?p.message:String(p)}),u}i.actualLlm+=1,i.actualInput+=f.usage.inputTokens,i.actualOutput+=f.
|
|
898
|
+
usage.outputTokens,i.discoveryInput+=f.usage.inputTokens,i.discoveryOutput+=f.usage.outputTokens;let g=Hi((f.toolCalls??[]).map(p=>p.name),o,3);return g.reconocidos.length===0?(c.record("tool-discover\
|
|
899
|
+
y","degraded: probe named no known tool",{finishReason:f.finishReason??null,...g.ignorados.length?{unknownNames:g.ignorados}:{}}),{tools:o,tokensLocalesDelSondeo:h,aplicado:false}):(c.record("tool-discov\
|
|
900
|
+
ery","applied (two provider calls)",{chosen:g.reconocidos,sent:g.tools.map(p=>p.id),candidates:o.length,...g.ignorados.length?{unknownNames:g.ignorados}:{}}),{tools:g.tools,tokensLocalesDelSondeo:h,aplicado:true})}informeDeCascada(e,n={}){
|
|
901
|
+
if(e.modo!=="off")return {mode:e.modo,servedModel:n.servedModel??e.modeloServido,eligible:e.elegible,reason:e.razon,verifier:e.fuerza,creditedLedger:"none",...e.candidato?{candidateModel:e.candidato}:{},
|
|
902
|
+
...e.economia?{costRatio:Ct(e.economia.r),breakEvenEscalationRate:Ct(e.economia.equilibrio),targetEscalationRate:Ct(e.economia.escaladoMaximo)}:{},...e.bucket?{workload:e.bucket}:{},...e.observada!=null?
|
|
903
|
+
{escalationRate:Ct(e.observada),escalationSamples:e.muestras}:{},...n,requestedModel:e.modeloPedido}}informeDeDiferido(e,n,r){if(e.deferrable!==true)return;let o=n.requestedServiceTier,s=en(n.servedServiceTier),
|
|
904
|
+
i={...o?{requestedTier:o}:{},...s?{servedTier:s.servido}:{},credited:false,creditedLedger:"none",latency:rs(o),reason:""};if(!o)return {...i,reason:ns};if(!s)return {...i,reason:`asked the provider for the\
|
|
905
|
+
"${o}" tier, and it reported none back: the rate this request was billed at cannot be known, so nothing is credited`};if(s.factor==null)return {...i,reason:`asked for "${o}" and the provider reports s\
|
|
906
|
+
erving "${s.servido}", a tier this layer has no published rate for: nothing is credited`};if(!s.conDescuento)return {...i,reason:`asked for "${o}" and the provider reports serving "${s.servido}", which\
|
|
907
|
+
bills at the standard rate: this request was billed as if it had never been deferred`};let a=n.usage,c=Math.min(Math.max(0,a.cachedInputTokens??0),Math.max(0,a.inputTokens)),u=r.cachedInputPer1k??r.inputPer1k,
|
|
908
|
+
l=(Math.max(0,a.inputTokens)-c)/1e3*r.inputPer1k+c/1e3*u+Math.max(0,a.outputTokens)/1e3*r.outputPer1k,d=ts(s,l);return {...i,credited:true,discountRate:Ct(s.factor),...d!=null?{estimatedTierSaving:Bn(d)}:
|
|
909
|
+
{},reason:`the provider reports serving the "${s.servido}" tier, which bills at ${(s.factor*100).toFixed(0)}% of the standard rate; the discount stacks with provider prefix caching rather than replaci\
|
|
910
|
+
ng it`}}diferidoSinLlamada(e){if(e.savings?.deferrable===true)return {credited:false,creditedLedger:"none",latency:"not applicable: no provider call was made for this request.",reason:"no provider call was \
|
|
911
|
+
made, so no processing tier was served and none is credited; the call was avoided outright, which is worth more than any tier discount on it"}}finish(e,n,r,o,s,i,a,c,u,l,d,m,f="none",h=0,g,p,v){let b=e.
|
|
912
|
+
response?.schema,x=m===null?null:m??(b?ee(r.data,b).valid:true),y=this.buildReport(e,n,o,s,i,a,c,u,l,d,x,f,h,g,p??this.diferidoSinLlamada(e),v);return {requestId:y.requestId,data:r.data,text:r.text,...r.
|
|
913
|
+
rendered!==void 0?{rendered:r.rendered}:{},report:y}}buildReport(e,n,r,o,s,i,a,c,u,l,d,m,f,h,g,p){let v=o.estimateCost(s),b=i.elapsed(),x=h!=null&&h.servedModel!==h.requestedModel;return {requestId:p??
|
|
914
|
+
this.generateId(),model:h?.servedModel??e.model,calls:{baselineLlm:o.baselineLlm,actualLlm:o.actualLlm,avoidedLlm:o.avoidedLlm,baselineRetrieval:o.baselineRetrieval,actualRetrieval:o.actualRetrieval,baselineTools:o.
|
|
915
|
+
baselineTools,actualTools:o.actualTools,retries:o.retries},tokens:{baselineInput:o.baselineInput,actualInput:o.actualInput,eliminatedInput:o.eliminatedInput,compressedInput:o.compressedInput,baselineOutput:o.
|
|
916
|
+
publishedBaselineOutput,actualOutput:o.actualOutput,eliminatedOutput:o.eliminatedOutput,...o.providerCachedInput?{providerCachedInput:o.providerCachedInput}:{}},cache:{result:r,...l!==void 0?{confidence:l}:
|
|
917
|
+
{},...u!==void 0?{ageMs:u}:{},...o.reference?{reference:{...o.reference}}:{},...o.referenceRejected?{referenceRejected:o.referenceRejected}:{}},routing:{executionClass:a.executionClass,confidence:a.confidence,
|
|
918
|
+
rounds:o.actualRetrieval,reason:a.reason},serialization:{chosen:c.chosen,candidateTokens:c.candidateTokens,instructionOverheadTokens:c.instructionOverheadTokens},...o.compressionReport?{compression:o.
|
|
919
|
+
compressionReport}:{},constraints:{backend:m,schemaVersion:n.schemaVersion,...d===null?{}:{structurallyValid:d}},qualityStatus:xl(r,d,x),...h?{modelCascade:h}:{},...g?{deferred:g}:{},quality:{...r!=="\
|
|
920
|
+
miss"?{freshnessPassed:!er(n).requiresFreshData}:{}},cost:v,latencyMs:{total:b,preprocessing:Math.max(0,b-f),provider:f},traces:i.all()}}async failOpenDirect(e,n){let r=new bt(this.now);r.record("fail\
|
|
921
|
+
-open","internal optimizer error \u2014 bypassed to a direct provider call",{error:n instanceof Error?n.message:String(n)});let o=new He,s=this.costModelFor(e.model),i;try{i=Xn(e);}catch{i={schemaVersion:e.
|
|
922
|
+
response?.version??e.response?.contractId??"none"};}let a=e.response?.schema,c=[...e.messages];e.structuredData!==void 0&&Dt(c,{role:"system",content:JSON.stringify(e.structuredData)});let u=this.now(),
|
|
923
|
+
l=await this.config.provider.generate({model:e.model,messages:c,...e.tools?.length?{tools:e.tools}:{},...a?{schema:a}:{},...e.response?.maxOutputTokens!=null?{maxOutputTokens:e.response.maxOutputTokens}:
|
|
924
|
+
{},...e.temperature!=null?{temperature:e.temperature}:{},...e.seed!=null?{seed:e.seed}:{}}),d=this.now()-u;o.baselineLlm=1,o.actualLlm=1,o.actualInput=l.usage.inputTokens,o.actualOutput=l.usage.outputTokens,
|
|
925
|
+
o.baselineInput=l.usage.inputTokens,o.baselineOutput=l.usage.outputTokens,l.usage.cachedInputTokens&&o.providerCached(l.usage.cachedInputTokens),l.usage.complete===false&&(o.callsWithoutUsage=1);let m=l.
|
|
926
|
+
text,f=true,h=(l.toolCalls?.length??0)>0;if(h&&(f=null),a&&!h){let p=ze(l.text);f=p.ok?ee(p.value,a).valid:false,p.ok&&(m=p.value);}let g=this.buildReport(e,i,"miss",o,s,r,It(),_t(),void 0,void 0,f,"none",d,
|
|
927
|
+
void 0,e.savings?.deferrable===true?{credited:false,creditedLedger:"none",latency:"unchanged: the fail-open path asks for no processing tier, so this request was scheduled exactly as an ordinary one.",reason:"\
|
|
928
|
+
the optimizer failed and this request went out on the direct fail-open path, which asks for no cheaper tier: that tier can be refused for lack of capacity, and trading availability for a discount on a\
|
|
929
|
+
last-resort call is the wrong trade"}:void 0);return {requestId:g.requestId,data:m,text:l.text,...h?{toolCalls:l.toolCalls}:{},...l.finishReason!==void 0?{finishReason:l.finishReason}:{},report:g}}asCoalescedFollower(e,n,r,o,s,i={
|
|
930
|
+
ok:false,reason:"absent"}){let a=new He;i.ok?a.avoidCallByReference(i.credit):(a.avoidCall(n,r),a.referenceRejected=i.reason);let c=a.estimateCost(o),u=this.generateId(),l=this.diferidoSinLlamada(s),d=l?
|
|
931
|
+
{deferred:l}:{},{deferred:m,streaming:f,...h}=e.report;return {...e,requestId:u,report:{...h,requestId:u,calls:{...e.report.calls,actualLlm:0,avoidedLlm:1},tokens:{baselineInput:a.baselineInput,actualInput:a.
|
|
932
|
+
actualInput,eliminatedInput:a.eliminatedInput,compressedInput:a.compressedInput,baselineOutput:a.publishedBaselineOutput,actualOutput:a.actualOutput,eliminatedOutput:a.eliminatedOutput,...a.providerCachedInput?
|
|
933
|
+
{providerCachedInput:a.providerCachedInput}:{}},cache:{result:"singleflight",...a.reference?{reference:{...a.reference}}:a.referenceRejected?{referenceRejected:a.referenceRejected}:{}},...d,cost:c}}}creditoPorReferencia(e,n){
|
|
934
|
+
if(typeof e=="string")return {ok:false,reason:e};let r;try{r=n.calidad();}catch{r=false;}try{return Yi(e,{ahoraMs:this.now(),modeloPedido:n.request.model,modeloServido:n.cascada.modeloServido,huella:n.huella(),
|
|
935
|
+
textoServidoSha256:G(n.texto),claveLeida:n.claveLeida,calidadOk:r,precio:this.precioDocumentado(n.request.model),determinista:Ji(n.request),salidaDelModelo:wi(n.request.model),topeDeSalida:n.request.response?.
|
|
936
|
+
maxOutputTokens,diferible:n.toggles.deferrable===!0})}catch{return {ok:false,reason:"different-request"}}}assembleBaselinePrompt(e){return this.assemblePromptText(e.messages,e.tools,e.structuredData)}assemblePromptText(e,n,r){
|
|
937
|
+
let o=e.map(s=>s.content);r!==void 0&&o.push(JSON.stringify(r));for(let s of n??[])o.push(po(s));return o.join(`
|
|
777
938
|
`)}tokensFor(e,n){return this.config.tokenizer.count(e,{...n.tokenizer?{tokenizer:n.tokenizer}:{},model:n.model})}estimatorEsExacto(e){let n=this.config.tokenizer;if(typeof n.resolve!="function")return false;
|
|
778
939
|
try{return n.resolve({...e.tokenizer?{tokenizer:e.tokenizer}:{},model:e.model}).exact===!0}catch{return false}}entitled(e){return this.devOpen()?true:!!this.config.licenseGate&&this.config.licenseGate.isEntitled(
|
|
779
|
-
e)}precioConocido(e){let n=this.config.costModels;if(n)
|
|
780
|
-
e);return n||(this.config.defaultCostModel?this.config.defaultCostModel:(this.avisar(`
|
|
781
|
-
price. Dollar figures will not match your bill. Pass { costModels: { "${e}": {
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
r
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
if(t[n].role==="user")
|
|
797
|
-
|
|
798
|
-
{
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
940
|
+
e)}precioConocido(e){return this.precioDelCliente(e)??Ft(e)}precioDelCliente(e){let n=this.config.costModels;if(!n)return;let r=n[e];if(r)return r;let o=e.indexOf("/");if(o>=0){let s=n[e.slice(o+1)];if(s)
|
|
941
|
+
return s}}precioDocumentado(e){return this.precioDelCliente(e)??Un(e)}costModelFor(e){let n=this.precioConocido(e);return n||(this.config.defaultCostModel?this.config.defaultCostModel:(this.avisar(`pr\
|
|
942
|
+
ecio-ilustrativo:${e}`,`[bv-sala] no cost model configured for "${e}"; falling back to the ILLUSTRATIVE default price. Dollar figures will not match your bill. Pass { costModels: { "${e}": { inputPer1\
|
|
943
|
+
k, outputPer1k } } }.`),xi))}};function gl(t,e){if((e.toolCalls?.length??0)>0||!t.schema)return "none";let n=ze(typeof e.text=="string"?e.text:"");return n.ok&&ee(n.value,t.schema).valid?"met":"missed"}
|
|
944
|
+
function ze(t){try{return {ok:!0,value:JSON.parse(t)}}catch{}for(let e of bl(t))try{return {ok:!0,value:JSON.parse(e),rescatado:e}}catch{continue}return {ok:false}}function bl(t){let e=[],n=/```[ \t]*[a-zA-Z0-9_-]*[ \t]*\r?\n([\s\S]*?)```/g;
|
|
945
|
+
for(let r of t.matchAll(n)){let o=r[1]?.trim();o&&e.push(o);}for(let r of ["{","["]){let o=t.indexOf(r);if(o===-1)continue;let s=vl(t,o);s&&e.push(s);}return e}function vl(t,e){let n=t[e],r=n==="{"?"}":"\
|
|
946
|
+
]",o=0,s=false,i=false;for(let a=e;a<t.length;a+=1){let c=t[a];if(s){i?i=false:c==="\\"?i=true:c==='"'&&(s=false);continue}if(c==='"'){s=true;continue}if(c===n)o+=1;else if(c===r&&(o-=1,o===0))return t.slice(e,a+1)}}
|
|
947
|
+
function yl(t){return typeof t=="string"?t:JSON.stringify(t,null,2)}function xl(t,e,n=false){if(e===false)return "rejected";if(n)return "bounded_degradation";switch(t){case "deterministic":case "exact":return "e\
|
|
948
|
+
xact";case "semantic":return "task_equivalent";default:return "not_verified"}}function Ct(t){return Math.round(t*1e6)/1e6}function Bn(t){let e=Math.round(t*1e10)/1e10;return e===0?0:e}function kl(t,e,n,r){
|
|
949
|
+
if(e)return Bn(-t.extraCostUsd);let o=s=>t.actualInput/1e3*s.inputPer1k+t.actualOutput/1e3*s.outputPer1k;return Bn(o(r)-o(n))}function wl(t,e){if(!(e>0))return false;if(e>=1)return true;let n=G(`${t}:cascade\
|
|
950
|
+
-sample`);return Number.parseInt(n.slice(0,13),16)/2**52<e}function It(){return {executionClass:"NO_RETRIEVAL",confidence:1,reason:"n/a (short-circuited)",rounds:0}}function _t(){return {chosen:"json-co\
|
|
951
|
+
mpact",encoded:"",instruction:"",candidateTokens:{},instructionOverheadTokens:0,reason:"no structured payload"}}function fo(t,e="",n=null){if(t==null||typeof t!="object")return "";let r=t,o=[],s=e||"th\
|
|
952
|
+
e value",i=h=>typeof r[h]=="number"?r[h]:null,a=i("maxLength"),c=i("minLength"),u=i("maxItems"),l=i("minItems"),d=i("maximum"),m=i("minimum");if(a!=null){let h=n!=null?Math.min(a,n):a;o.push(`${s}<=${h}\
|
|
953
|
+
ch`);}c!=null&&o.push(`${s}>=${c}ch`),u!=null&&o.push(`${s}<=${u} items`),l!=null&&o.push(`${s}>=${l} items`),d!=null&&o.push(`${s}<=${d}`),m!=null&&o.push(`${s}>=${m}`),typeof r.pattern=="string"&&o.push(
|
|
954
|
+
`${s} matches /${r.pattern}/`);let f=r.properties;if(f&&typeof f=="object")for(let[h,g]of Object.entries(f)){let p=fo(g,e?`${e}.${h}`:h,n);p&&o.push(p);}if(r.items!==void 0){let h=fo(r.items,`${s} entr\
|
|
955
|
+
ies`,n);h&&o.push(h);}return o.join("; ")}function Pt(t){let e=t.response;return e?e.contractId??e.version??JSON.stringify(e.schema??{}).slice(0,200):""}function Sl(t){return t.some(e=>/exceeds maxItems|exceeds maxLength|match pattern|exceeds maximum|below minimum|below minLength|below minItems/.
|
|
956
|
+
test(e.message))}function po(t){return JSON.stringify({type:"function",function:{name:t.id,...t.description?{description:t.description}:{},parameters:t.parameters??{type:"object",properties:{}}}})}function Dt(t,e){
|
|
957
|
+
for(let n=t.length-1;n>=0;n--)if(t[n].role==="user"){t.splice(n,0,e);return}t.push(e);}function mo(t,e=false){if(e){let n=0;for(;n<t.length&&t[n].role==="system";)n+=1;return n}for(let n=t.length-1;n>=0;n--)
|
|
958
|
+
if(t[n].role==="user")return n;return mo(t,true)}function Tl(t,e){let n=co(t,e);return n.cacheReadMultiplier<1?n:null}var la=2e3,da=200,El=200,Rl=10,Cl=1e7,Il=5,_l=48*3600*1e3,ho=/^[A-Za-z0-9._:/-]{1,128}$/,rt=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0,Ot=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0&&t<=
|
|
959
|
+
1e3;function Pl(t,e={}){if(!ho.test(t.requestId)||!ho.test(t.requestedModel)||!ho.test(t.servedModel)||typeof t.at!="number"||!Number.isFinite(t.at)||t.at<1e12)return null;let n=typeof e?.ahora=="numb\
|
|
960
|
+
er"?e.ahora:Date.now();if(t.at>n+_l)return null;let r=t.optimized;if(!Ot(r.cost)||!rt(r.inputTokens)||!rt(r.cachedInputTokens)||!rt(r.outputTokens))return null;let o=t.prices;if(!Ot(o.inputPer1k)||!Ot(
|
|
961
|
+
o.outputPer1k)||o.cachedInputPer1k!==void 0&&!Ot(o.cachedInputPer1k))return null;let s={basis:"verification",requestId:t.requestId,at:Math.floor(t.at),stratum:t.stratum,outcome:t.outcome,requestedModel:t.
|
|
962
|
+
requestedModel,servedModel:t.servedModel,cacheResult:t.cacheResult,optimizedCost:r.cost,optimizedInputTokens:r.inputTokens,optimizedCachedInputTokens:Math.min(r.cachedInputTokens,r.inputTokens),optimizedOutputTokens:r.
|
|
963
|
+
outputTokens,inputPer1k:o.inputPer1k,...o.cachedInputPer1k!==void 0?{cachedInputPer1k:o.cachedInputPer1k}:{},outputPer1k:o.outputPer1k};if(t.outcome==="paired"){let i=t.naive;if(!i||!Ot(i.cost)||!rt(i.
|
|
964
|
+
inputTokens)||!rt(i.cachedInputTokens)||!rt(i.outputTokens)||i.cachedInputTokens>i.inputTokens)return null;if(s.naiveCost=i.cost,s.naiveInputTokens=i.inputTokens,s.naiveCachedInputTokens=i.cachedInputTokens,
|
|
965
|
+
s.naiveOutputTokens=i.outputTokens,i.finishReason!==void 0){if(!/^[a-z_]{1,32}$/.test(i.finishReason))return null;s.naiveFinishReason=i.finishReason;}s.naiveContract=i.contract;}return s}var Fn=class{o;flushIntervalMs;pendientes=[];conteos=new Map;reintentos=[];inflight=null;timer;fallosSeguidos=0;ultimoFallo=Number.
|
|
966
|
+
NEGATIVE_INFINITY;constructor(e){this.o=e,this.flushIntervalMs=e.flushIntervalMs??15e3;}ahora(){return (this.o.now??Date.now)()}encolar(e){let n;try{n=Pl(e,{ahora:this.ahora()});}catch{n=null;}n&&(this.pendientes.
|
|
967
|
+
push(n),this.pendientes.length>la&&this.pendientes.splice(0,this.pendientes.length-la),this.pendientes.length>=da&&this.flushSiToca());}flushSiToca(){return this.reintentos.length>0&&this.ahora()-this.
|
|
968
|
+
ultimoFallo<this.flushIntervalMs?Promise.resolve():this.flush()}contar(e,n){let r=`${e}|${n}`;this.conteos.set(r,(this.conteos.get(r)??0)+1);}start(){this.timer||(this.timer=setInterval(()=>{this.flush();},
|
|
969
|
+
this.flushIntervalMs),this.timer.unref?.());}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0),this.flush();}async flush(){if(this.inflight)return this.inflight;this.inflight=this.hacerFlush();
|
|
970
|
+
try{await this.inflight;}finally{this.inflight=null;}}hayAlgo(){return this.reintentos.length>0||this.pendientes.length>0||this.conteos.size>0}siguienteSobre(){let e=this.reintentos.shift();if(e)return e;
|
|
971
|
+
if(this.pendientes.length===0&&this.conteos.size===0)return null;let n=this.pendientes.splice(0,da),r=[];for(let[o,s]of this.conteos){if(r.length>=El)break;let[i="",a=""]=o.split("|"),c=Math.min(s,Cl);
|
|
972
|
+
r.push({day:i,category:a,requests:c}),s>c?this.conteos.set(o,s-c):this.conteos.delete(o);}return {batchId:(this.o.randomId??dt)(),samples:n,counts:r}}async hacerFlush(){let e=this.o.fetchImpl??globalThis.
|
|
973
|
+
fetch;if(e)for(let n=0;n<Il&&this.hayAlgo();n++){let r=this.siguienteSobre();if(!r||!await this.enviar(e,r))return}}async enviar(e,n){try{let r=await e(this.o.url,{method:"POST",headers:{authorization:`\
|
|
974
|
+
Bearer ${this.o.serviceAccountKey}`,"content-type":"application/json",[zt]:`sdk/${lt}`},body:JSON.stringify(n)});return r.ok?(this.fallosSeguidos=0,!0):r.status>=500?(this.fallosSeguidos++,this.ultimoFallo=
|
|
975
|
+
this.ahora(),this.reencolar(n),this.avisarDeFallo(`the server responded ${r.status}`),!1):r.status===401||r.status===403?(this.o.silenceWarnings||F(`verification-auth-${r.status}`,`[bvsala] verificati\
|
|
976
|
+
on reporting is being rejected with HTTP ${r.status} at ${this.o.url}. Check \`serviceAccountKey\`. Pairs are not reaching your dashboard; your requests and your usage reporting are not affected.`),!1):
|
|
977
|
+
(this.fallosSeguidos++,this.avisarDeFallo(r.status===404||r.status===405?`HTTP ${r.status}: the reporting URL looks wrong, or the server does not have this feature yet`:`the server rejected the batch \
|
|
978
|
+
with HTTP ${r.status}`),!1)}catch(r){return this.fallosSeguidos++,this.ultimoFallo=this.ahora(),this.reencolar(n),this.avisarDeFallo(r instanceof Error?r.message:"network error"),false}}reencolar(e){for(this.
|
|
979
|
+
reintentos.unshift(e);this.reintentos.length>Rl;)this.reintentos.pop();}avisarDeFallo(e){if(this.o.silenceWarnings)return;let n=this.fallosSeguidos;n<3||(n-3)%12!==0||console.warn(`[bvsala] verificatio\
|
|
980
|
+
n reporting has failed ${n} times in a row against ${this.o.url} (${e}). Your requests and usage reporting keep working; the pairs are not arriving.`);}get estado(){return {pendientes:this.pendientes.length,
|
|
981
|
+
conteos:this.conteos.size,reintentos:this.reintentos.length}}};var Dl=72*3600,Ol,pa=new Set(Object.values($t).flatMap(t=>t.flatMap(e=>[e,`openai/${e}`]))),fa="[bvsala] `gpt-tokenizer` is not installed, so token counts for OpenAI models are ESTIMATED with a built-\
|
|
982
|
+
in heuristic and the reconstructed savings are less accurate. Savings where the layer removed something are reported as `estimated` either way, and estimated savings are never billed. Install it once \
|
|
983
|
+
(`npm i gpt-tokenizer`) and the SDK loads it automatically.";function Yh(t){t.licenseGate&&(console.warn("[bvsala] Ignoring the injected `licenseGate`: in the published package a license is only accep\
|
|
984
|
+
ted as a `licenseKey` verified against BiVelio's embedded public key. Get yours at https://savings.bivelio.com/dashboard/install"),t={...t,licenseGate:void 0});let n={...t,tokenizer:t.tokenizer??Kn},r=t.
|
|
985
|
+
tokenizer==null&&t.exactTokenizer!==false?Ol??=Wn(Kn).catch(()=>false):Promise.resolve(true),o,s;if(t.licenseKey&&!t.licenseGate){let m=pi;if(t.licenseServerUrl){let f=new Qe,h=v=>Tn(v,
|
|
986
|
+
m,{revocation:f,...t.now?{now:t.now}:{},maxStalenessSeconds:t.licenseRevocation?.maxStalenessSeconds??Dl}),g=h(t.licenseKey);n.licenseGate={isEntitled:v=>g.isEntitled(v),isActive:()=>g.isActive(),status:()=>g.
|
|
987
|
+
status(),reason:()=>g.reason()};let p=`${t.licenseServerUrl.replace(/\/+$/,"")}/licenses/revocations`;o=new En({url:p,publicKeyPem:m,snapshot:f,getRefreshAfter:()=>g.refreshAfter?.(),...t.now?{nowSeconds:()=>Math.
|
|
988
|
+
floor(t.now()/1e3)}:{},...t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.licensePollIntervalSeconds!=null?{pollIntervalSeconds:t.licensePollIntervalSeconds}:{},...t.silenceWarnings!=null?{silenceWarnings:t.
|
|
989
|
+
silenceWarnings}:{},...t.licenseRevocation??{}}),o.start(),t.serviceAccountKey&&t.licenseRefresh?.enabled!==false&&(s=new Cn({url:`${t.licenseServerUrl.replace(/\/+$/,"")}/api/license/current`,serviceAccountKey:t.
|
|
990
|
+
serviceAccountKey,publicKey:m,initialToken:t.licenseKey,revocados:f,onNewToken:v=>{g=h(v);},...t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.now?{now:t.now}:{},...t.licenseRefresh?.intervalMs!=null?
|
|
991
|
+
{pollIntervalMs:t.licenseRefresh.intervalMs}:{},...t.licenseRefresh?.leadSeconds!=null?{refreshLeadSeconds:t.licenseRefresh.leadSeconds}:{}}),s.start());}else n.licenseGate=vi(t.licenseKey,m,t.now);}let i=Ln(
|
|
992
|
+
t.verification),a=(m,f)=>{t.silenceWarnings!==true&&F(m,f);};!i.activo&&i.motivo==="invalido"&&a("verificacion-invalida",Xi(t.verification));let c,u;if(i.activo){let m;if(t.serviceAccountKey&&t.metering?.
|
|
993
|
+
enabled!==false)if(t.meteringUrl){let f=/^(.*)\/api\/metering\/usage\/?$/.exec(t.meteringUrl);f&&(m=`${f[1]}/api/metering/verification`);}else t.licenseServerUrl&&(m=`${t.licenseServerUrl.replace(/\/+$/,"")}\
|
|
994
|
+
/api/metering/verification`);if(!m&&!i.onCheck)a("verificacion-sin-destino",Qi);else {m&&t.serviceAccountKey&&(c=new Fn({url:m,serviceAccountKey:t.serviceAccountKey,...t.meteringFetch?{fetchImpl:t.meteringFetch}:
|
|
995
|
+
t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.now?{now:t.now}:{},...t.metering?.flushIntervalMs!=null?{flushIntervalMs:t.metering.flushIntervalMs}:{},...t.silenceWarnings!=null?{silenceWarnings:t.
|
|
996
|
+
silenceWarnings}:{}}),c.start());let f=c;u={encolar:h=>f?.encolar(h),...f?{contar:(h,g)=>f.contar(h,g)}:{},enReposo:()=>f?.flushSiToca()},a(`verificacion-activa:${i.tasa}`,Zi(i.tasa));}}let l=new jn(n,
|
|
997
|
+
u?{verificacion:u}:{}),d;if(t.serviceAccountKey&&t.metering?.enabled!==false){let m=t.meteringUrl??(t.licenseServerUrl?`${t.licenseServerUrl.replace(/\/+$/,"")}/api/metering/usage`:void 0);if(!m&&t.silenceWarnings!==
|
|
998
|
+
true&&console.warn('[bvsala] `serviceAccountKey` is set but there is no `licenseServerUrl` (or `meteringUrl`): seat metering and automatic license renewal are OFF, so nothing will reach your dashboard a\
|
|
999
|
+
nd a renewed license will not be picked up. Add `licenseServerUrl: "https://savings.bivelio.com"` \u2014 or drop `serviceAccountKey` for a zero-network deployment.'),m){d=new Tt({url:m,serviceAccountKey:t.
|
|
1000
|
+
serviceAccountKey,surface:"sdk",...t.metering?.orgId?{orgId:t.metering.orgId}:{},...t.metering?.flushIntervalMs!=null?{flushIntervalMs:t.metering.flushIntervalMs}:{},...t.metering?.maxBatch!=null?{maxBatch:t.
|
|
1001
|
+
metering.maxBatch}:{},...t.metering?.maxBuffer!=null?{maxBuffer:t.metering.maxBuffer}:{},...t.meteringFetch?{fetchImpl:t.meteringFetch}:t.licenseFetch?{fetchImpl:t.licenseFetch}:{},...t.now?{now:t.now}:
|
|
1002
|
+
{},...t.metering?.ci!=null?{ci:t.metering.ci}:{},...t.silenceWarnings!=null?{silenceWarnings:t.silenceWarnings}:{}});let f=t.metering?.ci??Hr();if(t.metering?.seatId)d.setSeat(t.metering.seatId,f);else {
|
|
1003
|
+
let h=d;Kr(t.serviceAccountKey).then(g=>h.setSeat(g,f)).catch(()=>{});}d.start();}}return {generate:async m=>{let f=await r,h=await l.generate(m);if(!f&&t.silenceWarnings!==true&&pa.has(m.model)&&F("tokeni\
|
|
1004
|
+
zador-exacto-ausente",fa),d)try{d.record(h.report);}catch{}return h},generateStream:(m,f)=>{let h=l.generateStream(m,f??{},r);return h.result.then(async g=>{if(d)try{d.record(g.report);}catch{}!await r&&
|
|
1005
|
+
t.silenceWarnings!==true&&pa.has(m.model)&&F("tokenizador-exacto-ausente",fa);},()=>{}),h},close:()=>{l.cerrarVerificacion(),c?.stop(),o?.stop(),s?.stop(),d?.stop();}}}/*! Bundled license information:
|
|
809
1006
|
|
|
810
1007
|
@noble/curves/utils.js:
|
|
811
1008
|
@noble/curves/abstract/modular.js:
|
|
@@ -813,4 +1010,4 @@ generate(a);if(i)try{i.record(c.report);}catch{}return c},close:()=>{o?.stop(),r
|
|
|
813
1010
|
@noble/curves/abstract/edwards.js:
|
|
814
1011
|
@noble/curves/ed25519.js:
|
|
815
1012
|
(*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
|
|
816
|
-
*/export{
|
|
1013
|
+
*/export{ps as AnthropicProvider,lt as BV_SALA_VERSION,jt as CATALOGO,dc as COMPACT_ROWS_INSTRUCTION,xi as DEFAULT_COST_MODEL,Dl as DEFAULT_MAX_STALENESS_SECONDS,pi as EMBEDDED_PUBLIC_KEY,Jn as ExactTokenizer,Ht as ExecutionRouter,Yt as FormatSelector,qn as HeuristicEstimator,Ut as InMemoryExactCache,No as InMemorySemanticCache,rr as InMemoryToolSetFreezer,Ce as LicenseError,Gl as MODELOS_POR_CODIFICACION,$t as MODELS_BY_ENCODING,pr as MockProvider,cs as OpenAICompatibleProvider,xa as PRECIOS_AL_DIA,Bl as QUALITY_STATUSES,Ro as REFERENCE_MAX_AGE_MS,Io as REFERENCE_MESSAGE_ALLOWANCE,Co as REFERENCE_OUTPUT_SHARE,nr as ResolverRegistry,En as RevocationPoller,Qe as RevocationSnapshot,He as SavingsLedger,Zt as SchemaRegistry,qt as Singleflight,le as StreamAbortedError,Hn as TokenizerRegistry,Kt as ToolSelector,bt as TraceCollector,Mo as UMBRAL_LOCAL,Tt as UsageEmitter,ec as adaptiveK,qa as arithmeticResolver,Qn as buildExactKey,Do as buildInflightKey,Xn as canonicalize,Ho as compactRowsSerializer,Yo as compresionFiel,fu as computeNextDelay,Ba as cosine,pc as createCompactRowsSerializer,jo as createDefaultResolvers,zl as createHandoff,Sp as createMockProvider,Yh as createSavingsLayer,Jo as csvSerializer,$o as decodeCompactRows,Qa as dedupe,Kn as defaultTokenizerRegistry,Kr as deriveSeatId,qr as deriveStatus,Hr as detectCi,Ao as embebedorLocal,jd as emptyState,cc as encodeCompactRows,Ja as evalArithmetic,er as evaluatePolicy,Fo as executeRetrievalPlan,vi as gateFromKey,qe as heuristicEstimator,cu as isKeyset,Re as isStrictCompatible,zo as jsonCompactSerializer,Va as keyTokensMatch,Vr as licenseKeyShape,Tn as liveGateFromKey,Bd as mergeDelta,Zn as modelFamilyOf,tr as multisetEqual,mt as negationCount,gp as noopCompressor,Ze as normalizeLicenseKey,Vt as normalizeText,pt as numericTokens,Ft as precioDeLista,Fd as projectContext,cp as providerNativeBackend,as as quitarPrefijoDeProveedor,dt as randomId,Wn as registerExactTokenizer,Yl as registrarTokenizadorExacto,nc as renderState,Go as resolveConstraintBackend,ki as resolveDependencies,Df as resolveLicense,G as sha256,lr as shouldCompress,ae as stableStringify,Gt as uniformColumns,ee as validateAgainstSchema,ja as vectorLocal,Ur as verifyCompactSignature,Xe as verifyLicenseToken,bi as verifyRevocationList,hp as withProtectedSpans,ft as words};
|