diff --git a/docSite/content/zh-cn/docs/guide/knowledge_base/api_dataset.md b/docSite/content/zh-cn/docs/guide/knowledge_base/api_dataset.md index 9e98b2888..8670c0c2b 100644 --- a/docSite/content/zh-cn/docs/guide/knowledge_base/api_dataset.md +++ b/docSite/content/zh-cn/docs/guide/knowledge_base/api_dataset.md @@ -185,3 +185,40 @@ curl --location --request GET '{{baseURL}}/v1/file/read?id=xx' \ {{< /tabs >}} +### 4. 获取文件详细信息(用于获取文件信息) + +{{< tabs tabTotal="2" >}} +{{< tab tabName="请求示例" >}} +{{< markdownify >}} + +id 为文件的 id。 + +```bash +curl --location --request GET '{{baseURL}}/v1/file/detail?id=xx' \ +--header 'Authorization: Bearer {{authorization}}' +``` + +{{< /markdownify >}} +{{< /tab >}} + +{{< tab tabName="响应示例" >}} +{{< markdownify >}} + +```json +{ + "code": 200, + "success": true, + "message": "", + "data": { + "id": "docs", + "parentId": "", + "name": "docs" + } +} +``` + +{{< /markdownify >}} +{{< /tab >}} +{{< /tabs >}} + + diff --git a/packages/service/core/dataset/apiDataset/api.ts b/packages/service/core/dataset/apiDataset/api.ts index daf5e2ed5..86625ae4e 100644 --- a/packages/service/core/dataset/apiDataset/api.ts +++ b/packages/service/core/dataset/apiDataset/api.ts @@ -2,7 +2,9 @@ import type { APIFileListResponse, ApiFileReadContentResponse, APIFileReadResponse, - APIFileServer + ApiDatasetDetailResponse, + APIFileServer, + APIFileItem } from '@fastgpt/global/core/dataset/apiDataset'; import axios, { type Method } from 'axios'; import { addLog } from '../../../common/system/log'; @@ -89,7 +91,7 @@ export const useApiDatasetRequest = ({ apiServer }: { apiServer: APIFileServer } `/v1/file/list`, { searchKey, - parentId + parentId: parentId || apiServer.basePath }, 'POST' ); @@ -164,9 +166,34 @@ export const useApiDatasetRequest = ({ apiServer }: { apiServer: APIFileServer } return url; }; + const getFileDetail = async ({ + apiFileId + }: { + apiFileId: string; + }): Promise => { + const fileData = await request( + `/v1/file/detail`, + { + id: apiFileId + }, + 'GET' + ); + + if (fileData) { + return { + id: fileData.id, + name: fileData.name, + parentId: fileData.parentId === null ? '' : fileData.parentId + }; + } + + return Promise.reject('File not found'); + }; + return { getFileContent, listFiles, - getFilePreviewUrl + getFilePreviewUrl, + getFileDetail }; }; diff --git a/packages/web/i18n/en/common.json b/packages/web/i18n/en/common.json index 640e8fdb6..3335d5aff 100644 --- a/packages/web/i18n/en/common.json +++ b/packages/web/i18n/en/common.json @@ -923,7 +923,7 @@ "not_open": "Not Open", "not_permission": "The current subscription package does not support team operation logs", "not_support": "Not Supported", - "not_support_wechat_image": "WeChat image rendering is not supported", + "not_support_wechat_image": "This is a WeChat picture", "not_yet_introduced": "No Introduction Yet", "open_folder": "Open Folder", "option": "Option", diff --git a/packages/web/i18n/zh-CN/common.json b/packages/web/i18n/zh-CN/common.json index c1fc79bfd..9ef8f6515 100644 --- a/packages/web/i18n/zh-CN/common.json +++ b/packages/web/i18n/zh-CN/common.json @@ -922,7 +922,7 @@ "not_open": "未开启", "not_permission": "当前订阅套餐不支持团队操作日志", "not_support": "不支持", - "not_support_wechat_image": "暂时不支持微信图片渲染", + "not_support_wechat_image": "这是一张微信图片", "not_yet_introduced": "暂无介绍", "open_folder": "打开文件夹", "option": "选项", diff --git a/packages/web/i18n/zh-Hant/common.json b/packages/web/i18n/zh-Hant/common.json index 057ef5e3f..47c0ea945 100644 --- a/packages/web/i18n/zh-Hant/common.json +++ b/packages/web/i18n/zh-Hant/common.json @@ -922,7 +922,7 @@ "not_open": "未開啟", "not_permission": "當前訂閱套餐不支持團隊操作日誌", "not_support": "不支援", - "not_support_wechat_image": "暫時不支持微信圖片渲染", + "not_support_wechat_image": "這是一張微信圖片", "not_yet_introduced": "暫無介紹", "open_folder": "開啟資料夾", "option": "選項", diff --git a/projects/app/src/components/Markdown/img/Image.tsx b/projects/app/src/components/Markdown/img/Image.tsx index ea5eb8247..e4939cf73 100644 --- a/projects/app/src/components/Markdown/img/Image.tsx +++ b/projects/app/src/components/Markdown/img/Image.tsx @@ -13,11 +13,11 @@ const MdImage = ({ src, ...props }: { src?: string } & ImageProps) => { if (src?.includes('base64') && !src.startsWith('data:image')) { return Invalid base64 image; } - + if (props.alt?.startsWith('OFFIACCOUNT_MEDIA')) { return {t('common:not_support_wechat_image')}; } - + return ( { switch (type) { @@ -61,23 +61,27 @@ const ApiDatasetForm = ({ case DatasetTypeEnum.feishu: return feishuServer?.appId && feishuServer?.appSecret; case DatasetTypeEnum.apiDataset: - return !!apiServer?.basePath; + return !!apiServer?.baseUrl; default: return false; } }, [ type, - yuqueServer?.token, yuqueServer?.userId, + yuqueServer?.token, feishuServer?.appId, feishuServer?.appSecret, - apiServer?.basePath + apiServer?.baseUrl ]); // Unified function to get the current path const { loading: isFetching } = useRequest2( async () => { - if (!datasetId && !(yuqueServer?.userId && yuqueServer?.token)) { + if ( + !datasetId && + ((yuqueServer && (!yuqueServer.userId || !yuqueServer?.token)) || + (apiServer && !apiServer?.baseUrl)) + ) { return setPathNames(t('dataset:input_required_field_to_select_baseurl')); } if (!parentId) { @@ -141,7 +145,7 @@ const ApiDatasetForm = ({ const renderDirectoryModal = () => isOpenBaseurlSeletModal ? ( { const params: GetApiDatasetCataLogProps = { parentId: e.parentId }; @@ -203,8 +207,8 @@ const ApiDatasetForm = ({ {...register('apiServer.authorization')} /> - {/* {renderBaseUrlSelector()} - {renderDirectoryModal()} */} + {renderBaseUrlSelector()} + {renderDirectoryModal()} )} {type === DatasetTypeEnum.feishu && ( diff --git a/projects/app/src/pages/api/core/dataset/apiDataset/getPathNames.ts b/projects/app/src/pages/api/core/dataset/apiDataset/getPathNames.ts index f4cfb99e2..be112e93e 100644 --- a/projects/app/src/pages/api/core/dataset/apiDataset/getPathNames.ts +++ b/projects/app/src/pages/api/core/dataset/apiDataset/getPathNames.ts @@ -4,13 +4,15 @@ import type { ParentIdType } from '@fastgpt/global/common/parentFolder/type'; import type { APIFileServer, YuqueServer, - FeishuServer + FeishuServer, + ApiDatasetDetailResponse } from '@fastgpt/global/core/dataset/apiDataset'; import { getProApiDatasetFileDetailRequest } from '@/service/core/dataset/apiDataset/controller'; import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next'; import { authCert } from '@fastgpt/service/support/permission/auth/common'; import { authDataset } from '@fastgpt/service/support/permission/dataset/auth'; import { ManagePermissionVal } from '@fastgpt/global/support/permission/constant'; +import { useApiDatasetRequest } from '@fastgpt/service/core/dataset/apiDataset/api'; export type GetApiDatasetPathQuery = {}; @@ -24,6 +26,24 @@ export type GetApiDatasetPathBody = { export type GetApiDatasetPathResponse = string; +const getFullPath = async ( + currentId: string, + getFileDetail: ({ apiFileId }: { apiFileId: string }) => Promise +): Promise => { + const response = await getFileDetail({ apiFileId: currentId }); + + if (!response) { + return ''; + } + + if (response.parentId && response.parentId !== null) { + const parentPath = await getFullPath(response.parentId, getFileDetail); + return `${parentPath}/${response.name}`; + } + + return `/${response.name}`; +}; + async function handler( req: ApiRequestProps, res: ApiResponseType @@ -70,27 +90,22 @@ async function handler( return Promise.reject(DatasetErrEnum.noApiServer); } - if (apiServer || feishuServer) { - return Promise.reject('不支持获取 BaseUrl'); + if (feishuServer) { + return ''; + } + + if (apiServer) { + return await getFullPath(parentId, useApiDatasetRequest({ apiServer }).getFileDetail); } if (yuqueServer) { - const getFullPath = async (currentId: string): Promise => { - const response = await getProApiDatasetFileDetailRequest({ - feishuServer, + const yuqueFileGetter = async ({ apiFileId }: { apiFileId: string }) => { + return await getProApiDatasetFileDetailRequest({ yuqueServer, - apiFileId: currentId + apiFileId }); - - if (response.parentId) { - const parentPath = await getFullPath(response.parentId); - return `${parentPath}/${response.name}`; - } - - return `/${response.name}`; }; - - return await getFullPath(parentId); + return await getFullPath(parentId, yuqueFileGetter); } return Promise.reject(new Error(DatasetErrEnum.noApiServer)); diff --git a/projects/app/src/pages/api/core/dataset/detail.ts b/projects/app/src/pages/api/core/dataset/detail.ts index ea7193e87..f6bef3c34 100644 --- a/projects/app/src/pages/api/core/dataset/detail.ts +++ b/projects/app/src/pages/api/core/dataset/detail.ts @@ -48,7 +48,8 @@ async function handler(req: ApiRequestProps): Promise { apiServer: dataset.apiServer ? { baseUrl: dataset.apiServer.baseUrl, - authorization: '' + authorization: '', + basePath: dataset.apiServer.basePath } : undefined, yuqueServer: dataset.yuqueServer diff --git a/projects/app/src/pages/api/core/dataset/update.ts b/projects/app/src/pages/api/core/dataset/update.ts index b2beb1ff1..c19bbc764 100644 --- a/projects/app/src/pages/api/core/dataset/update.ts +++ b/projects/app/src/pages/api/core/dataset/update.ts @@ -170,6 +170,7 @@ async function handler( ...(!!apiServer?.authorization && { 'apiServer.authorization': apiServer.authorization }), + ...(!!apiServer?.basePath !== undefined && { 'apiServer.basePath': apiServer?.basePath }), ...(!!yuqueServer?.userId && { 'yuqueServer.userId': yuqueServer.userId }), ...(!!yuqueServer?.token && { 'yuqueServer.token': yuqueServer.token }), ...(!!yuqueServer?.basePath !== undefined && { diff --git a/projects/app/src/web/core/dataset/context/datasetPageContext.tsx b/projects/app/src/web/core/dataset/context/datasetPageContext.tsx index 44614ae25..947b094fe 100644 --- a/projects/app/src/web/core/dataset/context/datasetPageContext.tsx +++ b/projects/app/src/web/core/dataset/context/datasetPageContext.tsx @@ -106,7 +106,8 @@ export const DatasetPageContextProvider = ({ apiServer: data.apiServer ? { baseUrl: data.apiServer.baseUrl, - authorization: '' + authorization: '', + basePath: data.apiServer.basePath } : state.apiServer, yuqueServer: data.yuqueServer