Save feedback id to message and update feedback

This commit is contained in:
Ilango
2024-02-15 15:13:47 +05:30
parent 430dcedc4d
commit 26d5d6d6a2
7 changed files with 70 additions and 21 deletions
+1 -1
View File
@@ -41,6 +41,7 @@ export interface IChatMessage {
memoryType?: string
sessionId?: string
createdDate: Date
feedbackId?: string
}
export interface IChatMessageFeedback {
@@ -48,7 +49,6 @@ export interface IChatMessageFeedback {
content?: string
chatflowid: string
chatId: string
messageId: string
rating: ChatMessageRatingType
createdDate: Date
}
@@ -1,7 +1,6 @@
/* eslint-disable */
import { Entity, Column, CreateDateColumn, PrimaryGeneratedColumn, Index, OneToOne, JoinColumn } from 'typeorm'
import { Entity, Column, CreateDateColumn, PrimaryGeneratedColumn, Index } from 'typeorm'
import { IChatMessage, MessageType } from '../../Interface'
import { ChatMessageFeedback } from './ChatMessageFeedback'
@Entity()
export class ChatMessage implements IChatMessage {
@@ -42,7 +41,6 @@ export class ChatMessage implements IChatMessage {
@CreateDateColumn()
createdDate: Date
@OneToOne(() => ChatMessageFeedback)
@JoinColumn()
feedback?: ChatMessageFeedback
@Column({ nullable: true })
feedbackId?: string
}
@@ -17,9 +17,6 @@ export class ChatMessageFeedback implements IChatMessageFeedback {
@Column()
chatId: string
@Column()
messageId: string
@Column()
rating: ChatMessageRatingType
@@ -3,7 +3,7 @@ import { MigrationInterface, QueryRunner } from 'typeorm'
export class AddFeedback1707213619308 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`CREATE TABLE IF NOT EXISTS "chat_message_feedback" ("id" varchar PRIMARY KEY NOT NULL, "chatflowid" varchar NOT NULL, "content" text, "chatId" varchar NOT NULL, "messageId" varchar NOT NULL, "rating" varchar NOT NULL, "createdDate" datetime NOT NULL DEFAULT (datetime('now')));`
`CREATE TABLE IF NOT EXISTS "chat_message_feedback" ("id" varchar PRIMARY KEY NOT NULL, "chatflowid" varchar NOT NULL, "content" text, "chatId" varchar NOT NULL, "rating" varchar NOT NULL, "createdDate" datetime NOT NULL DEFAULT (datetime('now')));`
)
}
@@ -0,0 +1,20 @@
import { MigrationInterface, QueryRunner } from 'typeorm'
export class AddFeedbackToChatMessage1707986407818 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`CREATE TABLE "temp_chat_message" ("id" varchar PRIMARY KEY NOT NULL, "role" varchar NOT NULL, "chatflowid" varchar NOT NULL, "content" text NOT NULL, "sourceDocuments" text, "usedTools" text, "fileAnnotations" text, "createdDate" datetime NOT NULL DEFAULT (datetime('now')), "chatType" VARCHAR NOT NULL DEFAULT 'INTERNAL', "chatId" VARCHAR NOT NULL, "memoryType" VARCHAR, "sessionId" VARCHAR, "feedbackId" varchar);`
)
await queryRunner.query(
`INSERT INTO "temp_chat_message" ("id", "role", "chatflowid", "content", "sourceDocuments", "usedTools", "fileAnnotations", "createdDate", "chatType", "chatId", "memoryType", "sessionId") SELECT "id", "role", "chatflowid", "content", "sourceDocuments", "usedTools", "fileAnnotations", "createdDate", "chatType", "chatId", "memoryType", "sessionId" FROM "chat_message";`
)
await queryRunner.query(`DROP TABLE "chat_message";`)
await queryRunner.query(`ALTER TABLE "temp_chat_message" RENAME TO "chat_message";`)
await queryRunner.query(`CREATE INDEX "IDX_e574527322272fd838f4f0f3d3" ON "chat_message" ("chatflowid") ;`)
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TABLE IF EXISTS "temp_chat_message";`)
await queryRunner.query(`ALTER TABLE "chat_message" DROP COLUMN "feedbackId";`)
}
}
@@ -12,6 +12,7 @@ import { AddCategoryToChatFlow1699900910291 } from './1699900910291-AddCategoryT
import { AddFileAnnotationsToChatMessage1700271021237 } from './1700271021237-AddFileAnnotationsToChatMessage'
import { AddVariableEntity1699325775451 } from './1702200925471-AddVariableEntity'
import { AddFeedback1707213619308 } from './1707213619308-AddFeedback'
import { AddFeedbackToChatMessage1707986407818 } from './1707986407818-AddFeedbackToChatMessage'
export const sqliteMigrations = [
Init1693835579790,
@@ -27,5 +28,6 @@ export const sqliteMigrations = [
AddCategoryToChatFlow1699900910291,
AddFileAnnotationsToChatMessage1700271021237,
AddVariableEntity1699325775451,
AddFeedback1707213619308
AddFeedback1707213619308,
AddFeedbackToChatMessage1707986407818
]
+42 -10
View File
@@ -10,7 +10,7 @@ import logger from './utils/logger'
import { expressRequestLogger } from './utils/logger'
import { v4 as uuidv4 } from 'uuid'
import OpenAI from 'openai'
import { Between, IsNull, FindOptionsWhere, createQueryBuilder } from 'typeorm'
import { Between, IsNull, FindOptionsWhere } from 'typeorm'
import {
IChatFlow,
IncomingInput,
@@ -606,18 +606,31 @@ export class App {
// ----------------------------------------
// Chat Message Feedback
// ----------------------------------------
this.app.get('/api/v1/feedback/:id', async (req: Request, res: Response) => {})
// Create new feedback
this.app.post('/api/v1/feedback/:id', async (req: Request, res: Response) => {
const body = req.body
const results = await this.addChatMessageFeedback(body)
return res.json(results)
})
// Update feedback
this.app.put('/api/v1/feedback/:id', async (req: Request, res: Response) => {
const chatflowid = req.params.id
const body = req.body
const results = await this.addChatMessageFeedback(body)
const chatMessageFeedback = await this.AppDataSource.getRepository(ChatMessageFeedback).findOneBy({
id: req.params.id
})
if (!chatMessageFeedback) {
res.status(404).send(`Feedback ${req.params.id} not found`)
return
}
const newChatMessageFeedback = new ChatMessageFeedback()
Object.assign(newChatMessageFeedback, body)
this.AppDataSource.getRepository(ChatMessageFeedback).merge(chatMessageFeedback, newChatMessageFeedback)
const results = await this.AppDataSource.getRepository(ChatMessageFeedback).save(chatMessageFeedback)
return res.json(results)
})
@@ -1476,9 +1489,6 @@ export class App {
},
order: {
createdDate: sortOrder === 'DESC' ? 'DESC' : 'ASC'
},
relations: {
feedback
}
})
}
@@ -1495,18 +1505,40 @@ export class App {
return await this.AppDataSource.getRepository(ChatMessage).save(chatmessage)
}
async updateChatMessage(id: string, update: Partial<IChatMessage>) {
const chatMessage = await this.AppDataSource.getRepository(ChatMessage).findOneBy({
id
})
if (!chatMessage) return
const newChatMessage = new ChatMessage()
Object.assign(newChatMessage, update)
this.AppDataSource.getRepository(ChatMessage).merge(chatMessage, newChatMessage)
return await this.AppDataSource.getRepository(ChatMessage).save(chatMessage)
}
/**
* Method that adds feedback for a chat message.
* Method that adds feedback for a chat message and updates the chat message with the feedback id.
* @param {Partial<IChatMessageFeedback>} chatMessageFeedback
*/
async addChatMessageFeedback(chatMessageFeedback: Partial<IChatMessageFeedback>): Promise<ChatMessageFeedback> {
async addChatMessageFeedback(chatMessageFeedback: Partial<IChatMessageFeedback> & { messageId: string }): Promise<ChatMessageFeedback> {
const messageId = chatMessageFeedback.messageId
const newFeedback = new ChatMessageFeedback()
Object.assign(newFeedback, chatMessageFeedback)
const feedback = this.AppDataSource.getRepository(ChatMessageFeedback).create(newFeedback)
return await this.AppDataSource.getRepository(ChatMessageFeedback).save(feedback)
const results = await this.AppDataSource.getRepository(ChatMessageFeedback).save(feedback)
// use the message id to update the chat message with feedback id
await this.updateChatMessage(messageId, { feedbackId: results.id })
return results
}
async updateChatMessageFeedback(id: string, update: Partial<IChatMessageFeedback>) {}
async upsertVector(req: Request, res: Response, isInternal: boolean = false) {
try {
const chatflowid = req.params.id