Skip to content
This repository was archived by the owner on Feb 28, 2026. It is now read-only.

Commit ee659f7

Browse files
authored
Merge pull request #138 from slashbaseide/utk/feat/openai-models
✨ adds OpenAi Models to settings
2 parents 660602c + 7c7d8b9 commit ee659f7

19 files changed

Lines changed: 272 additions & 64 deletions

File tree

Lines changed: 80 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,94 @@
11
import React, { FunctionComponent, useEffect, useState } from 'react'
22
import Constants from '../../constants'
33
import eventService from '../../events/eventService'
4+
import toast from 'react-hot-toast'
45

56
const AdvancedSettings: FunctionComponent<{}> = () => {
67

8+
const [openAIKey, setOpenAIKey] = useState<string>("")
9+
const [openAIModel, setOpenAIModel] = useState<string>("")
10+
const [modelOptions, setModelOptions] = useState<{ value: string }[]>([])
711

8-
const [openAIKey, setOpenAIKey] = useState<string>("")
12+
useEffect(() => {
13+
(async () => {
14+
const result = await eventService.listSupportedAIModels()
15+
setModelOptions(result.data.map(model => ({ value: model })))
16+
})();
17+
(async () => {
18+
const result = await eventService.getSingleSetting(Constants.SETTING_KEYS.OPENAI_KEY)
19+
setOpenAIKey(result.data)
20+
})();
21+
(async () => {
22+
const result = await eventService.getSingleSetting(Constants.SETTING_KEYS.OPENAI_MODEL)
23+
setOpenAIModel(result.data)
24+
})();
25+
}, [])
926

10-
useEffect(() => {
11-
(async () => {
12-
let result = await eventService.getSingleSetting(Constants.SETTING_KEYS.OPENAI_KEY)
13-
setOpenAIKey(result.data)
14-
})()
15-
}, [])
1627

17-
const updateOpenAIKey = async () => {
18-
const result = await eventService.updateSingleSetting(Constants.SETTING_KEYS.OPENAI_KEY, openAIKey)
19-
if (result.success)
20-
setOpenAIKey(openAIKey)
28+
const updateOpenAIKey = async () => {
29+
const result = await eventService.updateSingleSetting(Constants.SETTING_KEYS.OPENAI_KEY, openAIKey)
30+
if (result.success) {
31+
setOpenAIKey(openAIKey)
32+
toast.success("saved")
2133
}
34+
}
2235

23-
return (
24-
<React.Fragment>
25-
<h1>Advanced Settings</h1>
26-
<br />
27-
<h2>OpenAI Key</h2>
28-
<p>Update OpenAI API key to enable Generate SQL tool.</p>
29-
<div className="buttons has-addons">
30-
<div className="field has-addons">
31-
<p className="control is-expanded">
32-
<input
33-
className="input"
34-
type="text"
35-
value={openAIKey}
36-
onChange={(e: React.ChangeEvent<HTMLInputElement>) => { setOpenAIKey(e.target.value) }}
37-
placeholder="Enter API key" />
38-
</p>
39-
<p className="control">
40-
<a className="button" onClick={updateOpenAIKey}>
41-
<i className="fas fa-check" />
42-
</a>
43-
</p>
44-
</div>
45-
</div>
46-
<br />
47-
</React.Fragment>
48-
)
36+
const updateOpenAIModel = async () => {
37+
const result = await eventService.updateSingleSetting(Constants.SETTING_KEYS.OPENAI_MODEL, openAIModel)
38+
if (result.success)
39+
setOpenAIModel(openAIModel)
40+
toast.success("saved")
41+
}
42+
43+
const handleModelChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {
44+
const value = e.target.value
45+
setOpenAIModel(value)
46+
}
47+
48+
return (
49+
<React.Fragment>
50+
<h1>Advanced Settings</h1>
51+
<br />
52+
<h2>OpenAI Key</h2>
53+
<p>Update OpenAI API key to enable Generate SQL tool.</p>
54+
<div className="buttons has-addons">
55+
<div className="field has-addons" style={{ minWidth: 550 }}>
56+
<p className="control is-expanded">
57+
<input
58+
className="input"
59+
type="text"
60+
value={openAIKey}
61+
onChange={(e: React.ChangeEvent<HTMLInputElement>) => { setOpenAIKey(e.target.value) }}
62+
placeholder="Enter API key" />
63+
</p>
64+
<p className="control">
65+
<a className="button" onClick={updateOpenAIKey}>
66+
<i className="fas fa-check" />
67+
</a>
68+
</p>
69+
</div>
70+
</div>
71+
<h2>OpenAI Model</h2>
72+
<p>Update OpenAI Model to enable Generate SQL tool.</p>
73+
<div className="field has-addons">
74+
<p className="control">
75+
<span className="select">
76+
<select value={openAIModel} onChange={e => handleModelChange(e)}>
77+
{modelOptions.map((e, idx) => {
78+
return <option value={e.value} key={idx}> {e.value} </option>
79+
})}
80+
</select>
81+
</span>
82+
</p>
83+
<p className="control">
84+
<button className="button" onClick={() => updateOpenAIModel()}>
85+
<i className="fas fa-check" />
86+
</button>
87+
</p>
88+
</div>
89+
<br />
90+
</React.Fragment>
91+
)
4992
}
5093

5194
export default AdvancedSettings

frontend/desktop/src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ const Constants: ConstantsType = {
6464
TELEMETRY_ENABLED: "TELEMETRY_ENABLED",
6565
LOGS_EXPIRE: "LOGS_EXPIRE",
6666
OPENAI_KEY: "OPENAI_KEY",
67+
OPENAI_MODEL:"OPENAI_MODEL"
6768
},
6869
}
6970

