import qs from 'qs' import { del, get, patch, post, put } from './base' import type { CreateDocumentReq, DataSet, DataSetListResponse, ErrorDocsResponse, ExternalAPIDeleteResponse, ExternalAPIItem, ExternalAPIListResponse, ExternalAPIUsage, ExternalKnowledgeBaseHitTestingResponse, ExternalKnowledgeItem, FetchDatasetsParams, FileIndexingEstimateResponse, HitTestingRecordsResponse, HitTestingResponse, IndexingEstimateParams, IndexingEstimateResponse, IndexingStatusBatchResponse, IndexingStatusResponse, ProcessRuleResponse, RelatedAppResponse, createDocumentResponse, } from '@/models/datasets' import type { CreateKnowledgeBaseReq } from '@/app/components/datasets/external-knowledge-base/create/declarations' import type { CreateExternalAPIReq } from '@/app/components/datasets/external-api/declarations' import type { CommonResponse, DataSourceNotionWorkspace } from '@/models/common' import { DataSourceProvider } from '@/models/common' import type { ApiKeysListResponse, CreateApiKeyResponse, } from '@/models/app' import type { RetrievalConfig } from '@/types/app' // apis for documents in a dataset type CommonDocReq = { datasetId: string documentId: string } type BatchReq = { datasetId: string batchId: string } export type SortType = 'created_at' | 'hit_count' | '-created_at' | '-hit_count' export type MetadataType = 'all' | 'only' | 'without' export const fetchDatasetDetail = (datasetId: string): Promise => { return get(`/datasets/${datasetId}`) } export const updateDatasetSetting = ({ datasetId, body, }: { datasetId: string body: Partial> }): Promise => { return patch(`/datasets/${datasetId}`, { body }) } export const fetchDatasetRelatedApps = (datasetId: string): Promise => { return get(`/datasets/${datasetId}/related-apps`) } export const fetchDatasets = ({ url, params }: FetchDatasetsParams): Promise => { const urlParams = qs.stringify(params, { indices: false }) return get(`${url}?${urlParams}`) } export const createEmptyDataset = ({ name }: { name: string }): Promise => { return post('/datasets', { body: { name } }) } export const checkIsUsedInApp = (id: string): Promise<{ is_using: boolean }> => { return get<{ is_using: boolean }>(`/datasets/${id}/use-check`, {}, { silent: true, }) } export const deleteDataset = (datasetID: string): Promise => { return del(`/datasets/${datasetID}`) } export const fetchExternalAPIList = ({ url }: { url: string }): Promise => { return get(url) } export const fetchExternalAPI = ({ apiTemplateId }: { apiTemplateId: string }): Promise => { return get(`/datasets/external-knowledge-api/${apiTemplateId}`) } export const updateExternalAPI = ({ apiTemplateId, body }: { apiTemplateId: string; body: ExternalAPIItem }): Promise => { return patch(`/datasets/external-knowledge-api/${apiTemplateId}`, { body }) } export const deleteExternalAPI = ({ apiTemplateId }: { apiTemplateId: string }): Promise => { return del(`/datasets/external-knowledge-api/${apiTemplateId}`) } export const checkUsageExternalAPI = ({ apiTemplateId }: { apiTemplateId: string }): Promise => { return get(`/datasets/external-knowledge-api/${apiTemplateId}/use-check`) } export const createExternalAPI = ({ body }: { body: CreateExternalAPIReq }): Promise => { return post('/datasets/external-knowledge-api', { body }) } export const createExternalKnowledgeBase = ({ body }: { body: CreateKnowledgeBaseReq }): Promise => { return post('/datasets/external', { body }) } export const fetchDefaultProcessRule = ({ url }: { url: string }): Promise => { return get(url) } export const fetchProcessRule = ({ params: { documentId } }: { params: { documentId: string } }): Promise => { return get('/datasets/process-rule', { params: { document_id: documentId } }) } export const createFirstDocument = ({ body }: { body: CreateDocumentReq }): Promise => { return post('/datasets/init', { body }) } export const createDocument = ({ datasetId, body }: { datasetId: string; body: CreateDocumentReq }): Promise => { return post(`/datasets/${datasetId}/documents`, { body }) } export const fetchIndexingEstimate = ({ datasetId, documentId }: CommonDocReq): Promise => { return get(`/datasets/${datasetId}/documents/${documentId}/indexing-estimate`, {}) } export const fetchIndexingEstimateBatch = ({ datasetId, batchId }: BatchReq): Promise => { return get(`/datasets/${datasetId}/batch/${batchId}/indexing-estimate`, {}) } export const fetchIndexingStatus = ({ datasetId, documentId }: CommonDocReq): Promise => { return get(`/datasets/${datasetId}/documents/${documentId}/indexing-status`, {}) } export const fetchIndexingStatusBatch = ({ datasetId, batchId }: BatchReq): Promise => { return get(`/datasets/${datasetId}/batch/${batchId}/indexing-status`, {}) } export const renameDocumentName = ({ datasetId, documentId, name }: CommonDocReq & { name: string }): Promise => { return post(`/datasets/${datasetId}/documents/${documentId}/rename`, { body: { name }, }) } export const pauseDocIndexing = ({ datasetId, documentId }: CommonDocReq): Promise => { return patch(`/datasets/${datasetId}/documents/${documentId}/processing/pause`) } export const resumeDocIndexing = ({ datasetId, documentId }: CommonDocReq): Promise => { return patch(`/datasets/${datasetId}/documents/${documentId}/processing/resume`) } export const preImportNotionPages = ({ url, datasetId }: { url: string; datasetId?: string }): Promise<{ notion_info: DataSourceNotionWorkspace[] }> => { return get<{ notion_info: DataSourceNotionWorkspace[] }>(url, { params: { dataset_id: datasetId } }) } export const modifyDocMetadata = ({ datasetId, documentId, body }: CommonDocReq & { body: { doc_type: string; doc_metadata: Record } }): Promise => { return put(`/datasets/${datasetId}/documents/${documentId}/metadata`, { body }) } // hit testing export const hitTesting = ({ datasetId, queryText, retrieval_model }: { datasetId: string; queryText: string; retrieval_model: RetrievalConfig }): Promise => { return post(`/datasets/${datasetId}/hit-testing`, { body: { query: queryText, retrieval_model } }) } export const externalKnowledgeBaseHitTesting = ({ datasetId, query, external_retrieval_model }: { datasetId: string; query: string; external_retrieval_model: { top_k: number; score_threshold: number; score_threshold_enabled: boolean } }): Promise => { return post(`/datasets/${datasetId}/external-hit-testing`, { body: { query, external_retrieval_model } }) } export const fetchTestingRecords = ({ datasetId, params }: { datasetId: string; params: { page: number; limit: number } }): Promise => { return get(`/datasets/${datasetId}/queries`, { params }) } export const fetchFileIndexingEstimate = (body: IndexingEstimateParams): Promise => { return post('/datasets/indexing-estimate', { body }) } export const fetchNotionPagePreview = ({ pageID, pageType, credentialID }: { pageID: string; pageType: string; credentialID: string }): Promise<{ content: string }> => { return get<{ content: string }>(`notion/pages/${pageID}/${pageType}/preview`, { params: { credential_id: credentialID, }, }) } export const fetchApiKeysList = ({ url, params }: { url: string; params: Record }): Promise => { return get(url, params) } export const delApikey = ({ url, params }: { url: string; params: Record }): Promise => { return del(url, params) } export const createApikey = ({ url, body }: { url: string; body: Record }): Promise => { return post(url, body) } export const fetchDataSources = (): Promise => { return get('api-key-auth/data-source') } export const createDataSourceApiKeyBinding = (body: Record): Promise => { return post('api-key-auth/data-source/binding', { body }) } export const removeDataSourceApiKeyBinding = (id: string): Promise => { return del(`api-key-auth/data-source/${id}`) } export const createFirecrawlTask = (body: Record): Promise => { return post('website/crawl', { body: { ...body, provider: DataSourceProvider.fireCrawl, }, }) } export const checkFirecrawlTaskStatus = (jobId: string): Promise => { return get(`website/crawl/status/${jobId}`, { params: { provider: DataSourceProvider.fireCrawl, }, }, { silent: true, }) } export const createJinaReaderTask = (body: Record): Promise => { return post('website/crawl', { body: { ...body, provider: DataSourceProvider.jinaReader, }, }) } export const checkJinaReaderTaskStatus = (jobId: string): Promise => { return get(`website/crawl/status/${jobId}`, { params: { provider: 'jinareader', }, }, { silent: true, }) } export const createWatercrawlTask = (body: Record): Promise => { return post('website/crawl', { body: { ...body, provider: DataSourceProvider.waterCrawl, }, }) } export const checkWatercrawlTaskStatus = (jobId: string): Promise => { return get(`website/crawl/status/${jobId}`, { params: { provider: DataSourceProvider.waterCrawl, }, }, { silent: true, }) } export type FileTypesRes = { allowed_extensions: string[] } export const fetchSupportFileTypes = ({ url }: { url: string }): Promise => { return get(url) } export const getErrorDocs = ({ datasetId }: { datasetId: string }): Promise => { return get(`/datasets/${datasetId}/error-docs`) } export const retryErrorDocs = ({ datasetId, document_ids }: { datasetId: string; document_ids: string[] }): Promise => { return post(`/datasets/${datasetId}/retry`, { body: { document_ids } }) }