From 1da7210df77fe53da9654541075003354e5fbd8c Mon Sep 17 00:00:00 2001 From: Felarof Date: Thu, 26 Feb 2026 16:50:55 -0800 Subject: [PATCH 1/3] feat: add Kimi/Moonshot partnership promotion POC Add Moonshot/Kimi as a first-class provider template with promotional UI treatment across LLM Providers and LLM Chat & Hub settings pages. - Add 'moonshot' provider type to shared schema, server adapter, and frontend - Add Kimi template as first quick provider template (Moonshot API endpoint) - Add "Free model Sponsored by Kimi K2.5" badge on BrowserOS provider card - Add Kimi at top of LLM Hub defaults with orange glow and "Try Kimi" badge Co-Authored-By: Claude Opus 4.6 --- .../app/ai-settings/NewProviderDialog.tsx | 1 + .../app/ai-settings/ProviderCard.tsx | 5 +++++ .../entrypoints/app/ai-settings/models.ts | 2 ++ .../app/llm-hub/HubProviderRow.tsx | 21 +++++++++++++++---- apps/agent/lib/llm-hub/storage.ts | 1 + .../agent/lib/llm-providers/providerIcons.tsx | 2 ++ .../lib/llm-providers/providerTemplates.ts | 11 ++++++++++ apps/agent/lib/llm-providers/types.ts | 1 + .../src/agent/provider-adapter/index.ts | 12 +++++++++++ .../src/agent/provider-adapter/types.ts | 1 + packages/shared/src/schemas/llm.ts | 3 +++ 11 files changed, 56 insertions(+), 4 deletions(-) diff --git a/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx b/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx index c981988a..5b6c8e71 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', diff --git a/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx b/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx index 93846541..1e5b6f36 100644 --- a/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx +++ b/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx @@ -77,6 +77,11 @@ export const ProviderCard: FC = ({ )} + {isBuiltIn && ( + + Free model Sponsored by Kimi K2.5 + + )}