frontend/desktop/src/events/constants.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ const Events: EventType = {
142142
REQUEST: "event:ai:gensql",
143143
RESPONSE: "response:ai:gensql"
144144
},
145+
AI_LIST_SUPPORTEDMODELS: {
146+
REQUEST: "event:ai:listmodels",
147+
RESPONSE: "response:ai:listmodels"
148+
},
145149
}
146150

147151
export default Events

frontend/desktop/src/events/eventService.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,12 @@ const runGenerateSQL = async function (dbConnId: string, text: string): Promise<
210210
return response
211211
}
212212

213+
const listSupportedAIModels = async function (): Promise<ApiResult<string[]>> {
214+
const response = responseEvent<ApiResult<string[]>>(Events.AI_LIST_SUPPORTEDMODELS.RESPONSE)
215+
EventsEmit(Events.AI_LIST_SUPPORTEDMODELS.REQUEST, Events.AI_LIST_SUPPORTEDMODELS.RESPONSE)
216+
return response
217+
}
218+
213219
export default {
214220
getHealthCheck,
215221
getProjects,
@@ -244,5 +250,6 @@ export default {
244250
closeTab,
245251
runConsoleCommand,
246252
checkConnection,
247-
runGenerateSQL
253+
runGenerateSQL,
254+
listSupportedAIModels
248255
}

frontend/server/src/components/settingfragments/advanced.tsx

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,27 @@
11
import React, { FunctionComponent, useEffect, useState } from 'react'
22
import Constants from '../../constants'
33
import apiService from '../../network/apiService'
4+
import toast from 'react-hot-toast'
45

56
const AdvancedSettings: FunctionComponent<{}> = () => {
67

7-
88
const [openAIKey, setOpenAIKey] = useState<string>("")
9+
const [openAIModel, setOpenAIModel] = useState<string>("")
10+
const [modelOptions, setModelOptions] = useState<{ value: string }[]>([])
911

1012
useEffect(() => {
1113
(async () => {
12-
let result = await apiService.getSingleSetting(Constants.SETTING_KEYS.OPENAI_KEY)
14+
const result = await apiService.listSupportedAIModels()
15+
setModelOptions(result.data.map(model => ({ value: model })))
16+
})();
17+
(async () => {
18+
const result = await apiService.getSingleSetting(Constants.SETTING_KEYS.OPENAI_KEY)
1319
setOpenAIKey(result.data)
14-
})()
20+
})();
21+
(async () => {
22+
const result = await apiService.getSingleSetting(Constants.SETTING_KEYS.OPENAI_MODEL)
23+
setOpenAIModel(result.data)
24+
})();
1525
}, [])
1626

