mirror of
https://github.com/Pull-Pal/pull-pal.git
synced 2024-09-07 20:45:16 -04:00
91 lines
1.8 KiB
Go
91 lines
1.8 KiB
Go
|
package llm
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"strings"
|
||
|
"text/template"
|
||
|
)
|
||
|
|
||
|
func (req DiffCommentRequest) String() string {
|
||
|
return req.MustGetPrompt()
|
||
|
}
|
||
|
|
||
|
// MustGetPrompt only returns the prompt, but panics if the data in the request cannot populate the template.
|
||
|
func (req DiffCommentRequest) MustGetPrompt() string {
|
||
|
prompt, err := req.GetPrompt()
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
return prompt
|
||
|
}
|
||
|
|
||
|
// GetPrompt converts the information in the request to a prompt for an LLM.
|
||
|
func (req DiffCommentRequest) GetPrompt() (string, error) {
|
||
|
tmpl, err := template.ParseFiles("./llm/prompts/comment-diff-request.tmpl")
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
var result bytes.Buffer
|
||
|
err = tmpl.Execute(&result, req)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
return result.String(), nil
|
||
|
}
|
||
|
|
||
|
// String is a string representation of DiffCommentResponse.
|
||
|
func (res DiffCommentResponse) String() string {
|
||
|
out := ""
|
||
|
if res.Type == ResponseAnswer {
|
||
|
out += "Type: Answer\n"
|
||
|
out += res.Answer
|
||
|
return out
|
||
|
}
|
||
|
|
||
|
out += "Type: Code Change\n"
|
||
|
|
||
|
out += "Response:\n"
|
||
|
out += res.Answer + "\n\n"
|
||
|
out += "Files:\n"
|
||
|
out += res.File.Path + ":\n```\n"
|
||
|
out += res.File.Contents + "\n```\n"
|
||
|
|
||
|
return out
|
||
|
}
|
||
|
|
||
|
func ParseDiffCommentResponse(llmResponse string) DiffCommentResponse {
|
||
|
llmResponse = strings.TrimSpace(llmResponse)
|
||
|
if llmResponse[0] == 'A' {
|
||
|
answer := strings.TrimSpace(llmResponse[1:])
|
||
|
return DiffCommentResponse{
|
||
|
Type: ResponseAnswer,
|
||
|
Answer: answer,
|
||
|
}
|
||
|
}
|
||
|
parts := strings.Split(llmResponse, "ppresponse:")
|
||
|
|
||
|
filesSection := ""
|
||
|
if len(parts) > 0 {
|
||
|
filesSection = parts[0]
|
||
|
}
|
||
|
|
||
|
answer := ""
|
||
|
if len(parts) > 1 {
|
||
|
answer = strings.TrimSpace(parts[1])
|
||
|
}
|
||
|
|
||
|
files := parseFiles(filesSection)
|
||
|
f := File{}
|
||
|
if len(files) > 0 {
|
||
|
f = files[0]
|
||
|
}
|
||
|
|
||
|
return DiffCommentResponse{
|
||
|
Type: ResponseCodeChange,
|
||
|
Answer: answer,
|
||
|
File: f,
|
||
|
}
|
||
|
}
|