Skip to content

Commit 69f3003

Browse files
committed
feat: Add Api Docs
1 parent 08cc52c commit 69f3003

File tree

7 files changed

+158
-43
lines changed

7 files changed

+158
-43
lines changed

backend/apps/chat/api/chat.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import asyncio
22
import io
33
import traceback
4-
from typing import Optional
4+
from typing import Optional, List
55

66
import orjson
77
import pandas as pd
8-
from fastapi import APIRouter, HTTPException
8+
from fastapi import APIRouter, HTTPException, Path
99
from fastapi.responses import StreamingResponse
1010
from sqlalchemy import and_, select
1111

1212
from apps.chat.curd.chat import list_chats, get_chat_with_records, create_chat, rename_chat, \
1313
delete_chat, get_chat_chart_data, get_chat_predict_data, get_chat_with_records_with_data, get_chat_record_by_id, \
1414
format_json_data, format_json_list_data, get_chart_config, list_recent_questions
15-
from apps.chat.models.chat_model import CreateChat, ChatRecord, RenameChat, ChatQuestion, AxisObj, QuickCommand
15+
from apps.chat.models.chat_model import CreateChat, ChatRecord, RenameChat, ChatQuestion, AxisObj, QuickCommand, \
16+
ChatInfo, Chat
1617
from apps.chat.task.llm import LLMService
18+
from apps.swagger.i18n import PLACEHOLDER_PREFIX
1719
from apps.system.schemas.permission import SqlbotPermission, require_permissions
1820
from common.core.deps import CurrentAssistant, SessionDep, CurrentUser, Trans
1921
from common.utils.command_utils import parse_quick_command
@@ -22,12 +24,12 @@
2224
router = APIRouter(tags=["Data Q&A"], prefix="/chat")
2325

2426

25-
@router.get("/list")
27+
@router.get("/list", response_model=List[Chat], summary=f"{PLACEHOLDER_PREFIX}get_chat_list")
2628
async def chats(session: SessionDep, current_user: CurrentUser):
2729
return list_chats(session, current_user)
2830

2931

30-
@router.get("/{chart_id}")
32+
@router.get("/{chart_id}", response_model=ChatInfo, summary=f"{PLACEHOLDER_PREFIX}get_chat")
3133
async def get_chat(session: SessionDep, current_user: CurrentUser, chart_id: int, current_assistant: CurrentAssistant,
3234
trans: Trans):
3335
def inner():
@@ -37,7 +39,7 @@ def inner():
3739
return await asyncio.to_thread(inner)
3840

3941

40-
@router.get("/{chart_id}/with_data")
42+
@router.get("/{chart_id}/with_data", response_model=ChatInfo, summary=f"{PLACEHOLDER_PREFIX}get_chat_with_data")
4143
async def get_chat_with_data(session: SessionDep, current_user: CurrentUser, chart_id: int,
4244
current_assistant: CurrentAssistant):
4345
def inner():
@@ -47,7 +49,7 @@ def inner():
4749
return await asyncio.to_thread(inner)
4850

4951

50-
@router.get("/record/{chat_record_id}/data")
52+
@router.get("/record/{chat_record_id}/data", summary=f"{PLACEHOLDER_PREFIX}get_chart_data")
5153
async def chat_record_data(session: SessionDep, chat_record_id: int):
5254
def inner():
5355
data = get_chat_chart_data(chat_record_id=chat_record_id, session=session)
@@ -56,7 +58,7 @@ def inner():
5658
return await asyncio.to_thread(inner)
5759

5860

59-
@router.get("/record/{chat_record_id}/predict_data")
61+
@router.get("/record/{chat_record_id}/predict_data", summary=f"{PLACEHOLDER_PREFIX}get_chart_predict_data")
6062
async def chat_predict_data(session: SessionDep, chat_record_id: int):
6163
def inner():
6264
data = get_chat_predict_data(chat_record_id=chat_record_id, session=session)
@@ -65,7 +67,7 @@ def inner():
6567
return await asyncio.to_thread(inner)
6668

6769