1727
const updateOpenAIKey = async () => {
@@ -20,14 +30,26 @@ const AdvancedSettings: FunctionComponent<{}> = () => {
2030
setOpenAIKey(openAIKey)
2131
}
2232

33+
const updateOpenAIModel = async () => {
34+
const result = await apiService.updateSingleSetting(Constants.SETTING_KEYS.OPENAI_MODEL, openAIModel)
35+
if (result.success)
36+
setOpenAIModel(openAIModel)
37+
toast.success("saved")
38+
}
39+
40+
const handleModelChange = (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {
41+
const value = e.target.value
42+
setOpenAIModel(value)
43+
}
44+
2345
return (
2446
<React.Fragment>
2547
<h1>Advanced Settings</h1>
2648
<br />
2749
<h2>OpenAI Key</h2>
2850
<p>Update OpenAI API key to enable Generate SQL tool.</p>
2951
<div className="buttons has-addons">
30-
<div className="field has-addons">
52+
<div className="field has-addons" style={{ minWidth: 550 }}>
3153
<p className="control is-expanded">
3254
<input
3355
className="input"
@@ -43,6 +65,24 @@ const AdvancedSettings: FunctionComponent<{}> = () => {
4365
</p>
4466
</div>
4567
</div>
68+
<h2>OpenAI Model</h2>
69+
<p>Update OpenAI Model to enable Generate SQL tool.</p>
70+
<div className="field has-addons">
71+
<p className="control">
72+
<span className="select">
73+
<select value={openAIModel} onChange={e => handleModelChange(e)}>
74+
{modelOptions.map((e, idx) => {
75+
return <option value={e.value} key={idx}> {e.value} </option>
76+
})}
77+
</select>
78+
</span>
79+
</p>
80+
<p className="control">
81+
<button className="button" onClick={() => updateOpenAIModel()}>
82+
<i className="fas fa-check" />
83+
</button>
84+
</p>
85+
</div>
4686
<br />
4787
</React.Fragment>
4888
)

frontend/server/src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ const Constants: ConstantsType = {
8888
TELEMETRY_ENABLED: "TELEMETRY_ENABLED",
8989
LOGS_EXPIRE: "LOGS_EXPIRE",
9090
OPENAI_KEY: "OPENAI_KEY",
91+
OPENAI_MODEL: "OPENAI_MODEL"
9192
},
9293
ROLES: {
9394
ADMIN: "Admin"

frontend/server/src/network/apiService.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,11 @@ const generateSQL = async function (dbConnectionId: string, text: string): Promi
306306
.then(res => res.data)
307307
}
308308

309-
309+
const listSupportedAIModels = async function (): Promise<ApiResult<string[]>> {
310+
return await Request.apiInstance
311+
.get<any, AxiosResponse<ApiResult<string[]>>>(`/ai/listmodels`)
312+
.then(res => res.data)
313+
}
310314

311315
export default {
312316
getHealthCheck,
@@ -356,5 +360,6 @@ export default {
356360
addRole,
357361
deleteRole,
358362
updateRolePermission,
359-
generateSQL
363+
generateSQL,
364+
listSupportedAIModels
360365
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
github.com/jackc/pgx/v4 v4.17.2
1414
github.com/joho/godotenv v1.4.0
1515
github.com/posthog/posthog-go v0.0.0-20221221115252-24dfed35d71a
16-
github.com/sashabaranov/go-openai v1.9.4
16+
github.com/sashabaranov/go-openai v1.17.2
1717
github.com/tdewolff/parse/v2 v2.6.5
1818
github.com/wailsapp/wails/v2 v2.4.1
1919
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
355355
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
356356
github.com/samber/lo v1.27.1 h1:sTXwkRiIFIQG+G0HeAvOEnGjqWeWtI9cg5/n51KrxPg=
357357
github.com/samber/lo v1.27.1/go.mod h1:it33p9UtPMS7z72fP4gw/EIfQB2eI8ke7GR2wc6+Rhg=
358-
github.com/sashabaranov/go-openai v1.9.4 h1:KanoCEoowAI45jVXlenMCckutSRr39qOmSi9MyPBfZM=
359-
github.com/sashabaranov/go-openai v1.9.4/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
358+
github.com/sashabaranov/go-openai v1.17.2 h1:Uj1Msqh43S9XhjUXYyOqOHMiRQtgQXCo5O0FeWZz7tU=
359+
github.com/sashabaranov/go-openai v1.17.2/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
360360
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
361361
github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 h1:rmMl4fXJhKMNWl+K+r/fq4FbbKI+Ia2m9hYBLm2h4G4=
362362
github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94/go.mod h1:90zrgN3D/WJsDd1iXHT96alCoN2KJo6/4x1DZC3wZs8=

internal/common/controllers/ai.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@ func (AIController) GenerateSQL(dbConnectionID, text string) (string, error) {
3232

3333
return ai.GenerateSQL(dbConn.Type, text, datamodels)
3434
}
35+
36+
func (AIController) GetModels() []string {
37+
return ai.ListSupportedOpenAiModels()
38+
}

0 commit comments

Comments
 (0)