{isBuiltIn ? ( <> diff --git a/apps/agent/entrypoints/app/ai-settings/models.ts b/apps/agent/entrypoints/app/ai-settings/models.ts index e8897c64..9651a261 100644 --- a/apps/agent/entrypoints/app/ai-settings/models.ts +++ b/apps/agent/entrypoints/app/ai-settings/models.ts @@ -22,6 +22,7 @@ export interface ModelsData { lmstudio: ModelInfo[] bedrock: ModelInfo[] browseros: ModelInfo[] + moonshot: ModelInfo[] } /** @@ -29,6 +30,7 @@ export interface ModelsData { * Based on: https://github.com/browseros-ai/BrowserOS-agent/blob/main/src/options/data/models.ts */ export const MODELS_DATA: ModelsData = { + moonshot: [{ modelId: 'kimi-k2-0905-preview', contextLength: 128000 }], anthropic: [ { modelId: 'claude-opus-4-5-20251101', contextLength: 200000 }, { modelId: 'claude-haiku-4-5-20251001', contextLength: 200000 }, diff --git a/apps/agent/entrypoints/app/llm-hub/HubProviderRow.tsx b/apps/agent/entrypoints/app/llm-hub/HubProviderRow.tsx index c4105eec..444c1633 100644 --- a/apps/agent/entrypoints/app/llm-hub/HubProviderRow.tsx +++ b/apps/agent/entrypoints/app/llm-hub/HubProviderRow.tsx @@ -2,6 +2,7 @@ import { Globe2, Trash2 } from 'lucide-react' import type { FC } from 'react' import { useMemo } from 'react' import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' import { getFaviconUrl, type LlmHubProvider } from './models' interface HubProviderRowProps { @@ -18,9 +19,16 @@ export const HubProviderRow: FC = ({ onDelete, }) => { const iconUrl = useMemo(() => getFaviconUrl(provider.url), [provider.url]) + const isKimi = provider.name === 'Kimi' return ( -

+
{iconUrl ? ( = ({
- - {provider.name} - +
+ {provider.name} + {isKimi && ( + + Try Kimi + + )} +

{provider.url}

diff --git a/apps/agent/lib/llm-hub/storage.ts b/apps/agent/lib/llm-hub/storage.ts index 33ce8e93..e973c7e2 100644 --- a/apps/agent/lib/llm-hub/storage.ts +++ b/apps/agent/lib/llm-hub/storage.ts @@ -8,6 +8,7 @@ export interface LlmHubProvider { } export const DEFAULT_PROVIDERS: LlmHubProvider[] = [ + { name: 'Kimi', url: 'https://www.kimi.com' }, { name: 'ChatGPT', url: 'https://chatgpt.com' }, { name: 'Claude', url: 'https://claude.ai' }, { name: 'Grok', url: 'https://grok.com' }, diff --git a/apps/agent/lib/llm-providers/providerIcons.tsx b/apps/agent/lib/llm-providers/providerIcons.tsx index b0bd683e..cbf2a5a4 100644 --- a/apps/agent/lib/llm-providers/providerIcons.tsx +++ b/apps/agent/lib/llm-providers/providerIcons.tsx @@ -3,6 +3,7 @@ import { Azure, Bedrock, Gemini, + Kimi, LmStudio, Ollama, OpenAI, @@ -30,6 +31,7 @@ const providerIconMap: Record = { lmstudio: LmStudio, bedrock: Bedrock, browseros: null, + moonshot: Kimi, } interface ProviderIconProps { diff --git a/apps/agent/lib/llm-providers/providerTemplates.ts b/apps/agent/lib/llm-providers/providerTemplates.ts index c62601a3..390d3aa7 100644 --- a/apps/agent/lib/llm-providers/providerTemplates.ts +++ b/apps/agent/lib/llm-providers/providerTemplates.ts @@ -20,6 +20,15 @@ export interface ProviderTemplate { * @public */ export const providerTemplates: ProviderTemplate[] = [ + { + id: 'moonshot', + name: 'Moonshot / Kimi', + defaultBaseUrl: 'https://api.moonshot.ai/v1', + defaultModelId: 'kimi-k2-0905-preview', + supportsImages: true, + contextWindow: 128000, + apiKeyUrl: 'https://platform.moonshot.ai/console/api-keys', + }, { id: 'openai', name: 'OpenAI', @@ -119,6 +128,7 @@ export const providerTemplates: ProviderTemplate[] = [ * @public */ export const providerTypeOptions: { value: ProviderType; label: string }[] = [ + { value: 'moonshot', label: 'Moonshot / Kimi' }, { value: 'anthropic', label: 'Anthropic' }, { value: 'openai', label: 'OpenAI' }, { value: 'openai-compatible', label: 'OpenAI Compatible' }, @@ -146,6 +156,7 @@ export const getProviderTemplate = ( * Auto-fills when user selects a provider type */ export const DEFAULT_BASE_URLS: Record = { + moonshot: 'https://api.moonshot.ai/v1', anthropic: 'https://api.anthropic.com/v1', openai: 'https://api.openai.com/v1', 'openai-compatible': '', diff --git a/apps/agent/lib/llm-providers/types.ts b/apps/agent/lib/llm-providers/types.ts index 9214da1a..3ca5afa4 100644 --- a/apps/agent/lib/llm-providers/types.ts +++ b/apps/agent/lib/llm-providers/types.ts @@ -13,6 +13,7 @@ export type ProviderType = | 'lmstudio' | 'bedrock' | 'browseros' + | 'moonshot' /** * LLM Provider configuration diff --git a/apps/server/src/agent/provider-adapter/index.ts b/apps/server/src/agent/provider-adapter/index.ts index 586fbe9a..e76d7594 100644 --- a/apps/server/src/agent/provider-adapter/index.ts +++ b/apps/server/src/agent/provider-adapter/index.ts @@ -160,6 +160,17 @@ function createOpenAICompatibleFactory( }) } +function createMoonshotFactory( + config: VercelAIConfig, +): (modelId: string) => unknown { + if (!config.baseUrl) throw new Error('Moonshot provider requires baseUrl') + return createOpenAICompatible({ + name: 'moonshot', + baseURL: config.baseUrl, + ...(config.apiKey && { apiKey: config.apiKey }), + }) +} + const PROVIDER_FACTORIES: Record = { [AIProvider.ANTHROPIC]: createAnthropicFactory, [AIProvider.OPENAI]: createOpenAIFactory, @@ -171,6 +182,7 @@ const PROVIDER_FACTORIES: Record = { [AIProvider.BEDROCK]: createBedrockFactory, [AIProvider.BROWSEROS]: createBrowserOSFactory, [AIProvider.OPENAI_COMPATIBLE]: createOpenAICompatibleFactory, + [AIProvider.MOONSHOT]: createMoonshotFactory, } /** diff --git a/apps/server/src/agent/provider-adapter/types.ts b/apps/server/src/agent/provider-adapter/types.ts index 1b449bc8..95ae86e6 100644 --- a/apps/server/src/agent/provider-adapter/types.ts +++ b/apps/server/src/agent/provider-adapter/types.ts @@ -214,6 +214,7 @@ export enum AIProvider { BEDROCK = 'bedrock', BROWSEROS = 'browseros', OPENAI_COMPATIBLE = 'openai-compatible', + MOONSHOT = 'moonshot', } /** diff --git a/packages/shared/src/schemas/llm.ts b/packages/shared/src/schemas/llm.ts index c54a67e8..17befcd8 100644 --- a/packages/shared/src/schemas/llm.ts +++ b/packages/shared/src/schemas/llm.ts @@ -23,6 +23,7 @@ export const LLM_PROVIDERS = { BEDROCK: 'bedrock', BROWSEROS: 'browseros', OPENAI_COMPATIBLE: 'openai-compatible', + MOONSHOT: 'moonshot', } as const /** @@ -40,6 +41,7 @@ export const LLMProviderSchema: z.ZodEnum< 'bedrock', 'browseros', 'openai-compatible', + 'moonshot', ] > = z.enum([ LLM_PROVIDERS.ANTHROPIC, @@ -52,6 +54,7 @@ export const LLMProviderSchema: z.ZodEnum< LLM_PROVIDERS.BEDROCK, LLM_PROVIDERS.BROWSEROS, LLM_PROVIDERS.OPENAI_COMPATIBLE, + LLM_PROVIDERS.MOONSHOT, ]) export type LLMProvider = z.infer From 72977fd2a96999dbd2f5829eebf1abe168b4ec81 Mon Sep 17 00:00:00 2001 From: Felarof Date: Thu, 26 Feb 2026 16:53:11 -0800 Subject: [PATCH 2/3] fix: add moonshot to remaining server provider factories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review caught two additional PROVIDER_FACTORIES records missing the moonshot mapping — the SDK LLM client and agent tool-loop paths would have thrown "Unknown provider" at runtime. Co-Authored-By: Claude Opus 4.6 --- apps/server/src/agent/tool-loop/provider-factory.ts | 12 ++++++++++++ apps/server/src/lib/clients/llm/provider.ts | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/apps/server/src/agent/tool-loop/provider-factory.ts b/apps/server/src/agent/tool-loop/provider-factory.ts index 1abd1c48..b0c0299e 100644 --- a/apps/server/src/agent/tool-loop/provider-factory.ts +++ b/apps/server/src/agent/tool-loop/provider-factory.ts @@ -136,6 +136,17 @@ function createOpenAICompatibleFactory( }) } +function createMoonshotFactory( + config: ResolvedAgentConfig, +): (modelId: string) => unknown { + if (!config.baseUrl) throw new Error('Moonshot provider requires baseUrl') + return createOpenAICompatible({ + name: 'moonshot', + baseURL: config.baseUrl, + ...(config.apiKey && { apiKey: config.apiKey }), + }) +} + const PROVIDER_FACTORIES: Record = { [LLM_PROVIDERS.ANTHROPIC]: createAnthropicFactory, [LLM_PROVIDERS.OPENAI]: createOpenAIFactory, @@ -147,6 +158,7 @@ const PROVIDER_FACTORIES: Record = { [LLM_PROVIDERS.BEDROCK]: createBedrockFactory, [LLM_PROVIDERS.BROWSEROS]: createBrowserOSFactory, [LLM_PROVIDERS.OPENAI_COMPATIBLE]: createOpenAICompatibleFactory, + [LLM_PROVIDERS.MOONSHOT]: createMoonshotFactory, } export function createLanguageModel( diff --git a/apps/server/src/lib/clients/llm/provider.ts b/apps/server/src/lib/clients/llm/provider.ts index ba436515..cd941bf6 100644 --- a/apps/server/src/lib/clients/llm/provider.ts +++ b/apps/server/src/lib/clients/llm/provider.ts @@ -124,6 +124,15 @@ function createOpenAICompatibleModel(config: ResolvedLLMConfig): LanguageModel { })(config.model) } +function createMoonshotModel(config: ResolvedLLMConfig): LanguageModel { + if (!config.baseUrl) throw new Error('Moonshot provider requires baseUrl') + return createOpenAICompatible({ + name: 'moonshot', + baseURL: config.baseUrl, + ...(config.apiKey && { apiKey: config.apiKey }), + })(config.model) +} + const PROVIDER_FACTORIES: Record = { [LLM_PROVIDERS.ANTHROPIC]: createAnthropicModel, [LLM_PROVIDERS.OPENAI]: createOpenAIModel, @@ -135,6 +144,7 @@ const PROVIDER_FACTORIES: Record = { [LLM_PROVIDERS.BEDROCK]: createBedrockModel, [LLM_PROVIDERS.BROWSEROS]: createBrowserOSModel, [LLM_PROVIDERS.OPENAI_COMPATIBLE]: createOpenAICompatibleModel, + [LLM_PROVIDERS.MOONSHOT]: createMoonshotModel, } export function createLLMProvider(config: ResolvedLLMConfig): LanguageModel { From 7579affd4fdc1eb1a8404a53bab1c659df6ed019 Mon Sep 17 00:00:00 2001 From: Felarof Date: Thu, 26 Feb 2026 17:04:23 -0800 Subject: [PATCH 3/3] fix: scope sponsorship badge to browseros provider type Address Greptile review: add explicit provider.type check to ensure badge only renders for the BrowserOS provider. Co-Authored-By: Claude Opus 4.6 --- apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx b/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx index 1e5b6f36..65bc999f 100644 --- a/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx +++ b/apps/agent/entrypoints/app/ai-settings/ProviderCard.tsx @@ -77,7 +77,7 @@ export const ProviderCard: FC = ({ )}
- {isBuiltIn && ( + {isBuiltIn && provider.type === 'browseros' && ( Free model Sponsored by Kimi K2.5