68-
@router.post("/rename")
70+
@router.post("/rename", response_model=str, summary=f"{PLACEHOLDER_PREFIX}rename_chat")
6971
async def rename(session: SessionDep, chat: RenameChat):
7072
try:
7173
return rename_chat(session=session, rename_object=chat)
@@ -76,7 +78,7 @@ async def rename(session: SessionDep, chat: RenameChat):
7678
)
7779

7880

79-
@router.delete("/{chart_id}")
81+
@router.delete("/{chart_id}", response_model=str, summary=f"{PLACEHOLDER_PREFIX}delete_chat")
8082
async def delete(session: SessionDep, chart_id: int):
8183
try:
8284
return delete_chat(session=session, chart_id=chart_id)
@@ -87,7 +89,7 @@ async def delete(session: SessionDep, chart_id: int):
8789
)
8890

8991

90-
@router.post("/start")
92+
@router.post("/start", response_model=ChatInfo, summary=f"{PLACEHOLDER_PREFIX}start_chat")
9193
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="create_chat_obj.datasource"))
9294
async def start_chat(session: SessionDep, current_user: CurrentUser, create_chat_obj: CreateChat):
9395
try:
@@ -99,7 +101,7 @@ async def start_chat(session: SessionDep, current_user: CurrentUser, create_chat
99101
)
100102

101103

102-
@router.post("/assistant/start")
104+
@router.post("/assistant/start", response_model=ChatInfo, summary=f"{PLACEHOLDER_PREFIX}assistant_start_chat")
103105
async def start_chat(session: SessionDep, current_user: CurrentUser):
104106
try:
105107
return create_chat(session, current_user, CreateChat(origin=2), False)
@@ -110,9 +112,9 @@ async def start_chat(session: SessionDep, current_user: CurrentUser):
110112
)
111113

112114

113-
@router.post("/recommend_questions/{chat_record_id}")
114-
async def recommend_questions(session: SessionDep, current_user: CurrentUser, chat_record_id: int,
115-
current_assistant: CurrentAssistant, articles_number: Optional[int] = 4):
115+
@router.post("/recommend_questions/{chat_record_id}", summary=f"{PLACEHOLDER_PREFIX}ask_recommend_questions")
116+
async def ask_recommend_questions(session: SessionDep, current_user: CurrentUser, chat_record_id: int,
117+
current_assistant: CurrentAssistant, articles_number: Optional[int] = 4):
116118
def _return_empty():
117119
yield 'data:' + orjson.dumps({'content': '[]', 'type': 'recommended_question'}).decode() + '\n\n'
118120

@@ -139,9 +141,11 @@ def _err(_e: Exception):
139141
return StreamingResponse(llm_service.await_result(), media_type="text/event-stream")
140142

141143

142-
@router.get("/recent_questions/{datasource_id}")
144+
@router.get("/recent_questions/{datasource_id}", response_model=List[str],
145+
summary=f"{PLACEHOLDER_PREFIX}get_recommend_questions")
143146
@require_permissions(permission=SqlbotPermission(type='ds', keyExpression="datasource_id"))
144-
async def recommend_questions(session: SessionDep, current_user: CurrentUser, datasource_id: int):
147+
async def recommend_questions(session: SessionDep, current_user: CurrentUser,
148+
datasource_id: int = Path(..., description=f"{PLACEHOLDER_PREFIX}ds_id")):
145149
return list_recent_questions(session=session, current_user=current_user, datasource_id=datasource_id)
146150

147151

@@ -158,7 +162,7 @@ def find_base_question(record_id: int, session: SessionDep):
158162
return rec_question
159163

160164

161-
@router.post("/question")
165+
@router.post("/question", summary=f"{PLACEHOLDER_PREFIX}ask_question")
162166
@require_permissions(permission=SqlbotPermission(type='chat', keyExpression="request_question.chat_id"))
163167
async def question_answer(session: SessionDep, current_user: CurrentUser, request_question: ChatQuestion,
164168
current_assistant: CurrentAssistant):
@@ -255,10 +259,10 @@ def _err(_e: Exception):
255259
return StreamingResponse(llm_service.await_result(), media_type="text/event-stream")
256260

257261

