434d721b99
- New leaf package `audio` (ADR-0017): SpeechModel/SpeechProvider and TranscriptionModel/TranscriptionProvider with imagegen conventions (zero value = backend default, functional options + Apply, bytes in/out, never URLs). Root re-exports added. - imagegen.Editor (ADR-0018): optional image-to-image interface — EditRequest carries the generation knobs plus Init image and denoising Strength; separate interface so existing Models keep compiling. - provider/llamaswap implements all of it: POST /v1/audio/speech (JSON, raw-audio response, MIME from Content-Type with format fallback), POST /v1/audio/transcriptions (multipart, response_format=json), ListVoices (GET /v1/audio/voices?model=, tolerant of string-list and object-list shapes), POST /sdapi/v1/img2img (txt2img wire + init_images/denoising_strength, shared image decode), and Health(ctx) (GET /health) — a cheap liveness probe for often-offline hosts. - Hermetic httptest coverage for every new wire shape and validation path; README sections + support-matrix footnote updated in the same commit (also corrects the stale /v1/images/generations claim — the image path has been SDAPI since the seed fix). First consumer: mort's llamaswap media tool cluster (status / image / TTS / STT agent tools against the netherstorm host). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AXQxVhXBw8PwFAtsVrXSmj
39 lines
1.1 KiB
Go
39 lines
1.1 KiB
Go
package audio
|
|
|
|
import "testing"
|
|
|
|
func TestSpeechRequestApply(t *testing.T) {
|
|
base := SpeechRequest{Input: "hello"}
|
|
got := base.Apply(WithVoice("af_heart"), WithFormat("wav"), WithSpeed(1.5))
|
|
|
|
if got.Input != "hello" {
|
|
t.Errorf("Input = %q, want %q", got.Input, "hello")
|
|
}
|
|
if got.Voice != "af_heart" || got.Format != "wav" || got.Speed != 1.5 {
|
|
t.Errorf("got = %+v", got)
|
|
}
|
|
|
|
// Apply must not mutate the receiver (options apply to a copy).
|
|
if base.Voice != "" || base.Format != "" || base.Speed != 0 {
|
|
t.Errorf("base mutated: %+v", base)
|
|
}
|
|
}
|
|
|
|
func TestTranscriptionRequestApply(t *testing.T) {
|
|
base := TranscriptionRequest{Audio: []byte{1, 2, 3}}
|
|
got := base.Apply(WithLanguage("en"), WithPrompt("names"))
|
|
|
|
if got.Language != "en" || got.Prompt != "names" {
|
|
t.Errorf("got = %+v", got)
|
|
}
|
|
if base.Language != "" || base.Prompt != "" {
|
|
t.Errorf("base mutated: %+v", base)
|
|
}
|
|
}
|
|
|
|
func TestApplyModelOptions(t *testing.T) {
|
|
// No options yet; just verify they return usable zero configs.
|
|
_ = ApplySpeechModelOptions(nil)
|
|
_ = ApplyTranscriptionModelOptions(nil)
|
|
}
|