diff --git a/package.json b/package.json index a3ca8d82..e1c4f19b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maxun", - "version": "0.0.29", + "version": "0.0.30", "author": "Maxun", "license": "AGPL-3.0-or-later", "dependencies": { diff --git a/server/src/api/record.ts b/server/src/api/record.ts index 25c6f95a..f6ef6ea7 100644 --- a/server/src/api/record.ts +++ b/server/src/api/record.ts @@ -1001,6 +1001,7 @@ async function executeRun(id: string, userId: string, requestedFormats?: string[ schemaItemsExtracted: totalSchemaItemsExtracted, listItemsExtracted: totalListItemsExtracted, extractedScreenshotsCount, + is_llm: (recording.recording_meta as any).isLLM, } ) @@ -1121,15 +1122,16 @@ async function executeRun(id: string, userId: string, requestedFormats?: string[ } catch (webhookError: any) { logger.log('error', `Failed to send failure webhooks for run ${run.runId}: ${webhookError.message}`); } + capture( + 'maxun-oss-run-created-api', + { + runId: id, + created_at: new Date().toISOString(), + status: 'failed', + is_llm: (recording?.recording_meta as any)?.isLLM, + } + ); } - capture( - 'maxun-oss-run-created-api', - { - runId: id, - created_at: new Date().toISOString(), - status: 'failed', - } - ); return { success: false, error: error.message, diff --git a/server/src/api/sdk.ts b/server/src/api/sdk.ts index 1a049d58..db6649ee 100644 --- a/server/src/api/sdk.ts +++ b/server/src/api/sdk.ts @@ -99,7 +99,10 @@ router.post("/sdk/robots", requireAPIKey, async (req: AuthenticatedRequest, res: } }); - capture("maxun-oss-robot-created", { + const eventName = robotMeta.isLLM + ? "maxun-oss-llm-robot-created" + : "maxun-oss-robot-created"; + capture(eventName, { robot_meta: robot.recording_meta, recording: robot.recording, }); @@ -389,13 +392,14 @@ router.delete("/sdk/robots/:id", requireAPIKey, async (req: AuthenticatedRequest logger.info(`[SDK] Robot deleted: ${robotId}`); - capture( - 'maxun-oss-robot-deleted', - { - robotId: robotId, - user_id: req.user?.id, - deleted_at: new Date().toISOString(), - } + const deleteEventName = robot.recording_meta.isLLM + ? "maxun-oss-llm-robot-deleted" + : "maxun-oss-robot-deleted"; + capture(deleteEventName, { + robotId: robotId, + user_id: req.user?.id, + deleted_at: new Date().toISOString(), + } ) return res.status(200).json({ @@ -431,7 +435,7 @@ router.post("/sdk/robots/:id/execute", requireAPIKey, async (req: AuthenticatedR let listData: any[] = []; if (run.serializableOutput?.scrapeList) { const scrapeList: any = run.serializableOutput.scrapeList; - + if (scrapeList.scrapeList && Array.isArray(scrapeList.scrapeList)) { listData = scrapeList.scrapeList; } @@ -677,6 +681,7 @@ router.post("/sdk/extract/llm", requireAPIKey, async (req: AuthenticatedRequest, params: [], type: 'extract', url: workflowResult.url, + isLLM: true, }; const robot = await Robot.create({ @@ -690,7 +695,7 @@ router.post("/sdk/extract/llm", requireAPIKey, async (req: AuthenticatedRequest, logger.info(`[SDK] Persistent robot created: ${metaId} for LLM extraction`); - capture("maxun-oss-robot-created", { + capture("maxun-oss-llm-robot-created", { robot_meta: robot.recording_meta, recording: robot.recording, }); diff --git a/server/src/models/Robot.ts b/server/src/models/Robot.ts index 1ce269b0..51f9e48f 100644 --- a/server/src/models/Robot.ts +++ b/server/src/models/Robot.ts @@ -12,6 +12,7 @@ interface RobotMeta { type?: 'extract' | 'scrape'; url?: string; formats?: ('markdown' | 'html' | 'screenshot-visible' | 'screenshot-fullpage')[]; + isLLM?: boolean; } interface RobotWorkflow { diff --git a/server/src/pgboss-worker.ts b/server/src/pgboss-worker.ts index 1f7125f4..43b4efc3 100644 --- a/server/src/pgboss-worker.ts +++ b/server/src/pgboss-worker.ts @@ -538,6 +538,7 @@ async function processRunExecution(job: Job) { schemaItemsExtracted: totalSchemaItemsExtracted, listItemsExtracted: totalListItemsExtracted, extractedScreenshotsCount, + is_llm: (recording.recording_meta as any).isLLM, } ); @@ -703,6 +704,7 @@ async function processRunExecution(job: Job) { error_message: executionError.message, partial_data_extracted: partialDataExtracted, totalRowsExtracted: partialData?.totalSchemaItemsExtracted + partialData?.totalListItemsExtracted + partialData?.extractedScreenshotsCount || 0, + is_llm: (recording?.recording_meta as any)?.isLLM, }); try { diff --git a/server/src/routes/storage.ts b/server/src/routes/storage.ts index 7eb0dd79..0f84504e 100644 --- a/server/src/routes/storage.ts +++ b/server/src/routes/storage.ts @@ -573,6 +573,7 @@ router.post('/recordings/llm', requireSignIn, async (req: AuthenticatedRequest, params: [], type: 'extract', url: workflowResult.url || url, + isLLM: true, }, recording: { workflow: workflowResult.workflow }, google_sheet_email: null, @@ -584,7 +585,7 @@ router.post('/recordings/llm', requireSignIn, async (req: AuthenticatedRequest, }); logger.log('info', `LLM robot created with id: ${newRobot.id}`); - capture('maxun-oss-robot-created', { + capture('maxun-oss-llm-robot-created', { robot_meta: newRobot.recording_meta, recording: newRobot.recording, llm_provider: llmProvider || 'ollama', diff --git a/server/src/workflow-management/scheduler/index.ts b/server/src/workflow-management/scheduler/index.ts index 652e72d8..29999cff 100644 --- a/server/src/workflow-management/scheduler/index.ts +++ b/server/src/workflow-management/scheduler/index.ts @@ -536,6 +536,7 @@ async function executeRun(id: string, userId: string) { schemaItemsExtracted: totalSchemaItemsExtracted, listItemsExtracted: totalListItemsExtracted, extractedScreenshotsCount, + is_llm: (recording.recording_meta as any).isLLM, } ); @@ -650,15 +651,16 @@ async function executeRun(id: string, userId: string) { } catch (socketError: any) { logger.log('warn', `Failed to emit failure event in main catch: ${socketError.message}`); } + capture( + 'maxun-oss-run-created-scheduled', + { + runId: id, + created_at: new Date().toISOString(), + status: 'failed', + is_llm: (recording?.recording_meta as any)?.isLLM, + } + ); } - capture( - 'maxun-oss-run-created-scheduled', - { - runId: id, - created_at: new Date().toISOString(), - status: 'failed', - } - ); return false; } } diff --git a/src/components/robot/pages/RobotDuplicatePage.tsx b/src/components/robot/pages/RobotDuplicatePage.tsx index fd01103b..f021ee45 100644 --- a/src/components/robot/pages/RobotDuplicatePage.tsx +++ b/src/components/robot/pages/RobotDuplicatePage.tsx @@ -27,6 +27,7 @@ interface RobotMeta { type?: 'extract' | 'scrape'; url?: string; formats?: ('markdown' | 'html' | 'screenshot-visible' | 'screenshot-fullpage')[]; + isLLM?: boolean; } interface RobotWorkflow { diff --git a/src/components/robot/pages/RobotEditPage.tsx b/src/components/robot/pages/RobotEditPage.tsx index 54b06962..8914f4aa 100644 --- a/src/components/robot/pages/RobotEditPage.tsx +++ b/src/components/robot/pages/RobotEditPage.tsx @@ -27,6 +27,7 @@ interface RobotMeta { type?: 'extract' | 'scrape'; url?: string; formats?: ('markdown' | 'html' | 'screenshot-visible' | 'screenshot-fullpage')[]; + isLLM?: boolean; } interface RobotWorkflow { diff --git a/src/components/robot/pages/RobotSettingsPage.tsx b/src/components/robot/pages/RobotSettingsPage.tsx index 0817c0ab..a5618d4c 100644 --- a/src/components/robot/pages/RobotSettingsPage.tsx +++ b/src/components/robot/pages/RobotSettingsPage.tsx @@ -19,6 +19,7 @@ interface RobotMeta { type?: 'extract' | 'scrape'; url?: string; formats?: ('markdown' | 'html' | 'screenshot-visible' | 'screenshot-fullpage')[]; + isLLM?: boolean; } interface RobotWorkflow { diff --git a/src/context/globalInfo.tsx b/src/context/globalInfo.tsx index c5bbc044..5db9239d 100644 --- a/src/context/globalInfo.tsx +++ b/src/context/globalInfo.tsx @@ -30,6 +30,7 @@ interface RobotMeta { type?: 'extract' | 'scrape'; url?: string; formats?: ('markdown' | 'html' | 'screenshot-visible' | 'screenshot-fullpage')[]; + isLLM?: boolean; } interface RobotWorkflow {