UNPKG

@catalystlabs/tryai

Version:

Dead simple AI library. One line setup. Zero config. Just works.

2 lines 9.09 kB
import{a as c}from"./chunk-LMOWCXXE.mjs";var l=class{config;baseURL;headers;constructor(t){if(this.config=t,this.baseURL=t.baseURL||"https://api.anthropic.com",!t.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(t,e){let{requestBody:r}=this.prepareRequest(t,e,!1);try{let s=await fetch(`${this.baseURL}/v1/messages`,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!s.ok)throw this.handleErrorResponse(s,await this.safeJsonParse(s));let n=await s.json(),a=this.extractTextContent(n.content);if(!a)throw new Error("No text content in Anthropic response");return{content:a,model:n.model,usage:n.usage?{promptTokens:n.usage.input_tokens,completionTokens:n.usage.output_tokens,totalTokens:n.usage.input_tokens+n.usage.output_tokens}:void 0}}catch(s){throw s.message.includes("Anthropic")?s:new Error(`Anthropic request failed: ${s.message}`)}}async*stream(t,e){let{requestBody:r}=this.prepareRequest(t,e,!0);try{let s=await fetch(`${this.baseURL}/v1/messages`,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!s.ok)throw this.handleErrorResponse(s,await this.safeJsonParse(s));for await(let n of c(s)){if(!n.data||n.data==="[DONE]"||n.event==="ping")continue;let a;try{a=JSON.parse(n.data)}catch{console.warn("Failed to parse Anthropic stream chunk:",n.data);continue}switch(a.type){case"content_block_delta":a.delta?.type==="text_delta"&&a.delta.text?yield{content:a.delta.text,model:r.model}:a.delta?.type==="thinking_delta"&&a.delta.thinking?yield{content:a.delta.thinking,model:r.model,metadata:{type:"thinking"}}:a.delta?.type==="input_json_delta"&&a.delta.partial_json&&(yield{content:a.delta.partial_json,model:r.model,metadata:{type:"tool_input"}});break;case"content_block_start":a.content_block?.type==="thinking"?yield{content:"",model:r.model,metadata:{type:"thinking_start"}}:a.content_block?.type==="tool_use"&&(yield{content:"",model:r.model,metadata:{type:"tool_use_start",tool_name:a.content_block.name,tool_id:a.content_block.id}});break;case"message_start":break;case"message_delta":break;case"message_stop":return;case"error":let o=typeof a.message=="string"?a.message:a.error?.message||"Unknown streaming error";throw new Error(`Anthropic streaming error: ${o}`)}}}catch(s){throw s.message.includes("Anthropic")?s:new Error(`Anthropic streaming failed: ${s.message}`)}}async listModels(t,e,r=20){try{let s=new URL(`${this.baseURL}/v1/models`);t&&s.searchParams.append("before_id",t),e&&s.searchParams.append("after_id",e),r!==20&&s.searchParams.append("limit",r.toString());let n=await fetch(s.toString(),{method:"GET",headers:this.headers});if(!n.ok)throw new Error(`Failed to list models: ${n.status} ${n.statusText}`);return(await n.json()).data||[]}catch(s){throw new Error(`Failed to list Anthropic models: ${s.message}`)}}async uploadFile(t,e){let r=new FormData,s=t instanceof Buffer?new Blob([t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)]):t;e?r.append("file",s,e):r.append("file",s);try{let n=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(!n.ok){let o;try{o=await n.json()}catch{throw new Error(`File upload failed: ${n.status} ${n.statusText}`)}throw o.error?new Error(`File upload failed: ${o.error.message||"Unknown error"}`):new Error(`File upload failed: ${n.status} ${n.statusText}`)}return(await n.json()).id}catch(n){throw n.message.includes("File upload failed")?n:new Error(`Failed to upload file: ${n.message}`)}}async deleteFile(t){try{let e=await fetch(`${this.baseURL}/v1/files/${t}`,{method:"DELETE",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 delete file: ${e.status} ${e.statusText}`)}throw r.error?new Error(`Failed to delete file: ${r.error.message||"Unknown error"}`):new Error(`Failed to delete file: ${e.status} ${e.statusText}`)}return!0}catch(e){throw e.message.includes("Failed to delete file")?e:new Error(`Error deleting file: ${e.message}`)}}async getFile(t){try{let e=await fetch(`${this.baseURL}/v1/files/${t}`,{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 retrieve file: ${e.status} ${e.statusText}`)}throw r.error?new Error(`Failed to retrieve file: ${r.error.message||"Unknown error"}`):new Error(`Failed to retrieve file: ${e.status} ${e.statusText}`)}return await e.json()}catch(e){throw e.message.includes("Failed to retrieve file")?e:new Error(`Error retrieving file: ${e.message}`)}}async listFiles(){try{let t=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(!t.ok){let r;try{r=await t.json()}catch{throw new Error(`Failed to list files: ${t.status} ${t.statusText}`)}throw r.error?new Error(`Failed to list files: ${r.error.message||"Unknown error"}`):new Error(`Failed to list files: ${t.status} ${t.statusText}`)}return(await t.json()).data||[]}catch(t){throw t.message.includes("Failed to list files")?t:new Error(`Error listing files: ${t.message}`)}}async downloadFile(t){try{let e=await fetch(`${this.baseURL}/v1/files/${t}/content`,{method:"GET",headers:{"x-api-key":this.config.apiKey,"anthropic-version":"2023-06-01","anthropic-beta":"files-api-2025-04-14"}});if(!e.ok)throw new Error(`Failed to download file: ${e.status} ${e.statusText}`);return await e.arrayBuffer()}catch(e){throw new Error(`Error downloading file: ${e.message}`)}}buildMessages(t,e,r){let s=[];if(r&&r.length>0)for(let n of r)s.push({role:n.role,content:n.content});return s.push({role:"user",content:e}),{system:t||void 0,messages:s}}createImageMessage(t,e,r="image/jpeg"){return{role:"user",content:[{type:"image",source:{type:"base64",media_type:r,data:e}},{type:"text",text:t}]}}createDocumentMessage(t,e,r,s=!0){return{role:"user",content:[{type:"document",source:{type:"file",file_id:e},title:r,citations:s?{enabled:!0}:void 0},{type:"text",text:t}]}}createSearchResultsMessage(t,e){let r=[];for(let s of e)r.push({type:"search_result",source:s.source,title:s.title,content:[{type:"text",text:s.content}],citations:{enabled:!0}});return r.push({type:"text",text:t}),{role:"user",content:r}}prepareRequest(t,e,r=!1){let s=e?.system,n=[];typeof t=="string"?n=[{role:"user",content:t}]:n=Array.isArray(t)?t:[t];let a=n.find(i=>i.role==="system");a&&(s=s||(typeof a.content=="string"?a.content:this.extractTextContent(a.content)),n=n.filter(i=>i.role!=="system"));let o={model:e?.model||this.config.model||"claude-sonnet-4-20250514",messages:n,max_tokens:e?.maxTokens||this.config.maxTokens||4096,temperature:e?.temperature??this.config.temperature??.7,...r&&{stream:!0},...s&&{system:s},...e?.topP!==void 0&&{top_p:e.topP},...e?.topK!==void 0&&{top_k:e.topK},...e?.stopSequences&&{stop_sequences:e.stopSequences},...e?.tools&&{tools:this.convertTools(e.tools)},...e?.toolChoice&&{tool_choice:this.convertToolChoice(e.toolChoice)},...e?.thinking&&{thinking:{type:"enabled",budget_tokens:e.thinking.budget_tokens||1e4}},...e?.mcpServers&&{mcp_servers:e.mcpServers},...e?.serviceTier&&{service_tier:e.serviceTier},...e?.container&&{container:e.container},...e?.metadata&&{metadata:e.metadata}};return{system:s,messages:n,requestBody:o}}extractTextContent(t){return t.filter(r=>r.type==="text"&&r.text).map(r=>r.text).join("")}convertTools(t){return t.map(e=>e.type==="function"?{name:e.function?.name||e.name,description:e.function?.description||e.description||"",input_schema:e.function?.parameters||e.parameters||{type:"object",properties:{},required:[]}}:e).filter(Boolean)}convertToolChoice(t){if(typeof t=="string")switch(t){case"none":return{type:"none"};case"auto":return{type:"auto"};case"required":return{type:"any"};default:return{type:"auto"}}return t?.type==="function"&&t?.function?.name?{type:"tool",name:t.function.name}:t||{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(t,e){if(e?.error){let r=e.error;return new Error(`Anthropic API error: ${r.message||"Unknown error"} (type: ${r.type})`)}else if(e?.type==="error")return new Error(`Anthropic API error: ${e.message||"Unknown error"}`);return new Error(`Anthropic API error: ${t.status} ${t.statusText}`)}async safeJsonParse(t){try{return await t.json()}catch{return null}}};export{l as a}; //# sourceMappingURL=chunk-MCZFF7ET.mjs.map