Skip to content

Commit c86502e

Browse files
authored
Merge pull request FlowiseAI#1009 from FlowiseAI/feature/ChatHistory2
Feature/chat history2
2 parents f4d4e8e + eb09cc1 commit c86502e

30 files changed

+1190
-111
lines changed

packages/server/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
"socket.io": "^4.6.1",
6565
"sqlite3": "^5.1.6",
6666
"typeorm": "^0.3.6",
67+
"uuid": "^9.0.1",
6768
"winston": "^3.9.0"
6869
},
6970
"devDependencies": {

packages/server/src/Interface.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import { ICommonObject, INode, INodeData as INodeDataFromComponent, INodeParams
22

33
export type MessageType = 'apiMessage' | 'userMessage'
44

5+
export enum chatType {
6+
INTERNAL = 'INTERNAL',
7+
EXTERNAL = 'EXTERNAL'
8+
}
59
/**
610
* Databases
711
*/
@@ -24,8 +28,12 @@ export interface IChatMessage {
2428
role: MessageType
2529
content: string
2630
chatflowid: string
27-
createdDate: Date
2831
sourceDocuments?: string
32+
chatType: string
33+
chatId: string
34+
memoryType?: string
35+
sessionId?: string
36+
createdDate: Date
2937
}
3038

3139
export interface ITool {
@@ -146,6 +154,7 @@ export interface IncomingInput {
146154
history: IMessage[]
147155
overrideConfig?: ICommonObject
148156
socketIOClientId?: string
157+
chatId?: string
149158
}
150159

151160
export interface IActiveChatflows {

packages/server/src/database/entities/ChatMessage.ts

+12
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ export class ChatMessage implements IChatMessage {
2020
@Column({ nullable: true, type: 'text' })
2121
sourceDocuments?: string
2222

23+
@Column()
24+
chatType: string
25+
26+
@Column()
27+
chatId: string
28+
29+
@Column({ nullable: true })
30+
memoryType?: string
31+
32+
@Column({ nullable: true })
33+
sessionId?: string
34+
2335
@CreateDateColumn()
2436
createdDate: Date
2537
}

packages/server/src/database/migrations/mysql/1694099200729-AddApiConfig.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { MigrationInterface, QueryRunner } from 'typeorm'
22

33
export class AddApiConfig1694099200729 implements MigrationInterface {
44
public async up(queryRunner: QueryRunner): Promise<void> {
5-
await queryRunner.query(`ALTER TABLE \`chat_flow\` ADD COLUMN \`apiConfig\` TEXT;`)
5+
const columnExists = await queryRunner.hasColumn('chat_flow', 'apiConfig')
6+
if (!columnExists) queryRunner.query(`ALTER TABLE \`chat_flow\` ADD COLUMN \`apiConfig\` TEXT;`)
67
}
78

89
public async down(queryRunner: QueryRunner): Promise<void> {

packages/server/src/database/migrations/mysql/1694432361423-AddAnalytic.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { MigrationInterface, QueryRunner } from 'typeorm'
22

33
export class AddAnalytic1694432361423 implements MigrationInterface {
44
public async up(queryRunner: QueryRunner): Promise<void> {
5-
await queryRunner.query(`ALTER TABLE \`chat_flow\` ADD COLUMN \`analytic\` TEXT;`)
5+
const columnExists = await queryRunner.hasColumn('chat_flow', 'analytic')
6+
if (!columnExists) queryRunner.query(`ALTER TABLE \`chat_flow\` ADD COLUMN \`analytic\` TEXT;`)
67
}
78

89
public async down(queryRunner: QueryRunner): Promise<void> {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { MigrationInterface, QueryRunner } from 'typeorm'
2+
3+
export class AddChatHistory1694658767766 implements MigrationInterface {
4+
public async up(queryRunner: QueryRunner): Promise<void> {
5+
const chatTypeColumnExists = await queryRunner.hasColumn('chat_message', 'chatType')
6+
if (!chatTypeColumnExists)
7+
await queryRunner.query(`ALTER TABLE \`chat_message\` ADD COLUMN \`chatType\` VARCHAR(255) NOT NULL DEFAULT 'INTERNAL';`)
8+
9+
const chatIdColumnExists = await queryRunner.hasColumn('chat_message', 'chatId')
10+
if (!chatIdColumnExists) await queryRunner.query(`ALTER TABLE \`chat_message\` ADD COLUMN \`chatId\` VARCHAR(255);`)
11+
const results: { id: string; chatflowid: string }[] = await queryRunner.query(`WITH RankedMessages AS (
12+
SELECT
13+
\`chatflowid\`,
14+
\`id\`,
15+
\`createdDate\`,
16+
ROW_NUMBER() OVER (PARTITION BY \`chatflowid\` ORDER BY \`createdDate\`) AS row_num
17+
FROM \`chat_message\`
18+
)
19+
SELECT \`chatflowid\`, \`id\`
20+
FROM RankedMessages
21+
WHERE row_num = 1;`)
22+
for (const chatMessage of results) {
23+
await queryRunner.query(
24+
`UPDATE \`chat_message\` SET \`chatId\` = '${chatMessage.id}' WHERE \`chatflowid\` = '${chatMessage.chatflowid}'`
25+
)
26+
}
27+
await queryRunner.query(`ALTER TABLE \`chat_message\` MODIFY \`chatId\` VARCHAR(255) NOT NULL;`)
28+
29+
const memoryTypeColumnExists = await queryRunner.hasColumn('chat_message', 'memoryType')
30+
if (!memoryTypeColumnExists) await queryRunner.query(`ALTER TABLE \`chat_message\` ADD COLUMN \`memoryType\` VARCHAR(255);`)
31+
32+
const sessionIdColumnExists = await queryRunner.hasColumn('chat_message', 'sessionId')
33+
if (!sessionIdColumnExists) await queryRunner.query(`ALTER TABLE \`chat_message\` ADD COLUMN \`sessionId\` VARCHAR(255);`)
34+
}
35+
36+
public async down(queryRunner: QueryRunner): Promise<void> {
37+
await queryRunner.query(
38+
`ALTER TABLE \`chat_message\` DROP COLUMN \`chatType\`, DROP COLUMN \`chatId\`, DROP COLUMN \`memoryType\`, DROP COLUMN \`sessionId\`;`
39+
)
40+
}
41+
}

packages/server/src/database/migrations/mysql/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ModifyCredential1693999261583 } from './1693999261583-ModifyCredential'
55
import { ModifyTool1694001465232 } from './1694001465232-ModifyTool'
66
import { AddApiConfig1694099200729 } from './1694099200729-AddApiConfig'
77
import { AddAnalytic1694432361423 } from './1694432361423-AddAnalytic'
8+
import { AddChatHistory1694658767766 } from './1694658767766-AddChatHistory'
89

910
export const mysqlMigrations = [
1011
Init1693840429259,
@@ -13,5 +14,6 @@ export const mysqlMigrations = [
1314
ModifyCredential1693999261583,
1415
ModifyTool1694001465232,
1516
AddApiConfig1694099200729,
16-
AddAnalytic1694432361423
17+
AddAnalytic1694432361423,
18+
AddChatHistory1694658767766
1719
]

packages/server/src/database/migrations/postgres/1694099183389-AddApiConfig.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { MigrationInterface, QueryRunner } from 'typeorm'
22

33
export class AddApiConfig1694099183389 implements MigrationInterface {
44
public async up(queryRunner: QueryRunner): Promise<void> {
5-
await queryRunner.query(`ALTER TABLE "chat_flow" ADD COLUMN "apiConfig" TEXT;`)
5+
await queryRunner.query(`ALTER TABLE "chat_flow" ADD COLUMN IF NOT EXISTS "apiConfig" TEXT;`)
66
}
77

88
public async down(queryRunner: QueryRunner): Promise<void> {

packages/server/src/database/migrations/postgres/1694432361423-AddAnalytic.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { MigrationInterface, QueryRunner } from 'typeorm'
22

33
export class AddAnalytic1694432361423 implements MigrationInterface {
44
public async up(queryRunner: QueryRunner): Promise<void> {
5-
await queryRunner.query(`ALTER TABLE "chat_flow" ADD COLUMN "analytic" TEXT;`)
5+
await queryRunner.query(`ALTER TABLE "chat_flow" ADD COLUMN IF NOT EXISTS "analytic" TEXT;`)
66
}
77

88
public async down(queryRunner: QueryRunner): Promise<void> {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { MigrationInterface, QueryRunner } from 'typeorm'
2+
3+
export class AddChatHistory1694658756136 implements MigrationInterface {
4+
public async up(queryRunner: QueryRunner): Promise<void> {
5+
await queryRunner.query(
6+
`ALTER TABLE "chat_message" ADD COLUMN IF NOT EXISTS "chatType" VARCHAR NOT NULL DEFAULT 'INTERNAL', ADD COLUMN IF NOT EXISTS "chatId" VARCHAR, ADD COLUMN IF NOT EXISTS "memoryType" VARCHAR, ADD COLUMN IF NOT EXISTS "sessionId" VARCHAR;`
7+
)
8+
const results: { id: string; chatflowid: string }[] = await queryRunner.query(`WITH RankedMessages AS (
9+
SELECT
10+
"chatflowid",
11+
"id",
12+
"createdDate",
13+
ROW_NUMBER() OVER (PARTITION BY "chatflowid" ORDER BY "createdDate") AS row_num
14+
FROM "chat_message"
15+
)
16+
SELECT "chatflowid", "id"
17+
FROM RankedMessages
18+
WHERE row_num = 1;`)
19+
for (const chatMessage of results) {
20+
await queryRunner.query(
21+
`UPDATE "chat_message" SET "chatId" = '${chatMessage.id}' WHERE "chatflowid" = '${chatMessage.chatflowid}'`
22+
)
23+
}
24+
await queryRunner.query(`ALTER TABLE "chat_message" ALTER COLUMN "chatId" SET NOT NULL;`)
25+
}
26+
27+
public async down(queryRunner: QueryRunner): Promise<void> {
28+
await queryRunner.query(
29+
`ALTER TABLE "chat_message" DROP COLUMN "chatType", DROP COLUMN "chatId", DROP COLUMN "memoryType", DROP COLUMN "sessionId";`
30+
)
31+
}
32+
}

packages/server/src/database/migrations/postgres/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ModifyCredential1693997070000 } from './1693997070000-ModifyCredential'
55
import { ModifyTool1693997339912 } from './1693997339912-ModifyTool'
66
import { AddApiConfig1694099183389 } from './1694099183389-AddApiConfig'
77
import { AddAnalytic1694432361423 } from './1694432361423-AddAnalytic'
8+
import { AddChatHistory1694658756136 } from './1694658756136-AddChatHistory'
89

910
export const postgresMigrations = [
1011
Init1693891895163,
@@ -13,5 +14,6 @@ export const postgresMigrations = [
1314
ModifyCredential1693997070000,
1415
ModifyTool1693997339912,
1516
AddApiConfig1694099183389,
16-
AddAnalytic1694432361423
17+
AddAnalytic1694432361423,
18+
AddChatHistory1694658756136
1719
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { MigrationInterface, QueryRunner } from 'typeorm'
2+
3+
export class AddChatHistory1694657778173 implements MigrationInterface {
4+
public async up(queryRunner: QueryRunner): Promise<void> {
5+
await queryRunner.query(`ALTER TABLE "chat_message" ADD COLUMN "chatId" VARCHAR;`)
6+
const results: { id: string; chatflowid: string }[] = await queryRunner.query(`WITH RankedMessages AS (
7+
SELECT
8+
"chatflowid",
9+
"id",
10+
"createdDate",
11+
ROW_NUMBER() OVER (PARTITION BY "chatflowid" ORDER BY "createdDate") AS row_num
12+
FROM "chat_message"
13+
)
14+
SELECT "chatflowid", "id"
15+
FROM RankedMessages
16+
WHERE row_num = 1;`)
17+
for (const chatMessage of results) {
18+
await queryRunner.query(
19+
`UPDATE "chat_message" SET "chatId" = '${chatMessage.id}' WHERE "chatflowid" = '${chatMessage.chatflowid}'`
20+
)
21+
}
22+
await queryRunner.query(
23+
`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, "createdDate" datetime NOT NULL DEFAULT (datetime('now')), "chatType" VARCHAR NOT NULL DEFAULT 'INTERNAL', "chatId" VARCHAR NOT NULL, "memoryType" VARCHAR, "sessionId" VARCHAR);`
24+
)
25+
await queryRunner.query(
26+
`INSERT INTO "temp_chat_message" ("id", "role", "chatflowid", "content", "sourceDocuments", "createdDate", "chatId") SELECT "id", "role", "chatflowid", "content", "sourceDocuments", "createdDate", "chatId" FROM "chat_message";`
27+
)
28+
await queryRunner.query(`DROP TABLE "chat_message";`)
29+
await queryRunner.query(`ALTER TABLE "temp_chat_message" RENAME TO "chat_message";`)
30+
await queryRunner.query(`CREATE INDEX "IDX_e574527322272fd838f4f0f3d3" ON "chat_message" ("chatflowid") ;`)
31+
}
32+
33+
public async down(queryRunner: QueryRunner): Promise<void> {
34+
await queryRunner.query(`DROP TABLE IF EXISTS "temp_chat_message";`)
35+
await queryRunner.query(`ALTER TABLE "chat_message" DROP COLUMN "chatType";`)
36+
await queryRunner.query(`ALTER TABLE "chat_message" DROP COLUMN "chatId";`)
37+
await queryRunner.query(`ALTER TABLE "chat_message" DROP COLUMN "memoryType";`)
38+
await queryRunner.query(`ALTER TABLE "chat_message" DROP COLUMN "sessionId";`)
39+
}
40+
}

packages/server/src/database/migrations/sqlite/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ModifyCredential1693923551694 } from './1693923551694-ModifyCredential'
55
import { ModifyTool1693924207475 } from './1693924207475-ModifyTool'
66
import { AddApiConfig1694090982460 } from './1694090982460-AddApiConfig'
77
import { AddAnalytic1694432361423 } from './1694432361423-AddAnalytic'
8+
import { AddChatHistory1694657778173 } from './1694657778173-AddChatHistory'
89

910
export const sqliteMigrations = [
1011
Init1693835579790,
@@ -13,5 +14,6 @@ export const sqliteMigrations = [
1314
ModifyCredential1693923551694,
1415
ModifyTool1693924207475,
1516
AddApiConfig1694090982460,
16-
AddAnalytic1694432361423
17+
AddAnalytic1694432361423,
18+
AddChatHistory1694657778173
1719
]

0 commit comments

Comments
 (0)