@swifty.js/swifty 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __swiftyCreateRequire } from "node:module";
3
3
  const require = __swiftyCreateRequire(import.meta.url);
4
- import{l as C}from"./chunk-DCI5RJC7.js";import{g as w}from"./chunk-H7VXSMJR.js";import{f as D,h as F,i as R}from"./chunk-KYXKZJ3Z.js";import{b as B,c as U,d as M,e as $,f as K,g as W}from"./chunk-FZPTNGTU.js";import"./chunk-7MHXMDYC.js";import{H as P,J as v,K as O,L as I,M as k,N as j,e as S,l as N}from"./chunk-4KVSJNS6.js";import"./chunk-MQ5XOYLD.js";import"./chunk-X3UA5OZL.js";var x=S({module:"llm"});var Y=3e3,q=P.object({max_input_tokens:P.coerce.number()});async function at(o){if(o.protocol!=="anthropic")return 0;let t=R(o),s=`${o.base_url.replace(/\/+$/,"")}/v1/models/${encodeURIComponent(o.model)}`,n=new AbortController,a=setTimeout(()=>{n.abort()},Y);try{let l=await fetch(s,{method:"GET",headers:{"anthropic-version":"2023-06-01",...t?{"x-api-key":t}:{}},signal:n.signal});if(!l.ok)return 0;let g=await l.json(),{success:h,error:d,data:f}=await N(q,g);if(!h)return console.error(d.message),0;let y=f.max_input_tokens;return Math.max(y,0)}catch(l){return console.error(l),0}finally{clearTimeout(a)}}function J(){return!0}function H(o){return(o??[]).map(t=>({type:"image",source:{type:"base64",media_type:t.mediaType,data:t.data}}))}function L(o){let t=[];return(o.content||!o.images?.length)&&t.push({type:"text",text:o.content}),t.push(...H(o.images)),t}function z(o){let t=[];for(let e of o)if(e.role==="assistant"){let s=[];if(e.thinkingBlocks)for(let n of e.thinkingBlocks)s.push({type:"thinking",thinking:n.thinking,signature:n.signature});if(e.content&&s.push({type:"text",text:e.content}),e.toolUses)for(let n of e.toolUses)s.push({type:"tool_use",id:n.toolUseId,name:n.toolName,input:n.arguments});s.length===0&&s.push({type:"text",text:""}),t.push({role:"assistant",content:s})}else if(e.toolResults&&e.toolResults.length>0){let s=[];for(let n of e.toolResults)s.push({type:"tool_result",tool_use_id:n.toolUseId,is_error:n.isError,content:n.images?.length?[{type:"text",text:n.content},...H(n.images)]:n.content});t.push({role:"user",content:s})}else{if(t.length===0){t.push({role:"user",content:L(e)});continue}let s=!1,n=t[t.length-1],a=n.content;n.role==="user"&&(typeof a=="string"||Array.isArray(a)&&a.length>0&&(a[0].type==="text"||a[0].type==="image"))&&(s=!0),s?(typeof a=="string"&&(a=n.content=a.trim().length>0?[{type:"text",text:a}]:[]),a.push(...L(e))):t.push({role:"user",content:L(e)})}return t}var G=class{client;model;thinking;systemPrompt;maxOutputTokens;contextWindow;constructor(t,e){let s=R(t);if(!s)throw new M("Anthropic API key not found, set ANTHROPIC_API_KEY in .swifty/config.y(a)ml, or via ANTHROPIC_API_KEY env variable.");this.client=new w({apiKey:s,baseURL:t.base_url}),this.model=t.model,this.thinking=t.thinking??!0,this.systemPrompt=e,this.maxOutputTokens=F(t),this.contextWindow=D(t)}setSystemPrompt(t){this.systemPrompt=t}setMaxOutputTokens(t){this.maxOutputTokens=t}async*stream(t,e,s){let n=z(B(t.getMessages())),a=e.map(c=>{let p=c.input_schema;return{name:c.name,description:c.description,input_schema:{type:"object",properties:p.properties,required:p.required??[]}}});a.length>0&&(a[a.length-1].cache_control={type:"ephemeral"}),Q(n);let l={model:this.model,max_tokens:this.maxOutputTokens,stream:!0,system:[{type:"text",text:this.systemPrompt,cache_control:{type:"ephemeral"}}],messages:n,...a.length>0?{tools:a}:{}};this.thinking?J()&&(l.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)}):l.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)};let g=0,h=0,d=0,f=0,y="end_turn",b="",A="",T=!1,E=0;try{let c=this.client.messages.stream(l,{...s?{signal:s}:{}}),p="",_="",u="";for await(let i of c)switch(i.type){case"content_block_start":{let r=i.content_block;r.type==="thinking"?(T=!0,b="",A=""):r.type==="tool_use"&&(_=r.id,p=r.name,u="",yield{type:"tool_call_start",toolName:p,toolId:_});break}case"content_block_delta":{let r=i.delta;r.type==="thinking_delta"?(b+=r.thinking,yield{type:"thinking_delta",text:r.thinking}):r.type==="signature_delta"?(x.debug({signature:r.signature},"thinking signature received"),A=r.signature):r.type==="text_delta"?yield{type:"text_delta",text:r.text}:r.type==="input_json_delta"&&(u+=r.partial_json,yield{type:"tool_call_delta",text:r.partial_json});break}case"content_block_stop":{if(T&&(yield{type:"thinking_complete",thinking:b,signature:A},T=!1),p){let r={};if(u)try{let m=JSON.parse(u);r=O(m)?I(m):{[v]:u}}catch(m){x.error({err:m},"llm operation failed"),r={[v]:u}}yield{type:"tool_call_complete",toolId:_,toolName:p,arguments:r},p="",_="",u=""}break}case"message_delta":{i.delta.stop_reason&&(y=i.delta.stop_reason),i.usage.output_tokens&&(h=i.usage.output_tokens,i.usage.input_tokens&&(g=i.usage.input_tokens),i.usage.cache_read_input_tokens&&(d=i.usage.cache_read_input_tokens),i.usage.cache_creation_input_tokens&&(f=i.usage.cache_creation_input_tokens));break}case"message_start":{E=Date.now(),g=i.message.usage.input_tokens,h=i.message.usage.output_tokens,d=i.message.usage.cache_read_input_tokens??0,f=i.message.usage.cache_creation_input_tokens??0;break}case"message_stop":{let m=Date.now()-E;x.debug({elapsedMs:m},"message stream complete");break}}yield{type:"stream_end",stopReason:y,usage:{inputTokens:g,outputTokens:h,cacheReadInputTokens:d,cacheCreationInputTokens:f}}}catch(c){throw x.error({err:c},"llm operation failed"),V(c)}}};function Q(o){for(let t=o.length-1;t>=0;t--){if(o[t].role!=="user")continue;let e=o[t].content;if(typeof e=="string"&&e.length===0||Array.isArray(e)&&e.length===0)return;typeof e=="string"&&(e=o[t].content=[{type:"text",text:e}]);let s=e[e.length-1];for(let n=e.length-1;n>=0;n--)if(e[n].type!=="image"){s=e[n];break}Reflect.set(s,"cache_control",{type:"ephemeral"})}}function V(o){if(o instanceof w.APIError){if(o.status===413||/prompts?\s+too\s+long/i.test(o.message))return new W(`Prompt too long: ${o.message}`);if(o.status===401)return new M(`Invalid API key: ${o.message}`);if(o.status===429){let t=I(o.headers)["retry-after"],e="Rate Limited";if(t){let s=Number.parseInt(k(t));Number.isNaN(s)&&(e+=", please wait."),e+=`, retry after ${k(s)}s.`}else e+=", please wait.";return new $(e,t?k(t):void 0)}return new U(`Anthropic API error (${k(o.status)}): ${o.message}`)}return new K(`Network error: ${j(o)}`)}export{G as AnthropicClient,z as buildAnthropicMessages,at as fetchModelContextWindow,Q as markLastUserTailForCache};
4
+ import{l as C}from"./chunk-DCI5RJC7.js";import{g as w}from"./chunk-H7VXSMJR.js";import{e as D,g as F,h as R}from"./chunk-HU7ELU2V.js";import{b as B,c as U,d as M,e as $,f as K,g as W}from"./chunk-FZPTNGTU.js";import"./chunk-7MHXMDYC.js";import{H as P,J as v,K as O,L as I,M as k,N as j,e as S,l as N}from"./chunk-4KVSJNS6.js";import"./chunk-MQ5XOYLD.js";import"./chunk-X3UA5OZL.js";var x=S({module:"llm"});var Y=3e3,q=P.object({max_input_tokens:P.coerce.number()});async function at(o){if(o.protocol!=="anthropic")return 0;let t=R(o),s=`${o.base_url.replace(/\/+$/,"")}/v1/models/${encodeURIComponent(o.model)}`,n=new AbortController,a=setTimeout(()=>{n.abort()},Y);try{let l=await fetch(s,{method:"GET",headers:{"anthropic-version":"2023-06-01",...t?{"x-api-key":t}:{}},signal:n.signal});if(!l.ok)return 0;let g=await l.json(),{success:h,error:d,data:f}=await N(q,g);if(!h)return console.error(d.message),0;let y=f.max_input_tokens;return Math.max(y,0)}catch(l){return console.error(l),0}finally{clearTimeout(a)}}function J(){return!0}function H(o){return(o??[]).map(t=>({type:"image",source:{type:"base64",media_type:t.mediaType,data:t.data}}))}function L(o){let t=[];return(o.content||!o.images?.length)&&t.push({type:"text",text:o.content}),t.push(...H(o.images)),t}function z(o){let t=[];for(let e of o)if(e.role==="assistant"){let s=[];if(e.thinkingBlocks)for(let n of e.thinkingBlocks)s.push({type:"thinking",thinking:n.thinking,signature:n.signature});if(e.content&&s.push({type:"text",text:e.content}),e.toolUses)for(let n of e.toolUses)s.push({type:"tool_use",id:n.toolUseId,name:n.toolName,input:n.arguments});s.length===0&&s.push({type:"text",text:""}),t.push({role:"assistant",content:s})}else if(e.toolResults&&e.toolResults.length>0){let s=[];for(let n of e.toolResults)s.push({type:"tool_result",tool_use_id:n.toolUseId,is_error:n.isError,content:n.images?.length?[{type:"text",text:n.content},...H(n.images)]:n.content});t.push({role:"user",content:s})}else{if(t.length===0){t.push({role:"user",content:L(e)});continue}let s=!1,n=t[t.length-1],a=n.content;n.role==="user"&&(typeof a=="string"||Array.isArray(a)&&a.length>0&&(a[0].type==="text"||a[0].type==="image"))&&(s=!0),s?(typeof a=="string"&&(a=n.content=a.trim().length>0?[{type:"text",text:a}]:[]),a.push(...L(e))):t.push({role:"user",content:L(e)})}return t}var G=class{client;model;thinking;systemPrompt;maxOutputTokens;contextWindow;constructor(t,e){let s=R(t);if(!s)throw new M("Anthropic API key not found, set ANTHROPIC_API_KEY in .swifty/config.y(a)ml, or via ANTHROPIC_API_KEY env variable.");this.client=new w({apiKey:s,baseURL:t.base_url}),this.model=t.model,this.thinking=t.thinking??!0,this.systemPrompt=e,this.maxOutputTokens=F(t),this.contextWindow=D(t)}setSystemPrompt(t){this.systemPrompt=t}setMaxOutputTokens(t){this.maxOutputTokens=t}async*stream(t,e,s){let n=z(B(t.getMessages())),a=e.map(c=>{let p=c.input_schema;return{name:c.name,description:c.description,input_schema:{type:"object",properties:p.properties,required:p.required??[]}}});a.length>0&&(a[a.length-1].cache_control={type:"ephemeral"}),Q(n);let l={model:this.model,max_tokens:this.maxOutputTokens,stream:!0,system:[{type:"text",text:this.systemPrompt,cache_control:{type:"ephemeral"}}],messages:n,...a.length>0?{tools:a}:{}};this.thinking?J()&&(l.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)}):l.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)};let g=0,h=0,d=0,f=0,y="end_turn",b="",A="",T=!1,E=0;try{let c=this.client.messages.stream(l,{...s?{signal:s}:{}}),p="",_="",u="";for await(let i of c)switch(i.type){case"content_block_start":{let r=i.content_block;r.type==="thinking"?(T=!0,b="",A=""):r.type==="tool_use"&&(_=r.id,p=r.name,u="",yield{type:"tool_call_start",toolName:p,toolId:_});break}case"content_block_delta":{let r=i.delta;r.type==="thinking_delta"?(b+=r.thinking,yield{type:"thinking_delta",text:r.thinking}):r.type==="signature_delta"?(x.debug({signature:r.signature},"thinking signature received"),A=r.signature):r.type==="text_delta"?yield{type:"text_delta",text:r.text}:r.type==="input_json_delta"&&(u+=r.partial_json,yield{type:"tool_call_delta",text:r.partial_json});break}case"content_block_stop":{if(T&&(yield{type:"thinking_complete",thinking:b,signature:A},T=!1),p){let r={};if(u)try{let m=JSON.parse(u);r=O(m)?I(m):{[v]:u}}catch(m){x.error({err:m},"llm operation failed"),r={[v]:u}}yield{type:"tool_call_complete",toolId:_,toolName:p,arguments:r},p="",_="",u=""}break}case"message_delta":{i.delta.stop_reason&&(y=i.delta.stop_reason),i.usage.output_tokens&&(h=i.usage.output_tokens,i.usage.input_tokens&&(g=i.usage.input_tokens),i.usage.cache_read_input_tokens&&(d=i.usage.cache_read_input_tokens),i.usage.cache_creation_input_tokens&&(f=i.usage.cache_creation_input_tokens));break}case"message_start":{E=Date.now(),g=i.message.usage.input_tokens,h=i.message.usage.output_tokens,d=i.message.usage.cache_read_input_tokens??0,f=i.message.usage.cache_creation_input_tokens??0;break}case"message_stop":{let m=Date.now()-E;x.debug({elapsedMs:m},"message stream complete");break}}yield{type:"stream_end",stopReason:y,usage:{inputTokens:g,outputTokens:h,cacheReadInputTokens:d,cacheCreationInputTokens:f}}}catch(c){throw x.error({err:c},"llm operation failed"),V(c)}}};function Q(o){for(let t=o.length-1;t>=0;t--){if(o[t].role!=="user")continue;let e=o[t].content;if(typeof e=="string"&&e.length===0||Array.isArray(e)&&e.length===0)return;typeof e=="string"&&(e=o[t].content=[{type:"text",text:e}]);let s=e[e.length-1];for(let n=e.length-1;n>=0;n--)if(e[n].type!=="image"){s=e[n];break}Reflect.set(s,"cache_control",{type:"ephemeral"})}}function V(o){if(o instanceof w.APIError){if(o.status===413||/prompts?\s+too\s+long/i.test(o.message))return new W(`Prompt too long: ${o.message}`);if(o.status===401)return new M(`Invalid API key: ${o.message}`);if(o.status===429){let t=I(o.headers)["retry-after"],e="Rate Limited";if(t){let s=Number.parseInt(k(t));Number.isNaN(s)&&(e+=", please wait."),e+=`, retry after ${k(s)}s.`}else e+=", please wait.";return new $(e,t?k(t):void 0)}return new U(`Anthropic API error (${k(o.status)}): ${o.message}`)}return new K(`Network error: ${j(o)}`)}export{G as AnthropicClient,z as buildAnthropicMessages,at as fetchModelContextWindow,Q as markLastUserTailForCache};