feat(llm): add Gemini CLI provider as primary; set qwen3.5:9b as default Ollama model

- Add GeminiCliProvider: shells out to `gemini -p` with --output-format json,
  injection-safe prompt passing, MCP server suppression via temp workdir,
  6-slot concurrency semaphore, 60s subprocess deadline
- Add --llm-provider, --llm-model, --llm-base-url CLI flags for per-call overrides
- Provider chain: Gemini CLI → OpenAI → Ollama → Anthropic
- Move LLM timing to dispatch layer (LLM: Xs on stderr)
- Default Ollama model: qwen3:8b → qwen3.5:9b (benchmark shows better schema extraction)
- Add noxa mcp subcommand
- Add docs/reports/llm-benchmark-2026-04-11.md (Gemini vs qwen3.5:4b vs qwen3.5:9b)
- Bump version 0.3.11 → 0.4.0

Co-authored-by: Claude <claude@anthropic.com>
This commit is contained in:
Jacob Magar 2026-04-12 00:52:53 -04:00
parent 464eb1baec
commit adf4b6ba55
39 changed files with 1999 additions and 1789 deletions

12
Cargo.lock generated
View file

@ -1746,7 +1746,7 @@ dependencies = [
[[package]]
name = "noxa-cli"
version = "0.3.11"
version = "0.4.0"
dependencies = [
"clap",
"dotenvy",
@ -1768,7 +1768,7 @@ dependencies = [
[[package]]
name = "noxa-core"
version = "0.3.11"
version = "0.4.0"
dependencies = [
"ego-tree",
"once_cell",
@ -1786,7 +1786,7 @@ dependencies = [
[[package]]
name = "noxa-fetch"
version = "0.3.11"
version = "0.4.0"
dependencies = [
"bytes",
"calamine",
@ -1808,7 +1808,7 @@ dependencies = [
[[package]]
name = "noxa-llm"
version = "0.3.11"
version = "0.4.0"
dependencies = [
"async-trait",
"jsonschema",
@ -1822,7 +1822,7 @@ dependencies = [
[[package]]
name = "noxa-mcp"
version = "0.3.11"
version = "0.4.0"
dependencies = [
"dirs",
"dotenvy",
@ -1843,7 +1843,7 @@ dependencies = [
[[package]]
name = "noxa-pdf"
version = "0.3.11"
version = "0.4.0"
dependencies = [
"pdf-extract",
"thiserror",