From 609341a445a3b652df47ef2ecdba9ec20aa53221 Mon Sep 17 00:00:00 2001 From: Felarof Date: Wed, 4 Mar 2026 17:55:40 -0800 Subject: [PATCH] feat: add Kimi/Moonshot partnership branding with feature flag ## Summary - Add `VITE_PUBLIC_KIMI_LAUNCH` feature flag controlling Kimi partnership branding - BrowserOS provider card shows "Powered by Kimi K2.5 from Moonshot AI" badge and "Extended usage limits for the next 2 weeks!" when flag is on - Moonshot/Kimi highlighted as "Recommended" in provider templates - LLM Hub defaults to Kimi, ChatGPT, Claude, Gemini (with legacy defaults migration) - Kimi hub row shows "Powered by Moonshot AI" flare - Model selector locked to kimi-k2.5 - "How to get a Kimi API key" link in provider dialog - Moonshot provider fully integrated across frontend and backend --- apps/agent/.env.example | 3 ++ .../app/ai-settings/NewProviderDialog.tsx | 9 ++++- .../app/ai-settings/ProviderCard.tsx | 37 ++++++++++++------- .../app/ai-settings/ProviderTemplateCard.tsx | 35 +++++++++++++++--- .../ai-settings/ProviderTemplatesSection.tsx | 1 + .../entrypoints/app/ai-settings/models.ts | 2 + .../app/llm-hub/HubProviderRow.tsx | 29 +++++++++++++-- .../app/llm-hub/HubProvidersList.tsx | 4 +- apps/agent/entrypoints/app/llm-hub/models.ts | 1 - apps/agent/lib/env.ts | 1 + apps/agent/lib/feature-flags/kimi-launch.ts | 14 +++++++ apps/agent/lib/feature-flags/useKimiLaunch.ts | 5 +++ apps/agent/lib/llm-hub/storage.ts | 24 +++++++----- apps/agent/lib/llm-hub/useLlmHubProviders.ts | 9 +---- .../agent/lib/llm-providers/providerIcons.tsx | 2 + .../lib/llm-providers/providerTemplates.ts | 12 ++++++ apps/agent/lib/llm-providers/types.ts | 1 + .../src/agent/provider-adapter/index.ts | 13 +++++++ .../src/agent/provider-adapter/types.ts | 1 + .../src/agent/tool-loop/provider-factory.ts | 13 +++++++ apps/server/src/lib/clients/llm/provider.ts | 11 ++++++ packages/shared/src/schemas/llm.ts | 3 ++ 22 files changed, 187 insertions(+), 43 deletions(-) create mode 100644 apps/agent/lib/feature-flags/kimi-launch.ts create mode 100644 apps/agent/lib/feature-flags/useKimiLaunch.ts diff --git a/apps/agent/.env.example b/apps/agent/.env.example index 3ba30eaa..1334cee7 100644 --- a/apps/agent/.env.example +++ b/apps/agent/.env.example @@ -15,6 +15,9 @@ VITE_PUBLIC_SENTRY_DSN= # BrowserOS API URL VITE_PUBLIC_BROWSEROS_API=https://api.browseros.com +# Launch feature flags +VITE_PUBLIC_KIMI_LAUNCH=false + # GraphQL Schema Path (optional — falls back to schema/schema.graphql) GRAPHQL_SCHEMA_PATH= diff --git a/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx b/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx index c981988a..24853006 100644 --- a/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx +++ b/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx @@ -45,6 +45,7 @@ import { track } from '@/lib/metrics/track' import { getModelContextLength, getModelOptions } from './models' const providerTypeEnum = z.enum([ + 'moonshot', 'anthropic', 'openai', 'openai-compatible', @@ -413,6 +414,12 @@ export const NewProviderDialog: FC = ({ const providerTemplate = getProviderTemplate(watchedType as ProviderType) const setupGuideUrl = providerTemplate?.setupGuideUrl const providerName = providerTemplate?.name + const setupGuideText = + watchedType === 'moonshot' + ? 'How to get a Kimi API key' + : providerName + ? `${providerName} setup guide` + : 'Provider setup guide' const handleSetupGuideClick = (e: React.MouseEvent) => { e.preventDefault() @@ -596,7 +603,7 @@ export const NewProviderDialog: FC = ({ className="inline-flex cursor-pointer items-center gap-1 text-primary hover:underline" > - {providerName} setup guide + {setupGuideText} )} diff --git a/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx b/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx index 93846541..faab4e9d 100644 --- a/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx +++ b/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx @@ -2,6 +2,7 @@ import { Check, Loader2, Trash2 } from 'lucide-react' import type { FC } from 'react' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' +import { useKimiLaunch } from '@/lib/feature-flags/useKimiLaunch' import { BrowserOSIcon, ProviderIcon } from '@/lib/llm-providers/providerIcons' import type { LlmProviderConfig } from '@/lib/llm-providers/types' import { cn } from '@/lib/utils' @@ -29,6 +30,7 @@ export const ProviderCard: FC = ({ isTesting = false, }) => { const inputId = `provider-${provider.id}` + const kimiLaunch = useKimiLaunch() return (