UNPKG

aicommit2

Version:

A Reactive CLI that generates commit messages for Git and Jujutsu with various AI

2 lines (1 loc) 4.63 kB
import G from"chalk";import b from"groq-sdk";import{concatMap as q,from as k,map as v,catchError as C}from"rxjs";import{fromPromise as P}from"rxjs/internal/observable/innerFrom";import{A as R,l as w,a as A,b as x,c as M,d as $,e as S}from"./ai.service-d8e94c3a.mjs";import{g as I,b as D}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 R{constructor(t){super(t),this.params=t,this.generateStreamingCommitMessage$=()=>{const{generate:o,type:e}=this.params.config;return this.createStreamingCommitMessages$(r=>{this.streamChunks(r).catch(m=>r.error(m))},e,o)},this.streamChunks=async o=>{const e=this.params.stagedDiff.diff,{logging:r,temperature:m}=this.params.config,d=this.params.config.maxTokens,p=I(this.buildPromptOptions()),c=`Here is the diff: ${e}`,l=`${this.params.config.url||"https://api.groq.com"}/openai/v1/chat/completions`,y={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};w(e,"commit","Groq",this.params.config.model,l,y,r),A(e,"commit","Groq",p,c,r);const h={messages:[{role:"system",content:p},{role:"user",content:c}],model:this.params.config.model,max_tokens:d,top_p:this.params.config.topP,temperature:m,stream:!0};x(e,"commit","Groq",h,r);const f=Date.now();let a="";try{const n=await this.groq.chat.completions.create(h,{timeout:this.params.config.timeout});for await(const u of n){const s=u.choices?.[0]?.delta?.content||"";s&&(a+=s,o.next(s))}const i=Date.now()-f;M(e,"commit","Groq",{streamed:!0,totalLength:a.length},r),$(e,"commit","Groq",i,a,r),o.complete()}catch(n){S(e,"commit","Groq",n,r),o.error(n)}},this.colors={primary:"#f55036",secondary:"#fff"},this.serviceName=G.bgHex(this.colors.primary).hex(this.colors.secondary).bold(`[Groq${this.formatModelSuffix()}]`),this.errorPrefix=G.red.bold(`[Groq${this.formatModelSuffix()}]`),this.groq=new b({apiKey:this.params.config.key})}getServiceSpecificErrorMessage(t){const o=t.message||"";return o.includes("API key")||o.includes("api_key")?"Invalid API key. Check your Groq API key in configuration":o.includes("rate_limit")||o.includes("Rate limit")?"Rate limit exceeded. Wait a moment and try again, or upgrade your Groq plan":o.includes("model")||o.includes("Model")?"Model not found or not accessible. Check if the Groq model name is correct":o.includes("overloaded")||o.includes("capacity")?"Groq service is overloaded. Try again in a few minutes":o.includes("403")||o.includes("Forbidden")?"Access denied. Your API key may not have permission for this Groq model":o.includes("404")||o.includes("Not Found")?"Model or endpoint not found. Check your Groq model configuration":o.includes("500")||o.includes("Internal Server Error")?"Groq server error. Try again later":null}generateCommitMessage$(){return this.params.config.stream||!1?this.generateStreamingCommitMessage$():P(this.generateMessage("commit")).pipe(q(o=>k(o)),v(this.formatAsChoice),C(this.handleError$))}generateCodeReview$(){return P(this.generateMessage("review")).pipe(q(t=>k(t)),v(this.formatCodeReviewAsChoice),C(this.handleError$))}async generateMessage(t){const o=this.params.stagedDiff.diff,{logging:e,temperature:r,generate:m,type:d}=this.params.config,p=this.params.config.maxTokens,c=this.buildPromptOptions(),g=t==="review"?D(c):I(c),l=`Here is the diff: ${o}`,h=`${this.params.config.url||"https://api.groq.com"}/openai/v1/chat/completions`,f={Authorization:`Bearer ${this.params.config.key}`,"Content-Type":"application/json"};w(o,t,"Groq",this.params.config.model,h,f,e),A(o,t,"Groq",g,l,e);const a={messages:[{role:"system",content:g},{role:"user",content:l}],model:this.params.config.model,max_tokens:p,top_p:this.params.config.topP,temperature:r};x(o,t,"Groq",a,e);const n=Date.now();try{const i=await this.groq.chat.completions.create(a,{timeout:this.params.config.timeout}),u=Date.now()-n,s=i.choices[0].message.content||"";return M(o,t,"Groq",i,e),$(o,t,"Groq",u,s,e),t==="review"?this.parseCodeReview(s):this.parseMessage(s,d,m)}catch(i){throw S(o,t,"Groq",i,e),i}}}export{E as GroqService};