@easbot/llm 0.3.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,73 @@
1
+ export{a as createOpenaiCompatible,b as openaiCompatible}from'./chunks/chunk-3BANRW36.mjs';import {b,c,a}from'./chunks/chunk-S4DPVKMV.mjs';import k from'zod';import rt from'os';import Ge,{isAbsolute,join}from'path';import Pt from'fuzzysort';import {mergeDeep,mapValues,sortBy,unique,pickBy,omit}from'remeda';import {NoSuchModelError,rerank,embed,embedMany,streamText}from'ai';import {Log,lazy,Fetch,NamedError,lazyAsync,fn,Auth,loadTextFile,iife,parseModelId,Token,PKG,Shell,Env}from'@easbot/utils';import vt,{readFile}from'fs/promises';import {existsSync}from'fs';import {STATUS_CODES}from'http';import {GRAPH_RELATION_TYPE_DEFINITIONS,GRAPH_ENTITY_TYPE_DEFINITIONS}from'@easbot/types';var Je=["openai","anthropic","google","deepseek","alibaba","alibaba-coding-plan","alibaba-token-plan-cn","minimax","minimax-cn","minimax-coding-plan","minimax-cn-coding-plan","nvidia","easbot-local","ollama"],De={ollama:{id:"ollama",name:"ollama",npm:"@easbot/ollama-sdk",env:["OLLAMA_API_KEY"],models:{"qwen3.5:0.8b":Te("qwen3.5:0.8b"),"qwen3:0.6b":Te("qwen3:0.6b"),"gemma3:1b":Te("gemma3:1b")}},"easbot-local":{id:"easbot-local",name:"easbot-local",npm:"@easbot/local-model-sdk",env:[],models:{"bge-base-zh-v1.5":Te("bge-base-zh-v1.5"),"rerank-proxy":Te("rerank-proxy")}}},Ut={openai:"OpenAI",anthropic:"Anthropic",google:"Google",deepseek:"DeepSeek",alibaba:"Alibaba Cloud","alibaba-coding-plan":"Alibaba Coding Plan","alibaba-token-plan-cn":"Alibaba Token Plan (CN)",minimax:"MiniMax","minimax-cn":"MiniMax (CN)","minimax-coding-plan":"MiniMax Coding Plan","minimax-cn-coding-plan":"MiniMax Coding Plan (CN)",nvidia:"NVIDIA"};function Te(e){return {id:e,name:e,release_date:"2026-07-01",attachment:false,reasoning:false,temperature:true,tool_call:false,limit:{context:2e5,output:8192},options:{}}}var bt=Log.create({service:"llm:interfaces"}),he;(w=>{function e(M){let x=process.env[M]?.toLowerCase();return x==="true"||x==="1"}function r(M,x){let j=process.env[M];if(j===void 0)return x;let h=Number(j);return Number.isNaN(h)?x:h}w.EASBOT_CONFIG=process.env.EASBOT_CONFIG,w.EASBOT_CONFIG_CONTENT=process.env.EASBOT_CONFIG_CONTENT,w.EASBOT_MODELS_FETCH=e("EASBOT_MODELS_FETCH"),w.EASBOT_MODELS_URL=process.env.EASBOT_MODELS_URL,w.EASBOT_MODELS_PATH=process.env.EASBOT_MODELS_PATH,w.EASBOT_OUTPUT_TOKEN_MAX=r("EASBOT_OUTPUT_TOKEN_MAX",32e3),w.EASBOT_ENABLE_EXPERIMENTAL_MODELS=e("EASBOT_ENABLE_EXPERIMENTAL_MODELS"),w.EASBOT_DEFAULT_MODEL=process.env.EASBOT_DEFAULT_MODEL;})(he||(he={}));var je;function He(e){je=e,e?bt.debug("adapter registry set",{hasConfig:!!e.config,hasInstance:!!e.instance,hasGlobal:!!e.global,hasInstallation:!!e.installation}):bt.debug("adapter registry cleared");}function zt(){return je}function Xe(){return je!==void 0}function $e(e,r){let d=je?.[e];if(!d)throw new Error(`[LLM] adapter '${e}' (${r}) not registered. Call setAdapterRegistry({ ${e}: ... }) before using LLM.`);return d}function Ye(){return $e("config","IConfigProvider")}function Ze(){return $e("instance","IInstanceProvider")}function Ie(){return $e("global","IGlobalPathProvider")}function Ne(){return $e("installation","IInstallationProvider")}function Kt(e){let r=process.env[e]?.toLowerCase();return r==="true"||r==="1"}function qt(e,r){let d=process.env[e];if(d===void 0)return r;let c=Number(d);return Number.isFinite(c)?c:r}function V(e){return process.env[e]}var we;(s=>{let e=Log.create({service:"models.dev"});function r(){return Ge.join(Ie().cache,"models.json")}s.Model=k.object({id:k.string(),name:k.string(),family:k.string().optional(),release_date:k.string(),attachment:k.boolean(),reasoning:k.boolean(),temperature:k.boolean(),tool_call:k.boolean(),interleaved:k.union([k.literal(true),k.object({field:k.enum(["reasoning_content","reasoning_details"])}).strict()]).optional(),cost:k.object({input:k.number(),output:k.number(),cache_read:k.number().optional(),cache_write:k.number().optional(),context_over_200k:k.object({input:k.number(),output:k.number(),cache_read:k.number().optional(),cache_write:k.number().optional()}).optional()}).optional(),limit:k.object({context:k.number(),input:k.number().optional(),output:k.number()}),modalities:k.object({input:k.array(k.enum(["text","audio","image","video","pdf"])),output:k.array(k.enum(["text","audio","image","video","pdf"]))}).optional(),experimental:k.boolean().optional(),status:k.enum(["alpha","beta","deprecated"]).optional(),options:k.record(k.string(),k.any()),headers:k.record(k.string(),k.string()).optional(),provider:k.object({npm:k.string()}).optional(),variants:k.record(k.string(),k.record(k.string(),k.any())).optional()}),s.Provider=k.object({api:k.string().optional(),name:k.string(),env:k.array(k.string()),id:k.string(),npm:k.string().optional(),models:k.record(k.string(),s.Model)});function E(){return he.EASBOT_MODELS_URL||"https://models.dev/api.json"}s.Data=lazy(async()=>{let l=he.EASBOT_MODELS_PATH??r(),u=await vt.readFile(l,"utf-8").then(x=>JSON.parse(x)).catch(()=>{});if(u)return P(u);let w=await import('./chunks/models-snapshot-3EXCDFMS.mjs').then(x=>x.snapshot).catch(()=>{});if(w)return P(w);if(!he.EASBOT_MODELS_FETCH)return P({});let M=await Fetch.get(E());return P(M.data??{})});function P(l){return Object.keys(De).length===0?l:mergeDeep(l,De)}async function _(){return await(0, s.Data)()}s.get=_;async function y(){try{let l=await Fetch.get(E(),{headers:{"User-Agent":`EasBot/${Ne().getVersion()}`},responseType:"text"});l.ok&&(await vt.writeFile(r(),l.data),s.Data.reset(),e.info("Models from models.dev refreshed successfully"));}catch(l){e.warn("Failed to refresh models from models.dev, using cached or snapshot data",{error:l instanceof Error?l.message:String(l),url:E()});}}s.refresh=y;})(we||(we={}));function Xt(){he.EASBOT_MODELS_FETCH&&we.refresh();}var xt=k.object({type:k.union([k.literal("oauth"),k.literal("api")]),label:k.string()}).meta({ref:"ProviderAuthMethod"}),Qe=we.Provider.partial().extend({whitelist:k.array(k.string()).optional(),blacklist:k.array(k.string()).optional(),models:k.record(k.string(),we.Model.partial().extend({variants:k.record(k.string(),k.object({disabled:k.boolean().optional().describe("Disable this variant for the model")}).catchall(k.any())).optional().describe("Variant-specific configuration")})).optional(),options:k.object({apiKey:k.string().optional(),baseURL:k.string().optional(),enterpriseUrl:k.string().optional().describe("GitHub Enterprise URL for copilot authentication"),setCacheKey:k.boolean().optional().describe("Enable promptCacheKey for this provider (default false)"),timeout:k.union([k.number().int().positive().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout."),k.literal(false).describe("Disable timeout for this provider entirely.")]).optional().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout.")}).catchall(k.any()).optional()}).strict().meta({ref:"ProviderConfig"}),Be=k.object({provider:k.record(k.string(),Qe).optional().describe("Custom provider configurations and model overrides"),disabled_providers:k.array(k.string()).optional().describe("Disable providers that are loaded automatically"),enabled_providers:k.array(k.string()).optional().describe("When set, ONLY these providers will be enabled. All other providers will be ignored"),model:k.string().optional().describe("Model to use in the format of provider/model, eg anthropic/claude-2"),small_model:k.string().optional().describe("Small model to use for tasks like title generation in the format of provider/model"),embedding_model:k.string().optional().describe("Embedding model, defaults to easbot-local/bge-base-zh-v1.5"),graph_model:k.string().optional().describe("Graph model for entity and relation extraction, defaults to easbot-local/qwen2.5-7b-instruct"),rerank_model:k.string().optional().describe("Rerank model for search result reranking, defaults to easbot-local/qwen2.5-7b-instruct")}).meta({ref:"LLMConfig"});var Ee=Log.create({service:"llm:config:loader"}),et=null;async function tt(e){try{if(!existsSync(e))return null;let r=await vt.readFile(e,"utf-8");r=r.replace(/\{env:([^}]+)\}/g,(P,_)=>{let y=process.env[_];return y===void 0?(Ee.debug("Environment variable not found",{varName:_,file:e}),""):y});let d=r,c=!1,E=!1,C=[];for(let P=0;P<r.length;P++){let _=r[P];if(E){C.push(_),E=!1;continue}if(_==="\\"){C.push(_),E=!0;continue}if(_==='"'){c=!c,C.push(_);continue}if(!c&&_==="/"&&r[P+1]==="/"){for(;P<r.length&&r[P]!==`
2
+ `&&r[P]!=="\r";)P++;continue}if(!c&&_==="/"&&r[P+1]==="*"){for(P+=2;P<r.length-1;){if(r[P]==="*"&&r[P+1]==="/"){P+=2;break}P++;}continue}C.push(_);}return d=C.join("").trim(),d?JSON.parse(d):null}catch(r){return Ee.warn("Failed to load JSON file",{file:e,error:r instanceof Error?r.message:String(r)}),null}}function tr(e){return e.reduce((r,d)=>d?mergeDeep(r,d):r,{})}function Ue(e){if(!e||typeof e!="object")return {};let r=e,d={};return "provider"in r&&(d.provider=r.provider),"disabled_providers"in r&&(d.disabled_providers=r.disabled_providers),"enabled_providers"in r&&(d.enabled_providers=r.enabled_providers),"model"in r&&(d.model=r.model),"small_model"in r&&(d.small_model=r.small_model),"embedding_model"in r&&(d.embedding_model=r.embedding_model),"graph_model"in r&&(d.graph_model=r.graph_model),"rerank_model"in r&&(d.rerank_model=r.rerank_model),d}async function rr(){let e=Ie().config,r=Ge.join(e,"easbot.json");Ee.debug("Loading global config",{filePath:r});let d=await tt(r);return Ue(d)}async function nr(e){let r=Ge.join(e,".easbot","easbot.json");Ee.debug("Loading project config",{filePath:r});let d=await tt(r);return Ue(d)}async function or(){let e=process.env.EASBOT_CONFIG;if(!e)return {};Ee.debug("Loading custom config",{filePath:e});try{if(!existsSync(e))throw new Error(`EASBOT_CONFIG file not found: ${e}`);let d=await tt(e);if(d===null)throw new Error(`EASBOT_CONFIG file is empty or invalid JSON: ${e}`);return Ue(d)}catch(r){throw Ee.error("EASBOT_CONFIG load failed",{filePath:e,error:r instanceof Error?r.message:String(r)}),r}}function ir(){let e=process.env.EASBOT_CONFIG_CONTENT;if(!e)return {};Ee.debug("Loading inline config",{length:e.length});try{let r=JSON.parse(e);return Ue(r)}catch(r){return Ee.warn("Failed to parse EASBOT_CONFIG_CONTENT",{error:r instanceof Error?r.message:String(r)}),{}}}async function ar(){var l=[];try{let e=b(l,Ee.time("state"));let r=[];let d=[];let c=await rr();Object.keys(c).length>0&&(d.push(c),r.push(Ge.join(Ie().config,"easbot.json")));let E=Ze().getDirectory();let C=await nr(E);Object.keys(C).length>0&&(d.push(C),r.push(Ge.join(E,"easbot.json")));let P=await or();Object.keys(P).length>0&&(d.push(P),process.env.EASBOT_CONFIG&&r.push(process.env.EASBOT_CONFIG));let _=ir();Object.keys(_).length>0&&d.push(_);let y=tr(d);let s=Be.safeParse(y);s.success?y=s.data:(Ee.warn("Config validation failed, using raw merged config",{issues:s.error.issues.slice(0,5)}),y=pickBy(y,x=>x!==void 0));et=y;return {config:y,directories:r}}catch(u){var w=u,M=true;}finally{c(l,w,M);}}var wt=dr(ar);async function sr(){return wt()}function dr(e){let r,d=0,c=()=>{if(r)return r;let E=d;return r=e().then(C=>E!==d?(r=void 0,c()):C),r};return c.reset=()=>{d++,r=void 0;},c}var le;(C=>{async function e(){if(Xe())try{return await Ye().getInfo()}catch(_){Ee.debug("IConfigProvider failed, falling back to local loader",{error:_ instanceof Error?_.message:String(_)});}let{config:P}=await sr();return P}C.get=e;async function r(P){return (await e()).provider?.[P]}C.provider=r;async function d(){let P=await e();return (P.enabled_providers??[]).filter(_=>!(P.disabled_providers??[]).includes(_))}C.enabledProviders=d;function c(){return et!==null}C.isLoaded=c;function E(){wt.reset(),et=null;}C.clearCache=E;})(le||(le={}));Log.create({service:"provider-transform"});function ur(e){if(e.startsWith("image/"))return "image";if(e.startsWith("audio/"))return "audio";if(e.startsWith("video/"))return "video";if(e==="application/pdf")return "pdf"}var xe;(b=>{function e(){return he.EASBOT_OUTPUT_TOKEN_MAX}b.getOutputTokenMax=e;function r(t){switch(t){case "@ai-sdk/github-copilot":return "copilot";case "@ai-sdk/openai":case "@ai-sdk/azure":return "openai";case "@ai-sdk/amazon-bedrock":return "bedrock";case "@ai-sdk/anthropic":case "@ai-sdk/google-vertex/anthropic":return "anthropic";case "@ai-sdk/google-vertex":case "@ai-sdk/google":return "google";case "@ai-sdk/gateway":return "gateway";case "@openrouter/ai-sdk-provider":return "openrouter";case "@easbot/ollama-sdk":return "ollama";case "@easbot/local-model-sdk":return "easbot-local"}}function d(t,i,m){if(i.api.npm==="@ai-sdk/anthropic"&&(t=t.map(g=>{if(typeof g.content=="string")return g.content===""?void 0:g;if(!Array.isArray(g.content))return g;let a=g.content.filter(v=>v.type==="text"||v.type==="reasoning"?v.text!=="":true);if(a.length!==0)return {...g,content:a}}).filter(g=>g!==void 0)),i.api.id.includes("claude"))return t.map(g=>((g.role==="assistant"||g.role==="tool")&&Array.isArray(g.content)&&(g.content=g.content.map(a=>(a.type==="tool-call"||a.type==="tool-result")&&"toolCallId"in a?{...a,toolCallId:a.toolCallId.replace(/[^a-zA-Z0-9_-]/g,"_")}:a)),g));if(i.providerId==="mistral"||i.api.id.toLowerCase().includes("mistral")||i.api.id.toLocaleLowerCase().includes("devstral")){let g=[];for(let a=0;a<t.length;a++){let v=t[a];if(!v)continue;let T=t[a+1];(v.role==="assistant"||v.role==="tool")&&Array.isArray(v.content)&&(v.content=v.content.map(U=>{if((U.type==="tool-call"||U.type==="tool-result")&&"toolCallId"in U){let W=U.toolCallId.replace(/[^a-zA-Z0-9]/g,"").substring(0,9).padEnd(9,"0");return {...U,toolCallId:W}}return U})),g.push(v),v.role==="tool"&&T?.role==="user"&&g.push({role:"assistant",content:[{type:"text",text:"Done."}]});}return g}if(typeof i.capabilities.interleaved=="object"&&i.capabilities.interleaved.field){let g=i.capabilities.interleaved.field;return t.map(a=>{if(a.role==="assistant"&&Array.isArray(a.content)){let T=a.content.filter(W=>W.type==="reasoning").map(W=>W.text).join(""),U=a.content.filter(W=>W.type!=="reasoning");return T?{...a,content:U,providerOptions:{...a.providerOptions,openaiCompatible:{...a.providerOptions?.openaiCompatible,[g]:T}}}:{...a,content:U}}return a})}return t}function c(t,i){let m=t.filter(v=>v.role==="system").slice(0,2),g=t.filter(v=>v.role!=="system").slice(-2),a={anthropic:{cacheControl:{type:"ephemeral"}},openrouter:{cacheControl:{type:"ephemeral"}},bedrock:{cachePoint:{type:"default"}},openaiCompatible:{cache_control:{type:"ephemeral"}},copilot:{copilot_cache_control:{type:"ephemeral"}}};for(let v of unique([...m,...g])){if(!(i==="anthropic"||i.includes("bedrock"))&&Array.isArray(v.content)&&v.content.length>0){let W=v.content[v.content.length-1];if(W&&typeof W=="object"){W.providerOptions=mergeDeep(W.providerOptions??{},a);continue}}v.providerOptions=mergeDeep(v.providerOptions??{},a);}return t}function E(t,i){return t.map(m=>{if(m.role!=="user"||!Array.isArray(m.content))return m;let g=m.content.map(a=>{if(a.type!=="file"&&a.type!=="image")return a;if(a.type==="image"){let oe=a.image.toString();if(oe.startsWith("data:")){let ge=oe.match(/^data:([^;]+);base64,(.*)$/);if(ge&&(!ge[2]||ge[2].length===0))return {type:"text",text:"ERROR: Image file is empty or corrupted. Please provide a valid image."}}}let v=a.type==="image"?a.image?.toString()?.split(";")?.[0]?.replace("data:",""):a.mediaType,T=a.type==="file"?a.filename:void 0,U=ur(v??"");return !U||i.capabilities.input[U]?a:{type:"text",text:`ERROR: Cannot read ${T?`"${T}"`:U} (this model does not support ${U} input). Inform the user.`}});return {...m,content:g}})}function C(t,i,m){t=E(t,i),t=d(t,i),(i.providerId==="anthropic"||i.api.id.includes("anthropic")||i.api.id.includes("claude")||i.id.includes("anthropic")||i.id.includes("claude")||i.api.npm==="@ai-sdk/anthropic")&&(t=c(t,i.providerId));let g=r(i.api.npm);if(g&&g!==i.providerId&&i.api.npm!=="@ai-sdk/azure"){let a=v=>{if(!v||!(i.providerId in v))return v;let T={...v};return T[g]=T[i.providerId],delete T[i.providerId],T};t=t.map(v=>Array.isArray(v.content)?{...v,providerOptions:a(v.providerOptions),content:v.content.map(T=>({...T,providerOptions:a(T.providerOptions)}))}:{...v,providerOptions:a(v.providerOptions)});}return t}b.message=C;function P(t){let i=t.id.toLowerCase();if(i.includes("qwen"))return .55;if(!i.includes("claude")){if(i.includes("gemini")||i.includes("glm-4.6")||i.includes("glm-4.7")||i.includes("minimax-m2"))return 1;if(i.includes("kimi-k2"))return i.includes("thinking")||i.includes("k2.")||i.includes("k2p")?1:.6}}b.temperature=P;function _(t){let i=t.id.toLowerCase();if(i.includes("qwen"))return 1;if(i.includes("minimax-m2")||i.includes("kimi-k2.5")||i.includes("kimi-k2p5")||i.includes("gemini"))return .95}b.topP=_;function y(t){let i=t.id.toLowerCase();if(i.includes("minimax-m2"))return i.includes("m2.1")?40:20;if(i.includes("gemini"))return 64}b.topK=y;let s=["low","medium","high"],l=["none","minimal",...s,"xhigh"];function u(t){if(!t.capabilities.reasoning)return {};let i=t.id.toLowerCase();if(i.includes("deepseek")||i.includes("minimax")||i.includes("glm")||i.includes("mistral")||i.includes("kimi")||i.includes("k2p5"))return {};if(i.includes("grok")&&i.includes("grok-3-mini"))return t.api.npm==="@openrouter/ai-sdk-provider"?{low:{reasoning:{effort:"low"}},high:{reasoning:{effort:"high"}}}:{low:{reasoningEffort:"low"},high:{reasoningEffort:"high"}};if(i.includes("grok"))return {};switch(t.api.npm){case "@openrouter/ai-sdk-provider":return !t.id.includes("gpt")&&!t.id.includes("gemini-3")?{}:Object.fromEntries(l.map(m=>[m,{reasoning:{effort:m}}]));case "@ai-sdk/gateway":return Object.fromEntries(l.map(m=>[m,{reasoningEffort:m}]));case "@ai-sdk/github-copilot":{if(t.id.includes("gemini"))return {};if(t.id.includes("claude"))return {thinking:{thinking_budget:4e3}};let m=iife(()=>i.includes("5.1-codex-max")||i.includes("5.2")||i.includes("5.3")?[...s,"xhigh"]:s);return Object.fromEntries(m.map(g=>[g,{reasoningEffort:g,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}case "@ai-sdk/cerebras":case "@ai-sdk/togetherai":case "@ai-sdk/xai":case "@ai-sdk/deepinfra":case "@ai-sdk/openai-compatible":return Object.fromEntries(s.map(m=>[m,{reasoningEffort:m}]));case "@ai-sdk/azure":{if(i==="o1-mini")return {};let m=["low","medium","high"];return (i.includes("gpt-5-")||i==="gpt-5")&&m.unshift("minimal"),Object.fromEntries(m.map(g=>[g,{reasoningEffort:g,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}case "@ai-sdk/openai":{if(i==="gpt-5-pro")return {};let m=iife(()=>{if(i.includes("codex"))return i.includes("5.2")||i.includes("5.3")?[...s,"xhigh"]:s;let g=[...s];return (i.includes("gpt-5-")||i==="gpt-5")&&g.unshift("minimal"),t.release_date>="2025-11-13"&&g.unshift("none"),t.release_date>="2025-12-04"&&g.push("xhigh"),g});return Object.fromEntries(m.map(g=>[g,{reasoningEffort:g,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}case "@ai-sdk/anthropic":case "@ai-sdk/google-vertex/anthropic":return {high:{thinking:{type:"enabled",budgetTokens:Math.min(16e3,Math.floor(t.limit.output/2-1))}},max:{thinking:{type:"enabled",budgetTokens:Math.min(31999,t.limit.output-1)}}};case "@ai-sdk/amazon-bedrock":return t.api.id.includes("anthropic")?{high:{reasoningConfig:{type:"enabled",budgetTokens:16e3}},max:{reasoningConfig:{type:"enabled",budgetTokens:31999}}}:Object.fromEntries(s.map(m=>[m,{reasoningConfig:{type:"enabled",maxReasoningEffort:m}}]));case "@ai-sdk/google-vertex":case "@ai-sdk/google":return i.includes("2.5")?{high:{thinkingConfig:{includeThoughts:true,thinkingBudget:16e3}},max:{thinkingConfig:{includeThoughts:true,thinkingBudget:24576}}}:Object.fromEntries(["low","high"].map(m=>[m,{includeThoughts:true,thinkingLevel:m}]));case "@ai-sdk/mistral":return {};case "@ai-sdk/cohere":return {};case "@ai-sdk/groq":{let m=["none",...s];return Object.fromEntries(m.map(g=>[g,{includeThoughts:true,thinkingLevel:g}]))}case "@ai-sdk/perplexity":return {};case "@mymediset/sap-ai-provider":case "@jerome-benoit/sap-ai-provider-v2":return t.api.id.includes("anthropic")?{high:{thinking:{type:"enabled",budgetTokens:16e3}},max:{thinking:{type:"enabled",budgetTokens:31999}}}:Object.fromEntries(s.map(m=>[m,{reasoningEffort:m}]))}return {}}b.variants=u;function w(t){let i={};(t.model.providerId==="openai"||t.model.api.npm==="@ai-sdk/openai"||t.model.api.npm==="@ai-sdk/github-copilot")&&(i.store=false),t.model.api.npm==="@openrouter/ai-sdk-provider"&&(i.usage={include:true},t.model.api.id.includes("gemini-3")&&(i.reasoning={effort:"high"})),(t.model.providerId==="baseten"||t.model.providerId==="easbot"&&["kimi-k2-thinking","glm-4.6"].includes(t.model.api.id))&&(i.chat_template_args={enable_thinking:true}),["zai","zhipuai"].includes(t.model.providerId)&&t.model.api.npm==="@ai-sdk/openai-compatible"&&(i.thinking={type:"enabled",clear_thinking:false}),(t.model.providerId==="openai"||t.providerOptions?.setCacheKey)&&(i.promptCacheKey=t.sessionId),(t.model.api.npm==="@ai-sdk/google"||t.model.api.npm==="@ai-sdk/google-vertex")&&(i.thinkingConfig={includeThoughts:true},t.model.api.id.includes("gemini-3")&&(i.thinkingConfig.thinkingLevel="high"));let m=t.model.api.id.toLowerCase();return (t.model.api.npm==="@ai-sdk/anthropic"||t.model.api.npm==="@ai-sdk/google-vertex/anthropic")&&(m.includes("k2p5")||m.includes("kimi-k2.5")||m.includes("kimi-k2p5"))&&(i.thinking={type:"enabled",budgetTokens:Math.min(16e3,Math.floor(t.model.limit.output/2-1))}),t.model.providerId==="alibaba-cn"&&t.model.capabilities.reasoning&&t.model.api.npm==="@ai-sdk/openai-compatible"&&!m.includes("kimi-k2-thinking")&&(i.enable_thinking=true),t.model.api.id.includes("gpt-5")&&!t.model.api.id.includes("gpt-5-chat")&&(t.model.api.id.includes("gpt-5-pro")||(i.reasoningEffort="medium",i.reasoningSummary="auto"),t.model.api.id.includes("gpt-5.")&&!t.model.api.id.includes("codex")&&!t.model.api.id.includes("-chat")&&t.model.providerId!=="azure"&&(i.textVerbosity="low"),t.model.providerId.startsWith("easbot")&&(i.promptCacheKey=t.sessionId,i.include=["reasoning.encrypted_content"],i.reasoningSummary="auto")),t.model.providerId==="venice"&&(i.promptCacheKey=t.sessionId),i}b.options=w;function M(t){return t.providerId==="openai"||t.api.npm==="@ai-sdk/openai"||t.api.npm==="@ai-sdk/github-copilot"?t.api.id.includes("gpt-5")?t.api.id.includes("5.")?{store:false,reasoningEffort:"low"}:{store:false,reasoningEffort:"minimal"}:{store:false}:t.providerId==="google"?t.api.id.includes("gemini-3")?{thinkingConfig:{thinkingLevel:"minimal"}}:{thinkingConfig:{thinkingBudget:0}}:t.providerId==="openrouter"?t.api.id.includes("google")?{reasoning:{enabled:false}}:{reasoningEffort:"minimal"}:{}}b.smallOptions=M;let x={amazon:"bedrock"};function j(t,i){if(t.api.npm==="@ai-sdk/gateway"){let g=t.api.id.indexOf("/"),a=g>0?t.api.id.slice(0,g):void 0,v=a?x[a]??a:void 0,T=i.gateway,U=Object.fromEntries(Object.entries(i).filter(([ge])=>ge!=="gateway")),W=Object.keys(U).length>0,oe={};return T!==void 0&&(oe.gateway=T),W&&(v?oe[v]=U:T&&typeof T=="object"&&!Array.isArray(T)?oe.gateway={...T,...U}:oe.gateway=U),oe}return {[r(t.api.npm)??t.providerId]:i}}b.providerOptions=j;function h(t){let i=e(),m=t.limit.output;return typeof m!="number"||m<=0?i:Math.min(m,i)}b.maxOutputTokens=h;function p(t,i){if(t.providerId==="google"||t.api.id.includes("gemini")){let m=g=>{if(g===null||typeof g!="object")return g;if(Array.isArray(g))return g.map(m);let a={};for(let[v,T]of Object.entries(g))v==="enum"&&Array.isArray(T)?(a[v]=T.map(U=>String(U)),(a.type==="integer"||a.type==="number")&&(a.type="string")):typeof T=="object"&&T!==null?a[v]=m(T):a[v]=T;return a.type==="object"&&a.properties&&Array.isArray(a.required)&&(a.required=a.required.filter(v=>v in a.properties)),a.type==="array"&&(a.items==null&&(a.items={}),typeof a.items=="object"&&!Array.isArray(a.items)&&!a.items.type&&(a.items.type="string")),a.type&&a.type!=="object"&&(delete a.properties,delete a.required),a};i=m(i);}return i}b.schema=p;})(xe||(xe={}));function br(e){let r,d=0,c=()=>{if(r)return r;let E=d;return r=e().then(C=>E!==d?(r=void 0,c()):C),r};return c.reset=()=>{d++,r=void 0;},c}var vr={"@ai-sdk/amazon-bedrock":()=>import('@ai-sdk/amazon-bedrock').then(e=>e.createAmazonBedrock),"@ai-sdk/anthropic":()=>import('@ai-sdk/anthropic').then(e=>e.createAnthropic),"@ai-sdk/azure":()=>import('@ai-sdk/azure').then(e=>e.createAzure),"@ai-sdk/google":()=>import('@ai-sdk/google').then(e=>e.createGoogleGenerativeAI),"@ai-sdk/google-vertex":()=>import('@ai-sdk/google-vertex').then(e=>e.createVertex),"@ai-sdk/google-vertex/anthropic":()=>import('@ai-sdk/google-vertex/anthropic').then(e=>e.createVertexAnthropic),"@ai-sdk/openai":()=>import('@ai-sdk/openai').then(e=>e.createOpenAI),"@ai-sdk/openai-compatible":()=>import('@ai-sdk/openai-compatible').then(e=>e.createOpenAICompatible),"@openrouter/ai-sdk-provider":()=>import('@openrouter/ai-sdk-provider').then(e=>e.createOpenRouter),"@ai-sdk/xai":()=>import('@ai-sdk/xai').then(e=>e.createXai),"@ai-sdk/mistral":()=>import('@ai-sdk/mistral').then(e=>e.createMistral),"@ai-sdk/groq":()=>import('@ai-sdk/groq').then(e=>e.createGroq),"@ai-sdk/deepinfra":()=>import('@ai-sdk/deepinfra').then(e=>e.createDeepInfra),"@ai-sdk/cerebras":()=>import('@ai-sdk/cerebras').then(e=>e.createCerebras),"@ai-sdk/cohere":()=>import('@ai-sdk/cohere').then(e=>e.createCohere),"@ai-sdk/gateway":()=>import('@ai-sdk/gateway').then(e=>e.createGateway),"@ai-sdk/togetherai":()=>import('@ai-sdk/togetherai').then(e=>e.createTogetherAI),"@ai-sdk/perplexity":()=>import('@ai-sdk/perplexity').then(e=>e.createPerplexity),"@ai-sdk/vercel":()=>import('@ai-sdk/vercel').then(e=>e.createVercel),"@ai-sdk/alibaba":()=>import('@ai-sdk/alibaba').then(e=>e.createAlibaba),"@ai-sdk/deepseek":()=>import('@ai-sdk/deepseek').then(e=>e.createDeepSeek),"gitlab-ai-provider":()=>import('gitlab-ai-provider').then(e=>e.createGitLab),"@ai-sdk/github-copilot":()=>import('./chunks/copilot-TJATIV2S.mjs').then(e=>e.createOpenaiCompatible),"@easbot/ollama-sdk":()=>import('@easbot/ollama-sdk').then(e=>e.createOllama),"@easbot/local-model-sdk":()=>import('@easbot/local-model-sdk').then(e=>e.createLocal)},H;(te=>{let e=[];function r(n){let o=e.findIndex(f=>f.providerId===n.providerId);o>=0?e[o]=n:e.push(n);}te.registerPluginAuthLoader=r;function d(){e.length=0;}te.clearPluginAuthLoaders=d,te.DEFAULT_CONTEXT_LIMIT=2e5,te.DEFAULT_INPUT_LIMIT_RATIO=.9,te.DEFAULT_OUTPUT_LIMIT=8192;function P(n=te.DEFAULT_CONTEXT_LIMIT){return Math.floor(n*te.DEFAULT_INPUT_LIMIT_RATIO)}te.getDefaultInputLimit=P;let _=Log.create({service:"provider"});function y(n){let o=/^gpt-(\d+)/.exec(n);return o?Number(o[1])>=5:false}function s(n){return y(n)&&!n.startsWith("gpt-5-mini")}let l={async anthropic(){return {autoload:false,options:{headers:{"anthropic-beta":"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14"}}}},async opencode(n){let o=await(async()=>!!(n.env.some(I=>V(I))||await Auth.get(n.id)||(await le.provider("opencode"))?.options?.apiKey))();if(!o)for(let[f,I]of Object.entries(n.models))I.cost.input!==0&&delete n.models[f];return {autoload:Object.keys(n.models).length>0,options:o?{}:{apiKey:"public"}}},openai:async()=>{let n=V("OPENAI_BASE_URL");return {autoload:false,async getModel(o,f,I){return o.responses(f)},options:n?{baseURL:n}:{}}},"github-copilot":async()=>({autoload:false,async getModel(n,o,f){return n.responses===void 0&&n.chat===void 0?n.languageModel(o):s(o)?n.responses(o):n.chat(o)},options:{}}),"github-copilot-enterprise":async()=>({autoload:false,async getModel(n,o,f){return n.responses===void 0&&n.chat===void 0?n.languageModel(o):s(o)?n.responses(o):n.chat(o)},options:{}}),azure:async()=>({autoload:false,async getModel(n,o,f){return f?.useCompletionUrls?n.chat(o):n.responses(o)},options:{}}),"azure-cognitive-services":async()=>{let n=V("AZURE_COGNITIVE_SERVICES_RESOURCE_NAME");return {autoload:false,async getModel(o,f,I){return I?.useCompletionUrls?o.chat(f):o.responses(f)},options:{baseURL:n?`https://${n}.cognitiveservices.azure.com/openai`:void 0}}},"amazon-bedrock":async()=>{let n=await le.provider("amazon-bedrock"),o=await Auth.get("amazon-bedrock"),f=n?.options?.region,I=V("AWS_REGION"),S=f??I??"us-east-1",O=n?.options?.profile,B=V("AWS_PROFILE"),q=O??B,R=V("AWS_ACCESS_KEY_ID"),J=iife(()=>{let ee=process.env.AWS_BEARER_TOKEN_BEDROCK;if(ee)return ee;if(o?.type==="api")return process.env.AWS_BEARER_TOKEN_BEDROCK=o.key,o.key}),ie=V("AWS_WEB_IDENTITY_TOKEN_FILE"),me=!!(process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI||process.env.AWS_CONTAINER_CREDENTIALS_FULL_URI);if(!q&&!R&&!J&&!ie&&!me)return {autoload:false};let re={region:S};if(!J){let ee=await Shell.install("@aws-sdk/credential-providers"),{pathToFileURL:Y}=await import('url'),ke=Ge.join(ee,"dist-cjs","index.js"),{fromNodeProviderChain:Oe}=await import(Y(ke).href),ve=q?{profile:q}:{};re.credentialProvider=Oe(ve);}let pe=n?.options?.endpoint??n?.options?.baseURL;return pe&&(re.baseURL=pe),{autoload:true,options:re,async getModel(ee,Y,ke){if(["global.","us.","eu.","jp.","apac.","au."].some(L=>Y.startsWith(L)))return ee.languageModel(Y);let ve=ke?.region??S,ne=ve.split("-")[0];switch(ne){case "us":{let L=["nova-micro","nova-lite","nova-pro","nova-premier","nova-2","claude","deepseek"].some(G=>Y.includes(G)),N=ve.startsWith("us-gov");L&&!N&&(Y=`${ne}.${Y}`);break}case "eu":{let L=["eu-west-1","eu-west-2","eu-west-3","eu-north-1","eu-central-1","eu-south-1","eu-south-2"].some(G=>ve.includes(G)),N=["claude","nova-lite","nova-micro","llama3","pixtral"].some(G=>Y.includes(G));L&&N&&(Y=`${ne}.${Y}`);break}case "ap":{let L=["ap-southeast-2","ap-southeast-4"].includes(ve),N=ve==="ap-northeast-1";L&&["anthropic.claude-sonnet-4-5","anthropic.claude-haiku"].some(G=>Y.includes(G))?(ne="au",Y=`${ne}.${Y}`):N?["claude","nova-lite","nova-micro","nova-pro"].some(K=>Y.includes(K))&&(ne="jp",Y=`${ne}.${Y}`):["claude","nova-lite","nova-micro","nova-pro"].some(K=>Y.includes(K))&&(ne="apac",Y=`${ne}.${Y}`);break}}return ee.languageModel(Y)}}},nvidia:async()=>({autoload:false,options:{headers:{"HTTP-Referer":"https://easbot.cn/","X-Title":"easbot"}}}),openrouter:async()=>({autoload:false,options:{headers:{"HTTP-Referer":"https://easbot.cn/","X-Title":"easbot"}}}),vercel:async()=>({autoload:false,options:{headers:{"http-referer":"https://easbot.cn/","x-title":"easbot"}}}),"google-vertex":async()=>{let n=V("GOOGLE_CLOUD_PROJECT")??V("GCP_PROJECT")??V("GCLOUD_PROJECT"),o=V("GOOGLE_CLOUD_LOCATION")??V("VERTEX_LOCATION")??"us-east5";return !n?{autoload:false}:{autoload:true,vars(I){let S=o==="global"?"aiplatform.googleapis.com":`${o}-aiplatform.googleapis.com`;return {...n&&{GOOGLE_VERTEX_PROJECT:n},GOOGLE_VERTEX_LOCATION:o,GOOGLE_VERTEX_ENDPOINT:S}},options:{project:n,location:o,fetch:async(I,S)=>{let{GoogleAuth:O}=await import('google-auth-library'),R=await(await new O().getApplicationDefault()).credential.getAccessToken(),J=new Headers(S?.headers);return J.set("Authorization",`Bearer ${R.token}`),fetch(I,{...S,headers:J})}},async getModel(I,S){let O=String(S).trim();return I.languageModel(O)}}},"google-vertex-anthropic":async()=>{let n=V("GOOGLE_CLOUD_PROJECT")??V("GCP_PROJECT")??V("GCLOUD_PROJECT"),o=V("GOOGLE_CLOUD_LOCATION")??V("VERTEX_LOCATION")??"global";return !n?{autoload:false}:{autoload:true,options:{project:n,location:o},async getModel(I,S){let O=String(S).trim();return I.languageModel(O)}}},"sap-ai-core":async()=>{let n=await Auth.get("sap-ai-core"),o=iife(()=>{let S=process.env.AICORE_SERVICE_KEY;if(S)return S;if(n?.type==="api")return process.env.AICORE_SERVICE_KEY=n.key,n.key}),f=process.env.AICORE_DEPLOYMENT_ID,I=process.env.AICORE_RESOURCE_GROUP;return {autoload:!!o,options:o?{deploymentId:f,resourceGroup:I}:{},async getModel(S,O){return S(O)}}},zenmux:async()=>({autoload:false,options:{headers:{"HTTP-Referer":"https://easbot.cn/","X-Title":"easbot"}}}),gitlab:async n=>{let o=V("GITLAB_INSTANCE_URL")||"https://gitlab.com",f=await Auth.get(n.id),I=await(async()=>f?.type==="oauth"?f.access:f?.type==="api"?f.key:V("GITLAB_TOKEN"))(),S=await le.provider("gitlab"),{VERSION:O,createGitLab:B}=await import('gitlab-ai-provider'),q={"User-Agent":`easbot/${Ne().getVersion()} gitlab-ai-provider/${O} (${rt.platform()} ${rt.release()}; ${rt.arch()})`,...S?.options?.aiGatewayHeaders||{}};return {autoload:!!I,options:{instanceUrl:o,apiKey:I,aiGatewayHeaders:q,featureFlags:{duo_agent_platform_agentic_chat:true,duo_agent_platform:true,...S?.options?.featureFlags||{}}},async getModel(R,J){return R.agenticChat(J,{aiGatewayHeaders:q,featureFlags:{duo_agent_platform_agentic_chat:true,duo_agent_platform:true,...S?.options?.featureFlags||{}}})}}},"cloudflare-workers-ai":async n=>{let o=V("CLOUDFLARE_ACCOUNT_ID");if(!o)return {autoload:false};let f=await iife(async()=>{let I=V("CLOUDFLARE_API_KEY");if(I)return I;let S=await Auth.get(n.id);if(S?.type==="api")return S.key});return {autoload:!!f,options:{apiKey:f,baseURL:`https://api.cloudflare.com/client/v4/accounts/${o}/ai/v1`},async getModel(I,S){return I.languageModel(S)}}},"cloudflare-ai-gateway":async n=>{let o=V("CLOUDFLARE_ACCOUNT_ID"),f=V("CLOUDFLARE_GATEWAY_ID");if(!o||!f)return {autoload:false};let I=await(async()=>{let R=V("CLOUDFLARE_API_TOKEN")||V("CF_AIG_TOKEN");if(R)return R;let J=await Auth.get(n.id);if(J?.type==="api")return J.key})();if(!I)throw new Error("CLOUDFLARE_API_TOKEN (or CF_AIG_TOKEN) is required for Cloudflare AI Gateway. Set it via environment variable or run `easbot auth cloudflare-ai-gateway`.");let{createAiGateway:S}=await import('ai-gateway-provider'),{createUnified:O}=await import('ai-gateway-provider/providers/unified'),B=S({accountId:o,gateway:f,apiKey:I}),q=O();return {autoload:true,async getModel(R,J,ie){return B(q(J))},options:{}}},cerebras:async()=>({autoload:false,options:{headers:{"X-Cerebras-3rd-Party-Integration":"easbot"}}}),ollama:async()=>({autoload:true,options:{baseURL:V("OLLAMA_BASE_URL")||"http://localhost:11434"},async getModel(o,f,I){return o.languageModel?o.languageModel(f):o(f)}}),"easbot-local":async()=>{let n=V("LOCAL_MODEL_PATH")||Ge.join(Ie().cache,"models"),{SUPPORTED_EMBEDDING_MODELS:o}=await import('@easbot/local-model-sdk');return {autoload:true,options:{cacheDir:n,verbose:true},async getModel(f,I,S){return I in o?f.embeddingModel(I,S):I.startsWith("rerank-")?f.rerankingModel?f.rerankingModel(I.slice(6),S):f(I):f.languageModel?f.languageModel(I,S):f(I)}}}};te.Model=k.object({id:k.string(),providerId:k.string(),api:k.object({id:k.string(),url:k.string(),npm:k.string()}),name:k.string(),family:k.string().optional(),capabilities:k.object({temperature:k.boolean(),reasoning:k.boolean(),attachment:k.boolean(),toolcall:k.boolean(),input:k.object({text:k.boolean(),audio:k.boolean(),image:k.boolean(),video:k.boolean(),pdf:k.boolean()}),output:k.object({text:k.boolean(),audio:k.boolean(),image:k.boolean(),video:k.boolean(),pdf:k.boolean()}),interleaved:k.union([k.boolean(),k.object({field:k.enum(["reasoning_content","reasoning_details"])})])}),cost:k.object({input:k.number(),output:k.number(),cache:k.object({read:k.number(),write:k.number()}),experimentalOver200K:k.object({input:k.number(),output:k.number(),cache:k.object({read:k.number(),write:k.number()})}).optional()}),limit:k.object({context:k.number(),input:k.number().optional(),output:k.number()}),status:k.enum(["alpha","beta","deprecated","active"]),options:k.record(k.string(),k.any()),headers:k.record(k.string(),k.string()),release_date:k.string(),variants:k.record(k.string(),k.record(k.string(),k.any())).optional()}).meta({ref:"Model"}),te.Info=k.object({id:k.string(),name:k.string(),source:k.enum(["env","config","custom","api"]),env:k.string().array(),key:k.string().optional(),options:k.record(k.string(),k.any()),models:k.record(k.string(),te.Model)}).meta({ref:"Provider"});function M(n,o){let f={id:o.id,providerId:n.id,name:o.name,family:o.family,api:{id:o.id,url:n.api,npm:o.provider?.npm??n.npm??"@ai-sdk/openai-compatible"},status:o.status??"active",headers:o.headers??{},options:o.options??{},cost:{input:o.cost?.input??0,output:o.cost?.output??0,cache:{read:o.cost?.cache_read??0,write:o.cost?.cache_write??0},experimentalOver200K:o.cost?.context_over_200k?{cache:{read:o.cost.context_over_200k.cache_read??0,write:o.cost.context_over_200k.cache_write??0},input:o.cost.context_over_200k.input,output:o.cost.context_over_200k.output}:void 0},limit:{context:o.limit.context??te.DEFAULT_CONTEXT_LIMIT,input:o.limit.input??P(o.limit.context??te.DEFAULT_CONTEXT_LIMIT),output:o.limit.output??te.DEFAULT_OUTPUT_LIMIT},capabilities:{temperature:o.temperature,reasoning:o.reasoning,attachment:o.attachment,toolcall:o.tool_call,input:{text:o.modalities?.input?.includes("text")??false,audio:o.modalities?.input?.includes("audio")??false,image:o.modalities?.input?.includes("image")??false,video:o.modalities?.input?.includes("video")??false,pdf:o.modalities?.input?.includes("pdf")??false},output:{text:o.modalities?.output?.includes("text")??false,audio:o.modalities?.output?.includes("audio")??false,image:o.modalities?.output?.includes("image")??false,video:o.modalities?.output?.includes("video")??false,pdf:o.modalities?.output?.includes("pdf")??false},interleaved:o.interleaved??false},release_date:o.release_date,variants:{}};return f.variants=mapValues(xe.variants(f),I=>I),f}function x(n){return {id:n.id,source:"custom",name:n.name,env:n.env??[],options:{},models:mapValues(n.models,o=>M(n,o))}}te.fromModelsDevProvider=x;async function j(){var ke=[];try{let n=b(ke,_.time("state"));let o=await le.get();let f=new Set(o.disabled_providers??[]);let I=new Set([...Je,...o.enabled_providers??[]]);let S=await we.get();let O=pickBy(S,(L,N)=>I.has(N));let B=mapValues(O,x);function q(L){return !(I&&!I.has(L)||f.has(L))}let R={};let J=new Map;let ie={};let me=new Map;let re=new Map;_.info("init");let pe=Object.entries(o.provider??{});if(B["github-copilot"]){let L=B["github-copilot"];B={...B,"github-copilot-enterprise":{...L,id:"github-copilot-enterprise",name:"GitHub Copilot Enterprise",models:mapValues(L.models,N=>({...N,providerId:"github-copilot-enterprise"}))}};}function ee(L,N){let G=R[L];if(G){R[L]=mergeDeep(G,N);return}let K=B[L];K&&(R[L]=mergeDeep(K,N));}for(let[L,N]of pe){let G=B[L],K={id:L,name:N.name??G?.name??L,env:N.env??G?.env??[],options:mergeDeep(G?.options??{},N.options??{}),source:"config",models:G?.models??{}};for(let[z,D]of Object.entries(N.models??{})){let $=K.models[D.id??z],de=iife(()=>D.name?D.name:D.id&&D.id!==z?z:$?.name??z),Me={id:z,api:{id:D.id??$?.api.id??z,npm:D.provider?.npm??N.npm??$?.api.npm??O[L]?.npm??"@ai-sdk/openai-compatible",url:N?.api??$?.api.url??O[L]?.api??""},status:D.status??$?.status??"active",name:de,providerId:L,capabilities:{temperature:D.temperature??$?.capabilities.temperature??!1,reasoning:D.reasoning??$?.capabilities.reasoning??!1,attachment:D.attachment??$?.capabilities.attachment??!1,toolcall:D.tool_call??$?.capabilities.toolcall??!0,input:{text:D.modalities?.input?.includes("text")??$?.capabilities.input.text??!0,audio:D.modalities?.input?.includes("audio")??$?.capabilities.input.audio??!1,image:D.modalities?.input?.includes("image")??$?.capabilities.input.image??!1,video:D.modalities?.input?.includes("video")??$?.capabilities.input.video??!1,pdf:D.modalities?.input?.includes("pdf")??$?.capabilities.input.pdf??!1},output:{text:D.modalities?.output?.includes("text")??$?.capabilities.output.text??!0,audio:D.modalities?.output?.includes("audio")??$?.capabilities.output.audio??!1,image:D.modalities?.output?.includes("image")??$?.capabilities.output.image??!1,video:D.modalities?.output?.includes("video")??$?.capabilities.output.video??!1,pdf:D.modalities?.output?.includes("pdf")??$?.capabilities.output.pdf??!1},interleaved:D.interleaved??!1},cost:{input:D?.cost?.input??$?.cost?.input??0,output:D?.cost?.output??$?.cost?.output??0,cache:{read:D?.cost?.cache_read??$?.cost?.cache.read??0,write:D?.cost?.cache_write??$?.cost?.cache.write??0}},options:mergeDeep($?.options??{},D.options??{}),limit:{context:D.limit?.context??$?.limit?.context??te.DEFAULT_CONTEXT_LIMIT,input:D.limit?.input??$?.limit?.input??P(D.limit?.context??te.DEFAULT_CONTEXT_LIMIT),output:D.limit?.output??$?.limit?.output??te.DEFAULT_OUTPUT_LIMIT},headers:mergeDeep($?.headers??{},D.headers??{}),family:D.family??$?.family??"",release_date:D.release_date??$?.release_date??"",variants:{}},ye=mergeDeep(xe.variants(Me),D.variants??{});Me.variants=mapValues(pickBy(ye,ae=>!ae.disabled),ae=>omit(ae,["disabled"])),K.models[z]=Me;}B={...B,[L]:K};}let Y=await Env.all();for(let[L,N]of Object.entries(B)){if(f.has(L))continue;let G=N.env.map(K=>Y[K]).find(Boolean);G&&ee(L,{source:"env",key:N.env.length===1?G:void 0});}for(let[L,N]of Object.entries(await Auth.all()))f.has(L)||N.type==="api"&&ee(L,{source:"api",key:N.key});for(let L of e){let N=L.providerId;if(f.has(N))continue;let G=!1,K=await Auth.get(N);if(K&&(G=!0),N==="github-copilot"&&!G&&await Auth.get("github-copilot-enterprise")&&(G=!0),!!G){if(K){let z=B[L.authProvider];if(!z){_.error(`Auth provider ${L.authProvider} not found in database`);continue}try{let $=await L.loader(()=>Auth.get(N),z)??{},de=R[N]?{options:$}:{source:"custom",options:$};ee(N,de);}catch(D){_.warn("plugin auth loader failed for provider",{providerId:N,authProvider:L.authProvider,error:D instanceof Error?D.message:String(D)});}}if(N==="github-copilot"){let z="github-copilot-enterprise";if(!f.has(z)&&await Auth.get(z)){let $=B[z];if(!$){_.error(`Enterprise provider ${z} not found in database`);continue}try{let Me=await L.loader(()=>Auth.get(z),$)??{},ye=R[z]?{options:Me}:{source:"custom",options:Me};ee(z,ye);}catch(de){_.warn("plugin auth loader failed for enterprise provider",{providerId:z,error:de instanceof Error?de.message:String(de)});}}}}}for(let[L,N]of Object.entries(l)){if(f.has(L)||!I.has(L))continue;let G=B[L];if(!G){_.debug("Provider does not exist in model list "+L);continue}let K=await N(G);if(K&&(K.autoload||R[L])){K.getModel&&(ie[L]=K.getModel);let z=K.options??{},D=R[L]?{options:z}:{source:"custom",options:z};ee(L,D);}}for(let[L,N]of pe){let G={source:"config"};N.env&&(G.env=N.env),N.name&&(G.name=N.name),N.options&&(G.options=N.options),ee(L,G);}for(let[L,N]of Object.entries(R)){if(!q(L)){delete R[L];continue}let G=o.provider?.[L];for(let[K,z]of Object.entries(N.models)){z.api.id=z.api.id??z.id??K,(K==="gpt-5-chat-latest"||L==="openrouter"&&K==="openai/gpt-5-chat")&&delete N.models[K],z.status==="alpha"&&!he.EASBOT_ENABLE_EXPERIMENTAL_MODELS&&delete N.models[K],z.status==="deprecated"&&delete N.models[K],(G?.blacklist?.includes(K)||G?.whitelist&&!G.whitelist.includes(K))&&delete N.models[K],z.variants=mapValues(xe.variants(z),$=>$);let D=G?.models?.[K]?.variants;if(D&&z.variants){let $=mergeDeep(z.variants,D);z.variants=mapValues(pickBy($,de=>!de.disabled),de=>omit(de,["disabled"]));}}if(Object.keys(N.models).length===0){delete R[L];continue}_.info("found",{providerId:L});}return {models:J,providers:R,sdk:me,localProxy:re,modelLoaders:ie}}catch(Oe){var ve=Oe,ne=true;}finally{c(ke,ve,ne);}}let h=br(j);async function p(){return h()}function b$1(){h.reset();}te.resetState=b$1;async function t(){return (await p())?.providers??{}}te.list=t;async function i(){return (await p())?.localProxy??{}}te.getLocalProxy=i;async function m(n){try{var o=[];try{let O=b(o,_.time("getSDK",{providerId:n.providerId}));let B=await p();if(!B)throw new Error("Provider state not available");let q=B.providers[n.providerId];if(!q)throw new Error(`Provider ${n.providerId} not found`);let R={...q.options};n.api.npm.includes("@ai-sdk/openai-compatible")&&R.includeUsage!==!1&&(R.includeUsage=!0);R.baseURL||(R.baseURL=n.api.url);R.apiKey===void 0&&q.key&&(R.apiKey=q.key);n.headers&&(R.headers={...R.headers,...n.headers});let J={providerId:n.providerId,npm:n.api.npm,baseURL:R.baseURL,apiKey:R.apiKey,region:R.region,endpoint:R.endpoint};let ie=PKG.xxHash32(JSON.stringify(J));let me=B.sdk.get(ie);if(me)return me;let re=R.fetch;R.fetch=async($,de)=>{let Me=re??fetch,ye=de??{};if(R.timeout!==void 0&&R.timeout!==null){let ae=[];ye.signal&&ae.push(ye.signal),R.timeout!==!1&&ae.push(AbortSignal.timeout(R.timeout));let yt=ae.length>1?AbortSignal.any(ae):ae[0];ye.signal=yt;}if(n.api.npm==="@ai-sdk/openai"&&ye.body&&ye.method==="POST")try{let ae=JSON.parse(ye.body);if(!(n.providerId.includes("azure")&&ae.store===!0)&&Array.isArray(ae.input)){for(let ht of ae.input)"id"in ht&&delete ht.id;ye.body=JSON.stringify(ae);}}catch(ae){_.warn("failed to parse openai request body for itemId strip",{providerId:n.providerId,error:ae instanceof Error?ae.message:String(ae)});}return Me($,{...ye,timeout:!1})};let pe=vr[n.api.npm];if(pe){_.info("using bundled provider",{providerId:n.providerId,pkg:n.api.npm});let de=(await pe())({name:n.providerId,...R});return B.sdk.set(ie,de),de}let ee;n.api.npm.startsWith("file://")?ee=n.api.npm:ee=await Shell.install(n.api.npm,"latest");let{pathToFileURL:Y}=await import('url');let ke=await import('path');let Oe=await import('fs/promises');let ve=ke.join(ee,"package.json");let ne=JSON.parse(await Oe.readFile(ve,"utf-8"));let L;ne.exports?.["."]?.import?L=ne.exports["."].import:ne.exports?.["."]?.require?L=ne.exports["."].require:ne.module?L=ne.module:ne.main?L=ne.main:L="index.js";let N=ke.join(ee,L);let G=Y(N).href;let K=await import(G);let z=K[Object.keys(K).find($=>$.startsWith("create"))];let D=z({name:n.providerId,...R});B.sdk.set(ie,D);return D}catch(f){var I=f,S=!0;}finally{c(o,I,S);}}catch(O){throw new te.InitError({providerId:n.providerId},{cause:O})}}async function g(n){return (await p())?.providers[n]}te.getProvider=g;async function a(n,o){let f=await p();if(!f)throw new Error("Provider state not available");let I=f.providers[n];if(!I){let R=Object.keys(f.providers),ie=Pt.go(n,R,{limit:3,threshold:-1e4}).map(me=>me.target);throw new te.ModelNotFoundError({providerId:n,modelId:o,suggestions:ie})}let S=I.models[o];if(S)return S;if(o.includes("/")){let R=o.split("/");for(let J=1;J<R.length;J++){let ie=R.slice(J).join("/");if(S=I.models[ie],S)return S}}let O=Object.keys(I.models),q=Pt.go(o,O,{limit:3,threshold:-1e4}).map(R=>R.target);throw new te.ModelNotFoundError({providerId:n,modelId:o,suggestions:q})}te.getModel=a;async function v(n){_.debug("getLanguage called",{providerId:n.providerId,modelId:n.id});let o=await p();if(!o)throw new Error("Provider state not available");let f=`${n.providerId}/${n.id}`;if(o.models.has(f))return o.models.get(f);let I=o.providers[n.providerId];if(!I)throw new Error(`Provider ${n.providerId} not found`);let S=await m(n);try{let O=o.modelLoaders[n.providerId],B=O?await O(S,n.api.id,I.options):S.languageModel(n.api.id);return o.models.set(f,B),B}catch(O){throw _.error("Failed to create language model",{providerId:n.providerId,modelId:n.id,error:O}),O instanceof NoSuchModelError?new te.ModelNotFoundError({modelId:n.id,providerId:n.providerId},{cause:O}):O}}te.getLanguage=v;async function T(n,o){_.debug("getEmbedding called",{providerId:n,modelId:o});let f=await p();if(f){let q=`${n}/${o}`,R=f.models.get(q);if(R)return R}let I=await a(n,o),S=await m(I),O,B=S;if(typeof B.embeddingModel=="function")O=B.embeddingModel(I.api.id);else if(typeof B.textEmbeddingModel=="function")O=B.textEmbeddingModel(I.api.id);else throw new Error(`Provider ${n} does not support embedding model. SDK missing both 'embeddingModel' and 'textEmbeddingModel' methods.`);return f&&f.models.set(`${n}/${o}`,O),O}te.getEmbedding=T;async function U(n,o){_.debug("getRerank called",{providerId:n,modelId:o});let f=await p();if(f){let q=`${n}/${o}`,R=f.models.get(q);if(R)return R}let I=await a(n,o),S=await m(I),O,B=S;if(typeof B.rerankingModel=="function")O=B.rerankingModel(I.api.id),O&&f&&f.models.set(`${n}/${o}`,O);else if(typeof B.languageModel=="function"){let q=await i(),R=`${n}/${o}`;if(R in q)return q[R];let J=await v(I);if(J){let ie=await a("easbot-local","rerank-proxy"),re=await m(ie);O=re.rerankingModel?re.rerankingModel(ie.api.id,{llm:J,useEnhancedPrompt:true,promptLanguage:"cn",totalScore:1}):void 0,O&&(q.set(R,O),f&&f.models.set(R,O));}}if(!O)throw new Error(`Provider ${n} and model ${o} does not support rerank`);return O}te.getRerank=U;async function W(n,o){let f=await p();if(!f)return;let I=f.providers[n];if(I){for(let S of o)for(let O of Object.keys(I.models))if(O.includes(S))return {providerId:n,modelId:O}}}te.closest=W;async function oe(n){let o=await le.get();if(o.small_model){let O=ue(o.small_model);if(!O.providerId||!O.modelId)throw new Error("Invalid small_model format");return a(O.providerId,O.modelId)}let f=await p(),I=f?.providers[n];if(I){let O=["claude-haiku-4-5","claude-haiku-4.5","3-5-haiku","3.5-haiku","gemini-3-flash","gemini-2.5-flash","gpt-5-nano"];n.startsWith("easbot")&&(O=["gpt-5-nano"]),n.startsWith("github-copilot")&&(O=["gpt-5-mini","claude-haiku-4.5",...O]);for(let B of O)if(n==="amazon-bedrock"){let q=["global.","us.","eu."],R=Object.keys(I.models).filter(re=>re.includes(B)),J=R.find(re=>re.startsWith("global."));if(J)return a(n,J);let ie=I.options?.region;if(ie){let re=ie.split("-")[0];if(re==="us"||re==="eu"){let pe=R.find(ee=>ee.startsWith(`${re}.`));if(pe)return a(n,pe)}}let me=R.find(re=>!q.some(pe=>re.startsWith(pe)));if(me)return a(n,me)}else for(let q of Object.keys(I.models))if(q.includes(B))return a(n,q)}if(f?.providers.easbot?.models["gpt-5-nano"])return a("easbot","gpt-5-nano")}te.getSmallModel=oe;let ge=["gpt-5","claude-sonnet-4","gemini-3-pro"];function fe(n){return sortBy(n,[o=>ge.findIndex(f=>o.id.includes(f)),"desc"],[o=>o.id.includes("latest")?0:1,"asc"],[o=>o.id,"desc"])}te.sort=fe;async function ce(){let n=await le.get();if(n.model)return ue(n.model);let o=await t().then(I=>Object.values(I)).then(I=>I.find(S=>!n.provider||Object.keys(n.provider).includes(S.id)));if(!o)throw new Error("no providers found");let[f]=fe(Object.values(o.models));if(!f)throw new Error("no models found");return {providerId:o.id,modelId:f.id}}te.defaultModel=ce;function ue(n){let{provider:o,model:f}=parseModelId(n);if(!o)throw new Error("Invalid model format: "+n);return {providerId:o,modelId:f}}te.parseModel=ue,te.ModelNotFoundError=NamedError.create("ProviderModelNotFoundError",k.object({providerId:k.string(),modelId:k.string(),suggestions:k.array(k.string()).optional()})),te.InitError=NamedError.create("ProviderInitError",k.object({providerId:k.string()}));})(H||(H={}));var ot;(y=>{let e=[/prompt is too long/i,/input is too long for requested model/i,/exceeds the context window/i,/input token count.*exceeds the maximum/i,/maximum prompt length is \d+/i,/reduce the length of the messages/i,/maximum context length is \d+ tokens/i,/exceeds the limit of \d+/i,/exceeds the available context size/i,/greater than the context length/i,/context window exceeds limit/i,/exceeded model token limit/i,/context[_ ]length[_ ]exceeded/i,/request entity too large/i,/context length is only \d+ tokens/i,/input length.*exceeds.*context length/i,/prompt too long; exceeded (?:max )?context length/i,/too large for model with \d+ maximum context length/i,/model_context_window_exceeded/i];function r(s){let l=s.statusCode;return l&&l===404||s.isRetryable}function d(s){return e.some(l=>l.test(s))?true:/^4(00|13)\s*(status code)?\s*\(no body\)/i.test(s)}function c(s,l){return s.includes("github-copilot")&&l.statusCode===403?"Please reauthenticate with the copilot provider to ensure your credentials work properly with EasBot.":l.message}function E(s,l){return iife(()=>{let u=l.message;if(u===""){if(l.responseBody)return l.responseBody;if(l.statusCode){let M=STATUS_CODES[l.statusCode];if(M)return M}return "Unknown error"}let w=c(s,l);if(w!==u)return w;if(!l.responseBody||l.statusCode&&u!==STATUS_CODES[l.statusCode])return u;try{let M=JSON.parse(l.responseBody),x=M.message||M.error||M.error?.message;if(x&&typeof x=="string")return `${u}: ${x}`}catch{}return `${u}: ${l.responseBody}`}).trim()}function C(s){if(typeof s=="string")try{let l=JSON.parse(s);return l&&typeof l=="object"?l:void 0}catch{return}if(typeof s=="object"&&s!==null)return s}function P(s){let l=C(s),u=typeof l?.message=="string"?C(l.message)??l:l;if(!u||u.type!=="error")return;let w=JSON.stringify(u);switch(u?.error?.code){case "context_length_exceeded":return {type:"context_overflow",message:"Input exceeds context window of this model",responseBody:w};case "insufficient_quota":return {type:"api_error",message:"Quota exceeded. Check your plan and billing details.",isRetryable:false,responseBody:w};case "usage_not_included":return {type:"api_error",message:"To use Codex with your ChatGPT plan, upgrade to Plus: https://chatgpt.com/explore/plus.",isRetryable:false,responseBody:w};case "invalid_prompt":return {type:"api_error",message:typeof u?.error?.message=="string"?u?.error?.message:"Invalid prompt.",isRetryable:false,responseBody:w};case "server_error":return {type:"api_error",message:typeof u?.error?.message=="string"?u?.error?.message:"Server error.",isRetryable:true,responseBody:w}}}y.parseStreamError=P;function _(s){let l=E(s.providerId,s.error),u=C(s.error.responseBody);if(d(l)||s.error.statusCode===413||u?.error?.code==="context_length_exceeded")return {type:"context_overflow",message:l,responseBody:s.error.responseBody};let w=s.error.url?{url:s.error.url}:void 0;return {type:"api_error",message:l,statusCode:s.error.statusCode,isRetryable:s.providerId.startsWith("openai")?r(s.error):s.error.isRetryable,responseHeaders:s.error.responseHeaders,responseBody:s.error.responseBody,metadata:w}}y.parseAPICallError=_;})(ot||(ot={}));var dt;(j=>{let e=[],r=lazyAsync(async()=>{let h={};for(let{providerId:p,methods:b}of e)h[p]={methods:b};return {methods:h,pending:{}}});function d(h){let p=e.findIndex(b=>b.providerId===h.providerId);p>=0?e[p]=h:e.push(h),r.reset();}j.registerPluginAuthProvider=d;function c(){e.length=0,r.reset();}j.clearPluginAuthProviders=c;function E(){return r()}function C(){r.reset();}j.resetState=C,j.Method=k.object({type:k.union([k.literal("oauth"),k.literal("api")]),label:k.string()}).meta({ref:"ProviderAuthMethod"});async function _(){let h=await E().then(p=>p.methods);return mapValues(h,p=>p.methods.map(b=>({type:b.type,label:b.label})))}j.methods=_,j.Authorization=k.object({url:k.string(),method:k.union([k.literal("auto"),k.literal("code")]),instructions:k.string()}).meta({ref:"ProviderAuthAuthorization"}),j.authorize=fn(k.object({providerId:k.string(),method:k.number()}),async h=>{let p=await E().then(t=>t.methods[h.providerId]);if(!p)return;let b=p.methods[h.method];if(b&&b.type==="oauth"&&b.authorize){let t=await b.authorize();return t?(await E().then(i=>i.pending[h.providerId]=t),{url:t.url??"",method:t.method??"",instructions:t.instructions??""}):void 0}}),j.callback=fn(k.object({providerId:k.string(),method:k.number(),code:k.string().optional()}),async h=>{let p=await E().then(t=>t.pending[h.providerId]);if(!p)throw new j.OauthMissing({providerId:h.providerId});let b;if(p.method==="code"){if(!h.code)throw new j.OauthCodeMissing({providerId:h.providerId});b=await p.callback(h.code);}if(p.method==="auto"&&(b=await p.callback()),b?.type==="success"){"key"in b&&b.key&&await Auth.set(h.providerId,{type:"api",key:b.key??""}),"refresh"in b&&b.refresh&&await Auth.set(h.providerId,{type:"oauth",access:b.access??"",refresh:b.refresh??"",expires:b.expires??0,...b.accountId?{accountId:b.accountId}:{}});return}throw new j.OauthCallbackFailed({})}),j.api=fn(k.object({providerId:k.string(),key:k.string()}),async h=>{await Auth.set(h.providerId,{type:"api",key:h.key});}),j.OauthMissing=NamedError.create("ProviderAuthOauthMissing",k.object({providerId:k.string()})),j.OauthCodeMissing=NamedError.create("ProviderAuthOauthCodeMissing",k.object({providerId:k.string()})),j.OauthCallbackFailed=NamedError.create("ProviderAuthOauthCallbackFailed",k.object({}));})(dt||(dt={}));var Ir=Log.create({service:"rerank"}),ct;(d=>{async function e(c){if(c&&typeof c=="object"&&"specificationVersion"in c)return c;let E=c??await(async()=>{let C=await H.defaultModel();return H.getModel(C.providerId,C.modelId)})();return H.getRerank(E.providerId,E.id)}async function r(c,E){let{query:C,documents:P,model:_,topN:y}=c,s=E??c.abortSignal;if(P.length===0)return [];let l=await e(_),u=y??Math.min(10,P.length),w=await rerank({model:l,query:C,documents:P,topN:u,abortSignal:s});return Ir.debug("rerank done",{inputCount:P.length,outputCount:w.ranking.length,topN:u}),w.ranking.map(M=>({index:M.originalIndex,document:M.document,score:M.score,reason:M.reason}))}d.rerankDocuments=r;})(ct||(ct={}));function _e(e){return /(\.md|\.ts|\.json|readme|doc|spec|guideline)/i.test(e)?"document":/(deadline|date|day|week|month|year|q[1-4]|sprint)/i.test(e)?"time":/(file|model|dataset|artifact|resource|tool|sdk|ollama|sqlite|embedding|vector|fts)/i.test(e)?"object":/(event|incident|release|meeting|migration|launch)/i.test(e)?"event":/(api|service|system|engine|pipeline|server|db|database|memorysystem|contextengine)/i.test(e)?"process":/(team|group|org|company|inc|ltd|corp)/i.test(e)?"organization":/(concept|principle|policy|method|pattern|strategy)/i.test(e)?"concept":/(score|rate|ratio|latency|accuracy|recall|precision|throughput|kpi)/i.test(e)?"metric":/(task|issue|ticket|todo|action)/i.test(e)?"task":/(process|workflow|procedure|flow|lifecycle)/i.test(e)?"process":/[A-Z]/.test(e)?"object":"keyword"}function Re(e){return e.trim().replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu,"").replace(/\s+/g," ").slice(0,120)}var _r=/([A-Za-z][\w.-]{1,80})\s+(is_a|part_of|has_attribute|located_in|occurs_in|causes|influences|owned_by|member_of|uses|depends_on|related_to)\s+([A-Za-z][\w.-]{1,80})/g;function ze(e){let r=[],d=[],c=new Set,E=new Set;for(let _ of e.matchAll(_r)){let y=Re(_[1]??""),s=(_[2]??"related_to").trim(),l=Re(_[3]??"");if(!y||!l||y===l)continue;let u=y.toLowerCase(),w=l.toLowerCase();c.has(u)||(c.add(u),r.push({name:y,type:_e(y),properties:{source:"rule_extracted"}})),c.has(w)||(c.add(w),r.push({name:l,type:_e(l),properties:{source:"rule_extracted"}}));let M=`${u}|${w}|${s}`;E.has(M)||(E.add(M),d.push({source:y,target:l,relation:s}));}let C=e.split(/\n\s*\n/);for(let _ of C){if(_.trim().length<20)continue;let y=[];for(let s of _.match(/[\p{L}\p{N}][\p{L}\p{N}_.-]{2,80}/gu)??[]){let l=Re(s);if(!l)continue;let u=l.toLowerCase();c.has(u)&&(y.some(w=>w.key===u)||y.push({key:u,name:l}));}for(let s=0;s<y.length;s++)for(let l=s+1;l<y.length;l++){let u=y[s],w=y[l];if(!u||!w||u.key===w.key)continue;let M=_e(u.name),x=_e(w.name),j="related_to";M==="document"&&x==="object"?j="defines":M==="object"&&x==="document"?j="referenced_in":M==="process"&&x==="object"?j="uses":M==="object"&&x==="process"?j="used_by":M==="concept"&&(j="relates_to");let h=`${u.key}|${w.key}|${j}`;E.has(h)||(E.add(h),d.push({source:u.name,target:w.name,relation:j}));}}let P=e.match(/[\p{L}\p{N}][\p{L}\p{N}_.-]{1,80}/gu)??[];for(let _ of P){let y=Re(_);if(!y)continue;let s=y.toLowerCase();c.has(s)||(c.add(s),r.push({name:y,type:_e(y),properties:{source:"keyword_extracted"}}));}return {summary:"",entities:r,relations:d}}function Ke(e,r,d,c={}){let{maxContentLength:E=2e3,maxChunks:C=5,includeSummary:P=true}=c,_=r.map(u=>`- ${u.type}: ${u.rule}`).join(`
3
+ `),y=d.map(u=>`- ${u.type}: ${u.rule}`).join(`
4
+ `),s=e.slice(0,C).join(`
5
+
6
+ `).slice(0,E);return `You are an information extraction engine for a general-purpose memory graph.
7
+
8
+ Extract entities and directed relations from the text${P?", and generate a concise summary":""}.
9
+
10
+ Entity type taxonomy:
11
+ ${_}
12
+
13
+ Relation type taxonomy:
14
+ ${y}
15
+
16
+ Extraction rules:
17
+ - Output valid JSON only. Do not include markdown, prose, or code fences.
18
+ ${P?`- summary: A concise summary (max 250 characters) describing the main topic and key points.
19
+ `:""}- Use canonical, concise entity names (deduplicated, case-insensitive).
20
+ - Prefer specific entity types over "keyword".
21
+ - Include relation only if both source and target entities are present in the entities list.
22
+ - Do not invent facts not grounded in the input text.
23
+ - Keep relation direction meaningful (source -> target).
24
+ - properties should contain short factual attributes only (plain JSON object).
25
+
26
+ Return this exact JSON shape:
27
+ {
28
+ ${P?` "summary": "A concise summary of the text content (max 250 characters)",
29
+ `:""} "entities": [
30
+ { "name": "string", "type": "one_of_entity_types", "properties": {} }
31
+ ],
32
+ "relations": [
33
+ { "source": "entity_name", "target": "entity_name", "relation": "one_of_relation_types" }
34
+ ]
35
+ }
36
+
37
+ Input text:
38
+ ${s}`}function qe(e,r,d){try{let c=e.match(/\{[\s\S]*\}/);if(c){let E=JSON.parse(c[0]);return lt(E,r,d)}}catch{}return {summary:"",entities:[],relations:[]}}function lt(e,r,d){let c=e,E=new Set(r.map(x=>x.type)),C=new Set(d.map(x=>x.type)),P=typeof c.summary=="string"?c.summary.trim():"",_=Array.isArray(c.entities)?c.entities:[],y=Array.isArray(c.relations)?c.relations:[],s=[],l=new Set,u=new Map;for(let x of _){let j=typeof x?.name=="string"?x.name.trim():"";if(!j)continue;let h=j.toLowerCase();if(l.has(h))continue;l.add(h),u.set(h,j);let p=typeof x?.type=="string"?x.type.trim():"",b=E.has(p)?p:"keyword",t=x?.properties&&typeof x.properties=="object"&&!Array.isArray(x.properties)?x.properties:{};s.push({name:j,type:b,properties:t});}let w=[],M=new Set;for(let x of y){let j=typeof x?.source=="string"?x.source.trim():"",h=typeof x?.target=="string"?x.target.trim():"";if(!j||!h)continue;let p=u.get(j.toLowerCase()),b=u.get(h.toLowerCase());if(!p||!b||p===b)continue;let t=typeof x?.relation=="string"?x.relation.trim():"",i=C.has(t)?t:"related_to",m=`${p.toLowerCase()}|${b.toLowerCase()}|${i}`;M.has(m)||(M.add(m),w.push({source:p,target:b,relation:i}));}return {summary:P,entities:s,relations:w}}var ut;(j=>{let e=Log.create({service:"graph"}),r=5,d=2e3,E=3;function P(h,p){let b=[];for(let t of h){if(t.length<=p){t.length>0&&b.push(t);continue}let i=0;for(;i<t.length;){if(t.length-i<=p){let v=t.slice(i);v.length>0&&b.push(v);break}let g=t.slice(i,i+p),a=-1;for(let v=g.length-1;v>=Math.max(0,g.length-200);v--){let T=g[v];if(T===void 0)break;if(T===`
39
+ `&&g[v-1]===`
40
+ `){a=v+1;break}(T===`
41
+ `||T===" "||T===" ")&&(a=v+1);}a<=0&&(a=p),b.push(g.slice(0,a).trimEnd()),i+=a;}}return b}function _(h){let p=new Map;for(let m of h)for(let g of m.entities){let a=g.name.toLowerCase();p.has(a)||p.set(a,g);}let b=new Set,t=[];for(let m of h)for(let g of m.relations){let a=p.get(g.source.toLowerCase()),v=p.get(g.target.toLowerCase());if(!a||!v)continue;let T=a.name,U=v.name;if(T===U)continue;let W=`${T.toLowerCase()}|${U.toLowerCase()}|${g.relation}`;b.has(W)||(b.add(W),t.push({source:T,target:U,relation:g.relation}));}let i="";for(let m of h)if(m.summary){i=m.summary;break}return {summary:i,entities:[...p.values()],relations:t}}async function y(h,p,b){if(h.length===0)return [];let t=Math.max(1,Math.min(b,h.length)),i=new Array(h.length),m=0;async function g(){for(;;){let v=m++;if(v>=h.length)return;i[v]=await p(h[v],v);}}let a=[];for(let v=0;v<t;v++)a.push(g());return await Promise.all(a),i}function s(h,p){if(p.promptOverride)return p.maxEntities&&p.maxEntities>0?`${p.promptOverride}
42
+
43
+ [Hint: Extract at most ${p.maxEntities} core entities]`:p.promptOverride;let b=Ke([h],GRAPH_ENTITY_TYPE_DEFINITIONS,GRAPH_RELATION_TYPE_DEFINITIONS,{maxChunks:1,maxContentLength:p.prompt?.maxContentLength??d,includeSummary:p.prompt?.includeSummary??true});return p.maxEntities&&p.maxEntities>0?`${b}
44
+
45
+ [Hint: Extract at most ${p.maxEntities} core entities]`:b}async function l(h,p,b){try{if(!p)return {summary:"",entities:[],relations:[]};let t=s(p,h);return await w(h,t)}catch(t){return e.warn("graph LLM call failed for chunk; skipping (other chunks continue)",{chunkIndex:b,error:t instanceof Error?t.message:String(t)}),{summary:"",entities:[],relations:[]}}}async function u(h){let p=h.model;if(p&&typeof p=="object"&&"specificationVersion"in p)return {languageModel:p,providerModel:void 0};let b=p??await(async()=>{let t=await H.defaultModel();return H.getModel(t.providerId??"default",t.modelId??"default")})();return {languageModel:await H.getLanguage(b),providerModel:b}}async function w(h,p){try{let{languageModel:b,providerModel:t}=await u(h),m=(await streamText({model:b,prompt:p,abortSignal:h.abortSignal,maxOutputTokens:t?xe.maxOutputTokens(t):xe.getOutputTokenMax()}).text).trim(),g=qe(m,GRAPH_ENTITY_TYPE_DEFINITIONS,GRAPH_RELATION_TYPE_DEFINITIONS);return g.entities.length===0&&g.relations.length===0&&!g.summary&&e.warn("graph LLM returned empty result after parse"),g}catch(b){return e.error("graph LLM call failed, caller will fall back to rule extraction",{error:b instanceof Error?b.message:String(b)}),{summary:"",entities:[],relations:[]}}}function M(h,p){let b=new Map;for(let m of [...h.entities,...p.entities]){let g=m.name.toLowerCase();b.has(g)||b.set(g,m);}let t=new Set,i=[];for(let m of [...h.relations,...p.relations]){let g=b.get(m.source.toLowerCase()),a=b.get(m.target.toLowerCase());if(!g||!a)continue;let v=g.name,T=a.name;if(v===T)continue;let U=`${v.toLowerCase()}|${T.toLowerCase()}|${m.relation}`;t.has(U)||(t.add(U),i.push({source:v,target:T,relation:m.relation}));}return {summary:p.summary||h.summary,entities:[...b.values()],relations:i}}async function x(h,p){let b=p?{...h,abortSignal:p}:h,t=b.chunks??(b.text?[b.text]:[]);if(t.length===0)return {summary:"",entities:[],relations:[]};let i=t.reduce((ce,ue)=>ce+ue.length,0),m=Token.estimate(t.join(`
46
+
47
+ `));m>6e3&&e.warn("graph input exceeds soft token threshold; will be split into multiple per-call chunks",{estTokens:m,totalChars:i,chunks:t.length});let a=b.includeRules!==false?t.reduce((ce,ue)=>M(ce,ze(ue)),{summary:"",entities:[],relations:[]}):{summary:"",entities:[],relations:[]},v=b.prompt?.maxChunks??r,T=b.prompt?.maxContentLength??d,U=b.prompt?.maxConcurrency??E,W=[];for(let ce=0;ce<t.length;ce+=v)W.push(t.slice(ce,ce+v));let oe=W.flatMap(ce=>{let ue=ce.join(`
48
+
49
+ `);return ue.length<=T?[ue]:P([ue],T)}),ge=await y(oe,(ce,ue)=>l(b,ce,ue),U),fe=_(ge);return M(a,fe)}j.generateGraph=x;})(ut||(ut={}));var pt;(l=>{Log.create({service:"summary"});let r=loadTextFile("./memory-summary.txt",import.meta.url),d=loadTextFile("./knowledge-summary.txt",import.meta.url);async function C(u,w,M,x,j){return streamText({model:u,system:w,prompt:M,maxOutputTokens:x,abortSignal:j}).text}async function P(u){if(u&&typeof u=="object"&&"specificationVersion"in u)return u;let w=u??await(async()=>{let M=await H.defaultModel();return H.getModel(M.providerId??"default",M.modelId??"default")})();return H.getLanguage(w)}function _(u){return u.map(w=>{let M=[` - node: id=${w.id} type=${w.type} name=${w.name}`];if(w.edges&&w.edges.length>0)for(let x of w.edges){let j=x.targetId!==void 0?` (id=${x.targetId})`:"";M.push(` \u2192 [${x.direction}] ${x.relation} \u2192 target=${x.targetType}:${x.targetName}${j}`);}return M.join(`
50
+ `)}).join(`
51
+ `)}async function y(u,w){let M=w??u.abortSignal,{query:x,chunks:j,model:h,maxLength:p}=u;if(j.length===0)return "";let b=await P(h),t=d()??"Synthesize the following document chunks into a concise summary relevant to the query. Order by Priority descending.",i=j.map((a,v)=>{let T=a.startLine!=null?`#L${a.startLine}-L${a.endLine??a.startLine}`:"",U=a.score??0,W=`[Chunk ${v+1}] Priority: ${U.toFixed(3)}
52
+ Source: [${a.path}](./${a.path}${T})
53
+ ${a.content}`;return !a.nodes||a.nodes.length===0?W:`${W}
54
+ Graph Nodes:
55
+ ${_(a.nodes)}`}).join(`
56
+
57
+ `),m=`[Query]
58
+ ${x}
59
+
60
+ [Knowledge Chunks]
61
+ ${i}`;return (await C(b,t,m,p??1e3,M)).trim()}l.summarizeNote=y;async function s(u,w){let M=w??u.abortSignal,{query:x,facts:j,model:h,maxLength:p}=u;if(j.length===0)return "";let b=await P(h),t=r()??"Synthesize the following memory facts into a concise summary relevant to the query. Order by Priority descending.",i=j.map((a,v)=>{let T=a.score??0,U=`[Fact ${v+1}] Priority: ${T.toFixed(3)}
62
+ Category: ${a.category} | Importance: ${a.importance} | Source: ${a.source}
63
+ ${a.content}`;if(!a.nodes||a.nodes.length===0)return U;let W=a.nodes.map(oe=>{let ge=[` - node: id=${oe.id} type=${oe.type} name=${oe.name}`];if(oe.edges&&oe.edges.length>0)for(let fe of oe.edges){let ce=fe.direction??(fe.source===oe.id?"out":"in"),ue=fe.targetNode?`${fe.targetNode.type}:${fe.targetNode.name}`:"unknown",Ae=fe.target!==void 0?` (id=${fe.target})`:"";ge.push(` \u2192 [${ce}] ${fe.relation} \u2192 target=${ue}${Ae}`);}return ge.join(`
64
+ `)}).join(`
65
+ `);return `${U}
66
+ Graph Nodes:
67
+ ${W}`}).join(`
68
+
69
+ `),m=`[Query]
70
+ ${x}
71
+
72
+ [Memory Facts]
73
+ ${i}`;return (await C(b,t,m,p??1e3,M)).trim()}l.summarizeMemoryFacts=s;})(pt||(pt={}));var Nt=Log.create({service:"embedding"}),gt;(_=>{_.DEFAULT_MODEL="easbot-local/bge-base-zh-v1.5";async function r(y){if(y&&typeof y=="object"&&"specificationVersion"in y)return y;let s=y??await(async()=>{let l=await H.defaultModel();return H.getModel(l.providerId,l.modelId)})();return H.getEmbedding(s.providerId,s.id)}async function d(y,s){let{value:l,model:u}=y,w=s??y.abortSignal;if(!l)return {embedding:[],usage:{tokens:0}};let M=await r(u),x=await embed({model:M,value:l,abortSignal:w});return Nt.debug("embedText done",{dim:x.embedding.length,tokens:x.usage?.tokens}),{embedding:x.embedding,usage:{tokens:x.usage?.tokens??0}}}_.embedText=d;async function c(y,s){let{values:l,model:u}=y,w=s??y.abortSignal;if(l.length===0)return {embeddings:[],usage:{tokens:0}};let M=await r(u),x=await embedMany({model:M,values:l,abortSignal:w});return Nt.debug("embedTexts done",{inputCount:l.length,dim:x.embeddings[0]?.length,tokens:x.usage?.tokens}),{embeddings:x.embeddings,usage:{tokens:x.usage?.tokens??0}}}_.embedTexts=c;function E(y,s){if(y.length!==s.length||y.length===0)return 0;let l=0,u=0,w=0;for(let x=0;x<y.length;x++){let j=y[x]??0,h=s[x]??0;l+=j*h,u+=j*j,w+=h*h;}let M=Math.sqrt(u)*Math.sqrt(w);return M===0?0:l/M}_.cosineSimilarity=E;function C(y,s){if(y.length!==s.length||y.length===0)return 0;let l=0;for(let u=0;u<y.length;u++){let w=y[u]??0,M=s[u]??0,x=w-M;l+=x*x;}return Math.sqrt(l)}_.euclideanDistance=C;function P(y){let s=0;for(let l of y)s+=l*l;return s=Math.sqrt(s),s===0?y:y.map(l=>l/s)}_.normalize=P;})(gt||(gt={}));var Ve=class extends Error{constructor(d,c){let E=c instanceof Error?c.message:String(c);super(`probeEmbeddingDims failed for model "${d}": ${E}`);a(this,"modelId");a(this,"cause");this.name="ProbeEmbeddingError",this.modelId=d,this.cause=c;}};async function Dr(e,r){let d=r?.probeText??"probe",c=r?.timeoutMs??5e3,E=[];r?.signal&&E.push(r.signal);let C=new AbortController,P=setTimeout(()=>C.abort(),c);E.push(C.signal);let _=E.length===1?E[0]:AbortSignal.any(E);try{let s=(await embed({model:e,value:d,abortSignal:_})).embedding.length;return typeof s=="number"&&s>0?s:void 0}catch(y){if(y.name==="AbortError")return;let s=e.modelId??"unknown";console.debug(`[probeEmbeddingDims] model=${s} failed:`,y instanceof Error?y.message:String(y)),new Ve(s,y);return}finally{clearTimeout(P);}}function jr(e,r){if(r.length===0)return;let d=e.prepare("INSERT OR REPLACE INTO meta (key, value) VALUES (?, ?)");e.transaction(E=>{for(let[C,P]of E)d.run(C,P);})(r);}var se=Log.create({service:"llm-bootstrap"}),Fr={embedding:"embedding_model",graph:"graph_model",rerank:"rerank_model"},zr={embedding:"embedding_llm",graph:"graph_llm",rerank:"rerank_llm"};function ft(e){if(e)try{let r=H.parseModel(e);return r.providerId&&r.modelId?{providerId:r.providerId,modelId:r.modelId}:void 0}catch(r){se.debug("parseModel failed",{raw:e,error:r instanceof Error?r.message:String(r)});return}}async function Kr(e,r){if(!r)return {};let d=isAbsolute(r)?r:join(e,r);try{let c=await readFile(d,"utf-8"),E=JSON.parse(c);return !E||typeof E!="object"?{}:E}catch(c){return se.debug("Subconfig read failed (fail-silent, will fall back to top-level LLMConfig)",{subConfigPath:d,error:c instanceof Error?c.message:String(c)}),{}}}function mt(e,r,d){let c=Fr[e],E=zr[e],C=r[c];if(typeof C=="string"&&C)return {raw:C,source:"sub"};let P=r[E];if(typeof P=="string"&&P)return {raw:P,source:"sub"};let _=d[c];if(_)return {raw:_,source:"top"}}async function qr(e){let r=await le.get(),d=mt("embedding",e,r);if(!d)return se.debug("embedding model not configured (neither subconfig nor top-level)"),{};let c=ft(d.raw);if(!c)return se.debug("embedding model id parse failed",{raw:d.raw,source:d.source}),{source:d.source};try{return se.info("Loading embedding model",{providerId:c.providerId,modelId:c.modelId,source:d.source}),{model:await H.getEmbedding(c.providerId,c.modelId),source:d.source}}catch(E){return E instanceof H.ModelNotFoundError?se.warn("Embedding model not found, falling back",{providerId:c.providerId,modelId:c.modelId}):se.warn("Provider.getEmbedding failed, falling back",{providerId:c.providerId,modelId:c.modelId,error:E instanceof Error?E.message:String(E)}),{source:d.source}}}async function Vr(e){let r=await le.get(),d=mt("graph",e,r);if(!d)return se.debug("graph model not configured (neither subconfig nor top-level)"),{};let c=ft(d.raw);if(!c)return se.debug("graph model id parse failed",{raw:d.raw,source:d.source}),{source:d.source};try{se.info("Loading graph model",{providerId:c.providerId,modelId:c.modelId,source:d.source});let E=await H.getModel(c.providerId,c.modelId);return {model:await H.getLanguage(E),source:d.source}}catch(E){return se.warn("Provider.getLanguage failed, falling back",{providerId:c.providerId,modelId:c.modelId,error:E instanceof Error?E.message:String(E)}),{source:d.source}}}async function Wr(e){let r=await le.get(),d=mt("rerank",e,r);if(!d)return se.debug("rerank model not configured (neither subconfig nor top-level)"),{};let c=ft(d.raw);if(!c)return se.debug("rerank model id parse failed",{raw:d.raw,source:d.source}),{source:d.source};try{return se.info("Loading rerank model",{providerId:c.providerId,modelId:c.modelId,source:d.source}),{model:await H.getRerank(c.providerId,c.modelId),source:d.source}}catch(E){return se.warn("Provider.getRerank failed, falling back",{providerId:c.providerId,modelId:c.modelId,error:E instanceof Error?E.message:String(E)}),{source:d.source}}}async function Dt(e){let{target:r,cwd:d,subConfigPath:c,embedding:E=true,graph:C=false,rerank:P=false}=e;if(r.isInitialized())return se.debug("Llm already initialized, skip bootstrapLlm"),{loaded:{embedding:false,graph:false,rerank:false},hasFallback:true,sources:{}};let _=await Kr(d,c??""),y={},s={},l=[];E&&l.push(qr(_).then(M=>{M.source&&(s.embedding=M.source),M.model&&(y.embeddingLlm=M.model);})),C&&l.push(Vr(_).then(M=>{M.source&&(s.graph=M.source),M.model&&(y.graphLlm=M.model);})),P&&l.push(Wr(_).then(M=>{M.source&&(s.rerank=M.source),M.model&&(y.rerankLlm=M.model);})),await Promise.all(l),r.init({models:y});let u={embedding:!!y.embeddingLlm,graph:!!y.graphLlm,rerank:!!y.rerankLlm},w=!u.embedding&&!u.graph&&!u.rerank;return se.info("Llm bootstrap completed",{loaded:u,sources:s,hasFallback:w}),{loaded:u,hasFallback:w,sources:s}}function jt(e){let r={getDirectory:()=>e.instance.directory,getWorktree:()=>e.instance.worktree};He({global:e.global,instance:r}),se.debug("standalone adapters injected",{globalConfig:e.global.config,instanceDir:e.instance.directory});}export{De as CUSTOM_PROVIDER_DEFINITIONS,le as Config,Je as DEFAULT_ENABLED_PROVIDERS,gt as EmbeddingProvider,he as Flag,ut as GraphProvider,Be as LLMConfig,we as ModelsDev,Ut as PROVIDER_DISPLAY_NAMES,Ve as ProbeEmbeddingError,H as Provider,dt as ProviderAuth,xt as ProviderAuthMethod,Qe as ProviderConfig,ot as ProviderError,xe as ProviderTransform,ct as RerankProvider,pt as SummaryProvider,Dt as bootstrapLlm,jt as bootstrapLlmStandalone,Ke as buildEntityExtractionPrompt,ze as extractEntitiesByRules,zt as getAdapterRegistry,Ye as getIConfigProvider,Ie as getIGlobalPathProvider,Ne as getIInstallationProvider,Ze as getIInstanceProvider,Xe as hasAdapterRegistry,_e as inferEntityType,Xt as initModelsRefresh,lt as normalizeExtractionResult,qe as parseEntityExtractionResult,Dr as probeEmbeddingDims,V as readEnvString,Kt as readFlagBool,qt as readFlagNumber,Re as sanitizeEntityToken,He as setAdapterRegistry,jr as syncMeta};
package/package.json ADDED
@@ -0,0 +1,113 @@
1
+ {
2
+ "name": "@easbot/llm",
3
+ "version": "0.3.19",
4
+ "description": "AI model aggregation layer for EASBot ecosystem: multi-vendor SDK dynamic loading, model routing, configuration management, and high-level Model Provider capability wrapping.",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.mjs",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "keywords": [
18
+ "ai",
19
+ "agent",
20
+ "skills",
21
+ "library",
22
+ "typescript",
23
+ "model-router",
24
+ "ai-sdk",
25
+ "adapter-registry",
26
+ "provider",
27
+ "easbot"
28
+ ],
29
+ "author": "houjallen",
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/houjallen/easbot.git",
34
+ "directory": "packages/llm"
35
+ },
36
+ "homepage": "https://github.com/houjallen/easbot/tree/main/packages/llm#readme",
37
+ "bugs": {
38
+ "url": "https://github.com/houjallen/easbot/issues"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "README.md",
43
+ "README.en.md",
44
+ "LICENSE"
45
+ ],
46
+ "dependencies": {
47
+ "@ai-sdk/alibaba": "1.0.45",
48
+ "@ai-sdk/amazon-bedrock": "4.0.153",
49
+ "@ai-sdk/anthropic": "3.0.110",
50
+ "@ai-sdk/azure": "3.0.101",
51
+ "@ai-sdk/cerebras": "2.0.73",
52
+ "@ai-sdk/cohere": "3.0.54",
53
+ "@ai-sdk/deepinfra": "2.0.71",
54
+ "@ai-sdk/deepseek": "2.0.55",
55
+ "@ai-sdk/gateway": "3.0.172",
56
+ "@ai-sdk/google": "3.0.108",
57
+ "@ai-sdk/google-vertex": "4.0.181",
58
+ "@ai-sdk/groq": "3.0.59",
59
+ "@ai-sdk/mistral": "3.0.57",
60
+ "@ai-sdk/openai": "3.0.96",
61
+ "@ai-sdk/openai-compatible": "2.0.70",
62
+ "@ai-sdk/perplexity": "3.0.53",
63
+ "@ai-sdk/provider": "^3.0.15",
64
+ "@ai-sdk/provider-utils": "^4.0.45",
65
+ "@ai-sdk/togetherai": "3.0.31",
66
+ "@ai-sdk/vercel": "2.0.69",
67
+ "@ai-sdk/xai": "3.0.120",
68
+ "@aws-sdk/credential-providers": "3.1110.0",
69
+ "@openrouter/ai-sdk-provider": "^2.9.0",
70
+ "ai": "^6.0.253",
71
+ "ai-gateway-provider": "^3.2.0",
72
+ "fuzzysort": "^4.0.2",
73
+ "gitlab-ai-provider": "^6.12.1",
74
+ "google-auth-library": "^11.0.2",
75
+ "remeda": "^2.39.0",
76
+ "zod": "^4.4.3",
77
+ "@easbot/types": "0.3.19",
78
+ "@easbot/utils": "0.3.19",
79
+ "@easbot/local-model-sdk": "0.3.19",
80
+ "@easbot/llm": "0.3.19",
81
+ "@easbot/ollama-sdk": "0.3.19",
82
+ "@easbot/plugin": "0.3.19"
83
+ },
84
+ "devDependencies": {
85
+ "@types/node": "^25.9.5",
86
+ "tsup": "^8.5.1",
87
+ "typescript": "^6.0.3",
88
+ "vitest": "^4.1.5"
89
+ },
90
+ "engines": {
91
+ "node": ">=22.22.2"
92
+ },
93
+ "publishConfig": {
94
+ "access": "public"
95
+ },
96
+ "scripts": {
97
+ "dev": "tsup --watch --env.NODE_ENV development",
98
+ "build": "tsup --env.NODE_ENV production",
99
+ "test": "vitest",
100
+ "test:run": "vitest run",
101
+ "test:coverage": "vitest run --coverage",
102
+ "lint": "biome check .",
103
+ "lint:fix": "biome check --write .",
104
+ "lint:report": "biome check --reporter=summary .",
105
+ "format": "biome format .",
106
+ "format:fix": "biome format --write .",
107
+ "type-check": "tsc --noEmit",
108
+ "clean": "npx rimraf dist node_modules",
109
+ "publish:npm": "bash scripts/publish.sh",
110
+ "publish:npm:win": "powershell -ExecutionPolicy Bypass -File scripts/publish.ps1",
111
+ "build:snapshot": "tsx scripts/build-models-snapshot.ts"
112
+ }
113
+ }