c0c11cd36d
- Add llmphraser: LFM-based phraser implementing Phraser interface with PhraseChat, PhraseNudge, PhraseReactive, and PhraseReminder methods. - Add shared internal/llm/client: llama-server completion client used by both the phraser (talking back) and router (routing), sharing one model. - Add LLMReplier in mavend: replaces StubReplier for chat/nudge/reactive replies, falls back to stub on model errors. - Update Phraser interface: add PhraseChat method, update stub to match. - Wire LLM phaser into mavend voice init, plumb LLM config from JSON.
60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package llm
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestComplete(t *testing.T) {
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != "POST" {
|
|
t.Errorf("method = %q, want POST", r.Method)
|
|
}
|
|
if !strings.HasSuffix(r.URL.Path, "/v1/chat/completions") {
|
|
t.Errorf("path = %q, want /v1/chat/completions", r.URL.Path)
|
|
}
|
|
var reqBody struct {
|
|
Messages []struct {
|
|
Role string `json:"role"`
|
|
Content string `json:"content"`
|
|
} `json:"messages"`
|
|
Grammar string `json:"grammar"`
|
|
MaxTokens int `json:"max_tokens"`
|
|
}
|
|
if err := json.NewDecoder(r.Body).Decode(&reqBody); err != nil {
|
|
t.Fatalf("decode request body: %v", err)
|
|
}
|
|
if len(reqBody.Messages) < 2 {
|
|
t.Fatalf("expected at least 2 messages, got %d", len(reqBody.Messages))
|
|
}
|
|
if reqBody.Messages[0].Role != "system" || reqBody.Messages[1].Content != "hi" {
|
|
t.Errorf("unexpected messages: %+v", reqBody.Messages)
|
|
}
|
|
if reqBody.Grammar != `root ::= "x"` {
|
|
t.Errorf("grammar = %q, want root ::= \"x\"", reqBody.Grammar)
|
|
}
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Write([]byte(`{"choices":[{"message":{"content":"ok"}}]}`))
|
|
}))
|
|
defer srv.Close()
|
|
|
|
c := New(srv.URL, 5*time.Second)
|
|
got, err := c.Complete(context.Background(), Req{
|
|
System: "be helpful",
|
|
User: "hi",
|
|
Grammar: `root ::= "x"`,
|
|
MaxTokens: 42,
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("Complete: %v", err)
|
|
}
|
|
if got != "ok" {
|
|
t.Errorf("got %q, want %q", got, "ok")
|
|
}
|
|
}
|