258-
@router.post("/record/{chat_record_id}/{action_type}")
259-
async def analysis_or_predict_question(session: SessionDep, current_user: CurrentUser, chat_record_id: int,
260-
action_type: str,
261-
current_assistant: CurrentAssistant):
262+
@router.post("/record/{chat_record_id}/{action_type}", summary=f"{PLACEHOLDER_PREFIX}analysis_or_predict")
263+
async def analysis_or_predict_question(session: SessionDep, current_user: CurrentUser,
264+
current_assistant: CurrentAssistant, chat_record_id: int,
265+
action_type: str = Path(..., description=f"{PLACEHOLDER_PREFIX}analysis_or_predict_action_type")):
262266
return await analysis_or_predict(session, current_user, chat_record_id, action_type, current_assistant)
263267

264268

@@ -302,7 +306,7 @@ def _err(_e: Exception):
302306
return StreamingResponse(llm_service.await_result(), media_type="text/event-stream")
303307

304308

305-
@router.get("/record/{chat_record_id}/excel/export")
309+
@router.get("/record/{chat_record_id}/excel/export", summary=f"{PLACEHOLDER_PREFIX}export_chart_data")
306310
async def export_excel(session: SessionDep, chat_record_id: int, trans: Trans):
307311
chat_record = session.get(ChatRecord, chat_record_id)
308312
if not chat_record:

backend/apps/data_training/api/data_training.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,16 @@
1414
from apps.data_training.curd.data_training import page_data_training, create_training, update_training, delete_training, \
1515
enable_training, get_all_data_training, batch_create_training
1616
from apps.data_training.models.data_training_model import DataTrainingInfo
17+
from apps.swagger.i18n import PLACEHOLDER_PREFIX
1718
from common.core.config import settings
1819
from common.core.deps import SessionDep, CurrentUser, Trans
1920
from common.utils.data_format import DataFormat
2021
from common.utils.excel import get_excel_column_count
2122

22-
router = APIRouter(tags=["DataTraining"], prefix="/system/data-training")
23+
router = APIRouter(tags=["SQL Examples"], prefix="/system/data-training")
2324

2425

