mirror of
https://github.com/mudler/LocalAI.git
synced 2026-06-11 10:19:33 -04:00
Propagate terminal write errors from the chat prompt and explicitly ignore stream close errors during cleanup. Update chat tests to assert response writer errors so errcheck passes without hiding failed writes. Tests: - go test -count=1 ./core/cli/chat - go test -count=1 ./core/cli Assisted-by: Codex:GPT-5 Signed-off-by: Ching Kao <0980124jim@gmail.com>
94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
package chat
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
func runTerminalChat(ctx context.Context, session *chatSession, in io.Reader, out io.Writer) error {
|
|
scanner := bufio.NewScanner(in)
|
|
scanner.Buffer(make([]byte, 0, 64*1024), 4*1024*1024)
|
|
|
|
if err := writeChat(out, "LocalAI chat (%s)\n", session.CurrentModel()); err != nil {
|
|
return err
|
|
}
|
|
if err := writeChat(out, "Type /exit to quit, /clear to reset the conversation, /models to list models.\n"); err != nil {
|
|
return err
|
|
}
|
|
|
|
for {
|
|
if err := writeChat(out, "\n> "); err != nil {
|
|
return err
|
|
}
|
|
if !scanner.Scan() {
|
|
break
|
|
}
|
|
|
|
prompt := strings.TrimSpace(scanner.Text())
|
|
switch prompt {
|
|
case "":
|
|
continue
|
|
case "/bye", "/exit", "/quit":
|
|
return writeChat(out, "bye\n")
|
|
case "/clear":
|
|
session.Clear()
|
|
if err := writeChat(out, "conversation cleared\n"); err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
case "/models":
|
|
if err := printChatModels(out, session.Models(), session.CurrentModel()); err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
}
|
|
|
|
if nextModel, ok := strings.CutPrefix(prompt, "/model "); ok {
|
|
nextModel = strings.TrimSpace(nextModel)
|
|
if nextModel == "" {
|
|
if err := writeChat(out, "usage: /model <name>\n"); err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
}
|
|
if err := session.SwitchModel(nextModel); err != nil {
|
|
if writeErr := writeChat(out, "%s\n", err); writeErr != nil {
|
|
return writeErr
|
|
}
|
|
continue
|
|
}
|
|
if err := writeChat(out, "switched to %s; conversation cleared\n", session.CurrentModel()); err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
}
|
|
|
|
if err := writeChat(out, "assistant: "); err != nil {
|
|
return err
|
|
}
|
|
if err := session.Send(ctx, prompt, out); err != nil {
|
|
return err
|
|
}
|
|
if err := writeChat(out, "\n"); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return scanner.Err()
|
|
}
|
|
|
|
func printChatModels(out io.Writer, models []string, current string) error {
|
|
if len(models) == 0 {
|
|
return writeChat(out, "no models installed\n")
|
|
}
|
|
return writeChat(out, "%s", formatChatModelList(models, current))
|
|
}
|
|
|
|
func writeChat(out io.Writer, format string, args ...any) error {
|
|
_, err := fmt.Fprintf(out, format, args...)
|
|
return err
|
|
}
|