llm-core
Version:
A unified TypeScript/JavaScript package providing a single interface for multiple LLM providers (OpenAI, Claude, Groq, Grok). Eliminate vendor lock-in with seamless provider switching, consistent responses, and built-in cost tracking.
7 lines • 67.7 kB
JavaScript
'use strict';var Q=Object.create;var O=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var Z=Object.getPrototypeOf,ee=Object.prototype.hasOwnProperty;var te=(p,t)=>{for(var e in t)O(p,e,{get:t[e],enumerable:true});},J=(p,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of X(t))!ee.call(p,o)&&o!==e&&O(p,o,{get:()=>t[o],enumerable:!(r=Y(t,o))||r.enumerable});return p};var U=(p,t,e)=>(e=p!=null?Q(Z(p)):{},J(!p||!p.__esModule?O(e,"default",{value:p,enumerable:true}):e,p)),re=p=>J(O({},"__esModule",{value:true}),p);var oe={};te(oe,{AbstractProvider:()=>f,AnalyticsTracker:()=>K,ClaudeProvider:()=>w,ConfigurationManager:()=>T,CostCalculator:()=>b,CostOptimizer:()=>B,GrokProvider:()=>_,GroqProvider:()=>L,LLMCore:()=>A,ModelCapabilityDetector:()=>z,OpenAIProvider:()=>x,ProviderRouter:()=>P,RateLimiter:()=>W,ResponseStandardizer:()=>S,StreamManager:()=>V,StreamUtils:()=>$,TokenAnalyzer:()=>j,TokenCounter:()=>C,default:()=>A});module.exports=re(oe);var E=class E{constructor(t){this.validationCache=new Map;this.config=this.normalizeConfig(t);}validateConfig(){let t=JSON.stringify(this.config),e=this.validationCache.get(t);if(e)return e;let r={isValid:true,errors:[],warnings:[],validProviders:[],invalidProviders:[]};for(let[o,n]of Object.entries(this.config.providers)){let s=o;if(!n){r.warnings.push(`Provider ${s} is configured but has no settings`);continue}let i=this.validateProviderConfig(s,n);i.isValid?r.validProviders.push(s):(r.invalidProviders.push(s),r.errors.push(...i.errors.map(a=>`${s}: ${a}`)),r.isValid=false),r.warnings.push(...i.warnings.map(a=>`${s}: ${a}`));}return this.config.defaultProvider&&!r.validProviders.includes(this.config.defaultProvider)&&(r.errors.push(`Default provider '${this.config.defaultProvider}' is not configured or invalid`),r.isValid=false),this.validationCache.set(t,r),r}validateProviderConfig(t,e){let r={isValid:true,errors:[],warnings:[]},o=E.REQUIRED_FIELDS[t];for(let n of o)e[n]||(r.errors.push(`Missing required field: ${n}`),r.isValid=false);if(e.apiKey){let n=this.validateApiKey(t,e.apiKey);n.isValid||(r.errors.push(...n.errors),r.isValid=false),r.warnings.push(...n.warnings);}switch(t){case "openai":this.validateOpenAIConfig(e,r);break;case "claude":this.validateClaudeConfig(e,r);break;case "groq":this.validateGroqConfig(e,r);break;case "grok":this.validateGrokConfig(e,r);break}return r}getDefaultModel(t){return E.DEFAULT_MODELS[t]}getDefaultProvider(){let t=this.validateConfig();if(t.validProviders.length===0)throw this.createConfigError("NO_VALID_PROVIDERS","No valid providers configured");return this.config.defaultProvider&&t.validProviders.includes(this.config.defaultProvider)?this.config.defaultProvider:t.validProviders[0]}getProviderConfig(t){let e=this.config.providers[t];if(!e)throw this.createConfigError("PROVIDER_NOT_CONFIGURED",`Provider ${t} is not configured`);return e}getRetryConfig(){var t,e;return {maxAttempts:((t=this.config.globalSettings)==null?void 0:t.retries)||3,backoffMultiplier:2,maxDelay:(e=this.config.globalSettings)!=null&&e.retryDelay?this.config.globalSettings.retryDelay*10:3e4}}getFallbackConfig(){var t;return {enabled:((t=this.config.features)==null?void 0:t.retries)||false,providers:[]}}getTimeout(){var t;return ((t=this.config.globalSettings)==null?void 0:t.timeout)||3e4}updateProviderConfig(t,e){this.config.providers[t]=e,this.validationCache.clear();}removeProviderConfig(t){delete this.config.providers[t],this.validationCache.clear();}normalizeConfig(t){return {...t,providers:t.providers||{},globalSettings:{timeout:3e4,retries:3,retryDelay:1e3,...t.globalSettings},features:{streaming:true,tools:true,vision:true,costTracking:true,retries:true,...t.features}}}validateApiKey(t,e){let r={isValid:true,errors:[],warnings:[]};if(typeof e!="string"||e.trim().length===0)return r.errors.push("API key must be a non-empty string"),r.isValid=false,r;switch(t){case "openai":e.startsWith("sk-")||r.warnings.push('OpenAI API keys typically start with "sk-"'),e.length<40&&r.warnings.push("OpenAI API key seems too short");break;case "claude":e.startsWith("sk-ant-")||r.warnings.push('Claude API keys typically start with "sk-ant-"');break;case "groq":e.startsWith("gsk_")||e.match(/^[a-zA-Z0-9_-]+$/)||r.warnings.push("Groq API key format may be invalid");break;case "grok":e.length<20&&r.warnings.push("Grok API key seems too short");break}return r}validateOpenAIConfig(t,e){t.baseURL&&!this.isValidUrl(t.baseURL)&&e.errors.push("Invalid base URL format"),t.organization&&typeof t.organization!="string"&&e.errors.push("Organization must be a string"),t.project&&typeof t.project!="string"&&e.errors.push("Project must be a string");}validateClaudeConfig(t,e){t.baseURL&&!this.isValidUrl(t.baseURL)&&e.errors.push("Invalid base URL format"),t.version&&!t.version.match(/^\d{4}-\d{2}-\d{2}$/)&&e.warnings.push("Claude version should be in YYYY-MM-DD format");}validateGroqConfig(t,e){t.baseURL&&!this.isValidUrl(t.baseURL)&&e.errors.push("Invalid base URL format");}validateGrokConfig(t,e){t.baseURL&&!this.isValidUrl(t.baseURL)&&e.errors.push("Invalid base URL format");}isValidUrl(t){try{return new URL(t),!0}catch{return false}}createConfigError(t,e){return {name:"LLMCoreError",type:"validation",code:t,message:e,provider:"core",retryable:false,timestamp:Date.now()}}};E.DEFAULT_MODELS={openai:"gpt-4o-mini",claude:"claude-3-haiku-20240307",groq:"llama-3.1-8b-instant",grok:"grok-beta"},E.REQUIRED_FIELDS={openai:["apiKey"],claude:["apiKey"],groq:["apiKey"],grok:["apiKey"]};var T=E;var N=U(require("axios"));var f=class{constructor(t){this.config=t;}isConfigured(){return !!this.config.apiKey}async validateConfig(){try{return await this.getHealth(),!0}catch{return false}}async getHealth(){let t=Date.now();try{return await this.getModels(),{status:"active",latency:Date.now()-t,lastCheck:new Date}}catch(e){return {status:"error",latency:Date.now()-t,lastCheck:new Date,error:e instanceof Error?e.message:"Unknown error"}}}async estimateCost(t){let e=this.estimateTokens(t.messages.map(s=>s.content).join(" ")),r=t.maxTokens||150;return e*1e-5+r*3e-5}async validateRequest(t){return !(!t.messages||t.messages.length===0||!t.model||!t.provider)}estimateTokens(t){return Math.ceil(t.length/4)}createError(t,e,r,o=void 0,n=void 0){let s={name:"LLMCoreError",type:t,code:e,message:r,provider:this.name,retryable:o?o>=500||o===429:false,timestamp:Date.now()};return o!==void 0&&(s.statusCode=o),n!==void 0&&(s.details=n),s}handleError(t){throw t&&typeof t=="object"&&"name"in t&&t.name==="LLMCoreError"?t:t instanceof Error?this.createError("unknown","PROVIDER_ERROR",t.message,void 0,{originalError:t.name}):this.createError("unknown","UNKNOWN_ERROR","An unknown error occurred")}};var y=class y extends f{constructor(e){super(e);this.name="openai";this.displayName="OpenAI";let r=e.baseURL||"https://api.openai.com/v1";this.client=N.default.create({baseURL:r,headers:{Authorization:`Bearer ${e.apiKey}`,"Content-Type":"application/json",...e.organization&&{"OpenAI-Organization":e.organization},...e.project&&{"OpenAI-Project":e.project}},timeout:e.timeout||3e4});}async chat(e){try{let r=this.convertRequest(e),o=await this.client.post("/chat/completions",r);return this.convertResponse(o.data,e)}catch(r){throw N.default.isAxiosError(r)?this.handleAxiosError(r):this.handleError(r)}}async chatStream(e){let r=this.convertRequest(e);r.stream=true;let o=new AbortController;try{let n=await this.client.post("/chat/completions",r,{responseType:"stream",signal:o.signal});return {stream:this.createStreamingResponse(n.data,e),controller:{abort:()=>o.abort(),signal:{aborted:o.signal.aborted,addEventListener:(i,a)=>{o.signal.addEventListener(i,a);},removeEventListener:(i,a)=>{o.signal.removeEventListener(i,a);}}},metadata:{requestId:`openai-${Date.now()}`,provider:"openai",model:e.model,startTime:Date.now()}}}catch(n){throw N.default.isAxiosError(n)?this.handleAxiosError(n):this.handleError(n)}}async getModels(){try{return {provider:"openai",models:(await this.client.get("/models")).data.data.filter(o=>y.SUPPORTED_MODELS.includes(o.id)).filter(o=>y.MODEL_PRICING[o.id]).map(o=>{let n=y.MODEL_PRICING[o.id];return {id:o.id,name:o.id,contextLength:this.getModelContextLength(o.id),maxTokens:this.getModelMaxTokens(o.id),pricing:{promptTokens:n.input,completionTokens:n.output,currency:"USD",unit:"per_1k_tokens"},capabilities:{streaming:!0,tools:!0,vision:o.id.includes("vision")||o.id.includes("4o"),json:!0,maxTemperature:2,maxTopP:1,contextLength:this.getModelContextLength(o.id),maxTokens:this.getModelMaxTokens(o.id),multimodal:o.id.includes("vision")||o.id.includes("4o"),reasoning:o.id.includes("4o")},status:"active"}}),timestamp:Date.now()}}catch(e){throw N.default.isAxiosError(e)?this.handleAxiosError(e):this.handleError(e)}}async estimateCost(e){let r=e.model,o=y.MODEL_PRICING[r];if(!o)return 0;let n=this.estimateTokens(e.messages.map(c=>c.content).join(" ")),s=e.maxTokens||150,i=n/1e3*o.input,a=s/1e3*o.output;return i+a}convertRequest(e){return {model:e.model,messages:e.messages.map(this.convertMessage),...e.temperature!==void 0&&{temperature:e.temperature},...e.maxTokens!==void 0&&{max_tokens:e.maxTokens},...e.topP!==void 0&&{top_p:e.topP},...e.frequencyPenalty!==void 0&&{frequency_penalty:e.frequencyPenalty},...e.presencePenalty!==void 0&&{presence_penalty:e.presencePenalty},...e.stop!==void 0&&{stop:e.stop},...e.seed!==void 0&&{seed:e.seed},...e.user!==void 0&&{user:e.user},...e.tools&&{tools:e.tools.map(r=>({type:"function",function:r.function}))},...e.toolChoice&&{tool_choice:e.toolChoice},...e.responseFormat&&{response_format:{type:e.responseFormat.type}}}}convertMessage(e){let r={role:e.role,content:e.content,...e.name&&{name:e.name}};return e.role==="assistant"&&"toolCalls"in e&&e.toolCalls&&(r.tool_calls=e.toolCalls.map(o=>({id:o.id,type:"function",function:{name:o.function.name,arguments:o.function.arguments}}))),e.role==="tool"&&"toolCallId"in e&&(r.tool_call_id=e.toolCallId),r}convertResponse(e,r){let o=e.choices[0];if(!o)throw this.createError("parsing","NO_CHOICES","No choices in response");let n={role:o.message.role,content:o.message.content||"",...o.message.tool_calls&&{toolCalls:o.message.tool_calls.map(a=>({id:a.id,type:"function",function:{name:a.function.name,arguments:a.function.arguments}}))}},s={promptTokens:e.usage.prompt_tokens,completionTokens:e.usage.completion_tokens,totalTokens:e.usage.total_tokens},i=this.calculateCost(s,r.model);return {id:e.id,provider:"openai",model:r.model,created:e.created,message:n,finishReason:this.convertFinishReason(o.finish_reason),usage:s,...i&&{cost:i},...e.system_fingerprint&&{metadata:{systemFingerprint:e.system_fingerprint}}}}async*createStreamingResponse(e,r){let o=new TextDecoder,n="";for await(let s of e){n+=o.decode(s,{stream:true});let i=n.split(`
`);n=i.pop()||"";for(let a of i)if(a.startsWith("data: ")){let c=a.slice(6);if(c==="[DONE]")return;try{let d=JSON.parse(c),l=d.choices[0];l&&(l.delta.content||l.delta.role||l.delta.tool_calls)&&(yield {id:d.id,provider:"openai",model:r.model,created:d.created,delta:{...l.delta.role&&{role:l.delta.role},...l.delta.content&&{content:l.delta.content},...l.delta.tool_calls&&{toolCalls:l.delta.tool_calls.filter(u=>{var v;return u.id||((v=u.function)==null?void 0:v.name)}).map(u=>({index:u.index,...u.id&&{id:u.id},...u.type&&{type:u.type},...u.function&&{function:u.function}}))}},...l.finish_reason&&{finishReason:this.convertFinishReason(l.finish_reason)},isComplete:l.finish_reason!==null});}catch{continue}}}}convertFinishReason(e){switch(e){case "stop":return "stop";case "length":return "length";case "function_call":case "tool_calls":return "tool_calls";case "content_filter":return "content_filter";default:return "error"}}calculateCost(e,r){let o=y.MODEL_PRICING[r];if(!o)return;let n=e.promptTokens/1e3*o.input,s=e.completionTokens/1e3*o.output;return {promptCost:n,completionCost:s,totalCost:n+s,currency:"USD"}}getModelContextLength(e){return {"gpt-4":8192,"gpt-4-turbo-preview":128e3,"gpt-4-0125-preview":128e3,"gpt-4o":128e3,"gpt-4o-mini":128e3,"gpt-3.5-turbo":4096,"gpt-3.5-turbo-16k":16384}[e]||4096}getModelMaxTokens(e){return {"gpt-4":4096,"gpt-4-turbo-preview":4096,"gpt-4-0125-preview":4096,"gpt-4o":4096,"gpt-4o-mini":16384,"gpt-3.5-turbo":4096,"gpt-3.5-turbo-16k":4096}[e]||4096}handleAxiosError(e){var n,s,i,a,c;let r=(n=e.response)==null?void 0:n.status,o=(s=e.response)==null?void 0:s.data;return r===401?this.createError("authentication","INVALID_API_KEY","Invalid API key provided",401,{originalError:o}):r===429?this.createError("rate_limit","RATE_LIMIT_EXCEEDED","Rate limit exceeded",429,{originalError:o,retryAfter:(a=(i=e.response)==null?void 0:i.headers)==null?void 0:a["retry-after"]}):r===400?this.createError("validation","INVALID_REQUEST",((c=o==null?void 0:o.error)==null?void 0:c.message)||"Invalid request",400,{originalError:o}):r&&r>=500?this.createError("server_error","SERVER_ERROR","OpenAI server error",r,{originalError:o}):!e.response&&(e.code==="ENOTFOUND"||e.code==="ECONNREFUSED")?this.createError("network","NETWORK_ERROR","Network connection failed",void 0,{originalError:e.message}):this.createError("network","REQUEST_FAILED",e.message||"Request failed",r,{originalError:o})}};y.MODEL_PRICING={"gpt-4":{input:.03,output:.06},"gpt-4-turbo-preview":{input:.01,output:.03},"gpt-4-0125-preview":{input:.01,output:.03},"gpt-4o":{input:.005,output:.015},"gpt-4o-mini":{input:15e-5,output:6e-4},"gpt-3.5-turbo":{input:5e-4,output:.0015},"gpt-3.5-turbo-16k":{input:.003,output:.004}},y.SUPPORTED_MODELS=["gpt-4","gpt-4-turbo-preview","gpt-4-0125-preview","gpt-4o","gpt-4o-mini","gpt-3.5-turbo","gpt-3.5-turbo-16k"];var x=y;var q=U(require("axios"));var R=class R extends f{constructor(e){super(e);this.name="claude";this.displayName="Claude (Anthropic)";let r=e.baseURL||"https://api.anthropic.com";this.client=q.default.create({baseURL:r,headers:{"x-api-key":e.apiKey,"Content-Type":"application/json","anthropic-version":e.version||"2023-06-01"},timeout:e.timeout||3e4});}async chat(e){try{let r=this.convertRequest(e),o=await this.client.post("/v1/messages",r);return this.convertResponse(o.data,e)}catch(r){throw q.default.isAxiosError(r)?this.handleAxiosError(r):this.handleError(r)}}async chatStream(e){let r=this.convertRequest(e);r.stream=true;let o=new AbortController;try{let n=await this.client.post("/v1/messages",r,{responseType:"stream",signal:o.signal,headers:{Accept:"text/event-stream"}});return {stream:this.createStreamingResponse(n.data,e),controller:{abort:()=>o.abort(),signal:{aborted:o.signal.aborted,addEventListener:(i,a)=>{o.signal.addEventListener(i,a);},removeEventListener:(i,a)=>{o.signal.removeEventListener(i,a);}}},metadata:{requestId:`claude-${Date.now()}`,provider:"claude",model:e.model,startTime:Date.now()}}}catch(n){throw q.default.isAxiosError(n)?this.handleAxiosError(n):this.handleError(n)}}async getModels(){return {provider:"claude",models:R.SUPPORTED_MODELS.map(r=>{let o=R.MODEL_PRICING[r];if(!o)throw new Error(`Missing pricing for model ${r}`);return {id:r,name:r,contextLength:this.getModelContextLength(r),maxTokens:this.getModelMaxTokens(r),pricing:{promptTokens:o.input,completionTokens:o.output,currency:"USD",unit:"per_1m_tokens"},capabilities:{streaming:true,tools:true,vision:r.includes("opus")||r.includes("sonnet"),json:true,maxTemperature:1,maxTopP:1,contextLength:this.getModelContextLength(r),maxTokens:this.getModelMaxTokens(r),multimodal:true,reasoning:r.includes("opus")||r.includes("sonnet")},status:"active"}}),timestamp:Date.now()}}async estimateCost(e){let r=e.model,o=R.MODEL_PRICING[r];if(!o)return super.estimateCost(e);let n=this.estimateTokens(e.messages.map(c=>c.content).join(" ")),s=e.maxTokens||150,i=n/1e6*o.input,a=s/1e6*o.output;return i+a}convertRequest(e){let r=this.convertMessages(e.messages),o=e.messages.find(n=>n.role==="system");return {model:e.model,messages:r,max_tokens:e.maxTokens||4096,...e.temperature!==void 0&&{temperature:e.temperature},...e.topP!==void 0&&{top_p:e.topP},...e.stop&&{stop_sequences:Array.isArray(e.stop)?e.stop:[e.stop]},...o&&{system:o.content},...e.tools&&{tools:e.tools.map(n=>({name:n.function.name,...n.function.description&&{description:n.function.description},input_schema:n.function.parameters}))}}}convertMessages(e){return e.filter(r=>r.role!=="system").map(r=>r.role==="tool"?{role:"user",content:`Tool result: ${r.content}`}:{role:r.role==="assistant"?"assistant":"user",content:r.content})}convertResponse(e,r){let o=e.content.filter(c=>c.type==="text").map(c=>"text"in c?c.text:"").join(""),n=e.content.filter(c=>c.type==="tool_use").map(c=>"id"in c&&"name"in c&&"input"in c?{id:c.id,type:"function",function:{name:c.name,arguments:JSON.stringify(c.input)}}:null).filter(c=>c!==null),s={role:"assistant",content:o,...n.length>0&&{toolCalls:n}},i={promptTokens:e.usage.input_tokens,completionTokens:e.usage.output_tokens,totalTokens:e.usage.input_tokens+e.usage.output_tokens},a=this.calculateCost(i,r.model);return {id:e.id,provider:"claude",model:r.model,created:Date.now(),message:s,finishReason:this.convertFinishReason(e.stop_reason),usage:i,...a&&{cost:a}}}async*createStreamingResponse(e,r){var i;let o=new TextDecoder,n="",s="";for await(let a of e){n+=o.decode(a,{stream:true});let c=n.split(`
`);n=c.pop()||"";for(let d of c)if(d.startsWith("data: ")){let l=d.slice(6);try{let u=JSON.parse(l);if(u.type==="message_start"&&u.message&&(s=u.message.id),u.type==="content_block_delta"&&((i=u.delta)!=null&&i.text)&&(yield {id:s,provider:"claude",model:r.model,created:Date.now(),delta:{content:u.delta.text},isComplete:!1}),u.type==="message_stop"){yield {id:s,provider:"claude",model:r.model,created:Date.now(),delta:{content:""},finishReason:"stop",isComplete:!0};return}}catch{continue}}}}convertFinishReason(e){switch(e){case "end_turn":return "stop";case "max_tokens":return "length";case "tool_use":return "tool_calls";case "stop_sequence":return "stop";default:return "error"}}calculateCost(e,r){let o=R.MODEL_PRICING[r];if(!o)return;let n=e.promptTokens/1e6*o.input,s=e.completionTokens/1e6*o.output;return {promptCost:n,completionCost:s,totalCost:n+s,currency:"USD"}}getModelContextLength(e){return {"claude-3-5-sonnet-20241022":2e5,"claude-3-opus-20240229":2e5,"claude-3-sonnet-20240229":2e5,"claude-3-haiku-20240307":2e5}[e]||2e5}getModelMaxTokens(e){return {"claude-3-5-sonnet-20241022":8192,"claude-3-opus-20240229":4096,"claude-3-sonnet-20240229":4096,"claude-3-haiku-20240307":4096}[e]||4096}handleAxiosError(e){var n,s,i,a,c;let r=(n=e.response)==null?void 0:n.status,o=(s=e.response)==null?void 0:s.data;return r===401?this.createError("authentication","INVALID_API_KEY","Invalid API key provided",401,{originalError:o}):r===429?this.createError("rate_limit","RATE_LIMIT_EXCEEDED","Rate limit exceeded",429,{originalError:o,retryAfter:(a=(i=e.response)==null?void 0:i.headers)==null?void 0:a["retry-after"]}):r===400?this.createError("validation","INVALID_REQUEST",((c=o==null?void 0:o.error)==null?void 0:c.message)||"Invalid request",400,{originalError:o}):r&&r>=500?this.createError("server_error","SERVER_ERROR","Claude server error",r,{originalError:o}):this.createError("network","REQUEST_FAILED",e.message||"Request failed",r,{originalError:o})}};R.MODEL_PRICING={"claude-3-5-sonnet-20241022":{input:3,output:15},"claude-3-opus-20240229":{input:15,output:75},"claude-3-sonnet-20240229":{input:3,output:15},"claude-3-haiku-20240307":{input:.25,output:1.25}},R.SUPPORTED_MODELS=["claude-3-5-sonnet-20241022","claude-3-opus-20240229","claude-3-sonnet-20240229","claude-3-haiku-20240307"];var w=R;var D=U(require("axios"));var k=class k extends f{constructor(e){super(e);this.name="groq";this.displayName="Groq";let r=e.baseURL||"https://api.groq.com/openai/v1";this.client=D.default.create({baseURL:r,headers:{Authorization:`Bearer ${e.apiKey}`,"Content-Type":"application/json"},timeout:e.timeout||3e4});}async chat(e){try{let r=this.convertRequest(e),o=await this.client.post("/chat/completions",r);return this.convertResponse(o.data,e)}catch(r){throw D.default.isAxiosError(r)?this.handleAxiosError(r):this.handleError(r)}}async chatStream(e){let r=this.convertRequest(e);r.stream=true;let o=new AbortController;try{let n=await this.client.post("/chat/completions",r,{responseType:"stream",signal:o.signal});return {stream:this.createStreamingResponse(n.data,e),controller:{abort:()=>o.abort(),signal:{aborted:o.signal.aborted,addEventListener:(i,a)=>{o.signal.addEventListener(i,a);},removeEventListener:(i,a)=>{o.signal.removeEventListener(i,a);}}},metadata:{requestId:`groq-${Date.now()}`,provider:"groq",model:e.model,startTime:Date.now()}}}catch(n){throw D.default.isAxiosError(n)?this.handleAxiosError(n):this.handleError(n)}}async getModels(){try{return {provider:"groq",models:(await this.client.get("/models")).data.data.filter(o=>k.SUPPORTED_MODELS.includes(o.id)).filter(o=>k.MODEL_PRICING[o.id]).map(o=>{let n=k.MODEL_PRICING[o.id];return {id:o.id,name:o.id,contextLength:this.getModelContextLength(o.id),maxTokens:this.getModelMaxTokens(o.id),pricing:{promptTokens:n.input,completionTokens:n.output,currency:"USD",unit:"per_1m_tokens"},capabilities:{streaming:!0,tools:!0,vision:!1,json:!0,maxTemperature:2,maxTopP:1,contextLength:this.getModelContextLength(o.id),maxTokens:this.getModelMaxTokens(o.id),multimodal:!1,reasoning:o.id.includes("70b")},status:"active"}}),timestamp:Date.now()}}catch(e){throw D.default.isAxiosError(e)?this.handleAxiosError(e):this.handleError(e)}}async estimateCost(e){let r=e.model,o=k.MODEL_PRICING[r];if(!o)return super.estimateCost(e);let n=this.estimateTokens(e.messages.map(c=>c.content).join(" ")),s=e.maxTokens||150,i=n/1e6*o.input,a=s/1e6*o.output;return i+a}convertRequest(e){return {model:e.model,messages:e.messages.map(this.convertMessage),...e.temperature!==void 0&&{temperature:e.temperature},...e.maxTokens!==void 0&&{max_tokens:e.maxTokens},...e.topP!==void 0&&{top_p:e.topP},...e.frequencyPenalty!==void 0&&{frequency_penalty:e.frequencyPenalty},...e.presencePenalty!==void 0&&{presence_penalty:e.presencePenalty},...e.stop!==void 0&&{stop:e.stop},...e.seed!==void 0&&{seed:e.seed},...e.user!==void 0&&{user:e.user},...e.tools&&{tools:e.tools.map(r=>({type:"function",function:r.function}))},...e.toolChoice&&{tool_choice:e.toolChoice}}}convertMessage(e){let r={role:e.role,content:e.content,...e.name&&{name:e.name}};return e.role==="assistant"&&"toolCalls"in e&&e.toolCalls&&(r.tool_calls=e.toolCalls.map(o=>({id:o.id,type:"function",function:{name:o.function.name,arguments:o.function.arguments}}))),e.role==="tool"&&"toolCallId"in e&&(r.tool_call_id=e.toolCallId),r}convertResponse(e,r){let o=e.choices[0];if(!o)throw this.createError("parsing","NO_CHOICES","No choices in response");let n={role:o.message.role,content:o.message.content||"",...o.message.tool_calls&&{toolCalls:o.message.tool_calls.map(a=>({id:a.id,type:"function",function:{name:a.function.name,arguments:a.function.arguments}}))}},s={promptTokens:e.usage.prompt_tokens,completionTokens:e.usage.completion_tokens,totalTokens:e.usage.total_tokens,...e.usage.prompt_time&&{requestDuration:e.usage.total_time},...e.usage.queue_time&&{queueTime:e.usage.queue_time},...e.usage.completion_time&&{processingTime:e.usage.completion_time}},i=this.calculateCost(s,r.model);return {id:e.id,provider:"groq",model:r.model,created:e.created,message:n,finishReason:this.convertFinishReason(o.finish_reason),usage:s,...i&&{cost:i},...e.system_fingerprint&&{metadata:{systemFingerprint:e.system_fingerprint}}}}async*createStreamingResponse(e,r){let o=new TextDecoder,n="";for await(let s of e){n+=o.decode(s,{stream:true});let i=n.split(`
`);n=i.pop()||"";for(let a of i)if(a.startsWith("data: ")){let c=a.slice(6);if(c==="[DONE]")return;try{let d=JSON.parse(c),l=d.choices[0];l&&(l.delta.content||l.delta.role||l.delta.tool_calls)&&(yield {id:d.id,provider:"groq",model:r.model,created:d.created,delta:{...l.delta.role&&{role:l.delta.role},...l.delta.content&&{content:l.delta.content},...l.delta.tool_calls&&{toolCalls:l.delta.tool_calls.filter(u=>{var v;return u.id||((v=u.function)==null?void 0:v.name)}).map(u=>({index:u.index,...u.id&&{id:u.id},...u.type&&{type:u.type},...u.function&&{function:u.function}}))}},...l.finish_reason&&{finishReason:this.convertFinishReason(l.finish_reason)},isComplete:l.finish_reason!==null});}catch{continue}}}}convertFinishReason(e){switch(e){case "stop":return "stop";case "length":return "length";case "tool_calls":return "tool_calls";case "content_filter":return "content_filter";default:return "error"}}calculateCost(e,r){let o=k.MODEL_PRICING[r];if(!o)return;let n=e.promptTokens/1e6*o.input,s=e.completionTokens/1e6*o.output;return {promptCost:n,completionCost:s,totalCost:n+s,currency:"USD"}}getModelContextLength(e){return {"llama-3.1-70b-versatile":131072,"llama-3.1-8b-instant":131072,"mixtral-8x7b-32768":32768,"gemma-7b-it":8192,"gemma2-9b-it":8192}[e]||8192}getModelMaxTokens(e){return {"llama-3.1-70b-versatile":8e3,"llama-3.1-8b-instant":8e3,"mixtral-8x7b-32768":32e3,"gemma-7b-it":8e3,"gemma2-9b-it":8e3}[e]||8e3}handleAxiosError(e){var n,s,i,a,c;let r=(n=e.response)==null?void 0:n.status,o=(s=e.response)==null?void 0:s.data;return r===401?this.createError("authentication","INVALID_API_KEY","Invalid API key provided",401,{originalError:o}):r===429?this.createError("rate_limit","RATE_LIMIT_EXCEEDED","Rate limit exceeded",429,{originalError:o,retryAfter:(a=(i=e.response)==null?void 0:i.headers)==null?void 0:a["retry-after"]}):r===400?this.createError("validation","INVALID_REQUEST",((c=o==null?void 0:o.error)==null?void 0:c.message)||"Invalid request",400,{originalError:o}):r&&r>=500?this.createError("server_error","SERVER_ERROR","Groq server error",r,{originalError:o}):this.createError("network","REQUEST_FAILED",e.message||"Request failed",r,{originalError:o})}};k.MODEL_PRICING={"llama-3.1-70b-versatile":{input:.59,output:.79},"llama-3.1-8b-instant":{input:.05,output:.08},"mixtral-8x7b-32768":{input:.24,output:.24},"gemma-7b-it":{input:.07,output:.07},"gemma2-9b-it":{input:.2,output:.2}},k.SUPPORTED_MODELS=["llama-3.1-70b-versatile","llama-3.1-8b-instant","mixtral-8x7b-32768","gemma-7b-it","gemma2-9b-it"];var L=k;var G=U(require("axios"));var M=class M extends f{constructor(e){super(e);this.name="grok";this.displayName="Grok (xAI)";let r=e.baseURL||"https://api.x.ai/v1";this.client=G.default.create({baseURL:r,headers:{Authorization:`Bearer ${e.apiKey}`,"Content-Type":"application/json"},timeout:e.timeout||3e4});}async chat(e){try{let r=this.convertRequest(e),o=await this.client.post("/chat/completions",r);return this.convertResponse(o.data,e)}catch(r){throw G.default.isAxiosError(r)?this.handleAxiosError(r):this.handleError(r)}}async chatStream(e){let r=this.convertRequest(e);r.stream=true;let o=new AbortController;try{let n=await this.client.post("/chat/completions",r,{responseType:"stream",signal:o.signal});return {stream:this.createStreamingResponse(n.data,e),controller:{abort:()=>o.abort(),signal:{aborted:o.signal.aborted,addEventListener:(i,a)=>{o.signal.addEventListener(i,a);},removeEventListener:(i,a)=>{o.signal.removeEventListener(i,a);}}},metadata:{requestId:`grok-${Date.now()}`,provider:"grok",model:e.model,startTime:Date.now()}}}catch(n){throw G.default.isAxiosError(n)?this.handleAxiosError(n):this.handleError(n)}}async getModels(){return {provider:"grok",models:M.SUPPORTED_MODELS.map(r=>{let o=M.MODEL_PRICING[r],n=this.getModelContextLength(r),s=this.getModelMaxTokens(r);return {id:r,name:r,contextLength:n,maxTokens:s,pricing:{promptTokens:o.input,completionTokens:o.output,currency:"USD",unit:"per_1m_tokens"},capabilities:{streaming:true,tools:false,vision:r.includes("vision"),json:true,maxTemperature:2,maxTopP:1,contextLength:n,maxTokens:s,multimodal:r.includes("vision"),reasoning:true},status:"active"}}),timestamp:Date.now()}}async estimateCost(e){let r=e.model,o=M.MODEL_PRICING[r];if(!o)return super.estimateCost(e);let n=this.estimateTokens(e.messages.map(c=>c.content).join(" ")),s=e.maxTokens||150,i=n/1e6*o.input,a=s/1e6*o.output;return i+a}convertRequest(e){return {model:e.model,messages:e.messages.map(this.convertMessage),...e.temperature!==void 0&&{temperature:e.temperature},...e.maxTokens!==void 0&&{max_tokens:e.maxTokens},...e.topP!==void 0&&{top_p:e.topP},...e.stop!==void 0&&{stop:e.stop},...e.seed!==void 0&&{seed:e.seed},...e.user!==void 0&&{user:e.user}}}convertMessage(e){return {role:e.role==="tool"?"user":e.role,content:e.role==="tool"?`Tool result: ${e.content}`:e.content,...e.name&&{name:e.name}}}convertResponse(e,r){let o=e.choices[0];if(!o)throw this.createError("parsing","NO_CHOICES","No choices in response");let n={role:o.message.role,content:o.message.content||""},s={promptTokens:e.usage.prompt_tokens,completionTokens:e.usage.completion_tokens,totalTokens:e.usage.total_tokens},i=this.calculateCost(s,r.model);return {id:e.id,provider:"grok",model:r.model,created:e.created,message:n,finishReason:this.convertFinishReason(o.finish_reason),usage:s,...i&&{cost:i},...e.system_fingerprint&&{metadata:{systemFingerprint:e.system_fingerprint}}}}async*createStreamingResponse(e,r){let o=new TextDecoder,n="";for await(let s of e){n+=o.decode(s,{stream:true});let i=n.split(`
`);n=i.pop()||"";for(let a of i)if(a.startsWith("data: ")){let c=a.slice(6);if(c==="[DONE]")return;try{let d=JSON.parse(c),l=d.choices[0];l&&(l.delta.content||l.delta.role)&&(yield {id:d.id,provider:"grok",model:r.model,created:d.created,delta:{...l.delta.role&&{role:l.delta.role},...l.delta.content&&{content:l.delta.content}},...l.finish_reason&&{finishReason:this.convertFinishReason(l.finish_reason)},isComplete:l.finish_reason!==null});}catch{continue}}}}convertFinishReason(e){switch(e){case "stop":return "stop";case "length":return "length";case "content_filter":return "content_filter";default:return "error"}}calculateCost(e,r){let o=M.MODEL_PRICING[r];if(!o)return;let n=e.promptTokens/1e6*o.input,s=e.completionTokens/1e6*o.output;return {promptCost:n,completionCost:s,totalCost:n+s,currency:"USD"}}getModelContextLength(e){return {"grok-beta":128e3,"grok-vision-beta":128e3}[e]||128e3}getModelMaxTokens(e){return {"grok-beta":4096,"grok-vision-beta":4096}[e]||4096}handleAxiosError(e){var n,s,i,a,c;let r=(n=e.response)==null?void 0:n.status,o=(s=e.response)==null?void 0:s.data;return r===401?this.createError("authentication","INVALID_API_KEY","Invalid API key provided",401,{originalError:o}):r===429?this.createError("rate_limit","RATE_LIMIT_EXCEEDED","Rate limit exceeded",429,{originalError:o,retryAfter:(a=(i=e.response)==null?void 0:i.headers)==null?void 0:a["retry-after"]}):r===400?this.createError("validation","INVALID_REQUEST",((c=o==null?void 0:o.error)==null?void 0:c.message)||"Invalid request",400,{originalError:o}):r&&r>=500?this.createError("server_error","SERVER_ERROR","Grok server error",r,{originalError:o}):this.createError("network","REQUEST_FAILED",e.message||"Request failed",r,{originalError:o})}};M.MODEL_PRICING={"grok-beta":{input:5,output:15},"grok-vision-beta":{input:5,output:15}},M.SUPPORTED_MODELS=["grok-beta","grok-vision-beta"];var _=M;var P=class{constructor(t,e={}){this.providers=new Map;this.metrics=new Map;this.healthCheckInterval=null;this.configManager=t,this.options={enableFallback:true,retryAttempts:3,retryDelay:1e3,circuitBreaker:{enabled:true,failureThreshold:5,resetTimeout:6e4},...e};}async initialize(){var r;let t=this.configManager.validateConfig();if(!t.isValid)throw this.createRouterError("INITIALIZATION_FAILED",`Configuration validation failed: ${t.errors.join(", ")}`);let e=[];for(let o of t.validProviders)try{let n=this.configManager.getProviderConfig(o),s=this.createProvider(o,n);await s.getHealth(),this.providers.set(o,s),this.initializeMetrics(o);}catch(n){let s=n instanceof Error?n.message:String(n);e.push(`${o}: ${s}`),console.warn(`Failed to initialize provider ${o}:`,n),n&&typeof n=="object"&&(n.code==="ENOTFOUND"||n.code==="ECONNREFUSED"?console.error(`Network error occurred during ${o} initialization:`,{code:n.code,hostname:n.hostname,port:n.port}):n.response?console.error(`HTTP error during ${o} initialization:`,{status:n.response.status,statusText:n.response.statusText,data:n.response.data}):n.type==="authentication"?console.error(`Authentication error for ${o}:`,{message:s,provider:o}):console.error(`Unexpected error during ${o} initialization:`,{name:n.name,message:s,stack:(r=n.stack)==null?void 0:r.split(`
`).slice(0,3).join(`
`)}));}if(this.providers.size===0){let o=e.length>0?` Errors: ${e.join("; ")}`:"";throw this.createRouterError("NO_PROVIDERS_AVAILABLE",`No providers could be initialized.${o}`)}console.info(`Successfully initialized ${this.providers.size} provider(s): ${Array.from(this.providers.keys()).join(", ")}`);}async chat(t){let e=this.selectProvider(t);if(!e)throw this.createRouterError("NO_PROVIDER_AVAILABLE","No suitable provider available for request");try{let r=Date.now(),o=await this.executeWithRetry(e,"chat",t),n=Date.now()-r;return this.recordSuccess(e.name,n),o}catch(r){if(this.recordFailure(e.name),this.options.enableFallback&&this.isRetryableError(r))return this.executeWithFallback("chat",t,e.name);throw this.mapProviderError(r,e.name)}}async chatStream(t){let e=this.selectProvider(t);if(!e)throw this.createRouterError("NO_PROVIDER_AVAILABLE","No suitable provider available for streaming request");try{let r=Date.now(),o=await e.chatStream(t),n=Date.now()-r;return this.recordSuccess(e.name,n),o}catch(r){throw this.recordFailure(e.name),this.mapProviderError(r,e.name)}}getMetrics(){return new Map(this.metrics)}getAvailableProviders(){return Array.from(this.providers.keys())}isProviderAvailable(t){if(!this.providers.has(t))return false;let e=this.metrics.get(t);return e?!e.isCircuitOpen:false}resetCircuitBreaker(t){let e=this.metrics.get(t);e&&(e.isCircuitOpen=false,e.failures=0,delete e.lastFailure);}async destroy(){for(let[t,e]of this.providers)try{typeof e.destroy=="function"&&await e.destroy();}catch(r){console.warn(`Error cleaning up provider ${t}:`,r);}this.providers.clear(),this.metrics.clear(),this.healthCheckInterval&&(clearInterval(this.healthCheckInterval),this.healthCheckInterval=null),console.info("ProviderRouter cleanup completed");}selectProvider(t){if(t.provider&&this.isProviderAvailable(t.provider))return this.providers.get(t.provider)||null;let e=this.getProviderForModel(t.model);if(e&&this.isProviderAvailable(e))return this.providers.get(e)||null;try{let r=this.configManager.getDefaultProvider();if(this.isProviderAvailable(r))return this.providers.get(r)||null}catch{}for(let[r,o]of this.providers)if(this.isProviderAvailable(r))return o;return null}getProviderForModel(t){return {"gpt-4":"openai","gpt-4-turbo-preview":"openai","gpt-4-0125-preview":"openai","gpt-4o":"openai","gpt-4o-mini":"openai","gpt-3.5-turbo":"openai","gpt-3.5-turbo-16k":"openai","claude-3-5-sonnet-20241022":"claude","claude-3-opus-20240229":"claude","claude-3-sonnet-20240229":"claude","claude-3-haiku-20240307":"claude","llama-3.1-70b-versatile":"groq","llama-3.1-8b-instant":"groq","mixtral-8x7b-32768":"groq","gemma-7b-it":"groq","gemma2-9b-it":"groq","grok-beta":"grok","grok-vision-beta":"grok"}[t]||null}createProvider(t,e){switch(t){case "openai":return new x(e);case "claude":return new w(e);case "groq":return new L(e);case "grok":return new _(e);default:throw this.createRouterError("UNSUPPORTED_PROVIDER",`Unsupported provider: ${t}`)}}async executeWithRetry(t,e,r){let o=this.configManager.getRetryConfig(),n;for(let s=1;s<=o.maxAttempts;s++)try{return e==="chat"?await t.chat(r):await t.chatStream(r)}catch(i){if(n=i,!this.isRetryableError(i)||s===o.maxAttempts)throw i;let a=Math.min(this.options.retryDelay*Math.pow(o.backoffMultiplier,s-1),o.maxDelay);await this.sleep(a);}throw n}async executeWithFallback(t,e,r){let o=this.configManager.getFallbackConfig();if(!o.enabled)throw this.createRouterError("FALLBACK_DISABLED","Fallback is disabled");for(let n of o.providers){if(n===r||!this.isProviderAvailable(n))continue;let s=this.providers.get(n);if(s)try{let i={...e,provider:n};return t==="chat"?await s.chat(i):await s.chatStream(i)}catch{this.recordFailure(n);continue}}throw this.createRouterError("ALL_FALLBACKS_FAILED","All fallback providers failed")}isRetryableError(t){if(!t||typeof t!="object")return false;let e=t;return e.type==="rate_limit"||e.type==="server_error"||e.type==="network"||e.retryable===true}mapProviderError(t,e){return t&&typeof t=="object"&&"type"in t?t:{name:"LLMCoreError",type:"unknown",code:"PROVIDER_ERROR",message:t instanceof Error?t.message:"Unknown provider error",provider:e,retryable:false,timestamp:Date.now()}}initializeMetrics(t){this.metrics.set(t,{requests:0,failures:0,successRate:1,averageLatency:0,isCircuitOpen:false});}recordSuccess(t,e){let r=this.metrics.get(t);r&&(r.requests++,r.averageLatency=(r.averageLatency*(r.requests-1)+e)/r.requests,r.successRate=(r.requests-r.failures)/r.requests,r.isCircuitOpen&&this.shouldResetCircuitBreaker(r)&&(r.isCircuitOpen=false));}recordFailure(t){var r;let e=this.metrics.get(t);e&&(e.requests++,e.failures++,e.successRate=(e.requests-e.failures)/e.requests,e.lastFailure=new Date,(r=this.options.circuitBreaker)!=null&&r.enabled&&this.shouldOpenCircuitBreaker(e)&&(e.isCircuitOpen=true));}shouldOpenCircuitBreaker(t){var r;let e=((r=this.options.circuitBreaker)==null?void 0:r.failureThreshold)||5;return t.failures>=e}shouldResetCircuitBreaker(t){var r;if(!t.lastFailure)return true;let e=((r=this.options.circuitBreaker)==null?void 0:r.resetTimeout)||6e4;return Date.now()-t.lastFailure.getTime()>e}sleep(t){return new Promise(e=>setTimeout(e,t))}createRouterError(t,e){return {name:"LLMCoreError",type:"network",code:t,message:e,provider:"router",retryable:false,timestamp:Date.now()}}};var A=class{constructor(t,e={}){this.isInitialized=false;this.configManager=new T(t),this.options={autoInitialize:true,healthCheckInterval:3e5,enableMetrics:true,logLevel:"info",...e},this.router=new P(this.configManager,e),this.options.autoInitialize&&this.initialize().catch(r=>{this.log("error","Auto-initialization failed:",r);});}async initialize(){try{this.log("info","Initializing LLMCore...");let t=this.configManager.validateConfig();if(!t.isValid)throw new Error(`Configuration validation failed: ${t.errors.join(", ")}`);t.warnings.length>0&&this.log("warn","Configuration warnings:",t.warnings),await this.router.initialize(),this.isInitialized=!0,this.log("info",`LLMCore initialized with providers: ${this.router.getAvailableProviders().join(", ")}`),this.options.healthCheckInterval&&this.options.healthCheckInterval>0&&this.startHealthChecks();}catch(t){throw this.log("error","Failed to initialize LLMCore:",t),t}}async chat(t,e={}){this.ensureInitialized();let r={messages:t,model:e.model||this.getDefaultModel(e.provider),provider:e.provider||this.getDefaultProvider(),...e};try{this.log("debug","Sending chat request:",{provider:r.provider,model:r.model,messageCount:t.length});let o=await this.router.chat(r);return this.log("debug","Chat response received:",{provider:o.provider,model:o.model,finishReason:o.finishReason}),o}catch(o){throw this.log("error","Chat request failed:",o),this.enhanceError(o,r)}}async chatStream(t,e={}){this.ensureInitialized();let r={messages:t,model:e.model||this.getDefaultModel(e.provider),provider:e.provider||this.getDefaultProvider(),stream:true,...e};try{this.log("debug","Sending streaming chat request:",{provider:r.provider,model:r.model,messageCount:t.length});let o=await this.router.chatStream(r);return this.log("debug","Streaming chat response initiated:",{provider:r.provider,model:r.model}),o}catch(o){throw this.log("error","Streaming chat request failed:",o),this.enhanceError(o,r)}}async getModels(t){this.ensureInitialized();let e=t?[t]:this.router.getAvailableProviders(),r=[];for(let o of e)try{this.log("debug",`Getting models for provider: ${o}`);}catch(n){this.log("warn",`Failed to get models for provider ${o}:`,n);}return r}async estimateCost(t,e={}){this.ensureInitialized();let r={messages:t,model:e.model||this.getDefaultModel(e.provider),provider:e.provider||this.getDefaultProvider(),...e};try{return this.log("debug","Estimating cost for request:",{provider:r.provider,model:r.model,messageCount:t.length}),0}catch(o){return this.log("warn","Cost estimation failed:",o),0}}getStatus(){return {isInitialized:this.isInitialized,availableProviders:this.isInitialized?this.router.getAvailableProviders():[],defaultProvider:this.isInitialized?this.getDefaultProvider():null,metrics:this.isInitialized?this.router.getMetrics():new Map,...this.healthCheckTimer&&{lastHealthCheck:new Date}}}updateProviderConfig(t,e){this.configManager.updateProviderConfig(t,e),this.log("info",`Updated configuration for provider: ${t}`);}removeProviderConfig(t){this.configManager.removeProviderConfig(t),this.log("info",`Removed configuration for provider: ${t}`);}resetCircuitBreaker(t){this.isInitialized&&(this.router.resetCircuitBreaker(t),this.log("info",`Reset circuit breaker for provider: ${t}`));}async runHealthChecks(){this.isInitialized&&(this.log("debug","Running health checks..."),this.log("debug","Health checks completed"));}async shutdown(){this.log("info","Shutting down LLMCore..."),this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=void 0),this.isInitialized=false,this.log("info","LLMCore shutdown complete");}async complete(t,e={}){let r=[{role:"user",content:t}];return (await this.chat(r,e)).message.content}async ask(t,e,r={}){let o=[];return e&&o.push({role:"system",content:e}),o.push({role:"user",content:t}),(await this.chat(o,r)).message.content}ensureInitialized(){if(!this.isInitialized)throw new Error("LLMCore is not initialized. Call initialize() first or enable autoInitialize.")}getDefaultProvider(){try{return this.configManager.getDefaultProvider()}catch{throw new Error("No default provider available. Please check your configuration.")}}getDefaultModel(t){let e=t||this.getDefaultProvider();return this.configManager.getDefaultModel(e)}startHealthChecks(){this.healthCheckTimer&&clearInterval(this.healthCheckTimer),this.healthCheckTimer=setInterval(async()=>{try{await this.runHealthChecks();}catch(t){this.log("error","Health check failed:",t);}},this.options.healthCheckInterval),this.log("debug",`Health checks started with interval: ${this.options.healthCheckInterval}ms`);}enhanceError(t,e){return "type"in t&&"provider"in t?t:{name:"LLMCoreError",type:"unknown",code:"REQUEST_FAILED",message:t.message,provider:e.provider,retryable:false,timestamp:Date.now(),details:{originalError:t.name,requestModel:e.model,requestProvider:e.provider}}}log(t,e,...r){if(this.options.logLevel==="none")return;let o=["debug","info","warn","error"],n=this.options.logLevel||"info",s=o.indexOf(t),i=o.indexOf(n);if(s>=i){let a=new Date().toISOString();console[t](`[${a}] [LLMCore:${t.toUpperCase()}]`,e,...r);}}};var S=class{static standardize(t,e={}){let r=Date.now(),o=e.startTime?r-e.startTime:void 0,n={...t.metadata,requestTimestamp:e.startTime||r,responseTimestamp:r,...o&&{processingTime:o},...e.includeRaw&&{raw:t},...e.providerMetadata&&{providerMetadata:e.providerMetadata},...e.calculateCost&&t.usage&&{cost:this.calculateResponseCost(t)},capabilities:this.detectCapabilities(t),quality:this.assessQuality(t)};return {...t,metadata:n}}static standardizeStream(t,e,r){let o=Date.now(),n={...t.metadata,chunkIndex:e,streamStartTime:r,latency:o-r,bufferSize:JSON.stringify(t).length,requestTimestamp:r,responseTimestamp:o};return {...t,metadata:n}}static normalizeResponse(t,e){switch(e){case "openai":return this.normalizeOpenAIResponse(t);case "claude":return this.normalizeClaudeResponse(t);case "groq":return this.normalizeGroqResponse(t);case "grok":return this.normalizeGrokResponse(t);default:throw new Error(`Unsupported provider for normalization: ${e}`)}}static standardizeUsage(t,e){let r={promptTokens:0,completionTokens:0,totalTokens:0};switch(e){case "openai":case "groq":case "grok":return {promptTokens:t.prompt_tokens||0,completionTokens:t.completion_tokens||0,totalTokens:t.total_tokens||0,...t.processing_time&&{processingTime:t.processing_time},...t.queue_time&&{queueTime:t.queue_time}};case "claude":return {promptTokens:t.input_tokens||0,completionTokens:t.output_tokens||0,totalTokens:(t.input_tokens||0)+(t.output_tokens||0)};default:return r}}static standardizeError(t,e){let r={name:"LLMCoreError",type:"unknown",code:"UNKNOWN_ERROR",message:"An unknown error occurred",provider:e,retryable:false,timestamp:Date.now()};switch(e){case "openai":return this.standardizeOpenAIError(t,r);case "claude":return this.standardizeClaudeError(t,r);case "groq":return this.standardizeGroqError(t,r);case "grok":return this.standardizeGrokError(t,r);default:return {...r,message:t.message||r.message}}}static calculateResponseCost(t){if(!t.usage)return {inputCost:0,outputCost:0,totalCost:0,currency:"USD"};let e=this.getModelPricing(t.model,t.provider),r=t.usage.promptTokens/e.inputUnit*e.inputPrice,o=t.usage.completionTokens/e.outputUnit*e.outputPrice;return {inputCost:r,outputCost:o,totalCost:r+o,currency:e.currency}}static detectCapabilities(t){return {streaming:false,tools:!!(t.message.role==="assistant"&&t.message.toolCalls&&t.message.toolCalls.length>0),vision:this.hasVisionContent(t.message),multimodal:this.hasMultimodalContent(t.message)}}static assessQuality(t){var n;let e=t.message.content.length,o=t.message.role==="assistant"&&((n=t.message.toolCalls)==null?void 0:n.length);return {completeness:Math.min(e/100,1),confidence:t.finishReason==="stop"?.9:.7,relevance:o?.95:.8}}static normalizeOpenAIResponse(t){var o;let e=(o=t.choices)==null?void 0:o[0];if(!e)throw new Error("No choices in OpenAI response");let r={role:"assistant",content:e.message.content||"",...e.message.tool_calls&&{toolCalls:e.message.tool_calls.map(n=>({id:n.id,type:"function",function:{name:n.function.name,arguments:n.function.arguments}}))}};return {id:t.id,provider:"openai",model:t.model,message:r,finishReason:e.finish_reason,created:t.created,...t.usage&&{usage:this.standardizeUsage(t.usage,"openai")}}}static normalizeClaudeResponse(t){var r,o;let e={role:"assistant",content:((o=(r=t.content)==null?void 0:r[0])==null?void 0:o.text)||"",...t.tool_use&&{toolCalls:t.tool_use.map(n=>({id:n.id,type:"function",function:{name:n.name,arguments:JSON.stringify(n.input)}}))}};return {id:t.id,provider:"claude",model:t.model,message:e,finishReason:t.stop_reason,created:Date.now(),...t.usage&&{usage:this.standardizeUsage(t.usage,"claude")}}}static normalizeGroqResponse(t){return this.normalizeOpenAIResponse(t)}static normalizeGrokResponse(t){return this.normalizeOpenAIResponse(t)}static standardizeOpenAIError(t,e){var o;let r=((o=t.response)==null?void 0:o.status)||t.status;return r===401?{...e,type:"authentication",code:"INVALID_API_KEY",retryable:false}:r===429?{...e,type:"rate_limit",code:"RATE_LIMIT_EXCEEDED",retryable:true}:r>=500?{...e,type:"server_error",code:"SERVER_ERROR",retryable:true}:{...e,message:t.message||e.message}}static standardizeClaudeError(t,e){var o,n;let r=(o=t.error)==null?void 0:o.type;return r==="authentication_error"?{...e,type:"authentication",code:"INVALID_API_KEY",retryable:false}:r==="rate_limit_error"?{...e,type:"rate_limit",code:"RATE_LIMIT_EXCEEDED",retryable:true}:r==="server_error"?{...e,type:"server_error",code:"SERVER_ERROR",retryable:true}:{...e,message:((n=t.error)==null?void 0:n.message)||e.message}}static standardizeGroqError(t,e){return this.standardizeOpenAIError(t,e)}static standardizeGrokError(t,e){return this.standardizeOpenAIError(t,e)}static getModelPricing(t,e){return {openai:{inputPrice:.0015,outputPrice:.002,inputUnit:1e3,outputUnit:1e3,currency:"USD"},claude:{inputPrice:3,outputPrice:15,inputUnit:1e6,outputUnit:1e6,currency:"USD"},groq:{inputPrice:.59,outputPrice:.79,inputUnit:1e6,outputUnit:1e6,currency:"USD"},grok:{inputPrice:5,outputPrice:15,inputUnit:1e6,outputUnit:1e6,currency:"USD"}}[e]}static hasVisionContent(t){var r;return t.role!=="user"?false:!!((r=t.attachments)!=null&&r.some(o=>o.type==="image"))}static hasMultimodalContent(t){var r;let e=t.role==="assistant"&&((r=t.toolCalls)==null?void 0:r.length);return this.hasVisionContent(t)||!!e}};var V=class{constructor(t={}){this.isActive=false;this.options={maxReconnectAttempts:3,reconnectDelay:1e3,reconnectBackoffMultiplier:2,maxReconnectDelay:3e4,bufferSize:1024*64,bufferTimeout:5e3,ignoreErrors:false,debug:false,...t,errorCallback:t.errorCallback||(()=>{}),onChunk:t.onChunk||(()=>{})},this.metrics={startTime:Date.now(),totalChunks:0,totalBytes:0,avgChunkSize:0,reconnectAttempts:0,errors:0,latencies:[]};}async*createStream(t,e,r){this.isActive=true,this.metrics.startTime=Date.now();let o=0,n=0;for(;this.isActive&&n<=this.options.maxReconnectAttempts;)try{this.abortController=new AbortController;let s=await r(t,this.abortController.signal);for await(let i of s.stream){if(!this.isActive)break;try{let a=JSON.stringify(i).length;this.updateMetrics(a,o);let c=S.standardizeStream(i,o,this.metrics.startTime);if(this.options.onChunk(i,o),yield c,o++,i.isComplete){this.debug(`Stream completed after ${o} chunks`);break}}catch(a){if(this.handleChunkError(a,o),!this.options.ignoreErrors)throw a}}break}catch(s){let i=s;if(this.debug(`Stream error: ${i.message}`),this.shouldReconnect(i,n)){n++,this.metrics.reconnectAttempts++;let c=Math.min(this.options.reconnectDelay*Math.pow(this.options.reconnectBackoffMultiplier,n-1),this.options.maxReconnectDelay);this.debug(`Reconnecting in ${c}ms (attempt ${n}/${this.options.maxReconnectAttempts})`),await this.delay(c);continue}let a=S.standardizeError(i,e);throw this.options.errorCallback(a),a}this.metrics.endTime=Date.now(),this.isActive=false;}async*createBufferedStream(t,e,r){let o=[],n,s=()=>{if(o.length>0){let a=[...o];return o.length=0,a}return null},i=()=>{