From 87d2c7f0bdd1ab60c64aec4e6f558713be771f1f Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Sun, 26 Nov 2023 20:04:05 -0600 Subject: [PATCH] Add web live chat docs. --- README.md | 16 ++++++++-- docs/static/screenshots/web-live-chat.png | Bin 0 -> 18575 bytes src/WebStarter/Program.cs | 13 +++++--- src/WebStarter/appsettings.json | 2 +- .../agents.json | 2 ++ .../user.json | 11 +++++++ src/web-live-chat/README.md | 16 ---------- .../src/lib/services/api-endpoints.js | 1 + .../src/lib/services/auth-service.js | 30 +++++++++++++++++- .../src/routes/chat/[agentId]/+page.svelte | 2 +- .../[conversationId]/chat-box.svelte | 20 ++++++------ 11 files changed, 78 insertions(+), 35 deletions(-) create mode 100644 docs/static/screenshots/web-live-chat.png create mode 100644 src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/agents.json create mode 100644 src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/user.json diff --git a/README.md b/README.md index 470fd6f6..5494db94 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ It's written in C# running on .Net Core that is full cross-platform framework, t * Support multiple LLM platforms (ChatGPT 3.5 / 4.0, PaLM 2, LLaMA 2, HuggingFace). * Allow multiple agents with different responsibilities cooperate to complete complex tasks. * Build, test, evaluate and audit your LLM agent in one place. -* Support different open source UI [Chatbot UI](src/Plugins/BotSharp.Plugin.ChatbotUI/Chatbot-UI.md), [HuggingChat UI](src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat-UI.md). +* Build-in Web Live Chat UI written in SvelteKit. * Abstract standard Rich Content data structure. Integrate with popular message channels like Facebook Messenger, Slack and Telegram. * Provide RESTful Open API and WebSocket real-time communication. @@ -38,7 +38,19 @@ It's written in C# running on .Net Core that is full cross-platform framework, t PS D:\> cd BotSharp PS D:\BotSharp\> dotnet run -p .\src\WebStarter ``` -2. Run UI project, reference to [Chatbot UI](src/Plugins/BotSharp.Plugin.ChatbotUI/Chatbot-UI.md). + +2. Run UI project, reference to [Web Live Chat](src/web-live-chat/README.md). +```sh +PS D:\> cd .\src\web-live-chat +PS D:\> npm install --force +PS D:\> npm run dev +``` + +Access http://localhost:5010/chat/01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a + +![Alt text](./docs/static/screenshots/web-live-chat.png) + + ### Core Modules diff --git a/docs/static/screenshots/web-live-chat.png b/docs/static/screenshots/web-live-chat.png new file mode 100644 index 0000000000000000000000000000000000000000..7a56b3689c99f82b71473d88ca5afb3ff552ce4f GIT binary patch literal 18575 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 literal 0 HcmV?d00001 diff --git a/src/WebStarter/Program.cs b/src/WebStarter/Program.cs index 87fdfd2c..3e84de6c 100644 --- a/src/WebStarter/Program.cs +++ b/src/WebStarter/Program.cs @@ -2,6 +2,7 @@ using BotSharp.Abstraction.Messaging; using BotSharp.Abstraction.Users; using BotSharp.Core; using BotSharp.Core.Users.Services; +using BotSharp.Plugin.ChatHub; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; @@ -50,14 +51,14 @@ builder.Services.AddBotSharp(builder.Configuration); builder.Services.AddCors(options => { options.AddPolicy("MyCorsPolicy", - builder => - { - builder.AllowAnyOrigin() + builder => builder.WithOrigins("http://localhost:5010") .AllowAnyMethod() - .AllowAnyHeader(); - }); + .AllowAnyHeader() + .AllowCredentials()); }); +builder.Services.AddSignalR(); + var app = builder.Build(); // Configure the HTTP request pipeline. @@ -79,4 +80,6 @@ app.UseBotSharp(); app.UseCors("MyCorsPolicy"); #endif +app.MapHub("/chatHub"); + app.Run(); diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index 7b4845f2..1309cde1 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -146,7 +146,7 @@ "BotSharp.Plugin.KnowledgeBase", "BotSharp.Plugin.Qdrant", "BotSharp.Plugin.PaddleSharp", - // "BotSharp.Plugin.ChatHub", + "BotSharp.Plugin.ChatHub", "BotSharp.Plugin.WeChat", // "BotSharp.Plugin.TelegramBots", // "BotSharp.Plugin.RoutingSpeeder", diff --git a/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/agents.json b/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/agents.json new file mode 100644 index 00000000..32960f8c --- /dev/null +++ b/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/agents.json @@ -0,0 +1,2 @@ +[ +] \ No newline at end of file diff --git a/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/user.json b/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/user.json new file mode 100644 index 00000000..58873daf --- /dev/null +++ b/src/WebStarter/data/users/10d12798-08fb-4aa6-977b-5dd94d82dbfe/user.json @@ -0,0 +1,11 @@ +{ + "firstName": "Guest", + "lastName": "Anonymous", + "email": "guest@gmail.com", + "salt": "55f8fafcf829479ca97e635937440fee", + "password": "3b459ae9988628d41f0362c499a768dd", + "role": "client", + "updatedTime": "2023-11-13T18:00:00Z", + "createdTime": "2023-11-13T18:00:00Z", + "id": "10d12798-08fb-4aa6-977b-5dd94d82dbfe" +} \ No newline at end of file diff --git a/src/web-live-chat/README.md b/src/web-live-chat/README.md index 5c91169b..9db6fded 100644 --- a/src/web-live-chat/README.md +++ b/src/web-live-chat/README.md @@ -1,19 +1,3 @@ -# create-svelte - -Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte). - -## Creating a project - -If you're seeing this, you've probably already done this step. Congrats! - -```bash -# create a new project in the current directory -npm create svelte@latest - -# create a new project in my-app -npm create svelte@latest my-app -``` - ## Developing Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: diff --git a/src/web-live-chat/src/lib/services/api-endpoints.js b/src/web-live-chat/src/lib/services/api-endpoints.js index 141b39ad..4948b1bd 100644 --- a/src/web-live-chat/src/lib/services/api-endpoints.js +++ b/src/web-live-chat/src/lib/services/api-endpoints.js @@ -2,6 +2,7 @@ const host = 'http://localhost:5500'; // user export const tokenUrl = `${host}/token`; +export const myInfoUrl = `${host}/user/my`; export const usrCreationUrl = `${host}/user`; // plugin diff --git a/src/web-live-chat/src/lib/services/auth-service.js b/src/web-live-chat/src/lib/services/auth-service.js index a2ee5445..738e5c0e 100644 --- a/src/web-live-chat/src/lib/services/auth-service.js +++ b/src/web-live-chat/src/lib/services/auth-service.js @@ -1,5 +1,5 @@ import { userStore, getUserStore } from '$lib/helpers/store.js'; -import { tokenUrl, usrCreationUrl } from './api-endpoints.js'; +import { tokenUrl, myInfoUrl, usrCreationUrl } from './api-endpoints.js'; /** * This callback type is called `requestCallback` and is displayed as a global symbol. @@ -36,6 +36,34 @@ export async function getToken(email, password, onSucceed) { .catch(error => alert(error.message)); } +/** + * @param {string} token + * @returns {Promise} + */ +export async function myInfo(token) { + const headers = { + Authorization: `Bearer ${token}`, + }; + + const info = await fetch(myInfoUrl, { + method: 'GET', + headers: headers, + }).then(response => { + if (response.ok) { + return response.json(); + } else { + alert(response.statusText); + } + }).then(result => { + let user = getUserStore(); + userStore.set({ ...user, init: false, id: result.id }); + return result; + }) + .catch(error => alert(error.message)); + + return info; +} + /** * @param {string} firstName * @param {string} lastName diff --git a/src/web-live-chat/src/routes/chat/[agentId]/+page.svelte b/src/web-live-chat/src/routes/chat/[agentId]/+page.svelte index 402e61ef..caab5640 100644 --- a/src/web-live-chat/src/routes/chat/[agentId]/+page.svelte +++ b/src/web-live-chat/src/routes/chat/[agentId]/+page.svelte @@ -22,7 +22,7 @@ userToken = token; }); } else { - userToken = $page.url.searchParams.get('token'); + userToken = $page.url.searchParams.get('token') ?? "unauthorized"; } setAuthorization(userToken); conversation = await newConversation(params.agentId); diff --git a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte index 7d34282e..640e454b 100644 --- a/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte +++ b/src/web-live-chat/src/routes/chat/[agentId]/[conversationId]/chat-box.svelte @@ -13,6 +13,7 @@ import { page } from '$app/stores'; import { onMount } from 'svelte'; import Link from 'svelte-link'; + import { myInfo } from '$lib/services/auth-service.js'; import { signalr } from '$lib/services/signalr-service.js'; import { sendMessageToHub, GetDialogs } from '$lib/services/conversation-service.js'; import { setAuthorization } from '$lib/helpers/http'; @@ -31,7 +32,10 @@ const params = $page.params; let text = "Hi"; - + + /** @type {import('$typedefs').UserModel} */ + let currentUser; + // @ts-ignore let scrollbar; @@ -39,8 +43,11 @@ let dialogs = []; onMount(async () => { - const token = $page.url.searchParams.get('token'); + const token = $page.url.searchParams.get('token') ?? "unauthorized"; setAuthorization(token); + + currentUser = await myInfo(token); + dialogs = await GetDialogs(params.conversationId); signalr.onMessageReceivedFromClient = onMessageReceivedFromClient; signalr.onMessageReceivedFromCsr = onMessageReceivedFromCsr; @@ -86,11 +93,6 @@ viewport.scrollTo({ top: viewport.scrollHeight, behavior: 'smooth' }); // set scroll offset }, 200); } - - const currentUser = { - name: 'Annie Holder', - isActive: true - };
@@ -99,7 +101,7 @@
-
Steven Franklin
+
Guest

Active now

@@ -174,7 +176,7 @@ {#each dialogs as message}
  • + class={message.sender.id === currentUser.id ? 'right' : ''}>