From 4cd77f28eb9969ec4095e230e0f7a3706b98ed51 Mon Sep 17 00:00:00 2001 From: 0xJacky Date: Mon, 20 Mar 2023 19:48:43 +0800 Subject: [PATCH] wip: ChatGPT assistant --- app.example.ini | 6 + frontend/components.d.ts | 3 + frontend/package.json | 1 + frontend/src/api/openai.ts | 9 + frontend/src/components/ChatGPT/ChatGPT.vue | 219 +++++++ frontend/src/views/domain/DomainEdit.vue | 130 ++-- frontend/yarn.lock | 5 + go.mod | 37 +- go.sum | 100 ++- main.go | 4 +- server/api/config.go | 12 +- server/api/domain.go | 662 ++++++++++---------- server/api/install.go | 5 +- server/api/openai.go | 160 +++++ server/cmd/generate/generate.go | 67 ++ server/model/chatgpt_log.go | 34 + server/model/model.go | 39 +- server/query/auth_tokens.gen.go | 354 +++++++++++ server/query/auths.gen.go | 374 +++++++++++ server/query/certs.gen.go | 394 ++++++++++++ server/query/chat_gpt_logs.gen.go | 358 +++++++++++ server/query/config_backups.gen.go | 378 +++++++++++ server/query/gen.go | 131 ++++ server/query/query.go | 9 + server/router/routers.go | 174 ++--- server/settings/settings.go | 10 + server/test/chatgpt_test.go | 51 ++ 27 files changed, 3197 insertions(+), 529 deletions(-) create mode 100644 frontend/src/api/openai.ts create mode 100644 frontend/src/components/ChatGPT/ChatGPT.vue create mode 100644 server/api/openai.go create mode 100644 server/cmd/generate/generate.go create mode 100644 server/model/chatgpt_log.go create mode 100644 server/query/auth_tokens.gen.go create mode 100644 server/query/auths.gen.go create mode 100644 server/query/certs.gen.go create mode 100644 server/query/chat_gpt_logs.gen.go create mode 100644 server/query/config_backups.gen.go create mode 100644 server/query/gen.go create mode 100644 server/query/query.go create mode 100644 server/test/chatgpt_test.go diff --git a/app.example.ini b/app.example.ini index 95a3dcc1..f78f3399 100644 --- a/app.example.ini +++ b/app.example.ini @@ -14,3 +14,9 @@ NginxConfigDir = [nginx_log] AccessLogPath = /var/log/nginx/access.log ErrorLogPath = /var/log/nginx/error.log + +[openai] +Model = +BaseUrl = +Proxy = +Token = diff --git a/frontend/components.d.ts b/frontend/components.d.ts index c592fc84..df534f58 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -16,6 +16,7 @@ declare module '@vue/runtime-core' { ACol: typeof import('ant-design-vue/es')['Col'] ACollapse: typeof import('ant-design-vue/es')['Collapse'] ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel'] + AComment: typeof import('ant-design-vue/es')['Comment'] AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] ADivider: typeof import('ant-design-vue/es')['Divider'] ADrawer: typeof import('ant-design-vue/es')['Drawer'] @@ -55,9 +56,11 @@ declare module '@vue/runtime-core' { ATabs: typeof import('ant-design-vue/es')['Tabs'] ATag: typeof import('ant-design-vue/es')['Tag'] ATextarea: typeof import('ant-design-vue/es')['Textarea'] + ATooltip: typeof import('ant-design-vue/es')['Tooltip'] BreadcrumbBreadcrumb: typeof import('./src/components/Breadcrumb/Breadcrumb.vue')['default'] ChartAreaChart: typeof import('./src/components/Chart/AreaChart.vue')['default'] ChartRadialBarChart: typeof import('./src/components/Chart/RadialBarChart.vue')['default'] + ChatGPTChatGPT: typeof import('./src/components/ChatGPT/ChatGPT.vue')['default'] CodeEditorCodeEditor: typeof import('./src/components/CodeEditor/CodeEditor.vue')['default'] FooterToolbarFooterToolBar: typeof import('./src/components/FooterToolbar/FooterToolBar.vue')['default'] LogoLogo: typeof import('./src/components/Logo/Logo.vue')['default'] diff --git a/frontend/package.json b/frontend/package.json index c6a999b7..3c6cad15 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,6 +20,7 @@ "apexcharts": "^3.36.3", "axios": "^1.2.2", "dayjs": "^1.11.7", + "highlight.js": "^11.7.0", "marked": "^4.2.5", "nprogress": "^0.2.0", "pinia": "^2.0.28", diff --git a/frontend/src/api/openai.ts b/frontend/src/api/openai.ts new file mode 100644 index 00000000..ea3e24ea --- /dev/null +++ b/frontend/src/api/openai.ts @@ -0,0 +1,9 @@ +import http from '@/lib/http' + +const openai = { + store_record(data: any) { + return http.post('/chat_gpt_record', data) + } +} + +export default openai diff --git a/frontend/src/components/ChatGPT/ChatGPT.vue b/frontend/src/components/ChatGPT/ChatGPT.vue new file mode 100644 index 00000000..da133226 --- /dev/null +++ b/frontend/src/components/ChatGPT/ChatGPT.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/frontend/src/views/domain/DomainEdit.vue b/frontend/src/views/domain/DomainEdit.vue index 564a7ddb..87ceb2d6 100644 --- a/frontend/src/views/domain/DomainEdit.vue +++ b/frontend/src/views/domain/DomainEdit.vue @@ -10,6 +10,7 @@ import domain from '@/api/domain' import ngx from '@/api/ngx' import {message} from 'ant-design-vue' import config from '@/api/config' +import ChatGPT from '@/components/ChatGPT/ChatGPT.vue' const {$gettext, interpolate} = useGettext() @@ -52,6 +53,7 @@ const advance_mode = computed({ advance_mode_ref.value = v } }) +const history_chatgpt_record = ref([]) function handle_response(r: any) { @@ -64,6 +66,7 @@ function handle_response(r: any) { configText.value = r.config enabled.value = r.enabled auto_cert.value = r.auto_cert + history_chatgpt_record.value = r.chatgpt_messages Object.assign(ngx_config, r.tokenized) Object.assign(cert_info_map, r.cert_info) } @@ -73,6 +76,8 @@ function init() { domain.get(name.value).then((r: any) => { handle_response(r) }).catch(handle_parse_error) + } else { + history_chatgpt_record.value = [] } } @@ -159,65 +164,71 @@ function on_change_enabled(checked: boolean) { }