import type { Fetcher } from 'swr' import { get, post } from './base' import type { CommonResponse } from '@/models/common' import type { ChatRunHistoryResponse, ConversationVariableResponse, FetchWorkflowDraftResponse, NodesDefaultConfigsResponse, WorkflowRunHistoryResponse, } from '@/types/workflow' import type { BlockEnum } from '@/app/components/workflow/types' import type { VarInInspect } from '@/types/workflow' export const fetchWorkflowDraft = (url: string) => { return get(url, {}, { silent: true }) as Promise } export const syncWorkflowDraft = ({ url, params }: { url: string params: Pick }) => { return post(url, { body: params }, { silent: true }) } export const fetchNodesDefaultConfigs: Fetcher = (url) => { return get(url) } export const fetchWorkflowRunHistory: Fetcher = (url) => { return get(url) } export const fetchChatRunHistory: Fetcher = (url) => { return get(url) } export const singleNodeRun = (appId: string, nodeId: string, params: object) => { return post(`apps/${appId}/workflows/draft/nodes/${nodeId}/run`, { body: params }) } export const getIterationSingleNodeRunUrl = (isChatFlow: boolean, appId: string, nodeId: string) => { return `apps/${appId}/${isChatFlow ? 'advanced-chat/' : ''}workflows/draft/iteration/nodes/${nodeId}/run` } export const getLoopSingleNodeRunUrl = (isChatFlow: boolean, appId: string, nodeId: string) => { return `apps/${appId}/${isChatFlow ? 'advanced-chat/' : ''}workflows/draft/loop/nodes/${nodeId}/run` } export const fetchPublishedWorkflow: Fetcher = (url) => { return get(url) } export const stopWorkflowRun = (url: string) => { return post(url) } export const fetchNodeDefault = (appId: string, blockType: BlockEnum, query = {}) => { return get(`apps/${appId}/workflows/default-workflow-block-configs/${blockType}`, { params: { q: JSON.stringify(query) }, }) } export const fetchPipelineNodeDefault = (pipelineId: string, blockType: BlockEnum, query = {}) => { return get(`rag/pipelines/${pipelineId}/workflows/default-workflow-block-configs/${blockType}`, { params: { q: JSON.stringify(query) }, }) } // TODO: archived export const updateWorkflowDraftFromDSL = (appId: string, data: string) => { return post(`apps/${appId}/workflows/draft/import`, { body: { data } }) } export const fetchCurrentValueOfConversationVariable: Fetcher = ({ url, params }) => { return get(url, { params }) } const fetchAllInspectVarsOnePage = async (appId: string, page: number): Promise<{ total: number, items: VarInInspect[] }> => { return get(`apps/${appId}/workflows/draft/variables`, { params: { page, limit: 100 }, }) } export const fetchAllInspectVars = async (appId: string): Promise => { const res = await fetchAllInspectVarsOnePage(appId, 1) const { items, total } = res if (total <= 100) return items const pageCount = Math.ceil(total / 100) const promises = [] for (let i = 2; i <= pageCount; i++) promises.push(fetchAllInspectVarsOnePage(appId, i)) const restData = await Promise.all(promises) restData.forEach(({ items: item }) => { items.push(...item) }) return items } export const fetchNodeInspectVars = async (appId: string, nodeId: string): Promise => { const { items } = (await get(`apps/${appId}/workflows/draft/nodes/${nodeId}/variables`)) as { items: VarInInspect[] } return items }