123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- package llm
- import (
- "github.com/0xJacky/Nginx-UI/internal/helper"
- "github.com/0xJacky/Nginx-UI/internal/nginx"
- "github.com/sashabaranov/go-openai"
- "github.com/uozi-tech/cosy/logger"
- "os"
- "regexp"
- "strings"
- )
- type includeContext struct {
- Paths []string
- PathsMap map[string]bool
- }
- func IncludeContext(filename string) (includes []string) {
- c := &includeContext{
- Paths: make([]string, 0),
- PathsMap: make(map[string]bool),
- }
- c.extractIncludes(filename)
- return c.Paths
- }
- // extractIncludes extracts all include statements from the given nginx configuration file.
- func (c *includeContext) extractIncludes(filename string) {
- if !helper.FileExists(filename) {
- logger.Error("File does not exist: ", filename)
- return
- }
- if !helper.IsUnderDirectory(filename, nginx.GetConfPath()) {
- logger.Error("File is not under the nginx conf path: ", filename)
- return
- }
- // Read the file content
- content, err := os.ReadFile(filename)
- if err != nil {
- logger.Error(err)
- return
- }
- // Find all include statements
- pattern := regexp.MustCompile(`(?m)^\s*include\s+([^;]+);`)
- matches := pattern.FindAllStringSubmatch(string(content), -1)
- for _, match := range matches {
- if len(match) > 1 {
- // Resolve the path of the included file
- includePath := match[1]
- // to avoid infinite loop
- if c.PathsMap[includePath] {
- continue
- }
- c.push(includePath)
- // Recursively extract includes from the included file
- c.extractIncludes(includePath)
- }
- }
- return
- }
- func (c *includeContext) push(path string) {
- c.Paths = append(c.Paths, path)
- c.PathsMap[path] = true
- }
- // getConfigIncludeContext returns the context of the given filename.
- func getConfigIncludeContext(filename string) (multiContent []openai.ChatMessagePart) {
- multiContent = make([]openai.ChatMessagePart, 0)
- if !helper.IsUnderDirectory(filename, nginx.GetConfPath()) {
- return
- }
- includes := IncludeContext(filename)
- logger.Debug(includes)
- var sb strings.Builder
- for _, include := range includes {
- text, _ := os.ReadFile(nginx.GetConfPath(include))
- if len(text) == 0 {
- continue
- }
- sb.WriteString("The Content of ")
- sb.WriteString(include)
- sb.WriteString(",")
- sb.WriteString(string(text))
- multiContent = append(multiContent, openai.ChatMessagePart{
- Type: openai.ChatMessagePartTypeText,
- Text: sb.String(),
- })
- sb.Reset()
- }
- return
- }
|