84 lines
2.2 KiB
Go
84 lines
2.2 KiB
Go
package rpc
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"github.com/coder/websocket"
|
|
"net/http"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func approvedFullTestJSON(t *testing.T) []byte {
|
|
t.Helper()
|
|
raw, err := os.ReadFile("../../contracts/schema/examples/config-read-task-full.json")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var body map[string]any
|
|
if json.Unmarshal(raw, &body) != nil {
|
|
t.Fatal("decode full task fixture")
|
|
}
|
|
a := body["agent"].(map[string]any)
|
|
a["llm"] = map[string]any{"provider_ref": "openai_compatible", "model": "example-chat", "params": map[string]any{"temperature": 0, "max_tokens": 256}}
|
|
a["tts"] = map[string]any{"provider_ref": "ali_bailian", "model": "qwen3-tts-flash", "voice": "Cherry", "params": map[string]any{"format": "pcm", "sample_rate": 16000}}
|
|
raw, err = json.Marshal(body)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return raw
|
|
}
|
|
|
|
func serveApprovedTTSMock(t *testing.T, w http.ResponseWriter, r *http.Request, observe func(map[string]any)) {
|
|
t.Helper()
|
|
conn, err := websocket.Accept(w, r, nil)
|
|
if err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
defer conn.CloseNow()
|
|
ctx, cancel := context.WithTimeout(r.Context(), 3*time.Second)
|
|
defer cancel()
|
|
read := func() map[string]any {
|
|
_, raw, err := conn.Read(ctx)
|
|
if err != nil {
|
|
t.Error(err)
|
|
return nil
|
|
}
|
|
var command map[string]any
|
|
if json.Unmarshal(raw, &command) != nil {
|
|
t.Error("invalid task command")
|
|
}
|
|
return command
|
|
}
|
|
start := read()
|
|
if start == nil {
|
|
return
|
|
}
|
|
id := start["header"].(map[string]any)["task_id"].(string)
|
|
event := func(name string) {
|
|
raw, _ := json.Marshal(map[string]any{"header": map[string]any{"task_id": id, "event": name}, "payload": map[string]any{}})
|
|
if err := conn.Write(ctx, websocket.MessageText, raw); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
event("task-started")
|
|
next := read()
|
|
if next == nil {
|
|
return
|
|
}
|
|
finish := read()
|
|
if finish == nil {
|
|
return
|
|
}
|
|
p := start["payload"].(map[string]any)
|
|
input := next["payload"].(map[string]any)["input"]
|
|
observe(map[string]any{"model": p["model"], "parameters": p["parameters"], "input": input})
|
|
if err := conn.Write(ctx, websocket.MessageBinary, []byte{1, 0, 2, 0}); err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
event("task-finished")
|
|
}
|