minima-cli 0.7.0__tar.gz → 0.7.1__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.
- minima_cli-0.7.1/.github/workflows/catalog-snapshot.yml +100 -0
- minima_cli-0.7.1/.github/workflows/ci.yml +69 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/CHANGELOG.md +31 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/PKG-INFO +1 -1
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/package.json +1 -1
- {minima_cli-0.7.0 → minima_cli-0.7.1}/pyproject.toml +1 -1
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/auth.py +26 -2
- minima_cli-0.7.1/src/minima/catalog/data/capability_priors.json +330 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/decisionlog.py +4 -1
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/engine.py +18 -8
- minima_cli-0.7.1/src/minima/version.py +9 -0
- minima_cli-0.7.1/tests/integration/test_auth.py +58 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_recommend_api.py +43 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_decisionlog.py +21 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_records_catalog.py +27 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/uv.lock +1 -1
- minima_cli-0.7.0/src/minima/catalog/data/capability_priors.json +0 -210
- minima_cli-0.7.0/src/minima/version.py +0 -3
- {minima_cli-0.7.0 → minima_cli-0.7.1}/.dockerignore +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/.env.example +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/.github/workflows/prod.yml +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/.github/workflows/release-cli.yml +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/.github/workflows/staging.yml +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/.gitignore +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/AGENTS.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/Dockerfile +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/LICENSE +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/Makefile +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/README.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/client_sdk/minima_client/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/client_sdk/minima_client/autocapture.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/client_sdk/minima_client/client.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/client_sdk/minima_client/errors.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/README.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/agent-core-architecture.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/agent-core-implementation-plan.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/api-reference.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/client-sdk.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/concepts.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/configuration.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/examples.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/getting-started.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/goals-feature-plan.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/harness.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/multi-tenancy.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/operations.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/publishing.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs/seeding.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/.dockerignore +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/Dockerfile +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Accordion.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Badge.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Card.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/CardGroup.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Frame.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Note.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/PageHeader.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Steps.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/Tabs.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/index.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/components/sidebar.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/netlify.toml +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/nginx.conf +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/package-lock.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/package.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/api-reference/endpoints.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/cli.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/configuration.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/installation.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/interactive.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/overview.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/routing.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/sessions.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/tools.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/harness/troubleshooting.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/index.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/sdk/client-sdk.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/sdk/concepts.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/sdk/examples.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/pages/sdk/getting-started.mdx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/public/images/favicon.png +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/public/images/logo-dark.svg +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/public/images/logo-light.svg +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/public/styles/global.css +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/tsconfig.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/docs-site/vocs.config.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/01_quickstart.sh +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/02_recommend_and_feedback.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/03_constraints_and_tradeoff.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/04_workflow.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/05_autocapture.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/06_routed_llm_call.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/07_multitenant_admin.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/README.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_escalation.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_escalation_learn.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_gemini.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_retention.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_warmup.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/agent_warmup_vary.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/metrics_demo.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/examples/smoke_test.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/maybe.js +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/maybe.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/.gitignore +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/README.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/biome.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/bun.lock +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/scripts/build-all.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/scripts/build.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/scripts/install.sh +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/scripts/stub-devtools.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/agent.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/events.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/index.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/loop.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/state.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/agent/tools.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/compat.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/events.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/index.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/provider_catalog.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/provider_quirks.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/_common.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/anthropic.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/base.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/faux.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/google.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/index.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/providers/openai_compat.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/registry.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/stream.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/types.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/ai/usage.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/cli/main.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/db/metrics.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/db/minima_db.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/db/rehydrate.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/db/sink.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/errtext.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/index.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/budget.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/catalog.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/client.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/config.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/errors.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/index.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/judge.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/mapping.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/memory.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/meter.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/mubit_memory_factory.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/router.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/runtime.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/schemas.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/minima/spawn.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/run_modes.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/session/index.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/session/store.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/_io.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/at_mentions.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/bash.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/builtin.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/edit.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/glob.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/grep.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/index.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/ls.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/read.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/schema.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/task.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/todowrite.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/types.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/web_fetch.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tools/write.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/app.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/auth.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/child_tree.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/compact.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/config_store.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/context.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/layout.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/messages.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/model-picker.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/mouse-scroll.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/permissions.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/projects.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/routing-warnings.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/status.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/tui/text-input.tsx +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/types.d.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/src/version.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/agent.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/ai.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/anthropic.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/auth.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/budget.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/candidate-filter.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/catalog.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/client.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/config_store.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/db.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/effort.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/error-ux.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/google.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/isolation.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/judge.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/ladder.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/layout.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/memory.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/minima.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/minima_memory.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/openai_compat.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/run_modes.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/session.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/spawn.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/task.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/thinking.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tests/tools.test.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packages/tui/tsconfig.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packaging/homebrew/README.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/packaging/homebrew/render_formula.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/recall_debug.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/strategies_run1.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/strategies_run2.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/strategies_run3.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_125009/tasks.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/REPORT.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/recall_debug.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run1.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run2.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run3.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run4.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/strategies_run5.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/summary.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_130252/tasks.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_182838/recall_debug.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_182838/strategies_run1.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_182838/strategies_run2.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_182838/tasks.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/REPORT.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/memory_audit.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/recall_debug.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run1.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run2.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run3.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run4.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/strategies_run5.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/summary.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260612_183343/tasks.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/REPORT.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/memory_audit.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/recall_debug.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run1.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run2.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run3.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run4.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/strategies_run5.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/summary.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260615_101732/tasks.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260624_103307/memory_audit.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260624_103307/recall_debug.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/20260624_103307/tasks.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_133108/cold_probe.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_133108/summary.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_133108/tasks.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_134209/REPORT.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_134209/cold_probe.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_134209/summary.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalate_20260615_134209/tasks.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalation_20260612_201825/REPORT.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalation_20260612_201825/results.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/escalation_20260612_201825/summary.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/_manifest.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/calibration.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/feedback.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/health.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/models.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/recommend.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/savings.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/strategies.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/playground_p1/workflow.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/retention_20260612_201828/REPORT.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/retention_20260612_201828/results.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/retention_20260612_201828/summary.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/warmupvary_20260615_123818/REPORT.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/warmupvary_20260615_123818/summary.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/runs/warmupvary_20260615_123818/tasks.jsonl +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/eval/classify_dataset.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/eval/eval_classify.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/test-routing-web.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/test-routing.sh +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/scripts/test-routing.ts +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/errors.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/calibration.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/capabilities.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/feedback.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/health.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/models.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/recommend.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/savings.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/api/routers/strategies.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/data/model_aliases.json +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/merge.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/refresh.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/sources/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/sources/litellm.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/sources/openrouter.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/catalog/store.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/config.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/deps.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/anthropic.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/base.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/gemini.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/llm/registry.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/logging.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/main.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/adapter.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/keys.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/records.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/memory/threadpool.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/metrics/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/metrics/calibration.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/metrics/report.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/metrics/savings.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/_pg_pool.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/_redis_client.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/aggregate.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/classify.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/durablerefs.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/escalation.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/propensity.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/recstore.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/score.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/recommender/types.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/capabilities.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/common.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/feedback.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/models_catalog.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/recommend.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/savings.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/strategies.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/schemas/workflow.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/items.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/llmrouterbench.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/routerbench.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/run_seed.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/seeding/synthetic.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/tenancy/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/tenancy/context.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/src/minima/tenancy/passthrough.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/conftest.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/BENCHMARKS.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/CRITERIA.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/RESULTS.md +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/__init__.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/harness.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/llmrouterbench_config.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/prompt_length_benchmark.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/test_llmrouterbench_savings.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/eval/test_routerbench_savings.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/factories.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_escalation_reasoner.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_feedback_loop.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_lesson_promotion.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_measurement_api.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_observed_cost_ranking.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_strategies_api.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/integration/test_workflow_models_health.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_cost_savings_spotcheck_live.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_escalation_fixes.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_full_surface_live.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_mubit_roundtrip.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_phase3_live.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_reasoner_live.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/live/test_recall_params_live.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_aggregate.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_aggregate_decay.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_autocapture.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_calibration_fit.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_capabilities.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_classify_benchmark.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_classify_keys.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_cluster.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_collapse_guard.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_cost_band.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_escalation.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_exploration.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_ipw.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_iterations.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_latency_quality.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_lever_cost.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_metrics.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_metrics_demo.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_neighbor_classify.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_prompt_length_benchmark.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_reasoner.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_recstore_sqlite.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_score.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_shadow_bandit.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_store_backends.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_strategies.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_tenancy.py +0 -0
- {minima_cli-0.7.0 → minima_cli-0.7.1}/tests/unit/test_thompson.py +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
name: Catalog — refresh vendored snapshot
|
|
2
|
+
|
|
3
|
+
# Keeps the vendored cold-start model catalog fresh so it stops drifting by hand.
|
|
4
|
+
#
|
|
5
|
+
# WHAT/WHY: src/minima/catalog/data/capability_priors.json is the cold-start
|
|
6
|
+
# fallback the server loads when the live cost feed (LiteLLM/OpenRouter) is
|
|
7
|
+
# unreachable — see src/minima/catalog/store.py (load_snapshot_cards) and the
|
|
8
|
+
# /v1/models router. It used to be hand-maintained and drifted stale (e.g.
|
|
9
|
+
# missing the gpt-5 family). This job pulls the *live* served catalog from
|
|
10
|
+
# api.minima.sh/v1/models — the source-of-truth that already merges curated
|
|
11
|
+
# capability priors with live cost — normalizes it (via jq) into the EXACT
|
|
12
|
+
# shape the loader reads, and opens a PR only when it actually changed.
|
|
13
|
+
#
|
|
14
|
+
# We deliberately DO NOT commit straight to main and DO NOT hand-edit the JSON:
|
|
15
|
+
# a reviewer sees the diff, and the automation (not a human) keeps it current.
|
|
16
|
+
on:
|
|
17
|
+
schedule:
|
|
18
|
+
- cron: "17 6 * * *" # daily (~every 24h); minute offset avoids the top-of-hour rush
|
|
19
|
+
workflow_dispatch: {}
|
|
20
|
+
|
|
21
|
+
concurrency:
|
|
22
|
+
group: catalog-snapshot
|
|
23
|
+
cancel-in-progress: false
|
|
24
|
+
|
|
25
|
+
# Least privilege: only what's needed to push a chore branch and open a PR.
|
|
26
|
+
permissions:
|
|
27
|
+
contents: write
|
|
28
|
+
pull-requests: write
|
|
29
|
+
|
|
30
|
+
env:
|
|
31
|
+
# Source-of-truth: the live served catalog. Override via repo/environment var
|
|
32
|
+
# CATALOG_SOURCE_URL if the prod host ever changes.
|
|
33
|
+
CATALOG_URL: ${{ vars.CATALOG_SOURCE_URL || 'https://api.minima.sh/v1/models' }}
|
|
34
|
+
SNAPSHOT_PATH: src/minima/catalog/data/capability_priors.json
|
|
35
|
+
BRANCH: chore/catalog-snapshot-auto
|
|
36
|
+
|
|
37
|
+
jobs:
|
|
38
|
+
refresh:
|
|
39
|
+
name: Fetch live catalog → PR if changed
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
steps:
|
|
42
|
+
- name: Checkout
|
|
43
|
+
uses: actions/checkout@v5
|
|
44
|
+
|
|
45
|
+
- name: Fetch + normalize live catalog into the vendored snapshot shape
|
|
46
|
+
run: |
|
|
47
|
+
set -euo pipefail
|
|
48
|
+
# /v1/models returns {models:[ModelCard...], catalog_version, stale}.
|
|
49
|
+
# ModelCard is a superset of the snapshot object, so we project it back
|
|
50
|
+
# to the exact fields load_snapshot_cards() reads and drop the runtime
|
|
51
|
+
# metadata (cost_source/cost_fetched_at/cost_stale/capability_source),
|
|
52
|
+
# which the loader always re-stamps as "fallback-snapshot".
|
|
53
|
+
curl -fsSL --retry 3 --retry-delay 5 --max-time 60 "$CATALOG_URL" -o live.json
|
|
54
|
+
|
|
55
|
+
count="$(jq '.models | length' live.json)"
|
|
56
|
+
if [ "$count" -lt 5 ]; then
|
|
57
|
+
echo "::error::live catalog returned only $count models (<5); refusing to overwrite snapshot"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
version="fallback-snapshot-$(date -u +%Y-%m)"
|
|
62
|
+
note="Cold-start fallback only. Auto-refreshed by .github/workflows/catalog-snapshot.yml from the live /v1/models catalog — do not hand-edit. Live cost is overlaid from LiteLLM/OpenRouter at runtime; capability_by_task_type are normalized [0,1] heuristic priors, corrected by accumulated memory. Prices are approximate USD per million tokens."
|
|
63
|
+
|
|
64
|
+
jq \
|
|
65
|
+
--arg version "$version" \
|
|
66
|
+
--arg note "$note" '{
|
|
67
|
+
version: $version,
|
|
68
|
+
note: $note,
|
|
69
|
+
models: (.models | sort_by(.model_id) | map({
|
|
70
|
+
model_id, provider, display_name,
|
|
71
|
+
input_cost_per_mtok, output_cost_per_mtok, cache_read_cost_per_mtok,
|
|
72
|
+
supports_prompt_caching, context_window, max_output_tokens,
|
|
73
|
+
capability_priors, capability_by_task_type
|
|
74
|
+
}))
|
|
75
|
+
}' live.json > "$SNAPSHOT_PATH.tmp"
|
|
76
|
+
mv "$SNAPSHOT_PATH.tmp" "$SNAPSHOT_PATH"
|
|
77
|
+
rm -f live.json
|
|
78
|
+
echo "Normalized $count models into $SNAPSHOT_PATH"
|
|
79
|
+
|
|
80
|
+
- name: Commit + open PR only if the snapshot changed
|
|
81
|
+
env:
|
|
82
|
+
GH_TOKEN: ${{ github.token }}
|
|
83
|
+
run: |
|
|
84
|
+
set -euo pipefail
|
|
85
|
+
if git diff --quiet -- "$SNAPSHOT_PATH"; then
|
|
86
|
+
echo "Snapshot already up to date; nothing to do."
|
|
87
|
+
exit 0
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
git config user.name "github-actions[bot]"
|
|
91
|
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
92
|
+
git checkout -B "$BRANCH"
|
|
93
|
+
git add "$SNAPSHOT_PATH"
|
|
94
|
+
git commit -m "chore(catalog): refresh vendored model snapshot from live /v1/models"
|
|
95
|
+
git push -u origin "$BRANCH" --force-with-lease
|
|
96
|
+
|
|
97
|
+
gh pr create --base main --head "$BRANCH" \
|
|
98
|
+
--title "chore(catalog): refresh vendored model snapshot" \
|
|
99
|
+
--body "Automated refresh of \`$SNAPSHOT_PATH\` from the live catalog at \`$CATALOG_URL\` (normalized to the loader's shape). Opened by \`.github/workflows/catalog-snapshot.yml\`. Review the diff — this is the cold-start fallback the server serves when the live cost feed is unreachable." \
|
|
100
|
+
|| echo "PR already open for $BRANCH; pushed update."
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
name: CI — PR checks
|
|
2
|
+
|
|
3
|
+
# Gate on every PR to main (and on push to main) with the exact local test
|
|
4
|
+
# conventions: server (ruff + offline pytest) and TUI (bun test + tsc). Two
|
|
5
|
+
# independent jobs so a red on one surfaces without masking the other. No
|
|
6
|
+
# deploy, no secrets — the suites are offline (`-m "not live and not eval"`).
|
|
7
|
+
# mypy runs after ruff/pytest: src/minima is now type-clean, so it gates too.
|
|
8
|
+
on:
|
|
9
|
+
pull_request:
|
|
10
|
+
branches: [main]
|
|
11
|
+
push:
|
|
12
|
+
branches: [main]
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: ci-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
|
|
21
|
+
env:
|
|
22
|
+
BUN_VERSION: "1.3.14"
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
server:
|
|
26
|
+
name: Server — ruff + pytest + mypy
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
steps:
|
|
29
|
+
- name: Checkout
|
|
30
|
+
uses: actions/checkout@v5
|
|
31
|
+
|
|
32
|
+
- name: Install uv
|
|
33
|
+
uses: astral-sh/setup-uv@v6
|
|
34
|
+
|
|
35
|
+
- name: Sync deps (dev extra)
|
|
36
|
+
run: uv sync --extra dev
|
|
37
|
+
|
|
38
|
+
- name: Ruff
|
|
39
|
+
run: uv run ruff check src client_sdk tests
|
|
40
|
+
|
|
41
|
+
- name: Pytest (offline)
|
|
42
|
+
run: uv run pytest -m "not live and not eval" -q
|
|
43
|
+
|
|
44
|
+
- name: Mypy
|
|
45
|
+
run: uv run mypy src/minima
|
|
46
|
+
|
|
47
|
+
tui:
|
|
48
|
+
name: TUI — bun test + tsc
|
|
49
|
+
runs-on: ubuntu-latest
|
|
50
|
+
defaults:
|
|
51
|
+
run:
|
|
52
|
+
working-directory: packages/tui
|
|
53
|
+
steps:
|
|
54
|
+
- name: Checkout
|
|
55
|
+
uses: actions/checkout@v5
|
|
56
|
+
|
|
57
|
+
- name: Set up Bun
|
|
58
|
+
uses: oven-sh/setup-bun@v2
|
|
59
|
+
with:
|
|
60
|
+
bun-version: ${{ env.BUN_VERSION }}
|
|
61
|
+
|
|
62
|
+
- name: Install deps
|
|
63
|
+
run: bun install --frozen-lockfile
|
|
64
|
+
|
|
65
|
+
- name: Test
|
|
66
|
+
run: bun test
|
|
67
|
+
|
|
68
|
+
- name: Typecheck
|
|
69
|
+
run: bun run check
|
|
@@ -4,6 +4,37 @@ All notable changes to Minima are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/), and the project aims to follow
|
|
5
5
|
[Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [0.7.1] - 2026-07-05
|
|
8
|
+
|
|
9
|
+
### Changed (API behavior — note for integrators)
|
|
10
|
+
- **`max_cost_per_call` is now a true hard filter.** When no model fits the budget,
|
|
11
|
+
`POST /v1/recommend` returns **422** (`"no model within max_cost_per_call budget"`)
|
|
12
|
+
instead of 200 with the cheapest over-budget model plus a `no_model_within_cost_budget`
|
|
13
|
+
warning. This matches the documented "hard filter" contract and the existing
|
|
14
|
+
no-candidates behavior. Callers who want "cheapest possible regardless of ceiling"
|
|
15
|
+
should use the cost-quality slider, not `max_cost_per_call`.
|
|
16
|
+
- **Auth rejects malformed bearer tokens.** A bearer token that is not in the Mubit key
|
|
17
|
+
format (`mbt_…`) now returns **401** before any work, instead of being accepted and
|
|
18
|
+
served from priors. A missing bearer with a server-configured `MUBIT_API_KEY` fallback
|
|
19
|
+
is unaffected.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- **Cold-start catalog prices were stale.** The vendored fallback snapshot
|
|
23
|
+
(`capability_priors.json`) is refreshed from the live catalog (e.g. `claude-opus-4-8`
|
|
24
|
+
`15/75` → `5/25`), and a scheduled workflow now keeps it current so it stops drifting
|
|
25
|
+
by hand. (The auto-refresh updates prices for the curated model list; it does not add
|
|
26
|
+
new models — expanded provider coverage such as the gpt-5 family remains a separate
|
|
27
|
+
curation.)
|
|
28
|
+
- **Server version string can no longer drift.** `minima.__version__` (reported by
|
|
29
|
+
`/v1/health` and `/v1/capabilities`) now derives from installed package metadata instead
|
|
30
|
+
of a hardcoded constant that had silently lagged across releases.
|
|
31
|
+
- **Feedback reconciliation types the quality value honestly** as `float | None` — unjudged
|
|
32
|
+
rows keep `NULL`, no fabricated default (preserves the M-J2 fix).
|
|
33
|
+
|
|
34
|
+
### Internal
|
|
35
|
+
- **PR CI added** — every PR now runs server (`ruff` + `pytest` + `mypy`) and TUI
|
|
36
|
+
(`bun test` + `tsc`) checks; the recommender is mypy-clean.
|
|
37
|
+
|
|
7
38
|
## [0.7.0] - 2026-07-05
|
|
8
39
|
|
|
9
40
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: minima-cli
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.1
|
|
4
4
|
Summary: Minima CLI: cost-aware LLM model routing — recommend cheaper models, backed by Mubit memory.
|
|
5
5
|
Project-URL: Homepage, https://docs.minima.sh
|
|
6
6
|
Project-URL: Documentation, https://docs.minima.sh
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "minima-tui",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Minima harness + TUI — the `minima` CLI (TypeScript/Ink; successor to the removed Python harness). Talks to the Python FastAPI recommender service over the /v1/* contract.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "FSL-1.1-Apache-2.0",
|
|
@@ -7,7 +7,7 @@ build-backend = "hatchling.build"
|
|
|
7
7
|
# package stays `minima`. This package ships the server + client SDK only; the `minima` CLI
|
|
8
8
|
# is the TypeScript binary installed via Homebrew (brew tap mubit-ai/minima).
|
|
9
9
|
name = "minima-cli"
|
|
10
|
-
version = "0.7.
|
|
10
|
+
version = "0.7.1"
|
|
11
11
|
description = "Minima CLI: cost-aware LLM model routing — recommend cheaper models, backed by Mubit memory."
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
requires-python = ">=3.11"
|
|
@@ -20,6 +20,20 @@ def bearer_key(request: Request) -> str | None:
|
|
|
20
20
|
return None
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
def is_mubit_key_format(key: str) -> bool:
|
|
24
|
+
"""Cheap client-side shape check for a canonical Mubit key.
|
|
25
|
+
|
|
26
|
+
Canonical keys are ``mbt_<instance>_...`` (see tenancy.passthrough._org_id). This is
|
|
27
|
+
a front-door format gate only — it rejects tokens that clearly are not Mubit keys
|
|
28
|
+
(e.g. ``not-a-key``) before any work is done, without a Mubit round-trip. It does NOT
|
|
29
|
+
authenticate the key; a well-formed key still resolves normally (and works offline
|
|
30
|
+
from local priors). Kept deliberately permissive to avoid locking out real callers:
|
|
31
|
+
the only requirement is an ``mbt_`` prefix followed by a non-empty instance segment.
|
|
32
|
+
"""
|
|
33
|
+
prefix, sep, rest = key.partition("_")
|
|
34
|
+
return prefix == "mbt" and sep == "_" and bool(rest)
|
|
35
|
+
|
|
36
|
+
|
|
23
37
|
def configured_key(request: Request) -> str | None:
|
|
24
38
|
settings = getattr(request.app.state, "settings", None)
|
|
25
39
|
key = getattr(settings, "mubit_api_key", None)
|
|
@@ -27,7 +41,14 @@ def configured_key(request: Request) -> str | None:
|
|
|
27
41
|
|
|
28
42
|
|
|
29
43
|
async def get_tenant(request: Request) -> TenantContext:
|
|
30
|
-
|
|
44
|
+
token = bearer_key(request)
|
|
45
|
+
if token is not None and not is_mubit_key_format(token):
|
|
46
|
+
raise ApiError(
|
|
47
|
+
401,
|
|
48
|
+
"Unauthorized",
|
|
49
|
+
"Authorization bearer token is not a valid Mubit API key (expected 'mbt_...' format)",
|
|
50
|
+
)
|
|
51
|
+
key = token or configured_key(request)
|
|
31
52
|
if not key:
|
|
32
53
|
raise ApiError(
|
|
33
54
|
401,
|
|
@@ -39,7 +60,10 @@ async def get_tenant(request: Request) -> TenantContext:
|
|
|
39
60
|
|
|
40
61
|
async def get_tenant_optional(request: Request) -> TenantContext | None:
|
|
41
62
|
"""Like get_tenant but returns None instead of 401 (for health probes)."""
|
|
42
|
-
|
|
63
|
+
token = bearer_key(request)
|
|
64
|
+
if token is not None and not is_mubit_key_format(token):
|
|
65
|
+
return None
|
|
66
|
+
key = token or configured_key(request)
|
|
43
67
|
if not key:
|
|
44
68
|
return None
|
|
45
69
|
return request.app.state.passthrough_runtime.resolve(key)
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "fallback-snapshot-2026-07",
|
|
3
|
+
"note": "Cold-start fallback only.",
|
|
4
|
+
"models": [
|
|
5
|
+
{
|
|
6
|
+
"model_id": "claude-haiku-4-5",
|
|
7
|
+
"provider": "anthropic",
|
|
8
|
+
"display_name": "Claude Haiku 4.5",
|
|
9
|
+
"input_cost_per_mtok": 1.0,
|
|
10
|
+
"output_cost_per_mtok": 5.0,
|
|
11
|
+
"cache_read_cost_per_mtok": 0.09999999999999999,
|
|
12
|
+
"supports_prompt_caching": true,
|
|
13
|
+
"context_window": 200000,
|
|
14
|
+
"max_output_tokens": 64000,
|
|
15
|
+
"capability_priors": {
|
|
16
|
+
"intelligence_index": 0.5
|
|
17
|
+
},
|
|
18
|
+
"capability_by_task_type": {
|
|
19
|
+
"code": 0.7,
|
|
20
|
+
"summarization": 0.85,
|
|
21
|
+
"extraction": 0.88,
|
|
22
|
+
"qa": 0.8,
|
|
23
|
+
"reasoning": 0.6,
|
|
24
|
+
"classification": 0.9,
|
|
25
|
+
"translation": 0.85,
|
|
26
|
+
"creative": 0.75,
|
|
27
|
+
"rag": 0.82,
|
|
28
|
+
"tool_use": 0.75,
|
|
29
|
+
"other": 0.72
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"model_id": "claude-opus-4-8",
|
|
34
|
+
"provider": "anthropic",
|
|
35
|
+
"display_name": "Claude Opus 4.8",
|
|
36
|
+
"input_cost_per_mtok": 5.0,
|
|
37
|
+
"output_cost_per_mtok": 25.0,
|
|
38
|
+
"cache_read_cost_per_mtok": 0.5,
|
|
39
|
+
"supports_prompt_caching": true,
|
|
40
|
+
"context_window": 1000000,
|
|
41
|
+
"max_output_tokens": 64000,
|
|
42
|
+
"capability_priors": {
|
|
43
|
+
"intelligence_index": 0.95
|
|
44
|
+
},
|
|
45
|
+
"capability_by_task_type": {
|
|
46
|
+
"code": 0.96,
|
|
47
|
+
"summarization": 0.93,
|
|
48
|
+
"extraction": 0.94,
|
|
49
|
+
"qa": 0.95,
|
|
50
|
+
"reasoning": 0.97,
|
|
51
|
+
"classification": 0.95,
|
|
52
|
+
"translation": 0.93,
|
|
53
|
+
"creative": 0.94,
|
|
54
|
+
"rag": 0.94,
|
|
55
|
+
"tool_use": 0.95,
|
|
56
|
+
"other": 0.93
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"model_id": "claude-sonnet-4-6",
|
|
61
|
+
"provider": "anthropic",
|
|
62
|
+
"display_name": "Claude Sonnet 4.6",
|
|
63
|
+
"input_cost_per_mtok": 3.0,
|
|
64
|
+
"output_cost_per_mtok": 15.0,
|
|
65
|
+
"cache_read_cost_per_mtok": 0.3,
|
|
66
|
+
"supports_prompt_caching": true,
|
|
67
|
+
"context_window": 1000000,
|
|
68
|
+
"max_output_tokens": 64000,
|
|
69
|
+
"capability_priors": {
|
|
70
|
+
"intelligence_index": 0.72
|
|
71
|
+
},
|
|
72
|
+
"capability_by_task_type": {
|
|
73
|
+
"code": 0.88,
|
|
74
|
+
"summarization": 0.9,
|
|
75
|
+
"extraction": 0.92,
|
|
76
|
+
"qa": 0.9,
|
|
77
|
+
"reasoning": 0.85,
|
|
78
|
+
"classification": 0.93,
|
|
79
|
+
"translation": 0.9,
|
|
80
|
+
"creative": 0.88,
|
|
81
|
+
"rag": 0.9,
|
|
82
|
+
"tool_use": 0.9,
|
|
83
|
+
"other": 0.86
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"model_id": "gemini-2.5-flash",
|
|
88
|
+
"provider": "google",
|
|
89
|
+
"display_name": "Gemini 2.5 Flash",
|
|
90
|
+
"input_cost_per_mtok": 0.3,
|
|
91
|
+
"output_cost_per_mtok": 2.5,
|
|
92
|
+
"cache_read_cost_per_mtok": 0.03,
|
|
93
|
+
"supports_prompt_caching": true,
|
|
94
|
+
"context_window": 1048576,
|
|
95
|
+
"max_output_tokens": 65536,
|
|
96
|
+
"capability_priors": {
|
|
97
|
+
"intelligence_index": 0.55
|
|
98
|
+
},
|
|
99
|
+
"capability_by_task_type": {
|
|
100
|
+
"code": 0.74,
|
|
101
|
+
"summarization": 0.88,
|
|
102
|
+
"extraction": 0.88,
|
|
103
|
+
"qa": 0.82,
|
|
104
|
+
"reasoning": 0.66,
|
|
105
|
+
"classification": 0.9,
|
|
106
|
+
"translation": 0.88,
|
|
107
|
+
"creative": 0.78,
|
|
108
|
+
"rag": 0.86,
|
|
109
|
+
"tool_use": 0.8,
|
|
110
|
+
"other": 0.76
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"model_id": "gemini-2.5-flash-lite",
|
|
115
|
+
"provider": "google",
|
|
116
|
+
"display_name": "Gemini 2.5 Flash-Lite",
|
|
117
|
+
"input_cost_per_mtok": 0.09999999999999999,
|
|
118
|
+
"output_cost_per_mtok": 0.39999999999999997,
|
|
119
|
+
"cache_read_cost_per_mtok": 0.01,
|
|
120
|
+
"supports_prompt_caching": true,
|
|
121
|
+
"context_window": 1048576,
|
|
122
|
+
"max_output_tokens": 65536,
|
|
123
|
+
"capability_priors": {
|
|
124
|
+
"intelligence_index": 0.4
|
|
125
|
+
},
|
|
126
|
+
"capability_by_task_type": {
|
|
127
|
+
"code": 0.62,
|
|
128
|
+
"summarization": 0.8,
|
|
129
|
+
"extraction": 0.84,
|
|
130
|
+
"qa": 0.74,
|
|
131
|
+
"reasoning": 0.5,
|
|
132
|
+
"classification": 0.86,
|
|
133
|
+
"translation": 0.82,
|
|
134
|
+
"creative": 0.68,
|
|
135
|
+
"rag": 0.78,
|
|
136
|
+
"tool_use": 0.68,
|
|
137
|
+
"other": 0.64
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"model_id": "gemini-2.5-pro",
|
|
142
|
+
"provider": "google",
|
|
143
|
+
"display_name": "Gemini 2.5 Pro",
|
|
144
|
+
"input_cost_per_mtok": 1.25,
|
|
145
|
+
"output_cost_per_mtok": 10.0,
|
|
146
|
+
"cache_read_cost_per_mtok": 0.125,
|
|
147
|
+
"supports_prompt_caching": true,
|
|
148
|
+
"context_window": 1048576,
|
|
149
|
+
"max_output_tokens": 65536,
|
|
150
|
+
"capability_priors": {
|
|
151
|
+
"intelligence_index": 0.8
|
|
152
|
+
},
|
|
153
|
+
"capability_by_task_type": {
|
|
154
|
+
"code": 0.9,
|
|
155
|
+
"summarization": 0.92,
|
|
156
|
+
"extraction": 0.92,
|
|
157
|
+
"qa": 0.91,
|
|
158
|
+
"reasoning": 0.88,
|
|
159
|
+
"classification": 0.93,
|
|
160
|
+
"translation": 0.92,
|
|
161
|
+
"creative": 0.89,
|
|
162
|
+
"rag": 0.91,
|
|
163
|
+
"tool_use": 0.9,
|
|
164
|
+
"other": 0.88
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"model_id": "gemini-3-flash-preview",
|
|
169
|
+
"provider": "google",
|
|
170
|
+
"display_name": "Gemini 3 Flash (Preview)",
|
|
171
|
+
"input_cost_per_mtok": 0.5,
|
|
172
|
+
"output_cost_per_mtok": 3.0,
|
|
173
|
+
"cache_read_cost_per_mtok": 0.049999999999999996,
|
|
174
|
+
"supports_prompt_caching": true,
|
|
175
|
+
"context_window": 1048576,
|
|
176
|
+
"max_output_tokens": 65536,
|
|
177
|
+
"capability_priors": {
|
|
178
|
+
"intelligence_index": 0.62
|
|
179
|
+
},
|
|
180
|
+
"capability_by_task_type": {
|
|
181
|
+
"code": 0.8,
|
|
182
|
+
"summarization": 0.87,
|
|
183
|
+
"extraction": 0.88,
|
|
184
|
+
"qa": 0.83,
|
|
185
|
+
"reasoning": 0.7,
|
|
186
|
+
"classification": 0.9,
|
|
187
|
+
"translation": 0.87,
|
|
188
|
+
"creative": 0.8,
|
|
189
|
+
"rag": 0.85,
|
|
190
|
+
"tool_use": 0.84,
|
|
191
|
+
"other": 0.78
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"model_id": "gemini-3.1-flash-lite",
|
|
196
|
+
"provider": "google",
|
|
197
|
+
"display_name": "Gemini 3.1 Flash-Lite",
|
|
198
|
+
"input_cost_per_mtok": 0.25,
|
|
199
|
+
"output_cost_per_mtok": 1.5,
|
|
200
|
+
"cache_read_cost_per_mtok": 0.024999999999999998,
|
|
201
|
+
"supports_prompt_caching": true,
|
|
202
|
+
"context_window": 1048576,
|
|
203
|
+
"max_output_tokens": 65536,
|
|
204
|
+
"capability_priors": {
|
|
205
|
+
"intelligence_index": 0.48
|
|
206
|
+
},
|
|
207
|
+
"capability_by_task_type": {
|
|
208
|
+
"code": 0.68,
|
|
209
|
+
"summarization": 0.83,
|
|
210
|
+
"extraction": 0.86,
|
|
211
|
+
"qa": 0.78,
|
|
212
|
+
"reasoning": 0.58,
|
|
213
|
+
"classification": 0.88,
|
|
214
|
+
"translation": 0.84,
|
|
215
|
+
"creative": 0.72,
|
|
216
|
+
"rag": 0.8,
|
|
217
|
+
"tool_use": 0.72,
|
|
218
|
+
"other": 0.68
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"model_id": "gemini-3.1-pro-preview",
|
|
223
|
+
"provider": "google",
|
|
224
|
+
"display_name": "Gemini 3.1 Pro (Preview)",
|
|
225
|
+
"input_cost_per_mtok": 2.0,
|
|
226
|
+
"output_cost_per_mtok": 12.0,
|
|
227
|
+
"cache_read_cost_per_mtok": 0.19999999999999998,
|
|
228
|
+
"supports_prompt_caching": true,
|
|
229
|
+
"context_window": 1048576,
|
|
230
|
+
"max_output_tokens": 65536,
|
|
231
|
+
"capability_priors": {
|
|
232
|
+
"intelligence_index": 0.9
|
|
233
|
+
},
|
|
234
|
+
"capability_by_task_type": {
|
|
235
|
+
"code": 0.93,
|
|
236
|
+
"summarization": 0.93,
|
|
237
|
+
"extraction": 0.93,
|
|
238
|
+
"qa": 0.93,
|
|
239
|
+
"reasoning": 0.95,
|
|
240
|
+
"classification": 0.94,
|
|
241
|
+
"translation": 0.93,
|
|
242
|
+
"creative": 0.91,
|
|
243
|
+
"rag": 0.93,
|
|
244
|
+
"tool_use": 0.92,
|
|
245
|
+
"other": 0.91
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"model_id": "gemini-3.5-flash",
|
|
250
|
+
"provider": "google",
|
|
251
|
+
"display_name": "Gemini 3.5 Flash",
|
|
252
|
+
"input_cost_per_mtok": 1.5,
|
|
253
|
+
"output_cost_per_mtok": 9.0,
|
|
254
|
+
"cache_read_cost_per_mtok": 0.15,
|
|
255
|
+
"supports_prompt_caching": true,
|
|
256
|
+
"context_window": 1048576,
|
|
257
|
+
"max_output_tokens": 65536,
|
|
258
|
+
"capability_priors": {
|
|
259
|
+
"intelligence_index": 0.65
|
|
260
|
+
},
|
|
261
|
+
"capability_by_task_type": {
|
|
262
|
+
"code": 0.85,
|
|
263
|
+
"summarization": 0.88,
|
|
264
|
+
"extraction": 0.9,
|
|
265
|
+
"qa": 0.84,
|
|
266
|
+
"reasoning": 0.72,
|
|
267
|
+
"classification": 0.91,
|
|
268
|
+
"translation": 0.88,
|
|
269
|
+
"creative": 0.82,
|
|
270
|
+
"rag": 0.87,
|
|
271
|
+
"tool_use": 0.88,
|
|
272
|
+
"other": 0.8
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"model_id": "gpt-4o",
|
|
277
|
+
"provider": "openai",
|
|
278
|
+
"display_name": "GPT-4o",
|
|
279
|
+
"input_cost_per_mtok": 2.5,
|
|
280
|
+
"output_cost_per_mtok": 10.0,
|
|
281
|
+
"cache_read_cost_per_mtok": 1.25,
|
|
282
|
+
"supports_prompt_caching": true,
|
|
283
|
+
"context_window": 128000,
|
|
284
|
+
"max_output_tokens": 16384,
|
|
285
|
+
"capability_priors": {
|
|
286
|
+
"intelligence_index": 0.7
|
|
287
|
+
},
|
|
288
|
+
"capability_by_task_type": {
|
|
289
|
+
"code": 0.85,
|
|
290
|
+
"summarization": 0.9,
|
|
291
|
+
"extraction": 0.9,
|
|
292
|
+
"qa": 0.89,
|
|
293
|
+
"reasoning": 0.82,
|
|
294
|
+
"classification": 0.92,
|
|
295
|
+
"translation": 0.9,
|
|
296
|
+
"creative": 0.87,
|
|
297
|
+
"rag": 0.89,
|
|
298
|
+
"tool_use": 0.89,
|
|
299
|
+
"other": 0.85
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"model_id": "gpt-4o-mini",
|
|
304
|
+
"provider": "openai",
|
|
305
|
+
"display_name": "GPT-4o mini",
|
|
306
|
+
"input_cost_per_mtok": 0.15,
|
|
307
|
+
"output_cost_per_mtok": 0.6,
|
|
308
|
+
"cache_read_cost_per_mtok": 0.075,
|
|
309
|
+
"supports_prompt_caching": true,
|
|
310
|
+
"context_window": 128000,
|
|
311
|
+
"max_output_tokens": 16384,
|
|
312
|
+
"capability_priors": {
|
|
313
|
+
"intelligence_index": 0.45
|
|
314
|
+
},
|
|
315
|
+
"capability_by_task_type": {
|
|
316
|
+
"code": 0.68,
|
|
317
|
+
"summarization": 0.84,
|
|
318
|
+
"extraction": 0.86,
|
|
319
|
+
"qa": 0.78,
|
|
320
|
+
"reasoning": 0.55,
|
|
321
|
+
"classification": 0.9,
|
|
322
|
+
"translation": 0.83,
|
|
323
|
+
"creative": 0.72,
|
|
324
|
+
"rag": 0.8,
|
|
325
|
+
"tool_use": 0.72,
|
|
326
|
+
"other": 0.7
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
]
|
|
330
|
+
}
|
|
@@ -119,7 +119,10 @@ class Reconciliation:
|
|
|
119
119
|
|
|
120
120
|
model_id: str
|
|
121
121
|
outcome: str
|
|
122
|
-
|
|
122
|
+
# None for UNJUDGED feedback (judged=False): never fabricate a quality for
|
|
123
|
+
# rows the harness didn't judge (M-J2). _apply stores it straight through to
|
|
124
|
+
# DecisionRecord.realized_quality, which is likewise `float | None` (NULL).
|
|
125
|
+
quality: float | None
|
|
123
126
|
cost_usd: float | None = None
|
|
124
127
|
latency_ms: int | None = None
|
|
125
128
|
ts: float = 0.0
|
|
@@ -108,11 +108,17 @@ class Recommender:
|
|
|
108
108
|
warnings: list[str] = []
|
|
109
109
|
|
|
110
110
|
classification = classify_details(req.task)
|
|
111
|
+
# classify_details always populates `profile`; bind it locally so the type
|
|
112
|
+
# checker sees a non-None ClassificationProfile (narrowing on the attribute
|
|
113
|
+
# is otherwise dropped across the awaits below). Mutations still apply to the
|
|
114
|
+
# same object, so behavior is unchanged.
|
|
115
|
+
class_profile = classification.profile
|
|
116
|
+
assert class_profile is not None
|
|
111
117
|
task_type = classification.task_type
|
|
112
118
|
difficulty = classification.difficulty
|
|
113
119
|
profile.mark("classify")
|
|
114
|
-
|
|
115
|
-
|
|
120
|
+
class_profile.final_task_type = task_type
|
|
121
|
+
class_profile.final_difficulty = difficulty
|
|
116
122
|
signature = (
|
|
117
123
|
salient_signature(req.task.task, settings.minima_cluster_signature_tokens)
|
|
118
124
|
if settings.minima_cluster_granularity.lower() == "fine"
|
|
@@ -152,16 +158,16 @@ class Recommender:
|
|
|
152
158
|
[(ev.record.task_type, ev.score) for ev in evidence if ev.record is not None]
|
|
153
159
|
)
|
|
154
160
|
if neighbor_estimate is not None:
|
|
155
|
-
|
|
156
|
-
|
|
161
|
+
class_profile.neighbor_support = neighbor_estimate.neighbor_support
|
|
162
|
+
class_profile.neighbor_count = neighbor_estimate.neighbor_count
|
|
157
163
|
if (
|
|
158
164
|
neighbor_estimate.task_type != task_type
|
|
159
|
-
and
|
|
165
|
+
and class_profile.caller_task_type is None
|
|
160
166
|
and task_type == TaskType.other
|
|
161
167
|
):
|
|
162
168
|
task_type = neighbor_estimate.task_type
|
|
163
|
-
|
|
164
|
-
|
|
169
|
+
class_profile.task_type_source = "neighbor_vote"
|
|
170
|
+
class_profile.final_task_type = task_type
|
|
165
171
|
cluster = task_cluster(task_type, difficulty, signature)
|
|
166
172
|
warnings.append("neighbor_classified")
|
|
167
173
|
profile.mark("neighbor_classify")
|
|
@@ -224,7 +230,11 @@ class Recommender:
|
|
|
224
230
|
if affordable:
|
|
225
231
|
scored = affordable
|
|
226
232
|
else:
|
|
227
|
-
|
|
233
|
+
# max_cost_per_call is a hard filter: if no model fits the budget the
|
|
234
|
+
# eligible set is empty, which is the same "nothing fits" condition as an
|
|
235
|
+
# impossible candidate/exclusion set — surface it as the same 422 instead
|
|
236
|
+
# of serving an over-budget model.
|
|
237
|
+
raise NoCandidatesError("no model within max_cost_per_call budget")
|
|
228
238
|
|
|
229
239
|
if req.constraints.max_latency_ms is not None:
|
|
230
240
|
# Only exclude candidates with OBSERVED latency evidence above the budget —
|