Skip to content

Commit 39ffbe3

Browse files
perf: Internationalization of API Documentation
1 parent 190c6ea commit 39ffbe3

File tree

7 files changed

+125
-48
lines changed

7 files changed

+125
-48
lines changed

backend/apps/swagger/i18n.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ def load_translation(lang: str) -> Dict[str, str]:
5454
"name": "system_ws",
5555
"description": f"{PLACEHOLDER_PREFIX}system_ws_api"
5656
},
57+
{
58+
"name": "system_model",
59+
"description": f"{PLACEHOLDER_PREFIX}system_model_api"
60+
},
61+
{
62+
"name": "system_assistant",
63+
"description": f"{PLACEHOLDER_PREFIX}system_assistant_api"
64+
},
5765
{ "name": "Table Relation",
5866
"description": f"{PLACEHOLDER_PREFIX}tr_api"
5967
},

backend/apps/swagger/locales/en.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,39 @@
6969

7070
"weight": "Weight (1: Admin, 0: Regular User)",
7171

72+
"system_model_api": "Model Configuration APIs",
73+
"system_model_default": "Set Default Model",
74+
"system_model_grid": "Get Model List",
75+
"system_model_query": "Get Model Details",
76+
"system_model_create": "Save Model",
77+
"system_model_update": "Update Model",
78+
"system_model_del": "Delete Model",
79+
"model_name": "Name",
80+
"model_type": "Type",
81+
"base_model": "Base Model",
82+
"supplier": "Operator",
83+
"protocol": "Protocol",
84+
"default_model": "Is Default",
85+
"api_domain": "Base URL",
86+
"api_key": "API Key",
87+
"config_list": "Parameter List",
88+
"arg_name": "Parameter Name",
89+
"arg_val": "Parameter Value",
90+
"arg_show_name": "Parameter Display Name",
91+
92+
"system_assistant_api": "Assistant APIs",
93+
"assistant_picture_api": "Get Pictures",
94+
"assistant_ui_api": "Set Appearance",
95+
"assistant_grid_api": "Get List",
96+
"assistant_query_api": "Get Details",
97+
"assistant_create_api": "Create",
98+
"assistant_update_api": "Update",
99+
"assistant_del_api": "Delete",
100+
"assistant_domain": "Domain",
101+
"assistant_type": "Assistant Type (0: Basic, 1: Advanced, 4: Page)",
102+
"assistant_configuration": "Configuration",
103+
"assistant_description": "Description",
104+
72105
"per_api": "Data Permission",
73106
"per_save": "Save Permission",
74107
"per_delete": "Delete Permission",

backend/apps/swagger/locales/zh.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,39 @@
6969

7070
"weight": "权重(1: 管理员, 0: 普通用户)",
7171

72+
"system_model_api": "模型配置api",
73+
"system_model_default": "设置默认模型",
74+
"system_model_grid": "查询模型列表",
75+
"system_model_query": "查询模型详情",
76+
"system_model_create": "保存模型",
77+
"system_model_update": "更新模型",
78+
"system_model_del": "删除模型",
79+
"model_name": "名称",
80+
"model_type": "类型",
81+
"base_model": "基础模型",
82+
"supplier": "运营商",
83+
"protocol": "协议",
84+
"default_model": "是否默认",
85+
"api_domain": "基础 Url",
86+
"api_key": "Api key",
87+
"config_list": "参数列表",
88+
"arg_name": "参数名称",
89+
"arg_val": "参数值",
90+
"arg_show_name": "参数展示名称",
91+
92+
"system_assistant_api": "小助手api",
93+
"assistant_picture_api": "查询图片",
94+
"assistant_ui_api": "设置外观",
95+
"assistant_grid_api": "查询列表",
96+
"assistant_query_api": "查询详情",
97+
"assistant_create_api": "创建",
98+
"assistant_update_api": "修改",
99+
"assistant_del_api": "删除",
100+
"assistant_domain": "域名",
101+
"assistant_type": "助手类型(0: 基础, 1: 高级, 4: 页面)",
102+
"assistant_configuration": "配置",
103+
"assistant_description": "描述",
104+
72105
"per_api": "数据权限",
73106
"per_save": "保存权限",
74107
"per_delete": "删除权限",

