Prioritize Modal and rename Kimi provider to Moonshot - #695
Conversation
Render Modal with the theme color and replace the legacy OpenRouter mark with the current 2026 brand glyph.
There was a problem hiding this comment.
Claude Code Review
Claude Code Review is paused for this repository. To reconnect it, an admin of this repository's GitHub organization (or the account owner, for personal repositories) who can also manage your Claude organization's Code Review settings needs to re-link GitHub in Code Review settings. This is a one-time step.
Tip: disable this comment in your organization's Code Review settings.
There was a problem hiding this comment.
🟢 Ready to approve
The provider-id rename and Modal-priority change are applied consistently across code/docs/tests, and the PR includes extensive passing test coverage plus updated snapshots.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Pull request overview
This pull request updates Fabro’s model/provider catalog and related selection logic to (1) rename the canonical Kimi provider ID from kimi to moonshot (displayed as “Moonshot AI”) and (2) prioritize Modal as the preferred offering for kimi-k3 when available, while keeping Kimi model IDs and KIMI_API_KEY unchanged across the stack.
Changes:
- Renamed provider identity throughout Rust code, tests, snapshots, and docs from
kimi→moonshot(provider display name: “Moonshot AI”). - Raised Modal provider priority so it wins
kimi-k3selection when eligible, with updated selection tests and fallback examples. - Refreshed provider icons (Modal monochrome; OpenRouter updated glyph) and aligned docs/changelog wording with the new provider identity.
File summaries
| File | Description |
|---|---|
| lib/foundation/fabro-model/src/ids.rs | Updates ProviderId JSON roundtrip test to moonshot. |
| lib/foundation/fabro-model/src/catalog/providers/moonshot.toml | Renames built-in provider key to [providers.moonshot] and sets display name “Moonshot AI”. |
| lib/foundation/fabro-model/src/catalog/providers/modal.toml | Increases Modal priority to prefer it in selection when eligible. |
| lib/foundation/fabro-model/src/catalog.rs | Updates catalog/provider assertions, selection tests, and snapshots to moonshot; asserts new Modal priority. |
| lib/foundation/fabro-model/src/billing.rs | Updates legacy-tag rejection test inputs to use moonshot. |
| lib/foundation/fabro-config/src/parse.rs | Updates config parsing tests for [llm.providers.moonshot]. |
| lib/foundation/fabro-config/src/layers/llm.rs | Updates docs/tests/examples to moonshot provider naming and sample alias. |
| lib/components/fabro-workflow/src/model_fallback.rs | Updates fallback-chain tests to use moonshot:kimi-k3 references. |
| lib/components/fabro-workflow/src/handler/llm/api.rs | Updates fallback policy test wiring to target moonshot. |
| lib/components/fabro-llm/tests/it/wire/snapshots/it__wire__anthropic__custom_named_stream_identity.snap | Updates provider identity snapshot from kimi to moonshot. |
| lib/components/fabro-llm/tests/it/wire/snapshots/it__wire__anthropic__custom_named_stream_error_identity.snap | Updates error identity text to “Server error from moonshot…”. |
| lib/components/fabro-llm/tests/it/wire/openai_compatible.rs | Updates adapter naming / provider_options namespace keys to moonshot. |
| lib/components/fabro-llm/tests/it/wire/anthropic.rs | Updates custom-named route tests/comments to Moonshot naming. |
| lib/components/fabro-llm/tests/integration.rs | Updates live Moonshot/Kimi integration to use adapter name moonshot. |
| lib/components/fabro-llm/src/providers/anthropic.rs | Updates comments and adapter name test for moonshot. |
| lib/components/fabro-llm/src/codec/openai_compatible/request.rs | Updates docs/tests for provider namespace key moonshot. |
| lib/components/fabro-llm/src/codec/openai_compatible/mod.rs | Updates codec module docs to list moonshot instead of kimi. |
| lib/components/fabro-llm/src/codec/mod.rs | Updates CodecCtx docs to reference moonshot namespace. |
| lib/components/fabro-llm/src/client.rs | Updates client/provider registration tests to moonshot. |
| lib/components/fabro-llm/src/adapter_registry.rs | Updates OpenAI-compatible adapter factory tests to moonshot. |
| lib/components/fabro-agent/tests/it/parity_matrix.rs | Updates provider matrix to use moonshot for Kimi models. |
| lib/components/fabro-agent/src/profiles/snapshots/fabro_agent__profiles__tests__openai_edit_file_prompt_snapshot.snap | Updates prompt snapshot branding to “Moonshot AI”. |
| lib/components/fabro-agent/src/profiles/snapshots/fabro_agent__profiles__tests__openai_edit_file_and_web_search_prompt_snapshot.snap | Updates prompt snapshot branding to “Moonshot AI”. |
| lib/components/fabro-agent/src/profiles/openai.rs | Updates profile tests to route via moonshot and assert “Moonshot AI” branding. |
| lib/components/fabro-agent/src/profiles/mod.rs | Updates test profile route provider id to moonshot. |
| lib/components/fabro-agent/src/profiles/kimi.rs | Updates Kimi profile default provider id to moonshot while keeping profile kind Kimi. |
| lib/components/fabro-agent/src/compaction.rs | Updates compaction budget test to use moonshot provider id. |
| lib/apps/fabro-server/tests/it/api/install.rs | Updates install API test helper and payloads to accept moonshot. |
| lib/apps/fabro-server/src/server/tests.rs | Updates server API tests to query/configure moonshot provider id. |
| lib/apps/fabro-server/src/run_manifest.rs | Updates run-manifest fallback checks and ready-provider test fixtures to moonshot. |
| lib/apps/fabro-cli/src/shared/provider_auth.rs | Updates CLI auth test provider list to include moonshot. |
| lib/apps/fabro-cli/src/commands/model.rs | Updates CLI model command test payload to moonshot. |
| lib/apps/fabro-cli/src/commands/install.rs | Updates CLI install command provider ID assertions to moonshot. |
| docs/public/reference/sdk.mdx | Updates env-var provider table to label KIMI_API_KEY as Moonshot AI. |
| docs/public/execution/run-configuration.mdx | Updates qualified fallback examples from kimi: to moonshot:. |
| docs/public/core-concepts/models.mdx | Updates model table + default-provider table to use provider moonshot. |
| docs/public/changelog/2026-07-22.mdx | Updates changelog wording to “direct Moonshot AI provider”. |
| docs/public/changelog/2026-02-28.mdx | Updates catalog-provider wording to “Moonshot AI”. |
| docs/public/administration/server-configuration.mdx | Updates secrets table to label KIMI_API_KEY as Moonshot AI. |
| apps/fabro-web/public/images/providers/openrouter.svg | Replaces OpenRouter icon with current official glyph. |
| apps/fabro-web/public/images/providers/moonshot.svg | Reformats Moonshot SVG for consistent attributes/styling. |
| apps/fabro-web/public/images/providers/modal.svg | Makes Modal icon monochrome via currentColor. |
Review details
- Files reviewed: 39/42 changed files
- Comments generated: 0
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
Keep KIMI_API_KEY as a legacy fallback for env and vault credentials.
There was a problem hiding this comment.
🟡 Not ready to approve
A few live/E2E tests and fixtures are still gated on or seeded with KIMI_API_KEY despite MOONSHOT_API_KEY being the new canonical credential, which will cause incorrect test execution expectations for Moonshot-only setups.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Suppressed comments (6)
lib/components/fabro-agent/tests/it/parity_matrix.rs:419
- This Moonshot web_fetch parity test is still gated on
KIMI_API_KEY. If someone configures onlyMOONSHOT_API_KEY(the new preferred name), the live test will be skipped even though the provider is configured correctly.
keys = ["KIMI_API_KEY", "OPENAI_API_KEY"]
lib/components/fabro-agent/tests/it/parity_matrix.rs:467
- This Moonshot web_search parity test is still gated on
KIMI_API_KEY; it should useMOONSHOT_API_KEYto match the renamed provider and preferred credential name.
keys = ["KIMI_API_KEY", "BRAVE_SEARCH_API_KEY"]
lib/components/fabro-agent/tests/it/parity_matrix.rs:524
- The non-OpenAI provider parity tests for Moonshot are still gated on
KIMI_API_KEY, which makes these tests depend on the legacy env var instead of the new canonicalMOONSHOT_API_KEY.
keys = ["KIMI_API_KEY"]
lib/components/fabro-llm/tests/integration.rs:181
- This live E2E test is still gated on
KIMI_API_KEYand readsEnvVars::KIMI_API_KEY, even though the provider identity is nowmoonshotand the catalog prefersMOONSHOT_API_KEY. Switching the test toMOONSHOT_API_KEYkeeps it aligned with the new canonical credential (runtime fallback toKIMI_API_KEYremains covered elsewhere).
lib/components/fabro-agent/tests/it/parity_matrix.rs:285 - Moonshot is now the canonical provider ID, but this parity-matrix test still requires
KIMI_API_KEYto run. That keeps the live test suite coupled to the legacy env var even thoughMOONSHOT_API_KEYis now preferred.
This issue also appears in the following locations of the same file:
- line 419
- line 467
- line 524
keys = ["KIMI_API_KEY"]
lib/apps/fabro-server/src/run_manifest.rs:1708
- This Moonshot fixture still seeds the vault with
EnvVars::KIMI_API_KEY. Given the provider has been renamed tomoonshotand the catalog now prefersMOONSHOT_API_KEY, usingEnvVars::MOONSHOT_API_KEYhere will keep the preflight readiness test aligned with the canonical secret name (while separate tests can cover the legacy fallback explicitly).
(EnvVars::KIMI_API_KEY, "test-moonshot-key"),
- Files reviewed: 44/47 changed files
- Comments generated: 0 new
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
…talog Resolve the model catalog table conflict in docs/public/core-concepts/models.mdx by keeping both changes: this branch's `kimi` -> `moonshot` provider rename for the Kimi rows, and main's new DeepSeek V4 rows. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Not ready to approve
Multiple live/e2e tests for the renamed moonshot provider are still gated on KIMI_API_KEY, which conflicts with the PR’s new canonical MOONSHOT_API_KEY setup and will surprise developers following the updated .env.example.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Suppressed comments (7)
lib/components/fabro-agent/tests/it/parity_matrix.rs:525
- This Moonshot provider entry in
non_openai_provider_tests!still gates onKIMI_API_KEY. Since the provider was renamed andMOONSHOT_API_KEYis now canonical, the test should requireMOONSHOT_API_KEYinstead.
ProviderId::new("moonshot"),
"kimi-k2.5",
kimi,
keys = ["KIMI_API_KEY"]
);
lib/components/fabro-agent/tests/it/parity_matrix.rs:286
- These Moonshot provider parity tests still require
KIMI_API_KEY, which no longer matches the canonical env var (MOONSHOT_API_KEY) and conflicts with the updated.env.example/docs. Update the required key toMOONSHOT_API_KEYso running the matrix only needs the new canonical variable.
This issue also appears in the following locations of the same file:
- line 416
- line 464
- line 521
- line 803
- line 885
ProviderId::new("moonshot"),
"kimi-k2.5",
kimi,
keys = ["KIMI_API_KEY"]
);
lib/components/fabro-agent/tests/it/parity_matrix.rs:420
- The Moonshot
web_fetchparity test still requiresKIMI_API_KEY. Update it toMOONSHOT_API_KEYso the test suite aligns with the canonical credential name.
ProviderId::new("moonshot"),
"kimi-k2.5",
kimi,
keys = ["KIMI_API_KEY", "OPENAI_API_KEY"]
);
lib/components/fabro-agent/tests/it/parity_matrix.rs:468
- The Moonshot
web_searchparity test still requiresKIMI_API_KEY. Update it toMOONSHOT_API_KEYto match the provider rename and canonical credential name.
ProviderId::new("moonshot"),
"kimi-k2.5",
kimi,
keys = ["KIMI_API_KEY", "BRAVE_SEARCH_API_KEY"]
);
lib/components/fabro-agent/tests/it/parity_matrix.rs:806
- This Moonshot reasoning-effort live test is still gated on
KIMI_API_KEY. SinceMOONSHOT_API_KEYis the preferred/canonical key now, update the required key to avoid surprising skips/failures when only the new env var is set.
ProviderId::new("moonshot"),
"kimi-k2.5",
kimi_reasoning_effort,
keys = ["KIMI_API_KEY"]
lib/components/fabro-agent/tests/it/parity_matrix.rs:889
- This Moonshot loop-detection live test is still gated on
KIMI_API_KEY. Update it toMOONSHOT_API_KEYso the live matrix runs with the canonical env var name.
ProviderId::new("moonshot"),
"kimi-k2.5",
kimi_loop_detection,
keys = ["KIMI_API_KEY"]
);
lib/components/fabro-llm/tests/integration.rs:181
- This live Moonshot/Kimi K3 integration test still requires and reads
KIMI_API_KEY, but the PR introducesMOONSHOT_API_KEYas the canonical env var and updates.env.exampleaccordingly. Update the test gate and env lookup to useMOONSHOT_API_KEYso developers can run it with the new default configuration.
- Files reviewed: 44/47 changed files
- Comments generated: 0 new
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
Summary
kimitomoonshotand display it asMoonshot AIMOONSHOT_API_KEYwhile retainingKIMI_API_KEYas an env and vault fallbackCompatibility
Configured provider IDs and qualified fallback targets must now use
moonshotinstead ofkimi. This change does not add a provider compatibility alias. ExistingKIMI_API_KEYcredentials remain supported.Validation
cargo nextest run --no-fail-fast -p fabro-model -p fabro-config -p fabro-agent -p fabro-llm -p fabro-workflow -p fabro-server -p fabro-cli(5,006 passed)cargo nextest run --no-fail-fast -p fabro-static -p fabro-model -p fabro-config -p fabro-auth -p fabro-cli(1,443 passed)cargo nextest run --no-fail-fast -p fabro-server(786 passed)cargo +nightly-2026-04-14 clippy --workspace --all-targets -- -D warningscargo +nightly-2026-04-14 fmt --check --allcd apps/fabro-web && bun run buildxmllint --noout apps/fabro-web/public/images/providers/moonshot.svg apps/fabro-web/public/images/providers/modal.svg apps/fabro-web/public/images/providers/openrouter.svg