diff --git a/backend/apps/chat/api/chat.py b/backend/apps/chat/api/chat.py index c1bbae9c..65052a8d 100644 --- a/backend/apps/chat/api/chat.py +++ b/backend/apps/chat/api/chat.py @@ -24,7 +24,7 @@ async def chats(session: SessionDep, current_user: CurrentUser): @router.get("/get/{chart_id}") -async def list_chat(session: SessionDep, current_user: CurrentUser, chart_id: int): +async def get_chat(session: SessionDep, current_user: CurrentUser, chart_id: int): try: return get_chat_with_records(chart_id=chart_id, session=session, current_user=current_user) except Exception as e: diff --git a/backend/apps/chat/curd/chat.py b/backend/apps/chat/curd/chat.py index 774e4967..358040b5 100644 --- a/backend/apps/chat/curd/chat.py +++ b/backend/apps/chat/curd/chat.py @@ -2,6 +2,7 @@ import datetime from typing import List from sqlalchemy import and_ +from sqlalchemy.orm import load_only from apps.chat.models.chat_model import Chat, ChatRecord, CreateChat, ChatInfo, RenameChat, ChatQuestion from apps.datasource.models.datasource import CoreDatasource @@ -55,7 +56,11 @@ def get_chat_with_records(session: SessionDep, chart_id: int, current_user: Curr chat_info.datasource_exists = True chat_info.datasource_name = ds.name - record_list = session.query(ChatRecord).filter( + record_list = session.query(ChatRecord).options( + load_only(ChatRecord.id, ChatRecord.chat_id, ChatRecord.create_time, ChatRecord.finish_time, + ChatRecord.question, ChatRecord.sql_answer, ChatRecord.sql, ChatRecord.data, + ChatRecord.chart_answer, ChatRecord.chart, ChatRecord.finish, ChatRecord.error, + ChatRecord.run_time)).filter( and_(Chat.create_by == current_user.id, ChatRecord.chat_id == chart_id)).order_by(ChatRecord.create_time).all() chat_info.records = record_list @@ -96,6 +101,9 @@ def create_chat(session: SessionDep, current_user: CurrentUser, create_chat_obj: chat_info.id = chat.id session.commit() + chat_info.datasource_exists = True + chat_info.datasource_name = ds.name + return chat_info @@ -214,6 +222,7 @@ def save_error_message(session: SessionDep, record_id: int, message: str) -> Cha record = session.query(ChatRecord).filter(ChatRecord.id == record_id).first() record.error = message record.finish = True + record.finish_time = datetime.datetime.now() result = ChatRecord(**record.model_dump()) @@ -242,11 +251,13 @@ def save_sql_exec_data(session: SessionDep, record_id: int, data: str) -> ChatRe return result + def finish_record(session: SessionDep, record_id: int) -> ChatRecord: if not record_id: raise Exception("Record id cannot be None") record = session.query(ChatRecord).filter(ChatRecord.id == record_id).first() record.finish = True + record.finish_time = datetime.datetime.now() result = ChatRecord(**record.model_dump()) @@ -257,4 +268,3 @@ def finish_record(session: SessionDep, record_id: int) -> ChatRecord: session.commit() return result - diff --git a/backend/apps/chat/models/chat_model.py b/backend/apps/chat/models/chat_model.py index b65af0ad..7687a375 100644 --- a/backend/apps/chat/models/chat_model.py +++ b/backend/apps/chat/models/chat_model.py @@ -2,7 +2,7 @@ from sqlmodel import SQLModel, Field from sqlalchemy import Column, Text, BigInteger, DateTime, Integer, Identity, Boolean from datetime import datetime from pydantic import BaseModel -from typing import List, Optional +from typing import List, Optional, Any from apps.template.generate_chart.generator import get_chart_template from apps.template.generate_sql.generator import get_sql_template diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index 1e1b597f..1ca5b222 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -225,6 +225,8 @@ def get_table_obj_by_ds(session: SessionDep, ds: CoreDatasource) -> List[TableAn def get_table_schema(session: SessionDep, ds: CoreDatasource) -> str: schema_str = "" table_objs = get_table_obj_by_ds(session=session, ds=ds) + if len(table_objs) == 0: + return schema_str db_name = table_objs[0].schema schema_str += f"【DB_ID】 {db_name}\n【Schema】\n" for obj in table_objs: diff --git a/frontend/src/api/chat.ts b/frontend/src/api/chat.ts index 8234805f..8660b22d 100644 --- a/frontend/src/api/chat.ts +++ b/frontend/src/api/chat.ts @@ -20,6 +20,7 @@ export interface ChatMessage { role: 'user' | 'assistant' create_time?: Date | string content?: string | number + record?: ChatRecord isTyping?: boolean isWelcome?: boolean } @@ -28,24 +29,32 @@ export class ChatRecord { id?: number chat_id?: number create_time?: Date | string - create_by?: number - datasource?: number - engine_type?: string + finish_time?: Date | string question?: string - answer?: string + sql_answer?: string + sql?: string + data?: string + chart_answer?: string + chart?: string + finish?: boolean = false + error?: string run_time: number = 0 constructor() - constructor(id: number, chat_id: number, create_time: Date | string, create_by: number, datasource: number, engine_type: string, question: string, answer: string, run_time: number) - constructor(id?: number, chat_id?: number, create_time?: Date | string, create_by?: number, datasource?: number, engine_type?: string, question?: string, answer?: string, run_time?: number) { + constructor(id: number, chat_id: number, create_time: Date | string, finish_time: Date | string | undefined, question: string, sql_answer: string | undefined, sql: string | undefined, data: string | undefined, chart_answer: string | undefined, chart: string | undefined, finish: boolean, error: string | undefined, run_time: number) + constructor(id?: number, chat_id?: number, create_time?: Date | string, finish_time?: Date | string, question?: string, sql_answer?: string, sql?: string, data?: string, chart_answer?: string, chart?: string, finish?: boolean, error?: string, run_time?: number) { this.id = id this.chat_id = chat_id this.create_time = getDate(create_time) - this.create_by = create_by - this.datasource = datasource - this.engine_type = engine_type + this.finish_time = getDate(finish_time) this.question = question - this.answer = answer + this.sql_answer = sql_answer + this.sql = sql + this.data = data + this.chart_answer = chart_answer + this.chart = chart + this.finish = finish + this.error = error this.run_time = run_time ?? 0 } } @@ -111,7 +120,7 @@ function toChatRecord(data?: any): ChatRecord | undefined { if (!data) { return undefined } - return new ChatRecord(data.id, data.number, data.create_time, data.create_by, data.datasource, data.engine_type, data.question, data.answer, data.run_time) + return new ChatRecord(data.id, data.chat_id, data.create_time, data.finish_time, data.question, data.sql_answer, data.sql, data.data, data.chart_answer, data.chart, data.finish, data.error, data.run_time) } function toChatRecordList(list: any = []): ChatRecord[] { diff --git a/frontend/src/views/chat/index.vue b/frontend/src/views/chat/index.vue index db5f0de8..548a3dcc 100644 --- a/frontend/src/views/chat/index.vue +++ b/frontend/src/views/chat/index.vue @@ -20,13 +20,31 @@ - + + + Thinking ... + + + {{ message.record.sql_answer }} + {{ message.record.sql }} + + + {{ message.record.data }} + + + {{ message.record.chart_answer }} + {{ message.record.chart }} + + {{ message.record.error }} + + + - + 使用数据源:{{ currentChat.datasource_name }} @@ -55,7 +73,7 @@