Procházet zdrojové kódy

Merge pull request #555 from dairui1/feat/openrouter_base_url

feat: Add openRouterBaseUrl option
Matt Rubens před 11 měsíci
rodič
revize
2fbf276f00

+ 1 - 1
src/api/providers/openrouter.ts

@@ -27,7 +27,7 @@ export class OpenRouterHandler implements ApiHandler, SingleCompletionHandler {
 	constructor(options: ApiHandlerOptions) {
 		this.options = options
 		this.client = new OpenAI({
-			baseURL: "https://openrouter.ai/api/v1",
+			baseURL: this.options.openRouterBaseUrl || "https://openrouter.ai/api/v1",
 			apiKey: this.options.openRouterApiKey,
 			defaultHeaders: {
 				"HTTP-Referer": "https://github.com/RooVetGit/Roo-Cline",

+ 6 - 0
src/core/webview/ClineProvider.ts

@@ -93,6 +93,7 @@ type GlobalStateKey =
 	| "openAiStreamingEnabled"
 	| "openRouterModelId"
 	| "openRouterModelInfo"
+	| "openRouterBaseUrl"
 	| "openRouterUseMiddleOutTransform"
 	| "allowedCommands"
 	| "soundEnabled"
@@ -1293,6 +1294,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 			azureApiVersion,
 			openAiStreamingEnabled,
 			openRouterModelId,
+			openRouterBaseUrl,
 			openRouterModelInfo,
 			openRouterUseMiddleOutTransform,
 			vsCodeLmModelSelector,
@@ -1331,6 +1333,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 		await this.updateGlobalState("openAiStreamingEnabled", openAiStreamingEnabled)
 		await this.updateGlobalState("openRouterModelId", openRouterModelId)
 		await this.updateGlobalState("openRouterModelInfo", openRouterModelInfo)
+		await this.updateGlobalState("openRouterBaseUrl", openRouterBaseUrl)
 		await this.updateGlobalState("openRouterUseMiddleOutTransform", openRouterUseMiddleOutTransform)
 		await this.updateGlobalState("vsCodeLmModelSelector", vsCodeLmModelSelector)
 		await this.storeSecret("mistralApiKey", mistralApiKey)
@@ -1954,6 +1957,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 			openAiStreamingEnabled,
 			openRouterModelId,
 			openRouterModelInfo,
+			openRouterBaseUrl,
 			openRouterUseMiddleOutTransform,
 			lastShownAnnouncementId,
 			customInstructions,
@@ -2022,6 +2026,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 			this.getGlobalState("openAiStreamingEnabled") as Promise<boolean | undefined>,
 			this.getGlobalState("openRouterModelId") as Promise<string | undefined>,
 			this.getGlobalState("openRouterModelInfo") as Promise<ModelInfo | undefined>,
+			this.getGlobalState("openRouterBaseUrl") as Promise<string | undefined>,
 			this.getGlobalState("openRouterUseMiddleOutTransform") as Promise<boolean | undefined>,
 			this.getGlobalState("lastShownAnnouncementId") as Promise<string | undefined>,
 			this.getGlobalState("customInstructions") as Promise<string | undefined>,
@@ -2107,6 +2112,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 				openAiStreamingEnabled,
 				openRouterModelId,
 				openRouterModelInfo,
+				openRouterBaseUrl,
 				openRouterUseMiddleOutTransform,
 				vsCodeLmModelSelector,
 			},

+ 1 - 0
src/shared/api.ts

@@ -26,6 +26,7 @@ export interface ApiHandlerOptions {
 	openRouterApiKey?: string
 	openRouterModelId?: string
 	openRouterModelInfo?: ModelInfo
+	openRouterBaseUrl?: string
 	awsAccessKey?: string
 	awsSecretKey?: string
 	awsSessionToken?: string

+ 33 - 6
webview-ui/src/components/settings/ApiOptions.tsx

@@ -51,6 +51,7 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
 	const [vsCodeLmModels, setVsCodeLmModels] = useState<vscodemodels.LanguageModelChatSelector[]>([])
 	const [anthropicBaseUrlSelected, setAnthropicBaseUrlSelected] = useState(!!apiConfiguration?.anthropicBaseUrl)
 	const [azureApiVersionSelected, setAzureApiVersionSelected] = useState(!!apiConfiguration?.azureApiVersion)
+	const [openRouterBaseUrlSelected, setOpenRouterBaseUrlSelected] = useState(!!apiConfiguration?.openRouterBaseUrl)
 	const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false)
 
 	const { selectedProvider, selectedModelId, selectedModelInfo } = useMemo(() => {
@@ -303,12 +304,38 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
 						<span style={{ fontWeight: 500 }}>OpenRouter API Key</span>
 					</VSCodeTextField>
 					{!apiConfiguration?.openRouterApiKey && (
-						<VSCodeButtonLink
-							href={getOpenRouterAuthUrl(uriScheme)}
-							style={{ margin: "5px 0 0 0" }}
-							appearance="secondary">
-							Get OpenRouter API Key
-						</VSCodeButtonLink>
+						<p>
+							<VSCodeButtonLink
+								href={getOpenRouterAuthUrl(uriScheme)}
+								style={{ margin: "5px 0 0 0" }}
+								appearance="secondary">
+								Get OpenRouter API Key
+							</VSCodeButtonLink>
+						</p>
+					)}
+					<Checkbox
+						checked={openRouterBaseUrlSelected}
+						onChange={(checked: boolean) => {
+							setOpenRouterBaseUrlSelected(checked)
+							if (!checked) {
+								handleInputChange("openRouterBaseUrl")({
+									target: {
+										value: "",
+									},
+								})
+							}
+						}}>
+						Use custom base URL
+					</Checkbox>
+
+					{openRouterBaseUrlSelected && (
+						<VSCodeTextField
+							value={apiConfiguration?.openRouterBaseUrl || ""}
+							style={{ width: "100%", marginTop: 3 }}
+							type="url"
+							onInput={handleInputChange("openRouterBaseUrl")}
+							placeholder="Default: https://openrouter.ai/api/v1"
+						/>
 					)}
 					<p
 						style={{