@catalystlabs/tryai
Version:
Dead simple AI library. One line setup. Zero config. Just works.
13 lines (9 loc) • 496 kB
JavaScript
"use strict";var Sq=Object.create;var On=Object.defineProperty;var Oq=Object.getOwnPropertyDescriptor;var Iq=Object.getOwnPropertyNames;var $q=Object.getPrototypeOf,kq=Object.prototype.hasOwnProperty;var xe=(n,e)=>()=>(n&&(e=n(n=0)),e);var l=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),pl=(n,e)=>{for(var t in e)On(n,t,{get:e[t],enumerable:!0})},dl=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Iq(e))!kq.call(n,i)&&i!==t&&On(n,i,{get:()=>e[i],enumerable:!(r=Oq(e,i))||r.enumerable});return n};var ms=(n,e,t)=>(t=n!=null?Sq($q(n)):{},dl(e||!n||!n.__esModule?On(t,"default",{value:n,enumerable:!0}):t,n)),Nq=n=>dl(On({},"__esModule",{value:!0}),n);async function*ae(n){if(!n.body)throw new Error("Response body is null");let e=n.body.getReader(),t=new TextDecoder,r="";try{for(;;){let{done:i,value:s}=await e.read();if(i){if(r.trim()){let a=ml(r);a&&(yield a)}break}r+=t.decode(s,{stream:!0});let o=r.split(/\r\n\r\n|\n\n/);r=o.pop()||"";for(let a of o)if(a.trim()){let u=ml(a);u&&(yield u)}}}finally{e.releaseLock()}}function ml(n){let e=n.split(/\r\n|\n/),t={};for(let r of e){if(r.startsWith(":"))continue;let i=r.indexOf(":");if(i===-1)continue;let s=r.substring(0,i),o=r.substring(i+1);switch(o.startsWith(" ")&&(o=o.substring(1)),s){case"event":t.event=o;break;case"data":t.data=t.data?t.data+`
`+o:o;break;case"id":t.id=o;break;case"retry":t.retry=parseInt(o,10);break}}return!t.data&&!t.event?null:t}function Mq(n,e={}){return{...e,headers:{...e.headers,Accept:"text/event-stream","Cache-Control":"no-cache"}}}var rt=xe(()=>{"use strict"});var nt,fs=xe(()=>{"use strict";rt();nt=class{config;baseURL;headers;constructor(e){if(this.config=e,e.baseURL?this.baseURL=e.baseURL.replace(/\/v1\/?$/,"").replace(/\/$/,""):this.baseURL="https://api.openai.com",!e.apiKey)throw new Error("OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass apiKey in config.");this.validateApiKey(),this.headers={Authorization:`Bearer ${this.config.apiKey}`,"Content-Type":"application/json"}}async complete(e,t){let r=this.formatInput(e,t),i={model:t?.model||this.config.model||"gpt-4.1",input:r,temperature:t?.temperature??this.config.temperature??.7,...t?.maxTokens&&{max_output_tokens:t.maxTokens},...t?.topP!==void 0&&{top_p:t.topP},...t?.frequencyPenalty!==void 0&&{frequency_penalty:t.frequencyPenalty},...t?.presencePenalty!==void 0&&{presence_penalty:t.presencePenalty},...t?.stop&&{stop:t.stop},...t?.tools&&{tools:this.convertTools(t.tools)},...t?.toolChoice&&{tool_choice:t.toolChoice},...t?.responseFormat&&{text:{format:t.responseFormat}},...t?.reasoning&&{reasoning:t.reasoning},...t?.previousResponseId&&{previous_response_id:t.previousResponseId},...t?.store!==void 0&&{store:t.store}};try{let s=await fetch(`${this.baseURL}/v1/responses`,{method:"POST",headers:this.headers,body:JSON.stringify(i)});if(!s.ok){let u;try{u=await s.json()}catch{throw new Error(`OpenAI API error: ${s.status} ${s.statusText}`)}throw u.error?new Error(`OpenAI API error: ${u.error.message||"Unknown error"} (type: ${u.error.type}, code: ${u.error.code||"none"})`):new Error(`OpenAI API error: ${s.status} ${s.statusText}`)}let o=await s.json();if(o.status==="incomplete")throw new Error(`OpenAI response incomplete: ${o.incomplete_details?.reason||"unknown reason"}`);let a=this.extractTextFromOutput(o.output);if(!a)throw new Error("No text content in OpenAI response");return{content:a,model:o.model,usage:o.usage?{promptTokens:o.usage.input_tokens,completionTokens:o.usage.output_tokens,totalTokens:o.usage.total_tokens}:void 0}}catch(s){throw s.message.includes("OpenAI")?s:new Error(`OpenAI request failed: ${s.message}`)}}async*stream(e,t){let r=this.formatInput(e,t),i={model:t?.model||this.config.model||"gpt-4.1",input:r,temperature:t?.temperature??this.config.temperature??.7,stream:!0,...t?.maxTokens&&{max_output_tokens:t.maxTokens},...t?.topP!==void 0&&{top_p:t.topP},...t?.frequencyPenalty!==void 0&&{frequency_penalty:t.frequencyPenalty},...t?.presencePenalty!==void 0&&{presence_penalty:t.presencePenalty},...t?.stop&&{stop:t.stop},...t?.tools&&{tools:this.convertTools(t.tools)},...t?.toolChoice&&{tool_choice:t.toolChoice},...t?.responseFormat&&{text:{format:t.responseFormat}},...t?.reasoning&&{reasoning:t.reasoning},...t?.previousResponseId&&{previous_response_id:t.previousResponseId},...t?.store!==void 0&&{store:t.store}};try{let s=await fetch(`${this.baseURL}/v1/responses`,{method:"POST",headers:this.headers,body:JSON.stringify(i)});if(!s.ok){let a;try{a=await s.json()}catch{throw new Error(`OpenAI streaming error: ${s.status} ${s.statusText}`)}if(a.error){let u=a.error,c=`OpenAI streaming error: ${u.message||"Unknown error"} (type: ${u.type||"unknown"})`;throw u.type==="invalid_request_error"&&u.code==="invalid_api_key"?new Error(`${c} - Please check your OpenAI API key`):new Error(c)}throw new Error(`OpenAI streaming error: ${s.status} ${s.statusText}`)}let o="";for await(let a of ae(s)){if(!a.data)continue;if(a.data==="[DONE]")break;let u;try{u=JSON.parse(a.data)}catch{console.warn("Failed to parse OpenAI stream event:",a.data);continue}switch(u.type){case"response.output_item.added":break;case"response.output_text.delta":u.text&&(o+=u.text,yield{content:u.text,model:this.config.model||"gpt-4.1"});break;case"response.function_call_arguments.delta":console.debug("Function call delta:",u.delta);break;case"response.completed":break;case"response.error":throw new Error(`OpenAI streaming error: ${u.error?.message||"Unknown error"}`);default:break}}}catch(s){throw s.code==="ECONNRESET"||s.code==="ETIMEDOUT"?new Error(`OpenAI streaming connection error: ${s.message} - The connection was interrupted`):s.message.includes("OpenAI")?s:new Error(`OpenAI streaming failed: ${s.message}`)}}async moderate(e,t){try{let r=await fetch(`${this.baseURL}/v1/moderations`,{method:"POST",headers:this.headers,body:JSON.stringify({input:e,model:t||"omni-moderation-latest"})});if(!r.ok){let i;try{i=await r.json()}catch{throw new Error(`OpenAI moderation error: ${r.status} ${r.statusText}`)}if(i.error)throw new Error(`OpenAI moderation error: ${i.error.message||"Unknown error"}`)}return await r.json()}catch(r){throw new Error(`Failed to moderate content: ${r.message}`)}}async listModels(){try{let e=await fetch(`${this.baseURL}/v1/models`,{method:"GET",headers:this.headers});if(!e.ok)throw new Error(`Failed to list models: ${e.status} ${e.statusText}`);return(await e.json()).data||[]}catch(e){throw new Error(`Failed to list OpenAI models: ${e.message}`)}}formatInput(e,t){return typeof e=="string"?e:Array.isArray(e)?e.map(r=>this.validateMessage(r)):e}validateMessage(e){if(!Array.isArray(e.content))throw new Error("Message content must be an array of content items");let t=e.content.map(r=>{if(r.type==="input_file"){if(!r.file_url&&!r.file_id&&!r.file_data)throw new Error("input_file must have either file_url, file_id, or file_data");r.file_data&&!r.filename&&console.warn("Base64 file data provided without filename")}if(r.type==="input_image"){if(!r.image_url&&!r.file_id)throw new Error("input_image must have either image_url or file_id");r.detail||(r.detail="auto")}if(r.type==="input_text"&&!r.text)throw new Error("input_text must have text content");return r});return{...e,content:t}}extractTextFromOutput(e){let t=[];for(let r of e)if(r.type==="message"&&r.content)for(let i of r.content)i.type==="output_text"&&i.text&&t.push(i.text);return t.join("")}convertTools(e){return e.map(t=>t.type==="function"?{type:"function",name:t.name,description:t.description,parameters:t.parameters,strict:t.strict??!1}:t)}async uploadFile(e,t="user_data",r){let i=new FormData;i.append("purpose",t);let s;if(e instanceof Buffer)s=new Blob([e]);else if(e instanceof Blob)s=e;else if(e instanceof ReadableStream){let o=e.getReader(),a=[];try{for(;;){let{done:p,value:d}=await o.read();if(p)break;a.push(d)}let u=a.reduce((p,d)=>p+d.length,0),c=new Uint8Array(u),h=0;for(let p of a)c.set(p,h),h+=p.length;s=new Blob([c])}catch(u){throw new Error(`Failed to read stream: ${u.message}`)}}else throw new Error("Unsupported file type. Must be Buffer, Blob, or ReadableStream");r?i.append("file",s,r):i.append("file",s);try{let o=await fetch(`${this.baseURL}/v1/files`,{method:"POST",headers:{Authorization:`Bearer ${this.config.apiKey}`},body:i});if(!o.ok){let u;try{u=await o.json()}catch{throw new Error(`File upload failed: ${o.status} ${o.statusText}`)}throw u.error?new Error(`File upload failed: ${u.error.message||"Unknown error"} (type: ${u.error.type}, code: ${u.error.code||"none"})`):new Error(`File upload failed: ${o.status} ${o.statusText}`)}return(await o.json()).id}catch(o){throw o.message.includes("File upload failed")?o:new Error(`Failed to upload file: ${o.message}`)}}async deleteFile(e){try{let t=await fetch(`${this.baseURL}/v1/files/${e}`,{method:"DELETE",headers:this.headers});if(!t.ok){let i;try{i=await t.json()}catch{throw new Error(`Failed to delete file: ${t.status} ${t.statusText}`)}throw i.error?new Error(`Failed to delete file: ${i.error.message||"Unknown error"}`):new Error(`Failed to delete file: ${t.status} ${t.statusText}`)}return(await t.json()).deleted||!1}catch(t){throw t.message.includes("Failed to delete file")?t:new Error(`Error deleting file: ${t.message}`)}}async getFile(e){try{let t=await fetch(`${this.baseURL}/v1/files/${e}`,{method:"GET",headers:this.headers});if(!t.ok){let r;try{r=await t.json()}catch{throw new Error(`Failed to retrieve file: ${t.status} ${t.statusText}`)}throw r.error?new Error(`Failed to retrieve file: ${r.error.message||"Unknown error"}`):new Error(`Failed to retrieve file: ${t.status} ${t.statusText}`)}return await t.json()}catch(t){throw t.message.includes("Failed to retrieve file")?t:new Error(`Error retrieving file: ${t.message}`)}}async listFiles(e){try{let t=new URL(`${this.baseURL}/v1/files`);e&&t.searchParams.append("purpose",e);let r=await fetch(t.toString(),{method:"GET",headers:this.headers});if(!r.ok){let s;try{s=await r.json()}catch{throw new Error(`Failed to list files: ${r.status} ${r.statusText}`)}throw s.error?new Error(`Failed to list files: ${s.error.message||"Unknown error"}`):new Error(`Failed to list files: ${r.status} ${r.statusText}`)}return(await r.json()).data||[]}catch(t){throw t.message.includes("Failed to list files")?t:new Error(`Error listing files: ${t.message}`)}}async createEmbedding(e,t="text-embedding-3-small"){try{let r=await fetch(`${this.baseURL}/v1/embeddings`,{method:"POST",headers:this.headers,body:JSON.stringify({input:e,model:t})});if(!r.ok){let s;try{s=await r.json()}catch{throw new Error(`Embedding creation failed: ${r.status} ${r.statusText}`)}throw s.error?new Error(`Embedding creation failed: ${s.error.message||"Unknown error"}`):new Error(`Embedding creation failed: ${r.status} ${r.statusText}`)}let i=await r.json();return{embeddings:i.data.map(s=>s.embedding),usage:i.usage}}catch(r){throw r.message.includes("Embedding creation failed")?r:new Error(`Failed to create embedding: ${r.message}`)}}async createSpeech(e,t="alloy",r="tts-1"){try{let i=await fetch(`${this.baseURL}/v1/audio/speech`,{method:"POST",headers:this.headers,body:JSON.stringify({model:r,input:e,voice:t})});if(!i.ok){let s;try{s=await i.json()}catch{throw new Error(`Speech creation failed: ${i.status} ${i.statusText}`)}throw s.error?new Error(`Speech creation failed: ${s.error.message||"Unknown error"}`):new Error(`Speech creation failed: ${i.status} ${i.statusText}`)}return await i.arrayBuffer()}catch(i){throw i.message.includes("Speech creation failed")?i:new Error(`Failed to create speech: ${i.message}`)}}async createTranscription(e,t="whisper-1",r){let i=new FormData;i.append("model",t),e instanceof Buffer?i.append("file",new Blob([e]),"audio.mp3"):i.append("file",e,"audio.mp3"),r&&i.append("language",r);try{let s=await fetch(`${this.baseURL}/v1/audio/transcriptions`,{method:"POST",headers:{Authorization:`Bearer ${this.config.apiKey}`},body:i});if(!s.ok){let o;try{o=await s.json()}catch{throw new Error(`Transcription failed: ${s.status} ${s.statusText}`)}throw o.error?new Error(`Transcription failed: ${o.error.message||"Unknown error"}`):new Error(`Transcription failed: ${s.status} ${s.statusText}`)}return await s.json()}catch(s){throw s.message.includes("Transcription failed")?s:new Error(`Failed to transcribe audio: ${s.message}`)}}buildMessages(e,t,r){let i=[];if(e&&i.push({role:"system",content:[{type:"input_text",text:e}]}),r&&r.length>0)for(let s of r)i.push({role:s.role,content:[{type:"input_text",text:s.content}]});return i.push({role:"user",content:[{type:"input_text",text:t}]}),i}validateApiKey(){if(!this.config.apiKey)throw new Error("OpenAI API key is required");this.config.apiKey.startsWith("sk-")||console.warn('OpenAI API key should start with "sk-"')}}});var Pr,fl=xe(()=>{"use strict";rt();Pr=class{config;baseURL;headers;constructor(e){if(this.config=e,this.baseURL=e.baseURL||"https://api.anthropic.com",!e.apiKey)throw new Error("Anthropic API key is required. Set ANTHROPIC_API_KEY environment variable or pass apiKey in config.");this.validateApiKey(),this.headers={"x-api-key":this.config.apiKey,"Content-Type":"application/json","anthropic-version":"2023-06-01","anthropic-beta":["files-api-2025-04-14","search-results-2025-06-09","mcp-client-2025-04-04","interleaved-thinking-2025-05-14"].join(",")}}async complete(e,t){let{requestBody:r}=this.prepareRequest(e,t,!1);try{let i=await fetch(`${this.baseURL}/v1/messages`,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!i.ok)throw this.handleErrorResponse(i,await this.safeJsonParse(i));let s=await i.json(),o=this.extractTextContent(s.content);if(!o)throw new Error("No text content in Anthropic response");return{content:o,model:s.model,usage:s.usage?{promptTokens:s.usage.input_tokens,completionTokens:s.usage.output_tokens,totalTokens:s.usage.input_tokens+s.usage.output_tokens}:void 0}}catch(i){throw i.message.includes("Anthropic")?i:new Error(`Anthropic request failed: ${i.message}`)}}async*stream(e,t){let{requestBody:r}=this.prepareRequest(e,t,!0);try{let i=await fetch(`${this.baseURL}/v1/messages`,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!i.ok)throw this.handleErrorResponse(i,await this.safeJsonParse(i));for await(let s of ae(i)){if(!s.data||s.data==="[DONE]"||s.event==="ping")continue;let o;try{o=JSON.parse(s.data)}catch{console.warn("Failed to parse Anthropic stream chunk:",s.data);continue}switch(o.type){case"content_block_delta":o.delta?.type==="text_delta"&&o.delta.text?yield{content:o.delta.text,model:r.model}:o.delta?.type==="thinking_delta"&&o.delta.thinking?yield{content:o.delta.thinking,model:r.model,metadata:{type:"thinking"}}:o.delta?.type==="input_json_delta"&&o.delta.partial_json&&(yield{content:o.delta.partial_json,model:r.model,metadata:{type:"tool_input"}});break;case"content_block_start":o.content_block?.type==="thinking"?yield{content:"",model:r.model,metadata:{type:"thinking_start"}}:o.content_block?.type==="tool_use"&&(yield{content:"",model:r.model,metadata:{type:"tool_use_start",tool_name:o.content_block.name,tool_id:o.content_block.id}});break;case"message_start":break;case"message_delta":break;case"message_stop":return;case"error":let a=typeof o.message=="string"?o.message:o.error?.message||"Unknown streaming error";throw new Error(`Anthropic streaming error: ${a}`)}}}catch(i){throw i.message.includes("Anthropic")?i:new Error(`Anthropic streaming failed: ${i.message}`)}}async listModels(e,t,r=20){try{let i=new URL(`${this.baseURL}/v1/models`);e&&i.searchParams.append("before_id",e),t&&i.searchParams.append("after_id",t),r!==20&&i.searchParams.append("limit",r.toString());let s=await fetch(i.toString(),{method:"GET",headers:this.headers});if(!s.ok)throw new Error(`Failed to list models: ${s.status} ${s.statusText}`);return(await s.json()).data||[]}catch(i){throw new Error(`Failed to list Anthropic models: ${i.message}`)}}async uploadFile(e,t){let r=new FormData,i=e instanceof Buffer?new Blob([e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)]):e;t?r.append("file",i,t):r.append("file",i);try{let s=await fetch(`${this.baseURL}/v1/files`,{method:"POST",headers:{"x-api-key":this.config.apiKey,"anthropic-version":"2023-06-01","anthropic-beta":"files-api-2025-04-14"},body:r});if(!s.ok){let a;try{a=await s.json()}catch{throw new Error(`File upload failed: ${s.status} ${s.statusText}`)}throw a.error?new Error(`File upload failed: ${a.error.message||"Unknown error"}`):new Error(`File upload failed: ${s.status} ${s.statusText}`)}return(await s.json()).id}catch(s){throw s.message.includes("File upload failed")?s:new Error(`Failed to upload file: ${s.message}`)}}async deleteFile(e){try{let t=await fetch(`${this.baseURL}/v1/files/${e}`,{method:"DELETE",headers:{"x-api-key":this.config.apiKey,"anthropic-version":"2023-06-01","anthropic-beta":"files-api-2025-04-14"}});if(!t.ok){let r;try{r=await t.json()}catch{throw new Error(`Failed to delete file: ${t.status} ${t.statusText}`)}throw r.error?new Error(`Failed to delete file: ${r.error.message||"Unknown error"}`):new Error(`Failed to delete file: ${t.status} ${t.statusText}`)}return!0}catch(t){throw t.message.includes("Failed to delete file")?t:new Error(`Error deleting file: ${t.message}`)}}async getFile(e){try{let t=await fetch(`${this.baseURL}/v1/files/${e}`,{method:"GET",headers:{"x-api-key":this.config.apiKey,"anthropic-version":"2023-06-01","anthropic-beta":"files-api-2025-04-14"}});if(!t.ok){let r;try{r=await t.json()}catch{throw new Error(`Failed to retrieve file: ${t.status} ${t.statusText}`)}throw r.error?new Error(`Failed to retrieve file: ${r.error.message||"Unknown error"}`):new Error(`Failed to retrieve file: ${t.status} ${t.statusText}`)}return await t.json()}catch(t){throw t.message.includes("Failed to retrieve file")?t:new Error(`Error retrieving file: ${t.message}`)}}async listFiles(){try{let e=await fetch(`${this.baseURL}/v1/files`,{method:"GET",headers:{"x-api-key":this.config.apiKey,"anthropic-version":"2023-06-01","anthropic-beta":"files-api-2025-04-14"}});if(!e.ok){let r;try{r=await e.json()}catch{throw new Error(`Failed to list files: ${e.status} ${e.statusText}`)}throw r.error?new Error(`Failed to list files: ${r.error.message||"Unknown error"}`):new Error(`Failed to list files: ${e.status} ${e.statusText}`)}return(await e.json()).data||[]}catch(e){throw e.message.includes("Failed to list files")?e:new Error(`Error listing files: ${e.message}`)}}async downloadFile(e){try{let t=await fetch(`${this.baseURL}/v1/files/${e}/content`,{method:"GET",headers:{"x-api-key":this.config.apiKey,"anthropic-version":"2023-06-01","anthropic-beta":"files-api-2025-04-14"}});if(!t.ok)throw new Error(`Failed to download file: ${t.status} ${t.statusText}`);return await t.arrayBuffer()}catch(t){throw new Error(`Error downloading file: ${t.message}`)}}buildMessages(e,t,r){let i=[];if(r&&r.length>0)for(let s of r)i.push({role:s.role,content:s.content});return i.push({role:"user",content:t}),{system:e||void 0,messages:i}}createImageMessage(e,t,r="image/jpeg"){return{role:"user",content:[{type:"image",source:{type:"base64",media_type:r,data:t}},{type:"text",text:e}]}}createDocumentMessage(e,t,r,i=!0){return{role:"user",content:[{type:"document",source:{type:"file",file_id:t},title:r,citations:i?{enabled:!0}:void 0},{type:"text",text:e}]}}createSearchResultsMessage(e,t){let r=[];for(let i of t)r.push({type:"search_result",source:i.source,title:i.title,content:[{type:"text",text:i.content}],citations:{enabled:!0}});return r.push({type:"text",text:e}),{role:"user",content:r}}prepareRequest(e,t,r=!1){let i=t?.system,s=[];typeof e=="string"?s=[{role:"user",content:e}]:s=Array.isArray(e)?e:[e];let o=s.find(u=>u.role==="system");o&&(i=i||(typeof o.content=="string"?o.content:this.extractTextContent(o.content)),s=s.filter(u=>u.role!=="system"));let a={model:t?.model||this.config.model||"claude-sonnet-4-20250514",messages:s,max_tokens:t?.maxTokens||this.config.maxTokens||4096,temperature:t?.temperature??this.config.temperature??.7,...r&&{stream:!0},...i&&{system:i},...t?.topP!==void 0&&{top_p:t.topP},...t?.topK!==void 0&&{top_k:t.topK},...t?.stopSequences&&{stop_sequences:t.stopSequences},...t?.tools&&{tools:this.convertTools(t.tools)},...t?.toolChoice&&{tool_choice:this.convertToolChoice(t.toolChoice)},...t?.thinking&&{thinking:{type:"enabled",budget_tokens:t.thinking.budget_tokens||1e4}},...t?.mcpServers&&{mcp_servers:t.mcpServers},...t?.serviceTier&&{service_tier:t.serviceTier},...t?.container&&{container:t.container},...t?.metadata&&{metadata:t.metadata}};return{system:i,messages:s,requestBody:a}}extractTextContent(e){return e.filter(r=>r.type==="text"&&r.text).map(r=>r.text).join("")}convertTools(e){return e.map(t=>t.type==="function"?{name:t.function?.name||t.name,description:t.function?.description||t.description||"",input_schema:t.function?.parameters||t.parameters||{type:"object",properties:{},required:[]}}:t).filter(Boolean)}convertToolChoice(e){if(typeof e=="string")switch(e){case"none":return{type:"none"};case"auto":return{type:"auto"};case"required":return{type:"any"};default:return{type:"auto"}}return e?.type==="function"&&e?.function?.name?{type:"tool",name:e.function.name}:e||{type:"auto"}}validateApiKey(){if(!this.config.apiKey)throw new Error("Anthropic API key is required");this.config.apiKey.startsWith("sk-ant-")||console.warn('Anthropic API key should start with "sk-ant-"')}handleErrorResponse(e,t){if(t?.error){let r=t.error;return new Error(`Anthropic API error: ${r.message||"Unknown error"} (type: ${r.type})`)}else if(t?.type==="error")return new Error(`Anthropic API error: ${t.message||"Unknown error"}`);return new Error(`Anthropic API error: ${e.status} ${e.statusText}`)}async safeJsonParse(e){try{return await e.json()}catch{return null}}}});var it,gs=xe(()=>{"use strict";rt();it=class{config;baseURL;headers;constructor(e){if(this.config=e,this.baseURL=e.baseURL||"https://generativelanguage.googleapis.com/v1beta/openai",!e.apiKey)throw new Error("Google Gemini API key is required. Set GEMINI_API_KEY environment variable or pass apiKey in config.");this.validateApiKey(),this.headers={Authorization:`Bearer ${this.config.apiKey}`,"Content-Type":"application/json","User-Agent":"AI-Forge/1.0"}}async complete(e,t){let{requestBody:r}=this.prepareRequest(e,t,!1);try{let i=await fetch(`${this.baseURL}/chat/completions`,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!i.ok)throw this.handleErrorResponse(i,await this.safeJsonParse(i));let s=await i.json(),o=this.extractTextContent(s);if(!o)throw new Error("No text content in Google Gemini response");return{content:o,model:s.model,usage:s.usage?{promptTokens:s.usage.prompt_tokens,completionTokens:s.usage.completion_tokens,totalTokens:s.usage.total_tokens}:void 0,metadata:s.usage?.thinking_tokens?{thinkingTokens:s.usage.thinking_tokens}:void 0}}catch(i){throw i.message.includes("Google")?i:new Error(`Google Gemini request failed: ${i.message}`)}}async*stream(e,t){let{requestBody:r}=this.prepareRequest(e,t,!0);try{let i=await fetch(`${this.baseURL}/chat/completions`,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!i.ok)throw this.handleErrorResponse(i,await this.safeJsonParse(i));for await(let s of ae(i)){if(!s.data||s.data==="[DONE]")continue;let o;try{o=JSON.parse(s.data)}catch{console.warn("Failed to parse Google Gemini stream chunk:",s.data);continue}let a=o.choices?.[0]?.delta;a?.content&&(yield{content:a.content,model:o.model||r.model})}}catch(i){throw i.message.includes("Google")?i:new Error(`Google Gemini streaming failed: ${i.message}`)}}async listModels(){try{let e=await fetch(`${this.baseURL}/models`,{method:"GET",headers:this.headers});if(!e.ok){let r;try{r=await e.json()}catch{throw new Error(`Failed to list models: ${e.status} ${e.statusText}`)}throw r.error?new Error(`Failed to list models: ${r.error.message||"Unknown error"}`):new Error(`Failed to list models: ${e.status} ${e.statusText}`)}return(await e.json()).data||[]}catch(e){throw e.message.includes("Failed to list models")?e:new Error(`Failed to list Google Gemini models: ${e.message}`)}}async getModel(e){try{let t=await fetch(`${this.baseURL}/models/${e}`,{method:"GET",headers:this.headers});if(!t.ok)throw new Error(`Failed to retrieve model: ${t.status} ${t.statusText}`);return await t.json()}catch(t){throw new Error(`Failed to get Google Gemini model info: ${t.message}`)}}async createEmbedding(e,t="gemini-embedding-001"){try{let r=await fetch(`${this.baseURL}/embeddings`,{method:"POST",headers:this.headers,body:JSON.stringify({model:t,input:e})});if(!r.ok){let s;try{s=await r.json()}catch{throw new Error(`Embedding creation failed: ${r.status} ${r.statusText}`)}throw s.error?new Error(`Embedding creation failed: ${s.error.message||"Unknown error"}`):new Error(`Embedding creation failed: ${r.status} ${r.statusText}`)}let i=await r.json();return{embeddings:i.data.map(s=>s.embedding),usage:i.usage}}catch(r){throw r.message.includes("Embedding creation failed")?r:new Error(`Failed to create embedding: ${r.message}`)}}async createSpeech(e,t="gemini-2.5-flash-preview-tts",r){try{let s=await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${t}:generateContent`,{method:"POST",headers:{Authorization:`Bearer ${this.config.apiKey}`,"Content-Type":"application/json"},body:JSON.stringify({contents:[{parts:[{text:e}]}],generationConfig:{responseFormat:"audio",...r}})});if(!s.ok){let o;try{o=await s.json()}catch{throw new Error(`Speech creation failed: ${s.status} ${s.statusText}`)}throw o.error?new Error(`Speech creation failed: ${o.error.message||"Unknown error"}`):new Error(`Speech creation failed: ${s.status} ${s.statusText}`)}return await s.arrayBuffer()}catch(i){throw i.message.includes("Speech creation failed")?i:new Error(`Failed to create speech: ${i.message}`)}}async generateImage(e,t="imagen-3.0-generate-002",r){try{let i=await fetch(`${this.baseURL}/images/generations`,{method:"POST",headers:this.headers,body:JSON.stringify({model:t,prompt:e,n:r?.n||1,size:r?.size||"1024x1024",response_format:r?.response_format||"url",quality:r?.quality||"standard"})});if(!i.ok){let s;try{s=await i.json()}catch{throw new Error(`Image generation failed: ${i.status} ${i.statusText}`)}throw s.error?new Error(`Image generation failed: ${s.error.message||"Unknown error"}`):new Error(`Image generation failed: ${i.status} ${i.statusText}`)}return await i.json()}catch(i){throw i.message.includes("Image generation failed")?i:new Error(`Failed to generate image: ${i.message}`)}}createMultimodalMessage(e,t){let r=[{type:"text",text:e}];for(let i of t)i.type==="image"?r.push({type:"image_url",image_url:{url:i.url||`data:image/${i.format||"jpeg"};base64,${i.data}`}}):i.type==="audio"?r.push({type:"input_audio",input_audio:{data:i.data,format:i.format||"wav"}}):i.type==="video"&&r.push({type:"input_video",input_video:{data:i.data,format:i.format||"mp4"}});return{role:"user",content:r}}async structuredCompletion(e,t,r){let i={...r,responseFormat:{type:"json_schema",json_schema:t}},s=await this.complete(e,i);try{return JSON.parse(s.content)}catch(o){throw new Error(`Failed to parse structured response: ${o}`)}}buildMessages(e,t,r){let i=[];if(e&&i.push({role:"system",content:e}),r&&r.length>0)for(let s of r)i.push({role:s.role,content:s.content});return i.push({role:"user",content:t}),i}prepareRequest(e,t,r=!1){let i=[];typeof e=="string"?i=[{role:"user",content:e}]:i=Array.isArray(e)?e:[e];let s={model:t?.model||this.config.model||"gemini-2.5-flash",messages:i,temperature:t?.temperature??this.config.temperature??.7,max_tokens:t?.maxTokens||this.config.maxTokens||2048,...r&&{stream:!0},...t?.topP!==void 0&&{top_p:t.topP},...t?.tools&&{tools:this.convertTools(t.tools)},...t?.toolChoice&&{tool_choice:t.toolChoice},...t?.responseFormat&&{response_format:t.responseFormat},...t?.reasoning&&{reasoning_effort:this.mapReasoningEffort(t.reasoning)},extra_body:{google:{...t?.thinking&&{thinking_config:{thinking_budget:t.thinking.budget_tokens||8192,include_thoughts:!0}},...t?.safety&&{safety_settings:this.convertSafetySettings(t.safety)},...t?.cachedContent&&{cached_content:t.cachedContent}}}};return{messages:i,requestBody:s}}extractTextContent(e){let t=e.choices?.[0];return t?.message?.content?t.message.content:""}convertTools(e){return e.map(t=>t.type==="function"?{type:"function",function:{name:t.function?.name||t.name,description:t.function?.description||t.description||"",parameters:t.function?.parameters||t.parameters||{type:"object",properties:{},required:[]}}}:t).filter(Boolean)}mapReasoningEffort(e){return typeof e=="string"?e:e?.effort?e.effort:"medium"}convertSafetySettings(e){let t=[{category:"HARM_CATEGORY_HARASSMENT",threshold:"BLOCK_MEDIUM_AND_ABOVE"},{category:"HARM_CATEGORY_HATE_SPEECH",threshold:"BLOCK_MEDIUM_AND_ABOVE"},{category:"HARM_CATEGORY_SEXUALLY_EXPLICIT",threshold:"BLOCK_MEDIUM_AND_ABOVE"},{category:"HARM_CATEGORY_DANGEROUS_CONTENT",threshold:"BLOCK_MEDIUM_AND_ABOVE"}];return Array.isArray(e)?e:t}validateApiKey(){if(!this.config.apiKey)throw new Error("Google Gemini API key is required");this.config.apiKey.startsWith("AIza")||console.warn('Google Gemini API key should typically start with "AIza"')}handleErrorResponse(e,t){if(t?.error){let r=t.error;return new Error(`Google Gemini API error: ${r.message||r||"Unknown error"} (status: ${e.status})`)}return new Error(`Google Gemini API error: ${e.status} ${e.statusText}`)}async safeJsonParse(e){try{return await e.json()}catch{return null}}}});var Rr,gl=xe(()=>{"use strict";rt();Rr=class{config;baseURL;headers;constructor(e){if(this.config=e,this.baseURL=e.baseURL||"https://api.llama.com/v1",!e.apiKey)throw new Error("Llama API key is required. Set LLAMA_API_KEY environment variable or pass apiKey in config.");this.validateApiKey(),this.headers={Authorization:`Bearer ${this.config.apiKey}`,"Content-Type":"application/json","User-Agent":"AI-Forge/1.0"}}async complete(e,t){let{requestBody:r}=this.prepareRequest(e,t,!1);try{let i=await fetch(`${this.baseURL}/chat/completions`,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!i.ok)throw this.handleErrorResponse(i,await this.safeJsonParse(i));let s=await i.json(),o=this.extractTextContent(s);if(!o)throw new Error("No text content in Llama response");let a=this.parseRateLimitHeaders(i);return{content:o,model:s.model||r.model,usage:s.metrics?{promptTokens:this.extractMetricValue(s.metrics,"num_prompt_tokens"),completionTokens:this.extractMetricValue(s.metrics,"num_completion_tokens"),totalTokens:this.extractMetricValue(s.metrics,"num_prompt_tokens")+this.extractMetricValue(s.metrics,"num_completion_tokens")}:void 0,metadata:a?{rateLimit:a}:void 0}}catch(i){throw i.message.includes("Llama")?i:new Error(`Llama request failed: ${i.message}`)}}async*stream(e,t){let{requestBody:r}=this.prepareRequest(e,t,!0);try{let i=await fetch(`${this.baseURL}/chat/completions`,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!i.ok)throw this.handleErrorResponse(i,await this.safeJsonParse(i));for await(let s of ae(i)){if(!s.data||s.data==="[DONE]")continue;let o;try{o=JSON.parse(s.data)}catch{console.warn("Failed to parse Llama stream chunk:",s.data);continue}if(o.event&&o.event.event_type==="progress"){let a=o.event.delta;a&&a.text&&(yield{content:a.text,model:o.model||r.model})}if(o.event&&o.event.event_type==="tool_call_progress"){let a=o.event.delta;a&&a.arguments&&(yield{content:a.arguments,model:o.model||r.model,metadata:{type:"tool_arguments"}})}}}catch(i){throw i.code==="ECONNRESET"||i.code==="ETIMEDOUT"?new Error(`Llama streaming connection error: ${i.message} - The connection was interrupted`):i.message.includes("Llama")?i:new Error(`Llama streaming failed: ${i.message}`)}}async listModels(){try{let e=await fetch(`${this.baseURL}/models`,{method:"GET",headers:this.headers});if(!e.ok){let r;try{r=await e.json()}catch{throw new Error(`Failed to list models: ${e.status} ${e.statusText}`)}throw r.error?new Error(`Failed to list models: ${r.error.message||"Unknown error"}`):new Error(`Failed to list models: ${e.status} ${e.statusText}`)}return(await e.json()).data||[]}catch(e){throw e.message.includes("Failed to list models")?e:new Error(`Failed to list Llama models: ${e.message}`)}}async moderate(e,t="Llama-Guard"){try{let r={messages:e,model:t},i=await fetch(`${this.baseURL}/moderations`,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!i.ok){let s;try{s=await i.json()}catch{throw new Error(`Llama moderation error: ${i.status} ${i.statusText}`)}throw s.error?new Error(`Llama moderation error: ${s.error.message||"Unknown error"}`):new Error(`Llama moderation error: ${i.status} ${i.statusText}`)}return await i.json()}catch(r){throw r.message.includes("Llama moderation")?r:new Error(`Failed to moderate content: ${r.message}`)}}async createStructuredCompletion(e,t,r){let i={...r,responseFormat:{type:"json_schema",json_schema:t},temperature:r?.temperature??.1,maxTokens:r?.maxTokens||1024};return this.complete(e,i)}createImageMessage(e,t,r){return{role:"user",content:[{type:"text",text:e},{type:"image_url",image_url:{url:t,alt_text:r}}]}}createMultiImageMessage(e,t){let r=[{type:"text",text:e}];for(let i of t.slice(0,9))r.push({type:"image_url",image_url:{url:i.url,alt_text:i.alt_text}});return{role:"user",content:r}}buildMessages(e,t,r){let i=[];if(e&&i.push({role:"system",content:e}),r&&r.length>0)for(let s of r)i.push({role:s.role,content:s.content});return i.push({role:"user",content:t}),i}createBase64ImageMessage(e,t,r="image/jpeg",i){let s=`data:${r};base64,${t}`;return{role:"user",content:[{type:"text",text:e},{type:"image_url",image_url:{url:s,alt_text:i}}]}}estimateImageTokens(e,t){if(e<=336&&t<=336)return{tiles:1,tokens:147};let r=Math.ceil(e/336),i=Math.ceil(t/336),s=r*i,o=s*145+2+147;return{tiles:s,tokens:o}}estimateTokens(e,t){let r=0,i=0,s=[];if(typeof e=="string")r=Math.ceil(e.length/4);else for(let o of e)if(typeof o.content=="string")r+=Math.ceil(o.content.length/4);else if(Array.isArray(o.content))for(let a of o.content)a.type==="text"&&a.text&&(r+=Math.ceil(a.text.length/4));if(t)for(let o of t){let a=this.estimateImageTokens(o.width,o.height);i+=a.tokens,s.push({width:o.width,height:o.height,tiles:a.tiles,tokens:a.tokens})}return{textTokens:r,imageTokens:i,totalTokens:r+i,imageBreakdown:s.length>0?s:void 0}}parseRateLimitHeaders(e){let t=e.headers.get("x-ratelimit-limit-tokens"),r=e.headers.get("x-ratelimit-remaining-tokens"),i=e.headers.get("x-ratelimit-limit-requests"),s=e.headers.get("x-ratelimit-remaining-requests");return!t||!r||!i||!s?null:{limitTokens:parseInt(t),remainingTokens:parseInt(r),limitRequests:parseInt(i),remainingRequests:parseInt(s)}}createConversationMemory(e=10){return{messages:[],maxHistory:e,totalTokens:0}}addToConversationMemory(e,t,r){let i={...e};if(i.messages.push(t),r)i.totalTokens+=r;else{let s=this.estimateTokens([t]);i.totalTokens+=s.totalTokens}if(i.messages.length>i.maxHistory){let s=i.messages.find(a=>a.role==="system"),o=i.messages.slice(-(i.maxHistory-(s?1:0)));i.messages=s?[s,...o.filter(a=>a.role!=="system")]:o}return i}async summarizeText(e,t="Summarize the following text in a concise manner:",r){let i=[{role:"system",content:"You are a summarization assistant. Create concise summaries that capture the key points of the provided text."},{role:"user",content:`${t}
Text to process:
${e}`}];return this.complete(i,{maxTokens:200,temperature:.3,...r})}async answerQuestion(e,t,r){let i=[{role:"system",content:"You are a precise question-answering assistant. When answering questions, use only the information provided in the context. If the answer cannot be determined from the context, say so."},{role:"user",content:`Context:
${e}
Question: ${t}`}];return this.complete(i,{maxTokens:150,temperature:.1,...r})}async simpleRAG(e,t,r=3,i){let s=[],o=t.toLowerCase().split(" ").filter(c=>c.length>2);for(let c of e){let h=o.reduce((p,d)=>{let f=(c.toLowerCase().match(new RegExp(d,"g"))||[]).length;return p+f},0);h>0&&s.push({doc:c,score:h})}s.sort((c,h)=>h.score-c.score);let u=s.slice(0,r).map(c=>c.doc).join(`
`);return this.answerQuestion(u,t,i)}async moderateWorkflow(e,t="Llama-Guard"){let r=await this.moderate(e,t);if(!!r.results.some(c=>c.flagged))return{inputSafe:!1,moderationDetails:{input:r}};let s=await this.complete(e),o=[...e,{role:"assistant",content:s.content}],a=await this.moderate(o,t),u=!a.results.some(c=>c.flagged);return{inputSafe:!0,response:u?s:void 0,outputSafe:u,moderationDetails:{input:r,output:a}}}prepareRequest(e,t,r=!1){let i=[];typeof e=="string"?i=[{role:"user",content:e}]:i=Array.isArray(e)?e:[e];let s={model:t?.model||this.config.model||"Llama-4-Maverick-17B-128E-Instruct-FP8",messages:i,max_tokens:t?.maxTokens||this.config.maxTokens||256,temperature:t?.temperature??this.config.temperature??.7,top_p:t?.topP??.7,...r&&{stream:!0},...t?.stop&&{stop:Array.isArray(t.stop)?t.stop:[t.stop]},...t?.tools&&{tools:this.convertTools(t.tools)},...t?.toolChoice&&{tool_choice:t.toolChoice},...t?.responseFormat&&{response_format:t.responseFormat},...t?.responseFormat?.type==="json_schema"&&{response_format:{type:"json_schema",json_schema:t.responseFormat.json_schema}},...t?.responseFormat&&{max_completion_tokens:t.maxTokens||1024}};return{messages:i,requestBody:s}}extractTextContent(e){let t=e.completion_message;if(!t)return"";if(typeof t.content=="string")return t.content;if(t.content&&typeof t.content=="object"){if(!Array.isArray(t.content)&&"text"in t.content&&t.content.text)return t.content.text;if(Array.isArray(t.content))return t.content.filter(r=>r.type==="text"&&r.text).map(r=>r.text).join("");if(!Array.isArray(t.content)&&"type"in t.content&&t.content.type==="text"&&"text"in t.content&&t.content.text)return t.content.text}return""}extractMetricValue(e,t){let r=e.find(i=>i.metric===t);return r?r.value:0}convertTools(e){return e.map(t=>t.type==="function"?{type:"function",function:{name:t.function?.name||t.name,description:t.function?.description||t.description||"",parameters:t.function?.parameters||t.parameters||{type:"object",properties:{},required:[],additionalProperties:!1},strict:t.function?.strict??!0}}:t).filter(Boolean)}validateApiKey(){if(!this.config.apiKey)throw new Error("Llama API key is required");this.config.apiKey.length<10&&console.warn("Llama API key seems unusually short")}handleErrorResponse(e,t){if(t?.error){let r=t.error;return new Error(`Llama API error: ${r.message||r||"Unknown error"} (status: ${e.status})`)}return new Error(`Llama API error: ${e.status} ${e.statusText}`)}async safeJsonParse(e){try{return await e.json()}catch{return null}}}});var st,ys=xe(()=>{"use strict";rt();st=class{config;baseURL;headers;sdkClient;tools=new Map;constructor(e){this.config=e,this.baseURL=e.baseURL||"http://localhost:1234/v1",this.config.apiKey="not-required",this.headers={"Content-Type":"application/json","User-Agent":"AI-Forge/1.0"},this.initializeSDK()}async initializeSDK(){try{let{LMStudioClient:e}=await import("@lmstudio/sdk");this.sdkClient=new e}catch{console.debug("LM Studio SDK not available, using REST API only")}}async complete(e,t){let r=Array.isArray(e)?e:t?.messages||[{role:"user",content:e}],i={model:t?.model||this.config.model||"local-model",messages:r,temperature:t?.temperature??this.config.temperature??.7,max_tokens:t?.maxTokens||this.config.maxTokens||2048,...t?.topP!==void 0&&{top_p:t.topP},...t?.topK!==void 0&&{top_k:t.topK},...t?.frequencyPenalty!==void 0&&{frequency_penalty:t.frequencyPenalty},...t?.presencePenalty!==void 0&&{presence_penalty:t.presencePenalty},...t?.stopSequences&&{stop:t.stopSequences},repeat_penalty:1.1,seed:-1};try{let s=await fetch(`${this.baseURL}/chat/completions`,{method:"POST",headers:this.headers,body:JSON.stringify(i)});if(s.status===404)throw new Error("LM Studio server not found. Make sure LM Studio is running and the server is started.");if(s.status===503)throw new Error("No model loaded in LM Studio. Please load a model first.");if(!s.ok){let u;try{u=await s.json()}catch{throw new Error(`LM Studio API error: ${s.status} ${s.statusText}`)}throw u.error?new Error(`LM Studio API error: ${u.error.message||"Unknown error"}`):new Error(`LM Studio API error: ${s.status} ${s.statusText}`)}let o=await s.json(),a=o.choices?.[0];if(!a)throw new Error("No response from LM Studio");return{content:a.message?.content||a.text||null,model:o.model||i.model,usage:o.usage?{promptTokens:o.usage.prompt_tokens||0,completionTokens:o.usage.completion_tokens||0,totalTokens:o.usage.total_tokens||0}:void 0}}catch(s){throw s.message.includes("LM Studio")?s:s instanceof TypeError&&s.message.includes("fetch")?new Error("Cannot connect to LM Studio. Make sure it's running on "+this.baseURL):new Error(`LM Studio request failed: ${s.message}`)}}async*stream(e,t){let r=Array.isArray(e)?e:t?.messages||[{role:"user",content:e}],i={model:t?.model||this.config.model||"local-model",messages:r,temperature:t?.temperature??this.config.temperature??.7,max_tokens:t?.maxTokens||this.config.maxTokens||2048,stream:!0,...t?.topP!==void 0&&{top_p:t.topP},...t?.topK!==void 0&&{top_k:t.topK},repeat_penalty:1.1,seed:-1};try{let s=await fetch(`${this.baseURL}/chat/completions`,{method:"POST",headers:this.headers,body:JSON.stringify(i)});if(s.status===404)throw new Error("LM Studio server not found. Make sure LM Studio is running and the server is started.");if(s.status===503)throw new Error("No model loaded in LM Studio. Please load a model first.");if(!s.ok){let o;try{o=await s.json()}catch{throw new Error(`LM Studio streaming error: ${s.status} ${s.statusText}`)}throw o.error?new Error(`LM Studio streaming error: ${o.error.message||"Unknown error"}`):new Error(`LM Studio streaming error: ${s.status} ${s.statusText}`)}for await(let o of ae(s)){if(!o.data)continue;if(o.data==="[DONE]")break;let a;try{a=JSON.parse(o.data)}catch{console.warn("Failed to parse LM Studio stream chunk:",o.data);continue}let u=a.choices?.[0]?.delta;u?.content&&(yield{content:u.content,model:a.model||i.model,id:a.id||`lmstudio-${Date.now()}`})}}catch(s){throw s.code==="ECONNRESET"||s.code==="ETIMEDOUT"?new Error(`LM Studio streaming connection error: ${s.message} - The connection was interrupted`):s.message?.includes("404")?new Error("LM Studio server not found. Make sure LM Studio is running and the server is started."):s.message?.includes("503")?new Error("No model loaded in LM Studio. Please load a model first."):s.message?.includes("fetch")?new Error("Cannot connect to LM Studio. Make sure it's running on "+this.baseURL):s.message.includes("LM Studio")?s:new Error(`LM Studio streaming failed: ${s.message}`)}}async act(e,t,r){if(!this.sdkClient)throw new Error("LM Studio SDK not available. Install @lmstudio/sdk to use .act() method.");try{for(let u of t)this.tools.set(u.name,u);let i=r?.model||this.config.model||"qwen2.5-7b-instruct",s=await this.sdkClient.llm.model(i),o="",a=[];return typeof e=="string"?a.push({role:"user",content:e}):a.push(...e),await s.act(a,t,{maxRounds:r?.maxRounds||10,temperature:r?.temperature??this.config.temperature??.7,onMessage:u=>{r?.onMessage&&r.onMessage(u),o+=u.toString()},onPredictionFragment:r?.onPredictionFragment}),{content:o,model:this.config.model||"qwen2.5-7b-instruct"}}catch(i){throw i.message.includes("LM Studio")?i:new Error(`LM Studio .act() failed: ${i.message}`)}}createTool(e){return{name:e.name,description:e.description,parameters:e.parameters,implementation:e.implementation}}async listModels(){try{let e=await fetch(`${this.baseURL}/models`,{method:"GET",headers:this.headers});if(e.status===404)throw new Error("LM Studio server not found. Make sure LM Studio is running and the server is started.");if(!e.ok){let r;try{r=await e.json()}catch{throw new Error(`Failed to list models: ${e.status} ${e.statusText}`)}if(r.error)throw new Error(`Failed to list models: ${r.error.message||"Unknown error"}`)}return(await e.json()).data||[]}catch(e){throw e.message.includes("LM Studio")||e.message.includes("Failed to list models")?e:new Error(`Failed to list LM Studio models: ${e.message}`)}}async getServerStatus(){try{let e=await fetch(`${this.baseURL}/models`,{method:"GET",headers:this.headers});if(e.status===404)return{running:!1,modelLoaded:!1};let r=(await e.json()).data?.find(i=>i.owned_by==="lm-studio");return{running:!0,modelLoaded:!!r,modelName:r?.id,capabilities:["chat","completion","tools"]}}catch{return{running:!1,modelLoaded:!1}}}async loadModel(e){return(await this.getServerStatus()).running?{success:!1,message:`To load model "${e}", please use the LM Studio GUI: 1) Open LM Studio, 2) Go to the "My Models" tab, 3) Click the "Load Model" button next to your desired model, 4) Wait for the model to load completely.`}:{success:!1,message:"LM Studio server is not running. Please start LM Studio and enable the local server."}}async healthCheck(){let e=Date.now();try{let t=await this.getServerStatus(),r=Date.now()-e;return{healthy:t.running&&t.modelLoaded,serverRunning:t.running,modelLoaded:t.modelLoaded,latency:r}}catch{return{healthy:!1,serverRunning:!1,modelLoaded:!1,latency:Date.now()-e}}}async getModelInfo(e){try{let t=await this.listModels();if(e){let r=t.find(i=>i.id===e);if(!r)throw new Error(`Model "${e}" not found`);return r}return t.length>0?t[0]:null}catch(t){throw new Error(`Failed to get model info: ${t.message}`)}}buildMessages(e,t,r){let i=[];if(e&&i.push({role:"system",content:e}),r&&r.length>0)for(let s of r)i.push({role:s.role,content:s.content});return i.push({role:"user",content:t}),i}}});var Sr,yl=xe(()=>{"use strict";Sr=class{config;baseURL;headers;constructor(e){if(this.config=e,this.baseURL=e.baseURL||process.env.LLMROUTER_URL||"http://localhost:8000",!this.baseURL)throw new Error("LLMRouter URL is required. Set LLMROUTER_URL environment variable or pass baseURL in config.");this.headers={"Content-Type":"application/json","User-Agent":"TryAI/1.0"},(e.apiKey||process.env.LLMROUTER_API_KEY)&&(this.headers.Authorization=`Bearer ${e.apiKey||process.env.LLMROUTER_API_KEY}`)}async complete(e,t){let r=typeof e=="string"?e:this.messagesToPrompt(e),i=await this.getRouting(r,t),s=Date.now(),o=await this.executeWithRouting(r,i,t),a=Date.now()-s;return{...o,metadata:{...o.metadata,routingId:i.routing_id,selectedModel:i.selected_model,routingReason:i.routing_reason,dimensionalScores:i.dimensional_scores,priorityMode:i.priority_mode,estimatedCost:i.estimated_cost,cached:i.cached,responseTime:a},submitFeedback:async c=>{await this.submitFeedback({routing_id:i.routing_id,response_time:a,...c})}}}async stream(e,t){let r=typeof e=="string"?e:this.messagesToPrompt(e),i=await this.getRouting(r,t),s=await fetch(`${this.baseURL}/execute`,{method:"POST",headers:this.headers,body:JSON.stringify({routing_id:i.routing_id,prompt:r,model:i.selected_model,priority_mode:t?.priority||this.config.defaultPriority||"balanced",stream:!0,temperature:t?.temperature,max_tokens:t?.maxTokens})});if(!s.ok)throw new Error(`Router execution failed: ${s.statusText}`);return this.parseSSEStream(s.body)}async getRouting(e,t){let r=await fetch(`${this.baseURL}/route`,{method:"POST",headers:this.headers,body:JSON.stringify({prompt:e,priority_mode:t?.priority||this.config.defaultPriority||"balanced",max_tokens:t?.maxTokens,temperature:t?.temperature,tools:t?.tools,response_format:t?.responseFormat})});if(!r.ok){let i=await r.text();throw new Error(`Routing failed: ${i}`)}return r.json()}async executeWithRouting(e,t,r){let i=await fetch(`${this.baseURL}/execute`,{method:"POST",headers:this.headers,body:JSON.stringify({routing_id:t.routing_id,prompt:e,model:t.selected_model,priority_mode:r?.priority||t.priority_mode,stream:!1,temperature:r?.temperature,max_tokens:r?.maxTokens,tools:r?.tools,response_format:r?.responseFormat})});if(!i.ok){let o=await i.text();throw new Error(`Execution failed: ${o}`)}let s=await i.json();return{text:s.content||s.text||"",usage:s.usage,model:s.model||t.selected_model,metadata:{cost:s.cost,finishReason:s.finish_reason}}}async submitFeedback(e){try{let t=await fetch(`${this.baseURL}/feedback`,{method:"POST",headers:this.headers,body:JSON.stringify(e)});t.ok||console.error("Failed to submit feedback:",await t.text())}catch(t){console.error("Error submitting feedback:",t)}}messagesToPrompt(e){return e.map(t=>typeof t=="string"?t:t.content?t.content:t.text?t.text:JSON.stringify(t)).join(`
`)}async*parseSSEStream(e){let t=e.getReader(),r=new TextDecoder,i="";try{for(;;){let{done:s,value:o}=await t.read();if(s)break;i+=r.decode(o,{stream:!0});let a=i.split(`
`);i=a.pop()||"";for(let u of a)if(u.startsWith("data: ")){let c=u.slice(6);if(c==="[DONE]")return;try{yield JSON.parse(c)}catch(h){console.error("Failed to parse SSE chunk:",h)}}}}finally{t.releaseLock()}}async listModels(){return["auto"]}async embeddings(e){throw new Error("Embeddings not supported by Router provider. Use a specific provider.")}async moderate(e){throw new Error("Moderation not supported by Router provider. Use a specific provider.")}}});var _s=l(ws=>{"use strict";Object.defineProperty(ws,"__esModule",{value:!0});var bs=class extends Error{};ws.TimeoutError=bs});var vl=l(Cs=>{"use strict";Object.defineProperty(Cs,"__esModule",{value:!0});var vs=class{constructor(e){this._value=e.value,this._error=e.error}value(){return this._value}reason(){return this._error}isRejected(){return!!this._error}isFulfilled(){return!!this._value}};Cs.PromiseInspection=vs});var $n=l(ge=>{"use strict";Object.defineProperty(ge,"__esModule",{value:!0});var Cl=vl();function Qq(){let n=null,e=null;return{promise:new Promise((r,i)=>{n=r,e=i}),resolve:n,reject:e}}ge.defer=Qq;function Gq(){return Date.now()}ge.now=Gq;function Kq(n,e){return Math.abs(e-n)}ge.duration=Kq;function Wq(n){return typeof n>"u"?!0:xl(n)}ge.checkOptionalTime=Wq;function xl(n){return typeof n=="number"&&n===Math.round(n)&&n>0}ge.checkRequiredTime=xl;function zq(n){return new Promise(e=>setTimeout(