@@ -557,7 +556,7 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
},
})
}}
- style={{ minWidth: 130 }}
+ style={{ minWidth: 180, width: "100%" }}
options={[
{
value: "us-central1",
@@ -602,14 +601,19 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
-
- {t("settings.provider.providers.gemini.title").toString()}
-
+ {t("settings.provider.providers.gemini.title").toString()}
+
+ {!apiConfiguration?.geminiApiKey && (
+
+ {t("settings.provider.providers.gemini.getKey").toString()}
+
+ )}
+
{t("settings.provider.apiKey.storedLocally").toString()}.
- {!apiConfiguration?.geminiApiKey && (
-
- {t("settings.provider.providers.gemini.getKey").toString()}.
-
- )}
)}
@@ -640,28 +634,25 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
}}>
-
- {t("settings.provider.providers.openai.baseUrl").toString()}
-
+ {t("settings.provider.providers.openai.baseUrl").toString()}
-
- {t("settings.provider.providers.openai.title").toString()}
-
+ {t("settings.provider.providers.openai.title").toString()}
{
handleInputChange("openAiStreamingEnabled")({
target: { value: checked },
@@ -672,6 +663,7 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
{
handleInputChange("openAiUseAzure")({
target: { value: checked },
@@ -681,6 +673,7 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
{
setAzureApiVersionSelected(checked)
if (!checked) {
@@ -776,7 +769,16 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
flexDirection: "column",
gap: 12,
}}>
-
+
-
+
{
handleInputChange("openAiCustomModelInfo")({
target: {
@@ -962,10 +978,7 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
},
})
}}>
-
+
{t(
"settings.provider.providers.openai.modelConfig.features.imageSupport.title",
).toString()}
@@ -1014,6 +1027,11 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
apiConfiguration?.openAiCustomModelInfo
?.supportsComputerUse ?? false
}
+ style={{
+ width: "100%",
+ marginTop: 8,
+ color: "var(--vscode-descriptionForeground)",
+ }}
onChange={(checked: boolean) => {
handleInputChange("openAiCustomModelInfo")({
target: {
@@ -1025,10 +1043,7 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
},
})
}}>
-
+
{t(
"settings.provider.providers.openai.modelConfig.features.computerUse.title",
).toString()}
@@ -1263,16 +1278,33 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
{selectedProvider === "lmstudio" && (
-
-
- {t("settings.provider.providers.lmstudio.baseUrl").toString()}
-
-
+
{
+ setLmStudioBaseUrlSelected(checked)
+ if (!checked) {
+ handleInputChange("lmStudioBaseUrl")({
+ target: {
+ value: "",
+ },
+ })
+ }
+ }}>
+ {t("settings.provider.providers.lmstudio.useCustomBaseUrl").toString()}
+
+
+ {lmStudioBaseUrlSelected && (
+
+ )}
+
- LM Studio allows you to run models locally on your computer. For instructions on how to get
- started, see their
+ {t("settings.provider.providers.lmstudio.description").toString()}
+
{t("settings.provider.providers.lmstudio.quickstartGuide").toString()}
- You will also need to start LM Studio's{" "}
+
{t("settings.provider.providers.lmstudio.localServer").toString()}
- {" "}
- feature to use it with this extension.{" "}
+
+
({t("settings.provider.common.modelCapabilityNote").toString()})
@@ -1337,14 +1369,19 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
-
- {t("settings.provider.providers.deepseek.title").toString()}
-
+ {t("settings.provider.providers.deepseek.title").toString()}
+
+ {!apiConfiguration?.deepSeekApiKey && (
+
+ {t("settings.provider.providers.deepseek.getKey").toString()}
+
+ )}
+
{t("settings.provider.apiKey.storedLocally").toString()}.
- {!apiConfiguration?.deepSeekApiKey && (
-
- {t("settings.provider.providers.deepseek.getKey").toString()}
-
- )}
)}
@@ -1370,9 +1397,7 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
{vsCodeLmModels.length > 0 ? (
{t("settings.provider.providers.vscode.noModels").toString()}
@@ -1436,22 +1461,18 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
-
- {t("settings.provider.providers.ollama.baseUrl").toString()}
-
+ {t("settings.provider.providers.ollama.baseUrl").toString()}
-
- {t("settings.provider.providers.ollama.modelId").toString()}
-
+ {t("settings.provider.providers.ollama.modelId").toString()}
{ollamaModels.length > 0 && (
简体中文
+
({t("settings.provider.common.modelCapabilityNote").toString()})
@@ -1509,17 +1531,14 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
- Unbound API Key
+ Unbound API Key
{!apiConfiguration?.unboundApiKey && (
-
+
Get Unbound API Key
)}
@@ -1537,7 +1556,7 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
{apiErrorMessage && (
@@ -1558,7 +1577,7 @@ const ApiOptions = ({ apiErrorMessage, modelIdErrorMessage }: ApiOptionsProps) =
<>
{selectedProvider === "anthropic" && createDropdown(anthropicModels)}
{selectedProvider === "bedrock" && createDropdown(bedrockModels)}
@@ -1612,6 +1631,10 @@ export function getGlamaAuthUrl(uriScheme?: string) {
return `https://glama.ai/oauth/authorize?callback_url=${encodeURIComponent(callbackUrl)}`
}
+export function getopenAiNativeAuthUrl(uriScheme?: string) {
+ return `https://openai.com/api/auth/callback?callback_url=${uriScheme || "vscode"}://CoolCline.coolcline/openai-native`
+}
+
export function getOpenRouterAuthUrl(uriScheme?: string) {
// ${publisher}.${name},${publisher} 是发布者,${name} 是扩展名,注意是要用 package.json 中的 publisher 和 name,区分大小写
return `https://openrouter.ai/auth?callback_url=${uriScheme || "vscode"}://CoolCline.coolcline/openrouter`
diff --git a/webview-ui/src/components/settings/GlamaModelPicker.tsx b/webview-ui/src/components/settings/GlamaModelPicker.tsx
index d97a1131..7eb3cde6 100644
--- a/webview-ui/src/components/settings/GlamaModelPicker.tsx
+++ b/webview-ui/src/components/settings/GlamaModelPicker.tsx
@@ -165,7 +165,7 @@ const GlamaModelPicker: React.FC = () => {
-
{t("settings.provider.model.title").toString()}
+
Model
diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx
index 89353644..9da1ab27 100644
--- a/webview-ui/src/components/settings/ModelPicker.tsx
+++ b/webview-ui/src/components/settings/ModelPicker.tsx
@@ -215,7 +215,7 @@ export const ModelPicker: React.FC
= ({
- {t("settings.provider.model.title").toString()}
+ Model
diff --git a/webview-ui/src/components/settings/OpenAiModelPicker.tsx b/webview-ui/src/components/settings/OpenAiModelPicker.tsx
index 721c45d1..75acde4b 100644
--- a/webview-ui/src/components/settings/OpenAiModelPicker.tsx
+++ b/webview-ui/src/components/settings/OpenAiModelPicker.tsx
@@ -157,7 +157,7 @@ const OpenAiModelPicker: React.FC = () => {
{
handleModelChange((e.target as HTMLInputElement)?.value)
diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx
index e9225305..35a0fb81 100644
--- a/webview-ui/src/components/settings/SettingsView.tsx
+++ b/webview-ui/src/components/settings/SettingsView.tsx
@@ -197,18 +197,18 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
marginBottom: "17px",
paddingRight: 17,
}}>
-
- {t("settings.title").toString()}
-
+ {t("settings.title").toString()}
{t("settings.done").toString()}
-
+
+
+
-
+
{t("settings.provider.title").toString()}
@@ -247,7 +247,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
-
+
{t("settings.autoApprove.title").toString()}
@@ -445,9 +445,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
paddingLeft: 10,
borderLeft: "2px solid var(--vscode-button-background)",
}}>
-
- {t("settings.autoApprove.execute.commands.title").toString()}
-
+ {t("settings.autoApprove.execute.commands.title").toString()}
{
display: "flex",
alignItems: "center",
gap: "5px",
- backgroundColor: "var(--vscode-button-secondaryBackground)",
+ backgroundColor: "var(--vscode-button-background)",
+ color: "var(--vscode-button-foreground)",
padding: "2px 6px",
borderRadius: "4px",
border: "1px solid var(--vscode-button-secondaryBorder)",
@@ -530,11 +529,11 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
-
+
{t("settings.browser.title").toString()}
-