From 729ff3bc242a33a93c8a2ac2af9fda8233cf6fdc Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 14 Mar 2025 19:49:04 +0100 Subject: [PATCH] ai chat with openai npm module, add MODERATOR_AI Role --- admin/src/components/AiChat.vue | 64 ++- admin/src/config/index.js | 3 + admin/src/config/schema.js | 2 + admin/src/graphql/aiChat.graphql | 7 + admin/src/locales/de.json | 7 +- admin/src/locales/en.json | 7 +- admin/src/pages/CreationConfirm.vue | 3 +- admin/vite.config.js | 1 + backend/.nvmrc | 2 +- backend/Dockerfile | 2 +- backend/package.json | 9 +- backend/src/apis/openai/OpenaiClient.ts | 119 +++++ backend/src/apis/openai/model/Message.ts | 10 + backend/src/auth/MODERATOR_AI_RIGHTS.ts | 3 + backend/src/auth/RIGHTS.ts | 2 + backend/src/auth/ROLES.ts | 9 + backend/src/config/index.ts | 12 +- backend/src/config/schema.ts | 14 + backend/src/graphql/directive/isAuthorized.ts | 4 + backend/src/graphql/enum/RoleNames.ts | 1 + backend/src/graphql/input/OpenaiMessage.ts | 14 + backend/src/graphql/model/ChatGptMessage.ts | 19 + .../src/graphql/resolver/AiChatResolver.ts | 36 ++ backend/yarn.lock | 483 +++++++++++++----- config/src/commonSchema.ts | 4 + .../0089-add_openai_threads/OpenaiThreads.ts | 13 + database/entity/OpenaiThreads.ts | 1 + database/entity/index.ts | 2 + .../migrations/0089-add_openai_threads.ts | 16 + deployment/bare_metal/start.sh | 8 + 30 files changed, 715 insertions(+), 162 deletions(-) create mode 100644 admin/src/graphql/aiChat.graphql create mode 100644 backend/src/apis/openai/OpenaiClient.ts create mode 100644 backend/src/apis/openai/model/Message.ts create mode 100644 backend/src/auth/MODERATOR_AI_RIGHTS.ts create mode 100644 backend/src/graphql/input/OpenaiMessage.ts create mode 100644 backend/src/graphql/model/ChatGptMessage.ts create mode 100644 backend/src/graphql/resolver/AiChatResolver.ts create mode 100644 database/entity/0089-add_openai_threads/OpenaiThreads.ts create mode 100644 database/entity/OpenaiThreads.ts create mode 100644 database/migrations/0089-add_openai_threads.ts diff --git a/admin/src/components/AiChat.vue b/admin/src/components/AiChat.vue index ad568edd5..ca1d3a93a 100644 --- a/admin/src/components/AiChat.vue +++ b/admin/src/components/AiChat.vue @@ -1,57 +1,76 @@ @@ -68,11 +87,12 @@ const sendMessage = () => { position: absolute; bottom: 0; right: 0; + border: 1px solid darkblue; } .chat-window { - width: 300px; - height: 400px; + width: 450px; + height: 600px; background-color: white; border: 1px solid #ccc; border-radius: 8px; @@ -109,11 +129,11 @@ const sendMessage = () => { margin-left: auto; } -.message.bot { +.message.assistant { text-align: left; } -.message.bot .message-content { +.message.assistant .message-content { background-color: #e9ecef; color: black; margin-right: auto; diff --git a/admin/src/config/index.js b/admin/src/config/index.js index b73657219..0b63726ba 100644 --- a/admin/src/config/index.js +++ b/admin/src/config/index.js @@ -51,11 +51,14 @@ const debug = { DEBUG_DISABLE_AUTH: process.env.DEBUG_DISABLE_AUTH === 'true' ?? false, } +const OPENAI_ACTIVE = process.env.OPENAI_ACTIVE === 'true' ?? false + const CONFIG = { ...version, ...environment, ...endpoints, ...debug, + OPENAI_ACTIVE, ADMIN_MODULE_URL, COMMUNITY_URL, } diff --git a/admin/src/config/schema.js b/admin/src/config/schema.js index 7aee8136f..459cbdd08 100644 --- a/admin/src/config/schema.js +++ b/admin/src/config/schema.js @@ -6,6 +6,7 @@ const { DEBUG, GRAPHQL_URI, NODE_ENV, + OPENAI_ACTIVE, PRODUCTION, } = require('gradido-config/build/src/commonSchema.js') const Joi = require('joi') @@ -18,6 +19,7 @@ module.exports = Joi.object({ DEBUG, GRAPHQL_URI, NODE_ENV, + OPENAI_ACTIVE, PRODUCTION, ADMIN_HOSTING: Joi.string() diff --git a/admin/src/graphql/aiChat.graphql b/admin/src/graphql/aiChat.graphql new file mode 100644 index 000000000..7d4d726eb --- /dev/null +++ b/admin/src/graphql/aiChat.graphql @@ -0,0 +1,7 @@ +mutation sendMessage($input: OpenaiMessage!) { + sendMessage(input: $input) { + content + role + threadId + } +} \ No newline at end of file diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index 237705ec2..d009946ac 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -3,9 +3,13 @@ "actions": "Aktionen", "alias": "Alias", "all_emails": "Alle Nutzer", + "ai": { + "chat": "Chat", + "chat-open": "Chat öffnen", + "chat-placeholder": "Schreibe eine Nachricht..." + }, "back": "zurück", "change_user_role": "Nutzerrolle ändern", - "chat": "Chat", "close": "Schließen", "contributionLink": { "amount": "Betrag", @@ -226,6 +230,7 @@ "removeNotSelf": "Als Admin/Moderator kannst du dich nicht selber löschen.", "reset": "Zurücksetzen", "save": "Speichern", + "send": "Senden", "statistic": { "activeUsers": "Aktive Mitglieder", "count": "Menge", diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index cb1f24477..eec10eece 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -3,9 +3,13 @@ "actions": "Actions", "alias": "Alias", "all_emails": "All users", + "ai": { + "chat": "Chat", + "chat-open": "Open chat", + "chat-placeholder": "Type your message here..." + }, "back": "back", "change_user_role": "Change user role", - "chat": "Chat", "close": "Close", "contributionLink": { "amount": "Amount", @@ -226,6 +230,7 @@ "removeNotSelf": "As an admin/moderator, you cannot delete yourself.", "reset": "Reset", "save": "Save", + "send": "Send", "statistic": { "activeUsers": "Active members", "count": "Count", diff --git a/admin/src/pages/CreationConfirm.vue b/admin/src/pages/CreationConfirm.vue index d23402f6d..557ba587f 100644 --- a/admin/src/pages/CreationConfirm.vue +++ b/admin/src/pages/CreationConfirm.vue @@ -69,7 +69,7 @@ align="center" :hide-ellipsis="true" /> - +