feat: add multimodal client defaults

parent 63014197
from tools.manual_multimodal_test_client import build_parser, choose_mode_interactively, parse_args from tools.manual_multimodal_test_client import (
MODE_DEFAULTS,
build_parser,
choose_mode_interactively,
parse_args,
resolve_mode_config,
)
def test_parse_args_accepts_direct_mode_and_global_overrides(): def test_parse_args_accepts_direct_mode_and_global_overrides():
...@@ -31,3 +37,32 @@ def test_parse_args_leaves_mode_empty_for_interactive_fallback(): ...@@ -31,3 +37,32 @@ def test_parse_args_leaves_mode_empty_for_interactive_fallback():
args = parse_args([]) args = parse_args([])
assert args.mode is None assert args.mode is None
def test_resolve_mode_config_uses_mode_defaults_when_overrides_absent(tmp_path):
args = parse_args(["audio-generation", "--output-dir", str(tmp_path)])
config = resolve_mode_config(args, selected_mode="audio-generation")
assert config["mode"] == "audio-generation"
assert config["url"] == "http://127.0.0.1:6745"
assert config["model"] == MODE_DEFAULTS["audio-generation"]["model"]
assert config["prompt"] == MODE_DEFAULTS["audio-generation"]["prompt"]
assert config["output_dir"] == tmp_path
def test_resolve_mode_config_prefers_explicit_model_prompt_and_url_overrides(tmp_path):
args = parse_args([
"video-generation",
"--url", "http://example.invalid:9999",
"--model", "video:custom-model",
"--prompt", "Custom prompt",
"--output-dir", str(tmp_path),
])
config = resolve_mode_config(args, selected_mode="video-generation")
assert config["url"] == "http://example.invalid:9999"
assert config["model"] == "video:custom-model"
assert config["prompt"] == "Custom prompt"
assert config["output_dir"] == tmp_path
from __future__ import annotations from __future__ import annotations
import argparse import argparse
from pathlib import Path
MODES = [ MODES = [
...@@ -13,6 +14,39 @@ MODES = [ ...@@ -13,6 +14,39 @@ MODES = [
] ]
MODE_DEFAULTS = {
"llm": {
"model": "text",
"prompt": "Reply with a short test acknowledgement.",
},
"transcription": {
"model": "audio",
"prompt": None,
"audio_file": "samples/transcription.wav",
},
"audio-generation": {
"model": "audio_gen",
"prompt": "Generate a short calm ambient audio test clip.",
"response_format": "url",
},
"video-generation": {
"model": "video",
"prompt": "Generate a short test clip of a rotating cube.",
"response_format": "url",
},
"video-doubt": {
"model": "vision",
"prompt": "Describe the important events in this video.",
"video_file": "samples/question-video.mp4",
},
"music-audio-doubt": {
"model": "audio",
"prompt": "Describe the music and prominent sounds in this audio.",
"audio_file": "samples/question-audio.wav",
},
}
def build_parser() -> argparse.ArgumentParser: def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="Manual multimodal smoke-test client") parser = argparse.ArgumentParser(description="Manual multimodal smoke-test client")
parser.add_argument("mode", nargs="?", choices=MODES) parser.add_argument("mode", nargs="?", choices=MODES)
...@@ -31,6 +65,22 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: ...@@ -31,6 +65,22 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
return build_parser().parse_args(argv) return build_parser().parse_args(argv)
def resolve_mode_config(args: argparse.Namespace, selected_mode: str) -> dict:
defaults = MODE_DEFAULTS[selected_mode]
return {
"mode": selected_mode,
"url": args.url.rstrip("/"),
"token": args.token,
"model": args.model or defaults.get("model"),
"prompt": args.prompt if args.prompt is not None else defaults.get("prompt"),
"output_dir": Path(args.output_dir),
"file": args.file,
"audio_file": args.audio_file or defaults.get("audio_file"),
"video_file": args.video_file or defaults.get("video_file"),
"response_format": defaults.get("response_format"),
}
def choose_mode_interactively() -> str: def choose_mode_interactively() -> str:
for idx, mode in enumerate(MODES, start=1): for idx, mode in enumerate(MODES, start=1):
print(f"{idx}. {mode}") print(f"{idx}. {mode}")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment