aicommit2
Version:
A Reactive CLI that generates commit messages for Git and Jujutsu with various AI
2 lines (1 loc) • 4.42 kB
JavaScript
import h from"chalk";import{concatMap as f,from as u,map as g,catchError as A}from"rxjs";import{fromPromise as M}from"rxjs/internal/observable/innerFrom";import{A as v,l as b,a as w,b as C,c as P,e as I,d as k}from"./ai.service-d8e94c3a.mjs";import{b as $,g as x,H as y,t as R}from"./cli-8ee62906.mjs";import"fs";import"path";import"@pacote/xxhash";import"winston";import"cleye";import"module";import"crypto";import"os";import"node:buffer";import"node:path";import"node:child_process";import"node:process";import"child_process";import"node:url";import"node:os";import"assert";import"events";import"node:fs";import"buffer";import"stream";import"util";import"node:util";import"inquirer";import"fs/promises";import"readline";import"figlet";import"gradient-string";import"ora";import"inquirer-reactive-list-prompt";import"winston-daily-rotate-file";import"axios";import"url";import"node:fs/promises";import"chokidar";import"rxjs/operators";class E extends v{constructor(e){super(e),this.params=e,this.apiKey="",this.colors={primary:"#ff7000",secondary:"#fff"},this.serviceName=h.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[MistralAI${this.formatModelSuffix()}]`),this.errorPrefix=h.red.bold(`[MistralAI${this.formatModelSuffix()}]`),this.apiKey=this.params.config.key}getServiceSpecificErrorMessage(e){const t=e.message||"";return t.includes("API key")||t.includes("api_key")?"Invalid API key. Check your Mistral AI API key in configuration":t.includes("quota")||t.includes("usage")?"API quota exceeded. Check your Mistral AI usage limits":t.includes("model")||t.includes("Model")?"Model not found or not accessible. Check if the Mistral model name is correct":t.includes("403")||t.includes("Forbidden")?"Access denied. Your API key may not have permission for this Mistral model":t.includes("404")||t.includes("Not Found")?"Model or endpoint not found. Check your Mistral model configuration":t.includes("500")||t.includes("Internal Server Error")?"Mistral AI server error. Try again later":null}generateCommitMessage$(){return M(this.generateMessage("commit")).pipe(f(e=>u(e)),g(this.formatAsChoice),A(this.handleError$))}generateCodeReview$(){return M(this.generateMessage("review")).pipe(f(e=>u(e)),g(this.formatCodeReviewAsChoice),A(this.handleError$))}async generateMessage(e){const t=this.params.stagedDiff.diff,{logging:o,generate:i,type:s}=this.params.config,n=this.buildPromptOptions(),m=e==="review"?$(n):x(n);await this.checkAvailableModels();const a=`Here is the diff: ${t}`,c=`${this.params.config.url||"https://api.mistral.ai"}/v1/chat/completions`,r={Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"};b(t,e,"MistralAI",this.params.config.model,c,r,o),w(t,e,"MistralAI",m,a,o);const l=await this.createChatCompletions(m,a,e);return e==="review"?this.parseCodeReview(l):this.parseMessage(l,s,i)}async checkAvailableModels(){if((await this.getAvailableModels()).includes(this.params.config.model))return!0;throw new Error(`Invalid model type of Mistral AI: ${this.params.config.model}`)}async getAvailableModels(){const e=this.params.config.url||"https://api.mistral.ai";return(await new y({method:"GET",baseURL:`${e}/v1/models`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).execute()).data.data.filter(o=>o.object==="model").map(o=>o.id)}async createChatCompletions(e,t,o){const i=this.params.stagedDiff.diff,{logging:s}=this.params.config,n={model:this.params.config.model,messages:[{role:"system",content:e},{role:"user",content:t}],temperature:this.params.config.temperature,top_p:this.params.config.topP,max_tokens:this.params.config.maxTokens,stream:!1,safe_prompt:!1,random_seed:R(10,1e3)};C(i,o,"MistralAI",n,s);const m=Date.now();try{const a=this.params.config.url||"https://api.mistral.ai",p=await new y({method:"POST",baseURL:`${a}/v1/chat/completions`,timeout:this.params.config.timeout}).setHeaders({Authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"}).setBody(n).execute(),c=Date.now()-m,r=p.data;if(P(i,o,"MistralAI",r,s),!r.choices||r.choices.length===0||!r.choices[0].message?.content)throw I(i,o,"MistralAI",{message:"No Content on response",result:r},s),new Error("No Content on response. Please open a Bug report");const d=r.choices[0].message.content;return k(i,o,"MistralAI",c,d,s),d}catch(a){throw I(i,o,"MistralAI",a,s),a}}}export{E as MistralService};