@apify/actors-mcp-server 0.9.20-beta.3 → 0.9.20-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tools/core/call_actor_common.d.ts +45 -0
- package/dist/tools/core/call_actor_common.d.ts.map +1 -1
- package/dist/tools/core/call_actor_common.js +148 -13
- package/dist/tools/core/call_actor_common.js.map +1 -1
- package/dist/tools/core/get_actor_run_common.d.ts +11 -0
- package/dist/tools/core/get_actor_run_common.d.ts.map +1 -1
- package/dist/tools/core/get_actor_run_common.js +40 -1
- package/dist/tools/core/get_actor_run_common.js.map +1 -1
- package/dist/tools/default/call_actor.d.ts.map +1 -1
- package/dist/tools/default/call_actor.js +19 -50
- package/dist/tools/default/call_actor.js.map +1 -1
- package/dist/tools/default/get_actor_run.d.ts.map +1 -1
- package/dist/tools/default/get_actor_run.js +3 -16
- package/dist/tools/default/get_actor_run.js.map +1 -1
- package/dist/tools/openai/call_actor.d.ts.map +1 -1
- package/dist/tools/openai/call_actor.js +18 -62
- package/dist/tools/openai/call_actor.js.map +1 -1
- package/dist/tools/openai/get_actor_run.d.ts.map +1 -1
- package/dist/tools/openai/get_actor_run.js +3 -25
- package/dist/tools/openai/get_actor_run.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_actor_run.js","sourceRoot":"","sources":["../../../src/tools/default/get_actor_run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get_actor_run.js","sourceRoot":"","sources":["../../../src/tools/default/get_actor_run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACH,qBAAqB,EACrB,+BAA+B,EAC/B,iBAAiB,EACjB,eAAe,EACf,mBAAmB,GACtB,MAAM,iCAAiC,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAc,MAAM,CAAC,MAAM,CAAC;IACvD,GAAG,mBAAmB;IACtB,IAAI,EAAE,KAAK,EAAE,QAA0B,EAAE,EAAE;QACvC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;QAC7D,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE3C,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC;gBACxC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM;gBACN,YAAY;aACf,CAAC,CAAC;YAEH,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;gBACzB,OAAO,WAAW,CAAC,KAAK,CAAC;YAC7B,CAAC;YAED,OAAO,+BAA+B,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,YAAY,CAAC,KAAK,EAAE,yBAAyB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;CACK,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call_actor.d.ts","sourceRoot":"","sources":["../../../src/tools/openai/call_actor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAoB,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"call_actor.d.ts","sourceRoot":"","sources":["../../../src/tools/openai/call_actor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAoB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAoBlE;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,SAoEnB,CAAC"}
|
|
@@ -2,29 +2,15 @@ var _a;
|
|
|
2
2
|
import log from '@apify/log';
|
|
3
3
|
import { HelperTools } from '../../const.js';
|
|
4
4
|
import { getWidgetConfig, WIDGET_URIS } from '../../resources/widgets.js';
|
|
5
|
-
import { getHttpStatusCode, logHttpError } from '../../utils/logging.js';
|
|
6
|
-
import { buildMCPResponse } from '../../utils/mcp.js';
|
|
7
|
-
import { classifyFailureCategory, getToolStatusFromError } from '../../utils/tool_status.js';
|
|
8
5
|
import { extractActorId } from '../../utils/tools.js';
|
|
9
|
-
import {
|
|
6
|
+
import { buildCallActorDescription, buildCallActorErrorResponse, buildStartAsyncResponse, callActorAjvValidate, callActorInputSchema, callActorPreExecute, resolveAndValidateActor, } from '../core/call_actor_common.js';
|
|
10
7
|
import { callActorOutputSchema } from '../structured_output_schemas.js';
|
|
11
|
-
const CALL_ACTOR_OPENAI_DESCRIPTION =
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
If the actor name is not in "username/name" format, use ${HelperTools.STORE_SEARCH_INTERNAL} to resolve the correct Actor first.
|
|
18
|
-
Do NOT use ${HelperTools.STORE_SEARCH} for name resolution when the next step is running an Actor.`,
|
|
19
|
-
CALL_ACTOR_MCP_SERVER_SECTION,
|
|
20
|
-
`IMPORTANT:
|
|
21
|
-
- This tool always runs asynchronously — it starts the Actor and returns immediately with a runId. A live widget automatically tracks the run progress.
|
|
22
|
-
- After calling this tool, do NOT poll or call any other tool. Wait for the user to respond — the widget will update them when the run completes.
|
|
23
|
-
- Once the run completes, use ${HelperTools.ACTOR_OUTPUT_GET} tool with the datasetId to fetch full results.
|
|
24
|
-
- Use dedicated Actor tools when available for better experience`,
|
|
25
|
-
CALL_ACTOR_USAGE_SECTION,
|
|
26
|
-
CALL_ACTOR_EXAMPLES_SECTION,
|
|
27
|
-
].join('\n\n');
|
|
8
|
+
const CALL_ACTOR_OPENAI_DESCRIPTION = buildCallActorDescription({
|
|
9
|
+
actorGetDetailsTool: HelperTools.ACTOR_GET_DETAILS_INTERNAL,
|
|
10
|
+
storeSearchTool: HelperTools.STORE_SEARCH_INTERNAL,
|
|
11
|
+
useInternalSearchWarning: true,
|
|
12
|
+
alwaysAsync: true,
|
|
13
|
+
});
|
|
28
14
|
/**
|
|
29
15
|
* OpenAI mode call-actor tool.
|
|
30
16
|
* Always runs asynchronously — starts the run and returns immediately with widget metadata.
|
|
@@ -50,7 +36,6 @@ export const openaiCallActor = Object.freeze({
|
|
|
50
36
|
openWorldHint: true,
|
|
51
37
|
},
|
|
52
38
|
call: async (toolArgs) => {
|
|
53
|
-
var _a;
|
|
54
39
|
const preResult = await callActorPreExecute(toolArgs);
|
|
55
40
|
if ('earlyResponse' in preResult) {
|
|
56
41
|
return preResult.earlyResponse;
|
|
@@ -73,55 +58,26 @@ export const openaiCallActor = Object.freeze({
|
|
|
73
58
|
const actorClient = apifyClient.actor(baseActorName);
|
|
74
59
|
const actorRun = await actorClient.start(input, callOptions);
|
|
75
60
|
log.debug('Started Actor run (async)', { actorName: baseActorName, runId: actorRun.id, mcpSessionId: toolArgs.mcpSessionId });
|
|
76
|
-
const
|
|
77
|
-
runId: actorRun.id,
|
|
61
|
+
const response = buildStartAsyncResponse({
|
|
78
62
|
actorName: baseActorName,
|
|
79
|
-
|
|
80
|
-
startedAt: ((_a = actorRun.startedAt) === null || _a === void 0 ? void 0 : _a.toISOString()) || '',
|
|
63
|
+
actorRun,
|
|
81
64
|
input,
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
A live progress widget has been rendered that automatically tracks this run and refreshes status every few seconds until completion.
|
|
86
|
-
|
|
87
|
-
The widget will update the context with run status and datasetId when the run completes. Once complete (or if the user requests results), use ${HelperTools.ACTOR_OUTPUT_GET} with the datasetId to retrieve the output.
|
|
88
|
-
|
|
89
|
-
Do NOT proactively poll using ${HelperTools.ACTOR_RUNS_GET}. Wait for the widget state update or user instructions. Ask the user what they would like to do next.`;
|
|
90
|
-
const widgetConfig = getWidgetConfig(WIDGET_URIS.ACTOR_RUN);
|
|
65
|
+
widget: true,
|
|
66
|
+
});
|
|
91
67
|
return {
|
|
92
|
-
|
|
93
|
-
type: 'text',
|
|
94
|
-
text: responseText,
|
|
95
|
-
}],
|
|
96
|
-
structuredContent,
|
|
97
|
-
// Response-level meta; only returned in openai mode (this handler is openai-only)
|
|
98
|
-
_meta: {
|
|
99
|
-
...widgetConfig === null || widgetConfig === void 0 ? void 0 : widgetConfig.meta,
|
|
100
|
-
'openai/widgetDescription': `Actor run progress for ${baseActorName}`,
|
|
101
|
-
},
|
|
68
|
+
...response,
|
|
102
69
|
toolTelemetry: { actorId: resolvedActorId },
|
|
103
70
|
};
|
|
104
71
|
}
|
|
105
72
|
catch (error) {
|
|
106
|
-
|
|
107
|
-
logHttpError(error, 'Failed to call Actor', {
|
|
73
|
+
return buildCallActorErrorResponse({
|
|
108
74
|
actorName: baseActorName,
|
|
109
|
-
|
|
75
|
+
error,
|
|
76
|
+
actorId: resolvedActorId,
|
|
77
|
+
isAsync: true,
|
|
110
78
|
mcpSessionId: toolArgs.mcpSessionId,
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
return buildMCPResponse({
|
|
114
|
-
texts: [`Failed to call Actor '${baseActorName}': ${errMsg}.
|
|
115
|
-
Please verify the Actor name, input parameters, and ensure the Actor exists.
|
|
116
|
-
You can search for available Actors using the tool: ${HelperTools.STORE_SEARCH_INTERNAL}, or get Actor details using: ${HelperTools.ACTOR_GET_DETAILS_INTERNAL}.`],
|
|
117
|
-
isError: true,
|
|
118
|
-
telemetry: {
|
|
119
|
-
toolStatus: getToolStatusFromError(error, false),
|
|
120
|
-
failureCategory: classifyFailureCategory(error),
|
|
121
|
-
failureHttpStatus: getHttpStatusCode(error),
|
|
122
|
-
failureDetail: errMsg.slice(0, 200),
|
|
123
|
-
actorId: resolvedActorId,
|
|
124
|
-
},
|
|
79
|
+
actorGetDetailsTool: HelperTools.ACTOR_GET_DETAILS_INTERNAL,
|
|
80
|
+
storeSearchTool: HelperTools.STORE_SEARCH_INTERNAL,
|
|
125
81
|
});
|
|
126
82
|
}
|
|
127
83
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call_actor.js","sourceRoot":"","sources":["../../../src/tools/openai/call_actor.ts"],"names":[],"mappings":";AAAA,OAAO,GAAG,MAAM,YAAY,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE1E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"call_actor.js","sourceRoot":"","sources":["../../../src/tools/openai/call_actor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_actor_run.d.ts","sourceRoot":"","sources":["../../../src/tools/openai/get_actor_run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get_actor_run.d.ts","sourceRoot":"","sources":["../../../src/tools/openai/get_actor_run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAUlE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAuBrB,CAAC"}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import { TOOL_STATUS } from '../../const.js';
|
|
2
|
-
import { getWidgetConfig, WIDGET_URIS } from '../../resources/widgets.js';
|
|
3
1
|
import { logHttpError } from '../../utils/logging.js';
|
|
4
|
-
import {
|
|
5
|
-
import { fetchActorRunData, getActorRunArgs, getActorRunMetadata, } from '../core/get_actor_run_common.js';
|
|
2
|
+
import { buildGetActorRunError, buildGetActorRunSuccessResponse, fetchActorRunData, getActorRunArgs, getActorRunMetadata, } from '../core/get_actor_run_common.js';
|
|
6
3
|
/**
|
|
7
4
|
* OpenAI mode get-actor-run tool.
|
|
8
5
|
* Returns abbreviated text with widget metadata for interactive progress display.
|
|
@@ -21,30 +18,11 @@ export const openaiGetActorRun = Object.freeze({
|
|
|
21
18
|
if ('error' in fetchResult) {
|
|
22
19
|
return fetchResult.error;
|
|
23
20
|
}
|
|
24
|
-
|
|
25
|
-
const statusText = run.status === 'SUCCEEDED' && structuredContent.dataset
|
|
26
|
-
? `Actor run ${parsed.runId} completed successfully with ${structuredContent.dataset.totalItemCount} items. A widget has been rendered with the details.`
|
|
27
|
-
: `Actor run ${parsed.runId} status: ${run.status}. A progress widget has been rendered.`;
|
|
28
|
-
const widgetConfig = getWidgetConfig(WIDGET_URIS.ACTOR_RUN);
|
|
29
|
-
const usageMeta = buildUsageMeta(run);
|
|
30
|
-
return buildMCPResponse({
|
|
31
|
-
texts: [statusText],
|
|
32
|
-
structuredContent,
|
|
33
|
-
// Response-level meta; only returned in openai mode (this handler is openai-only)
|
|
34
|
-
_meta: {
|
|
35
|
-
...widgetConfig === null || widgetConfig === void 0 ? void 0 : widgetConfig.meta,
|
|
36
|
-
...usageMeta,
|
|
37
|
-
},
|
|
38
|
-
});
|
|
21
|
+
return buildGetActorRunSuccessResponse({ ...fetchResult.result, widget: true });
|
|
39
22
|
}
|
|
40
23
|
catch (error) {
|
|
41
24
|
logHttpError(error, 'Failed to get Actor run', { runId: parsed.runId });
|
|
42
|
-
return
|
|
43
|
-
texts: [`Failed to get Actor run '${parsed.runId}': ${error instanceof Error ? error.message : String(error)}.
|
|
44
|
-
Please verify the run ID and ensure that the run exists.`],
|
|
45
|
-
isError: true,
|
|
46
|
-
telemetry: { toolStatus: TOOL_STATUS.SOFT_FAIL },
|
|
47
|
-
});
|
|
25
|
+
return buildGetActorRunError(parsed.runId, error);
|
|
48
26
|
}
|
|
49
27
|
},
|
|
50
28
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_actor_run.js","sourceRoot":"","sources":["../../../src/tools/openai/get_actor_run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get_actor_run.js","sourceRoot":"","sources":["../../../src/tools/openai/get_actor_run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACH,qBAAqB,EACrB,+BAA+B,EAC/B,iBAAiB,EACjB,eAAe,EACf,mBAAmB,GACtB,MAAM,iCAAiC,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAc,MAAM,CAAC,MAAM,CAAC;IACtD,GAAG,mBAAmB;IACtB,IAAI,EAAE,KAAK,EAAE,QAA0B,EAAE,EAAE;QACvC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;QAC7D,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE3C,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC;gBACxC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM;gBACN,YAAY;aACf,CAAC,CAAC;YAEH,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;gBACzB,OAAO,WAAW,CAAC,KAAK,CAAC;YAC7B,CAAC;YAED,OAAO,+BAA+B,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,YAAY,CAAC,KAAK,EAAE,yBAAyB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;CACK,CAAC,CAAC"}
|