backend/apps/system/api/aimodel.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
from fastapi.responses import StreamingResponse
55
from apps.ai_model.model_factory import LLMConfig, LLMFactory
6+
from apps.swagger.i18n import PLACEHOLDER_PREFIX
67
from apps.system.schemas.ai_model_schema import AiModelConfigItem, AiModelCreator, AiModelEditor, AiModelGridItem
7-
from fastapi import APIRouter, Query
8+
from fastapi import APIRouter, Path, Query
89
from sqlmodel import func, select, update
910

1011
from apps.system.models.system_model import AiModelDetail
@@ -14,9 +15,9 @@
1415
from common.utils.time import get_timestamp
1516
from common.utils.utils import SQLBotLogUtil, prepare_model_arg
1617

17-
router = APIRouter(tags=["system/aimodel"], prefix="/system/aimodel")
18+
router = APIRouter(tags=["system_model"], prefix="/system/aimodel")
1819

19-
@router.post("/status")
20+
@router.post("/status", include_in_schema=False)
2021
async def check_llm(info: AiModelCreator, trans: Trans):
2122
async def generate():
2223
try:
@@ -43,17 +44,17 @@ async def generate():
4344

4445
return StreamingResponse(generate(), media_type="application/x-ndjson")
4546

46-
@router.get("/default")
47+
@router.get("/default", include_in_schema=False)
4748
async def check_default(session: SessionDep, trans: Trans):
4849
db_model = session.exec(
4950
select(AiModelDetail).where(AiModelDetail.default_model == True)
5051
).first()
5152
if not db_model:
5253
raise Exception(trans('i18n_llm.miss_default'))
5354

54-
@router.put("/default/{id}")
55+
@router.put("/default/{id}", summary=f"{PLACEHOLDER_PREFIX}system_model_default", description=f"{PLACEHOLDER_PREFIX}system_model_default")
5556
@require_permissions(permission=SqlbotPermission(role=['admin']))
56-
async def set_default(session: SessionDep, id: int):
57+
async def set_default(session: SessionDep, id: int = Path(description="ID")):
5758
db_model = session.get(AiModelDetail, id)
5859
if not db_model:
5960
raise ValueError(f"AiModelDetail with id {id} not found")
@@ -71,11 +72,11 @@ async def set_default(session: SessionDep, id: int):
7172
session.rollback()
7273
raise e
7374

