Skip to content

Commit 198e196

Browse files
committed
feat openai-list-models
1 parent bc7dee6 commit 198e196

File tree

6 files changed

+407
-7
lines changed

6 files changed

+407
-7
lines changed

src/core/webview/ClineProvider.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,11 @@ export class ClineProvider implements vscode.WebviewViewProvider {
519519
case "refreshOpenRouterModels":
520520
await this.refreshOpenRouterModels()
521521
break
522+
case "refreshOpenAiModels":
523+
const { apiConfiguration } = await this.getState()
524+
const openAiModels = await this.getOpenAiModels(apiConfiguration.openAiBaseUrl, apiConfiguration.openAiApiKey)
525+
this.postMessageToWebview({ type: "openAiModels", openAiModels })
526+
break
522527
case "openImage":
523528
openImage(message.text!)
524529
break
@@ -699,6 +704,32 @@ export class ClineProvider implements vscode.WebviewViewProvider {
699704
}
700705
}
701706

707+
// OpenAi
708+
709+
async getOpenAiModels(baseUrl?: string, apiKey?: string) {
710+
try {
711+
if (!baseUrl) {
712+
return []
713+
}
714+
715+
if (!URL.canParse(baseUrl)) {
716+
return []
717+
}
718+
719+
const config: Record<string, any> = {}
720+
if (apiKey) {
721+
config["headers"] = { Authorization: `Bearer ${apiKey}` }
722+
}
723+
724+
const response = await axios.get(`${baseUrl}/models`, config)
725+
const modelsArray = response.data?.data?.map((model: any) => model.id) || []
726+
const models = [...new Set<string>(modelsArray)]
727+
return models
728+
} catch (error) {
729+
return []
730+
}
731+
}
732+
702733
// OpenRouter
703734

704735
async handleOpenRouterCallback(code: string) {

src/shared/ExtensionMessage.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export interface ExtensionMessage {
1717
| "invoke"
1818
| "partialMessage"
1919
| "openRouterModels"
20+
| "openAiModels"
2021
| "mcpServers"
2122
text?: string
2223
action?:
@@ -33,6 +34,7 @@ export interface ExtensionMessage {
3334
filePaths?: string[]
3435
partialMessage?: ClineMessage
3536
openRouterModels?: Record<string, ModelInfo>
37+
openAiModels?: string[]
3638
mcpServers?: McpServer[]
3739
}
3840

src/shared/WebviewMessage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export interface WebviewMessage {
2828
| "openMention"
2929
| "cancelTask"
3030
| "refreshOpenRouterModels"
31+
| "refreshOpenAiModels"
3132
| "alwaysAllowBrowser"
3233
| "alwaysAllowMcp"
3334
| "playSound"

webview-ui/src/components/settings/ApiOptions.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import OpenRouterModelPicker, {
3535
ModelDescriptionMarkdown,
3636
OPENROUTER_MODEL_PICKER_Z_INDEX,
3737
} from "./OpenRouterModelPicker"
38+
import OpenAiModelPicker from "./OpenAiModelPicker"
3839

3940
interface ApiOptionsProps {
4041
showModelOptions: boolean
@@ -438,13 +439,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage }:
438439
placeholder="Enter API Key...">
439440
<span style={{ fontWeight: 500 }}>API Key</span>
440441
</VSCodeTextField>
441-
<VSCodeTextField
442-
value={apiConfiguration?.openAiModelId || ""}
443-
style={{ width: "100%" }}
444-
onInput={handleInputChange("openAiModelId")}
445-
placeholder={"Enter Model ID..."}>
446-
<span style={{ fontWeight: 500 }}>Model ID</span>
447-
</VSCodeTextField>
442+
<OpenAiModelPicker />
448443
<div style={{ display: 'flex', alignItems: 'center' }}>
449444
<VSCodeCheckbox
450445
checked={apiConfiguration?.includeStreamOptions ?? true}

0 commit comments

Comments
 (0)