25-
@router.get("/page/{current_page}/{page_size}")
26+
@router.get("/page/{current_page}/{page_size}", summary=f"{PLACEHOLDER_PREFIX}get_dt_page")
2627
async def pager(session: SessionDep, current_user: CurrentUser, current_page: int, page_size: int,
2728
question: Optional[str] = Query(None, description="搜索问题(可选)")):
2829
current_page, page_size, total_count, total_pages, _list = page_data_training(session, current_page, page_size,
@@ -38,7 +39,7 @@ async def pager(session: SessionDep, current_user: CurrentUser, current_page: in
3839
}
3940

4041

41-
@router.put("")
42+
@router.put("", response_model=int, summary=f"{PLACEHOLDER_PREFIX}create_or_update_dt")
4243
async def create_or_update(session: SessionDep, current_user: CurrentUser, trans: Trans, info: DataTrainingInfo):
4344
oid = current_user.oid
4445
if info.id:
@@ -47,17 +48,17 @@ async def create_or_update(session: SessionDep, current_user: CurrentUser, trans
4748
return create_training(session, info, oid, trans)
4849

4950

50-
@router.delete("")
51+
@router.delete("", summary=f"{PLACEHOLDER_PREFIX}delete_dt")
5152
async def delete(session: SessionDep, id_list: list[int]):
5253
delete_training(session, id_list)
5354

5455

55-
@router.get("/{id}/enable/{enabled}")
56+
@router.get("/{id}/enable/{enabled}", summary=f"{PLACEHOLDER_PREFIX}enable_dt")
5657
async def enable(session: SessionDep, id: int, enabled: bool, trans: Trans):
5758
enable_training(session, id, enabled, trans)
5859

5960

60-
@router.get("/export")
61+
@router.get("/export", summary=f"{PLACEHOLDER_PREFIX}export_dt")
6162
async def export_excel(session: SessionDep, trans: Trans, current_user: CurrentUser,
6263
question: Optional[str] = Query(None, description="搜索术语(可选)")):
6364
def inner():
@@ -98,7 +99,7 @@ def inner():
9899
return StreamingResponse(result, media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
99100

100101

101-
@router.get("/template")
102+
@router.get("/template", summary=f"{PLACEHOLDER_PREFIX}excel_template_dt")
102103
async def excel_template(trans: Trans, current_user: CurrentUser):
103104
def inner():
104105
data_list = []
@@ -113,10 +114,12 @@ def inner():
113114
fields = []
114115
fields.append(AxisObj(name=trans('i18n_data_training.problem_description_template'), value='question'))
115116
fields.append(AxisObj(name=trans('i18n_data_training.sample_sql_template'), value='description'))
116-
fields.append(AxisObj(name=trans('i18n_data_training.effective_data_sources_template'), value='datasource_name'))
117+
fields.append(
118+
AxisObj(name=trans('i18n_data_training.effective_data_sources_template'), value='datasource_name'))
117119
if current_user.oid == 1:
118120
fields.append(
119-
AxisObj(name=trans('i18n_data_training.advanced_application_template'), value='advanced_application_name'))
121+
AxisObj(name=trans('i18n_data_training.advanced_application_template'),
122+
value='advanced_application_name'))
120123

121124
md_data, _fields_list = DataFormat.convert_object_array_for_pandas(fields, data_list)
122125

@@ -144,7 +147,7 @@ def inner():
144147
session_maker = scoped_session(sessionmaker(bind=engine, class_=Session))
145148

146149

147-
@router.post("/uploadExcel")
150+
@router.post("/uploadExcel", summary=f"{PLACEHOLDER_PREFIX}upload_excel_dt")
148151
async def upload_excel(trans: Trans, current_user: CurrentUser, file: UploadFile = File(...)):
149152
ALLOWED_EXTENSIONS = {"xlsx", "xls"}
150153
if not file.filename.lower().endswith(tuple(ALLOWED_EXTENSIONS)):

backend/apps/settings/api/base.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from fastapi import APIRouter
55
from fastapi.responses import FileResponse
66

7+
from apps.swagger.i18n import PLACEHOLDER_PREFIX
78
from common.core.config import settings
89
from common.core.file import FileRequest
910

@@ -12,7 +13,7 @@
1213
path = settings.EXCEL_PATH
1314

1415

15-
@router.post("/download-fail-info")
16+
@router.post("/download-fail-info", summary=f"{PLACEHOLDER_PREFIX}download-fail-info")
1617
async def download_excel(req: FileRequest):
1718
"""
1819
根据文件路径下载 Excel 文件

backend/apps/swagger/i18n.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ def load_translation(lang: str) -> Dict[str, str]:
4242

4343
# group tags
4444
tags_metadata = [
45+
{
46+
"name": "Data Q&A",
47+
"description": f"{PLACEHOLDER_PREFIX}data_qa"
48+
},
4549
{
4650
"name": "Datasource",
4751
"description": f"{PLACEHOLDER_PREFIX}ds_api"
@@ -77,6 +81,18 @@ def load_translation(lang: str) -> Dict[str, str]:
7781
"name": "Data Permission",
7882
"description": f"{PLACEHOLDER_PREFIX}per_api"
7983
},
84+
{
85+
"name": "SQL Examples",
86+
"description": f"{PLACEHOLDER_PREFIX}data_training_api"
87+
},
88+
{
89+
"name": "Terminology",
90+
"description": f"{PLACEHOLDER_PREFIX}terminology_api"
91+
},
92+
{
93+
"name": "CustomPrompt",
94+
"description": f"{PLACEHOLDER_PREFIX}custom_prompt_api"
95+
},
8096

8197
]
8298

backend/apps/swagger/locales/en.json

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,50 @@
119119

120120
"tr_api": "Table Relation",
121121
"tr_save": "Save Table Relation",
122-
"tr_get": "Get Table Relation"
122+
"tr_get": "Get Table Relation",
123+
124+
"data_qa": "Data Q&A",
125+
"get_chat_list": "Get Chat List",
126+
"get_chat": "Get Chat Details",
127+
"get_chat_with_data": "Get Chat Details (With Data)",
128+
"get_chart_data": "Get Chart Data",
129+
"get_chart_predict_data": "Get Chart Prediction Data",
130+
"rename_chat": "Rename Chat",
131+
"delete_chat": "Delete Chat",
132+
"start_chat": "Create Chat",
133+
"assistant_start_chat": "Assistant Create Chat",
134+
"ask_recommend_questions": "AI Get Recommended Questions",
135+
"get_recommend_questions": "Query Recommended Questions",
136+
"ask_question": "Ask Question",
137+
"analysis_or_predict": "Analyze Data / Predict Data",
138+
"export_chart_data": "Export Chart Data",
139+
"analysis_or_predict_action_type": "Type, allowed values: analysis | predict",
140+
141+
"download-fail-info": "Download Error Information",
142+
143+
"data_training_api": "SQL Examples",
144+
"get_dt_page": "Pagination Query for SQL Examples",
145+
"create_or_update_dt": "Create/Update SQL Example",
146+
"delete_dt": "Delete SQL Example",
147+
"enable_dt": "Enable/Disable",
148+
"export_dt": "Export SQL Examples",
149+
"excel_template_dt": "Download Template",
150+
"upload_excel_dt": "Import SQL Examples",
151+
152+
"terminology_api": "Terminology",
153+
"get_term_page": "Pagination Query for Terms",
154+
"create_or_update_term": "Create/Update Term",
155+
"delete_term": "Delete Term",
156+
"enable_term": "Enable/Disable",
157+
"export_term": "Export Terms",
158+
"excel_template_term": "Download Template",
159+
"upload_term": "Import Terms",
160+
161+
"custom_prompt_api": "Custom Prompts",
162+
"custom_prompt_page": "Pagination Query for Custom Prompts",
163+
"create_or_update_custom_prompt": "Create/Update Custom Prompt",
164+
"delete_custom_prompt": "Delete Custom Prompt",
165+
"export_custom_prompt": "Export Custom Prompts",
166+
"excel_template_custom_prompt": "Download Template",
167+
"upload_custom_prompt": "Import Custom Prompts"
123168
}

backend/apps/swagger/locales/zh.json

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,50 @@
119119

120120
"tr_api": "表关联关系",
121121
"tr_save": "保存关联关系",
122-
"tr_get": "查询关联关系"
122+
"tr_get": "查询关联关系",
123+
124+
"data_qa": "智能问数",
125+
"get_chat_list": "获取对话列表",
126+
"get_chat": "获取对话详情",
127+
"get_chat_with_data": "获取对话详情(带数据)",
128+
"get_chart_data": "获取图表数据",
129+
"get_chart_predict_data": "获取图表预测数据",
130+
"rename_chat": "重命名对话",
131+
"delete_chat": "删除对话",
132+
"start_chat": "创建对话",
133+
"assistant_start_chat": "小助手创建对话",
134+
"ask_recommend_questions": "AI获取推荐提问",
135+
"get_recommend_questions": "查询推荐提问",
136+
"ask_question": "提问",
137+
"analysis_or_predict": "分析数据/预测数据",
138+
"export_chart_data": "导出图表数据",
139+
"analysis_or_predict_action_type": "类型,可传入值为:analysis | predict",
140+
141+
"download-fail-info": "下载错误信息",
142+
143+
"data_training_api": "SQL示例",
144+
"get_dt_page": "分页查询SQL示例",
145+
"create_or_update_dt": "创建/更新SQL示例",
146+
"delete_dt": "删除SQL示例",
147+
"enable_dt": "启用/禁用",
148+
"export_dt": "导出SQL示例",
149+
"excel_template_dt": "下载模板",
150+
"upload_excel_dt": "导入SQL示例",
151+
152+
"terminology_api": "术语",
153+
"get_term_page": "分页查询术语",
154+
"create_or_update_term": "创建/更新术语",
155+
"delete_term": "删除术语",
156+
"enable_term": "启用/禁用",
157+
"export_term": "导出术语",
158+
"excel_template_term": "下载模板",
159+
"upload_term": "导入术语",
160+
161+
"custom_prompt_api": "自定义提示词",
162+
"custom_prompt_page": "分页查询自定义提示词",
163+
"create_or_update_custom_prompt": "创建/更新自定义提示词",
164+
"delete_custom_prompt": "删除自定义提示词",
165+
"export_custom_prompt": "导出自定义提示词",
166+
"excel_template_custom_prompt": "下载模板",
167+
"upload_custom_prompt": "导入自定义提示词"
123168
}

0 commit comments

Comments
 (0)