@catgirls/openrouter
Version:
Nyaa~! A TypeScript client for OpenRouter that's both kawaii and powerful! 😻
7 lines • 4.07 kB
JavaScript
import h from'axios';import {EventEmitter}from'events';var s=class{static handleError(e){throw this.isAxiosError(e)?this.handleAxiosError(e):new Error(`Unexpected error: ${e instanceof Error?e.message:String(e)}`)}static isAxiosError(e){return e instanceof Error&&"isAxiosError"in e}static handleAxiosError(e){if(e.response){let{status:r,data:t}=e.response;return this.isOpenRouterError(t)?this.createDetailedError(t.error):new Error(`HTTP ${r}: ${this.ERROR_MESSAGES[r]||"Unknown error"}`)}return e.request?new Error("No response received from OpenRouter API"):new Error(`Failed to make request: ${e.message}`)}static isOpenRouterError(e){return typeof e=="object"&&e!==null&&"error"in e&&typeof e.error.code=="number"&&typeof e.error.message=="string"}static createDetailedError({code:e,message:r,metadata:t}){let o=`${this.ERROR_MESSAGES[e]||"Unknown error"}: ${r}`;return t?this.isModerationError(t)?new Error(`${o}
Flagged by ${t.provider_name} for: ${t.reasons.join(", ")}
Flagged content: "${t.flagged_input}"`):this.isProviderError(t)?new Error(`${o}
Provider ${t.provider_name} error: ${JSON.stringify(t.raw)}`):new Error(o):new Error(o)}static isModerationError(e){return typeof e=="object"&&e!==null&&"reasons"in e&&"flagged_input"in e&&"provider_name"in e&&"model_slug"in e}static isProviderError(e){return typeof e=="object"&&e!==null&&"provider_name"in e&&"raw"in e}};s.ERROR_MESSAGES={400:"Bad Request: Invalid or missing parameters, or CORS issue",401:"Invalid credentials: OAuth session expired or disabled/invalid API key",402:"Insufficient credits: Add more credits and retry the request",403:"Content moderation: Your input was flagged",408:"Request timeout: Your request took too long to process",429:"Rate limited: You are sending too many requests",502:"Provider error: Model is down or invalid response received",503:"No provider: No available model provider meets your routing requirements"};var l=class{constructor(e,r){this.client=h.create({baseURL:e,headers:r});}async post(e,r,t){return this.client.post(e,r,t)}async get(e){return this.client.get(e)}};var m=class{handleStream(e){let r=new EventEmitter,t="";return e.on("data",o=>{t+=o.toString();let c=t.split(`
`);t=c.pop()||"";for(let i of c){if(i.trim()===""||i.startsWith(":")){i.includes("OPENROUTER PROCESSING")&&r.emit("processing");continue}try{let a=i.replace(/^data: /,"");if(a==="[DONE]"){r.emit("done");continue}let n=JSON.parse(a);if(r.emit("chunk",n),n.choices?.[0]){let p=n.choices[0];if(p.delta){let{content:u,role:f,tool_calls:g}=p.delta;u&&(r.emit("token",u),r.emit("content",u)),f&&r.emit("role",f),g&&r.emit("tool_calls",g);}p.finish_reason&&r.emit("finish",p.finish_reason);}n.usage&&r.emit("usage",n.usage);}catch(a){r.emit("error",s.handleError(a));}}}),e.on("end",()=>r.emit("done")),e.on("error",o=>{r.emit("error",s.handleError(o));}),r}};var E=class{constructor(e,r={},t,o){this.apiKey=e;this.defaultConfig=r;this.baseURL="https://openrouter.ai/api/v1";this.httpClient=t||new l(this.baseURL,this.getDefaultHeaders()),this.streamHandler=o||new m;}getDefaultHeaders(){let e={Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json"};return this.defaultConfig.siteUrl&&(e["HTTP-Referer"]=this.defaultConfig.siteUrl),this.defaultConfig.siteName&&(e["X-Title"]=this.defaultConfig.siteName),e}async chatCompletion(e){try{let r={...e,model:e.model||this.defaultConfig.model,stream:e.stream};if(e.stream){let o=await this.httpClient.post("/chat/completions",r,{responseType:"stream",signal:e.signal});return this.streamHandler.handleStream(o.data)}return (await this.httpClient.post("/chat/completions",r)).data}catch(r){throw s.handleError(r)}}async getGenerationStats(e){try{return (await this.httpClient.get(`/generation?id=${e}`)).data.data}catch(r){throw s.handleError(r)}}async getModels(){try{return (await this.httpClient.get("/models")).data.data}catch(e){throw s.handleError(e)}}};
export{l as HttpClient,E as OpenRouterClient,s as OpenRouterErrorAdapter,m as StreamHandler};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map