paprflare-sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/index.d.mts +759 -0
- package/dist/index.d.ts +759 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +8 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react/index.d.mts +165 -0
- package/dist/react/index.d.ts +165 -0
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +3 -0
- package/dist/react/index.mjs.map +1 -0
- package/package.json +77 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';var Z=require('ioredis'),lruCache=require('lru-cache'),tiktoken=require('tiktoken'),nanoid=require('nanoid'),V=require('fast-json-stable-stringify'),B=require('eventemitter3'),eventsourceParser=require('eventsource-parser');require('zod');var Y=require('p-queue'),asyncMutex=require('async-mutex');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Z__default=/*#__PURE__*/_interopDefault(Z);var V__default=/*#__PURE__*/_interopDefault(V);var B__default=/*#__PURE__*/_interopDefault(B);var Y__default=/*#__PURE__*/_interopDefault(Y);var O="cl100k_base",$={"gpt-4":"cl100k_base","gpt-4-turbo":"cl100k_base","gpt-3.5-turbo":"cl100k_base","claude-3":"cl100k_base","claude-3.5":"cl100k_base"},S=class{encoding;cache;maxCacheSize;constructor(t,e=1e4){let r=t&&$[t]||O;this.encoding=tiktoken.get_encoding(r),this.cache=new Map,this.maxCacheSize=e;}countTokens(t){let e=this.cache.get(t);if(e!==void 0)return e;let r=this.encoding.encode(t).length;if(this.cache.size>=this.maxCacheSize){let a=this.cache.keys().next().value;this.cache.delete(a);}return this.cache.set(t,r),r}countMessageTokens(t){let e=0;for(let r of t){if(e+=this.countTokens(r.role),e+=this.countTokens(r.content),r.toolCalls)for(let a of r.toolCalls)e+=this.countTokens(a.name),e+=this.countTokens(JSON.stringify(a.arguments));e+=4;}return e+=3,e}estimateCost(t,e,r){let a={"gpt-4-turbo":{input:1e-5,output:29999999999999997e-21},"gpt-3.5-turbo":{input:5e-7,output:15e-7},"claude-3-opus":{input:14999999999999999e-21,output:75e-6},"claude-3-sonnet":{input:3e-6,output:14999999999999999e-21}},o=a[r]||a["gpt-3.5-turbo"];return t*o.input+e*o.output}clearCache(){this.cache.clear();}dispose(){this.encoding.free(),this.cache.clear();}},x=null;function _(n){return x||(x=new S(n)),x}function re(n,t){return _(t).countTokens(n)}function ae(n,t){return _(t).countMessageTokens(n)}function v(n){let t=nanoid.nanoid();return n?`${n}_${t}`:t}function I(n){return V__default.default(n)}function N(n){return n.map(t=>({...t,id:t.id||v("msg"),timestamp:t.timestamp||Date.now()}))}async function D(n,t){let e,r=t.initialDelay;for(let a=1;a<=t.maxAttempts;a++)try{return await n()}catch(o){if(e=o,a===t.maxAttempts)throw e;t.onRetry&&t.onRetry(a,e),await H(Math.min(r,t.maxDelay)),r*=t.backoffMultiplier;}throw e}function H(n){return new Promise(t=>setTimeout(t,n))}function ie(n,t){let e=[];for(let r=0;r<n.length;r+=t)e.push(n.slice(r,r+t));return e}function ce(n,t){let e;return (...r)=>{clearTimeout(e),e=setTimeout(()=>n(...r),t);}}function le(n,t){let e;return (...r)=>{e||(n(...r),e=true,setTimeout(()=>e=false,t));}}function ue(n){try{return JSON.parse(n)}catch{return null}}function T(n){return typeof n=="object"&&n!==null&&n.constructor===Object}function G(n,...t){if(!t.length)return n;let e=t.shift();if(T(n)&&T(e))for(let r in e)T(e[r])?(n[r]||Object.assign(n,{[r]:{}}),G(n[r],e[r])):Object.assign(n,{[r]:e[r]});return G(n,...t)}async function me(n){let t=[];for await(let e of n)t.push(e);return t}async function de(n){let t=performance.now(),e=await n(),r=performance.now()-t;return {result:e,duration:r}}var y=class extends B__default.default{constructor(e=false){super();this.debug=e;}events=[];currentText="";currentToolCall=null;currentArtifact=null;metadata={};closed=false;writeText(e){if(this.closed)throw new Error("StreamWriter is closed");this.currentText+=e;let r={type:"text-delta",delta:e};this.emitEvent(r);}startToolCall(e,r){if(this.closed)throw new Error("StreamWriter is closed");let a=r||v("tool");this.currentToolCall={id:a,name:e,arguments:{}};let o={type:"tool-call-start",toolCall:this.currentToolCall};this.emitEvent(o);}writeToolCallDelta(e){if(this.closed)throw new Error("StreamWriter is closed");if(!this.currentToolCall)throw new Error("No active tool call");let r={type:"tool-call-delta",toolCallId:this.currentToolCall.id,delta:e};this.emitEvent(r);}endToolCall(e){if(this.closed)throw new Error("StreamWriter is closed");if(!this.currentToolCall)throw new Error("No active tool call");this.currentToolCall.arguments=e;let r={type:"tool-call-end",toolCall:this.currentToolCall};this.emitEvent(r),this.currentToolCall=null;}writeToolResult(e,r,a){if(this.closed)throw new Error("StreamWriter is closed");let o={type:"tool-result",result:{toolCallId:e,result:r,error:a}};this.emitEvent(o);}startArtifact(e,r){if(this.closed)throw new Error("StreamWriter is closed");let a=r?.id||v("artifact");this.currentArtifact={id:a,type:e,language:r?.language,title:r?.title,description:r?.description,content:""};let o={type:"artifact-start",artifact:{id:this.currentArtifact.id,type:this.currentArtifact.type,language:this.currentArtifact.language,title:this.currentArtifact.title,description:this.currentArtifact.description}};this.emitEvent(o);}writeArtifactDelta(e){if(this.closed)throw new Error("StreamWriter is closed");if(!this.currentArtifact)throw new Error("No active artifact");this.currentArtifact.content+=e;let r={type:"artifact-delta",delta:e};this.emitEvent(r);}endArtifact(e){if(this.closed)throw new Error("StreamWriter is closed");if(!this.currentArtifact)throw new Error("No active artifact");e&&(this.currentArtifact.metadata=e);let r={type:"artifact-end",artifact:this.currentArtifact};this.emitEvent(r),this.currentArtifact=null;}writeMetadata(e){if(this.closed)throw new Error("StreamWriter is closed");this.metadata={...this.metadata,...e};let r={type:"metadata",metadata:e};this.emitEvent(r);}writeUsage(e){if(this.closed)throw new Error("StreamWriter is closed");let r={type:"usage",usage:e};this.emitEvent(r);}writeError(e){if(this.closed)throw new Error("StreamWriter is closed");let r={type:"error",error:e};this.emitEvent(r);}done(e){if(this.closed)return;let a={type:"done",finalMessage:{id:e?.id||v("msg"),role:e?.role||"assistant",content:e?.content||this.currentText,metadata:{...this.metadata,...e?.metadata},timestamp:Date.now(),...e?.toolCalls&&{toolCalls:e.toolCalls},...e?.toolResults&&{toolResults:e.toolResults}}};this.emitEvent(a),this.closed=true,this.emit("close");}getEvents(){return [...this.events]}async*toGenerator(){let e=[],r=null,a=false,o=s=>{r?(r({value:s,done:false}),r=null):e.push(s);},i=()=>{a=true,r&&(r({value:void 0,done:true}),r=null);};this.on("event",o),this.on("close",i);try{for(;!a||e.length>0;)e.length>0?yield e.shift():a||await new Promise(s=>{r=c=>{c.done||e.push(c.value),s();};});}finally{this.off("event",o),this.off("close",i);}}emitEvent(e){this.events.push(e),this.emit("event",e),this.debug&&console.log("[StreamWriter]",e.type,e);}isClosed(){return this.closed}reset(){this.events=[],this.currentText="",this.currentToolCall=null,this.currentArtifact=null,this.metadata={},this.closed=false,this.removeAllListeners();}};function ge(n=false){return new y(n)}async function*Ce(n){let t=n.getReader(),e=new TextDecoder,r="",a=eventsourceParser.createParser({onEvent:o=>{r=o.data;},onRetry:o=>{}});try{for(;;){let{done:o,value:i}=await t.read();if(o)break;let s=e.decode(i,{stream:!0});if(a.feed(s),r)try{let c=JSON.parse(r);c.type&&(yield c),r="";}catch{continue}}a.reset({consume:!0});}finally{t.releaseLock();}}function w(n){let t=new TextEncoder;return new ReadableStream({async start(e){try{for await(let r of n){let a=`data: ${JSON.stringify(r)}
|
|
2
|
+
|
|
3
|
+
`;e.enqueue(t.encode(a));}e.close();}catch(r){e.error(r);}}})}async function L(n,t){let e=w(n),r={"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"};if(t.node&&t.node.res){let a=t.node.res;Object.entries(r).forEach(([s,c])=>{a.setHeader(s,c);});let o=e.getReader(),i=new TextDecoder;try{for(;;){let{done:s,value:c}=await o.read();if(s)break;let m=i.decode(c,{stream:!0});a.write(m);}}finally{a.end();}}else {if(t instanceof Response||typeof t.body<"u")return;{Object.entries(r).forEach(([i,s])=>{t.setHeader(i,s);});let a=e.getReader(),o=new TextDecoder;try{for(;;){let{done:i,value:s}=await a.read();if(i)break;let c=o.decode(s,{stream:!0});t.write(c);}}finally{t.end();}}}}async function*U(...n){let t=n.map(async r=>{let a=[];for await(let o of r)a.push(o);return a}),e=await Promise.all(t);for(let r of e)for(let a of r)yield a;}async function*be(n,t){for await(let e of n){let r=t(e);r!==null&&(yield r);}}async function*xe(n,t){for await(let e of n)t(e)&&(yield e);}async function k(n){let t=[];for await(let e of n)t.push(e);return t}async function*Se(n,t){let e=0;for await(let r of n){if(e>=t)break;yield r,e++;}}async function*Te(n,t,e){let r=[],a=null,o=async()=>{if(r.length>0){let i=[...r];return r=[],i}return null};try{for await(let s of n)if(r.push(s),a&&(clearTimeout(a),a=null),r.length>=t){let c=await o();c&&(yield c);}else e&&(a=setTimeout(async()=>{let c=await o();},e));let i=await o();i&&(yield i);}finally{a&&clearTimeout(a);}}var p=class extends Error{constructor(e,r,a,o){super(e);this.code=r;this.statusCode=a;this.details=o;this.name="PaprFlareError";}},J=class extends p{constructor(e,r){super(e,"RATE_LIMIT_ERROR",429);this.retryAfter=r;}},z=class extends p{constructor(t,e){super(t,"VALIDATION_ERROR",400,e);}},h=class extends p{constructor(e,r,a){super(e,"PROVIDER_ERROR",a);this.provider=r;}};var R=class{client;keyPrefix;defaultTTL;constructor(t){this.client=new Z__default.default({host:t.host,port:t.port,password:t.password,db:t.db||0,retryStrategy:e=>Math.min(e*50,2e3),maxRetriesPerRequest:3,enableReadyCheck:true,lazyConnect:false}),this.keyPrefix=t.keyPrefix||"paprflare:",this.defaultTTL=t.ttl||3600,this.client.on("error",e=>{console.error("Redis cache error:",e);});}getKey(t){return `${this.keyPrefix}${t}`}async get(t){try{return await this.client.get(this.getKey(t))}catch(e){return console.error("Redis get error:",e),null}}async set(t,e,r){try{let a=r||this.defaultTTL;await this.client.setex(this.getKey(t),a,e);}catch(a){console.error("Redis set error:",a);}}async delete(t){try{await this.client.del(this.getKey(t));}catch(e){console.error("Redis delete error:",e);}}async clear(){try{let t=await this.client.keys(`${this.keyPrefix}*`);t.length>0&&await this.client.del(...t);}catch(t){console.error("Redis clear error:",t);}}async has(t){try{return await this.client.exists(this.getKey(t))===1}catch(e){return console.error("Redis has error:",e),false}}async disconnect(){await this.client.quit();}},E=class{cache;constructor(t){this.cache=new lruCache.LRUCache({max:t?.maxSize||1e3,ttl:t?.maxAge||36e5,updateAgeOnGet:true,updateAgeOnHas:true});}async get(t){return this.cache.get(t)||null}async set(t,e){this.cache.set(t,e);}async delete(t){this.cache.delete(t);}async clear(){this.cache.clear();}async has(t){return this.cache.has(t)}},b=class{cache;enabled;constructor(t){this.enabled=true,t.type==="redis"?this.cache=new R({...t.redis,ttl:t.ttl}):this.cache=new E(t.memory);}generateCacheKey(t,e){let r={messages:t.map(a=>({role:a.role,content:a.content,toolCalls:a.toolCalls})),model:e.model,temperature:e.temperature,maxTokens:e.maxTokens,tools:e.tools?.map(a=>a.name)};return I(r)}async getCachedResponse(t,e){if(!this.enabled||e.cache?.enabled===false)return null;let r=e.cache?.key||this.generateCacheKey(t,e),a=await this.cache.get(r);if(a)try{return JSON.parse(a)}catch(o){return console.error("Cache parse error:",o),await this.cache.delete(r),null}return null}async cacheResponse(t,e,r){if(!this.enabled||e.cache?.enabled===false)return;let a=e.cache?.key||this.generateCacheKey(t,e),o=e.cache?.ttl;await this.cache.set(a,JSON.stringify(r),o);}async invalidate(t,e){let r=this.generateCacheKey(t,e);await this.cache.delete(r);}async clearAll(){await this.cache.clear();}disable(){this.enabled=false;}enable(){this.enabled=true;}};var j=class{mode;cloudConfig;providerCallback;cacheManager;queue;mutex;defaultRetryConfig;constructor(t){this.mode=t.mode,this.mutex=new asyncMutex.Mutex;let e=t.rateLimit||{};if(this.queue=new Y__default.default({concurrency:e.maxConcurrent||100,interval:e.interval||1e3,intervalCap:e.intervalCap||100,timeout:3e4}),this.defaultRetryConfig=t.defaultRetry||{maxAttempts:3,initialDelay:1e3,maxDelay:1e4,backoffMultiplier:2},t.mode==="cloud"){if(!t.cloud)throw new p("Cloud config is required for cloud mode","INVALID_CONFIG");this.cloudConfig=t.cloud;}else {if(!t.selfManaged?.provider)throw new p("Provider callback is required for self-managed mode","INVALID_CONFIG");this.providerCallback=t.selfManaged.provider,t.selfManaged.cache&&(this.cacheManager=new b(t.selfManaged.cache));}}async chat(t,e={}){let r=N(t);if(this.validateConfig(e),this.cacheManager&&e.cache?.enabled!==false){let a=await this.cacheManager.getCachedResponse(r,e);if(a)return e.stream?this.createStreamingResponse(this.eventsToGenerator(a)):this.eventsToResponse(a)}return this.queue.add(async()=>this.executeChat(r,e))}async executeChat(t,e){let r=e.retry||this.defaultRetryConfig;return D(async()=>this.mode==="cloud"?this.executeCloudChat(t,e):this.executeSelfManagedChat(t,e),{...r,onRetry:(a,o)=>{console.warn(`[PaprFlare] Retry attempt ${a}/${r.maxAttempts}:`,o.message);}})}async executeCloudChat(t,e){let r=await fetch(`${this.cloudConfig.baseURL||"https://api.paprflare.in"}/v1/chat`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.cloudConfig.apiKey}`,"X-PaprFlare-Region":this.cloudConfig.region||"in-mumbai"},body:JSON.stringify({messages:t,...e})});if(!r.ok)throw new p(`Cloud API error: ${r.statusText}`,"CLOUD_API_ERROR",r.status);if(e.stream){let a=this.parseCloudStream(r.body);return this.createStreamingResponse(a)}else return await r.json()}async executeSelfManagedChat(t,e){if(!this.providerCallback)throw new p("Provider callback not configured","INVALID_CONFIG");if(e.output?.schema)return this.executeStructuredOutput(t,e);let r=this.providerCallback(t,e);if(e.stream){if(this.cacheManager&&e.cache?.enabled!==false){let a=[],o=(async function*(){try{for await(let i of r)a.push(i),yield i;}finally{await this.cacheManager.cacheResponse(t,e,a);}}).bind(this)();return this.createStreamingResponse(o)}return this.createStreamingResponse(r)}else {let a=await k(r);return this.cacheManager&&e.cache?.enabled!==false&&await this.cacheManager.cacheResponse(t,e,a),this.eventsToResponse(a)}}async executeStructuredOutput(t,e){let r=e.output.schema,a=this.providerCallback(t,{...e,stream:false}),o=await k(a),i=o.filter(s=>s.type==="text-delta").map(s=>s.type==="text-delta"?s.delta:"").join("");try{let s=JSON.parse(i),c=r.parse(s),m=o.find(d=>d.type==="done");return {message:m&&m.type==="done"?m.finalMessage:{id:v("msg"),role:"assistant",content:JSON.stringify(c),timestamp:Date.now()},usage:o.find(d=>d.type==="usage"&&"usage"in d)?.usage}}catch(s){throw new p(`Structured output validation failed: ${s}`,"VALIDATION_ERROR",400,s)}}createStreamingResponse(t){return {stream:t,toReadableStream:()=>w(t),pipeToResponse:async e=>{await L(t,e);},mergeStreams:(...e)=>U(t,...e)}}async*parseCloudStream(t){let e=t.getReader(),r=new TextDecoder;try{for(;;){let{done:a,value:o}=await e.read();if(a)break;let s=r.decode(o,{stream:!0}).split(`
|
|
4
|
+
`);for(let c of s)if(c.startsWith("data: ")){let m=c.slice(6);if(m==="[DONE]")break;try{yield JSON.parse(m);}catch(u){console.error("Failed to parse event:",u);}}}}finally{e.releaseLock();}}async*cacheStream(t,e){for await(let r of t)e.push(r),yield r;}async*eventsToGenerator(t){for(let e of t)yield e;}eventsToResponse(t){let e=t.find(a=>a.type==="done"),r=t.find(a=>a.type==="usage");if(!e||e.type!=="done")throw new p("No completion event found in response","INVALID_RESPONSE");return {message:e.finalMessage,usage:r&&r.type==="usage"?r.usage:void 0}}validateConfig(t){if(t.temperature!==void 0&&(t.temperature<0||t.temperature>2))throw new p("Temperature must be between 0 and 2","VALIDATION_ERROR",400);if(t.maxTokens!==void 0&&t.maxTokens<1)throw new p("Max tokens must be greater than 0","VALIDATION_ERROR",400);t.output?.schema&&!t.stream&&(t.stream=false);}getQueueStats(){return {size:this.queue.size,pending:this.queue.pending,concurrency:this.queue.concurrency}}async clearCache(){this.cacheManager&&await this.cacheManager.clearAll();}};function Fe(n){return {schema:n,mode:"json"}}var A=class{config;baseURL;constructor(t){this.config=t,this.baseURL=t.baseURL||"https://api.anthropic.com/v1";}createCallback(){return (t,e)=>this.streamChat(t,e)}async*streamChat(t,e){let r=new y;try{let a=t.find(s=>s.role==="system"),o=t.filter(s=>s.role!=="system"),i=await fetch(`${this.baseURL}/messages`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey,"anthropic-version":this.config.anthropicVersion||"2023-06-01",...this.config.headers},body:JSON.stringify({model:e.model||this.config.model||"claude-3-5-sonnet-20241022",messages:this.formatMessages(o),max_tokens:e.maxTokens||4096,temperature:e.temperature,top_p:e.topP,stop_sequences:e.stop,stream:!0,...a&&{system:a.content},...e.tools&&{tools:this.formatTools(e.tools)}})});if(!i.ok){let s=await i.json().catch(()=>({}));throw new h(s.error?.message||"Anthropic API error","anthropic",i.status)}yield*this.parseStream(i.body,r);}catch(a){throw a instanceof h?a:new h(`Anthropic provider error: ${a}`,"anthropic")}}async*parseStream(t,e){let r=t.getReader(),a=new TextDecoder,o="",i=null;try{for(;;){let{done:s,value:c}=await r.read();if(s)break;o+=a.decode(c,{stream:!0});let m=o.split(`
|
|
5
|
+
`);o=m.pop()||"";for(let u of m){if(!u.trim()||!u.startsWith("data: "))continue;let d=u.slice(6);try{let l=JSON.parse(d);switch(l.type){case "message_start":break;case "content_block_start":l.content_block?.type==="tool_use"&&(i=l.content_block,e.startToolCall(i.name,i.id));break;case "content_block_delta":l.delta?.type==="text_delta"?e.writeText(l.delta.text):l.delta?.type==="input_json_delta"&&e.writeToolCallDelta(l.delta.partial_json);break;case "content_block_stop":if(i){try{let f=JSON.parse(i.input||"{}");e.endToolCall(f);}catch{}i=null;}break;case "message_delta":l.usage&&e.writeUsage({promptTokens:0,completionTokens:l.usage.output_tokens||0,totalTokens:l.usage.output_tokens||0});break;case "message_stop":e.done(),yield*e.toGenerator();return;case "error":e.writeError(l.error?.message||"Unknown error");break}yield*e.toGenerator();}catch(l){console.error("Failed to parse Anthropic chunk:",l);}}}}finally{r.releaseLock();}}formatMessages(t){return t.map(e=>{let r=[];if(e.content&&r.push({type:"text",text:e.content}),e.toolCalls)for(let a of e.toolCalls)r.push({type:"tool_use",id:a.id,name:a.name,input:a.arguments});if(e.toolResults)for(let a of e.toolResults)r.push({type:"tool_result",tool_use_id:a.toolCallId,content:JSON.stringify(a.result),...a.error&&{is_error:true}});return {role:e.role==="assistant"?"assistant":"user",content:r.length===1&&r[0].type==="text"?r[0].text:r}})}formatTools(t){return t?t.map(e=>({name:e.name,description:e.description,input_schema:this.zodToJsonSchema(e.parameters)})):[]}zodToJsonSchema(t){return {type:"object",properties:{},required:[]}}};function Ze(n){return new A(n).createCallback()}var P=class{config;baseURL;constructor(t){this.config=t,this.baseURL=t.baseURL||"https://generativelanguage.googleapis.com/v1beta";}createCallback(){return (t,e)=>this.streamChat(t,e)}async*streamChat(t,e){let r=new y;try{let a=e.model||this.config.model||"gemini-pro",o=await fetch(`${this.baseURL}/models/${a}:streamGenerateContent?key=${this.config.apiKey}`,{method:"POST",headers:{"Content-Type":"application/json",...this.config.headers},body:JSON.stringify({contents:this.formatMessages(t),generationConfig:{temperature:e.temperature,maxOutputTokens:e.maxTokens,topP:e.topP,stopSequences:e.stop},...e.tools&&{tools:this.formatTools(e.tools)}})});if(!o.ok){let i=await o.json().catch(()=>({}));throw new h(i.error?.message||"Google AI API error","google",o.status)}yield*this.parseStream(o.body,r);}catch(a){throw a instanceof h?a:new h(`Google provider error: ${a}`,"google")}}async*parseStream(t,e){let r=t.getReader(),a=new TextDecoder,o="";try{for(;;){let{done:i,value:s}=await r.read();if(i)break;o+=a.decode(s,{stream:!0});let c=o.split(`
|
|
6
|
+
`);o=c.pop()||"";for(let m of c)if(m.trim())try{let u=JSON.parse(m);if(u.candidates&&u.candidates[0]){let d=u.candidates[0];if(d.content?.parts)for(let l of d.content.parts)l.text&&e.writeText(l.text),l.functionCall&&(e.startToolCall(l.functionCall.name,l.functionCall.name),e.endToolCall(l.functionCall.args));if(d.finishReason==="STOP"){e.done(),yield*e.toGenerator();return}}u.usageMetadata&&e.writeUsage({promptTokens:u.usageMetadata.promptTokenCount||0,completionTokens:u.usageMetadata.candidatesTokenCount||0,totalTokens:u.usageMetadata.totalTokenCount||0}),yield*e.toGenerator();}catch(u){console.error("Failed to parse Google chunk:",u);}}e.isClosed()||(e.done(),yield*e.toGenerator());}finally{r.releaseLock();}}formatMessages(t){return t.filter(e=>e.role!=="system").map(e=>({role:e.role==="assistant"?"model":"user",parts:[{text:e.content}]}))}formatTools(t){return t?[{functionDeclarations:t.map(e=>({name:e.name,description:e.description,parameters:this.zodToJsonSchema(e.parameters)}))}]:[]}zodToJsonSchema(t){return {type:"object",properties:{},required:[]}}};function rt(n){return new P(n).createCallback()}var M=class{config;baseURL;constructor(t){this.config=t,this.baseURL=t.baseURL||"https://api.openai.com/v1";}createCallback(){return (t,e)=>this.streamChat(t,e)}async*streamChat(t,e){let r=new y;try{let a=await fetch(`${this.baseURL}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`,...this.config.organization&&{"OpenAI-Organization":this.config.organization},...this.config.headers},body:JSON.stringify({model:e.model||this.config.model||"gpt-4-turbo-preview",messages:this.formatMessages(t),temperature:e.temperature,max_tokens:e.maxTokens,top_p:e.topP,frequency_penalty:e.frequencyPenalty,presence_penalty:e.presencePenalty,stop:e.stop,stream:!0,...e.tools&&{tools:this.formatTools(e.tools),tool_choice:e.toolChoice}})});if(!a.ok){let o=await a.json().catch(()=>({}));throw new h(o.error?.message||"OpenAI API error","openai",a.status)}yield*this.parseStream(a.body,r);}catch(a){throw a instanceof h?a:new h(`OpenAI provider error: ${a}`,"openai")}}async*parseStream(t,e){let r=t.getReader(),a=new TextDecoder,o="",i=null,s="";try{for(;;){let{done:c,value:m}=await r.read();if(c)break;o+=a.decode(m,{stream:!0});let u=o.split(`
|
|
7
|
+
`);o=u.pop()||"";for(let d of u)if(!(!d.trim()||d.startsWith(":"))&&d.startsWith("data: ")){let l=d.slice(6);if(l==="[DONE]"){e.done(),yield*e.toGenerator();return}try{let f=JSON.parse(l),C=f.choices[0]?.delta;if(!C)continue;if(C.content&&e.writeText(C.content),C.tool_calls)for(let g of C.tool_calls){let W=g.index;if(g.id){if(i!==null&&s){try{let q=JSON.parse(s);e.endToolCall(q);}catch{}s="";}i=W,e.startToolCall(g.function.name,g.id);}g.function?.arguments&&(s+=g.function.arguments,e.writeToolCallDelta(g.function.arguments));}if(f.choices[0]?.finish_reason&&i!==null&&s)try{let g=JSON.parse(s);e.endToolCall(g);}catch{}f.usage&&e.writeUsage({promptTokens:f.usage.prompt_tokens,completionTokens:f.usage.completion_tokens,totalTokens:f.usage.total_tokens}),yield*e.toGenerator();}catch(f){console.error("Failed to parse OpenAI chunk:",f);}}}}finally{r.releaseLock();}}formatMessages(t){return t.map(e=>({role:e.role,content:e.content,...e.toolCalls&&{tool_calls:e.toolCalls.map(r=>({id:r.id,type:"function",function:{name:r.name,arguments:JSON.stringify(r.arguments)}}))},...e.toolResults&&e.role==="tool"&&{tool_call_id:e.toolResults[0]?.toolCallId}}))}formatTools(t){return t?t.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:this.zodToJsonSchema(e.parameters)}})):[]}zodToJsonSchema(t){return {type:"object",properties:{},required:[]}}};function it(n){return new M(n).createCallback()}exports.AnthropicProvider=A;exports.CacheManager=b;exports.GoogleProvider=P;exports.MemoryCache=E;exports.OpenAIProvider=M;exports.PaprFlareClient=j;exports.PaprFlareError=p;exports.ProviderError=h;exports.RateLimitError=J;exports.RedisCache=R;exports.StreamWriter=y;exports.TokenCounter=S;exports.ValidationError=z;exports.batchStream=Te;exports.chunk=ie;exports.collectStream=k;exports.countMessageTokens=ae;exports.countTokens=re;exports.createAnthropicProvider=Ze;exports.createCacheKey=I;exports.createGoogleProvider=rt;exports.createOpenAIProvider=it;exports.createStreamWriter=ge;exports.debounce=ce;exports.deepMerge=G;exports.filterStream=xe;exports.formatMessages=N;exports.generateId=v;exports.getTokenCounter=_;exports.isPlainObject=T;exports.measureTime=de;exports.mergeStreams=U;exports.parseSSEStream=Ce;exports.pipeToResponse=L;exports.retry=D;exports.safeJsonParse=ue;exports.sleep=H;exports.streamToArray=me;exports.structuredOutput=Fe;exports.takeStream=Se;exports.throttle=le;exports.toReadableStream=w;exports.transformStream=be;//# sourceMappingURL=index.js.map
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/token-utils.ts","../src/utils/utils.ts","../src/utils/stream-writer.ts","../src/utils/stream-utils.ts","../src/utils/errors.ts","../src/cache/cache-manager.ts","../src/client/client.ts","../src/provider/anthropic/client.ts","../src/provider/google/client.ts","../src/provider/openai/client.ts"],"names":["DEFAULT_ENCODING","MODEL_ENCODING_MAP","TokenCounter","model","maxCacheSize","encodingName","get_encoding","text","cached","tokens","firstKey","messages","total","message","toolCall","promptTokens","completionTokens","pricing","modelPricing","defaultCounter","getTokenCounter","countTokens","countMessageTokens","generateId","prefix","id","nanoid","createCacheKey","data","stringify","formatMessages","msg","retry","fn","options","lastError","delay","attempt","error","sleep","ms","resolve","chunk","array","size","chunks","i","debounce","timeoutId","args","throttle","limit","inThrottle","safeJsonParse","json","isPlainObject","value","deepMerge","target","sources","source","key","streamToArray","stream","result","item","measureTime","start","duration","StreamWriter","EventEmitter","debug","delta","event","name","toolCallId","type","metadata","usage","finalMessage","queue","resolveNext","finished","eventHandler","closeHandler","createStreamWriter","parseSSEStream","reader","decoder","buffer","parser","createParser","_interval","done","parsed","toReadableStream","generator","encoder","controller","pipeToResponse","response","headers","res","mergeStreams","generators","promises","gen","items","results","transformStream","transformer","transformed","filterStream","predicate","collectStream","events","takeStream","count","taken","batchStream","timeoutMs","batch","flushBatch","toFlush","flushed","remaining","PaprFlareError","code","statusCode","details","RateLimitError","retryAfter","ValidationError","ProviderError","provider","RedisCache","Redis","times","err","ttl","actualTTL","keys","MemoryCache","LRUCache","CacheManager","config","cacheData","m","t","cacheKey","PaprFlareClient","Mutex","rateLimitConfig","PQueue","formattedMessages","retryConfig","cachedStream","schema","textContent","e","validated","doneEvent","streams","body","lines","line","usageEvent","structuredOutput","AnthropicProvider","chatConfig","writer","systemMessage","conversationMessages","currentToolUse","content","tools","tool","createAnthropicProvider","GoogleProvider","candidate","part","createGoogleProvider","OpenAIProvider","currentToolCallIndex","toolCallBuffer","index","tc","createOpenAIProvider"],"mappings":"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","file":"index.js","sourcesContent":["import { get_encoding, type TiktokenEncoding } from 'tiktoken';\r\nimport type { Message } from '../types';\r\n\r\n// Default encoding\r\nconst DEFAULT_ENCODING: TiktokenEncoding = 'cl100k_base';\r\n\r\n// Model to encoding mapping\r\nconst MODEL_ENCODING_MAP: Record<string, TiktokenEncoding> = {\r\n 'gpt-4': 'cl100k_base',\r\n 'gpt-4-turbo': 'cl100k_base',\r\n 'gpt-3.5-turbo': 'cl100k_base',\r\n 'claude-3': 'cl100k_base',\r\n 'claude-3.5': 'cl100k_base',\r\n};\r\n\r\n/**\r\n * Token counter with caching for high performance\r\n */\r\nexport class TokenCounter {\r\n private encoding: ReturnType<typeof get_encoding>;\r\n private cache: Map<string, number>;\r\n private maxCacheSize: number;\r\n\r\n constructor(model?: string, maxCacheSize = 10000) {\r\n const encodingName = model\r\n ? MODEL_ENCODING_MAP[model] || DEFAULT_ENCODING\r\n : DEFAULT_ENCODING;\r\n\r\n this.encoding = get_encoding(encodingName);\r\n this.cache = new Map();\r\n this.maxCacheSize = maxCacheSize;\r\n }\r\n\r\n /**\r\n * Count tokens in a string\r\n */\r\n countTokens(text: string): number {\r\n // Check cache first\r\n const cached = this.cache.get(text);\r\n if (cached !== undefined) {\r\n return cached;\r\n }\r\n\r\n // Calculate tokens\r\n const tokens = this.encoding.encode(text).length;\r\n\r\n // Cache the result (with LRU eviction)\r\n if (this.cache.size >= this.maxCacheSize) {\r\n const firstKey = this.cache.keys().next().value;\r\n this.cache.delete(firstKey!);\r\n }\r\n this.cache.set(text, tokens);\r\n\r\n return tokens;\r\n }\r\n\r\n /**\r\n * Count tokens in messages\r\n */\r\n countMessageTokens(messages: Message[]): number {\r\n let total = 0;\r\n\r\n for (const message of messages) {\r\n // Count role tokens\r\n total += this.countTokens(message.role);\r\n\r\n // Count content tokens\r\n total += this.countTokens(message.content);\r\n\r\n // Count tool call tokens if present\r\n if (message.toolCalls) {\r\n for (const toolCall of message.toolCalls) {\r\n total += this.countTokens(toolCall.name);\r\n total += this.countTokens(JSON.stringify(toolCall.arguments));\r\n }\r\n }\r\n\r\n // Add message formatting tokens (approximately 4 per message)\r\n total += 4;\r\n }\r\n\r\n // Add conversation formatting tokens\r\n total += 3;\r\n\r\n return total;\r\n }\r\n\r\n /**\r\n * Estimate cost based on token count\r\n * Prices are approximate and should be updated based on actual provider pricing\r\n */\r\n estimateCost(\r\n promptTokens: number,\r\n completionTokens: number,\r\n model: string\r\n ): number {\r\n // These are example rates - update with actual pricing\r\n const pricing: Record<string, { input: number; output: number }> = {\r\n 'gpt-4-turbo': { input: 0.01 / 1000, output: 0.03 / 1000 },\r\n 'gpt-3.5-turbo': { input: 0.0005 / 1000, output: 0.0015 / 1000 },\r\n 'claude-3-opus': { input: 0.015 / 1000, output: 0.075 / 1000 },\r\n 'claude-3-sonnet': { input: 0.003 / 1000, output: 0.015 / 1000 },\r\n };\r\n\r\n const modelPricing = pricing[model] || pricing['gpt-3.5-turbo']!;\r\n\r\n return (\r\n promptTokens * modelPricing.input +\r\n completionTokens * modelPricing.output\r\n );\r\n }\r\n\r\n /**\r\n * Clear the cache\r\n */\r\n clearCache(): void {\r\n this.cache.clear();\r\n }\r\n\r\n /**\r\n * Free the encoding\r\n */\r\n dispose(): void {\r\n this.encoding.free();\r\n this.cache.clear();\r\n }\r\n}\r\n\r\n// Singleton instance for default usage\r\nlet defaultCounter: TokenCounter | null = null;\r\n\r\n/**\r\n * Get the default token counter instance\r\n */\r\nexport function getTokenCounter(model?: string): TokenCounter {\r\n if (!defaultCounter) {\r\n defaultCounter = new TokenCounter(model);\r\n }\r\n return defaultCounter;\r\n}\r\n\r\n/**\r\n * Quick token counting function\r\n */\r\nexport function countTokens(text: string, model?: string): number {\r\n return getTokenCounter(model).countTokens(text);\r\n}\r\n\r\n/**\r\n * Quick message token counting function\r\n */\r\nexport function countMessageTokens(messages: Message[], model?: string): number {\r\n return getTokenCounter(model).countMessageTokens(messages);\r\n}","import { nanoid } from 'nanoid';\r\nimport stringify from 'fast-json-stable-stringify';\r\nimport type { Message } from '../types';\r\n\r\n/**\r\n * Generate a unique ID\r\n */\r\nexport function generateId(prefix?: string): string {\r\n const id = nanoid();\r\n return prefix ? `${prefix}_${id}` : id;\r\n}\r\n\r\n/**\r\n * Create a stable hash for cache keys\r\n */\r\nexport function createCacheKey(data: unknown): string {\r\n return stringify(data);\r\n}\r\n\r\n/**\r\n * Format messages for provider APIs\r\n */\r\nexport function formatMessages(messages: Message[]): Message[] {\r\n return messages.map((msg) => ({\r\n ...msg,\r\n id: msg.id || generateId('msg'),\r\n timestamp: msg.timestamp || Date.now(),\r\n }));\r\n}\r\n\r\n/**\r\n * Retry with exponential backoff\r\n */\r\nexport async function retry<T>(\r\n fn: () => Promise<T>,\r\n options: {\r\n maxAttempts: number;\r\n initialDelay: number;\r\n maxDelay: number;\r\n backoffMultiplier: number;\r\n onRetry?: (attempt: number, error: Error) => void;\r\n }\r\n): Promise<T> {\r\n let lastError: Error;\r\n let delay = options.initialDelay;\r\n\r\n for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error as Error;\r\n\r\n if (attempt === options.maxAttempts) {\r\n throw lastError;\r\n }\r\n\r\n if (options.onRetry) {\r\n options.onRetry(attempt, lastError);\r\n }\r\n\r\n await sleep(Math.min(delay, options.maxDelay));\r\n delay *= options.backoffMultiplier;\r\n }\r\n }\r\n\r\n throw lastError!;\r\n}\r\n\r\n/**\r\n * Sleep for a given duration\r\n */\r\nexport function sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n/**\r\n * Chunk an array into smaller arrays\r\n */\r\nexport function chunk<T>(array: T[], size: number): T[][] {\r\n const chunks: T[][] = [];\r\n for (let i = 0; i < array.length; i += size) {\r\n chunks.push(array.slice(i, i + size));\r\n }\r\n return chunks;\r\n}\r\n\r\n/**\r\n * Debounce a function\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n fn: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: NodeJS.Timeout;\r\n\r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(() => fn(...args), delay);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle a function\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n fn: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean;\r\n\r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n fn(...args);\r\n inThrottle = true;\r\n setTimeout(() => (inThrottle = false), limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Safely parse JSON\r\n */\r\nexport function safeJsonParse<T = unknown>(json: string): T | null {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a value is a plain object\r\n */\r\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n value.constructor === Object\r\n );\r\n}\r\n\r\n/**\r\n * Deep merge objects\r\n */\r\nexport function deepMerge<T extends Record<string, any>>(\r\n target: T,\r\n ...sources: Partial<T>[]\r\n): T {\r\n if (!sources.length) return target;\r\n\r\n const source = sources.shift();\r\n\r\n if (isPlainObject(target) && isPlainObject(source)) {\r\n for (const key in source) {\r\n if (isPlainObject(source[key])) {\r\n if (!target[key]) Object.assign(target, { [key]: {} });\r\n deepMerge(target[key], source[key] as any);\r\n } else {\r\n Object.assign(target, { [key]: source[key] });\r\n }\r\n }\r\n }\r\n\r\n return deepMerge(target, ...sources);\r\n}\r\n\r\n/**\r\n * Convert async generator to array\r\n */\r\nexport async function streamToArray<T>(\r\n stream: AsyncGenerator<T>\r\n): Promise<T[]> {\r\n const result: T[] = [];\r\n for await (const item of stream) {\r\n result.push(item);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Measure execution time\r\n */\r\nexport async function measureTime<T>(\r\n fn: () => Promise<T>\r\n): Promise<{ result: T; duration: number }> {\r\n const start = performance.now();\r\n const result = await fn();\r\n const duration = performance.now() - start;\r\n return { result, duration };\r\n}","import EventEmitter from 'eventemitter3';\r\nimport type { StreamEvent, Message, ToolCall, Artifact, TokenUsage } from '../types';\r\nimport { generateId } from '../utils';\r\n\r\n/**\r\n * StreamWriter for generating and managing streaming events\r\n * Handles live event emission for real-time AI responses\r\n */\r\nexport class StreamWriter extends EventEmitter {\r\n private events: StreamEvent[] = [];\r\n private currentText = '';\r\n private currentToolCall: ToolCall | null = null;\r\n private currentArtifact: Artifact | null = null;\r\n private metadata: Record<string, unknown> = {};\r\n private closed = false;\r\n\r\n constructor(private debug = false) {\r\n super();\r\n }\r\n\r\n /**\r\n * Write text delta\r\n */\r\n writeText(delta: string): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n this.currentText += delta;\r\n\r\n const event: StreamEvent = {\r\n type: 'text-delta',\r\n delta,\r\n };\r\n\r\n this.emitEvent(event);\r\n }\r\n\r\n /**\r\n * Start a tool call\r\n */\r\n startToolCall(name: string, toolCallId?: string): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n const id = toolCallId || generateId('tool');\r\n\r\n this.currentToolCall = {\r\n id,\r\n name,\r\n arguments: {},\r\n };\r\n\r\n const event: StreamEvent = {\r\n type: 'tool-call-start',\r\n toolCall: this.currentToolCall,\r\n };\r\n\r\n this.emitEvent(event);\r\n }\r\n\r\n /**\r\n * Write tool call arguments delta\r\n */\r\n writeToolCallDelta(delta: string): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n if (!this.currentToolCall) {\r\n throw new Error('No active tool call');\r\n }\r\n\r\n const event: StreamEvent = {\r\n type: 'tool-call-delta',\r\n toolCallId: this.currentToolCall.id,\r\n delta,\r\n };\r\n\r\n this.emitEvent(event);\r\n }\r\n\r\n /**\r\n * End tool call with complete arguments\r\n */\r\n endToolCall(args: Record<string, unknown>): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n if (!this.currentToolCall) {\r\n throw new Error('No active tool call');\r\n }\r\n\r\n this.currentToolCall.arguments = args;\r\n\r\n const event: StreamEvent = {\r\n type: 'tool-call-end',\r\n toolCall: this.currentToolCall,\r\n };\r\n\r\n this.emitEvent(event);\r\n this.currentToolCall = null;\r\n }\r\n\r\n /**\r\n * Write tool result\r\n */\r\n writeToolResult(toolCallId: string, result: unknown, error?: string): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n const event: StreamEvent = {\r\n type: 'tool-result',\r\n result: {\r\n toolCallId,\r\n result,\r\n error,\r\n },\r\n };\r\n\r\n this.emitEvent(event);\r\n }\r\n\r\n /**\r\n * Start an artifact\r\n */\r\n startArtifact(\r\n type: Artifact['type'],\r\n options?: {\r\n id?: string;\r\n language?: string;\r\n title?: string;\r\n description?: string;\r\n }\r\n ): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n const id = options?.id || generateId('artifact');\r\n\r\n this.currentArtifact = {\r\n id,\r\n type,\r\n language: options?.language,\r\n title: options?.title,\r\n description: options?.description,\r\n content: '',\r\n };\r\n\r\n const event: StreamEvent = {\r\n type: 'artifact-start',\r\n artifact: {\r\n id: this.currentArtifact.id,\r\n type: this.currentArtifact.type,\r\n language: this.currentArtifact.language,\r\n title: this.currentArtifact.title,\r\n description: this.currentArtifact.description,\r\n },\r\n };\r\n\r\n this.emitEvent(event);\r\n }\r\n\r\n /**\r\n * Write artifact content delta\r\n */\r\n writeArtifactDelta(delta: string): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n if (!this.currentArtifact) {\r\n throw new Error('No active artifact');\r\n }\r\n\r\n this.currentArtifact.content += delta;\r\n\r\n const event: StreamEvent = {\r\n type: 'artifact-delta',\r\n delta,\r\n };\r\n\r\n this.emitEvent(event);\r\n }\r\n\r\n /**\r\n * End artifact\r\n */\r\n endArtifact(metadata?: Record<string, unknown>): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n if (!this.currentArtifact) {\r\n throw new Error('No active artifact');\r\n }\r\n\r\n if (metadata) {\r\n this.currentArtifact.metadata = metadata;\r\n }\r\n\r\n const event: StreamEvent = {\r\n type: 'artifact-end',\r\n artifact: this.currentArtifact,\r\n };\r\n\r\n this.emitEvent(event);\r\n this.currentArtifact = null;\r\n }\r\n\r\n /**\r\n * Write metadata\r\n */\r\n writeMetadata(metadata: Record<string, unknown>): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n this.metadata = { ...this.metadata, ...metadata };\r\n\r\n const event: StreamEvent = {\r\n type: 'metadata',\r\n metadata,\r\n };\r\n\r\n this.emitEvent(event);\r\n }\r\n\r\n /**\r\n * Write usage information\r\n */\r\n writeUsage(usage: TokenUsage): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n const event: StreamEvent = {\r\n type: 'usage',\r\n usage,\r\n };\r\n\r\n this.emitEvent(event);\r\n }\r\n\r\n /**\r\n * Write error\r\n */\r\n writeError(error: string): void {\r\n if (this.closed) {\r\n throw new Error('StreamWriter is closed');\r\n }\r\n\r\n const event: StreamEvent = {\r\n type: 'error',\r\n error,\r\n };\r\n\r\n this.emitEvent(event);\r\n }\r\n\r\n /**\r\n * Complete the stream\r\n */\r\n done(finalMessage?: Partial<Message>): void {\r\n if (this.closed) {\r\n return;\r\n }\r\n\r\n const message: Message = {\r\n id: finalMessage?.id || generateId('msg'),\r\n role: finalMessage?.role || 'assistant',\r\n content: finalMessage?.content || this.currentText,\r\n metadata: { ...this.metadata, ...finalMessage?.metadata },\r\n timestamp: Date.now(),\r\n ...(finalMessage?.toolCalls && { toolCalls: finalMessage.toolCalls }),\r\n ...(finalMessage?.toolResults && { toolResults: finalMessage.toolResults }),\r\n };\r\n\r\n const event: StreamEvent = {\r\n type: 'done',\r\n finalMessage: message,\r\n };\r\n\r\n this.emitEvent(event);\r\n this.closed = true;\r\n this.emit('close');\r\n }\r\n\r\n /**\r\n * Get all collected events\r\n */\r\n getEvents(): StreamEvent[] {\r\n return [...this.events];\r\n }\r\n\r\n /**\r\n * Convert to async generator\r\n */\r\n async *toGenerator(): AsyncGenerator<StreamEvent> {\r\n const queue: StreamEvent[] = [];\r\n let resolveNext: ((value: IteratorResult<StreamEvent>) => void) | null = null;\r\n let finished = false;\r\n\r\n const eventHandler = (event: StreamEvent) => {\r\n if (resolveNext) {\r\n resolveNext({ value: event, done: false });\r\n resolveNext = null;\r\n } else {\r\n queue.push(event);\r\n }\r\n };\r\n\r\n const closeHandler = () => {\r\n finished = true;\r\n if (resolveNext) {\r\n resolveNext({ value: undefined as any, done: true });\r\n resolveNext = null;\r\n }\r\n };\r\n\r\n this.on('event', eventHandler);\r\n this.on('close', closeHandler);\r\n\r\n try {\r\n while (!finished || queue.length > 0) {\r\n if (queue.length > 0) {\r\n yield queue.shift()!;\r\n } else if (!finished) {\r\n await new Promise<void>((resolve) => {\r\n resolveNext = (result) => {\r\n if (!result.done) {\r\n queue.push(result.value);\r\n }\r\n resolve();\r\n };\r\n });\r\n }\r\n }\r\n } finally {\r\n this.off('event', eventHandler);\r\n this.off('close', closeHandler);\r\n }\r\n }\r\n\r\n /**\r\n * Emit event (internal)\r\n */\r\n private emitEvent(event: StreamEvent): void {\r\n this.events.push(event);\r\n this.emit('event', event);\r\n\r\n if (this.debug) {\r\n console.log('[StreamWriter]', event.type, event);\r\n }\r\n }\r\n\r\n /**\r\n * Check if stream is closed\r\n */\r\n isClosed(): boolean {\r\n return this.closed;\r\n }\r\n\r\n /**\r\n * Reset the writer\r\n */\r\n reset(): void {\r\n this.events = [];\r\n this.currentText = '';\r\n this.currentToolCall = null;\r\n this.currentArtifact = null;\r\n this.metadata = {};\r\n this.closed = false;\r\n this.removeAllListeners();\r\n }\r\n}\r\n\r\n/**\r\n * Create a stream writer\r\n */\r\nexport function createStreamWriter(debug = false): StreamWriter {\r\n return new StreamWriter(debug);\r\n}","import { createParser, type EventSourceMessage } from 'eventsource-parser';\r\nimport type { StreamEvent } from '../types';\r\n\r\n/**\r\n * Parse SSE stream into structured events\r\n */\r\nexport async function* parseSSEStream(\r\n stream: ReadableStream<Uint8Array>\r\n): AsyncGenerator<StreamEvent> {\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n let buffer = '';\r\n\r\n const parser = createParser({\r\n onEvent: (event: EventSourceMessage) => {\r\n buffer = event.data;\r\n },\r\n onRetry: (_interval: number) => {\r\n // Optional: handle retry interval if needed\r\n },\r\n });\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n\r\n if (done) break;\r\n\r\n const chunk = decoder.decode(value, { stream: true });\r\n parser.feed(chunk);\r\n\r\n if (buffer) {\r\n try {\r\n const parsed = JSON.parse(buffer);\r\n\r\n // Convert parsed data to StreamEvent\r\n if (parsed.type) {\r\n yield parsed as StreamEvent;\r\n }\r\n\r\n buffer = '';\r\n } catch (error) {\r\n // If parsing fails, it might be incomplete - continue\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n // Flush any remaining data at end of stream\r\n parser.reset({ consume: true });\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n}\r\n\r\n/**\r\n * Convert async generator to ReadableStream\r\n */\r\nexport function toReadableStream(\r\n generator: AsyncGenerator<StreamEvent>\r\n): ReadableStream<Uint8Array> {\r\n const encoder = new TextEncoder();\r\n\r\n return new ReadableStream({\r\n async start(controller) {\r\n try {\r\n for await (const event of generator) {\r\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\r\n controller.enqueue(encoder.encode(data));\r\n }\r\n controller.close();\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Pipe stream to HTTP response (h3 compatible)\r\n */\r\nexport async function pipeToResponse(\r\n generator: AsyncGenerator<StreamEvent>,\r\n response: any // h3 event or native Response\r\n): Promise<void> {\r\n const stream = toReadableStream(generator);\r\n\r\n // Set SSE headers\r\n const headers = {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n };\r\n\r\n // Handle h3 response\r\n if (response.node && response.node.res) {\r\n const res = response.node.res;\r\n\r\n Object.entries(headers).forEach(([key, value]) => {\r\n res.setHeader(key, value);\r\n });\r\n\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n const text = decoder.decode(value, { stream: true });\r\n res.write(text);\r\n }\r\n } finally {\r\n res.end();\r\n }\r\n }\r\n // Handle native Response\r\n else if (response instanceof Response || typeof response.body !== 'undefined') {\r\n return; // Stream is already set as body\r\n }\r\n // Handle raw Node.js response\r\n else {\r\n Object.entries(headers).forEach(([key, value]) => {\r\n response.setHeader(key, value);\r\n });\r\n\r\n const reader = stream.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n const text = decoder.decode(value, { stream: true });\r\n response.write(text);\r\n }\r\n } finally {\r\n response.end();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Merge multiple streams into one\r\n */\r\nexport async function* mergeStreams(\r\n ...generators: AsyncGenerator<StreamEvent>[]\r\n): AsyncGenerator<StreamEvent> {\r\n const promises = generators.map(async (gen) => {\r\n const items: StreamEvent[] = [];\r\n for await (const item of gen) {\r\n items.push(item);\r\n }\r\n return items;\r\n });\r\n\r\n const results = await Promise.all(promises);\r\n\r\n // Yield all items in order\r\n for (const items of results) {\r\n for (const item of items) {\r\n yield item;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Transform stream events\r\n */\r\nexport async function* transformStream<T>(\r\n generator: AsyncGenerator<StreamEvent>,\r\n transformer: (event: StreamEvent) => T | null\r\n): AsyncGenerator<T> {\r\n for await (const event of generator) {\r\n const transformed = transformer(event);\r\n if (transformed !== null) {\r\n yield transformed;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Filter stream events\r\n */\r\nexport async function* filterStream(\r\n generator: AsyncGenerator<StreamEvent>,\r\n predicate: (event: StreamEvent) => boolean\r\n): AsyncGenerator<StreamEvent> {\r\n for await (const event of generator) {\r\n if (predicate(event)) {\r\n yield event;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Collect stream into array\r\n */\r\nexport async function collectStream(\r\n generator: AsyncGenerator<StreamEvent>\r\n): Promise<StreamEvent[]> {\r\n const events: StreamEvent[] = [];\r\n\r\n for await (const event of generator) {\r\n events.push(event);\r\n }\r\n\r\n return events;\r\n}\r\n\r\n/**\r\n * Take first N events from stream\r\n */\r\nexport async function* takeStream(\r\n generator: AsyncGenerator<StreamEvent>,\r\n count: number\r\n): AsyncGenerator<StreamEvent> {\r\n let taken = 0;\r\n\r\n for await (const event of generator) {\r\n if (taken >= count) break;\r\n yield event;\r\n taken++;\r\n }\r\n}\r\n\r\n/**\r\n * Batch stream events\r\n */\r\nexport async function* batchStream(\r\n generator: AsyncGenerator<StreamEvent>,\r\n size: number,\r\n timeoutMs?: number\r\n): AsyncGenerator<StreamEvent[]> {\r\n let batch: StreamEvent[] = [];\r\n let timeoutId: NodeJS.Timeout | null = null;\r\n\r\n const flushBatch = async () => {\r\n if (batch.length > 0) {\r\n const toFlush = [...batch];\r\n batch = [];\r\n return toFlush;\r\n }\r\n return null;\r\n };\r\n\r\n try {\r\n for await (const event of generator) {\r\n batch.push(event);\r\n\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n\r\n if (batch.length >= size) {\r\n const flushed = await flushBatch();\r\n if (flushed) yield flushed;\r\n } else if (timeoutMs) {\r\n timeoutId = setTimeout(async () => {\r\n const flushed = await flushBatch();\r\n if (flushed) {\r\n // Note: This won't work perfectly with async generators\r\n // Consider using a different batching strategy for time-based batching\r\n }\r\n }, timeoutMs);\r\n }\r\n }\r\n\r\n // Flush remaining\r\n const remaining = await flushBatch();\r\n if (remaining) yield remaining;\r\n } finally {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n }\r\n}","\r\n// Error Types\r\nexport class PaprFlareError extends Error {\r\n constructor(\r\n message: string,\r\n public code: string,\r\n public statusCode?: number,\r\n public details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'PaprFlareError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends PaprFlareError {\r\n constructor(message: string, public retryAfter?: number) {\r\n super(message, 'RATE_LIMIT_ERROR', 429);\r\n }\r\n}\r\n\r\nexport class ValidationError extends PaprFlareError {\r\n constructor(message: string, details?: unknown) {\r\n super(message, 'VALIDATION_ERROR', 400, details);\r\n }\r\n}\r\n\r\nexport class ProviderError extends PaprFlareError {\r\n constructor(message: string, public provider: string, statusCode?: number) {\r\n super(message, 'PROVIDER_ERROR', statusCode);\r\n }\r\n}","import Redis from 'ioredis';\r\nimport { LRUCache } from 'lru-cache';\r\nimport { createCacheKey } from '../utils';\r\nimport type { Message, ChatConfig, StreamEvent } from '../types';\r\n\r\nexport interface CacheOptions {\r\n type: 'redis' | 'memory';\r\n ttl?: number; // Time to live in seconds\r\n redis?: {\r\n host: string;\r\n port: number;\r\n password?: string;\r\n db?: number;\r\n keyPrefix?: string;\r\n };\r\n memory?: {\r\n maxSize: number; // Maximum number of items\r\n maxAge?: number; // Maximum age in ms\r\n };\r\n}\r\n\r\n/**\r\n * Abstract cache interface\r\n */\r\nexport interface ICache {\r\n get(key: string): Promise<string | null>;\r\n set(key: string, value: string, ttl?: number): Promise<void>;\r\n delete(key: string): Promise<void>;\r\n clear(): Promise<void>;\r\n has(key: string): Promise<boolean>;\r\n}\r\n\r\n/**\r\n * Redis cache implementation for distributed caching\r\n */\r\nexport class RedisCache implements ICache {\r\n private client: Redis;\r\n private keyPrefix: string;\r\n private defaultTTL: number;\r\n\r\n constructor(options: CacheOptions['redis'] & { ttl?: number }) {\r\n this.client = new Redis({\r\n host: options.host,\r\n port: options.port,\r\n password: options.password,\r\n db: options.db || 0,\r\n retryStrategy: (times) => {\r\n const delay = Math.min(times * 50, 2000);\r\n return delay;\r\n },\r\n maxRetriesPerRequest: 3,\r\n enableReadyCheck: true,\r\n lazyConnect: false,\r\n });\r\n\r\n this.keyPrefix = options.keyPrefix || 'paprflare:';\r\n this.defaultTTL = options.ttl || 3600; // 1 hour default\r\n\r\n // Handle errors\r\n this.client.on('error', (err) => {\r\n console.error('Redis cache error:', err);\r\n });\r\n }\r\n\r\n private getKey(key: string): string {\r\n return `${this.keyPrefix}${key}`;\r\n }\r\n\r\n async get(key: string): Promise<string | null> {\r\n try {\r\n return await this.client.get(this.getKey(key));\r\n } catch (error) {\r\n console.error('Redis get error:', error);\r\n return null;\r\n }\r\n }\r\n\r\n async set(key: string, value: string, ttl?: number): Promise<void> {\r\n try {\r\n const actualTTL = ttl || this.defaultTTL;\r\n await this.client.setex(this.getKey(key), actualTTL, value);\r\n } catch (error) {\r\n console.error('Redis set error:', error);\r\n }\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n try {\r\n await this.client.del(this.getKey(key));\r\n } catch (error) {\r\n console.error('Redis delete error:', error);\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n try {\r\n const keys = await this.client.keys(`${this.keyPrefix}*`);\r\n if (keys.length > 0) {\r\n await this.client.del(...keys);\r\n }\r\n } catch (error) {\r\n console.error('Redis clear error:', error);\r\n }\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n try {\r\n const exists = await this.client.exists(this.getKey(key));\r\n return exists === 1;\r\n } catch (error) {\r\n console.error('Redis has error:', error);\r\n return false;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n await this.client.quit();\r\n }\r\n}\r\n\r\n/**\r\n * In-memory LRU cache for single-instance or development use\r\n */\r\nexport class MemoryCache implements ICache {\r\n private cache: LRUCache<string, string>;\r\n\r\n constructor(options: CacheOptions['memory']) {\r\n this.cache = new LRUCache<string, string>({\r\n max: options?.maxSize || 1000,\r\n ttl: options?.maxAge || 3600000, // 1 hour default\r\n updateAgeOnGet: true,\r\n updateAgeOnHas: true,\r\n });\r\n }\r\n\r\n async get(key: string): Promise<string | null> {\r\n return this.cache.get(key) || null;\r\n }\r\n\r\n async set(key: string, value: string): Promise<void> {\r\n this.cache.set(key, value);\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n this.cache.delete(key);\r\n }\r\n\r\n async clear(): Promise<void> {\r\n this.cache.clear();\r\n }\r\n\r\n async has(key: string): Promise<boolean> {\r\n return this.cache.has(key);\r\n }\r\n}\r\n\r\n/**\r\n * Cache manager with automatic cache key generation\r\n */\r\nexport class CacheManager {\r\n private cache: ICache;\r\n private enabled: boolean;\r\n\r\n constructor(options: CacheOptions) {\r\n this.enabled = true;\r\n\r\n if (options.type === 'redis') {\r\n this.cache = new RedisCache({\r\n ...options.redis!,\r\n ttl: options.ttl,\r\n });\r\n } else {\r\n this.cache = new MemoryCache(options.memory!);\r\n }\r\n }\r\n\r\n /**\r\n * Generate cache key from messages and config\r\n */\r\n private generateCacheKey(messages: Message[], config: ChatConfig): string {\r\n const cacheData = {\r\n messages: messages.map((m) => ({\r\n role: m.role,\r\n content: m.content,\r\n toolCalls: m.toolCalls,\r\n })),\r\n model: config.model,\r\n temperature: config.temperature,\r\n maxTokens: config.maxTokens,\r\n tools: config.tools?.map((t) => t.name),\r\n };\r\n\r\n return createCacheKey(cacheData);\r\n }\r\n\r\n /**\r\n * Get cached response\r\n */\r\n async getCachedResponse(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): Promise<StreamEvent[] | null> {\r\n if (!this.enabled || config.cache?.enabled === false) {\r\n return null;\r\n }\r\n\r\n const cacheKey = config.cache?.key || this.generateCacheKey(messages, config);\r\n const cached = await this.cache.get(cacheKey);\r\n\r\n if (cached) {\r\n try {\r\n return JSON.parse(cached) as StreamEvent[];\r\n } catch (error) {\r\n console.error('Cache parse error:', error);\r\n await this.cache.delete(cacheKey);\r\n return null;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Cache response\r\n */\r\n async cacheResponse(\r\n messages: Message[],\r\n config: ChatConfig,\r\n events: StreamEvent[]\r\n ): Promise<void> {\r\n if (!this.enabled || config.cache?.enabled === false) {\r\n return;\r\n }\r\n\r\n const cacheKey = config.cache?.key || this.generateCacheKey(messages, config);\r\n const ttl = config.cache?.ttl;\r\n\r\n await this.cache.set(cacheKey, JSON.stringify(events), ttl);\r\n }\r\n\r\n /**\r\n * Invalidate cache\r\n */\r\n async invalidate(messages: Message[], config: ChatConfig): Promise<void> {\r\n const cacheKey = this.generateCacheKey(messages, config);\r\n await this.cache.delete(cacheKey);\r\n }\r\n\r\n /**\r\n * Clear all cache\r\n */\r\n async clearAll(): Promise<void> {\r\n await this.cache.clear();\r\n }\r\n\r\n /**\r\n * Disable caching\r\n */\r\n disable(): void {\r\n this.enabled = false;\r\n }\r\n\r\n /**\r\n * Enable caching\r\n */\r\n enable(): void {\r\n this.enabled = true;\r\n }\r\n}","import { z } from 'zod';\r\nimport PQueue from 'p-queue';\r\nimport { Mutex } from 'async-mutex';\r\nimport type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n PaprFlareMode,\r\n CloudConfig,\r\n SelfManagedConfig,\r\n ChatResponse,\r\n StreamingChatResponse,\r\n TokenUsage,\r\n} from '../types';\r\nimport { PaprFlareError } from '../utils';\r\nimport { CacheManager } from '../cache';\r\nimport { generateId, retry, formatMessages } from '../utils';\r\nimport {\r\n toReadableStream,\r\n pipeToResponse,\r\n mergeStreams,\r\n collectStream,\r\n} from '../utils';\r\n\r\nexport interface PaprFlareClientConfig {\r\n mode: PaprFlareMode;\r\n cloud?: CloudConfig;\r\n selfManaged?: SelfManagedConfig;\r\n\r\n // Rate limiting for high throughput\r\n rateLimit?: {\r\n maxConcurrent?: number;\r\n interval?: number;\r\n intervalCap?: number;\r\n };\r\n\r\n // Default retry configuration\r\n defaultRetry?: {\r\n maxAttempts: number;\r\n initialDelay: number;\r\n maxDelay: number;\r\n backoffMultiplier: number;\r\n };\r\n}\r\n\r\n/**\r\n * Main PaprFlare client for AI interactions\r\n * Optimized for millions of throughputs with built-in caching, rate limiting, and retry logic\r\n */\r\nexport class PaprFlareClient {\r\n private mode: PaprFlareMode;\r\n private cloudConfig?: CloudConfig;\r\n private providerCallback?: ProviderCallback;\r\n private cacheManager?: CacheManager;\r\n private queue: PQueue;\r\n private mutex: Mutex;\r\n private defaultRetryConfig: Required<NonNullable<PaprFlareClientConfig['defaultRetry']>>;\r\n\r\n constructor(config: PaprFlareClientConfig) {\r\n this.mode = config.mode;\r\n this.mutex = new Mutex();\r\n\r\n // Initialize rate limiting queue for high throughput\r\n const rateLimitConfig = config.rateLimit || {};\r\n this.queue = new PQueue({\r\n concurrency: rateLimitConfig.maxConcurrent || 100,\r\n interval: rateLimitConfig.interval || 1000,\r\n intervalCap: rateLimitConfig.intervalCap || 100,\r\n timeout: 30000, // 30 second timeout\r\n });\r\n\r\n // Default retry configuration\r\n this.defaultRetryConfig = config.defaultRetry || {\r\n maxAttempts: 3,\r\n initialDelay: 1000,\r\n maxDelay: 10000,\r\n backoffMultiplier: 2,\r\n };\r\n\r\n if (config.mode === 'cloud') {\r\n if (!config.cloud) {\r\n throw new PaprFlareError(\r\n 'Cloud config is required for cloud mode',\r\n 'INVALID_CONFIG'\r\n );\r\n }\r\n this.cloudConfig = config.cloud;\r\n } else {\r\n if (!config.selfManaged?.provider) {\r\n throw new PaprFlareError(\r\n 'Provider callback is required for self-managed mode',\r\n 'INVALID_CONFIG'\r\n );\r\n }\r\n this.providerCallback = config.selfManaged.provider;\r\n\r\n // Initialize cache if configured\r\n if (config.selfManaged.cache) {\r\n this.cacheManager = new CacheManager(config.selfManaged.cache);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Main chat method - handles both streaming and non-streaming responses\r\n */\r\n async chat(\r\n messages: Message[],\r\n config: ChatConfig = {}\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n // Validate and format messages\r\n const formattedMessages = formatMessages(messages);\r\n\r\n // Validate configuration\r\n this.validateConfig(config);\r\n\r\n // Check cache if enabled\r\n if (this.cacheManager && config.cache?.enabled !== false) {\r\n const cached = await this.cacheManager.getCachedResponse(\r\n formattedMessages,\r\n config\r\n );\r\n\r\n if (cached) {\r\n if (config.stream) {\r\n return this.createStreamingResponse(\r\n this.eventsToGenerator(cached)\r\n );\r\n } else {\r\n return this.eventsToResponse(cached);\r\n }\r\n }\r\n }\r\n\r\n // Add to queue for rate limiting\r\n return this.queue.add(async () => {\r\n return this.executeChat(formattedMessages, config);\r\n }) as Promise<ChatResponse | StreamingChatResponse>;\r\n }\r\n\r\n /**\r\n * Execute chat with retry logic\r\n */\r\n private async executeChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n const retryConfig = config.retry || this.defaultRetryConfig;\r\n\r\n return retry(\r\n async () => {\r\n if (this.mode === 'cloud') {\r\n return this.executeCloudChat(messages, config);\r\n } else {\r\n return this.executeSelfManagedChat(messages, config);\r\n }\r\n },\r\n {\r\n ...retryConfig,\r\n onRetry: (attempt, error) => {\r\n console.warn(\r\n `[PaprFlare] Retry attempt ${attempt}/${retryConfig.maxAttempts}:`,\r\n error.message\r\n );\r\n },\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Execute chat in cloud mode\r\n */\r\n private async executeCloudChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n const response = await fetch(\r\n `${this.cloudConfig!.baseURL || 'https://api.paprflare.in'}/v1/chat`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${this.cloudConfig!.apiKey}`,\r\n 'X-PaprFlare-Region': this.cloudConfig!.region || 'in-mumbai',\r\n },\r\n body: JSON.stringify({\r\n messages,\r\n ...config,\r\n }),\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n throw new PaprFlareError(\r\n `Cloud API error: ${response.statusText}`,\r\n 'CLOUD_API_ERROR',\r\n response.status\r\n );\r\n }\r\n\r\n if (config.stream) {\r\n const stream = this.parseCloudStream(response.body!);\r\n return this.createStreamingResponse(stream);\r\n } else {\r\n const data = await response.json();\r\n return data as ChatResponse;\r\n }\r\n }\r\n\r\n /**\r\n * Execute chat in self-managed mode\r\n */\r\n private async executeSelfManagedChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): Promise<ChatResponse | StreamingChatResponse> {\r\n if (!this.providerCallback) {\r\n throw new PaprFlareError(\r\n 'Provider callback not configured',\r\n 'INVALID_CONFIG'\r\n );\r\n }\r\n\r\n // Handle structured output\r\n if (config.output?.schema) {\r\n return this.executeStructuredOutput(messages, config);\r\n }\r\n\r\n // Execute provider callback\r\n const stream = this.providerCallback(messages, config);\r\n\r\n if (config.stream) {\r\n // Cache streaming response if enabled\r\n if (this.cacheManager && config.cache?.enabled !== false) {\r\n const events: StreamEvent[] = [];\r\n const cachedStream = (async function* (this: PaprFlareClient) {\r\n try {\r\n for await (const event of stream) {\r\n events.push(event);\r\n yield event;\r\n }\r\n } finally {\r\n await this.cacheManager!.cacheResponse(messages, config, events);\r\n }\r\n }).bind(this)();\r\n\r\n return this.createStreamingResponse(cachedStream);\r\n }\r\n\r\n return this.createStreamingResponse(stream);\r\n } else {\r\n // Collect all events\r\n const events = await collectStream(stream);\r\n\r\n // Cache if enabled\r\n if (this.cacheManager && config.cache?.enabled !== false) {\r\n await this.cacheManager.cacheResponse(messages, config, events);\r\n }\r\n\r\n return this.eventsToResponse(events);\r\n }\r\n }\r\n\r\n /**\r\n * Execute structured output generation\r\n */\r\n private async executeStructuredOutput(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): Promise<ChatResponse> {\r\n const schema = config.output!.schema;\r\n const stream = this.providerCallback!(messages, {\r\n ...config,\r\n stream: false,\r\n });\r\n\r\n const events = await collectStream(stream);\r\n const textContent = events\r\n .filter((e) => e.type === 'text-delta')\r\n .map((e) => e.type === 'text-delta' ? e.delta : '')\r\n .join('');\r\n\r\n // Parse and validate against schema\r\n try {\r\n const parsed = JSON.parse(textContent);\r\n const validated = schema.parse(parsed);\r\n\r\n const doneEvent = events.find((e) => e.type === 'done');\r\n const message: Message = doneEvent && doneEvent.type === 'done'\r\n ? doneEvent.finalMessage\r\n : {\r\n id: generateId('msg'),\r\n role: 'assistant',\r\n content: JSON.stringify(validated),\r\n timestamp: Date.now(),\r\n };\r\n\r\n return {\r\n message,\r\n usage: events.find((e) => e.type === 'usage' && 'usage' in e)?.['usage'] as TokenUsage,\r\n };\r\n } catch (error) {\r\n throw new PaprFlareError(\r\n `Structured output validation failed: ${error}`,\r\n 'VALIDATION_ERROR',\r\n 400,\r\n error\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Create streaming response object\r\n */\r\n private createStreamingResponse(\r\n stream: AsyncGenerator<StreamEvent>\r\n ): StreamingChatResponse {\r\n return {\r\n stream,\r\n toReadableStream: () => toReadableStream(stream),\r\n pipeToResponse: async (response: Response) => {\r\n await pipeToResponse(stream, response);\r\n },\r\n mergeStreams: (...streams: AsyncGenerator<StreamEvent>[]) => {\r\n return mergeStreams(stream, ...streams);\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Parse cloud API stream\r\n */\r\n private async *parseCloudStream(\r\n body: ReadableStream<Uint8Array>\r\n ): AsyncGenerator<StreamEvent> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n const text = decoder.decode(value, { stream: true });\r\n const lines = text.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n const data = line.slice(6);\r\n if (data === '[DONE]') break;\r\n\r\n try {\r\n const event = JSON.parse(data) as StreamEvent;\r\n yield event;\r\n } catch (error) {\r\n console.error('Failed to parse event:', error);\r\n }\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n /**\r\n * Cache stream events\r\n */\r\n private async *cacheStream(\r\n stream: AsyncGenerator<StreamEvent>,\r\n events: StreamEvent[]\r\n ): AsyncGenerator<StreamEvent> {\r\n for await (const event of stream) {\r\n events.push(event);\r\n yield event;\r\n }\r\n }\r\n\r\n /**\r\n * Convert events to generator\r\n */\r\n private async *eventsToGenerator(\r\n events: StreamEvent[]\r\n ): AsyncGenerator<StreamEvent> {\r\n for (const event of events) {\r\n yield event;\r\n }\r\n }\r\n\r\n /**\r\n * Convert events to response\r\n */\r\n private eventsToResponse(events: StreamEvent[]): ChatResponse {\r\n const doneEvent = events.find((e) => e.type === 'done');\r\n const usageEvent = events.find((e) => e.type === 'usage');\r\n\r\n if (!doneEvent || doneEvent.type !== 'done') {\r\n throw new PaprFlareError(\r\n 'No completion event found in response',\r\n 'INVALID_RESPONSE'\r\n );\r\n }\r\n\r\n return {\r\n message: doneEvent.finalMessage,\r\n usage: usageEvent && usageEvent.type === 'usage' ? usageEvent.usage : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Validate configuration\r\n */\r\n private validateConfig(config: ChatConfig): void {\r\n if (config.temperature !== undefined) {\r\n if (config.temperature < 0 || config.temperature > 2) {\r\n throw new PaprFlareError(\r\n 'Temperature must be between 0 and 2',\r\n 'VALIDATION_ERROR',\r\n 400\r\n );\r\n }\r\n }\r\n\r\n if (config.maxTokens !== undefined && config.maxTokens < 1) {\r\n throw new PaprFlareError(\r\n 'Max tokens must be greater than 0',\r\n 'VALIDATION_ERROR',\r\n 400\r\n );\r\n }\r\n\r\n if (config.output?.schema && !config.stream) {\r\n // Structured output requires non-streaming mode\r\n config.stream = false;\r\n }\r\n }\r\n\r\n /**\r\n * Get queue statistics\r\n */\r\n getQueueStats() {\r\n return {\r\n size: this.queue.size,\r\n pending: this.queue.pending,\r\n concurrency: this.queue.concurrency,\r\n };\r\n }\r\n\r\n /**\r\n * Clear cache\r\n */\r\n async clearCache(): Promise<void> {\r\n if (this.cacheManager) {\r\n await this.cacheManager.clearAll();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Create structured output helper\r\n */\r\nexport function structuredOutput<T extends z.ZodSchema>(schema: T) {\r\n return {\r\n schema,\r\n mode: 'json' as const,\r\n };\r\n}","import type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface AnthropicConfig extends ProviderConfig {\r\n model?: string;\r\n anthropicVersion?: string;\r\n}\r\n\r\n/**\r\n * Anthropic (Claude) provider for PaprFlare\r\n */\r\nexport class AnthropicProvider {\r\n private config: AnthropicConfig;\r\n private baseURL: string;\r\n\r\n constructor(config: AnthropicConfig) {\r\n this.config = config;\r\n this.baseURL = config.baseURL || 'https://api.anthropic.com/v1';\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n /**\r\n * Stream chat completion\r\n */\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n // Extract system message if present\r\n const systemMessage = messages.find((m) => m.role === 'system');\r\n const conversationMessages = messages.filter((m) => m.role !== 'system');\r\n\r\n const response = await fetch(`${this.baseURL}/messages`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.config.apiKey,\r\n 'anthropic-version': this.config.anthropicVersion || '2023-06-01',\r\n ...this.config.headers,\r\n },\r\n body: JSON.stringify({\r\n model: config.model || this.config.model || 'claude-3-5-sonnet-20241022',\r\n messages: this.formatMessages(conversationMessages),\r\n max_tokens: config.maxTokens || 4096,\r\n temperature: config.temperature,\r\n top_p: config.topP,\r\n stop_sequences: config.stop,\r\n stream: true,\r\n ...(systemMessage && { system: systemMessage.content }),\r\n ...(config.tools && {\r\n tools: this.formatTools(config.tools),\r\n }),\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({})) as any;\r\n throw new ProviderError(\r\n error.error?.message || 'Anthropic API error',\r\n 'anthropic',\r\n response.status\r\n );\r\n }\r\n\r\n yield* this.parseStream(response.body!, writer);\r\n } catch (error) {\r\n if (error instanceof ProviderError) {\r\n throw error;\r\n }\r\n throw new ProviderError(\r\n `Anthropic provider error: ${error}`,\r\n 'anthropic'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Parse Anthropic SSE stream\r\n */\r\n private async *parseStream(\r\n body: ReadableStream<Uint8Array>,\r\n writer: StreamWriter\r\n ): AsyncGenerator<StreamEvent> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n let buffer = '';\r\n let currentToolUse: any = null;\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (!line.trim() || !line.startsWith('data: ')) continue;\r\n\r\n const data = line.slice(6);\r\n\r\n try {\r\n const parsed = JSON.parse(data);\r\n\r\n switch (parsed.type) {\r\n case 'message_start':\r\n // Message started\r\n break;\r\n\r\n case 'content_block_start':\r\n if (parsed.content_block?.type === 'tool_use') {\r\n currentToolUse = parsed.content_block;\r\n writer.startToolCall(\r\n currentToolUse.name,\r\n currentToolUse.id\r\n );\r\n }\r\n break;\r\n\r\n case 'content_block_delta':\r\n if (parsed.delta?.type === 'text_delta') {\r\n writer.writeText(parsed.delta.text);\r\n } else if (parsed.delta?.type === 'input_json_delta') {\r\n writer.writeToolCallDelta(parsed.delta.partial_json);\r\n }\r\n break;\r\n\r\n case 'content_block_stop':\r\n if (currentToolUse) {\r\n try {\r\n const args = JSON.parse(currentToolUse.input || '{}');\r\n writer.endToolCall(args);\r\n } catch {\r\n // Invalid JSON\r\n }\r\n currentToolUse = null;\r\n }\r\n break;\r\n\r\n case 'message_delta':\r\n if (parsed.usage) {\r\n writer.writeUsage({\r\n promptTokens: 0,\r\n completionTokens: parsed.usage.output_tokens || 0,\r\n totalTokens: parsed.usage.output_tokens || 0,\r\n });\r\n }\r\n break;\r\n\r\n case 'message_stop':\r\n writer.done();\r\n yield* writer.toGenerator();\r\n return;\r\n\r\n case 'error':\r\n writer.writeError(parsed.error?.message || 'Unknown error');\r\n break;\r\n }\r\n\r\n yield* writer.toGenerator();\r\n } catch (error) {\r\n console.error('Failed to parse Anthropic chunk:', error);\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n /**\r\n * Format messages for Anthropic API\r\n */\r\n private formatMessages(messages: Message[]): any[] {\r\n return messages.map((msg) => {\r\n const content: any[] = [];\r\n\r\n // Add text content\r\n if (msg.content) {\r\n content.push({\r\n type: 'text',\r\n text: msg.content,\r\n });\r\n }\r\n\r\n // Add tool use\r\n if (msg.toolCalls) {\r\n for (const toolCall of msg.toolCalls) {\r\n content.push({\r\n type: 'tool_use',\r\n id: toolCall.id,\r\n name: toolCall.name,\r\n input: toolCall.arguments,\r\n });\r\n }\r\n }\r\n\r\n // Add tool results\r\n if (msg.toolResults) {\r\n for (const result of msg.toolResults) {\r\n content.push({\r\n type: 'tool_result',\r\n tool_use_id: result.toolCallId,\r\n content: JSON.stringify(result.result),\r\n ...(result.error && { is_error: true }),\r\n });\r\n }\r\n }\r\n\r\n return {\r\n role: msg.role === 'assistant' ? 'assistant' : 'user',\r\n content: content.length === 1 && content[0].type === 'text'\r\n ? content[0].text\r\n : content,\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Format tools for Anthropic API\r\n */\r\n private formatTools(tools: ChatConfig['tools']): any[] {\r\n if (!tools) return [];\r\n\r\n return tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description,\r\n input_schema: this.zodToJsonSchema(tool.parameters),\r\n }));\r\n }\r\n\r\n /**\r\n * Convert Zod schema to JSON Schema (simplified)\r\n */\r\n private zodToJsonSchema(schema: any): any {\r\n // This is a simplified conversion\r\n // For production, use a library like zod-to-json-schema\r\n return {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Create Anthropic provider instance\r\n */\r\nexport function createAnthropicProvider(config: AnthropicConfig): ProviderCallback {\r\n const provider = new AnthropicProvider(config);\r\n return provider.createCallback();\r\n}","import type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface GoogleConfig extends ProviderConfig {\r\n model?: string;\r\n}\r\n\r\n/**\r\n * Google (Gemini) provider for PaprFlare\r\n */\r\nexport class GoogleProvider {\r\n private config: GoogleConfig;\r\n private baseURL: string;\r\n\r\n constructor(config: GoogleConfig) {\r\n this.config = config;\r\n this.baseURL = config.baseURL || 'https://generativelanguage.googleapis.com/v1beta';\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n /**\r\n * Stream chat completion\r\n */\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n const model = config.model || this.config.model || 'gemini-pro';\r\n\r\n const response = await fetch(\r\n `${this.baseURL}/models/${model}:streamGenerateContent?key=${this.config.apiKey}`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...this.config.headers,\r\n },\r\n body: JSON.stringify({\r\n contents: this.formatMessages(messages),\r\n generationConfig: {\r\n temperature: config.temperature,\r\n maxOutputTokens: config.maxTokens,\r\n topP: config.topP,\r\n stopSequences: config.stop,\r\n },\r\n ...(config.tools && {\r\n tools: this.formatTools(config.tools),\r\n }),\r\n }),\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({})) as any;\r\n throw new ProviderError(\r\n error.error?.message || 'Google AI API error',\r\n 'google',\r\n response.status\r\n );\r\n }\r\n\r\n yield* this.parseStream(response.body!, writer);\r\n } catch (error) {\r\n if (error instanceof ProviderError) {\r\n throw error;\r\n }\r\n throw new ProviderError(\r\n `Google provider error: ${error}`,\r\n 'google'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Parse Google AI stream\r\n */\r\n private async *parseStream(\r\n body: ReadableStream<Uint8Array>,\r\n writer: StreamWriter\r\n ): AsyncGenerator<StreamEvent> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n let buffer = '';\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n // Google uses JSON lines format\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (!line.trim()) continue;\r\n\r\n try {\r\n const parsed = JSON.parse(line);\r\n\r\n if (parsed.candidates && parsed.candidates[0]) {\r\n const candidate = parsed.candidates[0];\r\n\r\n if (candidate.content?.parts) {\r\n for (const part of candidate.content.parts) {\r\n // Handle text\r\n if (part.text) {\r\n writer.writeText(part.text);\r\n }\r\n\r\n // Handle function calls\r\n if (part.functionCall) {\r\n writer.startToolCall(\r\n part.functionCall.name,\r\n part.functionCall.name // Google doesn't provide IDs\r\n );\r\n writer.endToolCall(part.functionCall.args);\r\n }\r\n }\r\n }\r\n\r\n // Handle finish reason\r\n if (candidate.finishReason === 'STOP') {\r\n writer.done();\r\n yield* writer.toGenerator();\r\n return;\r\n }\r\n }\r\n\r\n // Handle usage metadata\r\n if (parsed.usageMetadata) {\r\n writer.writeUsage({\r\n promptTokens: parsed.usageMetadata.promptTokenCount || 0,\r\n completionTokens: parsed.usageMetadata.candidatesTokenCount || 0,\r\n totalTokens: parsed.usageMetadata.totalTokenCount || 0,\r\n });\r\n }\r\n\r\n yield* writer.toGenerator();\r\n } catch (error) {\r\n console.error('Failed to parse Google chunk:', error);\r\n }\r\n }\r\n }\r\n\r\n // If we exit loop without STOP, complete anyway\r\n if (!writer.isClosed()) {\r\n writer.done();\r\n yield* writer.toGenerator();\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n /**\r\n * Format messages for Google AI API\r\n */\r\n private formatMessages(messages: Message[]): any[] {\r\n return messages\r\n .filter((m) => m.role !== 'system') // Google uses system instructions separately\r\n .map((msg) => ({\r\n role: msg.role === 'assistant' ? 'model' : 'user',\r\n parts: [{ text: msg.content }],\r\n }));\r\n }\r\n\r\n /**\r\n * Format tools for Google AI API\r\n */\r\n private formatTools(tools: ChatConfig['tools']): any[] {\r\n if (!tools) return [];\r\n\r\n return [\r\n {\r\n functionDeclarations: tools.map((tool) => ({\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: this.zodToJsonSchema(tool.parameters),\r\n })),\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * Convert Zod schema to JSON Schema (simplified)\r\n */\r\n private zodToJsonSchema(schema: any): any {\r\n // Simplified conversion\r\n return {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Create Google provider instance\r\n */\r\nexport function createGoogleProvider(config: GoogleConfig): ProviderCallback {\r\n const provider = new GoogleProvider(config);\r\n return provider.createCallback();\r\n}","import type {\r\n Message,\r\n ChatConfig,\r\n StreamEvent,\r\n ProviderCallback,\r\n ProviderConfig,\r\n} from '../../types';\r\nimport { StreamWriter, ProviderError } from '../../utils';\r\n\r\nexport interface OpenAIConfig extends ProviderConfig {\r\n model?: string;\r\n}\r\n\r\n/**\r\n * OpenAI provider for PaprFlare\r\n */\r\nexport class OpenAIProvider {\r\n private config: OpenAIConfig;\r\n private baseURL: string;\r\n\r\n constructor(config: OpenAIConfig) {\r\n this.config = config;\r\n this.baseURL = config.baseURL || 'https://api.openai.com/v1';\r\n }\r\n\r\n /**\r\n * Create provider callback for PaprFlare client\r\n */\r\n createCallback(): ProviderCallback {\r\n return (messages: Message[], chatConfig: ChatConfig) => {\r\n return this.streamChat(messages, chatConfig);\r\n };\r\n }\r\n\r\n /**\r\n * Stream chat completion\r\n */\r\n private async *streamChat(\r\n messages: Message[],\r\n config: ChatConfig\r\n ): AsyncGenerator<StreamEvent> {\r\n const writer = new StreamWriter();\r\n\r\n try {\r\n const response = await fetch(`${this.baseURL}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${this.config.apiKey}`,\r\n ...(this.config.organization && {\r\n 'OpenAI-Organization': this.config.organization,\r\n }),\r\n ...this.config.headers,\r\n },\r\n body: JSON.stringify({\r\n model: config.model || this.config.model || 'gpt-4-turbo-preview',\r\n messages: this.formatMessages(messages),\r\n temperature: config.temperature,\r\n max_tokens: config.maxTokens,\r\n top_p: config.topP,\r\n frequency_penalty: config.frequencyPenalty,\r\n presence_penalty: config.presencePenalty,\r\n stop: config.stop,\r\n stream: true,\r\n ...(config.tools && {\r\n tools: this.formatTools(config.tools),\r\n tool_choice: config.toolChoice,\r\n }),\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({})) as any;\r\n throw new ProviderError(\r\n error.error?.message || 'OpenAI API error',\r\n 'openai',\r\n response.status\r\n );\r\n }\r\n\r\n yield* this.parseStream(response.body!, writer);\r\n } catch (error) {\r\n if (error instanceof ProviderError) {\r\n throw error;\r\n }\r\n throw new ProviderError(\r\n `OpenAI provider error: ${error}`,\r\n 'openai'\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Parse OpenAI SSE stream\r\n */\r\n private async *parseStream(\r\n body: ReadableStream<Uint8Array>,\r\n writer: StreamWriter\r\n ): AsyncGenerator<StreamEvent> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n\r\n let buffer = '';\r\n let currentToolCallIndex: number | null = null;\r\n let toolCallBuffer = '';\r\n\r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (!line.trim() || line.startsWith(':')) continue;\r\n\r\n if (line.startsWith('data: ')) {\r\n const data = line.slice(6);\r\n\r\n if (data === '[DONE]') {\r\n writer.done();\r\n yield* writer.toGenerator();\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(data);\r\n const delta = parsed.choices[0]?.delta;\r\n\r\n if (!delta) continue;\r\n\r\n // Handle text content\r\n if (delta.content) {\r\n writer.writeText(delta.content);\r\n }\r\n\r\n // Handle tool calls\r\n if (delta.tool_calls) {\r\n for (const toolCall of delta.tool_calls) {\r\n const index = toolCall.index;\r\n\r\n // Start new tool call\r\n if (toolCall.id) {\r\n if (currentToolCallIndex !== null && toolCallBuffer) {\r\n // End previous tool call\r\n try {\r\n const args = JSON.parse(toolCallBuffer);\r\n writer.endToolCall(args);\r\n } catch {\r\n // Invalid JSON, skip\r\n }\r\n toolCallBuffer = '';\r\n }\r\n\r\n currentToolCallIndex = index;\r\n writer.startToolCall(toolCall.function.name, toolCall.id);\r\n }\r\n\r\n // Accumulate arguments\r\n if (toolCall.function?.arguments) {\r\n toolCallBuffer += toolCall.function.arguments;\r\n writer.writeToolCallDelta(toolCall.function.arguments);\r\n }\r\n }\r\n }\r\n\r\n // Handle finish reason\r\n if (parsed.choices[0]?.finish_reason) {\r\n if (currentToolCallIndex !== null && toolCallBuffer) {\r\n try {\r\n const args = JSON.parse(toolCallBuffer);\r\n writer.endToolCall(args);\r\n } catch {\r\n // Invalid JSON\r\n }\r\n }\r\n }\r\n\r\n // Handle usage\r\n if (parsed.usage) {\r\n writer.writeUsage({\r\n promptTokens: parsed.usage.prompt_tokens,\r\n completionTokens: parsed.usage.completion_tokens,\r\n totalTokens: parsed.usage.total_tokens,\r\n });\r\n }\r\n\r\n yield* writer.toGenerator();\r\n } catch (error) {\r\n console.error('Failed to parse OpenAI chunk:', error);\r\n }\r\n }\r\n }\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n /**\r\n * Format messages for OpenAI API\r\n */\r\n private formatMessages(messages: Message[]): any[] {\r\n return messages.map((msg) => ({\r\n role: msg.role,\r\n content: msg.content,\r\n ...(msg.toolCalls && {\r\n tool_calls: msg.toolCalls.map((tc) => ({\r\n id: tc.id,\r\n type: 'function',\r\n function: {\r\n name: tc.name,\r\n arguments: JSON.stringify(tc.arguments),\r\n },\r\n })),\r\n }),\r\n ...(msg.toolResults && msg.role === 'tool' && {\r\n tool_call_id: msg.toolResults[0]?.toolCallId,\r\n }),\r\n }));\r\n }\r\n\r\n /**\r\n * Format tools for OpenAI API\r\n */\r\n private formatTools(tools: ChatConfig['tools']): any[] {\r\n if (!tools) return [];\r\n\r\n return tools.map((tool) => ({\r\n type: 'function',\r\n function: {\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: this.zodToJsonSchema(tool.parameters),\r\n },\r\n }));\r\n }\r\n\r\n /**\r\n * Convert Zod schema to JSON Schema (simplified)\r\n */\r\n private zodToJsonSchema(schema: any): any {\r\n // This is a simplified conversion\r\n // For production, use a library like zod-to-json-schema\r\n return {\r\n type: 'object',\r\n properties: {},\r\n required: [],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Create OpenAI provider instance\r\n */\r\nexport function createOpenAIProvider(config: OpenAIConfig): ProviderCallback {\r\n const provider = new OpenAIProvider(config);\r\n return provider.createCallback();\r\n}"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Z from'ioredis';import {LRUCache}from'lru-cache';import {get_encoding}from'tiktoken';import {nanoid}from'nanoid';import V from'fast-json-stable-stringify';import B from'eventemitter3';import {createParser}from'eventsource-parser';import'zod';import Y from'p-queue';import {Mutex}from'async-mutex';var O="cl100k_base",$={"gpt-4":"cl100k_base","gpt-4-turbo":"cl100k_base","gpt-3.5-turbo":"cl100k_base","claude-3":"cl100k_base","claude-3.5":"cl100k_base"},S=class{encoding;cache;maxCacheSize;constructor(t,e=1e4){let r=t&&$[t]||O;this.encoding=get_encoding(r),this.cache=new Map,this.maxCacheSize=e;}countTokens(t){let e=this.cache.get(t);if(e!==void 0)return e;let r=this.encoding.encode(t).length;if(this.cache.size>=this.maxCacheSize){let a=this.cache.keys().next().value;this.cache.delete(a);}return this.cache.set(t,r),r}countMessageTokens(t){let e=0;for(let r of t){if(e+=this.countTokens(r.role),e+=this.countTokens(r.content),r.toolCalls)for(let a of r.toolCalls)e+=this.countTokens(a.name),e+=this.countTokens(JSON.stringify(a.arguments));e+=4;}return e+=3,e}estimateCost(t,e,r){let a={"gpt-4-turbo":{input:1e-5,output:29999999999999997e-21},"gpt-3.5-turbo":{input:5e-7,output:15e-7},"claude-3-opus":{input:14999999999999999e-21,output:75e-6},"claude-3-sonnet":{input:3e-6,output:14999999999999999e-21}},o=a[r]||a["gpt-3.5-turbo"];return t*o.input+e*o.output}clearCache(){this.cache.clear();}dispose(){this.encoding.free(),this.cache.clear();}},x=null;function _(n){return x||(x=new S(n)),x}function re(n,t){return _(t).countTokens(n)}function ae(n,t){return _(t).countMessageTokens(n)}function v(n){let t=nanoid();return n?`${n}_${t}`:t}function I(n){return V(n)}function N(n){return n.map(t=>({...t,id:t.id||v("msg"),timestamp:t.timestamp||Date.now()}))}async function D(n,t){let e,r=t.initialDelay;for(let a=1;a<=t.maxAttempts;a++)try{return await n()}catch(o){if(e=o,a===t.maxAttempts)throw e;t.onRetry&&t.onRetry(a,e),await H(Math.min(r,t.maxDelay)),r*=t.backoffMultiplier;}throw e}function H(n){return new Promise(t=>setTimeout(t,n))}function ie(n,t){let e=[];for(let r=0;r<n.length;r+=t)e.push(n.slice(r,r+t));return e}function ce(n,t){let e;return (...r)=>{clearTimeout(e),e=setTimeout(()=>n(...r),t);}}function le(n,t){let e;return (...r)=>{e||(n(...r),e=true,setTimeout(()=>e=false,t));}}function ue(n){try{return JSON.parse(n)}catch{return null}}function T(n){return typeof n=="object"&&n!==null&&n.constructor===Object}function G(n,...t){if(!t.length)return n;let e=t.shift();if(T(n)&&T(e))for(let r in e)T(e[r])?(n[r]||Object.assign(n,{[r]:{}}),G(n[r],e[r])):Object.assign(n,{[r]:e[r]});return G(n,...t)}async function me(n){let t=[];for await(let e of n)t.push(e);return t}async function de(n){let t=performance.now(),e=await n(),r=performance.now()-t;return {result:e,duration:r}}var y=class extends B{constructor(e=false){super();this.debug=e;}events=[];currentText="";currentToolCall=null;currentArtifact=null;metadata={};closed=false;writeText(e){if(this.closed)throw new Error("StreamWriter is closed");this.currentText+=e;let r={type:"text-delta",delta:e};this.emitEvent(r);}startToolCall(e,r){if(this.closed)throw new Error("StreamWriter is closed");let a=r||v("tool");this.currentToolCall={id:a,name:e,arguments:{}};let o={type:"tool-call-start",toolCall:this.currentToolCall};this.emitEvent(o);}writeToolCallDelta(e){if(this.closed)throw new Error("StreamWriter is closed");if(!this.currentToolCall)throw new Error("No active tool call");let r={type:"tool-call-delta",toolCallId:this.currentToolCall.id,delta:e};this.emitEvent(r);}endToolCall(e){if(this.closed)throw new Error("StreamWriter is closed");if(!this.currentToolCall)throw new Error("No active tool call");this.currentToolCall.arguments=e;let r={type:"tool-call-end",toolCall:this.currentToolCall};this.emitEvent(r),this.currentToolCall=null;}writeToolResult(e,r,a){if(this.closed)throw new Error("StreamWriter is closed");let o={type:"tool-result",result:{toolCallId:e,result:r,error:a}};this.emitEvent(o);}startArtifact(e,r){if(this.closed)throw new Error("StreamWriter is closed");let a=r?.id||v("artifact");this.currentArtifact={id:a,type:e,language:r?.language,title:r?.title,description:r?.description,content:""};let o={type:"artifact-start",artifact:{id:this.currentArtifact.id,type:this.currentArtifact.type,language:this.currentArtifact.language,title:this.currentArtifact.title,description:this.currentArtifact.description}};this.emitEvent(o);}writeArtifactDelta(e){if(this.closed)throw new Error("StreamWriter is closed");if(!this.currentArtifact)throw new Error("No active artifact");this.currentArtifact.content+=e;let r={type:"artifact-delta",delta:e};this.emitEvent(r);}endArtifact(e){if(this.closed)throw new Error("StreamWriter is closed");if(!this.currentArtifact)throw new Error("No active artifact");e&&(this.currentArtifact.metadata=e);let r={type:"artifact-end",artifact:this.currentArtifact};this.emitEvent(r),this.currentArtifact=null;}writeMetadata(e){if(this.closed)throw new Error("StreamWriter is closed");this.metadata={...this.metadata,...e};let r={type:"metadata",metadata:e};this.emitEvent(r);}writeUsage(e){if(this.closed)throw new Error("StreamWriter is closed");let r={type:"usage",usage:e};this.emitEvent(r);}writeError(e){if(this.closed)throw new Error("StreamWriter is closed");let r={type:"error",error:e};this.emitEvent(r);}done(e){if(this.closed)return;let a={type:"done",finalMessage:{id:e?.id||v("msg"),role:e?.role||"assistant",content:e?.content||this.currentText,metadata:{...this.metadata,...e?.metadata},timestamp:Date.now(),...e?.toolCalls&&{toolCalls:e.toolCalls},...e?.toolResults&&{toolResults:e.toolResults}}};this.emitEvent(a),this.closed=true,this.emit("close");}getEvents(){return [...this.events]}async*toGenerator(){let e=[],r=null,a=false,o=s=>{r?(r({value:s,done:false}),r=null):e.push(s);},i=()=>{a=true,r&&(r({value:void 0,done:true}),r=null);};this.on("event",o),this.on("close",i);try{for(;!a||e.length>0;)e.length>0?yield e.shift():a||await new Promise(s=>{r=c=>{c.done||e.push(c.value),s();};});}finally{this.off("event",o),this.off("close",i);}}emitEvent(e){this.events.push(e),this.emit("event",e),this.debug&&console.log("[StreamWriter]",e.type,e);}isClosed(){return this.closed}reset(){this.events=[],this.currentText="",this.currentToolCall=null,this.currentArtifact=null,this.metadata={},this.closed=false,this.removeAllListeners();}};function ge(n=false){return new y(n)}async function*Ce(n){let t=n.getReader(),e=new TextDecoder,r="",a=createParser({onEvent:o=>{r=o.data;},onRetry:o=>{}});try{for(;;){let{done:o,value:i}=await t.read();if(o)break;let s=e.decode(i,{stream:!0});if(a.feed(s),r)try{let c=JSON.parse(r);c.type&&(yield c),r="";}catch{continue}}a.reset({consume:!0});}finally{t.releaseLock();}}function w(n){let t=new TextEncoder;return new ReadableStream({async start(e){try{for await(let r of n){let a=`data: ${JSON.stringify(r)}
|
|
2
|
+
|
|
3
|
+
`;e.enqueue(t.encode(a));}e.close();}catch(r){e.error(r);}}})}async function L(n,t){let e=w(n),r={"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"};if(t.node&&t.node.res){let a=t.node.res;Object.entries(r).forEach(([s,c])=>{a.setHeader(s,c);});let o=e.getReader(),i=new TextDecoder;try{for(;;){let{done:s,value:c}=await o.read();if(s)break;let m=i.decode(c,{stream:!0});a.write(m);}}finally{a.end();}}else {if(t instanceof Response||typeof t.body<"u")return;{Object.entries(r).forEach(([i,s])=>{t.setHeader(i,s);});let a=e.getReader(),o=new TextDecoder;try{for(;;){let{done:i,value:s}=await a.read();if(i)break;let c=o.decode(s,{stream:!0});t.write(c);}}finally{t.end();}}}}async function*U(...n){let t=n.map(async r=>{let a=[];for await(let o of r)a.push(o);return a}),e=await Promise.all(t);for(let r of e)for(let a of r)yield a;}async function*be(n,t){for await(let e of n){let r=t(e);r!==null&&(yield r);}}async function*xe(n,t){for await(let e of n)t(e)&&(yield e);}async function k(n){let t=[];for await(let e of n)t.push(e);return t}async function*Se(n,t){let e=0;for await(let r of n){if(e>=t)break;yield r,e++;}}async function*Te(n,t,e){let r=[],a=null,o=async()=>{if(r.length>0){let i=[...r];return r=[],i}return null};try{for await(let s of n)if(r.push(s),a&&(clearTimeout(a),a=null),r.length>=t){let c=await o();c&&(yield c);}else e&&(a=setTimeout(async()=>{let c=await o();},e));let i=await o();i&&(yield i);}finally{a&&clearTimeout(a);}}var p=class extends Error{constructor(e,r,a,o){super(e);this.code=r;this.statusCode=a;this.details=o;this.name="PaprFlareError";}},J=class extends p{constructor(e,r){super(e,"RATE_LIMIT_ERROR",429);this.retryAfter=r;}},z=class extends p{constructor(t,e){super(t,"VALIDATION_ERROR",400,e);}},h=class extends p{constructor(e,r,a){super(e,"PROVIDER_ERROR",a);this.provider=r;}};var R=class{client;keyPrefix;defaultTTL;constructor(t){this.client=new Z({host:t.host,port:t.port,password:t.password,db:t.db||0,retryStrategy:e=>Math.min(e*50,2e3),maxRetriesPerRequest:3,enableReadyCheck:true,lazyConnect:false}),this.keyPrefix=t.keyPrefix||"paprflare:",this.defaultTTL=t.ttl||3600,this.client.on("error",e=>{console.error("Redis cache error:",e);});}getKey(t){return `${this.keyPrefix}${t}`}async get(t){try{return await this.client.get(this.getKey(t))}catch(e){return console.error("Redis get error:",e),null}}async set(t,e,r){try{let a=r||this.defaultTTL;await this.client.setex(this.getKey(t),a,e);}catch(a){console.error("Redis set error:",a);}}async delete(t){try{await this.client.del(this.getKey(t));}catch(e){console.error("Redis delete error:",e);}}async clear(){try{let t=await this.client.keys(`${this.keyPrefix}*`);t.length>0&&await this.client.del(...t);}catch(t){console.error("Redis clear error:",t);}}async has(t){try{return await this.client.exists(this.getKey(t))===1}catch(e){return console.error("Redis has error:",e),false}}async disconnect(){await this.client.quit();}},E=class{cache;constructor(t){this.cache=new LRUCache({max:t?.maxSize||1e3,ttl:t?.maxAge||36e5,updateAgeOnGet:true,updateAgeOnHas:true});}async get(t){return this.cache.get(t)||null}async set(t,e){this.cache.set(t,e);}async delete(t){this.cache.delete(t);}async clear(){this.cache.clear();}async has(t){return this.cache.has(t)}},b=class{cache;enabled;constructor(t){this.enabled=true,t.type==="redis"?this.cache=new R({...t.redis,ttl:t.ttl}):this.cache=new E(t.memory);}generateCacheKey(t,e){let r={messages:t.map(a=>({role:a.role,content:a.content,toolCalls:a.toolCalls})),model:e.model,temperature:e.temperature,maxTokens:e.maxTokens,tools:e.tools?.map(a=>a.name)};return I(r)}async getCachedResponse(t,e){if(!this.enabled||e.cache?.enabled===false)return null;let r=e.cache?.key||this.generateCacheKey(t,e),a=await this.cache.get(r);if(a)try{return JSON.parse(a)}catch(o){return console.error("Cache parse error:",o),await this.cache.delete(r),null}return null}async cacheResponse(t,e,r){if(!this.enabled||e.cache?.enabled===false)return;let a=e.cache?.key||this.generateCacheKey(t,e),o=e.cache?.ttl;await this.cache.set(a,JSON.stringify(r),o);}async invalidate(t,e){let r=this.generateCacheKey(t,e);await this.cache.delete(r);}async clearAll(){await this.cache.clear();}disable(){this.enabled=false;}enable(){this.enabled=true;}};var j=class{mode;cloudConfig;providerCallback;cacheManager;queue;mutex;defaultRetryConfig;constructor(t){this.mode=t.mode,this.mutex=new Mutex;let e=t.rateLimit||{};if(this.queue=new Y({concurrency:e.maxConcurrent||100,interval:e.interval||1e3,intervalCap:e.intervalCap||100,timeout:3e4}),this.defaultRetryConfig=t.defaultRetry||{maxAttempts:3,initialDelay:1e3,maxDelay:1e4,backoffMultiplier:2},t.mode==="cloud"){if(!t.cloud)throw new p("Cloud config is required for cloud mode","INVALID_CONFIG");this.cloudConfig=t.cloud;}else {if(!t.selfManaged?.provider)throw new p("Provider callback is required for self-managed mode","INVALID_CONFIG");this.providerCallback=t.selfManaged.provider,t.selfManaged.cache&&(this.cacheManager=new b(t.selfManaged.cache));}}async chat(t,e={}){let r=N(t);if(this.validateConfig(e),this.cacheManager&&e.cache?.enabled!==false){let a=await this.cacheManager.getCachedResponse(r,e);if(a)return e.stream?this.createStreamingResponse(this.eventsToGenerator(a)):this.eventsToResponse(a)}return this.queue.add(async()=>this.executeChat(r,e))}async executeChat(t,e){let r=e.retry||this.defaultRetryConfig;return D(async()=>this.mode==="cloud"?this.executeCloudChat(t,e):this.executeSelfManagedChat(t,e),{...r,onRetry:(a,o)=>{console.warn(`[PaprFlare] Retry attempt ${a}/${r.maxAttempts}:`,o.message);}})}async executeCloudChat(t,e){let r=await fetch(`${this.cloudConfig.baseURL||"https://api.paprflare.in"}/v1/chat`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.cloudConfig.apiKey}`,"X-PaprFlare-Region":this.cloudConfig.region||"in-mumbai"},body:JSON.stringify({messages:t,...e})});if(!r.ok)throw new p(`Cloud API error: ${r.statusText}`,"CLOUD_API_ERROR",r.status);if(e.stream){let a=this.parseCloudStream(r.body);return this.createStreamingResponse(a)}else return await r.json()}async executeSelfManagedChat(t,e){if(!this.providerCallback)throw new p("Provider callback not configured","INVALID_CONFIG");if(e.output?.schema)return this.executeStructuredOutput(t,e);let r=this.providerCallback(t,e);if(e.stream){if(this.cacheManager&&e.cache?.enabled!==false){let a=[],o=(async function*(){try{for await(let i of r)a.push(i),yield i;}finally{await this.cacheManager.cacheResponse(t,e,a);}}).bind(this)();return this.createStreamingResponse(o)}return this.createStreamingResponse(r)}else {let a=await k(r);return this.cacheManager&&e.cache?.enabled!==false&&await this.cacheManager.cacheResponse(t,e,a),this.eventsToResponse(a)}}async executeStructuredOutput(t,e){let r=e.output.schema,a=this.providerCallback(t,{...e,stream:false}),o=await k(a),i=o.filter(s=>s.type==="text-delta").map(s=>s.type==="text-delta"?s.delta:"").join("");try{let s=JSON.parse(i),c=r.parse(s),m=o.find(d=>d.type==="done");return {message:m&&m.type==="done"?m.finalMessage:{id:v("msg"),role:"assistant",content:JSON.stringify(c),timestamp:Date.now()},usage:o.find(d=>d.type==="usage"&&"usage"in d)?.usage}}catch(s){throw new p(`Structured output validation failed: ${s}`,"VALIDATION_ERROR",400,s)}}createStreamingResponse(t){return {stream:t,toReadableStream:()=>w(t),pipeToResponse:async e=>{await L(t,e);},mergeStreams:(...e)=>U(t,...e)}}async*parseCloudStream(t){let e=t.getReader(),r=new TextDecoder;try{for(;;){let{done:a,value:o}=await e.read();if(a)break;let s=r.decode(o,{stream:!0}).split(`
|
|
4
|
+
`);for(let c of s)if(c.startsWith("data: ")){let m=c.slice(6);if(m==="[DONE]")break;try{yield JSON.parse(m);}catch(u){console.error("Failed to parse event:",u);}}}}finally{e.releaseLock();}}async*cacheStream(t,e){for await(let r of t)e.push(r),yield r;}async*eventsToGenerator(t){for(let e of t)yield e;}eventsToResponse(t){let e=t.find(a=>a.type==="done"),r=t.find(a=>a.type==="usage");if(!e||e.type!=="done")throw new p("No completion event found in response","INVALID_RESPONSE");return {message:e.finalMessage,usage:r&&r.type==="usage"?r.usage:void 0}}validateConfig(t){if(t.temperature!==void 0&&(t.temperature<0||t.temperature>2))throw new p("Temperature must be between 0 and 2","VALIDATION_ERROR",400);if(t.maxTokens!==void 0&&t.maxTokens<1)throw new p("Max tokens must be greater than 0","VALIDATION_ERROR",400);t.output?.schema&&!t.stream&&(t.stream=false);}getQueueStats(){return {size:this.queue.size,pending:this.queue.pending,concurrency:this.queue.concurrency}}async clearCache(){this.cacheManager&&await this.cacheManager.clearAll();}};function Fe(n){return {schema:n,mode:"json"}}var A=class{config;baseURL;constructor(t){this.config=t,this.baseURL=t.baseURL||"https://api.anthropic.com/v1";}createCallback(){return (t,e)=>this.streamChat(t,e)}async*streamChat(t,e){let r=new y;try{let a=t.find(s=>s.role==="system"),o=t.filter(s=>s.role!=="system"),i=await fetch(`${this.baseURL}/messages`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey,"anthropic-version":this.config.anthropicVersion||"2023-06-01",...this.config.headers},body:JSON.stringify({model:e.model||this.config.model||"claude-3-5-sonnet-20241022",messages:this.formatMessages(o),max_tokens:e.maxTokens||4096,temperature:e.temperature,top_p:e.topP,stop_sequences:e.stop,stream:!0,...a&&{system:a.content},...e.tools&&{tools:this.formatTools(e.tools)}})});if(!i.ok){let s=await i.json().catch(()=>({}));throw new h(s.error?.message||"Anthropic API error","anthropic",i.status)}yield*this.parseStream(i.body,r);}catch(a){throw a instanceof h?a:new h(`Anthropic provider error: ${a}`,"anthropic")}}async*parseStream(t,e){let r=t.getReader(),a=new TextDecoder,o="",i=null;try{for(;;){let{done:s,value:c}=await r.read();if(s)break;o+=a.decode(c,{stream:!0});let m=o.split(`
|
|
5
|
+
`);o=m.pop()||"";for(let u of m){if(!u.trim()||!u.startsWith("data: "))continue;let d=u.slice(6);try{let l=JSON.parse(d);switch(l.type){case "message_start":break;case "content_block_start":l.content_block?.type==="tool_use"&&(i=l.content_block,e.startToolCall(i.name,i.id));break;case "content_block_delta":l.delta?.type==="text_delta"?e.writeText(l.delta.text):l.delta?.type==="input_json_delta"&&e.writeToolCallDelta(l.delta.partial_json);break;case "content_block_stop":if(i){try{let f=JSON.parse(i.input||"{}");e.endToolCall(f);}catch{}i=null;}break;case "message_delta":l.usage&&e.writeUsage({promptTokens:0,completionTokens:l.usage.output_tokens||0,totalTokens:l.usage.output_tokens||0});break;case "message_stop":e.done(),yield*e.toGenerator();return;case "error":e.writeError(l.error?.message||"Unknown error");break}yield*e.toGenerator();}catch(l){console.error("Failed to parse Anthropic chunk:",l);}}}}finally{r.releaseLock();}}formatMessages(t){return t.map(e=>{let r=[];if(e.content&&r.push({type:"text",text:e.content}),e.toolCalls)for(let a of e.toolCalls)r.push({type:"tool_use",id:a.id,name:a.name,input:a.arguments});if(e.toolResults)for(let a of e.toolResults)r.push({type:"tool_result",tool_use_id:a.toolCallId,content:JSON.stringify(a.result),...a.error&&{is_error:true}});return {role:e.role==="assistant"?"assistant":"user",content:r.length===1&&r[0].type==="text"?r[0].text:r}})}formatTools(t){return t?t.map(e=>({name:e.name,description:e.description,input_schema:this.zodToJsonSchema(e.parameters)})):[]}zodToJsonSchema(t){return {type:"object",properties:{},required:[]}}};function Ze(n){return new A(n).createCallback()}var P=class{config;baseURL;constructor(t){this.config=t,this.baseURL=t.baseURL||"https://generativelanguage.googleapis.com/v1beta";}createCallback(){return (t,e)=>this.streamChat(t,e)}async*streamChat(t,e){let r=new y;try{let a=e.model||this.config.model||"gemini-pro",o=await fetch(`${this.baseURL}/models/${a}:streamGenerateContent?key=${this.config.apiKey}`,{method:"POST",headers:{"Content-Type":"application/json",...this.config.headers},body:JSON.stringify({contents:this.formatMessages(t),generationConfig:{temperature:e.temperature,maxOutputTokens:e.maxTokens,topP:e.topP,stopSequences:e.stop},...e.tools&&{tools:this.formatTools(e.tools)}})});if(!o.ok){let i=await o.json().catch(()=>({}));throw new h(i.error?.message||"Google AI API error","google",o.status)}yield*this.parseStream(o.body,r);}catch(a){throw a instanceof h?a:new h(`Google provider error: ${a}`,"google")}}async*parseStream(t,e){let r=t.getReader(),a=new TextDecoder,o="";try{for(;;){let{done:i,value:s}=await r.read();if(i)break;o+=a.decode(s,{stream:!0});let c=o.split(`
|
|
6
|
+
`);o=c.pop()||"";for(let m of c)if(m.trim())try{let u=JSON.parse(m);if(u.candidates&&u.candidates[0]){let d=u.candidates[0];if(d.content?.parts)for(let l of d.content.parts)l.text&&e.writeText(l.text),l.functionCall&&(e.startToolCall(l.functionCall.name,l.functionCall.name),e.endToolCall(l.functionCall.args));if(d.finishReason==="STOP"){e.done(),yield*e.toGenerator();return}}u.usageMetadata&&e.writeUsage({promptTokens:u.usageMetadata.promptTokenCount||0,completionTokens:u.usageMetadata.candidatesTokenCount||0,totalTokens:u.usageMetadata.totalTokenCount||0}),yield*e.toGenerator();}catch(u){console.error("Failed to parse Google chunk:",u);}}e.isClosed()||(e.done(),yield*e.toGenerator());}finally{r.releaseLock();}}formatMessages(t){return t.filter(e=>e.role!=="system").map(e=>({role:e.role==="assistant"?"model":"user",parts:[{text:e.content}]}))}formatTools(t){return t?[{functionDeclarations:t.map(e=>({name:e.name,description:e.description,parameters:this.zodToJsonSchema(e.parameters)}))}]:[]}zodToJsonSchema(t){return {type:"object",properties:{},required:[]}}};function rt(n){return new P(n).createCallback()}var M=class{config;baseURL;constructor(t){this.config=t,this.baseURL=t.baseURL||"https://api.openai.com/v1";}createCallback(){return (t,e)=>this.streamChat(t,e)}async*streamChat(t,e){let r=new y;try{let a=await fetch(`${this.baseURL}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`,...this.config.organization&&{"OpenAI-Organization":this.config.organization},...this.config.headers},body:JSON.stringify({model:e.model||this.config.model||"gpt-4-turbo-preview",messages:this.formatMessages(t),temperature:e.temperature,max_tokens:e.maxTokens,top_p:e.topP,frequency_penalty:e.frequencyPenalty,presence_penalty:e.presencePenalty,stop:e.stop,stream:!0,...e.tools&&{tools:this.formatTools(e.tools),tool_choice:e.toolChoice}})});if(!a.ok){let o=await a.json().catch(()=>({}));throw new h(o.error?.message||"OpenAI API error","openai",a.status)}yield*this.parseStream(a.body,r);}catch(a){throw a instanceof h?a:new h(`OpenAI provider error: ${a}`,"openai")}}async*parseStream(t,e){let r=t.getReader(),a=new TextDecoder,o="",i=null,s="";try{for(;;){let{done:c,value:m}=await r.read();if(c)break;o+=a.decode(m,{stream:!0});let u=o.split(`
|
|
7
|
+
`);o=u.pop()||"";for(let d of u)if(!(!d.trim()||d.startsWith(":"))&&d.startsWith("data: ")){let l=d.slice(6);if(l==="[DONE]"){e.done(),yield*e.toGenerator();return}try{let f=JSON.parse(l),C=f.choices[0]?.delta;if(!C)continue;if(C.content&&e.writeText(C.content),C.tool_calls)for(let g of C.tool_calls){let W=g.index;if(g.id){if(i!==null&&s){try{let q=JSON.parse(s);e.endToolCall(q);}catch{}s="";}i=W,e.startToolCall(g.function.name,g.id);}g.function?.arguments&&(s+=g.function.arguments,e.writeToolCallDelta(g.function.arguments));}if(f.choices[0]?.finish_reason&&i!==null&&s)try{let g=JSON.parse(s);e.endToolCall(g);}catch{}f.usage&&e.writeUsage({promptTokens:f.usage.prompt_tokens,completionTokens:f.usage.completion_tokens,totalTokens:f.usage.total_tokens}),yield*e.toGenerator();}catch(f){console.error("Failed to parse OpenAI chunk:",f);}}}}finally{r.releaseLock();}}formatMessages(t){return t.map(e=>({role:e.role,content:e.content,...e.toolCalls&&{tool_calls:e.toolCalls.map(r=>({id:r.id,type:"function",function:{name:r.name,arguments:JSON.stringify(r.arguments)}}))},...e.toolResults&&e.role==="tool"&&{tool_call_id:e.toolResults[0]?.toolCallId}}))}formatTools(t){return t?t.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:this.zodToJsonSchema(e.parameters)}})):[]}zodToJsonSchema(t){return {type:"object",properties:{},required:[]}}};function it(n){return new M(n).createCallback()}export{A as AnthropicProvider,b as CacheManager,P as GoogleProvider,E as MemoryCache,M as OpenAIProvider,j as PaprFlareClient,p as PaprFlareError,h as ProviderError,J as RateLimitError,R as RedisCache,y as StreamWriter,S as TokenCounter,z as ValidationError,Te as batchStream,ie as chunk,k as collectStream,ae as countMessageTokens,re as countTokens,Ze as createAnthropicProvider,I as createCacheKey,rt as createGoogleProvider,it as createOpenAIProvider,ge as createStreamWriter,ce as debounce,G as deepMerge,xe as filterStream,N as formatMessages,v as generateId,_ as getTokenCounter,T as isPlainObject,de as measureTime,U as mergeStreams,Ce as parseSSEStream,L as pipeToResponse,D as retry,ue as safeJsonParse,H as sleep,me as streamToArray,Fe as structuredOutput,Se as takeStream,le as throttle,w as toReadableStream,be as transformStream};//# sourceMappingURL=index.mjs.map
|
|
8
|
+
//# sourceMappingURL=index.mjs.map
|