lobes-cli 0.84.3__tar.gz → 0.85.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/CHANGELOG.md +11 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/PKG-INFO +1 -1
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/hebrew-realtime.md +20 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/listen_server_whisper.py +232 -52
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/pyproject.toml +1 -1
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_listen_server_whisper.py +140 -3
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/uv.lock +1 -1
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.agex/data/pr/events.jsonl +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/challenge/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/cicd/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/communicate/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/deviate/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/lobes-deploy/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/lobes-deploy/scripts/lobes-compose.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/model-runner/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/model-runner/scripts/model-runner.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/recall/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/recall/scripts/recall.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/remember/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/remember/scripts/remember.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/scope/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/summarize-delivery/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/think/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/think/scripts/think.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/validate-delivery/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/version-bump/SKILL.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.claude/skills.local.yaml.example +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/current +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/current_plan +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/capacity-relative-pool-routing.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/cortex-replica-pool-199.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/deployment-lock-per-box.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/dspark-speculation-on-the-spark-cortex.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/every-lobe-in-the-mesh-can-see-the-spark-reaches-t.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/flash-next-worker-on-thor.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/hand-lobe-lfm2-5-1-2b.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/hebrew-realtime.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/innereye-lobes-hosts-comfyui.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/lightning-on-orin.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/lobes-capabilities-tells-you-where-a-lobe-is-serve.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/mesh-boot-window-and-capabilities-advert.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/mesh-brain-join.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/mesh-pool-load-sharing.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/nemotron-lightning-worker.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/orin-associate-at-1m.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/orin-embedding-specialist.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/qwen3-8-gguf-llamacpp.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/realtime-voice-to-voice-astro-test-site-151.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/reranker-calibration-227.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/thor-cortex-speculation.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/thor-worker-arm-qwen3-6-35b-a3b-recipes.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/deliveries/unsloth-qat-senses-first-class-orin-variation.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/capacity-relative-pool-routing.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/chatterbox-on-thor-sm-110.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/compose-chain-unification-init-repair-doctor-stale.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/cortex-replica-pool-199.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/deployment-lock-per-box.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/dspark-speculation-on-the-spark-cortex.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/every-lobe-in-the-mesh-can-see-the-spark-reaches-t.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/flash-next-on-vllm.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/flash-next-worker-on-thor.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/hand-lobe-lfm2-5-1-2b.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/hebrew-realtime.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/innereye-lobes-hosts-comfyui.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lightning-on-orin.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lightning-on-thor.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-adds-a-third-middle-model-tier-and-pressure.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-capabilities-tells-you-where-a-lobe-is-serve.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-exposes-the-full-colleague-runtime-stack-as.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-fits-the-machine-it-lands-on-one-command-det.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-gateway-relays-sse-streams-frame-by-frame-th.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-never-advertises-a-capability-it-cannot-serv.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-preserves-qwen-thinking-traces-across-multi.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-serves-strict-grammar-constrained-tool-calls.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-serves-the-brain-shape-you-choose-machine-as.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-serves-the-mesh-brain-end-state-one-lobe-per.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-ships-a-per-lobe-benchmark-suite-speed-paral.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-tells-clients-the-truth-about-a-fleet-a-cons.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/lobes-unifies-its-generate-lane-on-one-vllm-nightl.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/mesh-boot-window-and-capabilities-advert.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/mesh-brain-join.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/mesh-pool-load-sharing.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/model-gear-now-serves-an-embedding-gear-qwen3-embe-2.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/model-gear-now-serves-an-embedding-gear-qwen3-embe.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/model-gear-owns-the-audio-i-o-surface-end-to-end-m.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/nemotron-lightning-worker.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/orin-associate-at-1m.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/orin-embedding-specialist.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/peer-only-replica-pools.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/proxy-lobes-pairwise-auth.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/public-lobes-and-hebrew-site.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/quick-wins-finish-the-rename.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/qwen3-8-27b-gguf-on-the-spark.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/qwen3-8-cortex-upgrade.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/qwen3-8-flash-next-gguf-candidate.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/qwen3-8-flash-next-on-thor.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/qwen3-8-gguf-llamacpp.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/realtime-voice-to-voice-astro-test-site-151.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/realtime-ws-server-vad-149.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/reranker-calibration-227.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/stt-readiness-truth-155.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/targeted-ops-and-honest-streams.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/the-gemma-4-12b-gear-gets-speculative-decoding-lob.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/thor-cortex-speculation.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/thor-worker-arm-qwen3-6-35b-a3b-recipes.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/thor-worker-lobe-qwen3-6-35b-a3b.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/under-pressure-lobes-tells-you-the-cortex-model-is.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/frames/unsloth-qat-senses-first-class-orin-variation.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/capacity-relative-pool-routing.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/compose-chain-unification-init-repair-doctor-stale.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/cortex-replica-pool-199.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/deployment-lock-per-box.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/dspark-speculation-on-the-spark-cortex.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/every-lobe-in-the-mesh-can-see-the-spark-reaches-t.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/flash-next-worker-on-thor.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/hand-lobe-lfm2-5-1-2b.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/hebrew-realtime.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/innereye-lobes-hosts-comfyui.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lightning-on-orin.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-adds-a-third-middle-model-tier-and-pressure.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-capabilities-tells-you-where-a-lobe-is-serve.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-exposes-the-full-colleague-runtime-stack-as.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-fits-the-machine-it-lands-on-one-command-det.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-gateway-relays-sse-streams-frame-by-frame-th.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-never-advertises-a-capability-it-cannot-serv.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-preserves-qwen-thinking-traces-across-multi.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-serves-strict-grammar-constrained-tool-calls.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-serves-the-brain-shape-you-choose-machine-as.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-serves-the-mesh-brain-end-state-one-lobe-per.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-ships-a-per-lobe-benchmark-suite-speed-paral.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-tells-clients-the-truth-about-a-fleet-a-cons.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/lobes-unifies-its-generate-lane-on-one-vllm-nightl.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/mesh-boot-window-and-capabilities-advert.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/mesh-brain-join.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/mesh-pool-load-sharing.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/model-gear-now-serves-an-embedding-gear-qwen3-embe-2.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/model-gear-owns-the-audio-i-o-surface-end-to-end-m.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/nemotron-lightning-worker.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/orin-associate-at-1m.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/orin-embedding-specialist.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/peer-only-replica-pools.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/proxy-lobes-pairwise-auth.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/quick-wins-finish-the-rename.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/qwen3-8-cortex-upgrade.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/qwen3-8-flash-next-gguf-candidate.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/qwen3-8-gguf-llamacpp.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/realtime-voice-to-voice-astro-test-site-151.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/realtime-ws-server-vad-149.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/reranker-calibration-227.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/stt-readiness-truth-155.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/the-gemma-4-12b-gear-gets-speculative-decoding-lob.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/thor-cortex-speculation.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/thor-worker-arm-qwen3-6-35b-a3b-recipes.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/thor-worker-lobe-qwen3-6-35b-a3b.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/under-pressure-lobes-tells-you-the-cortex-model-is.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.devague/plans/unsloth-qat-senses-first-class-orin-variation.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.eidetic/memory/colleague__public.jsonl +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.eidetic/memory/default__public.jsonl +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.eidetic/memory/lobes__public.jsonl +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.flake8 +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.github/workflows/publish.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.github/workflows/tests.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.gitignore +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/.markdownlint-cli2.yaml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/AGENTS.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/CLAUDE.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/LICENSE +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/QWEN.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/README.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/culture.yaml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/README.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/VARIATION.template.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/Dockerfile.embed-st +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/Dockerfile.gateway +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/VARIATION.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/deployment.lock.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/docker-compose.embed.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/docker-compose.gpu.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/docker-compose.override.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/docker-compose.shape.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/docker-compose.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/mg-logwrap.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/qwen3_reranker.jinja +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-orin__orin-embed/qwen3_thinking_tool_parser.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/Dockerfile.gateway +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/Dockerfile.vllm-gemma4 +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/VARIATION.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/deployment.lock.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/docker-compose.override.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/docker-compose.shape.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/docker-compose.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/mg-logwrap.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/qwen3_reranker.jinja +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/deployments/jetson-agx-thor__thor-worker/qwen3_thinking_tool_parser.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/chatterbox-tts.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/colleague-stack.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/comfyui-innereye.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/contracts/README.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/contracts/realtime-tool-calling.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-07-16-proxy-lobes-pairwise-auth.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-07-21-realtime-voice-to-voice-astro-test-site-151.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-04-unsloth-qat-senses-first-class-orin-variation.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-10-hand-lobe-lfm2-5-1-2b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-20-nemotron-lightning-worker.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-22-qwen3-8-gguf-llamacpp.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-23-qwen3-8-gguf-llamacpp-deviation-ledger.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-24-dspark-speculation-on-the-spark-cortex.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-25-cortex-replica-pool-199.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-25-lightning-on-orin.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-25-thor-cortex-speculation.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-29-deployment-lock-per-box.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-30-peer-only-replica-pools.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-08-31-quick-wins-finish-the-rename.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-09-10-thor-worker-arm-qwen3-6-35b-a3b-recipes.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-09-11-mesh-brain-join.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-09-12-mesh-boot-window-and-capabilities-advert.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-09-13-orin-associate-at-1m.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-09-16-innereye-lobes-hosts-comfyui.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-09-18-hebrew-realtime.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-10-06-mesh-pool-load-sharing.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deliveries/2026-10-07-orin-embedding-specialist.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deployment-lock.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/deployment-shapes.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/dspark-speculation.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/durable-logs.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/embeddinggemma-2.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-14-accept-referral-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-14-accept-spark-lobe-gb10.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-14-accept-thor-lobe-live-referral-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-14-accept-thor-lobe-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-14-strict-tools-spark-lobe-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-16-proxy-lobes-live-spark-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-17-accept-muse-tool-calling-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-20-accept-embed-deep-gb10.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-21-accept-realtime-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-21-accept-voice-loop-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-22-accept-realtime-voice-to-voice-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-25-accept-by-proxy-spark-f8a9.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-31-accept-multimodal-cortex-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-31-accept-worker-proxy-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-07-31-accept-worker-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-04-accept-senses-unsloth-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-10-hand-lobe-budget-derivation.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-10-partial-hand-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-10-partial-hand-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-19-accept-qwen38-1m-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-19-baseline-qwen3.6-cortex-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-19-spike-qwen3.8-official-nightly-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-accept-cortex-local-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-accept-cortex-repoint-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-accept-cortex-repoint-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-accept-dual-cortex-mesh.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-accept-hand-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-accept-worker-hand-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-baseline-worker-qwen35b-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-hand-thor-blocked-reattributed.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-spike-lightning-thor-no-go.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-20-spike-nightly-sm110-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-21-measure-reasoning-effort-cortex-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-23-spike-qwen38-gguf-llamacpp-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-24-spike-dspark-cortex-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-25-accept-cortex-replica-pool-spark-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-25-accept-spark-lobe-dspark-render.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-25-baseline-cortex-single-owner.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-25-measure-associate-budget-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-25-orin-board-state-lightning-spikes.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-25-spike-lightning-llamacpp-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-25-spike-lightning-vllm-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-25-spike-thor-cortex-speculation.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-26-accept-orin-associate.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-26-associate-gateway-auth-front.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-28-accept-capacity-relative-pool-thor-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-30-accept-peer-only-pool-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-30-accept-reranker-template-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-30-baseline-orin-cortex-pinned.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-08-30-baseline-reranker-untemplated-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-10-accept-nvidia-35b-a3b-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-10-accept-thor-worker-flip.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-10-baseline-thor-cortex-pre-244.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-10-spike-nvidia-35b-a3b-preboot-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-10-sweep-mtp-depth-nvidia-35b-a3b-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-10-thor-backup-and-rollback-dryrun-244.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-10-thor-pressure-floor-244.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-11-accept-thor-reranker-template-senses-unproxy.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-11-accept-worker-proxy-spark-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-12-accept-mesh-boot-window-fleet.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-12-accept-mesh-brain-join-fleet.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-12-baseline-mesh-cutover.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-13-accept-orin-associate-1m.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-13-measure-associate-budget-orin-1m.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-13-spike-lightning-thor-v029.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-16-accept-innereye-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-16-baseline-comfyui-venv-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-16-innereye-render-via-thor.png +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-16-t2-comfyui-container-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-19-accept-multimodal-gemma26b-native-context-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-23-spike-flash-next-worker-thor.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-hebrew-realtime-audio-hardware-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-hebrew-realtime-first-loop-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-hebrew-realtime-spike-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-hebrew-realtime-streaming-bluetts-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-hebrew-realtime-vad-ab-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-hebrew-stt-spike-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-hebrew-tts-ab-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-09-hebrew-voice-lane-senses12b-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-06-accept-mesh-member-lanes.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-accept-innereye-replace-spark.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-accept-orin-embed.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-h2h/run1.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-h2h/run1.table.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-h2h/run2-nomic.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-h2h/run2-nomic.table.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-h2h/run3-qwen3vl.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-h2h/run3-qwen3vl.table.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-h2h-code-retrieval-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-rollback-orin-embed-to-orin-associate.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-spike-embeddinggemma2-sidecar-orin.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/2026-10-07-spike-orin-embed-vllm-8b.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/README-dspark-arms.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/README-realtime-acceptance.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/arm-a16-dspark-262k.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/arm-a16-none-262k.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/arm-dspark-262k.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/arm-dspark-768k.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/arm-mtp-n2-262k.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/arm-mtp-n2-768k.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/arm-mtp-n2.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/arm-none-262k.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/evidence/arm-none-768k.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/experiments/README.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/experiments/qwen3.8-flash-next-gguf-llamacpp-vllm.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/experiments/qwen3.8-flash-next-nvfp4-thor-reference.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/gateway-fleet.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/gemma-4-12b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/gemma-4-12b-qat-w4a16.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/gemma-4-31b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/gemma4-mtp-draft.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/image-ledger.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/lfm2.5-1.2b-hand.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/machine-profiles.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/measuring-lane-performance.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/mistral-small-3.2-24b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/model-switch-playbook.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/nemotron-3-embed-8b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/nemotron-3.5-lightning-30b-a3b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/nomic-embed-code.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/nvidia-qwen3.6-35b-a3b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/openai-api.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/operating-a-deployment.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/orin-associate-deployment.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/orin-embed-deployment.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/orin-profiles.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/parakeet-stt.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-06-12-model-gear-owns-the-audio-i-o-surface-end-to-end-m.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-06-19-model-gear-now-serves-an-embedding-gear-qwen3-embe-2.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-06-26-lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-06-26-lobes-ships-a-per-lobe-benchmark-suite-speed-paral.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-06-29-lobes-adds-a-third-middle-model-tier-and-pressure.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-06-30-lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-06-30-lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-01-gemma-4-12b-gear-gets-speculative-decoding-draft.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-01-lobes-unifies-its-generate-lane-on-one-vllm-nightl.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-03-lobes-exposes-the-full-colleague-runtime-stack-as.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-03-under-pressure-lobes-tells-you-the-cortex-model-is.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-04-lobes-tells-clients-the-truth-about-a-fleet-a-cons.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-07-lobes-preserves-qwen-thinking-traces-across-multi.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-09-lobes-never-advertises-a-capability-it-cannot-serv.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-10-lobes-gateway-relays-sse-streams-frame-by-frame-th.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-13-lobes-fits-the-machine-it-lands-on-one-command-det.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-14-lobes-serves-strict-grammar-constrained-tool-calls.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-14-lobes-serves-the-brain-shape-you-choose-machine-as.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-14-lobes-serves-the-mesh-brain-end-state-one-lobe-per.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-16-proxy-lobes-pairwise-auth.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-17-compose-chain-unification-init-repair-doctor-stale.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-21-realtime-voice-to-voice-astro-test-site-151.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-21-realtime-ws-server-vad-149.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-24-stt-readiness-truth-155.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-25-lobes-capabilities-tells-you-where-a-lobe-is-serve.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-31-every-lobe-in-the-mesh-can-see-the-spark-reaches-t.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-07-31-thor-worker-lobe-qwen3-6-35b-a3b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-04-unsloth-qat-senses-first-class-orin-variation.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-10-hand-lobe-lfm2-5-1-2b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-19-qwen3-8-cortex-upgrade.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-20-nemotron-lightning-worker.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-22-qwen3-8-gguf-llamacpp.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-24-dspark-speculation-on-the-spark-cortex.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-25-cortex-replica-pool-199.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-25-lightning-on-orin.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-25-thor-cortex-speculation.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-27-capacity-relative-pool-routing.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-29-deployment-lock-per-box.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-30-peer-only-replica-pools.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-30-reranker-calibration-227.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-08-31-quick-wins-finish-the-rename.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-10-thor-worker-arm-qwen3-6-35b-a3b-recipes-split.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-10-thor-worker-arm-qwen3-6-35b-a3b-recipes.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-11-mesh-brain-join-split.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-11-mesh-brain-join.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-12-mesh-boot-window-and-capabilities-advert-split.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-12-mesh-boot-window-and-capabilities-advert.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-13-orin-associate-at-1m-split.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-13-orin-associate-at-1m.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-16-innereye-lobes-hosts-comfyui-split.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-16-innereye-lobes-hosts-comfyui.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-18-hebrew-realtime-HANDOFF.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-18-hebrew-realtime-split.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-18-hebrew-realtime.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-09-23-flash-next-worker-on-thor.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-10-06-mesh-pool-load-sharing-split.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-10-06-mesh-pool-load-sharing.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-10-07-orin-embedding-specialist-split.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/plans/2026-10-07-orin-embedding-specialist.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3-14b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3-32b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3-embedding-0.6b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3-embedding-4b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3-reranker-0.6b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3-vl-embedding-8b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3-vl-reranker-8b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3.5-4b-minor.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3.6-27b-nvfp4-multimodal.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3.6-27b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3.6-27b-text-nvfp4-mtp.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3.6-35b-a3b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3.8-27b-gguf-llamacpp.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen3.8-27b-nvfp4.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/qwen38-rollout-notes.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/realtime-pipeline.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/secret-rotation.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/skill-sources.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-06-12-model-gear-owns-the-audio-i-o-surface-end-to-end-m.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-06-19-model-gear-now-serves-an-embedding-gear-qwen3-embe-2.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-06-26-lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-06-26-lobes-ships-a-per-lobe-benchmark-suite-speed-paral.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-06-29-lobes-adds-a-third-middle-model-tier-and-pressure.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-06-30-lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-06-30-lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-01-gemma-4-12b-gear-gets-speculative-decoding-draft.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-01-lobes-unifies-its-generate-lane-on-one-vllm-nightl.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-03-lobes-exposes-the-full-colleague-runtime-stack-as.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-03-under-pressure-lobes-tells-you-the-cortex-model-is.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-04-lobes-tells-clients-the-truth-about-a-fleet-a-cons.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-07-lobes-preserves-qwen-thinking-traces-across-multi.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-09-lobes-never-advertises-a-capability-it-cannot-serv.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-10-lobes-gateway-relays-sse-streams-frame-by-frame-th.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-13-lobes-fits-the-machine-it-lands-on-one-command-det.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-14-lobes-serves-strict-grammar-constrained-tool-calls.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-14-lobes-serves-the-brain-shape-you-choose-machine-as.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-14-lobes-serves-the-mesh-brain-end-state-one-lobe-per.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-16-proxy-lobes-pairwise-auth.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-17-compose-chain-unification-init-repair-doctor-stale.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-21-realtime-voice-to-voice-astro-test-site-151.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-21-realtime-ws-server-vad-149.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-24-stt-readiness-truth-155.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-25-lobes-capabilities-tells-you-where-a-lobe-is-serve.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-31-every-lobe-in-the-mesh-can-see-the-spark-reaches-t.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-07-31-thor-worker-lobe-qwen3-6-35b-a3b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-04-unsloth-qat-senses-first-class-orin-variation.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-09-hand-lobe-lfm2-5-1-2b.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-19-qwen3-8-cortex-upgrade.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-20-nemotron-lightning-worker.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-22-qwen3-8-gguf-llamacpp.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-24-dspark-speculation-on-the-spark-cortex.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-25-cortex-replica-pool-199.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-25-lightning-on-orin.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-25-thor-cortex-speculation.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-27-capacity-relative-pool-routing.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-27-flash-next-on-vllm.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-27-qwen3-8-flash-next-gguf-candidate.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-29-deployment-lock-per-box.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-30-peer-only-replica-pools.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-30-reranker-calibration-227.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-08-31-quick-wins-finish-the-rename.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-09-10-thor-worker-arm-qwen3-6-35b-a3b-recipes.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-09-11-mesh-brain-join.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-09-12-mesh-boot-window-and-capabilities-advert.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-09-13-orin-associate-at-1m.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-09-16-innereye-lobes-hosts-comfyui.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-09-18-hebrew-realtime.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-09-23-flash-next-worker-on-thor.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-10-06-mesh-pool-load-sharing.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/specs/2026-10-07-orin-embedding-specialist.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/superpowers/plans/2026-05-22-scaffold-cli-sibling.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/superpowers/specs/2026-05-22-scaffold-cli-sibling-design.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/tensorrt-llm-investigation.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/thor-worker-flip-rollout-notes.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/tuning-profiles.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/validate-tiers.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/vllm-nightly-migration.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/docs/worker-lightning-rollout-notes.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/examples/minor-evals/smoke.jsonl +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/__main__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/_metrics.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/assess.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/bench/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/bench/cat_probe.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/bench/cat_score.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/bench/compare.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/bench/report.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/catalog.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/_role_probe.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/assess.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/benchmark.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/calibrate.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/capabilities.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/cli.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/doctor.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/eval.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/explain.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/fleet.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/init.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/learn.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/logs.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/measure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/mesh.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/overview.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/route.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/run.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/serve.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/status.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/stop.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/switch.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/tunnel.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/up.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_commands/whoami.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_errors.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_live.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_output.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_role_swap.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/cli/_runtime_ops.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/embed_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/embed_sidecar/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/embed_sidecar/server.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/explain/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/explain/catalog.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/__main__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_authlog.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_config.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_mesh_config.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_mesh_roster.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_mesh_routes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_mesh_routing.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_mesh_wire.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_pressure_policy.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_readiness.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_realtime.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_replicas.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_routing.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_selection.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/_tier_request.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/gateway/server.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/lane_keys.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/machines/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/machines/_registry.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/machines/_strategy.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/machines/_traits.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/machines/blackwell.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/machines/generic.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/machines/orin.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/machines/spark.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/machines/thor.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/minor/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/minor/_client.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/minor/governance.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin/base.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin/orin.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin/spark.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin/thor.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/gateway-only.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/machine-as-brain.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/orin-associate.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/orin-cortex.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/orin-embed.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/orin-lobe.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/orin-small.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/spark-innereye.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/spark-lobe.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/thor-lobe.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/thor-muse.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/builtin_shapes/thor-worker.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/loader.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/render.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/schema.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/shape_render.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/profiles/shapes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/__main__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_conversation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_floor.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_pcm.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_readiness.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_segmenter.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_sentences.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_session.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_settings.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_speculation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_timings.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_tts_text.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_turn.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_vocalize.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/_wire.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/app.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/audio_facade.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/bluetts_server.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/chatterbox_multilingual_server.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/chatterbox_server.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/protocol.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/realtime/tts_client.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/roles.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/roles_measure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_buildability.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_compose.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_detect.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_env.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_health.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_lock.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_parser.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_pressure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/runtime/_tunnel.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/cf-tunnel.env.example +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/docker-compose.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/env.example +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.bluetts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.chatterbox +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.chatterbox-ml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.comfyui +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.embed-st +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.gateway +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.parakeet +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.realtime +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.vllm-gemma4 +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/Dockerfile.whisper-stt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/_readiness.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/docker-compose.audio-he.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/docker-compose.audio.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/docker-compose.embed.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/docker-compose.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/env.audio-he.example +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/env.audio.example +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/env.example +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/listen_server.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/fleet/qwen3_reranker.jinja +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/templates/mg-logwrap.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/variation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/variation_catalog.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/vllm_plugins/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/lobes/vllm_plugins/qwen3_thinking_tool_parser.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/packaging/model-gear/README.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/packaging/model-gear/pyproject.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/accept-by-proxy.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/accept-shape.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/audio-smoke.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/concurrency-probe.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/embed_h2h/README.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/embed_h2h/build_corpus.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/embed_h2h/build_queries.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/embed_h2h/corpus.jsonl +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/embed_h2h/h2h.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/embed_h2h/prompts.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/embed_h2h/queries.jsonl +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/gen-api-key.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/live-check.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/prefill-depth-curve.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/probe_reranker_calibration.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/realtime-he-accept.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/realtime-smoke.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/realtime-voice-loop.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/scan_deployment_secrets.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/spec-arms.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/spike-preflight.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/stream-measure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/scripts/validate-tiers.sh +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/.env.example +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/.gitignore +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/.nvmrc +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/README.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/astro.config.mjs +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/package-lock.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/package.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/proxy/gateway-proxy.mjs +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/public/favicon.svg +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/public/worklets/pcm-capture-processor.js +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/components/ConnectionPanel.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/components/ConversationView.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/components/EventStream.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/components/Footer.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/components/Header.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/components/MicIsland.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/components/SignalMesh.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/layouts/Layout.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/pages/dev-connection.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/pages/dev-events.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/pages/dev-mic.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/pages/index.astro +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/audio-graph.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/audio-playback.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/audio-playback.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/audio-test-doubles.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/connection-panel.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/conversation-view.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/demo-tools.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/dev-mic-harness.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/event-fixtures.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/event-icons.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/event-log.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/event-log.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/mic-capture.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/mic-capture.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/mic-island.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/mic-island.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/no-mic-mute.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/pcm-wire.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/pcm-wire.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/realtime-connection.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/scripts/realtime-events.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/src/styles/global.css +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/test/connection-panel.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/test/conversation-view.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/test/demo-tools.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/test/gateway-proxy.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/test/realtime-connection.test.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/tsconfig.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/site/vitest.config.ts +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/sonar-project.properties +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/conftest.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card/Dockerfile.gateway +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card/VARIATION.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card/deployment.lock.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card/docker-compose.override.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card/docker-compose.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card__fixture-shape/VARIATION.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card__fixture-shape/deployment.lock.toml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card__fixture-shape/docker-compose.override.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card__fixture-shape/docker-compose.shape.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/deployments/fixture-card__fixture-shape/docker-compose.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/upgrade_compat/README.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/upgrade_compat/fleet/docker-compose.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/upgrade_compat/fleet/env.example +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/upgrade_compat/single/docker-compose.yml +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/fixtures/upgrade_compat/single/env.example +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/README.md +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/__init__.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/no-pool-gateway.json +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/overlays/audio-he-defaults.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/regen.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/gateway-only__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/gateway-only__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/gateway-only__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/gateway-only__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-associate__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-associate__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-associate__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-associate__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-cortex__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-cortex__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-cortex__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-cortex__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-embed__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-embed__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-embed__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-embed__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-lobe__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-lobe__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-lobe__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-lobe__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-small__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-small__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-small__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/orin-small__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/spark-innereye__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/spark-innereye__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/spark-innereye__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/spark-innereye__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/spark-lobe__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/spark-lobe__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/spark-lobe__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/spark-lobe__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-lobe__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-lobe__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-lobe__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-lobe__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-muse__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-muse__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-muse__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-muse__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-worker__base.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-worker__orin.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-worker__spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/shapes/thor-worker__thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/spark.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/switch-plans.txt +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/template-defaults.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/goldens/thor.env +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_assess.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_assess_perf.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_associate_compose.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_associate_exposure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_associate_gateway_boundaries.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_associate_role.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_audio_he_compose_chain.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_audio_he_goldens.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_audio_he_stt_compose.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_audio_he_tts_compose.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_bench_compare.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_bench_report.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_benchmark_all_lobes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_bluetts_dockerfile.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_bluetts_server.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_boundary_serves_only.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_buildability_guard.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_calibration_knee.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_capabilities_member_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cat_probe.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cat_score.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_catalog.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_catalog_embed_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_catalog_tiers.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_chatterbox_ml_dockerfile.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_chatterbox_multilingual_server.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_chatterbox_pcm16.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_chatterbox_readiness.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_benchmark_profiles.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_calibrate.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_capabilities.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_capabilities_replicas.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_eval.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_eval_cat.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_fleet.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_gateway_auth.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_introspection.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_logs.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_measure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_mesh.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_route.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_run.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_runtime.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_tunnel.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_up.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_up_replace.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_cli_wiring.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_client_reasoning_roundtrip.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_colleague_contract.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_comfyui_compose.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_comfyui_dockerfile.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_comfyui_volumes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_compose_chain.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_deployment_lock.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_deployment_lock_doc.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_detect.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_doctor.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_doctor_audio_he.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_doctor_fix.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_doctor_machine_profile.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_doctor_mesh_retirement.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_doctor_passthrough.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_doctor_repin_version.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_doctor_role_command.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_doctor_role_probe.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_dropped_lobe_honesty.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_embed_finetune.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_embed_h2h.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_embed_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_embed_lanes_import.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_embed_overlay.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_embed_sidecar.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_fleet_audio_vad_env.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_fleet_compose_mounts.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_fleet_minor.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_fleet_per_machine_knobs.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_fleet_secrets_env_file.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_fleet_template_gateway_env.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_audio_peer.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_audio_routing.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_auth.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_auth_rejection_log.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_busy_e2e.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_capabilities.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_config_proxy.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_config_replicas.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_config_wiring.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_embed_deep.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_embed_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_env_passthrough_guard.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_feasibility.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_fleet_doc.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_force_strict.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_get_relay.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_hand_adapters.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_member_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_no_lifecycle_actuator.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_peer_advert.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_peer_only_pool.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_pool.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_pool_capacity_wiring.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_pool_pressure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_pool_saturation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_proxy.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_readiness.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_realtime_ws.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_render_facade.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_replicas.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_routing.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_selection.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_serve_mesh_wiring.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_server.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_status.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_stream_termination.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gateway_tiers.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gemma4_compose.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gemma4_dockerfile.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gen_api_key.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_gitignore_convention.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_init.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_init_audio_he.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_init_coresidency.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_init_from_lock.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_init_gpu_access.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_init_profile.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_init_shape.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_innereye_ui_port.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_live_capabilities.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_lobes_compose_wrapper.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_lock_drift.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_machines.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_config.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_flap_per_name.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_heartbeat_live.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_member_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_naming.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_roster.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_routes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_routing.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_routing_wiring.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_templates.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_verify_reason.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_mesh_wire.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_minor_client.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_minor_governance.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_minor_integration.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_minor_logprobs.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_nightly_migration_doc.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_no_config_byte_identity.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_orin_associate_boot_order.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_orin_associate_shape.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_orin_cortex_shape.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_orin_embed_shape.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_orin_gateway_read_timeout.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_orin_lobe_shape.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_overview_live.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_parser.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_peer_referral.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_preserve_thinking_diagnostic.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_pressure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_pressure_policy.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_profile_goldens.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_profile_render.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_profile_schema.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_profiles.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_proxy_integration.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_readiness_peer_probe.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_app_stream_structure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_audio_env_coverage.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_audio_facade.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_continuation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_conversation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_conversation_stream.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_floor.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_floor_segments.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_generate_failure_surfacing.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_generate_stream_settings.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_he_accept_helpers.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_imports.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_parallel_tool_calls.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_pcm.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_protocol.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_readiness.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_segmenter.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_segmenter_eager.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_segmenter_level_gate.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_sentences.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_session.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_settings.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_smoke_helpers.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_speculation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_stt_forward.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_timings.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_tts_gate.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_tts_text.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_turn.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_turn_stream.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_vocalize.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_realtime_wire.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_role_probes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_roles.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_roles_audio_advert.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_roles_audio_language.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_roles_proxied.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_roles_replicas.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_routing_models_member_lanes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_scan_deployment_secrets.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_senses_speculative_config.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_shape_budgets.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_shape_contract_matrix.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_shape_gateway_only.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_shape_goldens.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_shapes.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_smoke_duo.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_spec_arms.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_spike_preflight.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_status_fleet.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_status_pressure.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_switch_bf16.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_switch_plan_goldens.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_templates_preserve_thinking.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_tier_request.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_tool_parser_plugin.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_tts_client_hebrew_diacritizer.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_tts_pause_and_truncation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_up_no_deps_isolation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_upgrade_compat.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_variation.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_variation_catalog.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_vllm_plugin_thinking.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_wheel_excludes_deployments.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_whisper_stt_dockerfile.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_worker_compose.py +0 -0
- {lobes_cli-0.84.3 → lobes_cli-0.85.0}/tests/test_worker_recipe_knobs.py +0 -0
|
@@ -4,6 +4,17 @@ All notable changes to this project are documented here. The format is based on
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
|
|
5
5
|
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.85.0] - 2026-10-09
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Hebrew STT (`listen_server_whisper.py`) accepts any ffmpeg-decodable upload — m4a, mp3, ogg/opus, webm, flac, non-16-bit WAV — instead of refusing everything but 16-bit PCM WAV with `invalid_wav`; an undecodable upload is a 400 `invalid_audio`.
|
|
12
|
+
- Hebrew STT chunks uploads longer than the 30 s Whisper window at the quietest point near each window end and joins the pieces, instead of refusing them; `STT_MAX_AUDIO_SECONDS` (default 600) caps the total.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- Hebrew STT decodes up to 440 new tokens per window (was 128), so a full 30 s window of dense speech is not truncated.
|
|
17
|
+
|
|
7
18
|
## [0.84.3] - 2026-10-07
|
|
8
19
|
|
|
9
20
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: lobes-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.85.0
|
|
4
4
|
Summary: lobes — run, assess, and switch the local vLLM model.
|
|
5
5
|
Project-URL: Homepage, https://github.com/agentculture/lobes-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/agentculture/lobes-cli/issues
|
|
@@ -42,6 +42,26 @@ Evidence: `docs/evidence/2026-09-hebrew-*.txt` (seven files) and
|
|
|
42
42
|
- **An NVFP4A16 export of Gemma 4 12B damaged Hebrew** where bf16 and Google's
|
|
43
43
|
QAT checkpoint did not. Check Hebrew output before promoting a quantization.
|
|
44
44
|
|
|
45
|
+
### Batch transcription: formats and long clips
|
|
46
|
+
|
|
47
|
+
`POST /v1/audio/transcriptions` takes any format the image's ffmpeg decodes —
|
|
48
|
+
m4a/aac, mp3, ogg/opus, webm, flac, and WAV at any bit depth — not only 16-bit
|
|
49
|
+
PCM WAV. A 16-bit RIFF/WAVE upload (the realtime bridge's own turn audio) is
|
|
50
|
+
still read directly and never touches ffmpeg; anything else is transcoded to
|
|
51
|
+
16 kHz mono PCM16 first, and an undecodable upload is a 400 `invalid_audio`.
|
|
52
|
+
|
|
53
|
+
An upload longer than Whisper's 30 s window is **chunked**, not refused: each
|
|
54
|
+
cut goes at the quietest 20 ms frame in the last 5 s of its window, every
|
|
55
|
+
window passes the `STT_MIN_AVG_LOGPROB` gate on its own, and the non-empty
|
|
56
|
+
pieces are joined with a space. `STT_MAX_AUDIO_SECONDS` (default 600) caps the
|
|
57
|
+
total; past it the reply is a 413 `clip_too_long`. The upload byte cap
|
|
58
|
+
(`STT_MAX_UPLOAD_BYTES`, 16 MiB) still applies first, so ten minutes of
|
|
59
|
+
uncompressed 16 kHz WAV (~19 MB) needs it raised; a compressed voice note does
|
|
60
|
+
not. MEASURED on the DGX Spark, 2026-10-09, with synthetic BlueTTS speech: an
|
|
61
|
+
80 s m4a was transcribed in 3 windows in 3.9 s with every sentence intact at
|
|
62
|
+
the seams; mp3, ogg/opus, webm, 24-bit WAV and m4a single sentences each came
|
|
63
|
+
back verbatim. A real microphone recording is still UNVALIDATED (#108).
|
|
64
|
+
|
|
45
65
|
## Latency: what was built, and what it bought
|
|
46
66
|
|
|
47
67
|
Measured live, a human on a reSpeaker XVF3800, from the moment the server
|
|
@@ -14,7 +14,8 @@ GiB peak CUDA, ~0.14s per 9.35s clip, transformers 5.12.1 / torch
|
|
|
14
14
|
from ``Dockerfile.parakeet``.
|
|
15
15
|
|
|
16
16
|
Endpoints:
|
|
17
|
-
POST /v1/audio/transcriptions - Transcribe an uploaded WAV
|
|
17
|
+
POST /v1/audio/transcriptions - Transcribe an uploaded audio file (WAV read
|
|
18
|
+
directly; m4a/mp3/ogg/webm/flac via ffmpeg)
|
|
18
19
|
GET /v1/health/ready - Readiness (model loaded + CUDA live +
|
|
19
20
|
a warm-up transcription succeeded)
|
|
20
21
|
|
|
@@ -53,14 +54,22 @@ logging.basicConfig(level=logging.INFO)
|
|
|
53
54
|
logger = logging.getLogger(__name__)
|
|
54
55
|
|
|
55
56
|
SAMPLE_RATE = 16000
|
|
56
|
-
# Whisper's attention window is 30s
|
|
57
|
-
#
|
|
58
|
-
#
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
57
|
+
# Whisper's attention window is 30s. A longer upload (a phone voice note, a
|
|
58
|
+
# recording) is CHUNKED into windows of at most this length and the pieces are
|
|
59
|
+
# joined. Each cut is placed at the quietest frame in the last
|
|
60
|
+
# CHUNK_SEARCH_SECONDS of its window (see plan_chunks), so a seam rarely lands
|
|
61
|
+
# mid-word — the boundary artefacts that made earlier versions refuse instead.
|
|
62
|
+
# The realtime bridge never sends more than one window (its VAD_MAX_TURN_MS
|
|
63
|
+
# defaults to 30000ms), so its turns still take the single-window path.
|
|
63
64
|
MAX_CLIP_SECONDS = 30.0
|
|
65
|
+
CHUNK_SEARCH_SECONDS = 5.0
|
|
66
|
+
CHUNK_FRAME_MS = 20
|
|
67
|
+
# Total-length cap across all chunks (STT_MAX_AUDIO_SECONDS), so one upload
|
|
68
|
+
# cannot hold the GPU for an unbounded number of windows.
|
|
69
|
+
DEFAULT_MAX_AUDIO_SECONDS = 600.0
|
|
70
|
+
# Whisper's decoder holds 448 positions; the language/task prompt takes 4.
|
|
71
|
+
# A full 30s window of dense speech can exceed the old 128-token budget.
|
|
72
|
+
MAX_NEW_TOKENS = 440
|
|
64
73
|
MODEL_NAME = os.environ.get("STT_MODEL", "ivrit-ai/whisper-large-v3-turbo")
|
|
65
74
|
DEFAULT_LANGUAGE = "he"
|
|
66
75
|
|
|
@@ -233,21 +242,37 @@ def linear_resample(samples: Sequence[float], src_rate: int, dst_rate: int) -> l
|
|
|
233
242
|
return out
|
|
234
243
|
|
|
235
244
|
|
|
245
|
+
def parse_max_audio_seconds(raw: str | None) -> float:
|
|
246
|
+
"""``STT_MAX_AUDIO_SECONDS``: a positive number of seconds; empty/unset or
|
|
247
|
+
an unparseable/non-positive value falls back to the default (a typo must
|
|
248
|
+
not silently disable the cap)."""
|
|
249
|
+
if raw is None or not raw.strip():
|
|
250
|
+
return DEFAULT_MAX_AUDIO_SECONDS
|
|
251
|
+
try:
|
|
252
|
+
parsed = float(raw.strip())
|
|
253
|
+
except ValueError:
|
|
254
|
+
return DEFAULT_MAX_AUDIO_SECONDS
|
|
255
|
+
return parsed if parsed > 0 and math.isfinite(parsed) else DEFAULT_MAX_AUDIO_SECONDS
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
MAX_AUDIO_SECONDS = parse_max_audio_seconds(os.environ.get("STT_MAX_AUDIO_SECONDS"))
|
|
259
|
+
|
|
260
|
+
|
|
236
261
|
def _clip_too_long_message(duration: float, max_seconds: float) -> str:
|
|
237
262
|
"""Shared wording for a refused clip, whichever check found it too long
|
|
238
263
|
(the post-decode sample-count check, or the pre-decode WAV-header peek)."""
|
|
239
264
|
return (
|
|
240
265
|
f"clip too long: {duration:.1f}s exceeds the {max_seconds:.0f}s "
|
|
241
|
-
"
|
|
266
|
+
"total-audio cap (STT_MAX_AUDIO_SECONDS)"
|
|
242
267
|
)
|
|
243
268
|
|
|
244
269
|
|
|
245
270
|
def validate_clip_duration(
|
|
246
|
-
num_samples: int, sample_rate: int, max_seconds: float =
|
|
271
|
+
num_samples: int, sample_rate: int, max_seconds: float = DEFAULT_MAX_AUDIO_SECONDS
|
|
247
272
|
) -> Optional[str]:
|
|
248
|
-
"""Return an error message iff the clip exceeds *max_seconds
|
|
249
|
-
|
|
250
|
-
|
|
273
|
+
"""Return an error message iff the clip exceeds *max_seconds* (the
|
|
274
|
+
total-audio cap — longer than one Whisper window is chunked, not refused),
|
|
275
|
+
else ``None``."""
|
|
251
276
|
if sample_rate <= 0:
|
|
252
277
|
return "invalid sample rate"
|
|
253
278
|
duration = num_samples / sample_rate
|
|
@@ -316,6 +341,130 @@ def peek_wav_duration_seconds(raw_bytes: bytes) -> Optional[float]:
|
|
|
316
341
|
return frames / rate
|
|
317
342
|
|
|
318
343
|
|
|
344
|
+
def is_riff_wave(raw_bytes: bytes) -> bool:
|
|
345
|
+
"""True when *raw_bytes* carries a RIFF/WAVE header — the only container
|
|
346
|
+
:func:`decode_wav_pcm16` reads directly."""
|
|
347
|
+
return len(raw_bytes) >= 12 and raw_bytes[:4] == b"RIFF" and raw_bytes[8:12] == b"WAVE"
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
# Bounded so a pathological upload cannot hold a request thread forever.
|
|
351
|
+
FFMPEG_TIMEOUT_SECONDS = 60
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def ffmpeg_transcode_command(src: str, dst: str, max_seconds: float) -> list[str]:
|
|
355
|
+
"""The ffmpeg argv that turns any decodable audio (m4a/aac, mp3, ogg/opus,
|
|
356
|
+
webm, flac, a non-16-bit WAV, ...) into 16 kHz mono PCM16 WAV.
|
|
357
|
+
|
|
358
|
+
Input and output are both FILES, not pipes: an m4a whose ``moov`` atom
|
|
359
|
+
sits at the end (the usual phone voice-note layout) cannot be demuxed from
|
|
360
|
+
a non-seekable stdin, and a WAV written to a pipe carries a placeholder
|
|
361
|
+
frame count that :func:`peek_wav_duration_seconds` would misread. ``-t``
|
|
362
|
+
stops decoding one second past the clip cap, so an over-long upload is
|
|
363
|
+
still refused as ``clip_too_long`` without decoding all of it."""
|
|
364
|
+
return [
|
|
365
|
+
"ffmpeg",
|
|
366
|
+
"-nostdin",
|
|
367
|
+
"-hide_banner",
|
|
368
|
+
"-loglevel",
|
|
369
|
+
"error",
|
|
370
|
+
"-y",
|
|
371
|
+
"-i",
|
|
372
|
+
src,
|
|
373
|
+
"-t",
|
|
374
|
+
str(max_seconds + 1),
|
|
375
|
+
"-vn",
|
|
376
|
+
"-ac",
|
|
377
|
+
"1",
|
|
378
|
+
"-ar",
|
|
379
|
+
str(SAMPLE_RATE),
|
|
380
|
+
"-c:a",
|
|
381
|
+
"pcm_s16le",
|
|
382
|
+
"-f",
|
|
383
|
+
"wav",
|
|
384
|
+
dst,
|
|
385
|
+
]
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def transcode_to_wav(
|
|
389
|
+
raw_bytes: bytes, max_seconds: float = MAX_AUDIO_SECONDS, runner=None
|
|
390
|
+
) -> bytes:
|
|
391
|
+
"""Transcode a non-WAV upload to PCM16 WAV with the image's ffmpeg.
|
|
392
|
+
|
|
393
|
+
Raises :class:`ValueError` with ffmpeg's own message when the bytes are
|
|
394
|
+
not decodable audio. *runner* defaults to :func:`subprocess.run` and is
|
|
395
|
+
injectable so the offline suite needs no ffmpeg binary."""
|
|
396
|
+
import subprocess # nosec B404 - fixed argv, no shell
|
|
397
|
+
import tempfile
|
|
398
|
+
|
|
399
|
+
run = runner or subprocess.run
|
|
400
|
+
with tempfile.TemporaryDirectory(prefix="stt-") as tmp:
|
|
401
|
+
src = os.path.join(tmp, "in")
|
|
402
|
+
dst = os.path.join(tmp, "out.wav")
|
|
403
|
+
with open(src, "wb") as fh:
|
|
404
|
+
fh.write(raw_bytes)
|
|
405
|
+
try:
|
|
406
|
+
proc = run(
|
|
407
|
+
ffmpeg_transcode_command(src, dst, max_seconds),
|
|
408
|
+
capture_output=True,
|
|
409
|
+
timeout=FFMPEG_TIMEOUT_SECONDS,
|
|
410
|
+
check=False,
|
|
411
|
+
)
|
|
412
|
+
except FileNotFoundError as exc:
|
|
413
|
+
raise ValueError("audio is not WAV and ffmpeg is not installed") from exc
|
|
414
|
+
except subprocess.TimeoutExpired as exc:
|
|
415
|
+
raise ValueError(f"audio decode timed out after {FFMPEG_TIMEOUT_SECONDS}s") from exc
|
|
416
|
+
if proc.returncode != 0 or not os.path.exists(dst):
|
|
417
|
+
detail = (proc.stderr or b"").decode("utf-8", "replace").strip().splitlines()
|
|
418
|
+
reason = detail[-1] if detail else f"ffmpeg exited {proc.returncode}"
|
|
419
|
+
raise ValueError(f"could not decode audio: {reason}")
|
|
420
|
+
with open(dst, "rb") as fh:
|
|
421
|
+
return fh.read()
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
def _frame_energy(samples: Sequence[float], start: int, length: int) -> float:
|
|
425
|
+
return sum(x * x for x in samples[start : start + length])
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
def plan_chunks(
|
|
429
|
+
samples: Sequence[float],
|
|
430
|
+
sample_rate: int,
|
|
431
|
+
window_seconds: float = MAX_CLIP_SECONDS,
|
|
432
|
+
search_seconds: float = CHUNK_SEARCH_SECONDS,
|
|
433
|
+
frame_ms: int = CHUNK_FRAME_MS,
|
|
434
|
+
) -> list[tuple[int, int]]:
|
|
435
|
+
"""Split *samples* into contiguous ``(start, end)`` ranges no longer than
|
|
436
|
+
*window_seconds*, covering every sample exactly once.
|
|
437
|
+
|
|
438
|
+
A clip that fits one window is one range. Otherwise each cut goes at the
|
|
439
|
+
middle of the lowest-energy *frame_ms* frame in the last *search_seconds*
|
|
440
|
+
of the window — the likeliest pause — so a word is rarely split."""
|
|
441
|
+
n = len(samples)
|
|
442
|
+
window = max(1, int(window_seconds * sample_rate))
|
|
443
|
+
if n <= window:
|
|
444
|
+
return [(0, n)]
|
|
445
|
+
frame = max(1, int(sample_rate * frame_ms / 1000))
|
|
446
|
+
search = max(frame, min(window, int(search_seconds * sample_rate)))
|
|
447
|
+
chunks: list[tuple[int, int]] = []
|
|
448
|
+
start = 0
|
|
449
|
+
while n - start > window:
|
|
450
|
+
lo = start + window - search
|
|
451
|
+
best_at, best_energy = start + window, None
|
|
452
|
+
for f in range(lo, start + window - frame + 1, frame):
|
|
453
|
+
energy = _frame_energy(samples, f, frame)
|
|
454
|
+
if best_energy is None or energy < best_energy:
|
|
455
|
+
best_at, best_energy = f + frame // 2, energy
|
|
456
|
+
chunks.append((start, best_at))
|
|
457
|
+
start = best_at
|
|
458
|
+
chunks.append((start, n))
|
|
459
|
+
return chunks
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def join_chunk_texts(texts: Sequence[str]) -> str:
|
|
463
|
+
"""Join per-chunk transcripts, skipping the empty ones a chunk of silence
|
|
464
|
+
(or a dropped low-confidence chunk) leaves."""
|
|
465
|
+
return " ".join(t for t in (x.strip() for x in texts) if t)
|
|
466
|
+
|
|
467
|
+
|
|
319
468
|
def build_success_response(text: str) -> dict:
|
|
320
469
|
"""Same top-level shape as ``listen_server.py``'s ``return {"text": text}``."""
|
|
321
470
|
return {"text": text}
|
|
@@ -446,8 +595,9 @@ if _FASTAPI_AVAILABLE:
|
|
|
446
595
|
file: UploadFile = File(...),
|
|
447
596
|
language: str = Form(None),
|
|
448
597
|
):
|
|
449
|
-
"""Transcribe an uploaded
|
|
450
|
-
|
|
598
|
+
"""Transcribe an uploaded audio file. PCM16 WAV (the realtime bridge's
|
|
599
|
+
own output shape) is read directly; anything else is transcoded to
|
|
600
|
+
16 kHz mono PCM16 by the image's ffmpeg first. See the module docstring for the
|
|
451
601
|
channel/resample/duration-limit contract."""
|
|
452
602
|
content = await file.read()
|
|
453
603
|
|
|
@@ -457,23 +607,43 @@ if _FASTAPI_AVAILABLE:
|
|
|
457
607
|
status_code=413, content=build_error_body(size_error, "upload_too_large")
|
|
458
608
|
)
|
|
459
609
|
|
|
610
|
+
if not is_riff_wave(content):
|
|
611
|
+
# m4a / mp3 / ogg / webm / flac: normalise to PCM16 WAV first.
|
|
612
|
+
import anyio
|
|
613
|
+
|
|
614
|
+
try:
|
|
615
|
+
content = await anyio.to_thread.run_sync(transcode_to_wav, content)
|
|
616
|
+
except ValueError as exc:
|
|
617
|
+
return JSONResponse(
|
|
618
|
+
status_code=400, content=build_error_body(str(exc), "invalid_audio")
|
|
619
|
+
)
|
|
620
|
+
|
|
460
621
|
header_duration = peek_wav_duration_seconds(content)
|
|
461
|
-
if header_duration is not None and header_duration >
|
|
622
|
+
if header_duration is not None and header_duration > MAX_AUDIO_SECONDS:
|
|
462
623
|
return JSONResponse(
|
|
463
624
|
status_code=413,
|
|
464
625
|
content=build_error_body(
|
|
465
|
-
_clip_too_long_message(header_duration,
|
|
626
|
+
_clip_too_long_message(header_duration, MAX_AUDIO_SECONDS), "clip_too_long"
|
|
466
627
|
),
|
|
467
628
|
)
|
|
468
629
|
|
|
469
630
|
try:
|
|
470
631
|
samples, sample_rate, channels = decode_wav_pcm16(content)
|
|
471
|
-
except (ValueError, wave.Error)
|
|
472
|
-
|
|
632
|
+
except (ValueError, wave.Error):
|
|
633
|
+
# A RIFF/WAVE the stdlib reader refuses (24-bit, float, ...): ffmpeg reads it.
|
|
634
|
+
import anyio
|
|
635
|
+
|
|
636
|
+
try:
|
|
637
|
+
content = await anyio.to_thread.run_sync(transcode_to_wav, content)
|
|
638
|
+
samples, sample_rate, channels = decode_wav_pcm16(content)
|
|
639
|
+
except (ValueError, wave.Error) as exc:
|
|
640
|
+
return JSONResponse(
|
|
641
|
+
status_code=400, content=build_error_body(str(exc), "invalid_wav")
|
|
642
|
+
)
|
|
473
643
|
|
|
474
644
|
samples = first_channel(samples, channels)
|
|
475
645
|
|
|
476
|
-
duration_error = validate_clip_duration(len(samples), sample_rate)
|
|
646
|
+
duration_error = validate_clip_duration(len(samples), sample_rate, MAX_AUDIO_SECONDS)
|
|
477
647
|
if duration_error is not None:
|
|
478
648
|
return JSONResponse(
|
|
479
649
|
status_code=413, content=build_error_body(duration_error, "clip_too_long")
|
|
@@ -496,39 +666,49 @@ if _FASTAPI_AVAILABLE:
|
|
|
496
666
|
lang = resolve_language(language, os.environ.get("STT_LANGUAGE"), DEFAULT_LANGUAGE)
|
|
497
667
|
|
|
498
668
|
model, processor = get_model_and_processor()
|
|
499
|
-
audio = np.array(floats, dtype=np.float32)
|
|
500
|
-
inputs = processor(audio, sampling_rate=SAMPLE_RATE, return_tensors="pt")
|
|
501
|
-
input_features = inputs.input_features.to("cuda", dtype=torch.float16)
|
|
502
|
-
with torch.no_grad():
|
|
503
|
-
out = model.generate(
|
|
504
|
-
input_features,
|
|
505
|
-
language=lang,
|
|
506
|
-
task="transcribe",
|
|
507
|
-
max_new_tokens=128,
|
|
508
|
-
return_dict_in_generate=True,
|
|
509
|
-
output_scores=True,
|
|
510
|
-
)
|
|
511
|
-
n_new = len(out.scores)
|
|
512
|
-
new_ids = out.sequences[0][-n_new:] if n_new else out.sequences[0][:0]
|
|
513
669
|
eot = processor.tokenizer.convert_tokens_to_ids("<|endoftext|>")
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
670
|
+
|
|
671
|
+
def transcribe_window(window: Sequence[float]) -> str:
|
|
672
|
+
audio = np.array(window, dtype=np.float32)
|
|
673
|
+
inputs = processor(audio, sampling_rate=SAMPLE_RATE, return_tensors="pt")
|
|
674
|
+
input_features = inputs.input_features.to("cuda", dtype=torch.float16)
|
|
675
|
+
with torch.no_grad():
|
|
676
|
+
out = model.generate(
|
|
677
|
+
input_features,
|
|
678
|
+
language=lang,
|
|
679
|
+
task="transcribe",
|
|
680
|
+
max_new_tokens=MAX_NEW_TOKENS,
|
|
681
|
+
return_dict_in_generate=True,
|
|
682
|
+
output_scores=True,
|
|
683
|
+
)
|
|
684
|
+
n_new = len(out.scores)
|
|
685
|
+
new_ids = out.sequences[0][-n_new:] if n_new else out.sequences[0][:0]
|
|
686
|
+
token_logprobs = [
|
|
687
|
+
torch.log_softmax(step[0].float(), dim=-1)[tok].item()
|
|
688
|
+
for step, tok in zip(out.scores, new_ids)
|
|
689
|
+
if tok.item() < eot # text tokens only — specials sit at/after <|endoftext|>
|
|
690
|
+
]
|
|
691
|
+
text = processor.batch_decode(out.sequences, skip_special_tokens=True)[0]
|
|
692
|
+
# Whisper's decode leaves a leading space (measured live: ' מה מזג ...');
|
|
693
|
+
# listen_server.py's callers never see one, so strip before filtering.
|
|
694
|
+
text = filter_non_speech_only(strip_bidi_controls(text).strip())
|
|
695
|
+
confidence = average_logprob(token_logprobs)
|
|
696
|
+
# Gated per window: one hallucinated silent window is dropped on
|
|
697
|
+
# its own instead of poisoning (or rescuing) its neighbours.
|
|
698
|
+
if text and is_low_confidence(confidence, MIN_AVG_LOGPROB):
|
|
699
|
+
logger.info(
|
|
700
|
+
"dropping low-confidence transcript (avg_logprob %.2f < %.2f): %r",
|
|
701
|
+
confidence,
|
|
702
|
+
MIN_AVG_LOGPROB,
|
|
703
|
+
text,
|
|
704
|
+
)
|
|
705
|
+
text = ""
|
|
706
|
+
return text
|
|
707
|
+
|
|
708
|
+
chunks = plan_chunks(floats, SAMPLE_RATE)
|
|
709
|
+
if len(chunks) > 1:
|
|
710
|
+
logger.info("transcribing %.1fs in %d windows", len(floats) / SAMPLE_RATE, len(chunks))
|
|
711
|
+
text = join_chunk_texts([transcribe_window(floats[a:b]) for a, b in chunks])
|
|
532
712
|
|
|
533
713
|
return build_success_response(text)
|
|
534
714
|
|
|
@@ -223,16 +223,21 @@ class TestLinearResample:
|
|
|
223
223
|
|
|
224
224
|
class TestValidateClipDuration:
|
|
225
225
|
def test_under_limit_is_ok(self, lsw) -> None:
|
|
226
|
-
assert lsw.validate_clip_duration(16000 * 29, 16000) is None
|
|
226
|
+
assert lsw.validate_clip_duration(16000 * 29, 16000, 30) is None
|
|
227
227
|
|
|
228
228
|
def test_exactly_at_limit_is_ok(self, lsw) -> None:
|
|
229
|
-
assert lsw.validate_clip_duration(16000 * 30, 16000) is None
|
|
229
|
+
assert lsw.validate_clip_duration(16000 * 30, 16000, 30) is None
|
|
230
230
|
|
|
231
231
|
def test_over_limit_is_refused(self, lsw) -> None:
|
|
232
|
-
msg = lsw.validate_clip_duration(16000 * 31, 16000)
|
|
232
|
+
msg = lsw.validate_clip_duration(16000 * 31, 16000, 30)
|
|
233
233
|
assert msg is not None
|
|
234
234
|
assert "30" in msg
|
|
235
235
|
|
|
236
|
+
def test_longer_than_one_window_is_not_refused_by_default(self, lsw) -> None:
|
|
237
|
+
# Past one Whisper window is chunked now; only the total cap refuses.
|
|
238
|
+
assert lsw.validate_clip_duration(16000 * 31, 16000) is None
|
|
239
|
+
assert lsw.validate_clip_duration(16000 * 601, 16000) is not None
|
|
240
|
+
|
|
236
241
|
def test_zero_sample_rate_is_refused(self, lsw) -> None:
|
|
237
242
|
assert lsw.validate_clip_duration(100, 0) is not None
|
|
238
243
|
|
|
@@ -405,3 +410,135 @@ class TestConfidenceGate:
|
|
|
405
410
|
assert lsw.parse_min_avg_logprob("-0,35") == lsw.DEFAULT_MIN_AVG_LOGPROB
|
|
406
411
|
assert lsw.parse_min_avg_logprob(None) == lsw.DEFAULT_MIN_AVG_LOGPROB
|
|
407
412
|
assert lsw.parse_min_avg_logprob("-0.5") == -0.5
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
# --------------------------------------------------------------------------
|
|
416
|
+
# Non-WAV uploads (m4a, mp3, ogg, webm, ...) are transcoded by the image's
|
|
417
|
+
# ffmpeg; a RIFF/WAVE upload never touches it.
|
|
418
|
+
# --------------------------------------------------------------------------
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
class TestIsRiffWave:
|
|
422
|
+
def test_wav_is_detected(self, lsw) -> None:
|
|
423
|
+
assert lsw.is_riff_wave(_make_wav_bytes([0, 1, 2]))
|
|
424
|
+
|
|
425
|
+
def test_m4a_is_not_wav(self, lsw) -> None:
|
|
426
|
+
assert not lsw.is_riff_wave(b"\x00\x00\x00\x20ftypM4A \x00\x00\x00\x00")
|
|
427
|
+
|
|
428
|
+
def test_short_or_empty_is_not_wav(self, lsw) -> None:
|
|
429
|
+
assert not lsw.is_riff_wave(b"")
|
|
430
|
+
assert not lsw.is_riff_wave(b"RIFF")
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
class TestFfmpegTranscodeCommand:
|
|
434
|
+
def test_targets_16k_mono_pcm16_wav_file(self, lsw) -> None:
|
|
435
|
+
cmd = lsw.ffmpeg_transcode_command("/t/in", "/t/out.wav", 600)
|
|
436
|
+
assert cmd[0] == "ffmpeg"
|
|
437
|
+
assert cmd[cmd.index("-i") + 1] == "/t/in"
|
|
438
|
+
assert cmd[cmd.index("-ac") + 1] == "1"
|
|
439
|
+
assert cmd[cmd.index("-ar") + 1] == "16000"
|
|
440
|
+
assert cmd[cmd.index("-c:a") + 1] == "pcm_s16le"
|
|
441
|
+
assert cmd[-1] == "/t/out.wav" # a seekable FILE, never pipe:1
|
|
442
|
+
|
|
443
|
+
def test_decode_stops_one_second_past_the_cap(self, lsw) -> None:
|
|
444
|
+
cmd = lsw.ffmpeg_transcode_command("/t/in", "/t/out.wav", 600)
|
|
445
|
+
assert float(cmd[cmd.index("-t") + 1]) == pytest.approx(601)
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
class _FakeProc:
|
|
449
|
+
def __init__(self, returncode: int, stderr: bytes = b"") -> None:
|
|
450
|
+
self.returncode = returncode
|
|
451
|
+
self.stderr = stderr
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
class TestTranscodeToWav:
|
|
455
|
+
def test_success_returns_ffmpegs_output_file(self, lsw) -> None:
|
|
456
|
+
wav = _make_wav_bytes([5, -5, 7])
|
|
457
|
+
seen = {}
|
|
458
|
+
|
|
459
|
+
def runner(cmd, **kwargs):
|
|
460
|
+
src, dst = cmd[cmd.index("-i") + 1], cmd[-1]
|
|
461
|
+
seen["input"] = Path(src).read_bytes()
|
|
462
|
+
seen["timeout"] = kwargs.get("timeout")
|
|
463
|
+
Path(dst).write_bytes(wav)
|
|
464
|
+
return _FakeProc(0)
|
|
465
|
+
|
|
466
|
+
assert lsw.transcode_to_wav(b"m4a-bytes", runner=runner) == wav
|
|
467
|
+
assert seen["input"] == b"m4a-bytes"
|
|
468
|
+
assert seen["timeout"] == lsw.FFMPEG_TIMEOUT_SECONDS
|
|
469
|
+
|
|
470
|
+
def test_ffmpeg_failure_raises_with_its_last_stderr_line(self, lsw) -> None:
|
|
471
|
+
def runner(cmd, **kwargs):
|
|
472
|
+
return _FakeProc(1, b"noise\nin: Invalid data found when processing input\n")
|
|
473
|
+
|
|
474
|
+
with pytest.raises(ValueError, match="Invalid data found"):
|
|
475
|
+
lsw.transcode_to_wav(b"garbage", runner=runner)
|
|
476
|
+
|
|
477
|
+
def test_missing_ffmpeg_is_a_value_error(self, lsw) -> None:
|
|
478
|
+
def runner(cmd, **kwargs):
|
|
479
|
+
raise FileNotFoundError("ffmpeg")
|
|
480
|
+
|
|
481
|
+
with pytest.raises(ValueError, match="ffmpeg is not installed"):
|
|
482
|
+
lsw.transcode_to_wav(b"x", runner=runner)
|
|
483
|
+
|
|
484
|
+
def test_zero_exit_without_output_is_a_failure(self, lsw) -> None:
|
|
485
|
+
with pytest.raises(ValueError, match="could not decode audio"):
|
|
486
|
+
lsw.transcode_to_wav(b"x", runner=lambda cmd, **kw: _FakeProc(0))
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
class TestParseMaxAudioSeconds:
|
|
490
|
+
def test_default_when_unset_empty_or_bad(self, lsw) -> None:
|
|
491
|
+
for raw in (None, "", " ", "ten", "0", "-5", "inf", "nan"):
|
|
492
|
+
assert lsw.parse_max_audio_seconds(raw) == lsw.DEFAULT_MAX_AUDIO_SECONDS
|
|
493
|
+
|
|
494
|
+
def test_positive_value_is_used(self, lsw) -> None:
|
|
495
|
+
assert lsw.parse_max_audio_seconds("120") == 120.0
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
# --------------------------------------------------------------------------
|
|
499
|
+
# Chunking: longer than one Whisper window is split at the quietest point
|
|
500
|
+
# near each window's end, never refused.
|
|
501
|
+
# --------------------------------------------------------------------------
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
class TestPlanChunks:
|
|
505
|
+
RATE = 100 # 100 Hz keeps the fixtures tiny; frame = 2 samples at 20 ms
|
|
506
|
+
|
|
507
|
+
def _check_cover(self, chunks, n, window) -> None:
|
|
508
|
+
assert chunks[0][0] == 0
|
|
509
|
+
assert chunks[-1][1] == n
|
|
510
|
+
for (a, b), (c, _) in zip(chunks, chunks[1:]):
|
|
511
|
+
assert b == c # contiguous, no overlap, no gap
|
|
512
|
+
for a, b in chunks:
|
|
513
|
+
assert 0 < b - a <= window
|
|
514
|
+
|
|
515
|
+
def test_one_window_is_one_chunk(self, lsw) -> None:
|
|
516
|
+
assert lsw.plan_chunks([1.0] * 2000, self.RATE, 30) == [(0, 2000)]
|
|
517
|
+
|
|
518
|
+
def test_exactly_one_window_is_one_chunk(self, lsw) -> None:
|
|
519
|
+
assert lsw.plan_chunks([1.0] * 3000, self.RATE, 30) == [(0, 3000)]
|
|
520
|
+
|
|
521
|
+
def test_cut_lands_in_the_pause(self, lsw) -> None:
|
|
522
|
+
samples = [1.0] * 4500
|
|
523
|
+
samples[2700:2720] = [0.0] * 20 # a 0.2 s pause 27 s in
|
|
524
|
+
chunks = lsw.plan_chunks(samples, self.RATE, 30, 5)
|
|
525
|
+
self._check_cover(chunks, 4500, 3000)
|
|
526
|
+
assert 2700 <= chunks[0][1] <= 2720
|
|
527
|
+
|
|
528
|
+
def test_long_clip_covers_every_sample_within_windows(self, lsw) -> None:
|
|
529
|
+
samples = [((i * 7919) % 13) / 13.0 for i in range(100 * 200)] # 200 s
|
|
530
|
+
chunks = lsw.plan_chunks(samples, self.RATE, 30, 5)
|
|
531
|
+
self._check_cover(chunks, len(samples), 3000)
|
|
532
|
+
assert len(chunks) >= 7
|
|
533
|
+
|
|
534
|
+
def test_no_pause_still_makes_progress(self, lsw) -> None:
|
|
535
|
+
chunks = lsw.plan_chunks([1.0] * 9000, self.RATE, 30, 5)
|
|
536
|
+
self._check_cover(chunks, 9000, 3000)
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
class TestJoinChunkTexts:
|
|
540
|
+
def test_skips_empty_windows(self, lsw) -> None:
|
|
541
|
+
assert lsw.join_chunk_texts(["שלום", "", " ", "עולם "]) == "שלום עולם"
|
|
542
|
+
|
|
543
|
+
def test_all_empty_is_empty(self, lsw) -> None:
|
|
544
|
+
assert lsw.join_chunk_texts(["", ""]) == ""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|