2026-04-07 15:08:11 +08:00
|
|
|
const webAPI = `/v1`;
|
|
|
|
|
const restAPIv1 = `/api/v1`;
|
2024-08-01 17:27:27 +08:00
|
|
|
|
2026-04-07 15:08:11 +08:00
|
|
|
export { restAPIv1, webAPI };
|
2024-08-01 17:27:27 +08:00
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
// user
|
2026-04-07 15:08:11 +08:00
|
|
|
login: `${webAPI}/user/login`,
|
|
|
|
|
logout: `${webAPI}/user/logout`,
|
|
|
|
|
register: `${webAPI}/user/register`,
|
|
|
|
|
setting: `${webAPI}/user/setting`,
|
|
|
|
|
user_info: `${webAPI}/user/info`,
|
|
|
|
|
tenant_info: `${webAPI}/user/tenant_info`,
|
|
|
|
|
set_tenant_info: `${webAPI}/user/set_tenant_info`,
|
|
|
|
|
login_channels: `${webAPI}/user/login/channels`,
|
|
|
|
|
login_channel: (channel: string) => `${webAPI}/user/login/${channel}`,
|
2024-08-01 17:27:27 +08:00
|
|
|
|
2024-10-18 09:21:01 +08:00
|
|
|
// team
|
2026-04-07 15:08:11 +08:00
|
|
|
addTenantUser: (tenantId: string) => `${webAPI}/tenant/${tenantId}/user`,
|
2024-10-18 09:21:01 +08:00
|
|
|
listTenantUser: (tenantId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${webAPI}/tenant/${tenantId}/user/list`,
|
2024-10-18 09:21:01 +08:00
|
|
|
deleteTenantUser: (tenantId: string, userId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${webAPI}/tenant/${tenantId}/user/${userId}`,
|
|
|
|
|
listTenant: `${webAPI}/tenant/list`,
|
|
|
|
|
agreeTenant: (tenantId: string) => `${webAPI}/tenant/agree/${tenantId}`,
|
2024-10-18 09:21:01 +08:00
|
|
|
|
2024-08-01 17:27:27 +08:00
|
|
|
// llm model
|
2026-04-07 15:08:11 +08:00
|
|
|
factories_list: `${webAPI}/llm/factories`,
|
|
|
|
|
llm_list: `${webAPI}/llm/list`,
|
|
|
|
|
my_llm: `${webAPI}/llm/my_llms`,
|
|
|
|
|
set_api_key: `${webAPI}/llm/set_api_key`,
|
|
|
|
|
add_llm: `${webAPI}/llm/add_llm`,
|
|
|
|
|
delete_llm: `${webAPI}/llm/delete_llm`,
|
|
|
|
|
enable_llm: `${webAPI}/llm/enable_llm`,
|
|
|
|
|
deleteFactory: `${webAPI}/llm/delete_factory`,
|
2024-08-01 17:27:27 +08:00
|
|
|
|
2025-11-06 11:53:46 +08:00
|
|
|
// data source
|
2026-04-07 15:08:11 +08:00
|
|
|
dataSourceSet: `${webAPI}/connector/set`,
|
|
|
|
|
dataSourceList: `${webAPI}/connector/list`,
|
|
|
|
|
dataSourceDel: (id: string) => `${webAPI}/connector/${id}/rm`,
|
|
|
|
|
dataSourceResume: (id: string) => `${webAPI}/connector/${id}/resume`,
|
|
|
|
|
dataSourceRebuild: (id: string) => `${webAPI}/connector/${id}/rebuild`,
|
|
|
|
|
dataSourceLogs: (id: string) => `${webAPI}/connector/${id}/logs`,
|
|
|
|
|
dataSourceDetail: (id: string) => `${webAPI}/connector/${id}`,
|
2025-11-28 13:09:40 +08:00
|
|
|
googleWebAuthStart: (type: 'google-drive' | 'gmail') =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${webAPI}/connector/google/oauth/web/start?type=${type}`,
|
2025-11-28 13:09:40 +08:00
|
|
|
googleWebAuthResult: (type: 'google-drive' | 'gmail') =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${webAPI}/connector/google/oauth/web/result?type=${type}`,
|
|
|
|
|
boxWebAuthStart: () => `${webAPI}/connector/box/oauth/web/start`,
|
|
|
|
|
boxWebAuthResult: () => `${webAPI}/connector/box/oauth/web/result`,
|
2025-11-06 11:53:46 +08:00
|
|
|
|
2025-05-16 16:32:19 +08:00
|
|
|
// plugin
|
2026-04-07 15:08:11 +08:00
|
|
|
llm_tools: `${webAPI}/plugin/llm_tools`,
|
2025-05-16 16:32:19 +08:00
|
|
|
|
2026-04-07 15:08:11 +08:00
|
|
|
chatsTranscriptions: `${restAPIv1}/chats/transcriptions`,
|
2025-12-02 19:39:43 +08:00
|
|
|
|
2024-08-01 17:27:27 +08:00
|
|
|
// knowledge base
|
2025-11-14 13:56:56 +08:00
|
|
|
|
2026-04-07 15:08:11 +08:00
|
|
|
check_embedding: `${webAPI}/kb/check_embedding`,
|
|
|
|
|
kb_list: `${restAPIv1}/datasets`,
|
|
|
|
|
create_kb: `${restAPIv1}/datasets`,
|
|
|
|
|
update_kb: (datasetId: string) => `${restAPIv1}/datasets/${datasetId}`,
|
|
|
|
|
rm_kb: `${restAPIv1}/datasets`,
|
|
|
|
|
get_kb_detail: `${webAPI}/kb/detail`,
|
2025-01-22 19:43:27 +08:00
|
|
|
getKnowledgeGraph: (knowledgeId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/datasets/${knowledgeId}/knowledge_graph`,
|
2026-03-19 14:41:36 +08:00
|
|
|
deleteKnowledgeGraph: (knowledgeId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/datasets/${knowledgeId}/knowledge_graph`,
|
|
|
|
|
getMeta: `${webAPI}/kb/get_meta`,
|
|
|
|
|
getKnowledgeBasicInfo: `${webAPI}/kb/basic_info`,
|
2025-10-09 12:36:19 +08:00
|
|
|
// data pipeline log
|
2026-04-07 15:08:11 +08:00
|
|
|
fetchDataPipelineLog: `${webAPI}/kb/list_pipeline_logs`,
|
|
|
|
|
get_pipeline_detail: `${webAPI}/kb/pipeline_log_detail`,
|
|
|
|
|
fetchPipelineDatasetLogs: `${webAPI}/kb/list_pipeline_dataset_logs`,
|
2026-03-19 14:41:36 +08:00
|
|
|
runGraphRag: (datasetId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/datasets/${datasetId}/run_graphrag`,
|
2026-03-19 14:41:36 +08:00
|
|
|
traceGraphRag: (datasetId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/datasets/${datasetId}/trace_graphrag`,
|
2026-03-19 14:41:36 +08:00
|
|
|
runRaptor: (datasetId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/datasets/${datasetId}/run_raptor`,
|
2026-03-19 14:41:36 +08:00
|
|
|
traceRaptor: (datasetId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/datasets/${datasetId}/trace_raptor`,
|
2025-10-09 12:36:19 +08:00
|
|
|
unbindPipelineTask: ({ kb_id, type }: { kb_id: string; type: string }) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${webAPI}/kb/unbind_task?kb_id=${kb_id}&pipeline_task_type=${type}`,
|
|
|
|
|
pipelineRerun: `${webAPI}/canvas/rerun`,
|
2026-04-10 18:41:30 +08:00
|
|
|
getMetaData: (datasetId: string) =>
|
|
|
|
|
`${restAPIv1}/datasets/${datasetId}/metadata/summary`,
|
2026-04-07 15:08:11 +08:00
|
|
|
updateMetaData: `${webAPI}/document/metadata/update`,
|
|
|
|
|
kbUpdateMetaData: `${webAPI}/kb/update_metadata_setting`,
|
|
|
|
|
documentUpdateMetaData: `${webAPI}/document/update_metadata_setting`,
|
2024-08-01 17:27:27 +08:00
|
|
|
|
2025-01-06 18:58:42 +08:00
|
|
|
// tags
|
2026-04-07 15:08:11 +08:00
|
|
|
listTag: (knowledgeId: string) => `${webAPI}/kb/${knowledgeId}/tags`,
|
|
|
|
|
listTagByKnowledgeIds: `${webAPI}/kb/tags`,
|
|
|
|
|
removeTag: (knowledgeId: string) => `${webAPI}/kb/${knowledgeId}/rm_tags`,
|
|
|
|
|
renameTag: (knowledgeId: string) => `${webAPI}/kb/${knowledgeId}/rename_tag`,
|
2025-01-06 18:58:42 +08:00
|
|
|
|
2024-08-01 17:27:27 +08:00
|
|
|
// chunk
|
2026-04-07 15:08:11 +08:00
|
|
|
chunk_list: `${webAPI}/chunk/list`,
|
|
|
|
|
create_chunk: `${webAPI}/chunk/create`,
|
|
|
|
|
set_chunk: `${webAPI}/chunk/set`,
|
|
|
|
|
get_chunk: `${webAPI}/chunk/get`,
|
|
|
|
|
switch_chunk: `${webAPI}/chunk/switch`,
|
|
|
|
|
rm_chunk: `${webAPI}/chunk/rm`,
|
|
|
|
|
retrieval_test: `${webAPI}/chunk/retrieval_test`,
|
|
|
|
|
knowledge_graph: `${webAPI}/chunk/knowledge_graph`,
|
2024-08-01 17:27:27 +08:00
|
|
|
|
|
|
|
|
// document
|
2026-04-07 15:08:11 +08:00
|
|
|
get_document_list: `${webAPI}/document/list`,
|
|
|
|
|
document_change_status: `${webAPI}/document/change_status`,
|
|
|
|
|
document_rm: `${webAPI}/document/rm`,
|
|
|
|
|
document_delete: `${webAPI}/api/document`,
|
2026-04-09 11:17:38 +08:00
|
|
|
document_rename: (datasetId: string, documentId: string) =>
|
|
|
|
|
`${restAPIv1}/datasets/${datasetId}/documents/${documentId}`,
|
2026-04-07 15:08:11 +08:00
|
|
|
document_create: `${webAPI}/document/create`,
|
|
|
|
|
document_run: `${webAPI}/document/run`,
|
|
|
|
|
document_change_parser: `${webAPI}/document/change_parser`,
|
|
|
|
|
document_thumbnails: `${webAPI}/document/thumbnails`,
|
|
|
|
|
get_document_file: `${webAPI}/document/get`,
|
2025-11-14 19:50:01 +08:00
|
|
|
get_document_file_download: (docId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${webAPI}/document/download/${docId}`,
|
|
|
|
|
document_upload: `${webAPI}/document/upload`,
|
|
|
|
|
web_crawl: `${webAPI}/document/web_crawl`,
|
|
|
|
|
document_infos: `${webAPI}/document/infos`,
|
|
|
|
|
upload_and_parse: `${webAPI}/document/upload_info`,
|
|
|
|
|
parse: `${webAPI}/document/parse`,
|
|
|
|
|
setMeta: `${webAPI}/document/set_meta`,
|
|
|
|
|
get_dataset_filter: `${webAPI}/document/filter`,
|
2024-08-01 17:27:27 +08:00
|
|
|
|
|
|
|
|
// chat
|
2026-04-07 15:08:11 +08:00
|
|
|
createChat: `${restAPIv1}/chats`,
|
|
|
|
|
listChats: `${restAPIv1}/chats`,
|
|
|
|
|
getChat: (chatId: string) => `${restAPIv1}/chats/${chatId}`,
|
|
|
|
|
updateChat: (chatId: string) => `${restAPIv1}/chats/${chatId}`,
|
|
|
|
|
patchChat: (chatId: string) => `${restAPIv1}/chats/${chatId}`,
|
|
|
|
|
deleteChat: (chatId: string) => `${restAPIv1}/chats/${chatId}`,
|
|
|
|
|
bulkDeleteChats: `${restAPIv1}/chats`,
|
|
|
|
|
createSession: (chatId: string) => `${restAPIv1}/chats/${chatId}/sessions`,
|
|
|
|
|
listSessions: (chatId: string) => `${restAPIv1}/chats/${chatId}/sessions`,
|
2026-04-02 20:49:23 +08:00
|
|
|
getSession: (chatId: string, sessionId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/chats/${chatId}/sessions/${sessionId}`,
|
2026-04-02 20:49:23 +08:00
|
|
|
updateSession: (chatId: string, sessionId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/chats/${chatId}/sessions/${sessionId}`,
|
|
|
|
|
removeSessions: (chatId: string) => `${restAPIv1}/chats/${chatId}/sessions`,
|
2026-04-02 20:49:23 +08:00
|
|
|
deleteMessage: (chatId: string, sessionId: string, msgId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/chats/${chatId}/sessions/${sessionId}/messages/${msgId}`,
|
2026-04-02 20:49:23 +08:00
|
|
|
thumbup: (chatId: string, sessionId: string, msgId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/chats/${chatId}/sessions/${sessionId}/messages/${msgId}/feedback`,
|
2026-04-02 20:49:23 +08:00
|
|
|
completionUrl: (chatId: string, sessionId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/chats/${chatId}/sessions/${sessionId}/completions`,
|
|
|
|
|
chatsTts: `${restAPIv1}/chats/tts`,
|
|
|
|
|
ask: `${restAPIv1}/chats/ask`,
|
|
|
|
|
chatsMindmap: `${restAPIv1}/chats/mindmap`,
|
|
|
|
|
chatsRelatedQuestions: `${restAPIv1}/chats/related_questions`,
|
2024-08-01 17:27:27 +08:00
|
|
|
|
2025-08-06 11:42:40 +08:00
|
|
|
// next chat
|
2026-04-07 15:08:11 +08:00
|
|
|
fetchExternalChatInfo: (id: string) => `${restAPIv1}/chatbots/${id}/info`,
|
2025-08-06 11:42:40 +08:00
|
|
|
|
2024-08-01 17:27:27 +08:00
|
|
|
// file manager
|
2026-04-07 15:08:11 +08:00
|
|
|
listFile: `${restAPIv1}/files`,
|
|
|
|
|
uploadFile: `${restAPIv1}/files`,
|
|
|
|
|
removeFile: `${restAPIv1}/files`,
|
|
|
|
|
getAllParentFolder: `${restAPIv1}/files`,
|
|
|
|
|
createFolder: `${restAPIv1}/files`,
|
|
|
|
|
connectFileToKnowledge: `${webAPI}/file2document/convert`,
|
|
|
|
|
getFile: `${restAPIv1}/files`,
|
|
|
|
|
moveFile: `${restAPIv1}/files/move`,
|
2024-08-01 17:27:27 +08:00
|
|
|
|
|
|
|
|
// system
|
2026-04-07 19:07:47 +08:00
|
|
|
getSystemVersion: `${restAPIv1}/system/version`,
|
2026-04-08 15:26:18 +08:00
|
|
|
getSystemTokenList: `${restAPIv1}/system/tokens`,
|
|
|
|
|
createSystemToken: `${restAPIv1}/system/tokens`,
|
|
|
|
|
removeSystemToken: `${restAPIv1}/system/tokens`,
|
2026-04-07 15:08:11 +08:00
|
|
|
getSystemConfig: `${webAPI}/system/config`,
|
|
|
|
|
setLangfuseConfig: `${webAPI}/langfuse/api_key`,
|
2024-08-01 17:27:27 +08:00
|
|
|
|
|
|
|
|
// flow
|
2026-04-07 15:08:11 +08:00
|
|
|
listTemplates: `${webAPI}/canvas/templates`,
|
|
|
|
|
listCanvas: `${webAPI}/canvas/list`,
|
|
|
|
|
getCanvas: `${webAPI}/canvas/get`,
|
|
|
|
|
getCanvasSSE: (canvasId: string) => `${webAPI}/canvas/getsse/${canvasId}`,
|
|
|
|
|
removeCanvas: `${webAPI}/canvas/rm`,
|
|
|
|
|
setCanvas: `${webAPI}/canvas/set`,
|
|
|
|
|
settingCanvas: `${webAPI}/canvas/setting`,
|
|
|
|
|
getListVersion: `${webAPI}/canvas/getlistversion`,
|
|
|
|
|
getVersion: `${webAPI}/canvas/getversion`,
|
|
|
|
|
resetCanvas: `${webAPI}/canvas/reset`,
|
|
|
|
|
runCanvas: `${webAPI}/canvas/completion`,
|
|
|
|
|
testDbConnect: `${webAPI}/canvas/test_db_connect`,
|
|
|
|
|
getInputElements: `${webAPI}/canvas/input_elements`,
|
|
|
|
|
debug: `${webAPI}/canvas/debug`,
|
|
|
|
|
uploadCanvasFile: `${webAPI}/canvas/upload`,
|
|
|
|
|
trace: `${webAPI}/canvas/trace`,
|
|
|
|
|
cancelCanvas: (taskId: string) => `${webAPI}/canvas/cancel/${taskId}`, // cancel conversation
|
2025-07-18 17:54:32 +08:00
|
|
|
// agent
|
2026-04-07 15:08:11 +08:00
|
|
|
inputForm: `${webAPI}/canvas/input_form`,
|
|
|
|
|
fetchVersionList: (id: string) => `${webAPI}/canvas/getlistversion/${id}`,
|
|
|
|
|
fetchVersion: (id: string) => `${webAPI}/canvas/getversion/${id}`,
|
|
|
|
|
fetchCanvas: (id: string) => `${webAPI}/canvas/get/${id}`,
|
|
|
|
|
fetchAgentAvatar: (id: string) => `${webAPI}/canvas/getsse/${id}`,
|
|
|
|
|
uploadAgentFile: (id?: string) => `${webAPI}/canvas/upload/${id}`,
|
|
|
|
|
fetchAgentLogs: (canvasId: string) => `${webAPI}/canvas/${canvasId}/sessions`,
|
2026-02-09 19:53:51 +08:00
|
|
|
fetchAgentLogsById: (canvasId: string, sessionId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${webAPI}/canvas/${canvasId}/sessions/${sessionId}`,
|
2025-07-31 09:34:45 +08:00
|
|
|
fetchExternalAgentInputs: (canvasId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/agentbots/${canvasId}/inputs`,
|
|
|
|
|
prompt: `${webAPI}/canvas/prompts`,
|
|
|
|
|
cancelDataflow: (id: string) => `${webAPI}/canvas/cancel/${id}`,
|
|
|
|
|
downloadFile: `${webAPI}/canvas/download`,
|
|
|
|
|
testWebhook: (id: string) => `${restAPIv1}/webhook_test/${id}`,
|
|
|
|
|
fetchWebhookTrace: (id: string) => `${restAPIv1}/webhook_trace/${id}`,
|
2025-06-23 17:45:35 +08:00
|
|
|
|
2026-02-09 19:53:51 +08:00
|
|
|
// explore
|
|
|
|
|
|
|
|
|
|
runCanvasExplore: (canvasId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${webAPI}/canvas/${canvasId}/completion`,
|
2026-02-09 19:53:51 +08:00
|
|
|
|
2025-06-23 17:45:35 +08:00
|
|
|
// mcp server
|
2026-04-07 15:08:11 +08:00
|
|
|
listMcpServer: `${webAPI}/mcp_server/list`,
|
|
|
|
|
getMcpServer: `${webAPI}/mcp_server/detail`,
|
|
|
|
|
createMcpServer: `${webAPI}/mcp_server/create`,
|
|
|
|
|
updateMcpServer: `${webAPI}/mcp_server/update`,
|
|
|
|
|
deleteMcpServer: `${webAPI}/mcp_server/rm`,
|
|
|
|
|
importMcpServer: `${webAPI}/mcp_server/import`,
|
|
|
|
|
exportMcpServer: `${webAPI}/mcp_server/export`,
|
|
|
|
|
listMcpServerTools: `${webAPI}/mcp_server/list_tools`,
|
|
|
|
|
testMcpServerTool: `${webAPI}/mcp_server/test_tool`,
|
|
|
|
|
cacheMcpServerTool: `${webAPI}/mcp_server/cache_tools`,
|
|
|
|
|
testMcpServer: `${webAPI}/mcp_server/test_mcp`,
|
2025-08-11 10:34:22 +08:00
|
|
|
|
|
|
|
|
// next-search
|
2026-04-07 15:08:11 +08:00
|
|
|
createSearch: `${restAPIv1}/searches`,
|
|
|
|
|
getSearchList: `${restAPIv1}/searches`,
|
2026-03-26 01:07:41 +08:00
|
|
|
deleteSearch: (params: { search_id: string }) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/searches/${params.search_id}`,
|
2026-03-26 01:07:41 +08:00
|
|
|
getSearchDetail: (params: { search_id: string }) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/searches/${params.search_id}`,
|
|
|
|
|
getSearchDetailShare: `${restAPIv1}/searchbots/detail`,
|
2026-03-26 01:07:41 +08:00
|
|
|
updateSearchSetting: (params: { search_id: string }) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/searches/${params.search_id}`,
|
|
|
|
|
askShare: `${restAPIv1}/searchbots/ask`,
|
|
|
|
|
mindmapShare: `${restAPIv1}/searchbots/mindmap`,
|
|
|
|
|
getRelatedQuestionsShare: `${restAPIv1}/searchbots/related_questions`,
|
|
|
|
|
retrievalTestShare: `${restAPIv1}/searchbots/retrieval_test`,
|
2025-10-09 12:36:19 +08:00
|
|
|
|
2025-12-08 10:17:56 +08:00
|
|
|
// memory
|
2026-04-07 15:08:11 +08:00
|
|
|
createMemory: `${restAPIv1}/memories`,
|
|
|
|
|
getMemoryList: `${restAPIv1}/memories`,
|
|
|
|
|
getMemoryConfig: (id: string) => `${restAPIv1}/memories/${id}/config`,
|
|
|
|
|
deleteMemory: (id: string) => `${restAPIv1}/memories/${id}`,
|
|
|
|
|
getMemoryDetail: (id: string) => `${restAPIv1}/memories/${id}`,
|
|
|
|
|
updateMemorySetting: (id: string) => `${restAPIv1}/memories/${id}`,
|
2025-12-17 12:35:26 +08:00
|
|
|
deleteMemoryMessage: (data: { memory_id: string; message_id: string }) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/messages/${data.memory_id}:${data.message_id}`,
|
2025-12-17 12:35:26 +08:00
|
|
|
getMessageContent: (data: { memory_id: string; message_id: string }) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/messages/${data.memory_id}:${data.message_id}/content`,
|
2025-12-17 12:35:26 +08:00
|
|
|
updateMessageState: (data: { memory_id: string; message_id: string }) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/messages/${data.memory_id}:${data.message_id}`,
|
2025-12-08 10:17:56 +08:00
|
|
|
|
2025-10-09 12:36:19 +08:00
|
|
|
// data pipeline
|
2026-04-07 15:08:11 +08:00
|
|
|
fetchDataflow: (id: string) => `${webAPI}/dataflow/get/${id}`,
|
|
|
|
|
setDataflow: `${webAPI}/dataflow/set`,
|
|
|
|
|
removeDataflow: `${webAPI}/dataflow/rm`,
|
|
|
|
|
listDataflow: `${webAPI}/dataflow/list`,
|
|
|
|
|
runDataflow: `${webAPI}/dataflow/run`,
|
2025-10-28 22:25:43 +08:00
|
|
|
|
|
|
|
|
// admin
|
2026-04-07 15:08:11 +08:00
|
|
|
adminLogin: `${restAPIv1}/admin/login`,
|
|
|
|
|
adminLogout: `${restAPIv1}/admin/logout`,
|
|
|
|
|
adminListUsers: `${restAPIv1}/admin/users`,
|
|
|
|
|
adminCreateUser: `${restAPIv1}/admin/users`,
|
2026-01-23 18:08:46 +08:00
|
|
|
adminSetSuperuser: (username: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/users/${username}/admin`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminGetUserDetails: (username: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/users/${username}`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminUpdateUserStatus: (username: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/users/${username}/activate`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminUpdateUserPassword: (username: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/users/${username}/password`,
|
|
|
|
|
adminDeleteUser: (username: string) => `${restAPIv1}/admin/users/${username}`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminListUserDatasets: (username: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/users/${username}/datasets`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminListUserAgents: (username: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/users/${username}/agents`,
|
2025-10-28 22:25:43 +08:00
|
|
|
|
2026-04-07 15:08:11 +08:00
|
|
|
adminListServices: `${restAPIv1}/admin/services`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminShowServiceDetails: (serviceId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/services/${serviceId}`,
|
2025-10-28 22:25:43 +08:00
|
|
|
|
2026-04-07 15:08:11 +08:00
|
|
|
adminListRoles: `${restAPIv1}/admin/roles`,
|
|
|
|
|
adminListRolesWithPermission: `${restAPIv1}/admin/roles_with_permission`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminGetRolePermissions: (roleName: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/roles/${roleName}/permissions`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminAssignRolePermissions: (roleName: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/roles/${roleName}/permission`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminRevokeRolePermissions: (roleName: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/roles/${roleName}/permission`,
|
|
|
|
|
adminCreateRole: `${restAPIv1}/admin/roles`,
|
|
|
|
|
adminDeleteRole: (roleName: string) => `${restAPIv1}/admin/roles/${roleName}`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminUpdateRoleDescription: (roleName: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/roles/${roleName}`,
|
2025-10-28 22:25:43 +08:00
|
|
|
|
|
|
|
|
adminUpdateUserRole: (username: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/users/${username}/role`,
|
2025-10-28 22:25:43 +08:00
|
|
|
adminGetUserPermissions: (username: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/users/${username}/permissions`,
|
2025-10-28 22:25:43 +08:00
|
|
|
|
2026-04-07 15:08:11 +08:00
|
|
|
adminListResources: `${restAPIv1}/admin/roles/resource`,
|
2025-11-03 09:52:23 +08:00
|
|
|
|
2026-04-07 15:08:11 +08:00
|
|
|
adminListWhitelist: `${restAPIv1}/admin/whitelist`,
|
|
|
|
|
adminCreateWhitelistEntry: `${restAPIv1}/admin/whitelist/add`,
|
2025-11-03 09:52:23 +08:00
|
|
|
adminUpdateWhitelistEntry: (id: number) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/whitelist/${id}`,
|
2025-11-03 09:52:23 +08:00
|
|
|
adminDeleteWhitelistEntry: (email: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/whitelist/${email}`,
|
|
|
|
|
adminImportWhitelist: `${restAPIv1}/admin/whitelist/batch`,
|
2025-11-11 15:20:37 +08:00
|
|
|
|
2026-04-07 15:08:11 +08:00
|
|
|
adminGetSystemVersion: `${restAPIv1}/admin/version`,
|
feat: Implement pluggable multi-provider sandbox architecture (#12820)
## Summary
Implement a flexible sandbox provider system supporting both
self-managed (Docker) and SaaS (Aliyun Code Interpreter) backends for
secure code execution in agent workflows.
**Key Changes:**
- ✅ Aliyun Code Interpreter provider using official
`agentrun-sdk>=0.0.16`
- ✅ Self-managed provider with gVisor (runsc) security
- ✅ Arguments parameter support for dynamic code execution
- ✅ Database-only configuration (removed fallback logic)
- ✅ Configuration scripts for quick setup
Issue #12479
## Features
### 🔌 Provider Abstraction Layer
**1. Self-Managed Provider** (`agent/sandbox/providers/self_managed.py`)
- Wraps existing executor_manager HTTP API
- gVisor (runsc) for secure container isolation
- Configurable pool size, timeout, retry logic
- Languages: Python, Node.js, JavaScript
- ⚠️ **Requires**: gVisor installation, Docker, base images
**2. Aliyun Code Interpreter**
(`agent/sandbox/providers/aliyun_codeinterpreter.py`)
- SaaS integration using official agentrun-sdk
- Serverless microVM execution with auto-authentication
- Hard timeout: 30 seconds max
- Credentials: `AGENTRUN_ACCESS_KEY_ID`, `AGENTRUN_ACCESS_KEY_SECRET`,
`AGENTRUN_ACCOUNT_ID`, `AGENTRUN_REGION`
- Automatically wraps code to call `main()` function
**3. E2B Provider** (`agent/sandbox/providers/e2b.py`)
- Placeholder for future integration
### ⚙️ Configuration System
- `conf/system_settings.json`: Default provider =
`aliyun_codeinterpreter`
- `agent/sandbox/client.py`: Enforces database-only configuration
- Admin UI: `/admin/sandbox-settings`
- Configuration validation via `validate_config()` method
- Health checks for all providers
### 🎯 Key Capabilities
**Arguments Parameter Support:**
All providers support passing arguments to `main()` function:
```python
# User code
def main(name: str, count: int) -> dict:
return {"message": f"Hello {name}!" * count}
# Executed with: arguments={"name": "World", "count": 3}
# Result: {"message": "Hello World!Hello World!Hello World!"}
```
**Self-Describing Providers:**
Each provider implements `get_config_schema()` returning form
configuration for Admin UI
**Error Handling:**
Structured `ExecutionResult` with stdout, stderr, exit_code,
execution_time
## Configuration Scripts
Two scripts for quick Aliyun sandbox setup:
**Shell Script (requires jq):**
```bash
source scripts/configure_aliyun_sandbox.sh
```
**Python Script (interactive):**
```bash
python3 scripts/configure_aliyun_sandbox.py
```
## Testing
```bash
# Unit tests
uv run pytest agent/sandbox/tests/test_providers.py -v
# Aliyun provider tests
uv run pytest agent/sandbox/tests/test_aliyun_codeinterpreter.py -v
# Integration tests (requires credentials)
uv run pytest agent/sandbox/tests/test_aliyun_codeinterpreter_integration.py -v
# Quick SDK validation
python3 agent/sandbox/tests/verify_sdk.py
```
**Test Coverage:**
- 30 unit tests for provider abstraction
- Provider-specific tests for Aliyun
- Integration tests with real API
- Security tests for executor_manager
## Documentation
- `docs/develop/sandbox_spec.md` - Complete architecture specification
- `agent/sandbox/tests/MIGRATION_GUIDE.md` - Migration from legacy
sandbox
- `agent/sandbox/tests/QUICKSTART.md` - Quick start guide
- `agent/sandbox/tests/README.md` - Testing documentation
## Breaking Changes
⚠️ **Migration Required:**
1. **Directory Move**: `sandbox/` → `agent/sandbox/`
- Update imports: `from sandbox.` → `from agent.sandbox.`
2. **Mandatory Configuration**:
- SystemSettings must have `sandbox.provider_type` configured
- Removed fallback default values
- Configuration must exist in database (from
`conf/system_settings.json`)
3. **Aliyun Credentials**:
- Requires `AGENTRUN_*` environment variables (not `ALIYUN_*`)
- `AGENTRUN_ACCOUNT_ID` is now required (Aliyun primary account ID)
4. **Self-Managed Provider**:
- gVisor (runsc) must be installed for security
- Install: `go install gvisor.dev/gvisor/runsc@latest`
## Database Schema Changes
```python
# SystemSettings.value: CharField → TextField
api/db/db_models.py: Changed for unlimited config length
# SystemSettingsService.get_by_name(): Fixed query precision
api/db/services/system_settings_service.py: startswith → exact match
```
## Files Changed
### Backend (Python)
- `agent/sandbox/providers/base.py` - SandboxProvider ABC interface
- `agent/sandbox/providers/manager.py` - ProviderManager
- `agent/sandbox/providers/self_managed.py` - Self-managed provider
- `agent/sandbox/providers/aliyun_codeinterpreter.py` - Aliyun provider
- `agent/sandbox/providers/e2b.py` - E2B provider (placeholder)
- `agent/sandbox/client.py` - Unified client (enforces DB-only config)
- `agent/tools/code_exec.py` - Updated to use provider system
- `admin/server/services.py` - SandboxMgr with registry & validation
- `admin/server/routes.py` - 5 sandbox API endpoints
- `conf/system_settings.json` - Default: aliyun_codeinterpreter
- `api/db/db_models.py` - TextField for SystemSettings.value
- `api/db/services/system_settings_service.py` - Exact match query
### Frontend (TypeScript/React)
- `web/src/pages/admin/sandbox-settings.tsx` - Settings UI
- `web/src/services/admin-service.ts` - Sandbox service functions
- `web/src/services/admin.service.d.ts` - Type definitions
- `web/src/utils/api.ts` - Sandbox API endpoints
### Documentation
- `docs/develop/sandbox_spec.md` - Architecture spec
- `agent/sandbox/tests/MIGRATION_GUIDE.md` - Migration guide
- `agent/sandbox/tests/QUICKSTART.md` - Quick start
- `agent/sandbox/tests/README.md` - Testing guide
### Configuration Scripts
- `scripts/configure_aliyun_sandbox.sh` - Shell script (jq)
- `scripts/configure_aliyun_sandbox.py` - Python script
### Tests
- `agent/sandbox/tests/test_providers.py` - 30 unit tests
- `agent/sandbox/tests/test_aliyun_codeinterpreter.py` - Provider tests
- `agent/sandbox/tests/test_aliyun_codeinterpreter_integration.py` -
Integration tests
- `agent/sandbox/tests/verify_sdk.py` - SDK validation
## Architecture
```
Admin UI → Admin API → SandboxMgr → ProviderManager → [SelfManaged|Aliyun|E2B]
↓
SystemSettings
```
## Usage
### 1. Configure Provider
**Via Admin UI:**
1. Navigate to `/admin/sandbox-settings`
2. Select provider (Aliyun Code Interpreter / Self-Managed)
3. Fill in configuration
4. Click "Test Connection" to verify
5. Click "Save" to apply
**Via Configuration Scripts:**
```bash
# Aliyun provider
export AGENTRUN_ACCESS_KEY_ID="xxx"
export AGENTRUN_ACCESS_KEY_SECRET="yyy"
export AGENTRUN_ACCOUNT_ID="zzz"
export AGENTRUN_REGION="cn-shanghai"
source scripts/configure_aliyun_sandbox.sh
```
### 2. Restart Service
```bash
cd docker
docker compose restart ragflow-server
```
### 3. Execute Code in Agent
```python
from agent.sandbox.client import execute_code
result = execute_code(
code='def main(name: str) -> dict: return {"message": f"Hello {name}!"}',
language="python",
timeout=30,
arguments={"name": "World"}
)
print(result.stdout) # {"message": "Hello World!"}
```
## Troubleshooting
### "Container pool is busy" (Self-Managed)
- **Cause**: Pool exhausted (default: 1 container in `.env`)
- **Fix**: Increase `SANDBOX_EXECUTOR_MANAGER_POOL_SIZE` to 5+
### "Sandbox provider type not configured"
- **Cause**: Database missing configuration
- **Fix**: Run config script or set via Admin UI
### "gVisor not found"
- **Cause**: runsc not installed
- **Fix**: `go install gvisor.dev/gvisor/runsc@latest && sudo cp
~/go/bin/runsc /usr/local/bin/`
### Aliyun authentication errors
- **Cause**: Wrong environment variable names
- **Fix**: Use `AGENTRUN_*` prefix (not `ALIYUN_*`)
## Checklist
- [x] All tests passing (30 unit tests + integration tests)
- [x] Documentation updated (spec, migration guide, quickstart)
- [x] Type definitions added (TypeScript)
- [x] Admin UI implemented
- [x] Configuration validation
- [x] Health checks implemented
- [x] Error handling with structured results
- [x] Breaking changes documented
- [x] Configuration scripts created
- [x] gVisor requirements documented
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-28 13:28:21 +08:00
|
|
|
|
|
|
|
|
// Sandbox settings
|
2026-04-07 15:08:11 +08:00
|
|
|
adminListSandboxProviders: `${restAPIv1}/admin/sandbox/providers`,
|
feat: Implement pluggable multi-provider sandbox architecture (#12820)
## Summary
Implement a flexible sandbox provider system supporting both
self-managed (Docker) and SaaS (Aliyun Code Interpreter) backends for
secure code execution in agent workflows.
**Key Changes:**
- ✅ Aliyun Code Interpreter provider using official
`agentrun-sdk>=0.0.16`
- ✅ Self-managed provider with gVisor (runsc) security
- ✅ Arguments parameter support for dynamic code execution
- ✅ Database-only configuration (removed fallback logic)
- ✅ Configuration scripts for quick setup
Issue #12479
## Features
### 🔌 Provider Abstraction Layer
**1. Self-Managed Provider** (`agent/sandbox/providers/self_managed.py`)
- Wraps existing executor_manager HTTP API
- gVisor (runsc) for secure container isolation
- Configurable pool size, timeout, retry logic
- Languages: Python, Node.js, JavaScript
- ⚠️ **Requires**: gVisor installation, Docker, base images
**2. Aliyun Code Interpreter**
(`agent/sandbox/providers/aliyun_codeinterpreter.py`)
- SaaS integration using official agentrun-sdk
- Serverless microVM execution with auto-authentication
- Hard timeout: 30 seconds max
- Credentials: `AGENTRUN_ACCESS_KEY_ID`, `AGENTRUN_ACCESS_KEY_SECRET`,
`AGENTRUN_ACCOUNT_ID`, `AGENTRUN_REGION`
- Automatically wraps code to call `main()` function
**3. E2B Provider** (`agent/sandbox/providers/e2b.py`)
- Placeholder for future integration
### ⚙️ Configuration System
- `conf/system_settings.json`: Default provider =
`aliyun_codeinterpreter`
- `agent/sandbox/client.py`: Enforces database-only configuration
- Admin UI: `/admin/sandbox-settings`
- Configuration validation via `validate_config()` method
- Health checks for all providers
### 🎯 Key Capabilities
**Arguments Parameter Support:**
All providers support passing arguments to `main()` function:
```python
# User code
def main(name: str, count: int) -> dict:
return {"message": f"Hello {name}!" * count}
# Executed with: arguments={"name": "World", "count": 3}
# Result: {"message": "Hello World!Hello World!Hello World!"}
```
**Self-Describing Providers:**
Each provider implements `get_config_schema()` returning form
configuration for Admin UI
**Error Handling:**
Structured `ExecutionResult` with stdout, stderr, exit_code,
execution_time
## Configuration Scripts
Two scripts for quick Aliyun sandbox setup:
**Shell Script (requires jq):**
```bash
source scripts/configure_aliyun_sandbox.sh
```
**Python Script (interactive):**
```bash
python3 scripts/configure_aliyun_sandbox.py
```
## Testing
```bash
# Unit tests
uv run pytest agent/sandbox/tests/test_providers.py -v
# Aliyun provider tests
uv run pytest agent/sandbox/tests/test_aliyun_codeinterpreter.py -v
# Integration tests (requires credentials)
uv run pytest agent/sandbox/tests/test_aliyun_codeinterpreter_integration.py -v
# Quick SDK validation
python3 agent/sandbox/tests/verify_sdk.py
```
**Test Coverage:**
- 30 unit tests for provider abstraction
- Provider-specific tests for Aliyun
- Integration tests with real API
- Security tests for executor_manager
## Documentation
- `docs/develop/sandbox_spec.md` - Complete architecture specification
- `agent/sandbox/tests/MIGRATION_GUIDE.md` - Migration from legacy
sandbox
- `agent/sandbox/tests/QUICKSTART.md` - Quick start guide
- `agent/sandbox/tests/README.md` - Testing documentation
## Breaking Changes
⚠️ **Migration Required:**
1. **Directory Move**: `sandbox/` → `agent/sandbox/`
- Update imports: `from sandbox.` → `from agent.sandbox.`
2. **Mandatory Configuration**:
- SystemSettings must have `sandbox.provider_type` configured
- Removed fallback default values
- Configuration must exist in database (from
`conf/system_settings.json`)
3. **Aliyun Credentials**:
- Requires `AGENTRUN_*` environment variables (not `ALIYUN_*`)
- `AGENTRUN_ACCOUNT_ID` is now required (Aliyun primary account ID)
4. **Self-Managed Provider**:
- gVisor (runsc) must be installed for security
- Install: `go install gvisor.dev/gvisor/runsc@latest`
## Database Schema Changes
```python
# SystemSettings.value: CharField → TextField
api/db/db_models.py: Changed for unlimited config length
# SystemSettingsService.get_by_name(): Fixed query precision
api/db/services/system_settings_service.py: startswith → exact match
```
## Files Changed
### Backend (Python)
- `agent/sandbox/providers/base.py` - SandboxProvider ABC interface
- `agent/sandbox/providers/manager.py` - ProviderManager
- `agent/sandbox/providers/self_managed.py` - Self-managed provider
- `agent/sandbox/providers/aliyun_codeinterpreter.py` - Aliyun provider
- `agent/sandbox/providers/e2b.py` - E2B provider (placeholder)
- `agent/sandbox/client.py` - Unified client (enforces DB-only config)
- `agent/tools/code_exec.py` - Updated to use provider system
- `admin/server/services.py` - SandboxMgr with registry & validation
- `admin/server/routes.py` - 5 sandbox API endpoints
- `conf/system_settings.json` - Default: aliyun_codeinterpreter
- `api/db/db_models.py` - TextField for SystemSettings.value
- `api/db/services/system_settings_service.py` - Exact match query
### Frontend (TypeScript/React)
- `web/src/pages/admin/sandbox-settings.tsx` - Settings UI
- `web/src/services/admin-service.ts` - Sandbox service functions
- `web/src/services/admin.service.d.ts` - Type definitions
- `web/src/utils/api.ts` - Sandbox API endpoints
### Documentation
- `docs/develop/sandbox_spec.md` - Architecture spec
- `agent/sandbox/tests/MIGRATION_GUIDE.md` - Migration guide
- `agent/sandbox/tests/QUICKSTART.md` - Quick start
- `agent/sandbox/tests/README.md` - Testing guide
### Configuration Scripts
- `scripts/configure_aliyun_sandbox.sh` - Shell script (jq)
- `scripts/configure_aliyun_sandbox.py` - Python script
### Tests
- `agent/sandbox/tests/test_providers.py` - 30 unit tests
- `agent/sandbox/tests/test_aliyun_codeinterpreter.py` - Provider tests
- `agent/sandbox/tests/test_aliyun_codeinterpreter_integration.py` -
Integration tests
- `agent/sandbox/tests/verify_sdk.py` - SDK validation
## Architecture
```
Admin UI → Admin API → SandboxMgr → ProviderManager → [SelfManaged|Aliyun|E2B]
↓
SystemSettings
```
## Usage
### 1. Configure Provider
**Via Admin UI:**
1. Navigate to `/admin/sandbox-settings`
2. Select provider (Aliyun Code Interpreter / Self-Managed)
3. Fill in configuration
4. Click "Test Connection" to verify
5. Click "Save" to apply
**Via Configuration Scripts:**
```bash
# Aliyun provider
export AGENTRUN_ACCESS_KEY_ID="xxx"
export AGENTRUN_ACCESS_KEY_SECRET="yyy"
export AGENTRUN_ACCOUNT_ID="zzz"
export AGENTRUN_REGION="cn-shanghai"
source scripts/configure_aliyun_sandbox.sh
```
### 2. Restart Service
```bash
cd docker
docker compose restart ragflow-server
```
### 3. Execute Code in Agent
```python
from agent.sandbox.client import execute_code
result = execute_code(
code='def main(name: str) -> dict: return {"message": f"Hello {name}!"}',
language="python",
timeout=30,
arguments={"name": "World"}
)
print(result.stdout) # {"message": "Hello World!"}
```
## Troubleshooting
### "Container pool is busy" (Self-Managed)
- **Cause**: Pool exhausted (default: 1 container in `.env`)
- **Fix**: Increase `SANDBOX_EXECUTOR_MANAGER_POOL_SIZE` to 5+
### "Sandbox provider type not configured"
- **Cause**: Database missing configuration
- **Fix**: Run config script or set via Admin UI
### "gVisor not found"
- **Cause**: runsc not installed
- **Fix**: `go install gvisor.dev/gvisor/runsc@latest && sudo cp
~/go/bin/runsc /usr/local/bin/`
### Aliyun authentication errors
- **Cause**: Wrong environment variable names
- **Fix**: Use `AGENTRUN_*` prefix (not `ALIYUN_*`)
## Checklist
- [x] All tests passing (30 unit tests + integration tests)
- [x] Documentation updated (spec, migration guide, quickstart)
- [x] Type definitions added (TypeScript)
- [x] Admin UI implemented
- [x] Configuration validation
- [x] Health checks implemented
- [x] Error handling with structured results
- [x] Breaking changes documented
- [x] Configuration scripts created
- [x] gVisor requirements documented
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-28 13:28:21 +08:00
|
|
|
adminGetSandboxProviderSchema: (providerId: string) =>
|
2026-04-07 15:08:11 +08:00
|
|
|
`${restAPIv1}/admin/sandbox/providers/${providerId}/schema`,
|
|
|
|
|
adminGetSandboxConfig: `${restAPIv1}/admin/sandbox/config`,
|
|
|
|
|
adminSetSandboxConfig: `${restAPIv1}/admin/sandbox/config`,
|
|
|
|
|
adminTestSandboxConnection: `${restAPIv1}/admin/sandbox/test`,
|
2024-08-01 17:27:27 +08:00
|
|
|
};
|