From dddf47893e8314adc568b889df9e254dd782170c Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 21 Feb 2026 12:20:32 +0000 Subject: [PATCH] feat: Replace Void branding with Orcide, integrate OllamaFreeAPI as default provider - Replace Void cube logo with Orcide SVG logo on welcome page and watermark - Remove API key requirement from orcestAI provider (uses OllamaFreeAPI) - Set orcestAI endpoint to https://ollamafreeapi.orcest.ai/v1 (free, no auth) - Add orcestAI to "Free" tab as first option in onboarding - Default to orcestAI for smart/cheap/all provider selections - Update default models to ollamafreeapi models (llama3, mistral, deepseek, etc.) - Update provider display name and descriptions for Orcest ecosystem https://claude.ai/code/session_01CjDqzV3ECQxE1g4jFn7PBu --- .../parts/editor/media/editorgroupview.css | 8 +- .../parts/editor/media/orcide_logo.svg | 19 +++++ .../src/void-onboarding/VoidOnboarding.tsx | 79 +++++++++++-------- .../contrib/void/common/modelCapabilities.ts | 56 +++---------- .../void/common/sendLLMMessageService.ts | 4 +- .../contrib/void/common/voidSettingsTypes.ts | 7 +- 6 files changed, 84 insertions(+), 89 deletions(-) create mode 100644 src/vs/workbench/browser/parts/editor/media/orcide_logo.svg diff --git a/src/vs/workbench/browser/parts/editor/media/editorgroupview.css b/src/vs/workbench/browser/parts/editor/media/editorgroupview.css index f79d0c9c..4f62a13b 100644 --- a/src/vs/workbench/browser/parts/editor/media/editorgroupview.css +++ b/src/vs/workbench/browser/parts/editor/media/editorgroupview.css @@ -55,7 +55,7 @@ width: 100%; max-height: 100%; aspect-ratio: 1/1; - background-image: url('./void_cube_noshadow.png'); /* // Void */ + background-image: url('./orcide_logo.svg'); /* Orcide */ background-size: contain; background-position-x: center; background-repeat: no-repeat; @@ -63,17 +63,17 @@ .void-void-icon, .monaco-workbench.vs-dark .part.editor > .content .editor-group-container .editor-group-watermark > .letterpress { - background-image: url('./void_cube_noshadow.png'); /* // Void */ + background-image: url('./orcide_logo.svg'); /* Orcide */ } .void-void-icon, .monaco-workbench.hc-light .part.editor > .content .editor-group-container .editor-group-watermark > .letterpress { - background-image: url('./void_cube_noshadow.png'); /* // Void */ + background-image: url('./orcide_logo.svg'); /* Orcide */ } .void-void-icon, .monaco-workbench.hc-black .part.editor > .content .editor-group-container .editor-group-watermark > .letterpress { - background-image: url('./void_cube_noshadow.png'); /* // Void */ + background-image: url('./orcide_logo.svg'); /* Orcide */ } .monaco-workbench .part.editor > .content:not(.empty) .editor-group-container > .editor-group-watermark > .shortcuts, diff --git a/src/vs/workbench/browser/parts/editor/media/orcide_logo.svg b/src/vs/workbench/browser/parts/editor/media/orcide_logo.svg new file mode 100644 index 00000000..f45a2864 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/orcide_logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx index 176db641..0358a216 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-onboarding/VoidOnboarding.tsx @@ -3,15 +3,13 @@ * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information. *--------------------------------------------------------------------------------------*/ -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useState } from 'react'; import { useAccessor, useIsDark, useSettingsState } from '../util/services.js'; import { Brain, Check, ChevronRight, DollarSign, ExternalLink, Lock, X } from 'lucide-react'; import { displayInfoOfProviderName, ProviderName, providerNames, localProviderNames, featureNames, FeatureName, isFeatureNameDisabled } from '../../../../common/voidSettingsTypes.js'; import { ChatMarkdownRender } from '../markdown/ChatMarkdownRender.js'; import { OllamaSetupInstructions, OneClickSwitchButton, SettingsForProvider, ModelDump } from '../void-settings-tsx/Settings.js'; -import { ColorScheme } from '../../../../../../../platform/theme/common/theme.js'; import ErrorBoundary from '../sidebar-tsx/ErrorBoundary.js'; -import { isLinux } from '../../../../../../../base/common/platform.js'; const OVERRIDE_VALUE = false @@ -39,29 +37,32 @@ export const VoidOnboarding = () => { ) } -const VoidIcon = () => { - const accessor = useAccessor() - const themeService = accessor.get('IThemeService') +const OrcideIcon = () => { + const isDark = useIsDark() - const divRef = useRef(null) - - useEffect(() => { - // void icon style - const updateTheme = () => { - const theme = themeService.getColorTheme().type - const isDark = theme === ColorScheme.DARK || theme === ColorScheme.HIGH_CONTRAST_DARK - if (divRef.current) { - divRef.current.style.maxWidth = '220px' - divRef.current.style.opacity = '50%' - divRef.current.style.filter = isDark ? '' : 'invert(1)' //brightness(.5) - } - } - updateTheme() - const d = themeService.onDidColorThemeChange(updateTheme) - return () => d.dispose() - }, []) - - return
+ return ( + + {/* Outer hexagonal frame */} + + {/* Inner hexagonal frame */} + + {/* Central "O" letterform with circuit-like details */} + + + {/* Connection nodes */} + + + + + {/* Connecting lines to hexagon */} + + + + + {/* Brand text */} + ORCIDE + + ) } const FADE_DURATION_MS = 2000 @@ -104,14 +105,14 @@ const cloudProviders: ProviderName[] = ['googleVertex', 'liteLLM', 'microsoftAzu // Data structures for provider tabs const providerNamesOfTab: Record = { - Free: ['gemini', 'openRouter'], + Free: ['orcestAI', 'gemini', 'openRouter'], Local: localProviderNames, - Paid: providerNames.filter(pn => !(['gemini', 'openRouter', ...localProviderNames, ...cloudProviders] as string[]).includes(pn)) as ProviderName[], + Paid: providerNames.filter(pn => !(['orcestAI', 'gemini', 'openRouter', ...localProviderNames, ...cloudProviders] as string[]).includes(pn)) as ProviderName[], 'Cloud/Other': cloudProviders, }; const descriptionOfTab: Record = { - Free: `Providers with a 100% free tier. Add as many as you'd like!`, + Free: `Free providers — Orcest AI works out of the box with no API key!`, Paid: `Connect directly with any provider (bring your own key).`, Local: `Active providers should appear automatically. Add as many as you'd like! `, 'Cloud/Other': `Add as many as you'd like! Reach out for custom configuration requests.`, @@ -204,6 +205,14 @@ const AddProvidersPage = ({ pageIndex, setPageIndex }: { pageIndex: number, setP
Add {displayInfoOfProviderName(providerName).title} + {providerName === 'orcestAI' && ( + * + )} {providerName === 'gemini' && ( { // Replace the single selectedProviderName with four separate states // page 2 state - each tab gets its own state - const [selectedIntelligentProvider, setSelectedIntelligentProvider] = useState('anthropic'); + const [selectedIntelligentProvider, setSelectedIntelligentProvider] = useState('orcestAI'); const [selectedPrivateProvider, setSelectedPrivateProvider] = useState('ollama'); - const [selectedAffordableProvider, setSelectedAffordableProvider] = useState('gemini'); - const [selectedAllProvider, setSelectedAllProvider] = useState('anthropic'); + const [selectedAffordableProvider, setSelectedAffordableProvider] = useState('orcestAI'); + const [selectedAllProvider, setSelectedAllProvider] = useState('orcestAI'); // Helper function to get the current selected provider based on active tab const getSelectedProvider = (): ProviderName => { @@ -510,9 +519,9 @@ const VoidOnboardingContent = () => { } const providerNamesOfWantToUseOption: { [wantToUseOption in WantToUseOption]: ProviderName[] } = { - smart: ['anthropic', 'openAI', 'gemini', 'openRouter'], + smart: ['orcestAI', 'anthropic', 'openAI', 'gemini', 'openRouter'], private: ['ollama', 'vLLM', 'openAICompatible', 'lmStudio'], - cheap: ['gemini', 'deepseek', 'openRouter', 'ollama', 'vLLM'], + cheap: ['orcestAI', 'gemini', 'deepseek', 'openRouter', 'ollama', 'vLLM'], all: providerNames, } @@ -598,9 +607,9 @@ const VoidOnboardingContent = () => {
Welcome to Orcide
- {/* Slice of Void image */} + {/* Orcide logo */}
- {!isLinux && } +
diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index aee4544d..9e59cb37 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -66,8 +66,7 @@ export const defaultProviderSettings = { endpoint: '', // optionally allow overriding default }, orcestAI: { - endpoint: 'https://rm.orcest.ai/v1', - apiKey: '', // Will be populated from environment/SSO + endpoint: 'https://ollamafreeapi.orcest.ai/v1', }, } as const @@ -149,15 +148,13 @@ export const defaultModelsOfProvider = { awsBedrock: [], liteLLM: [], orcestAI: [ - 'rainymodel-pro', - 'rainymodel-standard', - 'rainymodel-lite', - 'gpt-4o', - 'gpt-4o-mini', - 'claude-3.5-sonnet', - 'gemini-1.5-pro', - 'llama-3.1-70b', - 'mixtral-8x7b', + 'llama3.2:latest', + 'llama3.1:latest', + 'llama3.3:latest', + 'mistral:latest', + 'deepseek-r1:latest', + 'qwen2.5-coder:7b', + 'gemma:latest', ], @@ -1455,48 +1452,19 @@ const openRouterSettings: VoidStaticProviderInfo = { -// ---------------- ORCEST AI (RainyModel) ---------------- +// ---------------- ORCEST AI (OllamaFreeAPI) ---------------- const orcestAIModelOptions = { - 'rainymodel-pro': { - contextWindow: 128_000, - reservedOutputTokenSpace: 8_192, - cost: { input: 0, output: 0 }, - downloadable: false, - supportsFIM: false, - supportsSystemMessage: 'system-role', - specialToolFormat: 'openai-style', - reasoningCapabilities: false, - }, - 'rainymodel-standard': { - contextWindow: 128_000, - reservedOutputTokenSpace: 8_192, - cost: { input: 0, output: 0 }, - downloadable: false, - supportsFIM: false, - supportsSystemMessage: 'system-role', - specialToolFormat: 'openai-style', - reasoningCapabilities: false, - }, - 'rainymodel-lite': { - contextWindow: 64_000, - reservedOutputTokenSpace: 4_096, - cost: { input: 0, output: 0 }, - downloadable: false, - supportsFIM: false, - supportsSystemMessage: 'system-role', - specialToolFormat: 'openai-style', - reasoningCapabilities: false, - }, } as const satisfies { [s: string]: VoidStaticModelInfo } const orcestAISettings: VoidStaticProviderInfo = { modelOptions: orcestAIModelOptions, modelOptionsFallback: (modelName) => { - // For non-RainyModel models served through the aggregator, use the extensive fallback - return extensiveModelOptionsFallback(modelName) + // OllamaFreeAPI serves 650+ open-source models, use extensive fallback for capability detection + return extensiveModelOptionsFallback(modelName, { cost: { input: 0, output: 0 } }) }, providerReasoningIOSettings: { input: { includeInPayload: openAICompatIncludeInPayloadReasoning }, + output: { needsManualParse: true }, }, } diff --git a/src/vs/workbench/contrib/void/common/sendLLMMessageService.ts b/src/vs/workbench/contrib/void/common/sendLLMMessageService.ts index 3132934a..eed84f0d 100644 --- a/src/vs/workbench/contrib/void/common/sendLLMMessageService.ts +++ b/src/vs/workbench/contrib/void/common/sendLLMMessageService.ts @@ -206,7 +206,7 @@ if (!isWeb) { groq: 'https://api.groq.com/openai/v1', xAI: 'https://api.x.ai/v1', mistral: 'https://api.mistral.ai/v1', - orcestAI: 'https://rm.orcest.ai/v1', + orcestAI: 'https://ollamafreeapi.orcest.ai/v1', }; class LLMMessageServiceWeb extends Disposable implements ILLMMessageService { @@ -220,7 +220,7 @@ if (!isWeb) { sendLLMMessage = (params: ServiceSendLLMMessageParams): string | null => { const { onText, onFinalMessage, onError, modelSelection } = params; if (modelSelection === null) { - onError({ message: `Please add a provider in Void's Settings.`, fullError: null }); + onError({ message: `Please add a provider in Orcide's Settings.`, fullError: null }); return null; } const requestId = generateUuid(); diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index a093517a..62a7e62e 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -107,7 +107,7 @@ export const displayInfoOfProviderName = (providerName: ProviderName): DisplayIn return { title: 'AWS Bedrock', } } else if (providerName === 'orcestAI') { - return { title: 'Orcest AI (RainyModel)', } + return { title: 'Orcest AI (Free)', } } throw new Error(`descOfProviderName: Unknown provider name: "${providerName}"`) @@ -131,7 +131,7 @@ export const subTextMdOfProviderName = (providerName: ProviderName): string => { if (providerName === 'vLLM') return 'Read more about custom [Endpoints here](https://docs.vllm.ai/en/latest/getting_started/quickstart.html#openai-compatible-server).' if (providerName === 'lmStudio') return 'Read more about custom [Endpoints here](https://lmstudio.ai/docs/app/api/endpoints/openai).' if (providerName === 'liteLLM') return 'Read more about endpoints [here](https://docs.litellm.ai/docs/providers/openai_compatible).' - if (providerName === 'orcestAI') return 'Orcest AI integrated API. Models are available automatically through your SSO login. Powered by [RainyModel](https://rm.orcest.ai).' + if (providerName === 'orcestAI') return 'Orcest AI free API. No API key required. Powered by [OllamaFreeAPI](https://ollamafreeapi.orcest.ai) with 650+ open-source models.' throw new Error(`subTextMdOfProviderName: Unknown provider name: "${providerName}"`) } @@ -160,7 +160,6 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName providerName === 'googleVertex' ? 'AIzaSy...' : providerName === 'microsoftAzure' ? 'key-...' : providerName === 'awsBedrock' ? 'key-...' : - providerName === 'orcestAI' ? 'sk-orcest-key...' : '', isPasswordField: true, @@ -186,7 +185,7 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName : providerName === 'liteLLM' ? 'http://localhost:4000' : providerName === 'awsBedrock' ? 'http://localhost:4000/v1' : providerName === 'orcestAI' ? defaultProviderSettings.orcestAI.endpoint - : '(never)', + : '(never)' }