From 33f04718431574ec35724e8f8ccb193b3e03fb36 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Mon, 22 Dec 2025 20:27:47 +0800 Subject: [PATCH] fix: provider source id contains slash will lead to 405 --- astrbot/dashboard/routes/config.py | 28 +++++++++++++------ .../src/composables/useProviderSources.ts | 8 ++++-- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/astrbot/dashboard/routes/config.py b/astrbot/dashboard/routes/config.py index abfff529b..f39cccfe6 100644 --- a/astrbot/dashboard/routes/config.py +++ b/astrbot/dashboard/routes/config.py @@ -185,23 +185,30 @@ def __init__( "/config/provider/list": ("GET", self.get_provider_config_list), "/config/provider/model_list": ("GET", self.get_provider_model_list), "/config/provider/get_embedding_dim": ("POST", self.get_embedding_dim), - "/config/provider_sources//models": ( + "/config/provider_sources/models": ( "GET", self.get_provider_source_models, ), - "/config/provider_sources//update": ( + "/config/provider_sources/update": ( "POST", self.update_provider_source, ), - "/config/provider_sources//delete": ( + "/config/provider_sources/delete": ( "POST", self.delete_provider_source, ), } self.register_routes() - async def delete_provider_source(self, provider_source_id: str): + async def delete_provider_source(self): """删除 provider_source,并更新关联的 providers""" + post_data = await request.json + if not post_data: + return Response().error("缺少配置数据").__dict__ + + provider_source_id = post_data.get("id") + if not provider_source_id: + return Response().error("缺少 provider_source_id").__dict__ provider_sources = self.config.get("provider_sources", []) target_idx = next( @@ -235,15 +242,16 @@ async def delete_provider_source(self, provider_source_id: str): return Response().ok(message="删除 provider source 成功").__dict__ - async def update_provider_source(self, provider_source_id: str): + async def update_provider_source(self): """更新或新增 provider_source,并重载关联的 providers""" - post_data = await request.json if not post_data: return Response().error("缺少配置数据").__dict__ new_source_config = post_data.get("config") or post_data - original_id = provider_source_id + original_id = post_data.get("original_id") + if not original_id: + return Response().error("缺少 original_id").__dict__ if not isinstance(new_source_config, dict): return Response().error("缺少或错误的配置数据").__dict__ @@ -684,11 +692,15 @@ async def get_embedding_dim(self): logger.error(traceback.format_exc()) return Response().error(f"获取嵌入维度失败: {e!s}").__dict__ - async def get_provider_source_models(self, provider_source_id: str): + async def get_provider_source_models(self): """获取指定 provider_source 支持的模型列表 本质上会临时初始化一个 Provider 实例,调用 get_models() 获取模型列表,然后销毁实例 """ + provider_source_id = request.args.get("source_id") + if not provider_source_id: + return Response().error("缺少参数 source_id").__dict__ + try: from astrbot.core.provider.register import provider_cls_map diff --git a/dashboard/src/composables/useProviderSources.ts b/dashboard/src/composables/useProviderSources.ts index 368cc0afa..41dcc1c61 100644 --- a/dashboard/src/composables/useProviderSources.ts +++ b/dashboard/src/composables/useProviderSources.ts @@ -398,7 +398,7 @@ export function useProviderSources(options: UseProviderSourcesOptions) { if (!confirm(tm('providerSources.deleteConfirm', { id: source.id }))) return try { - await axios.post(`/api/config/provider_sources/${source.id}/delete`) + await axios.post('/api/config/provider_sources/delete', { id: source.id }) providers.value = providers.value.filter((p) => p.provider_source_id !== source.id) providerSources.value = providerSources.value.filter((s) => s.id !== source.id) @@ -423,7 +423,7 @@ export function useProviderSources(options: UseProviderSourcesOptions) { savingSource.value = true const originalId = selectedProviderSourceOriginalId.value || selectedProviderSource.value.id try { - const response = await axios.post(`/api/config/provider_sources/${originalId}/update`, { + const response = await axios.post('/api/config/provider_sources/update', { config: editableProviderSource.value, original_id: originalId }) @@ -478,7 +478,9 @@ export function useProviderSources(options: UseProviderSourcesOptions) { loadingModels.value = true try { const sourceId = editableProviderSource.value?.id || selectedProviderSource.value.id - const response = await axios.get(`/api/config/provider_sources/${sourceId}/models`) + const response = await axios.get('/api/config/provider_sources/models', { + params: { source_id: sourceId } + }) if (response.data.status === 'ok') { const metadataMap = response.data.data.model_metadata || {} modelMetadata.value = metadataMap