package server import ( "bytes" "fmt" "gskaro-v1/internal/llm" "net/http" "time" ) type llmLogEntry struct { Model string Prompt string Answer string Timestamp time.Time PromptTokens int AnswerTokens int } var llmHistory []llmLogEntry // ----------------------------- // LLM Console // ----------------------------- func llmConsoleHandler(w http.ResponseWriter, r *http.Request) { if r.Header.Get("HX-Request") != "true" { fmt.Fprintf(w, `
Текущая модель: %s
Ошибка подключения: %s
`, err) return } fmt.Fprintf(w, `Пустой запрос.
") return } client := &llm.OllamaClient{ Host: llm.ActiveHost, Model: llm.ActiveModel, } var answerBuf bytes.Buffer var promptTokens, answerTokens int err := client.Stream(prompt, func(chunk string, meta *llm.OllamaGenerateResponse) { answerBuf.WriteString(chunk) if meta != nil { promptTokens = meta.PromptEvalCount answerTokens = meta.EvalCount } }) if err != nil { fmt.Fprintf(w, "Ошибка: %s
", err) return } resp := answerBuf.String() llmHistory = append(llmHistory, llmLogEntry{ Model: llm.ActiveModel, Prompt: prompt, Answer: resp, Timestamp: time.Now(), PromptTokens: promptTokens, AnswerTokens: answerTokens, }) fmt.Fprintf(w, "%s", resp) } // ----------------------------- // Статус // ----------------------------- func llmStatusHandler(w http.ResponseWriter, r *http.Request) { resp, err := http.Get(llm.ActiveHost + "/api/tags") if err != nil { fmt.Fprintf(w, ` Ollama: offline Модель: %s `, llm.ActiveModel) return } resp.Body.Close() fmt.Fprintf(w, ` Ollama: online Модель: %s `, llm.ActiveModel) } // ----------------------------- // История // ----------------------------- func llmHistoryHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "
Пока пусто.
") return } fmt.Fprintf(w, `%s
%s