74-
@router.get("", response_model=list[AiModelGridItem])
75+
@router.get("", response_model=list[AiModelGridItem], summary=f"{PLACEHOLDER_PREFIX}system_model_grid", description=f"{PLACEHOLDER_PREFIX}system_model_grid")
7576
@require_permissions(permission=SqlbotPermission(role=['admin']))
7677
async def query(
7778
session: SessionDep,
78-
keyword: Union[str, None] = Query(default=None, max_length=255)
79+
keyword: Union[str, None] = Query(default=None, max_length=255, description=f"{PLACEHOLDER_PREFIX}keyword")
7980
):
8081
statement = select(AiModelDetail.id,
8182
AiModelDetail.name,
@@ -90,10 +91,10 @@ async def query(
9091
items = session.exec(statement).all()
9192
return items
9293

93-
@router.get("/{id}", response_model=AiModelEditor)
94+
@router.get("/{id}", response_model=AiModelEditor, summary=f"{PLACEHOLDER_PREFIX}system_model_query", description=f"{PLACEHOLDER_PREFIX}system_model_query")
9495
async def get_model_by_id(
9596
session: SessionDep,
96-
id: int
97+
id: int = Path(description="ID")
9798
):
9899
db_model = session.get(AiModelDetail, id)
99100
if not db_model:
@@ -115,7 +116,7 @@ async def get_model_by_id(
115116
data["config_list"] = config_list
116117
return AiModelEditor(**data)
117118

118-
@router.post("")
119+
@router.post("", summary=f"{PLACEHOLDER_PREFIX}system_model_create", description=f"{PLACEHOLDER_PREFIX}system_model_create")
119120
@require_permissions(permission=SqlbotPermission(role=['admin']))
120121
async def add_model(
121122
session: SessionDep,
@@ -132,7 +133,7 @@ async def add_model(
132133
session.add(detail)
133134
session.commit()
134135

135-
@router.put("")
136+
@router.put("", summary=f"{PLACEHOLDER_PREFIX}system_model_update", description=f"{PLACEHOLDER_PREFIX}system_model_update")
136137
@require_permissions(permission=SqlbotPermission(role=['admin']))
137138
async def update_model(
138139
session: SessionDep,
@@ -148,12 +149,12 @@ async def update_model(
148149
session.add(db_model)
149150
session.commit()
150151

151-
@router.delete("/{id}")
152+
@router.delete("/{id}", summary=f"{PLACEHOLDER_PREFIX}system_model_del", description=f"{PLACEHOLDER_PREFIX}system_model_del")
152153
@require_permissions(permission=SqlbotPermission(role=['admin']))
153154
async def delete_model(
154155
session: SessionDep,
155156
trans: Trans,
156-
id: int
157+
id: int = Path(description="ID")
157158
):
158159
item = session.get(AiModelDetail, id)
159160
if item.default_model:

backend/apps/system/api/assistant.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
from datetime import timedelta
44
from typing import List, Optional
55

6-
from fastapi import APIRouter, Form, HTTPException, Query, Request, Response, UploadFile
6+
from fastapi import APIRouter, Form, HTTPException, Path, Query, Request, Response, UploadFile
77
from fastapi.responses import StreamingResponse
88
from sqlbot_xpack.file_utils import SQLBotFileUtils
99
from sqlmodel import select
1010

11+
from apps.swagger.i18n import PLACEHOLDER_PREFIX
1112
from apps.system.crud.assistant import get_assistant_info
1213
from apps.system.crud.assistant_manage import dynamic_upgrade_cors, save
1314
from apps.system.models.system_model import AssistantModel
@@ -19,10 +20,10 @@
1920
from common.core.sqlbot_cache import clear_cache
2021
from common.utils.utils import get_origin_from_referer, origin_match_domain
2122

22-
router = APIRouter(tags=["system/assistant"], prefix="/system/assistant")
23+
router = APIRouter(tags=["system_assistant"], prefix="/system/assistant")
2324

2425

25-
@router.get("/info/{id}")
26+
@router.get("/info/{id}", include_in_schema=False)
2627
async def info(request: Request, response: Response, session: SessionDep, trans: Trans, id: int) -> AssistantModel:
2728
if not id:
2829
raise Exception('miss assistant id')
@@ -42,7 +43,7 @@ async def info(request: Request, response: Response, session: SessionDep, trans:
4243
return db_model
4344

4445

45-
@router.get("/app/{appId}")
46+
@router.get("/app/{appId}", include_in_schema=False)
4647
async def getApp(request: Request, response: Response, session: SessionDep, trans: Trans, appId: str) -> AssistantModel:
4748
if not appId:
4849
raise Exception('miss assistant appId')
@@ -61,7 +62,7 @@ async def getApp(request: Request, response: Response, session: SessionDep, tran
6162
return db_model
6263

6364

64-
@router.get("/validator", response_model=AssistantValidator)
65+
@router.get("/validator", response_model=AssistantValidator, include_in_schema=False)
6566
async def validator(session: SessionDep, id: int, virtual: Optional[int] = Query(None)):
6667
if not id:
6768
raise Exception('miss assistant id')
@@ -86,8 +87,8 @@ async def validator(session: SessionDep, id: int, virtual: Optional[int] = Query
8687
return AssistantValidator(True, True, True, access_token)
8788

8889

89-
@router.get('/picture/{file_id}')
90-
async def picture(file_id: str):
90+
@router.get('/picture/{file_id}', summary=f"{PLACEHOLDER_PREFIX}assistant_picture_api", description=f"{PLACEHOLDER_PREFIX}assistant_picture_api")
91+
async def picture(file_id: str = Path(description="file_id")):
9192
file_path = SQLBotFileUtils.get_file_path(file_id=file_id)
9293
if not os.path.exists(file_path):
9394
raise HTTPException(status_code=404, detail="File not found")
@@ -104,7 +105,7 @@ def iterfile():
104105
return StreamingResponse(iterfile(), media_type=media_type)
105106

106107

107-
@router.patch('/ui')
108+
@router.patch('/ui', summary=f"{PLACEHOLDER_PREFIX}assistant_ui_api", description=f"{PLACEHOLDER_PREFIX}assistant_ui_api")
108109
async def ui(session: SessionDep, data: str = Form(), files: List[UploadFile] = []):
109110
json_data = json.loads(data)
110111
uiSchema = AssistantUiSchema(**json_data)
@@ -152,26 +153,26 @@ async def clear_ui_cache(id: int):
152153
pass
153154

154155

155-
@router.get("", response_model=list[AssistantModel])
156+
@router.get("", response_model=list[AssistantModel], summary=f"{PLACEHOLDER_PREFIX}assistant_grid_api", description=f"{PLACEHOLDER_PREFIX}assistant_grid_api")
156157
async def query(session: SessionDep):
157158
list_result = session.exec(select(AssistantModel).where(AssistantModel.type != 4).order_by(AssistantModel.name,
158159
AssistantModel.create_time)).all()
159160
return list_result
160161

161162

162-
@router.get("/advanced_application", response_model=list[AssistantModel])
163+
@router.get("/advanced_application", response_model=list[AssistantModel], include_in_schema=False)
163164
async def query_advanced_application(session: SessionDep):
164165
list_result = session.exec(select(AssistantModel).where(AssistantModel.type == 1).order_by(AssistantModel.name,
165166
AssistantModel.create_time)).all()
166167
return list_result
167168

168169

169-
@router.post("")
170+
@router.post("", summary=f"{PLACEHOLDER_PREFIX}assistant_create_api", description=f"{PLACEHOLDER_PREFIX}assistant_create_api")
170171
async def add(request: Request, session: SessionDep, creator: AssistantBase):
171172
await save(request, session, creator)
172173

173174

174-
@router.put("")
175+
@router.put("", summary=f"{PLACEHOLDER_PREFIX}assistant_update_api", description=f"{PLACEHOLDER_PREFIX}assistant_update_api")
175176
@clear_cache(namespace=CacheNamespace.EMBEDDED_INFO, cacheName=CacheName.ASSISTANT_INFO, keyExpression="editor.id")
176177
async def update(request: Request, session: SessionDep, editor: AssistantDTO):
177178
id = editor.id
@@ -185,18 +186,18 @@ async def update(request: Request, session: SessionDep, editor: AssistantDTO):
185186
dynamic_upgrade_cors(request=request, session=session)
186187

187188

188-
@router.get("/{id}", response_model=AssistantModel)
189-
async def get_one(session: SessionDep, id: int):
189+
@router.get("/{id}", response_model=AssistantModel, summary=f"{PLACEHOLDER_PREFIX}assistant_query_api", description=f"{PLACEHOLDER_PREFIX}assistant_query_api")
190+
async def get_one(session: SessionDep, id: int = Path(description="ID")):
190191
db_model = await get_assistant_info(session=session, assistant_id=id)
191192
if not db_model:
192193
raise ValueError(f"AssistantModel with id {id} not found")
193194
db_model = AssistantModel.model_validate(db_model)
194195
return db_model
195196

196197

197-
@router.delete("/{id}")
198+
@router.delete("/{id}", response_model=AssistantModel, summary=f"{PLACEHOLDER_PREFIX}assistant_del_api", description=f"{PLACEHOLDER_PREFIX}assistant_del_api")
198199
@clear_cache(namespace=CacheNamespace.EMBEDDED_INFO, cacheName=CacheName.ASSISTANT_INFO, keyExpression="id")
199-
async def delete(request: Request, session: SessionDep, id: int):
200+
async def delete(request: Request, session: SessionDep, id: int = Path(description="ID")):
200201
db_model = session.get(AssistantModel, id)
201202
if not db_model:
202203
raise ValueError(f"AssistantModel with id {id} not found")
Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
11

22
from typing import List
3-
from pydantic import BaseModel
3+
from pydantic import BaseModel, Field
44

5+
from apps.swagger.i18n import PLACEHOLDER_PREFIX
56
from common.core.schemas import BaseCreatorDTO
67

78
class AiModelItem(BaseModel):
8-
name: str
9-
model_type: int
10-
base_model: str
11-
supplier: int
12-
protocol: int
13-
default_model: bool = False
9+
name: str = Field(description=f"{PLACEHOLDER_PREFIX}model_name")
10+
model_type: int = Field(description=f"{PLACEHOLDER_PREFIX}model_type")
11+
base_model: str = Field(description=f"{PLACEHOLDER_PREFIX}base_model")
12+
supplier: int = Field(description=f"{PLACEHOLDER_PREFIX}supplier")
13+
protocol: int = Field(description=f"{PLACEHOLDER_PREFIX}protocol")
14+
default_model: bool = Field(default=False, description=f"{PLACEHOLDER_PREFIX}default_model")
1415

1516
class AiModelGridItem(AiModelItem, BaseCreatorDTO):
1617
pass
1718

1819
class AiModelConfigItem(BaseModel):
19-
key: str
20-
val: object
21-
name: str
20+
key: str = Field(description=f"{PLACEHOLDER_PREFIX}arg_name")
21+
val: object = Field(description=f"{PLACEHOLDER_PREFIX}arg_val")
22+
name: str = Field(description=f"{PLACEHOLDER_PREFIX}arg_show_name")
2223

2324
class AiModelCreator(AiModelItem):
24-
api_domain: str
25-
api_key: str
26-
config_list: List[AiModelConfigItem]
25+
api_domain: str = Field(description=f"{PLACEHOLDER_PREFIX}api_domain")
26+
api_key: str = Field(description=f"{PLACEHOLDER_PREFIX}api_key")
27+
config_list: List[AiModelConfigItem] = Field(description=f"{PLACEHOLDER_PREFIX}config_list")
2728

2829
class AiModelEditor(AiModelCreator, BaseCreatorDTO):
2930
pass

backend/apps/system/schemas/system_schema.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,11 @@ class UserInfoDTO(UserEditor):
103103

104104

105105
class AssistantBase(BaseModel):
106-
name: str
107-
domain: str
108-
type: int = 0 # 0普通小助手 1高级 4页面嵌入
109-
configuration: Optional[str] = None
110-
description: Optional[str] = None
106+
name: str = Field(description=f"{PLACEHOLDER_PREFIX}model_name")
107+
domain: str = Field(description=f"{PLACEHOLDER_PREFIX}assistant_domain")
108+
type: int = Field(default=0, description=f"{PLACEHOLDER_PREFIX}assistant_type") # 0普通小助手 1高级 4页面嵌入
109+
configuration: Optional[str] = Field(default=None, description=f"{PLACEHOLDER_PREFIX}assistant_configuration")
110+
description: Optional[str] = Field(default=None, description=f"{PLACEHOLDER_PREFIX}assistant_description")
111111

112112

113113
class AssistantDTO(AssistantBase, BaseCreatorDTO):

0 commit comments

Comments
 (0)