lobes-cli 0.45.0__tar.gz → 0.45.2__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.45.0 → lobes_cli-0.45.2}/.github/workflows/publish.yml +12 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.github/workflows/tests.yml +6 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/CHANGELOG.md +34 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/PKG-INFO +1 -1
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/machine-profiles.md +37 -10
- lobes_cli-0.45.2/docs/orin-profiles.md +183 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/pyproject.toml +1 -1
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/uv.lock +1 -1
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.agex/data/pr/events.jsonl +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/challenge/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/cicd/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/communicate/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/deviate/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/model-runner/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/model-runner/scripts/model-runner.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/recall/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/recall/scripts/recall.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/remember/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/remember/scripts/remember.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/run-tests/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/scope/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/summarize-delivery/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/think/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/think/scripts/think.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/version-bump/SKILL.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.claude/skills.local.yaml.example +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/current +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/current_plan +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-adds-a-third-middle-model-tier-and-pressure.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-exposes-the-full-colleague-runtime-stack-as.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-fits-the-machine-it-lands-on-one-command-det.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-gateway-relays-sse-streams-frame-by-frame-th.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-never-advertises-a-capability-it-cannot-serv.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-preserves-qwen-thinking-traces-across-multi.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-serves-strict-grammar-constrained-tool-calls.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-serves-the-brain-shape-you-choose-machine-as.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-serves-the-mesh-brain-end-state-one-lobe-per.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-ships-a-per-lobe-benchmark-suite-speed-paral.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-tells-clients-the-truth-about-a-fleet-a-cons.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/lobes-unifies-its-generate-lane-on-one-vllm-nightl.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/model-gear-now-serves-an-embedding-gear-qwen3-embe-2.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/model-gear-now-serves-an-embedding-gear-qwen3-embe.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/model-gear-owns-the-audio-i-o-surface-end-to-end-m.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/proxy-lobes-pairwise-auth.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/the-gemma-4-12b-gear-gets-speculative-decoding-lob.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/frames/under-pressure-lobes-tells-you-the-cortex-model-is.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-adds-a-third-middle-model-tier-and-pressure.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-exposes-the-full-colleague-runtime-stack-as.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-fits-the-machine-it-lands-on-one-command-det.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-gateway-relays-sse-streams-frame-by-frame-th.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-never-advertises-a-capability-it-cannot-serv.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-preserves-qwen-thinking-traces-across-multi.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-serves-strict-grammar-constrained-tool-calls.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-serves-the-brain-shape-you-choose-machine-as.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-serves-the-mesh-brain-end-state-one-lobe-per.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-ships-a-per-lobe-benchmark-suite-speed-paral.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-tells-clients-the-truth-about-a-fleet-a-cons.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/lobes-unifies-its-generate-lane-on-one-vllm-nightl.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/model-gear-now-serves-an-embedding-gear-qwen3-embe-2.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/model-gear-owns-the-audio-i-o-surface-end-to-end-m.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/proxy-lobes-pairwise-auth.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/the-gemma-4-12b-gear-gets-speculative-decoding-lob.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.devague/plans/under-pressure-lobes-tells-you-the-cortex-model-is.json +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.eidetic/memory/colleague__public.jsonl +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.eidetic/memory/lobes__public.jsonl +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.flake8 +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.gitignore +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/.markdownlint-cli2.yaml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/AGENTS.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/CLAUDE.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/LICENSE +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/README.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/culture.yaml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/chatterbox-tts.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/colleague-stack.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/deliveries/2026-07-16-proxy-lobes-pairwise-auth.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/deployment-shapes.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/durable-logs.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/evidence/2026-07-14-accept-referral-thor.txt +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/evidence/2026-07-14-accept-spark-lobe-gb10.txt +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/evidence/2026-07-14-accept-thor-lobe-live-referral-thor.txt +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/evidence/2026-07-14-accept-thor-lobe-thor.txt +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/evidence/2026-07-14-strict-tools-spark-lobe-spark.txt +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/evidence/2026-07-16-proxy-lobes-live-spark-thor.txt +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/gateway-fleet.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/gemma-4-12b-nvfp4.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/gemma4-mtp-draft.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/mistral-small-3.2-24b-nvfp4.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/openai-api.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/parakeet-stt.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-06-12-model-gear-owns-the-audio-i-o-surface-end-to-end-m.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-06-19-model-gear-now-serves-an-embedding-gear-qwen3-embe-2.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-06-26-lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-06-26-lobes-ships-a-per-lobe-benchmark-suite-speed-paral.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-06-29-lobes-adds-a-third-middle-model-tier-and-pressure.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-06-30-lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-06-30-lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-01-gemma-4-12b-gear-gets-speculative-decoding-draft.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-01-lobes-unifies-its-generate-lane-on-one-vllm-nightl.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-03-lobes-exposes-the-full-colleague-runtime-stack-as.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-03-under-pressure-lobes-tells-you-the-cortex-model-is.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-04-lobes-tells-clients-the-truth-about-a-fleet-a-cons.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-07-lobes-preserves-qwen-thinking-traces-across-multi.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-09-lobes-never-advertises-a-capability-it-cannot-serv.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-10-lobes-gateway-relays-sse-streams-frame-by-frame-th.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-13-lobes-fits-the-machine-it-lands-on-one-command-det.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-14-lobes-serves-strict-grammar-constrained-tool-calls.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-14-lobes-serves-the-brain-shape-you-choose-machine-as.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-14-lobes-serves-the-mesh-brain-end-state-one-lobe-per.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/plans/2026-07-16-proxy-lobes-pairwise-auth.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/qwen3-14b-nvfp4.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/qwen3-32b-nvfp4.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/qwen3-embedding-0.6b.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/qwen3-reranker-0.6b.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/qwen3.5-4b-minor.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/qwen3.6-27b-nvfp4.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/qwen3.6-27b-text-nvfp4-mtp.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/qwen3.6-35b-a3b-nvfp4.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/realtime-pipeline.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/skill-sources.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-06-12-model-gear-owns-the-audio-i-o-surface-end-to-end-m.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-06-19-model-gear-now-serves-an-embedding-gear-qwen3-embe-2.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-06-26-lobes-ships-a-minor-lobe-a-cheap-warm-co-resident.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-06-26-lobes-ships-a-per-lobe-benchmark-suite-speed-paral.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-06-29-lobes-adds-a-third-middle-model-tier-and-pressure.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-06-30-lobes-now-defaults-to-a-spark-duo-the-qwen3-6-27b.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-06-30-lobes-ships-a-custom-vllm-image-from-nvcr-io-nvidi.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-01-gemma-4-12b-gear-gets-speculative-decoding-draft.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-01-lobes-unifies-its-generate-lane-on-one-vllm-nightl.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-03-lobes-exposes-the-full-colleague-runtime-stack-as.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-03-under-pressure-lobes-tells-you-the-cortex-model-is.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-04-lobes-tells-clients-the-truth-about-a-fleet-a-cons.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-07-lobes-preserves-qwen-thinking-traces-across-multi.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-09-lobes-never-advertises-a-capability-it-cannot-serv.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-10-lobes-gateway-relays-sse-streams-frame-by-frame-th.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-13-lobes-fits-the-machine-it-lands-on-one-command-det.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-14-lobes-serves-strict-grammar-constrained-tool-calls.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-14-lobes-serves-the-brain-shape-you-choose-machine-as.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-14-lobes-serves-the-mesh-brain-end-state-one-lobe-per.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/specs/2026-07-16-proxy-lobes-pairwise-auth.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/superpowers/plans/2026-05-22-scaffold-cli-sibling.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/superpowers/specs/2026-05-22-scaffold-cli-sibling-design.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/tensorrt-llm-investigation.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/tuning-profiles.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/validate-tiers.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/docs/vllm-nightly-migration.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/examples/minor-evals/smoke.jsonl +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/__main__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/_metrics.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/assess.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/bench/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/bench/cat_probe.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/bench/cat_score.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/bench/compare.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/bench/report.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/catalog.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/assess.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/benchmark.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/capabilities.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/cli.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/doctor.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/eval.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/explain.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/fleet.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/init.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/learn.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/logs.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/measure.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/overview.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/route.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/run.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/serve.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/status.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/stop.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/switch.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/tunnel.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/up.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_commands/whoami.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_errors.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_live.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_output.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/cli/_runtime_ops.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/explain/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/explain/catalog.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/gateway/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/gateway/__main__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/gateway/_config.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/gateway/_pressure_policy.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/gateway/_readiness.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/gateway/_routing.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/gateway/_tier_request.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/gateway/server.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/machines/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/machines/_registry.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/machines/_strategy.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/machines/_traits.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/machines/blackwell.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/machines/generic.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/machines/spark.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/machines/thor.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/minor/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/minor/_client.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/minor/governance.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/builtin/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/builtin/base.toml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/builtin/spark.toml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/builtin/thor.toml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/builtin_shapes/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/builtin_shapes/machine-as-brain.toml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/builtin_shapes/orin-small.toml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/builtin_shapes/spark-lobe.toml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/builtin_shapes/thor-lobe.toml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/loader.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/render.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/schema.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/shape_render.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/profiles/shapes.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/realtime/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/realtime/__main__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/realtime/_readiness.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/realtime/_settings.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/realtime/app.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/realtime/audio_facade.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/realtime/chatterbox_server.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/realtime/protocol.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/realtime/tts_client.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/roles.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/roles_measure.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/runtime/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/runtime/_compose.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/runtime/_detect.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/runtime/_env.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/runtime/_health.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/runtime/_parser.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/runtime/_pressure.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/runtime/_tunnel.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/cf-tunnel.env.example +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/docker-compose.yml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/env.example +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/Dockerfile.chatterbox +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/Dockerfile.gateway +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/Dockerfile.parakeet +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/Dockerfile.realtime +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/Dockerfile.vllm-gemma4 +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/_readiness.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/docker-compose.audio.yml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/docker-compose.yml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/env.audio.example +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/env.example +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/fleet/listen_server.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/templates/mg-logwrap.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/vllm_plugins/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/lobes/vllm_plugins/qwen3_thinking_tool_parser.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/packaging/model-gear/README.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/packaging/model-gear/pyproject.toml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/scripts/accept-shape.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/scripts/audio-smoke.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/scripts/gen-api-key.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/scripts/live-check.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/scripts/validate-tiers.sh +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/sonar-project.properties +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/conftest.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/fixtures/upgrade_compat/README.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/fixtures/upgrade_compat/fleet/docker-compose.yml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/fixtures/upgrade_compat/fleet/env.example +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/fixtures/upgrade_compat/single/docker-compose.yml +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/fixtures/upgrade_compat/single/env.example +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/README.md +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/__init__.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/base.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/regen.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/shapes/orin-small__base.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/shapes/orin-small__spark.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/shapes/orin-small__thor.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/shapes/spark-lobe__base.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/shapes/spark-lobe__spark.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/shapes/spark-lobe__thor.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/shapes/thor-lobe__base.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/shapes/thor-lobe__spark.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/shapes/thor-lobe__thor.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/spark.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/template-defaults.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/goldens/thor.env +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_assess.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_assess_perf.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_bench_compare.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_bench_report.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_benchmark_all_lobes.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_boundary_serves_only.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cat_probe.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cat_score.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_catalog.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_catalog_tiers.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_chatterbox_pcm16.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_chatterbox_readiness.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_benchmark_profiles.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_capabilities.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_eval.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_eval_cat.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_fleet.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_gateway_auth.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_introspection.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_logs.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_measure.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_route.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_run.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_runtime.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_tunnel.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_up.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_cli_wiring.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_client_reasoning_roundtrip.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_colleague_contract.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_detect.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_doctor.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_doctor_machine_profile.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_dropped_lobe_honesty.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_fleet_minor.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_fleet_per_machine_knobs.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_fleet_template_gateway_env.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_audio_routing.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_auth.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_busy_e2e.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_capabilities.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_config_proxy.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_config_wiring.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_feasibility.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_fleet_doc.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_force_strict.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_proxy.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_readiness.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_routing.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_server.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_status.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gateway_tiers.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gemma4_compose.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gemma4_dockerfile.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_gen_api_key.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_init.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_init_profile.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_init_shape.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_live_capabilities.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_machines.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_minor_client.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_minor_governance.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_minor_integration.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_minor_logprobs.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_nightly_migration_doc.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_overview_live.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_parser.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_peer_referral.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_preserve_thinking_diagnostic.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_pressure.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_pressure_policy.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_profile_goldens.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_profile_render.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_profile_schema.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_profiles.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_proxy_integration.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_readiness_peer_probe.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_realtime_audio_facade.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_realtime_imports.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_realtime_protocol.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_realtime_readiness.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_realtime_settings.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_role_probes.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_roles.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_roles_proxied.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_shape_budgets.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_shape_contract_matrix.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_shape_goldens.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_shapes.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_smoke_duo.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_status_fleet.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_status_pressure.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_switch_bf16.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_templates_preserve_thinking.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_tier_request.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_tool_parser_plugin.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_upgrade_compat.py +0 -0
- {lobes_cli-0.45.0 → lobes_cli-0.45.2}/tests/test_vllm_plugin_thinking.py +0 -0
|
@@ -23,6 +23,9 @@ jobs:
|
|
|
23
23
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
24
24
|
|
|
25
25
|
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4
|
|
26
|
+
with:
|
|
27
|
+
version: "0.11.29"
|
|
28
|
+
enable-cache: true
|
|
26
29
|
|
|
27
30
|
- run: uv python install 3.12
|
|
28
31
|
|
|
@@ -44,6 +47,9 @@ jobs:
|
|
|
44
47
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
45
48
|
|
|
46
49
|
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4
|
|
50
|
+
with:
|
|
51
|
+
version: "0.11.29"
|
|
52
|
+
enable-cache: true
|
|
47
53
|
|
|
48
54
|
- run: uv python install 3.12
|
|
49
55
|
|
|
@@ -79,6 +85,9 @@ jobs:
|
|
|
79
85
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
80
86
|
|
|
81
87
|
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4
|
|
88
|
+
with:
|
|
89
|
+
version: "0.11.29"
|
|
90
|
+
enable-cache: true
|
|
82
91
|
|
|
83
92
|
- run: uv python install 3.12
|
|
84
93
|
|
|
@@ -101,6 +110,9 @@ jobs:
|
|
|
101
110
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
102
111
|
|
|
103
112
|
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4
|
|
113
|
+
with:
|
|
114
|
+
version: "0.11.29"
|
|
115
|
+
enable-cache: true
|
|
104
116
|
|
|
105
117
|
- run: uv python install 3.12
|
|
106
118
|
|
|
@@ -24,6 +24,9 @@ jobs:
|
|
|
24
24
|
fetch-depth: 0
|
|
25
25
|
|
|
26
26
|
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4
|
|
27
|
+
with:
|
|
28
|
+
version: "0.11.29"
|
|
29
|
+
enable-cache: true
|
|
27
30
|
|
|
28
31
|
- run: uv python install 3.12
|
|
29
32
|
|
|
@@ -49,6 +52,9 @@ jobs:
|
|
|
49
52
|
node-version: '20'
|
|
50
53
|
|
|
51
54
|
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4
|
|
55
|
+
with:
|
|
56
|
+
version: "0.11.29"
|
|
57
|
+
enable-cache: true
|
|
52
58
|
|
|
53
59
|
- run: uv python install 3.12
|
|
54
60
|
|
|
@@ -4,6 +4,40 @@ 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.45.2] - 2026-07-17
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `docs/orin-profiles.md` — Jetson AGX Orin 64GB live-validation evidence
|
|
12
|
+
(2026-07-16/17, issue #127 mesh work): the operator profile serving Gemma
|
|
13
|
+
`senses` at its full 128K context on Ampere sm_87 (measured `gpu_mem_util`
|
|
14
|
+
0.45; 0.30 refused with 2.25 GiB KV vs the 3.08 GiB that 131072 needs; KV
|
|
15
|
+
pool 802,644 tokens / 6.12x concurrency), embedder/reranker probe results,
|
|
16
|
+
why `cortex` (modelopt NVFP4 W4A4) is architecturally infeasible on Ampere,
|
|
17
|
+
three Jetson/sm_87 divergences found live (csv-mode GPU access needs
|
|
18
|
+
`runtime: nvidia`; the Parakeet base image is Spark-only — no sm_87
|
|
19
|
+
kernels; unified-memory use far exceeds the util sum), the validated #127
|
|
20
|
+
cortex proxy wiring, and the gateway→gateway audio-chaining limitation
|
|
21
|
+
(readiness probes `/v1/health/ready`, which a peer gateway 401s/404s —
|
|
22
|
+
first-class audio referral knobs are the phase-2 candidate).
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- `docs/machine-profiles.md` cross-links the Orin worked example from the
|
|
27
|
+
custom-profile section.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- `docs/machine-profiles.md` documented `lobes init --machine` for selecting
|
|
32
|
+
a profile; `init`'s actual flag is `--profile` (`--machine` belongs to
|
|
33
|
+
`switch`). The wrong flag made the documented custom-profile flow error out.
|
|
34
|
+
|
|
35
|
+
## [0.45.1] - 2026-07-17
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- CI hardening: pin `astral-sh/setup-uv`'s `version` to `0.11.29` (was `latest`) and turn on `enable-cache: true` across both workflows (`tests.yml`, `publish.yml`, 6 usages total), so a transient GitHub release-CDN outage can no longer take down every job by failing uv's "resolve latest" step; two identical CI failures on PR #132 (2026-07-16 22:39Z/22:43Z, GitHub 503 HTML from the setup-uv download) prompted the change. The action's SHA pin, tokens, and cache-dependency-glob are unchanged
|
|
40
|
+
|
|
7
41
|
## [0.45.0] - 2026-07-16
|
|
8
42
|
|
|
9
43
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lobes-cli
|
|
3
|
-
Version: 0.45.
|
|
3
|
+
Version: 0.45.2
|
|
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
|
|
@@ -16,8 +16,21 @@ reference.
|
|
|
16
16
|
|
|
17
17
|
## How detection works
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
The card-detection flow below runs only during **`lobes init`** — either
|
|
20
|
+
auto-detected from the card, or forced with an explicit `--profile <name>` —
|
|
21
|
+
to resolve the per-role `Profile` this document describes and render it into
|
|
22
|
+
`.env`. **`lobes serve` and `lobes status` run no detection at all** and
|
|
23
|
+
accept neither `--profile` nor `--machine`: they only read the deployment's
|
|
24
|
+
already-rendered `.env` (including the persisted `LOBES_PROFILE`) — profile
|
|
25
|
+
selection happens once, at `init` time, not on every `serve`/`status` call.
|
|
26
|
+
`lobes switch` has its own, separate `--machine` flag — a *different*,
|
|
27
|
+
legacy single-model machine-profile knob (`lobes/profiles/__init__.py`'s
|
|
28
|
+
`MachineProfile` / `resolve_machine()`, tuning the single-model template's
|
|
29
|
+
GPU/context defaults), not the fleet `Profile` system covered here; left at
|
|
30
|
+
its default (`auto`), it re-detects the GPU name via `nvidia-smi -L` on its
|
|
31
|
+
own code path, not `lobes/runtime/_detect.py::detect_card()`.
|
|
32
|
+
|
|
33
|
+
The following steps resolve the machine name at `lobes init` time:
|
|
21
34
|
|
|
22
35
|
1. **Gather raw facts** (from `lobes/runtime/_detect.py::detect_card()`):
|
|
23
36
|
- **Device name**: from `nvidia-smi --query-gpu=name,compute_cap`
|
|
@@ -51,8 +64,8 @@ When `lobes init` runs (or `lobes serve` / `lobes status` without an explicit
|
|
|
51
64
|
|
|
52
65
|
## How a profile is chosen
|
|
53
66
|
|
|
54
|
-
Once detection (or an explicit `--
|
|
55
|
-
profile is looked up via `lobes/profiles/loader.py::resolve_profile()`:
|
|
67
|
+
Once detection (or an explicit `--profile` flag on `lobes init`) resolves the
|
|
68
|
+
card name, a profile is looked up via `lobes/profiles/loader.py::resolve_profile()`:
|
|
56
69
|
|
|
57
70
|
1. **Explicit always wins**: if `--profile <name>` was given (or a
|
|
58
71
|
`LOBES_PROFILE` env var), that profile is used, even if it diverges from
|
|
@@ -294,7 +307,8 @@ latency (higher tail latency per request).
|
|
|
294
307
|
|
|
295
308
|
Operator-defined profiles go in `<deployment-dir>/profiles/<name>.toml` (the
|
|
296
309
|
file's stem is the profile name). They are discovered automatically by
|
|
297
|
-
`lobes init`
|
|
310
|
+
`lobes init` (the only verb that resolves a `Profile` — see "How detection
|
|
311
|
+
works" above) and override any built-in with the same name.
|
|
298
312
|
|
|
299
313
|
A profile is a self-contained TOML declaration. Example:
|
|
300
314
|
|
|
@@ -334,7 +348,8 @@ max_model_len = 8192
|
|
|
334
348
|
**Rules:**
|
|
335
349
|
|
|
336
350
|
- **File name is the profile name.** `profiles/my-custom-box.toml` → profile
|
|
337
|
-
name is `my-custom-box`. Use it as `lobes init --
|
|
351
|
+
name is `my-custom-box`. Use it as `lobes init --profile my-custom-box --apply`
|
|
352
|
+
(the flag is `--profile` on `init`, `--machine` on `switch`).
|
|
338
353
|
- **Inline `name` field must match the file stem.** If the file declares
|
|
339
354
|
`name = "something-else"`, profile loading fails with an error (this prevents
|
|
340
355
|
confusion from stale copies).
|
|
@@ -355,8 +370,8 @@ max_model_len = 8192
|
|
|
355
370
|
To use your profile:
|
|
356
371
|
|
|
357
372
|
```bash
|
|
358
|
-
# Explicit --machine or LOBES_PROFILE env var:
|
|
359
|
-
lobes init --
|
|
373
|
+
# Explicit flag (--profile on init, --machine on switch) or LOBES_PROFILE env var:
|
|
374
|
+
lobes init --profile my-custom-box --apply
|
|
360
375
|
lobes switch my-model --machine my-custom-box --apply
|
|
361
376
|
|
|
362
377
|
# Automatic if the detected machine name matches:
|
|
@@ -369,6 +384,11 @@ Auto-detection only works if the *detected machine name* (from
|
|
|
369
384
|
profile to be auto-selected on a new card, add a new `CardStrategy` module to
|
|
370
385
|
`lobes/machines/` (following the `spark.py` / `thor.py` pattern).
|
|
371
386
|
|
|
387
|
+
For a complete worked example — a live-validated operator profile for the
|
|
388
|
+
Jetson AGX Orin 64GB (Gemma `senses` at its full 128K context on Ampere sm_87,
|
|
389
|
+
with measured knob values and the Jetson divergences found on the way) — see
|
|
390
|
+
[`orin-profiles.md`](orin-profiles.md).
|
|
391
|
+
|
|
372
392
|
## The goldens contract
|
|
373
393
|
|
|
374
394
|
CI guards against cross-machine breakage via golden `.env` files — one per
|
|
@@ -395,14 +415,21 @@ built-in defaults (when no profile is loaded) render as expected.
|
|
|
395
415
|
|
|
396
416
|
lobes is deployed and validated on the following hardware, with the stated
|
|
397
417
|
caveat profile as the truthful, tested configuration. Aspirational entries are
|
|
398
|
-
marked clearly as **unvalidated**.
|
|
418
|
+
marked clearly as **unvalidated**. **This table's scope is BUILT-IN
|
|
419
|
+
profiles/shapes** (`lobes/profiles/builtin/*.toml`,
|
|
420
|
+
`lobes/profiles/builtin_shapes/*.toml`) — the #108 rule is that a built-in
|
|
421
|
+
earns "validated" status only via a repo-recorded boot of that *exact*
|
|
422
|
+
built-in, so a validated operator-defined profile (`<deploy-dir>/profiles/
|
|
423
|
+
<name>.toml`) does not by itself validate a built-in for the same card. The
|
|
424
|
+
Orin row below carries both facts side by side so they read as complementary,
|
|
425
|
+
not contradictory.
|
|
399
426
|
|
|
400
427
|
| card | machine | profile | status | validation |
|
|
401
428
|
|---|---|---|---|---|
|
|
402
429
|
| **DGX Spark** (Grace Blackwell, 128 GB unified) | `spark` | `spark.toml` | load-tested | 2026-06-03 — `lobes benchmark` ran at ~7.8–8.0 tok/s decode (27B primary, util 0.30, single-stream) on the fleet duo (cortex 128K, senses 32K) with FlashInfer attention. **The correctness probes postdate that run and have not been executed on the GB10** — rerank ordering there is explicitly unverified (issue #106). See `docs/tuning-profiles.md` and the Spark run on `docs/qwen3.6-27b-text-nvfp4-mtp.md`. |
|
|
403
430
|
| **Jetson AGX Thor** (Blackwell-class sm_110, 128 GB unified) | `thor` | `thor.toml` | load-tested | 2026-07-13 — the three correctness probes (cortex known-answer, embed paraphrase-ranking, rerank ordering) all pass with the profile's four divergences (`cortex kv_cache_dtype=auto`, `embedder TRITON_ATTN`, `reranker TRITON_ATTN + enforce_eager=true`); senses' health was not confirmed in that run (it boots last and the concurrent-boot race, caveat 4 below, can catch it). |
|
|
404
431
|
| **unknown card** (UNKNOWN) | `generic` | `base.toml` | conservative fallback | — — no hardware beyond Spark/Thor is load-tested; UNKNOWN cards are served a small 4B model, no 27B, and no multimodal (`senses` disabled). Avoids OOM crashes on first boot. See issue #107 for broader "small default on every card" work. |
|
|
405
|
-
| Jetson AGX Orin / Orin Nano Super | `(not yet)` | (not yet) | **unvalidated** |
|
|
432
|
+
| Jetson AGX Orin / Orin Nano Super | `(not yet)` | (not yet) | **no built-in profile — unvalidated at that scope; operator-validated separately** | **Built-ins:** no built-in `orin` profile exists, and the built-in `orin-small` *shape* remains DECLARED/UNVALIDATED (#108 — an unbooted built-in stays unvalidated regardless of operator activity elsewhere). Do not claim built-in Orin support from this row. **Operator deployment:** a physical Jetson AGX Orin 64GB WAS operator-validated 2026-07-16/17, using a hand-written **operator profile** (`<deploy-dir>/profiles/orin.toml` — `senses`/`embedder`/`reranker`, `senses` at its full native 131072 context, measured `gpu_mem_util=0.45`) composed with the built-in `thor-lobe` *shape* (not `orin-small`). See [`orin-profiles.md`](orin-profiles.md) for the measured knobs and the Jetson/sm_87 divergences found live. |
|
|
406
433
|
|
|
407
434
|
## Thor caveats and validation facts
|
|
408
435
|
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Jetson AGX Orin 64GB — live-validated senses / embedder / reranker profile
|
|
2
|
+
|
|
3
|
+
**Status: operator-validated on physical hardware, 2026-07-16/17** (issue #127
|
|
4
|
+
mesh work). This page records what a real Jetson AGX Orin 64GB Developer Kit
|
|
5
|
+
(Ampere **sm_87**, 61.3 GiB unified memory, CUDA 13.2 / driver 595.78) actually
|
|
6
|
+
serves, with measured numbers — the #108 discipline: a card earns its tuning
|
|
7
|
+
data by booting it, and this boot is what earned Orin's. The repo's built-in
|
|
8
|
+
`orin-small` *shape* remains DECLARED/UNVALIDATED (this deployment used
|
|
9
|
+
`thor-lobe`, not `orin-small` — see "Shape choice" below).
|
|
10
|
+
|
|
11
|
+
## What this box serves
|
|
12
|
+
|
|
13
|
+
| role | model | context | gpu_mem_util | result |
|
|
14
|
+
|---|---|---|---|---|
|
|
15
|
+
| `senses` | `coolthor/gemma-4-12B-it-NVFP4A16` | **131072 (full native 128K)** | **0.45** | KV pool **802,644 tokens**, **6.12×** concurrency at 131,072/request |
|
|
16
|
+
| `embedder` | `Qwen/Qwen3-Embedding-0.6B` | 8192 | 0.06 | healthy; 1024-dim embeddings |
|
|
17
|
+
| `reranker` | `Qwen/Qwen3-Reranker-0.6B` | 8192 | 0.06 | healthy; **rerank ordering probe passes** |
|
|
18
|
+
| `cortex` | — | — | — | `feasible=false` (see "Why no cortex"), referred/proxied to the Spark |
|
|
19
|
+
| `stt`/`tts` | — | — | — | dropped locally; `/v1/audio/*` forwards to a peer gateway via `AUDIO_URL` |
|
|
20
|
+
|
|
21
|
+
Probes passed (2026-07-17, via the gateway on `:8000`): senses known-answer
|
|
22
|
+
(text, `model=senses` alias), senses **vision** intake (solid-color image →
|
|
23
|
+
correct one-word answer), embeddings (1024 dims), rerank ordering (relevant
|
|
24
|
+
document top-ranked, score 0.82). The three core-role correctness probes that
|
|
25
|
+
`lobes assess` encodes are therefore all exercised on sm_87.
|
|
26
|
+
|
|
27
|
+
## The operator profile
|
|
28
|
+
|
|
29
|
+
There is deliberately no built-in `orin` profile in `lobes/profiles/builtin/`
|
|
30
|
+
(#108: no invented knobs for an unbooted card). This deployment declares an
|
|
31
|
+
**operator profile** at `<deploy-dir>/profiles/orin.toml`, selected with
|
|
32
|
+
`lobes init --profile orin`:
|
|
33
|
+
|
|
34
|
+
```toml
|
|
35
|
+
name = "orin"
|
|
36
|
+
summary = "Jetson AGX Orin 64GB (Ampere sm_87, 64 GB unified) — operator profile: senses + pooling gears, no cortex"
|
|
37
|
+
|
|
38
|
+
[roles.cortex]
|
|
39
|
+
feasible = false
|
|
40
|
+
|
|
41
|
+
[roles.senses]
|
|
42
|
+
feasible = true
|
|
43
|
+
model = "coolthor/gemma-4-12B-it-NVFP4A16"
|
|
44
|
+
gpu_mem_util = 0.45
|
|
45
|
+
max_model_len = 131072
|
|
46
|
+
quantization = "compressed-tensors"
|
|
47
|
+
attention_backend = "TRITON_ATTN"
|
|
48
|
+
|
|
49
|
+
[roles.embedder]
|
|
50
|
+
feasible = true
|
|
51
|
+
model = "Qwen/Qwen3-Embedding-0.6B"
|
|
52
|
+
gpu_mem_util = 0.06
|
|
53
|
+
max_model_len = 8192
|
|
54
|
+
attention_backend = "TRITON_ATTN"
|
|
55
|
+
|
|
56
|
+
[roles.reranker]
|
|
57
|
+
feasible = true
|
|
58
|
+
model = "Qwen/Qwen3-Reranker-0.6B"
|
|
59
|
+
gpu_mem_util = 0.06
|
|
60
|
+
max_model_len = 8192
|
|
61
|
+
attention_backend = "TRITON_ATTN"
|
|
62
|
+
enforce_eager = true
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Why these knobs
|
|
66
|
+
|
|
67
|
+
- **`senses` runs on Ampere because the checkpoint is weight-only FP4.**
|
|
68
|
+
`coolthor/gemma-4-12B-it-NVFP4A16` is compressed-tensors **W4A16** — weights
|
|
69
|
+
dequantise through vLLM's Marlin/FP4 path (compute capability ≥ 8.0), so
|
|
70
|
+
sm_87 qualifies. Activations stay 16-bit; no Blackwell FP4 tensor cores
|
|
71
|
+
needed. The full stack — Marlin GEMM, torch.compile/inductor, the MTP
|
|
72
|
+
(`eagle_head`) draft, TRITON_ATTN — ran clean on sm_87 with the same pinned
|
|
73
|
+
vLLM nightly digest the Spark/Thor fleets use (`vllm/vllm-openai@sha256:7c5a…`,
|
|
74
|
+
vLLM 0.23.1rc1.dev672). vLLM's own arm64 release builds list 8.7 as an
|
|
75
|
+
aarch64-only target, which is why the multi-arch image carries the kernels.
|
|
76
|
+
- **`gpu_mem_util = 0.45` is MEASURED, not computed** (the same discipline as
|
|
77
|
+
thor-lobe's 0.30). The first boot at util 0.30 (18.4 GiB of 61.3) was refused
|
|
78
|
+
by vLLM: after weights (~7.7 GiB), the MTP draft head, CUDA graphs
|
|
79
|
+
(0.75 GiB) and runtime overhead, only **2.25 GiB** KV remained where
|
|
80
|
+
`max_model_len=131072` needs **3.08 GiB** (vLLM's estimated max at 0.30 was
|
|
81
|
+
76,352). At 0.45 (~27.6 GiB) the same boot reports **18.86 GiB KV =
|
|
82
|
+
802,644 tokens = 6.12×** concurrency at full context. Do not copy Thor's
|
|
83
|
+
0.30 onto a 64 GB board for 128K.
|
|
84
|
+
- **`max_model_len = 131072`** — the checkpoint's full native context. It fits;
|
|
85
|
+
no 64K/32K trim was needed on 64 GB once util was raised.
|
|
86
|
+
- **`cortex feasible = false` (why no cortex).** The 27B primary
|
|
87
|
+
(`sakamakismile/Qwen3.6-27B-Text-NVFP4-MTP`) is **modelopt NVFP4 W4A4** —
|
|
88
|
+
its quantised *activations* need Blackwell FP4 tensor cores; sm_87 is
|
|
89
|
+
Ampere. This is a hard architecture line, not a memory tradeoff.
|
|
90
|
+
- **Pooling gears mirror Thor's Jetson divergences as the conservative first
|
|
91
|
+
boot** (`TRITON_ATTN` both, reranker `enforce_eager`). Thor's FLASH_ATTN
|
|
92
|
+
pooling hang is sm_110-specific and was NOT re-tested on sm_87 — these are
|
|
93
|
+
safe-boot choices, not proven-necessary ones. Relaxing them (and measuring)
|
|
94
|
+
is open follow-up work.
|
|
95
|
+
|
|
96
|
+
## Shape choice: `thor-lobe`, not `orin-small`
|
|
97
|
+
|
|
98
|
+
The built-in `orin-small` reference shape (minor + pooling + audio, both heavy
|
|
99
|
+
lobes dropped) was NOT what this deployment wanted — the assignment here is
|
|
100
|
+
**Orin hosts the Gemma senses lobe** (most important role for this box, user
|
|
101
|
+
decision on #127). `thor-lobe` hosts exactly `senses + embedder + reranker +
|
|
102
|
+
stt + tts` and drops `cortex`, so it renders the right deployment on this box
|
|
103
|
+
when composed over the operator profile:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
lobes init --profile orin --shape thor-lobe --apply
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Note the shape's own senses overrides (`gpu_mem_util=0.30`,
|
|
110
|
+
`max_model_len=131072` — Thor-measured values) overlay the profile at render
|
|
111
|
+
time; on this box the rendered `.env` needed `MULTIMODAL_GPU_MEM_UTIL=0.45`
|
|
112
|
+
(the Orin-measured value above). `orin-small` itself remains unbooted and
|
|
113
|
+
therefore still DECLARED/UNVALIDATED.
|
|
114
|
+
|
|
115
|
+
## Jetson/sm_87 divergences found live (upstreaming candidates)
|
|
116
|
+
|
|
117
|
+
1. **csv-mode GPU access.** This Orin's NVIDIA container toolkit (1.19.1,
|
|
118
|
+
`mode = "auto"`) resolves to legacy **csv** mode, where the compose
|
|
119
|
+
template's `deploy.resources.reservations.devices` (`--gpus`-style) request
|
|
120
|
+
fails at container create: *"invoking the NVIDIA Container Runtime Hook
|
|
121
|
+
directly … is not supported. Please use the NVIDIA Container Runtime"*.
|
|
122
|
+
Fix applied on-box: every GPU service's `deploy:` stanza in the deployed
|
|
123
|
+
`docker-compose.yml`/`docker-compose.audio.yml` replaced with
|
|
124
|
+
`runtime: nvidia`. **A re-init reverts this hand edit** — a template knob or
|
|
125
|
+
machine-strategy overlay is the real fix. (Thor presumably works because
|
|
126
|
+
JetPack 7 ships CDI mode.)
|
|
127
|
+
2. **The Parakeet STT base image is Spark-specific.** `Dockerfile.parakeet`'s
|
|
128
|
+
base `scitrera/dgx-spark-vllm:0.16.0-t4` ships a torch with no sm_87
|
|
129
|
+
kernels — NeMo dies at model load with `CUDA error: no kernel image is
|
|
130
|
+
available for execution on the device` (observed live: 8 container
|
|
131
|
+
restarts). Working fix (staged on-box before local audio was dropped):
|
|
132
|
+
rebase the Dockerfile onto the fleet's own pinned vLLM nightly digest
|
|
133
|
+
(whose arm64 torch is sm_87-validated by senses itself) and add
|
|
134
|
+
`ENTRYPOINT []` so its CMD survives the base image's entrypoint. The same
|
|
135
|
+
mismatch plausibly explains stt/tts `ready=false` on the sm_110 Thor.
|
|
136
|
+
3. **Unified-memory budgeting is tighter than the util sum.** Each vLLM engine
|
|
137
|
+
consumes CPU-side memory beyond `gpu_mem_util × total` (host buffers plus
|
|
138
|
+
the default 4 GiB `swap_space` per engine). With senses 0.45 + two 0.06
|
|
139
|
+
gears the box sat at **54/61 GiB used with zero swap configured** — the
|
|
140
|
+
util sum (0.57 ≈ 35 GiB) undercounts by ~19 GiB. Leave real headroom, or
|
|
141
|
+
audio sidecars/host workloads will OOM-race the fleet.
|
|
142
|
+
|
|
143
|
+
## Mesh wiring (#127) from this box
|
|
144
|
+
|
|
145
|
+
- `PRIMARY_PEER_ORIGIN=http://spark.tail0be7e0.ts.net:8001` — cortex referral
|
|
146
|
+
(the same operator-typed value the Thor uses). `PRIMARY_PEER_PROXY=true` +
|
|
147
|
+
`PRIMARY_PEER_API_KEY=<the Spark's inbound GATEWAY_API_KEY>` arm the
|
|
148
|
+
follow-the-referral forward. **VALIDATED LIVE 2026-07-17**: a
|
|
149
|
+
`model=cortex` chat request from this box answers from the Spark's 27B
|
|
150
|
+
(`X-Lobes-Proxied-By: http://spark.tail0be7e0.ts.net:8001`, HTTP 200),
|
|
151
|
+
caller's own credential stripped per the #127 contract.
|
|
152
|
+
- `AUDIO_URL=http://100.127.105.72:8001` — `/v1/audio/*` is *configured* to
|
|
153
|
+
forward to the Spark's gateway instead of local sidecars, but **audio
|
|
154
|
+
cannot chain gateway→gateway as of 0.45.0** (found live, 2026-07-17): the
|
|
155
|
+
audio readiness probe GETs `<AUDIO_URL>/v1/health/ready` unauthenticated,
|
|
156
|
+
which a peer *gateway* 401s (its GET /v1/* namespace is bearer-gated) and
|
|
157
|
+
would 404 anyway (that endpoint belongs to the realtime *bridge*, and
|
|
158
|
+
gateways only path-route `/v1/audio/*`) — the probe returns False forever
|
|
159
|
+
and this box answers a permanent 503. Working peer-audio today means
|
|
160
|
+
pointing `AUDIO_URL` at the peer's realtime **bridge** directly (publish
|
|
161
|
+
its port, e.g. `8080`, on the peer's tailnet — the bridge is keyless and
|
|
162
|
+
serves `/v1/health/ready` itself). Audio is also **outside the #127
|
|
163
|
+
pairwise-auth contract** (four core roles only): the forward passes the
|
|
164
|
+
caller's own `Authorization` through verbatim, attaches no per-peer key,
|
|
165
|
+
and `stt`/`tts` get no `hosted_by` referral annotation. First-class audio
|
|
166
|
+
referral/proxy knobs are the phase-2 candidate this measures out.
|
|
167
|
+
|
|
168
|
+
## Reproducing on another Orin
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
uv tool install lobes-cli # or: uv sync in a checkout
|
|
172
|
+
mkdir -p ~/.lobes/profiles # then write profiles/orin.toml (above)
|
|
173
|
+
lobes init --profile orin --shape thor-lobe --apply
|
|
174
|
+
# csv-mode boards: swap the deploy.resources GPU stanzas for `runtime: nvidia`
|
|
175
|
+
# (divergence 1 above) until a template knob lands.
|
|
176
|
+
lobes up senses --apply # boot order: senses first, then gears
|
|
177
|
+
lobes up embedder --apply && lobes up reranker --apply
|
|
178
|
+
docker compose -f docker-compose.yml -f docker-compose.shape.yml up -d gateway
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Boot sequentially — the machine-profiles boot-ordering caveat (concurrent
|
|
182
|
+
first boots race vLLM's free-memory measurement on unified boards) applies to
|
|
183
|
+
this card too.
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|