From 3f5b41960149e8b74c04df549e01911caf03818e Mon Sep 17 00:00:00 2001 From: Timothy Carambat <rambat1010@gmail.com> Date: Fri, 29 Sep 2023 22:45:35 +0200 Subject: [PATCH] Add support for chatting via the API (#261) --- server/endpoints/api/workspace/index.js | 77 ++++++++++++++++++++++- server/swagger/openapi.json | 84 +++++++++++++++++++++++++ 2 files changed, 160 insertions(+), 1 deletion(-) diff --git a/server/endpoints/api/workspace/index.js b/server/endpoints/api/workspace/index.js index 2475f4b1b..baa97a0c1 100644 --- a/server/endpoints/api/workspace/index.js +++ b/server/endpoints/api/workspace/index.js @@ -3,7 +3,10 @@ const { Telemetry } = require("../../../models/telemetry"); const { DocumentVectors } = require("../../../models/vectors"); const { Workspace } = require("../../../models/workspace"); const { WorkspaceChats } = require("../../../models/workspaceChats"); -const { convertToChatHistory } = require("../../../utils/chats"); +const { + convertToChatHistory, + chatWithWorkspace, +} = require("../../../utils/chats"); const { getVectorDbClass } = require("../../../utils/helpers"); const { multiUserMode, reqBody } = require("../../../utils/http"); const { validApiKey } = require("../../../utils/middleware/validApiKey"); @@ -427,6 +430,78 @@ function apiWorkspaceEndpoints(app) { } } ); + + app.post( + "/v1/workspace/:slug/chat", + [validApiKey], + async (request, response) => { + /* + #swagger.tags = ['Workspaces'] + #swagger.description = 'Execute a chat with a workspace' + #swagger.requestBody = { + description: 'prompt to send to the workspace and the type of conversation (query or chat).', + required: true, + type: 'object', + content: { + "application/json": { + example: { + message: "What is AnythingLLM?", + mode: "query | chat" + } + } + } + } + #swagger.responses[200] = { + content: { + "application/json": { + schema: { + type: 'object', + example: { + id: 'chat-uuid', + type: "abort | textResponse", + textResponse: "Response to your query", + sources: [{title: "anythingllm.txt", chunk: "This is a context chunk used in the answer of the prompt by the LLM,"}], + close: true, + error: "null | text string of the failure mode." + } + } + } + } + } + #swagger.responses[403] = { + schema: { + "$ref": "#/definitions/InvalidAPIKey" + } + } + */ + try { + const { slug } = request.params; + const { message, mode = "query" } = reqBody(request); + const workspace = await Workspace.get({ slug }); + + if (!workspace) { + response.sendStatus(400).end(); + return; + } + + const result = await chatWithWorkspace(workspace, message, mode); + await Telemetry.sendTelemetry("sent_chat", { + LLMSelection: process.env.LLM_PROVIDER || "openai", + VectorDbSelection: process.env.VECTOR_DB || "pinecone", + }); + response.status(200).json({ ...result }); + } catch (e) { + response.status(500).json({ + id: uuidv4(), + type: "abort", + textResponse: null, + sources: [], + close: true, + error: e.message, + }); + } + } + ); } module.exports = { apiWorkspaceEndpoints }; diff --git a/server/swagger/openapi.json b/server/swagger/openapi.json index 6ff36279b..fce0ca967 100644 --- a/server/swagger/openapi.json +++ b/server/swagger/openapi.json @@ -1531,6 +1531,90 @@ } } }, + "/v1/workspace/{slug}/chat": { + "post": { + "tags": [ + "Workspaces" + ], + "description": "Execute a chat with a workspace", + "parameters": [ + { + "name": "slug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Authorization", + "in": "header", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "example": { + "id": "chat-uuid", + "type": "abort | textResponse", + "textResponse": "Response to your query", + "sources": [ + { + "title": "anythingllm.txt", + "chunk": "This is a context chunk used in the answer of the prompt by the LLM," + } + ], + "close": true, + "error": "null | text string of the failure mode." + } + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidAPIKey" + } + }, + "application/xml": { + "schema": { + "$ref": "#/components/schemas/InvalidAPIKey" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "description": "prompt to send to the workspace and the type of conversation (query or chat).", + "required": true, + "type": "object", + "content": { + "application/json": { + "example": { + "message": "What is AnythingLLM?", + "mode": "query | chat" + } + } + } + } + } + }, "/v1/system/env-dump": { "get": { "tags": [ -- GitLab