diff --git a/backend/apps/chat/curd/chat.py b/backend/apps/chat/curd/chat.py index 48b3f0540..034c4287e 100644 --- a/backend/apps/chat/curd/chat.py +++ b/backend/apps/chat/curd/chat.py @@ -8,7 +8,8 @@ from apps.chat.models.chat_model import Chat, ChatRecord, CreateChat, ChatInfo, RenameChat, ChatQuestion, ChatLog, \ TypeEnum, OperationEnum, ChatRecordResult -from apps.datasource.models.datasource import CoreDatasource +from apps.datasource.crud.recommended_problem import get_datasource_recommended, get_datasource_recommended_chart +from apps.datasource.models.datasource import CoreDatasource, DsRecommendedProblem from apps.system.crud.assistant import AssistantOutDsFactory from common.core.deps import CurrentAssistant, SessionDep, CurrentUser from common.utils.utils import extract_nested_json @@ -70,6 +71,7 @@ def get_chart_config(session: SessionDep, chart_record_id: int): pass return {} + def format_chart_fields(chart_info: dict): fields = [] if chart_info.get('columns') and len(chart_info.get('columns')) > 0: @@ -88,6 +90,7 @@ def format_chart_fields(chart_info: dict): fields.append(column_str) return fields + def get_last_execute_sql_error(session: SessionDep, chart_id: int): stmt = select(ChatRecord.error).where(and_(ChatRecord.chat_id == chart_id)).order_by( ChatRecord.create_time.desc()).limit(1) @@ -396,6 +399,12 @@ def create_chat(session: SessionDep, current_user: CurrentUser, create_chat_obj: record.finish = True record.create_time = datetime.datetime.now() record.create_by = current_user.id + if ds.recommended_config == 2: + questions = get_datasource_recommended_chart(session, ds.id) + record.recommended_question = orjson.dumps(questions).decode() + record.recommended_question_answer = orjson.dumps({ + "content": questions + }).decode() _record = ChatRecord(**record.model_dump()) diff --git a/backend/apps/datasource/api/recommended_problem.py b/backend/apps/datasource/api/recommended_problem.py index 29fac41ce..b7c756244 100644 --- a/backend/apps/datasource/api/recommended_problem.py +++ b/backend/apps/datasource/api/recommended_problem.py @@ -1,7 +1,10 @@ from fastapi import APIRouter -from apps.datasource.crud.recommended_problem import get_datasource_recommended -from common.core.deps import SessionDep +from apps.datasource.crud.datasource import update_ds_recommended_config +from apps.datasource.crud.recommended_problem import get_datasource_recommended, \ + save_recommended_problem +from apps.datasource.models.datasource import RecommendedProblemBase +from common.core.deps import SessionDep, CurrentUser router = APIRouter(tags=["recommended_problem"], prefix="/recommended_problem") @@ -10,3 +13,8 @@ async def datasource_recommended(session: SessionDep, ds_id: int): return get_datasource_recommended(session, ds_id) + +@router.post("/save_recommended_problem") +async def datasource_recommended(session: SessionDep, user: CurrentUser, data_info: RecommendedProblemBase): + update_ds_recommended_config(session, data_info.datasource_id, data_info.recommended_config) + return save_recommended_problem(session, user, data_info) diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index a6a867e18..e3a9a8335 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -109,6 +109,11 @@ def update_ds(session: SessionDep, trans: Trans, user: CurrentUser, ds: CoreData run_save_ds_embeddings([ds.id]) return ds +def update_ds_recommended_config(session: SessionDep,datasource_id: int, recommended_config:int): + record = session.exec(select(CoreDatasource).where(CoreDatasource.id == datasource_id)).first() + record.recommended_config = recommended_config + session.add(record) + session.commit() def delete_ds(session: SessionDep, id: int): term = session.exec(select(CoreDatasource).where(CoreDatasource.id == id)).first() diff --git a/backend/apps/datasource/crud/recommended_problem.py b/backend/apps/datasource/crud/recommended_problem.py index e3f8ab677..21bbff710 100644 --- a/backend/apps/datasource/crud/recommended_problem.py +++ b/backend/apps/datasource/crud/recommended_problem.py @@ -1,11 +1,31 @@ +import datetime + from sqlmodel import select -from common.core.deps import SessionDep -from ..models.datasource import DsRecommendedProblem +from common.core.deps import SessionDep, CurrentUser, Trans +from ..models.datasource import DsRecommendedProblem, RecommendedProblemBase, RecommendedProblemBaseChat def get_datasource_recommended(session: SessionDep, ds_id: int): statement = select(DsRecommendedProblem).where(DsRecommendedProblem.datasource_id == ds_id) - dsRecommendedProblem = session.exec(statement) + dsRecommendedProblem = session.exec(statement).all() return dsRecommendedProblem +def get_datasource_recommended_chart(session: SessionDep, ds_id: int): + statement = select(DsRecommendedProblem.question).where(DsRecommendedProblem.datasource_id == ds_id) + dsRecommendedProblems = session.exec(statement).all() + return dsRecommendedProblems + +def save_recommended_problem(session: SessionDep,user: CurrentUser, data_info: RecommendedProblemBase): + session.query(DsRecommendedProblem).filter(DsRecommendedProblem.datasource_id == data_info.datasource_id).delete(synchronize_session=False) + problemInfo = data_info.problemInfo + if problemInfo is not None: + for problemItem in problemInfo: + problemItem.id = None + problemItem.create_time = datetime.datetime.now() + problemItem.create_by = user.id + record = DsRecommendedProblem(**problemItem.model_dump()) + session.add(record) + session.flush() + session.refresh(record) + session.commit() diff --git a/backend/apps/datasource/models/datasource.py b/backend/apps/datasource/models/datasource.py index 2cdfed5a5..dd814ea4b 100644 --- a/backend/apps/datasource/models/datasource.py +++ b/backend/apps/datasource/models/datasource.py @@ -74,6 +74,18 @@ class CreateDatasource(BaseModel): tables: List[CoreTable] = [] recommended_config: int = 1 +class RecommendedProblemBase(BaseModel): + datasource_id: int = None + recommended_config: int = None + problemInfo: List[DsRecommendedProblem] = [] + + +class RecommendedProblemBaseChat: + def __init__(self, content): + self.content = content + + content: List[str] = [] + # edit local saved table and fields class TableObj(BaseModel): diff --git a/frontend/src/api/recommendedApi.ts b/frontend/src/api/recommendedApi.ts index 64f835386..7c73b62e4 100644 --- a/frontend/src/api/recommendedApi.ts +++ b/frontend/src/api/recommendedApi.ts @@ -3,5 +3,6 @@ import { request } from '@/utils/request' export const recommendedApi = { get_recommended_problem: (dsId: any) => request.get(`/recommended_problem/get_datasource_recommended/${dsId}`), - save_recommended_problem: (data: any) => request.post(`/recommended_problem/save`, data), + save_recommended_problem: (data: any) => + request.post(`/recommended_problem/save_recommended_problem`, data), } diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 774f36925..4ab1d6c03 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -308,6 +308,7 @@ } }, "datasource": { + "recommended_problem_tips": "Custom configuration requires at least one problem, each problem should be 2-200 characters", "recommended_problem_configuration": "Recommended Problem Configuration", "problem_generation_method": "Problem Generation Method", "ai_automatic_generation": "AI Automatic Generation", diff --git a/frontend/src/i18n/ko-KR.json b/frontend/src/i18n/ko-KR.json index f6d2b55d6..500584a60 100644 --- a/frontend/src/i18n/ko-KR.json +++ b/frontend/src/i18n/ko-KR.json @@ -308,6 +308,7 @@ } }, "datasource": { + "recommended_problem_tips": "사용자 정의 구성으로 최소 한 개의 문제를 생성하세요, 각 문제는 2~200자로 작성", "recommended_problem_configuration": "추천 문제 구성", "problem_generation_method": "문제 생성 방식", "ai_automatic_generation": "AI 자동 생성", diff --git a/frontend/src/i18n/zh-CN.json b/frontend/src/i18n/zh-CN.json index 21bbc93a5..ad650f600 100644 --- a/frontend/src/i18n/zh-CN.json +++ b/frontend/src/i18n/zh-CN.json @@ -308,6 +308,7 @@ } }, "datasource": { + "recommended_problem_tips": "自定义配置至少一个问题,每个问题2-200个字符", "recommended_problem_configuration": "推荐问题配置", "problem_generation_method": "问题生成方式", "ai_automatic_generation": "AI 自动生成", diff --git a/frontend/src/views/chat/index.vue b/frontend/src/views/chat/index.vue index 52c1bf2ee..42ac1691d 100644 --- a/frontend/src/views/chat/index.vue +++ b/frontend/src/views/chat/index.vue @@ -704,7 +704,7 @@ function onChatCreatedQuick(chat: ChatInfo) { } function onChatCreated(chat: ChatInfo) { - if (chat.records.length === 1) { + if (chat.records.length === 1 && !chat.records[0].recommended_question) { getRecommendQuestions(chat.records[0].id) } } diff --git a/frontend/src/views/ds/Card.vue b/frontend/src/views/ds/Card.vue index 1a9759e85..a30da180a 100644 --- a/frontend/src/views/ds/Card.vue +++ b/frontend/src/views/ds/Card.vue @@ -136,7 +136,7 @@ const onClickOutside = () => { {{ $t('datasource.edit') }} -