Skip to content

Commit 1581ed1

Browse files
authored
Merge pull request #207 from samhvw8/feat/openai-list-models
feat list model for open ai compatible
2 parents 4a9f78b + fbb99f3 commit 1581ed1

File tree

6 files changed

+406
-7
lines changed

6 files changed

+406
-7
lines changed

src/core/webview/ClineProvider.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,11 @@ export class ClineProvider implements vscode.WebviewViewProvider {
520520
case "refreshOpenRouterModels":
521521
await this.refreshOpenRouterModels()
522522
break
523+
case "refreshOpenAiModels":
524+
const { apiConfiguration } = await this.getState()
525+
const openAiModels = await this.getOpenAiModels(apiConfiguration.openAiBaseUrl, apiConfiguration.openAiApiKey)
526+
this.postMessageToWebview({ type: "openAiModels", openAiModels })
527+
break
523528
case "openImage":
524529
openImage(message.text!)
525530
break
@@ -704,6 +709,32 @@ export class ClineProvider implements vscode.WebviewViewProvider {
704709
}
705710
}
706711

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

709740
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)