import type { MutationOptions } from '@tanstack/react-query' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { del, get, patch, post } from './base' import { DatasourceType } from '@/models/pipeline' import type { DeleteTemplateResponse, ExportTemplateDSLResponse, ImportPipelineDSLConfirmResponse, ImportPipelineDSLRequest, ImportPipelineDSLResponse, OnlineDocumentPreviewRequest, OnlineDocumentPreviewResponse, PipelineCheckDependenciesResponse, PipelineExecutionLogRequest, PipelineExecutionLogResponse, PipelinePreProcessingParamsRequest, PipelinePreProcessingParamsResponse, PipelineProcessingParamsRequest, PipelineProcessingParamsResponse, PipelineTemplateByIdRequest, PipelineTemplateByIdResponse, PipelineTemplateListParams, PipelineTemplateListResponse, PublishedPipelineInfoResponse, PublishedPipelineRunPreviewResponse, PublishedPipelineRunRequest, PublishedPipelineRunResponse, UpdateTemplateInfoRequest, UpdateTemplateInfoResponse, } from '@/models/pipeline' import type { DataSourceItem } from '@/app/components/workflow/block-selector/types' import type { ToolCredential } from '@/app/components/tools/types' import type { IconInfo } from '@/models/datasets' const NAME_SPACE = 'pipeline' export const PipelineTemplateListQueryKeyPrefix = [NAME_SPACE, 'template-list'] export const usePipelineTemplateList = (params: PipelineTemplateListParams) => { return useQuery({ queryKey: [...PipelineTemplateListQueryKeyPrefix, params.type], queryFn: () => { return get('/rag/pipeline/templates', { params }) }, }) } export const usePipelineTemplateById = (params: PipelineTemplateByIdRequest, enabled: boolean) => { const { template_id, type } = params return useQuery({ queryKey: [NAME_SPACE, 'template', template_id], queryFn: () => { return get(`/rag/pipeline/templates/${template_id}`, { params: { type, }, }) }, enabled, }) } export const useUpdateTemplateInfo = ( mutationOptions: MutationOptions = {}, ) => { return useMutation({ mutationKey: [NAME_SPACE, 'template-update'], mutationFn: (request: UpdateTemplateInfoRequest) => { const { template_id, ...rest } = request return patch(`/rag/pipeline/customized/templates/${template_id}`, { body: rest, }) }, ...mutationOptions, }) } export const useDeleteTemplate = ( mutationOptions: MutationOptions = {}, ) => { return useMutation({ mutationKey: [NAME_SPACE, 'template-delete'], mutationFn: (templateId: string) => { return del(`/rag/pipeline/customized/templates/${templateId}`) }, ...mutationOptions, }) } export const useExportTemplateDSL = ( mutationOptions: MutationOptions = {}, ) => { return useMutation({ mutationKey: [NAME_SPACE, 'template-dsl-export'], mutationFn: (templateId: string) => { return post(`/rag/pipeline/customized/templates/${templateId}`) }, ...mutationOptions, }) } export const useImportPipelineDSL = ( mutationOptions: MutationOptions = {}, ) => { return useMutation({ mutationKey: [NAME_SPACE, 'dsl-import'], mutationFn: (request: ImportPipelineDSLRequest) => { return post('/rag/pipelines/imports', { body: request }) }, ...mutationOptions, }) } export const useImportPipelineDSLConfirm = ( mutationOptions: MutationOptions = {}, ) => { return useMutation({ mutationKey: [NAME_SPACE, 'dsl-import-confirm'], mutationFn: (importId: string) => { return post(`/rag/pipelines/imports/${importId}/confirm`) }, ...mutationOptions, }) } export const useCheckPipelineDependencies = ( mutationOptions: MutationOptions = {}, ) => { return useMutation({ mutationKey: [NAME_SPACE, 'check-dependencies'], mutationFn: (pipelineId: string) => { return get(`/rag/pipelines/imports/${pipelineId}/check-dependencies`) }, ...mutationOptions, }) } export const useDraftPipelineProcessingParams = (params: PipelineProcessingParamsRequest, enabled = true) => { const { pipeline_id, node_id } = params return useQuery({ queryKey: [NAME_SPACE, 'draft-pipeline-processing-params', pipeline_id, node_id], queryFn: () => { return get(`/rag/pipelines/${pipeline_id}/workflows/draft/processing/parameters`, { params: { node_id, }, }) }, staleTime: 0, enabled, }) } export const usePublishedPipelineProcessingParams = (params: PipelineProcessingParamsRequest) => { const { pipeline_id, node_id } = params return useQuery({ queryKey: [NAME_SPACE, 'published-pipeline-processing-params', pipeline_id, node_id], queryFn: () => { return get(`/rag/pipelines/${pipeline_id}/workflows/published/processing/parameters`, { params: { node_id, }, }) }, staleTime: 0, }) } export const useDataSourceList = (enabled: boolean, onSuccess?: (v: DataSourceItem[]) => void) => { return useQuery({ enabled, queryKey: [NAME_SPACE, 'datasource'], staleTime: 0, queryFn: async () => { const data = await get('/rag/pipelines/datasource-plugins') onSuccess?.(data) return data }, retry: false, }) } export const publishedPipelineInfoQueryKeyPrefix = [NAME_SPACE, 'published-pipeline'] export const usePublishedPipelineInfo = (pipelineId: string) => { return useQuery({ queryKey: [...publishedPipelineInfoQueryKeyPrefix, pipelineId], queryFn: () => { return get(`/rag/pipelines/${pipelineId}/workflows/publish`) }, enabled: !!pipelineId, }) } export const useRunPublishedPipeline = ( mutationOptions: MutationOptions = {}, ) => { return useMutation({ mutationKey: [NAME_SPACE, 'run-published-pipeline'], mutationFn: (request: PublishedPipelineRunRequest) => { const { pipeline_id: pipelineId, is_preview, ...rest } = request return post(`/rag/pipelines/${pipelineId}/workflows/published/run`, { body: { ...rest, is_preview, response_mode: 'blocking', }, }) }, ...mutationOptions, }) } export const useDataSourceCredentials = (provider: string, pluginId: string, onSuccess: (value: ToolCredential[]) => void) => { return useQuery({ queryKey: [NAME_SPACE, 'datasource-credentials', provider, pluginId], queryFn: async () => { const result = await get<{ result: ToolCredential[] }>(`/auth/plugin/datasource?provider=${provider}&plugin_id=${pluginId}`) onSuccess(result.result) return result.result }, enabled: !!provider && !!pluginId, retry: 2, }) } export const useUpdateDataSourceCredentials = ( ) => { const queryClient = useQueryClient() return useMutation({ mutationKey: [NAME_SPACE, 'update-datasource-credentials'], mutationFn: ({ provider, pluginId, credentials, name, }: { provider: string; pluginId: string; credentials: Record; name: string; }) => { return post('/auth/plugin/datasource', { body: { provider, plugin_id: pluginId, credentials, name, }, }).then(() => { queryClient.invalidateQueries({ queryKey: [NAME_SPACE, 'datasource'], }) }) }, }) } export const useDraftPipelinePreProcessingParams = (params: PipelinePreProcessingParamsRequest, enabled = true) => { const { pipeline_id, node_id } = params return useQuery({ queryKey: [NAME_SPACE, 'draft-pipeline-pre-processing-params', pipeline_id, node_id], queryFn: () => { return get(`/rag/pipelines/${pipeline_id}/workflows/draft/pre-processing/parameters`, { params: { node_id, }, }) }, staleTime: 0, enabled, }) } export const usePublishedPipelinePreProcessingParams = (params: PipelinePreProcessingParamsRequest, enabled = true) => { const { pipeline_id, node_id } = params return useQuery({ queryKey: [NAME_SPACE, 'published-pipeline-pre-processing-params', pipeline_id, node_id], queryFn: () => { return get(`/rag/pipelines/${pipeline_id}/workflows/published/pre-processing/parameters`, { params: { node_id, }, }) }, staleTime: 0, enabled, }) } export const useExportPipelineDSL = () => { return useMutation({ mutationKey: [NAME_SPACE, 'export-pipeline-dsl'], mutationFn: ({ pipelineId, include = false, }: { pipelineId: string; include?: boolean }) => { return get(`/rag/pipelines/${pipelineId}/exports?include_secret=${include}`) }, }) } export const usePublishAsCustomizedPipeline = () => { return useMutation({ mutationKey: [NAME_SPACE, 'publish-as-customized-pipeline'], mutationFn: ({ pipelineId, name, icon_info, description, }: { pipelineId: string, name: string, icon_info: IconInfo, description?: string, }) => { return post(`/rag/pipelines/${pipelineId}/customized/publish`, { body: { name, icon_info, description, }, }) }, }) } export const usePipelineExecutionLog = (params: PipelineExecutionLogRequest) => { const { dataset_id, document_id } = params return useQuery({ queryKey: [NAME_SPACE, 'pipeline-execution-log', dataset_id, document_id], queryFn: () => { return get(`/datasets/${dataset_id}/documents/${document_id}/pipeline-execution-log`) }, staleTime: 0, }) } export const usePreviewOnlineDocument = () => { return useMutation({ mutationKey: [NAME_SPACE, 'preview-online-document'], mutationFn: (params: OnlineDocumentPreviewRequest) => { const { pipelineId, datasourceNodeId, workspaceID, pageID, pageType } = params return post( `/rag/pipelines/${pipelineId}/workflows/published/datasource/nodes/${datasourceNodeId}/preview`, { body: { datasource_type: DatasourceType.onlineDocument, inputs: { workspace_id: workspaceID, page_id: pageID, type: pageType, }, }, }, ) }, }) }