@bivelio/savings-layer 0.4.25 → 0.4.28
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 +328 -23
- package/dist/adapters/ai-sdk.js +73 -73
- package/dist/adapters/anthropic-sdk.js +69 -67
- package/dist/adapters/langchain.js +55 -52
- package/dist/adapters/mastra.js +65 -65
- package/dist/gateway/bin.js +906 -623
- package/dist/index.d.ts +928 -11
- package/dist/index.js +1398 -1004
- package/docs/terminales/README.md +59 -11
- package/docs/terminales/aider.md +74 -0
- package/docs/terminales/continue.md +47 -0
- package/docs/terminales/copilot.md +114 -0
- package/docs/terminales/kilo.md +54 -31
- package/docs/terminales/no-soportados.md +41 -0
- package/docs/terminales/opencode.md +33 -11
- package/package.json +24 -3
|
@@ -1,57 +1,60 @@
|
|
|
1
|
-
import {createMiddleware}from'langchain';import {AIMessage}from'@langchain/core/messages';import {toJsonSchema}from'@langchain/core/utils/json_schema';import {createSavingsLayer,LicenseError,sha256,stableStringify}from'@bivelio/savings-layer';import {AsyncLocalStorage}from'async_hooks';var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
let a=await s.generar(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
let
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import {createMiddleware}from'langchain';import {AIMessage}from'@langchain/core/messages';import {toJsonSchema}from'@langchain/core/utils/json_schema';import {createSavingsLayer,LicenseError,sha256,stableStringify}from'@bivelio/savings-layer';import {AsyncLocalStorage}from'async_hooks';var H={"api.anthropic.com":"anthropic","api.openai.com":"openai","generativelanguage.googleapis.com":"google"};function K(e){if(typeof e!="string")return null;try{let n=new URL(e);return n.protocol!==
|
|
2
|
+
"https:"||n.port!==""?null:H[n.hostname.toLowerCase()]??null}catch{return null}}function b(e){return K(e)!==null?"oficial":"no-oficial"}var M=Symbol.for("@bivelio/savings-layer:provider-origin");var C=new Set;function L(e,n,t){e===true||C.has(n)||(C.add(n),console.warn(t));}var Z="[bvsala] internal: the layer changed a request this adapter must forward unchanged; nothing was sent.",Q="[bvsala] internal: the layer asked for a second model call within one framework call; n\
|
|
3
|
+
othing more was sent.",Y="[bvsala] internal: the layer called the model outside a framework call; nothing was sent.";function T(e,n,t,r){return {renderizado:e,generar:n,...{},invocada:false,
|
|
4
|
+
completada:false,...r!==void 0?{origen:r}:{}}}async function E(e,n){try{let t=await n();return e.completada=!0,t}catch(t){throw e.errorDelMarco={error:t},t}}function ee(e,n){if(e===n)return true;try{return stableStringify(
|
|
5
|
+
e)===stableStringify(n)}catch{return false}}function O(e,n){let t=e??[],r=n??[];return t.length===r.length&&t.every((o,a)=>ee(o,r[a]))}function ne(e,n){return e.model===n.model&&O(e.messages,n.messages)&&O(e.tools,n.tools)}
|
|
6
|
+
function I(e,n){let t=o=>{let a=n.getStore();if(!a)throw new Error(Y);if(a.invocada)throw new Error(Q);if(!ne(o,a.renderizado))throw new Error(Z);return a.invocada=true,a},r={id:`bivelio-adapter:${e}`,async generate(o,a){
|
|
7
|
+
return t(o).generar(a?.signal)},async*generateStream(o,a){let s=t(o);if(s.transmitir){yield*s.transmitir(a?.signal);return}let i=await s.generar(a?.signal);i.text!==""&&(yield {type:"text",delta:i.text}),
|
|
8
|
+
yield {type:"done",response:i};}};return Object.defineProperty(r,M,{value:()=>n.getStore()?.origen}),r}function j(){return new AsyncLocalStorage}var oe=["licenseKey","licenseServerUrl","serviceAccountKey","licenseRefresh","licenseRevocation","licensePollIntervalSeconds","licenseFetch","metering","meteringUrl","meteringFetch","costModels","defa\
|
|
9
|
+
ultCostModel","exactCache","exactCacheTtlMs","resolvers","exactTokenizer","silenceWarnings","failOpen"];function q(e,n){return n instanceof LicenseError||e.errorDelMarco&&e.errorDelMarco.error===n?false:e.invocada&&
|
|
10
|
+
e.completada}var $="[bvsala] the model answered, but the savings layer failed while accounting for it; the answer is returned unchanged, without a savings report and without a usage record.";function z(e,n){
|
|
11
|
+
let t=j(),r={};for(let s of oe)n[s]!==void 0&&(r[s]=n[s]);let o=createSavingsLayer({...r,provider:I(e,t)}),a=(s,i)=>L(n.silenceWarnings,`${e}:${s}`,i);return {ejecutar(s,i){return t.run(i,()=>o.generate(s))},async generar(s,i){
|
|
12
|
+
try{let l=await t.run(i,()=>o.generate(s));return i.invocada?{tipo:"vivo",result:l}:{tipo:"atajo",result:l}}catch(l){if(q(i,l))return a("sin-informe",$),{tipo:"sin-informe"};throw l}},async transmitir(s,i,l){
|
|
13
|
+
let u=t.run(i,()=>o.generateStream(s,l?{signal:l}:{})).result;i.resultado=u,u.catch(()=>{});let f;try{f=await Promise.race([i.abierta.then(()=>"abierta"),u.then(()=>"resuelta")]);}catch(h){if(q(i,h))return a(
|
|
14
|
+
"sin-informe",$),{tipo:"sin-informe"};throw h}if(f==="abierta")return {tipo:"abierto"};let g=await u;return i.invocada?{tipo:"entero",result:g}:{tipo:"atajo",result:g}},informe(s){let i=JSON.parse(JSON.
|
|
15
|
+
stringify(s));if(n.onReport)try{n.onReport(i);}catch{a("onreport","[bvsala] `onReport` threw; the error was caught and the model call was not affected.");}return i},avisar:a,close(){o.close();}}}var se={router:false,compression:false,elision:false,serialization:false,toolDiscovery:false,modelCascade:"off",outputCodebook:false,deferrable:false,semanticCache:false,verification:false};
|
|
16
|
+
function ie(e,n,t={}){let r=o=>e?.[o]!==false&&n?.[o]!==false;return {...se,exactCache:r("exactCache")&&t.sinReutilizar!==true,singleflight:r("singleflight")&&t.sinReutilizar!==true,deterministicResolvers:r("det\
|
|
17
|
+
erministicResolvers")&&t.sinResolvers!==true}}function ce(e,n){let t=e.readOnlyTools;if(typeof t=="function")try{return t(n)===!0}catch{return false}return Array.isArray(t)?t.includes(n):false}function R(e,n){
|
|
18
|
+
let t=n.delProveedor!==true&&ce(e,n.nombre);return {id:n.nombre,intents:[],risk:t?"read":"write",...n.parametros!==void 0&&n.parametros!==null&&typeof n.parametros=="object"?{parameters:n.parametros}:{},
|
|
18
19
|
...typeof n.descripcion=="string"?{description:n.descripcion}:{}}}function y(e,n,t){if(e===null)return null;switch(typeof e){case "string":case "boolean":return e;case "number":return Number.isFinite(e)?
|
|
19
20
|
e:String(e);case "bigint":return `${e.toString()}n`;case "undefined":case "function":case "symbol":return}let r=e;if(r instanceof Uint8Array)return n.push(r),{$bytes:n.length-1};if(r instanceof ArrayBuffer)
|
|
20
21
|
return n.push(new Uint8Array(r)),{$bytes:n.length-1};if(ArrayBuffer.isView(r))return n.push(new Uint8Array(r.buffer,r.byteOffset,r.byteLength)),{$bytes:n.length-1};if(r instanceof URL)return {$url:r.href};
|
|
21
|
-
if(r instanceof Date)return {$date:Number.isNaN(r.getTime())?"invalid":r.toISOString()};if(t.has(r))return "$cycle";t.add(r);try{if(Array.isArray(r))return r.map(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
2,"0")).join("")}let t="";for(let r=0;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return sha256(t)}async function
|
|
25
|
-
all(n.map(
|
|
22
|
+
if(r instanceof Date)return {$date:Number.isNaN(r.getTime())?"invalid":r.toISOString()};if(t.has(r))return "$cycle";t.add(r);try{if(Array.isArray(r))return r.map(a=>{let s=y(a,n,t);return s===void 0?null:
|
|
23
|
+
s});if(r instanceof Map)return {$map:[...r.entries()].map(a=>y(a,n,t))};if(r instanceof Set)return {$set:[...r.values()].map(a=>y(a,n,t))};let o={};for(let a of Object.keys(r).sort()){let s=y(r[a],n,t);
|
|
24
|
+
s!==void 0&&(o[a]=s);}return o}finally{t.delete(r);}}async function N(e){let n=globalThis.crypto?.subtle;if(n){let r=new Uint8Array(await n.digest("SHA-256",e));return Array.from(r,o=>o.toString(16).padStart(
|
|
25
|
+
2,"0")).join("")}let t="";for(let r=0;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return sha256(t)}async function le(e){try{let n=[],t=JSON.stringify(y(e,n,new WeakSet))??"null",r=await Promise.
|
|
26
|
+
all(n.map(N)),o=new TextEncoder().encode(`${t}|${r.join(",")}`);return await N(o)}catch{return null}}async function U(e,n){let t=await le(n.proyeccion),r=`${n.context?.authorizationScope??"default"}|b\
|
|
26
27
|
vsala-adapter:${t??"none"}`;return {model:n.model,messages:n.messages,...n.tools.length>0?{tools:n.tools}:{},...typeof n.temperature=="number"?{temperature:n.temperature}:{},...typeof n.seed=="number"?
|
|
27
|
-
{seed:n.seed}:{},context:{...n.context??{},authorizationScope:r},savings:
|
|
28
|
+
{seed:n.seed}:{},context:{...n.context??{},authorizationScope:r},savings:ie(e.savings,n.savings,{...n.restricciones,...t===null?{sinReutilizar:true}:{}})}}function c(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function J(e){let n=e;try{if(typeof n.getType=="function")return n.getType();if(typeof n._getType=="function")return n._getType()}catch{}
|
|
28
29
|
return typeof n.type=="string"?n.type:""}function v(e){return typeof e=="string"?e:Array.isArray(e)?e.filter(n=>c(n)&&n.type==="text"&&typeof n.text=="string").map(n=>n.text).join(`
|
|
29
|
-
`):""}function
|
|
30
|
-
"string"?{id:t.id}:{},name:String(t.name??""),arguments:
|
|
31
|
-
"system")t.push({role:"system",content:v(o.content)});else if(
|
|
32
|
-
0?{toolCalls:
|
|
33
|
-
"string"?{name:o.name}:{}});}return t}function
|
|
34
|
-
ction_call"||o.startsWith("__")||(r[o]=
|
|
35
|
-
e).map(o=>({name:o.name,arguments:o.arguments})),status:e.status,additional_kwargs:r}}function
|
|
36
|
-
try{
|
|
37
|
-
description,parametros:
|
|
38
|
-
description=="string"?
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
void 0
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
30
|
+
`):""}function B(e){if(typeof e=="string")return e;try{return JSON.stringify(e??{})}catch{return "{}"}}function k(e){return (Array.isArray(e.tool_calls)?e.tool_calls:[]).filter(c).map(t=>({...typeof t.id==
|
|
31
|
+
"string"?{id:t.id}:{},name:String(t.name??""),arguments:B(t.args)}))}function pe(e,n){let t=[],r=v(e?.content);r!==""&&t.push({role:"system",content:r});for(let o of n){if(!c(o))continue;let a=J(o);if(a===
|
|
32
|
+
"system")t.push({role:"system",content:v(o.content)});else if(a==="human")t.push({role:"user",content:v(o.content)});else if(a==="ai"){let s=k(o);t.push({role:"assistant",content:v(o.content),...s.length>
|
|
33
|
+
0?{toolCalls:s}:{}});}else a==="tool"&&t.push({role:"tool",content:typeof o.content=="string"?o.content:B(o.content),...typeof o.tool_call_id=="string"?{toolCallId:o.tool_call_id}:{},...typeof o.name==
|
|
34
|
+
"string"?{name:o.name}:{}});}return t}function F(e){if(!c(e))return e;let n=e.content,t=J(e),r={};for(let[o,a]of Object.entries(c(e.additional_kwargs)?e.additional_kwargs:{}))o==="tool_calls"||o==="fun\
|
|
35
|
+
ction_call"||o.startsWith("__")||(r[o]=a);return {type:t,name:e.name,content:t==="tool"?n:typeof n=="string"?"$text":Array.isArray(n)?n.map(o=>c(o)&&o.type==="text"?{...o,text:void 0,id:void 0}:o):n,tool_calls:k(
|
|
36
|
+
e).map(o=>({name:o.name,arguments:o.arguments})),status:e.status,additional_kwargs:r}}function ge(e,n){let t=[],r=[];for(let o of n){if(!c(o))continue;if(typeof o.name=="string"&&"schema"in o){let s,i=true;
|
|
37
|
+
try{s=toJsonSchema(o.schema);}catch{i=false;}let l=R(e,{nombre:o.name,descripcion:typeof o.description=="string"?o.description:void 0,parametros:s});t.push(i?l:{...l,risk:"write"}),r.push({name:o.name,description:o.
|
|
38
|
+
description,parametros:s,returnDirect:o.returnDirect});continue}let a=c(o.function)?o.function:void 0;if(o.type==="function"&&a&&typeof a.name=="string"){t.push(R(e,{nombre:a.name,descripcion:typeof a.
|
|
39
|
+
description=="string"?a.description:void 0,parametros:a.parameters})),r.push(o);continue}t.push(R(e,{nombre:String(o.name??o.type??"server-tool"),delProveedor:true})),r.push(o);}return {tools:t,definiciones:r}}
|
|
40
|
+
function x(e){try{let n=e._llmType?.();return typeof n=="string"?n:""}catch{return ""}}function me(e){if(typeof e=="string")return e.replace(":","/");let n=e,t=n._defaultConfig;if(t&&typeof t=="object"&&
|
|
41
|
+
typeof t.model=="string"&&t.model!=="")return t.model.includes("/")?t.model:typeof t.modelProvider=="string"&&t.modelProvider!==""?`${t.modelProvider}/${t.model}`:t.model;let r=typeof n.model=="string"?
|
|
42
|
+
n.model:typeof n.modelName=="string"?n.modelName:"";if(r.includes("/"))return r;let o=x(e);return o!==""?`${o}/${r}`:r}function ye(e){if(!c(e))return;try{if(typeof e.identifyingParams=="function"){let t=e.
|
|
43
|
+
identifyingParams.call(e),r=c(t)?t.baseURL:void 0;if(typeof r=="string"&&r!=="")return b(r)}}catch{}let n=e.apiUrl;if(x(e)==="anthropic"&&typeof n=="string"&&n!=="")return b(n)}function ve(e){try{return e.
|
|
44
|
+
invocationParams?.({})??null}catch{return null}}function he(e){let n=e.toolChoice;return n==="required"||c(n)?true:e.responseFormat!==void 0}function p(e){return typeof e=="number"&&Number.isFinite(e)?e:
|
|
45
|
+
void 0}function we(e,n){let t=c(e.usage_metadata)?e.usage_metadata:void 0,r=p(t?.input_tokens),o=p(t?.output_tokens),a=c(t?.input_token_details)?t.input_token_details:{},s=c(t?.output_token_details)?t.
|
|
46
|
+
output_token_details:{},i=p(a.cache_read),l=p(a.cache_creation),d=p(s.reasoning),u=r!==void 0&&(i??0)+(l??0)<=r;return {inputTokens:r??0,outputTokens:o??0,...i!==void 0?{cachedInputTokens:i}:{},...l!==
|
|
47
|
+
void 0?{cacheWriteInputTokens:l}:{},...d!==void 0?{reasoningTokens:d}:{},...n&&r!==void 0&&o!==void 0&&u?{}:{complete:false}}}function Se(e){let n=c(e.response_metadata)?e.response_metadata:{},t=n.finish_reason??
|
|
48
|
+
n.stop_reason??n.finishReason;switch(t){case "end_turn":case "stop":case "STOP":return "stop";case "max_tokens":case "length":case "MAX_TOKENS":return "length";case "tool_use":case "tool_calls":return "tool_call\
|
|
49
|
+
s";default:return typeof t=="string"?t:void 0}}function Re(e,n){if(n!=="stop")return false;if(Array.isArray(e.content)){for(let r of e.content)if(!c(r)||r.type!=="text"||Array.isArray(r.citations)&&r.citations.
|
|
50
|
+
length>0||Array.isArray(r.annotations)&&r.annotations.length>0)return false}let t=c(e.additional_kwargs)?e.additional_kwargs:{};return !("reasoning"in t||"reasoning_content"in t||"audio"in t)}function Ae(e,n){
|
|
51
|
+
let t=Se(e),r=k(e);return {text:v(e.content),...r.length>0?{toolCalls:r}:{},...t?{finishReason:t}:{},usage:we(e,n),...Re(e,t)?{}:{replayable:false}}}function be(e,n){return new AIMessage({content:e.text,tool_calls:(e.
|
|
52
|
+
toolCalls??[]).map((t,r)=>{let o={};try{let a=JSON.parse(t.arguments||"{}");c(a)&&(o=a);}catch{o={};}return {id:t.id??`bvsala-${e.requestId}-${r}`,name:t.name,args:o,type:"tool_call"}}),usage_metadata:{input_tokens:0,
|
|
53
|
+
output_tokens:0,total_tokens:0},response_metadata:n?{bivelio:{savingsReport:n}}:{}})}var ke="[bvsala] this LangChain model has its own `cache` set, so a usage counter can be a cached copy rather than \
|
|
54
|
+
a provider bill; its calls are reported as unmeasured.";function Be(e){let n=z("langchain",e),t=e.reportInMetadata!==false,r=createMiddleware({name:"BivelioSavings",wrapModelCall:async(o,a)=>{let s=o,i=s.model,l=x(i),
|
|
55
|
+
d=c(i)&&i.cache!==void 0&&i.cache!==null&&i.cache!==false;d&&n.avisar("cache-del-modelo",ke);let u=!l.toLowerCase().includes("fake")&&!d,f=e.modelId?e.modelId(i):me(i),g=Array.isArray(s.messages)?s.messages:
|
|
56
|
+
[],{tools:h,definiciones:V}=ge(e,Array.isArray(s.tools)?s.tools:[]),W=he(s),G=p(i?.temperature),m=await U(e,{model:f,messages:pe(s.systemMessage,g),tools:h,temperature:G,context:e.context?.(o),proyeccion:{
|
|
57
|
+
modelo:f,parametros:ve(i),sistema:F(s.systemMessage),mensajes:g.map(F),herramientas:V,toolChoice:s.toolChoice,responseFormat:s.responseFormat,modelSettings:s.modelSettings},restricciones:{sinResolvers:W,
|
|
58
|
+
sinReutilizar:s.responseFormat!==void 0}}),w,D=T({model:m.model,messages:m.messages,...m.tools?{tools:m.tools}:{}},async()=>(w=await E(D,async()=>a(o)),Ae(w,u)),void 0,ye(i)),S=await n.generar(m,D);if(S.
|
|
59
|
+
tipo==="sin-informe")return w;let _=n.informe(S.result.report);if(S.tipo==="atajo")return be(S.result,t?_:void 0);let A=w;return t&&(A.response_metadata={...A.response_metadata??{},bivelio:{savingsReport:_}}),
|
|
60
|
+
A}});return Object.assign(r,{close:()=>n.close()})}function Ve(e){let n=e?.response_metadata,t=c(n)?n.bivelio:void 0,r=c(t)?t.savingsReport:void 0;if(!(!c(r)||typeof r.requestId!="string"))return r}export{Ve as getSavingsReportFromMessage,Be as savingsAgentMiddleware};
|
package/dist/adapters/mastra.js
CHANGED
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
import {createSavingsLayer,LicenseError,sha256,stableStringify}from'@bivelio/savings-layer';import {AsyncLocalStorage}from'async_hooks';var N=new Set;function $(e,t,n){e===true||N.has(t)||(N.add(t),console.warn(n));}var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
model&&
|
|
5
|
-
return a.invocada=true,a}
|
|
6
|
-
|
|
1
|
+
import {createSavingsLayer,LicenseError,sha256,stableStringify}from'@bivelio/savings-layer';import {AsyncLocalStorage}from'async_hooks';var N=new Set;function $(e,t,n){e===true||N.has(t)||(N.add(t),console.warn(n));}var _=Symbol.for("@bivelio/savings-layer:provider-origin");var ge="[bvsala] internal: the layer changed a request this adapter must forward unchanged; nothing was sent.",me="[bvsala] internal: the layer asked for a second model call within one framework call;\
|
|
2
|
+
nothing more was sent.",ve="[bvsala] internal: the layer called the model outside a framework call; nothing was sent.";function J(e,t,n,r){return {renderizado:e,generar:t,...{},invocada:false,
|
|
3
|
+
completada:false,...{}}}function ye(e,t){if(e===t)return true;try{return stableStringify(e)===stableStringify(t)}catch{return false}}function F(e,t){let n=e??[],r=t??[];return n.length===r.length&&n.every((s,a)=>ye(s,r[a]))}function he(e,t){return e.model===t.
|
|
4
|
+
model&&F(e.messages,t.messages)&&F(e.tools,t.tools)}function V(e,t){let n=s=>{let a=t.getStore();if(!a)throw new Error(ve);if(a.invocada)throw new Error(me);if(!he(s,a.renderizado))throw new Error(ge);
|
|
5
|
+
return a.invocada=true,a},r={id:`bivelio-adapter:${e}`,async generate(s,a){return n(s).generar(a?.signal)},async*generateStream(s,a){let i=n(s);if(i.transmitir){yield*i.transmitir(a?.signal);return}let o=await i.
|
|
6
|
+
generar(a?.signal);o.text!==""&&(yield {type:"text",delta:o.text}),yield {type:"done",response:o};}};return Object.defineProperty(r,_,{value:()=>t.getStore()?.origen}),r}function B(){return new AsyncLocalStorage}var we=["licenseKey","licenseServerUrl","serviceAccountKey","licenseRefresh","licenseRevocation","licensePollIntervalSeconds","licenseFetch","metering","meteringUrl","meteringFetch","costModels","defa\
|
|
7
7
|
ultCostModel","exactCache","exactCacheTtlMs","resolvers","exactTokenizer","silenceWarnings","failOpen"];function W(e,t){return t instanceof LicenseError||e.errorDelMarco&&e.errorDelMarco.error===t?false:e.invocada&&
|
|
8
|
-
e.completada}var
|
|
9
|
-
let n=B(),r={};for(let i of
|
|
10
|
-
try{let l=await n.run(o,()=>
|
|
11
|
-
let d=n.run(o,()=>
|
|
12
|
-
"sin-informe",
|
|
13
|
-
stringify(i));if(t.onReport)try{t.onReport(o);}catch{
|
|
8
|
+
e.completada}var G="[bvsala] the model answered, but the savings layer failed while accounting for it; the answer is returned unchanged, without a savings report and without a usage record.";function H(e,t){
|
|
9
|
+
let n=B(),r={};for(let i of we)t[i]!==void 0&&(r[i]=t[i]);let s=createSavingsLayer({...r,provider:V(e,n)}),a=(i,o)=>$(t.silenceWarnings,`${e}:${i}`,o);return {ejecutar(i,o){return n.run(o,()=>s.generate(i))},async generar(i,o){
|
|
10
|
+
try{let l=await n.run(o,()=>s.generate(i));return o.invocada?{tipo:"vivo",result:l}:{tipo:"atajo",result:l}}catch(l){if(W(o,l))return a("sin-informe",G),{tipo:"sin-informe"};throw l}},async transmitir(i,o,l){
|
|
11
|
+
let d=n.run(o,()=>s.generateStream(i,l?{signal:l}:{})).result;o.resultado=d,d.catch(()=>{});let g;try{g=await Promise.race([o.abierta.then(()=>"abierta"),d.then(()=>"resuelta")]);}catch(p){if(W(o,p))return a(
|
|
12
|
+
"sin-informe",G),{tipo:"sin-informe"};throw p}if(g==="abierta")return {tipo:"abierto"};let u=await d;return o.invocada?{tipo:"entero",result:u}:{tipo:"atajo",result:u}},informe(i){let o=JSON.parse(JSON.
|
|
13
|
+
stringify(i));if(t.onReport)try{t.onReport(o);}catch{a("onreport","[bvsala] `onReport` threw; the error was caught and the model call was not affected.");}return o},avisar:a,close(){s.close();}}}function v(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function K(e){return typeof e=="string"?[{type:"text",text:e}]:Array.isArray(e)?e.filter(v):[]}function T(e){return e.filter(t=>t.type===
|
|
14
14
|
"text"&&typeof t.text=="string").map(t=>t.text).join(`
|
|
15
|
-
`)}function h(e){if(typeof e=="string")return e;try{return JSON.stringify(e??{})}catch{return "{}"}}function
|
|
15
|
+
`)}function h(e){if(typeof e=="string")return e;try{return JSON.stringify(e??{})}catch{return "{}"}}function xe(e){if(!v(e))return h(e);switch(e.type){case "text":case "error-text":return typeof e.value==
|
|
16
16
|
"string"?e.value:h(e.value);case "json":case "error-json":return h(e.value);case "execution-denied":return `execution denied${typeof e.reason=="string"?`: ${e.reason}`:""}`;case "content":return T(t(e.value));default:
|
|
17
|
-
return h(e)}function t(n){return Array.isArray(n)?n.filter(v):[]}}function
|
|
18
|
-
system",content:typeof n.content=="string"?n.content:T(r)});break;case "user":t.push({role:"user",content:T(r)});break;case "assistant":{let
|
|
19
|
-
map(
|
|
20
|
-
tool":for(let
|
|
21
|
-
{}});break}}return t}var
|
|
22
|
-
entries(e))if(!(n==="toolCallId"||n==="id")&&!(n==="text"&&e.type==="text")){if(n==="providerOptions"||n==="providerMetadata"){t[n]=x(r);continue}t[n]=r;}return t}function
|
|
23
|
-
e:[]).map(t=>v(t)?{role:t.role,content:typeof t.content=="string"?"$text":
|
|
24
|
-
e))return;let t={};for(let[n,r]of Object.entries(e))
|
|
25
|
-
n.inputTokens),u=y(n.outputTokens);return {inputTokens:g??0,outputTokens:u??0,complete:false}}let
|
|
26
|
-
0,...i!==void 0?{cachedInputTokens:i}:{},...o!==void 0?{cacheWriteInputTokens:o}:{},...c!==void 0?{reasoningTokens:c}:{},...
|
|
27
|
-
toLowerCase().startsWith("mock")}var
|
|
28
|
-
function Pe(e,t,n={}){let r=
|
|
29
|
-
erministicResolvers")&&n.sinResolvers!==true}}function
|
|
30
|
-
let n=t.delProveedor!==true&&
|
|
17
|
+
return h(e)}function t(n){return Array.isArray(n)?n.filter(v):[]}}function Z(e){let t=[];for(let n of Array.isArray(e)?e:[]){if(!v(n))continue;let r=K(n.content);switch(n.role){case "system":t.push({role:"\
|
|
18
|
+
system",content:typeof n.content=="string"?n.content:T(r)});break;case "user":t.push({role:"user",content:T(r)});break;case "assistant":{let s=r.filter(a=>a.type==="tool-call"&&a.providerExecuted!==true).
|
|
19
|
+
map(a=>({...typeof a.toolCallId=="string"?{id:a.toolCallId}:{},name:String(a.toolName??""),arguments:h(a.input??a.args)}));t.push({role:"assistant",content:T(r),...s.length>0?{toolCalls:s}:{}});break}case "\
|
|
20
|
+
tool":for(let s of r)s.type==="tool-result"&&t.push({role:"tool",content:xe(s.output??s.result),...typeof s.toolCallId=="string"?{toolCallId:s.toolCallId}:{},...typeof s.toolName=="string"?{name:s.toolName}:
|
|
21
|
+
{}});break}}return t}var Se=new Set(["bivelio","mastra"]);function x(e){if(!v(e))return e;let t={};for(let[n,r]of Object.entries(e))Se.has(n)||(t[n]=r);return t}function ke(e){let t={};for(let[n,r]of Object.
|
|
22
|
+
entries(e))if(!(n==="toolCallId"||n==="id")&&!(n==="text"&&e.type==="text")){if(n==="providerOptions"||n==="providerMetadata"){t[n]=x(r);continue}t[n]=r;}return t}function Q(e){return (Array.isArray(e)?
|
|
23
|
+
e:[]).map(t=>v(t)?{role:t.role,content:typeof t.content=="string"?"$text":K(t.content).map(ke),providerOptions:x(t.providerOptions)}:t)}var Ae=new Set(["anthropic-beta","openai-beta"]);function X(e){if(!v(
|
|
24
|
+
e))return;let t={};for(let[n,r]of Object.entries(e))Ae.has(n.toLowerCase())&&r!==void 0&&(t[n.toLowerCase()]=r);return Object.keys(t).length>0?t:void 0}function y(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Y(e,t){let n=v(e)?e:{},r=v(n.inputTokens)?n.inputTokens:void 0,s=v(n.outputTokens)?n.outputTokens:void 0;if(!r||!s){let g=y(
|
|
25
|
+
n.inputTokens),u=y(n.outputTokens);return {inputTokens:g??0,outputTokens:u??0,complete:false}}let a=y(r.total),i=y(r.cacheRead),o=y(r.cacheWrite),l=y(s.total),c=y(s.reasoning);return {inputTokens:a??0,outputTokens:l??
|
|
26
|
+
0,...i!==void 0?{cachedInputTokens:i}:{},...o!==void 0?{cacheWriteInputTokens:o}:{},...c!==void 0?{reasoningTokens:c}:{},...a!==void 0&&l!==void 0&&!t?{}:{complete:false}}}function ee(e){switch(e){case void 0:return;case "tool-calls":return "tool_calls";case "content-filter":return "content_filter";default:return e}}function te(e){let t=String(e.modelId??"");if(t.includes("/"))return t;let n=String(e.provider??"").split(".")[0]??"";return n!==""?`${n}/${t}`:t}function ne(e){return typeof e.provider=="string"&&e.provider.
|
|
27
|
+
toLowerCase().startsWith("mock")}var Ce={router:false,compression:false,elision:false,serialization:false,toolDiscovery:false,modelCascade:"off",outputCodebook:false,deferrable:false,semanticCache:false,verification:false};
|
|
28
|
+
function Pe(e,t,n={}){let r=s=>e?.[s]!==false&&t?.[s]!==false;return {...Ce,exactCache:r("exactCache")&&n.sinReutilizar!==true,singleflight:r("singleflight")&&n.sinReutilizar!==true,deterministicResolvers:r("det\
|
|
29
|
+
erministicResolvers")&&n.sinResolvers!==true}}function Te(e,t){let n=e.readOnlyTools;if(typeof n=="function")try{return n(t)===!0}catch{return false}return Array.isArray(n)?n.includes(t):false}function oe(e,t){
|
|
30
|
+
let n=t.delProveedor!==true&&Te(e,t.nombre);return {id:t.nombre,intents:[],risk:n?"read":"write",...t.parametros!==void 0&&t.parametros!==null&&typeof t.parametros=="object"?{parameters:t.parametros}:{},
|
|
31
31
|
...typeof t.descripcion=="string"?{description:t.descripcion}:{}}}function S(e,t,n){if(e===null)return null;switch(typeof e){case "string":case "boolean":return e;case "number":return Number.isFinite(e)?
|
|
32
32
|
e:String(e);case "bigint":return `${e.toString()}n`;case "undefined":case "function":case "symbol":return}let r=e;if(r instanceof Uint8Array)return t.push(r),{$bytes:t.length-1};if(r instanceof ArrayBuffer)
|
|
33
33
|
return t.push(new Uint8Array(r)),{$bytes:t.length-1};if(ArrayBuffer.isView(r))return t.push(new Uint8Array(r.buffer,r.byteOffset,r.byteLength)),{$bytes:t.length-1};if(r instanceof URL)return {$url:r.href};
|
|
34
|
-
if(r instanceof Date)return {$date:Number.isNaN(r.getTime())?"invalid":r.toISOString()};if(n.has(r))return "$cycle";n.add(r);try{if(Array.isArray(r))return r.map(
|
|
35
|
-
i});if(r instanceof Map)return {$map:[...r.entries()].map(
|
|
36
|
-
i!==void 0&&(a
|
|
37
|
-
2,"0")).join("")}let n="";for(let r=0;r<e.length;r+=32768)n+=String.fromCharCode(...e.subarray(r,r+32768));return sha256(n)}async function
|
|
38
|
-
all(t.map(
|
|
34
|
+
if(r instanceof Date)return {$date:Number.isNaN(r.getTime())?"invalid":r.toISOString()};if(n.has(r))return "$cycle";n.add(r);try{if(Array.isArray(r))return r.map(a=>{let i=S(a,t,n);return i===void 0?null:
|
|
35
|
+
i});if(r instanceof Map)return {$map:[...r.entries()].map(a=>S(a,t,n))};if(r instanceof Set)return {$set:[...r.values()].map(a=>S(a,t,n))};let s={};for(let a of Object.keys(r).sort()){let i=S(r[a],t,n);
|
|
36
|
+
i!==void 0&&(s[a]=i);}return s}finally{n.delete(r);}}async function re(e){let t=globalThis.crypto?.subtle;if(t){let r=new Uint8Array(await t.digest("SHA-256",e));return Array.from(r,s=>s.toString(16).padStart(
|
|
37
|
+
2,"0")).join("")}let n="";for(let r=0;r<e.length;r+=32768)n+=String.fromCharCode(...e.subarray(r,r+32768));return sha256(n)}async function Oe(e){try{let t=[],n=JSON.stringify(S(e,t,new WeakSet))??"null",r=await Promise.
|
|
38
|
+
all(t.map(re)),s=new TextEncoder().encode(`${n}|${r.join(",")}`);return await re(s)}catch{return null}}async function ae(e,t){let n=await Oe(t.proyeccion),r=`${t.context?.authorizationScope??"default"}\
|
|
39
39
|
|bvsala-adapter:${n??"none"}`;return {model:t.model,messages:t.messages,...t.tools.length>0?{tools:t.tools}:{},...typeof t.temperature=="number"?{temperature:t.temperature}:{},...typeof t.seed=="number"?
|
|
40
|
-
{seed:t.seed}:{},context:{...t.context??{},authorizationScope:r},savings:Pe(e.savings,t.savings,{...t.restricciones,...n===null?{sinReutilizar:true}:{}})}}function
|
|
41
|
-
{}}}function
|
|
42
|
-
esquema:t.jsonSchema,legible:true};if(f(t)&&(t.type==="object"||f(t.properties)))return {esquema:t,legible:true}}return {legible:false}}function
|
|
43
|
-
map(String)):void 0;for(let[i,o]of Object.entries(f(e.tools)?e.tools:{})){if(r&&!r.has(i)||!f(o))continue;let{esquema:l,legible:c}=
|
|
44
|
-
...typeof o.description=="string"?{descripcion:o.description}:{},...d?{parametros:l}:{},delProveedor:o.type==="provider-defined"||o.type==="provider"});}let
|
|
45
|
-
|
|
46
|
-
providerOptions,modelSettings:e.modelSettings,...
|
|
47
|
-
"headers"||(t[n]=r);return t.headers=
|
|
48
|
-
new Error("[bvsala] the model call failed")};case "text-delta":typeof p.text=="string"&&(n+=p.text);break;case "tool-call":p.providerExecuted===true?
|
|
40
|
+
{seed:t.seed}:{},context:{...t.context??{},authorizationScope:r},savings:Pe(e.savings,t.savings,{...t.restricciones,...n===null?{sinReutilizar:true}:{}})}}function se(e,t){if(!(!e&&!t))return {...e??{},...t??
|
|
41
|
+
{}}}function ie(e){if(!e||typeof e!="object")return {};let t=e,n={};return t.context&&typeof t.context=="object"&&(n.context=t.context),t.savings&&typeof t.savings=="object"&&(n.savings=t.savings),n}function f(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var le="bivelio.paso",k="bivelio.pendiente";function ue(e){for(let t of [e.parameters,e.inputSchema]){if(f(t)&&f(t.jsonSchema))return {
|
|
42
|
+
esquema:t.jsonSchema,legible:true};if(f(t)&&(t.type==="object"||f(t.properties)))return {esquema:t,legible:true}}return {legible:false}}function Le(e){let t=[],n=false,r=Array.isArray(e.activeTools)?new Set(e.activeTools.
|
|
43
|
+
map(String)):void 0;for(let[i,o]of Object.entries(f(e.tools)?e.tools:{})){if(r&&!r.has(i)||!f(o))continue;let{esquema:l,legible:c}=ue(o),d=c;try{JSON.stringify(l);}catch{d=false;}d||(n=true),t.push({nombre:i,
|
|
44
|
+
...typeof o.description=="string"?{descripcion:o.description}:{},...d?{parametros:l}:{},delProveedor:o.type==="provider-defined"||o.type==="provider"});}let s=f(e.structuredOutput)?e.structuredOutput:void 0,
|
|
45
|
+
a;if(s){let{esquema:i}=ue({inputSchema:s.schema});a=i??true;}return {paso:typeof e.stepNumber=="number"?e.stepNumber:-1,herramientas:t,esquemaIlegible:n,toolChoice:e.toolChoice,activeTools:e.activeTools,providerOptions:e.
|
|
46
|
+
providerOptions,modelSettings:e.modelSettings,...a!==void 0?{salidaEstructurada:a}:{}}}function Me(e){if(!f(e))return;let t={};for(let[n,r]of Object.entries(e))n==="maxRetries"||n==="abortSignal"||n===
|
|
47
|
+
"headers"||(t[n]=r);return t.headers=X(e.headers),t}function Ee(e,t){let n="",r=[],s=true,a;for(let u of e){if(!f(u))continue;let p=f(u.payload)?u.payload:{};switch(u.type){case "error":return {error:p.error??
|
|
48
|
+
new Error("[bvsala] the model call failed")};case "text-delta":typeof p.text=="string"&&(n+=p.text);break;case "tool-call":p.providerExecuted===true?s=false:r.push({...typeof p.toolCallId=="string"?{id:p.toolCallId}:
|
|
49
49
|
{},name:String(p.toolName??""),arguments:h(p.args??p.input)});break;case "reasoning-start":case "reasoning-delta":case "reasoning-end":f(p.providerMetadata)&&Object.keys(x(p.providerMetadata)).length>0&&
|
|
50
|
-
(
|
|
51
|
-
end":case "raw":break;default:
|
|
52
|
-
text:n,...r.length>0?{toolCalls:r}:{},...l?{finishReason:l}:{},usage:
|
|
53
|
-
|
|
54
|
-
timestamp:new Date}}];e.text!==""&&(
|
|
55
|
-
[]).forEach((i,o)=>{let l={};try{l=JSON.parse(i.arguments||"{}");}catch{l={};}
|
|
56
|
-
return
|
|
57
|
-
{},messages:{all:[],user:[],nonUser:[]}}}),
|
|
50
|
+
(s=false);break;case "finish":a=p;break;case "step-start":case "response-metadata":case "text-start":case "text-end":case "tool-call-input-streaming-start":case "tool-call-delta":case "tool-call-input-streaming-\
|
|
51
|
+
end":case "raw":break;default:s=false;}}let i=f(a?.stepResult)?a.stepResult:{},o=typeof i.reason=="string"?i.reason:void 0,l=ee(o),c=f(a?.output)?a.output:{},d=f(c.usage)?c.usage:void 0,g=Y(d?.raw,t);return {
|
|
52
|
+
text:n,...r.length>0?{toolCalls:r}:{},...l?{finishReason:l}:{},usage:a?g:{inputTokens:0,outputTokens:0,complete:false},...s&&o==="stop"?{}:{replayable:false}}}function Ie(e,t,n){let r=`bvsala-${e.requestId}`,
|
|
53
|
+
s=[{type:"step-start",payload:{request:{},warnings:[],...typeof n=="string"?{messageId:n}:{},startedAt:Date.now()}},{type:"response-metadata",payload:{type:"response-metadata",id:r,modelId:e.report.model,
|
|
54
|
+
timestamp:new Date}}];e.text!==""&&(s.push({type:"text-start",payload:{id:r}}),s.push({type:"text-delta",payload:{id:r,text:e.text}}),s.push({type:"text-end",payload:{type:"text-end",id:r}})),(e.toolCalls??
|
|
55
|
+
[]).forEach((i,o)=>{let l={};try{l=JSON.parse(i.arguments||"{}");}catch{l={};}s.push({type:"tool-call",payload:{toolCallId:i.id??`${r}-${o}`,toolName:i.name,args:l}});});let a=(e.toolCalls?.length??0)>0;
|
|
56
|
+
return s.push({type:"finish",payload:{type:"finish",stepResult:{reason:a?"tool-calls":"stop"},output:{usage:{inputTokens:0,outputTokens:0,totalTokens:0}},metadata:t?{providerMetadata:{bivelio:{savingsReport:t}}}:
|
|
57
|
+
{},messages:{all:[],user:[],nonUser:[]}}}),s}var qe=900*1e3;function et(e){let t=H("mastra",e),n=Math.max(1,e.providerTimeoutMs??qe),r=new Map,s=0,a=(o,l)=>{let c=r.get(o);c&&(r.delete(o),clearTimeout(
|
|
58
58
|
c.plazo),c.signal&&c.alAbortar&&c.signal.removeEventListener("abort",c.alAbortar),c.llamada.errorDelMarco={error:l},c.rechazar(l));};return {id:"bivelio-savings",name:"BiVelio savings",processInputStep(o){
|
|
59
|
-
let l=o.state;l[
|
|
60
|
-
-1,g=l[
|
|
61
|
-
parametros:m.parametros,delProveedor:m.delProveedor})),b=f(u?.modelSettings)?u.modelSettings:{},
|
|
62
|
-
type==="tool"||A.type==="required"),R=await
|
|
63
|
-
e.context?.({requestContext:o.requestContext}),
|
|
64
|
-
activeTools,providerOptions:x(u?.providerOptions),ajustes:
|
|
65
|
-
void 0||u.esquemaIlegible}}),I,
|
|
66
|
-
R,j);if(D.catch(()=>{}),await Promise.race([
|
|
67
|
-
now().toString(36)}`,z=setTimeout(()=>
|
|
68
|
-
|
|
69
|
-
"abort",w.alAbortar,{once:true})),r.set(
|
|
70
|
-
c),clearTimeout(d.plazo),d.signal&&d.alAbortar&&d.signal.removeEventListener("abort",d.alAbortar);let g=f(o.model)?o.model:{},u=
|
|
71
|
-
errorDelMarco={error:u.error},d.rechazar(u.error);return}d.llamada.completada=true,d.resolver(u);try{let p=await d.resultado,
|
|
72
|
-
data-bivelio-savings-report",data:
|
|
73
|
-
and without a usage record.");}},processAPIError(o){let l=o.state,c=l[k];typeof c=="string"&&(delete l[k],
|
|
74
|
-
|
|
59
|
+
let l=o.state;l[le]=Le(o),typeof o.messageId=="string"&&(l["bivelio.messageId"]=o.messageId);},async processLLMRequest(o){let l=o.state,c=f(o.model)?o.model:{},d=typeof o.stepNumber=="number"?o.stepNumber:
|
|
60
|
+
-1,g=l[le],u=g&&g.paso===d?g:void 0,p=e.modelId?e.modelId({provider:String(c.provider??""),modelId:String(c.modelId??"")}):te(c),O=(u?.herramientas??[]).map(m=>oe(e,{nombre:m.nombre,descripcion:m.descripcion,
|
|
61
|
+
parametros:m.parametros,delProveedor:m.delProveedor})),b=f(u?.modelSettings)?u.modelSettings:{},M=ie(f(u?.providerOptions)?u.providerOptions.bivelio:void 0),A=u?.toolChoice,ce=A==="required"||f(A)&&(A.
|
|
62
|
+
type==="tool"||A.type==="required"),R=await ae(e,{model:p,messages:Z(o.prompt),tools:O,temperature:typeof b.temperature=="number"?b.temperature:void 0,seed:typeof b.seed=="number"?b.seed:void 0,context:se(
|
|
63
|
+
e.context?.({requestContext:o.requestContext}),M.context),savings:{...M.savings,singleflight:false},proyeccion:{modelo:p,prompt:Q(o.prompt),herramientas:u?.herramientas??null,toolChoice:u?.toolChoice,activeTools:u?.
|
|
64
|
+
activeTools,providerOptions:x(u?.providerOptions),ajustes:Me(u?.modelSettings),salidaEstructurada:u?.salidaEstructurada},restricciones:{sinResolvers:u===void 0||ce||u.salidaEstructurada!==void 0,sinReutilizar:u===
|
|
65
|
+
void 0||u.esquemaIlegible}}),E,I,de=new Promise((m,L)=>{E=m,I=L;}),q,pe=new Promise(m=>{q=()=>m("invocada");}),j=J({model:R.model,messages:R.messages,...R.tools?{tools:R.tools}:{}},()=>(q(),de)),D=t.ejecutar(
|
|
66
|
+
R,j);if(D.catch(()=>{}),await Promise.race([pe,D.then(()=>"resuelta")])==="resuelta"){let m=await D,L=t.informe(m.report);return {response:{chunks:Ie(m,L,l["bivelio.messageId"])}}}let C=`bvsala-${++s}-${Date.
|
|
67
|
+
now().toString(36)}`,z=setTimeout(()=>a(C,new Error("[bvsala] Mastra never reported this model call back; nothing was recorded.")),n);z.unref?.();let w={resolver:E,rechazar:I,llamada:j,resultado:D,plazo:z},
|
|
68
|
+
P=o.abortSignal instanceof AbortSignal?o.abortSignal:void 0;P&&(w.signal=P,w.alAbortar=()=>a(C,new Error("[bvsala] the model call was aborted; nothing was recorded.")),P.aborted?w.alAbortar():P.addEventListener(
|
|
69
|
+
"abort",w.alAbortar,{once:true})),r.set(C,w),l[k]=C;},async processLLMResponse(o){if(o.fromCache===true)return;let l=o.state,c=l[k];if(delete l[k],typeof c!="string")return;let d=r.get(c);if(!d)return;r.delete(
|
|
70
|
+
c),clearTimeout(d.plazo),d.signal&&d.alAbortar&&d.signal.removeEventListener("abort",d.alAbortar);let g=f(o.model)?o.model:{},u=Ee(Array.isArray(o.chunks)?o.chunks:[],ne(g));if("error"in u){d.llamada.
|
|
71
|
+
errorDelMarco={error:u.error},d.rechazar(u.error);return}d.llamada.completada=true,d.resolver(u);try{let p=await d.resultado,O=t.informe(p.report);e.emitReportPart===!0&&await o.writer?.custom?.({type:"\
|
|
72
|
+
data-bivelio-savings-report",data:O});}catch{t.avisar("sin-informe","[bvsala] the model answered, but the savings layer failed while accounting for it; the answer is unchanged, without a savings report\
|
|
73
|
+
and without a usage record.");}},processAPIError(o){let l=o.state,c=l[k];typeof c=="string"&&(delete l[k],a(c,o.error??new Error("[bvsala] the model call failed")));},close(){for(let o of [...r.keys()])
|
|
74
|
+
a(o,new Error("[bvsala] the savings layer was closed; nothing was recorded."));t.close();}}}export{et as savingsProcessor};
|