@aj-archipelago/cortex 1.3.62 → 1.3.63
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/.github/workflows/cortex-file-handler-test.yml +61 -0
- package/README.md +31 -7
- package/config/default.example.json +15 -0
- package/config.js +133 -12
- package/helper-apps/cortex-autogen2/DigiCertGlobalRootCA.crt.pem +22 -0
- package/helper-apps/cortex-autogen2/Dockerfile +31 -0
- package/helper-apps/cortex-autogen2/Dockerfile.worker +41 -0
- package/helper-apps/cortex-autogen2/README.md +183 -0
- package/helper-apps/cortex-autogen2/__init__.py +1 -0
- package/helper-apps/cortex-autogen2/agents.py +131 -0
- package/helper-apps/cortex-autogen2/docker-compose.yml +20 -0
- package/helper-apps/cortex-autogen2/function_app.py +55 -0
- package/helper-apps/cortex-autogen2/host.json +15 -0
- package/helper-apps/cortex-autogen2/main.py +126 -0
- package/helper-apps/cortex-autogen2/poetry.lock +3652 -0
- package/helper-apps/cortex-autogen2/pyproject.toml +36 -0
- package/helper-apps/cortex-autogen2/requirements.txt +20 -0
- package/helper-apps/cortex-autogen2/send_task.py +105 -0
- package/helper-apps/cortex-autogen2/services/__init__.py +1 -0
- package/helper-apps/cortex-autogen2/services/azure_queue.py +85 -0
- package/helper-apps/cortex-autogen2/services/redis_publisher.py +153 -0
- package/helper-apps/cortex-autogen2/task_processor.py +488 -0
- package/helper-apps/cortex-autogen2/tools/__init__.py +24 -0
- package/helper-apps/cortex-autogen2/tools/azure_blob_tools.py +175 -0
- package/helper-apps/cortex-autogen2/tools/azure_foundry_agents.py +601 -0
- package/helper-apps/cortex-autogen2/tools/coding_tools.py +72 -0
- package/helper-apps/cortex-autogen2/tools/download_tools.py +48 -0
- package/helper-apps/cortex-autogen2/tools/file_tools.py +545 -0
- package/helper-apps/cortex-autogen2/tools/search_tools.py +646 -0
- package/helper-apps/cortex-azure-cleaner/README.md +36 -0
- package/helper-apps/cortex-file-converter/README.md +93 -0
- package/helper-apps/cortex-file-converter/key_to_pdf.py +104 -0
- package/helper-apps/cortex-file-converter/list_blob_extensions.py +89 -0
- package/helper-apps/cortex-file-converter/process_azure_keynotes.py +181 -0
- package/helper-apps/cortex-file-converter/requirements.txt +1 -0
- package/helper-apps/cortex-file-handler/.env.test.azure.ci +7 -0
- package/helper-apps/cortex-file-handler/.env.test.azure.sample +1 -1
- package/helper-apps/cortex-file-handler/.env.test.gcs.ci +10 -0
- package/helper-apps/cortex-file-handler/.env.test.gcs.sample +2 -2
- package/helper-apps/cortex-file-handler/INTERFACE.md +41 -0
- package/helper-apps/cortex-file-handler/package.json +1 -1
- package/helper-apps/cortex-file-handler/scripts/setup-azure-container.js +41 -17
- package/helper-apps/cortex-file-handler/scripts/setup-test-containers.js +30 -15
- package/helper-apps/cortex-file-handler/scripts/test-azure.sh +32 -6
- package/helper-apps/cortex-file-handler/scripts/test-gcs.sh +24 -2
- package/helper-apps/cortex-file-handler/scripts/validate-env.js +128 -0
- package/helper-apps/cortex-file-handler/src/blobHandler.js +161 -51
- package/helper-apps/cortex-file-handler/src/constants.js +3 -0
- package/helper-apps/cortex-file-handler/src/fileChunker.js +10 -8
- package/helper-apps/cortex-file-handler/src/index.js +116 -9
- package/helper-apps/cortex-file-handler/src/redis.js +61 -1
- package/helper-apps/cortex-file-handler/src/services/ConversionService.js +11 -8
- package/helper-apps/cortex-file-handler/src/services/FileConversionService.js +2 -2
- package/helper-apps/cortex-file-handler/src/services/storage/AzureStorageProvider.js +88 -6
- package/helper-apps/cortex-file-handler/src/services/storage/GCSStorageProvider.js +58 -0
- package/helper-apps/cortex-file-handler/src/services/storage/StorageFactory.js +25 -5
- package/helper-apps/cortex-file-handler/src/services/storage/StorageProvider.js +9 -0
- package/helper-apps/cortex-file-handler/src/services/storage/StorageService.js +120 -16
- package/helper-apps/cortex-file-handler/src/start.js +27 -17
- package/helper-apps/cortex-file-handler/tests/FileConversionService.test.js +52 -1
- package/helper-apps/cortex-file-handler/tests/blobHandler.test.js +40 -0
- package/helper-apps/cortex-file-handler/tests/checkHashShortLived.test.js +553 -0
- package/helper-apps/cortex-file-handler/tests/cleanup.test.js +46 -52
- package/helper-apps/cortex-file-handler/tests/containerConversionFlow.test.js +451 -0
- package/helper-apps/cortex-file-handler/tests/containerNameParsing.test.js +229 -0
- package/helper-apps/cortex-file-handler/tests/containerParameterFlow.test.js +392 -0
- package/helper-apps/cortex-file-handler/tests/conversionResilience.test.js +7 -2
- package/helper-apps/cortex-file-handler/tests/deleteOperations.test.js +348 -0
- package/helper-apps/cortex-file-handler/tests/fileChunker.test.js +23 -2
- package/helper-apps/cortex-file-handler/tests/fileUpload.test.js +11 -5
- package/helper-apps/cortex-file-handler/tests/getOperations.test.js +58 -24
- package/helper-apps/cortex-file-handler/tests/postOperations.test.js +11 -4
- package/helper-apps/cortex-file-handler/tests/shortLivedUrlConversion.test.js +225 -0
- package/helper-apps/cortex-file-handler/tests/start.test.js +8 -12
- package/helper-apps/cortex-file-handler/tests/storage/StorageFactory.test.js +80 -0
- package/helper-apps/cortex-file-handler/tests/storage/StorageService.test.js +388 -22
- package/helper-apps/cortex-file-handler/tests/testUtils.helper.js +74 -0
- package/lib/cortexResponse.js +153 -0
- package/lib/entityConstants.js +21 -3
- package/lib/logger.js +21 -4
- package/lib/pathwayTools.js +28 -9
- package/lib/util.js +49 -0
- package/package.json +1 -1
- package/pathways/basePathway.js +1 -0
- package/pathways/bing_afagent.js +54 -1
- package/pathways/call_tools.js +2 -3
- package/pathways/chat_jarvis.js +1 -1
- package/pathways/google_cse.js +27 -0
- package/pathways/grok_live_search.js +18 -0
- package/pathways/system/entity/memory/sys_memory_lookup_required.js +1 -0
- package/pathways/system/entity/memory/sys_memory_required.js +1 -0
- package/pathways/system/entity/memory/sys_search_memory.js +1 -0
- package/pathways/system/entity/sys_entity_agent.js +56 -4
- package/pathways/system/entity/sys_generator_quick.js +1 -0
- package/pathways/system/entity/tools/sys_tool_bing_search_afagent.js +26 -0
- package/pathways/system/entity/tools/sys_tool_google_search.js +141 -0
- package/pathways/system/entity/tools/sys_tool_grok_x_search.js +237 -0
- package/pathways/system/entity/tools/sys_tool_image.js +1 -1
- package/pathways/system/rest_streaming/sys_claude_37_sonnet.js +21 -0
- package/pathways/system/rest_streaming/sys_claude_41_opus.js +21 -0
- package/pathways/system/rest_streaming/sys_claude_4_sonnet.js +21 -0
- package/pathways/system/rest_streaming/sys_google_gemini_25_flash.js +25 -0
- package/pathways/system/rest_streaming/{sys_google_gemini_chat.js → sys_google_gemini_25_pro.js} +6 -4
- package/pathways/system/rest_streaming/sys_grok_4.js +23 -0
- package/pathways/system/rest_streaming/sys_grok_4_fast_non_reasoning.js +23 -0
- package/pathways/system/rest_streaming/sys_grok_4_fast_reasoning.js +23 -0
- package/pathways/system/rest_streaming/sys_openai_chat.js +3 -0
- package/pathways/system/rest_streaming/sys_openai_chat_gpt41.js +22 -0
- package/pathways/system/rest_streaming/sys_openai_chat_gpt41_mini.js +21 -0
- package/pathways/system/rest_streaming/sys_openai_chat_gpt41_nano.js +21 -0
- package/pathways/system/rest_streaming/{sys_claude_35_sonnet.js → sys_openai_chat_gpt4_omni.js} +6 -4
- package/pathways/system/rest_streaming/sys_openai_chat_gpt4_omni_mini.js +21 -0
- package/pathways/system/rest_streaming/{sys_claude_3_haiku.js → sys_openai_chat_gpt5.js} +7 -5
- package/pathways/system/rest_streaming/sys_openai_chat_gpt5_chat.js +21 -0
- package/pathways/system/rest_streaming/sys_openai_chat_gpt5_mini.js +21 -0
- package/pathways/system/rest_streaming/sys_openai_chat_gpt5_nano.js +21 -0
- package/pathways/system/rest_streaming/{sys_openai_chat_o1.js → sys_openai_chat_o3.js} +6 -3
- package/pathways/system/rest_streaming/sys_openai_chat_o3_mini.js +3 -0
- package/pathways/system/workspaces/run_workspace_prompt.js +99 -0
- package/pathways/vision.js +1 -1
- package/server/graphql.js +1 -1
- package/server/modelExecutor.js +8 -0
- package/server/pathwayResolver.js +166 -16
- package/server/pathwayResponseParser.js +16 -8
- package/server/plugins/azureFoundryAgentsPlugin.js +1 -1
- package/server/plugins/claude3VertexPlugin.js +193 -45
- package/server/plugins/gemini15ChatPlugin.js +21 -0
- package/server/plugins/gemini15VisionPlugin.js +360 -0
- package/server/plugins/googleCsePlugin.js +94 -0
- package/server/plugins/grokVisionPlugin.js +365 -0
- package/server/plugins/modelPlugin.js +3 -1
- package/server/plugins/openAiChatPlugin.js +106 -13
- package/server/plugins/openAiVisionPlugin.js +42 -30
- package/server/resolver.js +28 -4
- package/server/rest.js +270 -53
- package/server/typeDef.js +1 -0
- package/tests/{mocks.js → helpers/mocks.js} +5 -2
- package/tests/{server.js → helpers/server.js} +2 -2
- package/tests/helpers/sseAssert.js +23 -0
- package/tests/helpers/sseClient.js +73 -0
- package/tests/helpers/subscriptionAssert.js +11 -0
- package/tests/helpers/subscriptions.js +113 -0
- package/tests/{sublong.srt → integration/features/translate/sublong.srt} +4543 -4543
- package/tests/integration/features/translate/translate_chunking_stream.test.js +100 -0
- package/tests/{translate_srt.test.js → integration/features/translate/translate_srt.test.js} +2 -2
- package/tests/integration/graphql/async/stream/agentic.test.js +477 -0
- package/tests/integration/graphql/async/stream/subscription_streaming.test.js +62 -0
- package/tests/integration/graphql/async/stream/sys_entity_start_streaming.test.js +71 -0
- package/tests/integration/graphql/async/stream/vendors/claude_streaming.test.js +56 -0
- package/tests/integration/graphql/async/stream/vendors/gemini_streaming.test.js +66 -0
- package/tests/integration/graphql/async/stream/vendors/grok_streaming.test.js +56 -0
- package/tests/integration/graphql/async/stream/vendors/openai_streaming.test.js +72 -0
- package/tests/integration/graphql/features/google/sysToolGoogleSearch.test.js +96 -0
- package/tests/integration/graphql/features/grok/grok.test.js +688 -0
- package/tests/integration/graphql/features/grok/grok_x_search_tool.test.js +354 -0
- package/tests/{main.test.js → integration/graphql/features/main.test.js} +1 -1
- package/tests/{call_tools.test.js → integration/graphql/features/tools/call_tools.test.js} +2 -2
- package/tests/{vision.test.js → integration/graphql/features/vision/vision.test.js} +1 -1
- package/tests/integration/graphql/subscriptions/connection.test.js +26 -0
- package/tests/{openai_api.test.js → integration/rest/oai/openai_api.test.js} +63 -238
- package/tests/integration/rest/oai/tool_calling_api.test.js +343 -0
- package/tests/integration/rest/oai/tool_calling_streaming.test.js +85 -0
- package/tests/integration/rest/vendors/claude_streaming.test.js +47 -0
- package/tests/integration/rest/vendors/claude_tool_calling_streaming.test.js +75 -0
- package/tests/integration/rest/vendors/gemini_streaming.test.js +47 -0
- package/tests/integration/rest/vendors/gemini_tool_calling_streaming.test.js +75 -0
- package/tests/integration/rest/vendors/grok_streaming.test.js +55 -0
- package/tests/integration/rest/vendors/grok_tool_calling_streaming.test.js +75 -0
- package/tests/{azureAuthTokenHelper.test.js → unit/core/azureAuthTokenHelper.test.js} +1 -1
- package/tests/{chunkfunction.test.js → unit/core/chunkfunction.test.js} +2 -2
- package/tests/{config.test.js → unit/core/config.test.js} +3 -3
- package/tests/{encodeCache.test.js → unit/core/encodeCache.test.js} +1 -1
- package/tests/{fastLruCache.test.js → unit/core/fastLruCache.test.js} +1 -1
- package/tests/{handleBars.test.js → unit/core/handleBars.test.js} +1 -1
- package/tests/{memoryfunction.test.js → unit/core/memoryfunction.test.js} +2 -2
- package/tests/unit/core/mergeResolver.test.js +952 -0
- package/tests/{parser.test.js → unit/core/parser.test.js} +3 -3
- package/tests/unit/core/pathwayResolver.test.js +187 -0
- package/tests/{requestMonitor.test.js → unit/core/requestMonitor.test.js} +1 -1
- package/tests/{requestMonitorDurationEstimator.test.js → unit/core/requestMonitorDurationEstimator.test.js} +1 -1
- package/tests/{truncateMessages.test.js → unit/core/truncateMessages.test.js} +3 -3
- package/tests/{util.test.js → unit/core/util.test.js} +1 -1
- package/tests/{apptekTranslatePlugin.test.js → unit/plugins/apptekTranslatePlugin.test.js} +3 -3
- package/tests/{azureFoundryAgents.test.js → unit/plugins/azureFoundryAgents.test.js} +136 -1
- package/tests/{claude3VertexPlugin.test.js → unit/plugins/claude3VertexPlugin.test.js} +32 -10
- package/tests/{claude3VertexToolConversion.test.js → unit/plugins/claude3VertexToolConversion.test.js} +3 -3
- package/tests/unit/plugins/googleCsePlugin.test.js +111 -0
- package/tests/unit/plugins/grokVisionPlugin.test.js +1392 -0
- package/tests/{modelPlugin.test.js → unit/plugins/modelPlugin.test.js} +3 -3
- package/tests/{multimodal_conversion.test.js → unit/plugins/multimodal_conversion.test.js} +4 -4
- package/tests/{openAiChatPlugin.test.js → unit/plugins/openAiChatPlugin.test.js} +13 -4
- package/tests/{openAiToolPlugin.test.js → unit/plugins/openAiToolPlugin.test.js} +35 -27
- package/tests/{tokenHandlingTests.test.js → unit/plugins/tokenHandlingTests.test.js} +5 -5
- package/tests/{translate_apptek.test.js → unit/plugins/translate_apptek.test.js} +3 -3
- package/tests/{streaming.test.js → unit/plugins.streaming/plugin_stream_events.test.js} +19 -58
- package/helper-apps/mogrt-handler/tests/test-files/test.gif +0 -1
- package/helper-apps/mogrt-handler/tests/test-files/test.mogrt +0 -1
- package/helper-apps/mogrt-handler/tests/test-files/test.mp4 +0 -1
- package/pathways/system/rest_streaming/sys_openai_chat_gpt4.js +0 -19
- package/pathways/system/rest_streaming/sys_openai_chat_gpt4_32.js +0 -19
- package/pathways/system/rest_streaming/sys_openai_chat_gpt4_turbo.js +0 -19
- package/pathways/system/workspaces/run_claude35_sonnet.js +0 -21
- package/pathways/system/workspaces/run_claude3_haiku.js +0 -20
- package/pathways/system/workspaces/run_gpt35turbo.js +0 -20
- package/pathways/system/workspaces/run_gpt4.js +0 -20
- package/pathways/system/workspaces/run_gpt4_32.js +0 -20
- package/tests/agentic.test.js +0 -256
- package/tests/pathwayResolver.test.js +0 -78
- package/tests/subscription.test.js +0 -387
- /package/tests/{subchunk.srt → integration/features/translate/subchunk.srt} +0 -0
- /package/tests/{subhorizontal.srt → integration/features/translate/subhorizontal.srt} +0 -0
package/tests/agentic.test.js
DELETED
|
@@ -1,256 +0,0 @@
|
|
|
1
|
-
// agentic.test.js
|
|
2
|
-
// Tests for the agentic entity system
|
|
3
|
-
|
|
4
|
-
import test from 'ava';
|
|
5
|
-
import serverFactory from '../index.js';
|
|
6
|
-
import { createClient } from 'graphql-ws';
|
|
7
|
-
import ws from 'ws';
|
|
8
|
-
|
|
9
|
-
let testServer;
|
|
10
|
-
let wsClient;
|
|
11
|
-
|
|
12
|
-
test.before(async () => {
|
|
13
|
-
process.env.CORTEX_ENABLE_REST = 'true';
|
|
14
|
-
const { server, startServer } = await serverFactory();
|
|
15
|
-
startServer && await startServer();
|
|
16
|
-
testServer = server;
|
|
17
|
-
|
|
18
|
-
// Create WebSocket client for subscriptions
|
|
19
|
-
wsClient = createClient({
|
|
20
|
-
url: 'ws://localhost:4000/graphql',
|
|
21
|
-
webSocketImpl: ws,
|
|
22
|
-
retryAttempts: 3,
|
|
23
|
-
connectionParams: {},
|
|
24
|
-
on: {
|
|
25
|
-
error: (error) => {
|
|
26
|
-
console.error('WS connection error:', error);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
// Test the connection by making a simple subscription
|
|
32
|
-
try {
|
|
33
|
-
await new Promise((resolve, reject) => {
|
|
34
|
-
const subscription = wsClient.subscribe(
|
|
35
|
-
{
|
|
36
|
-
query: `
|
|
37
|
-
subscription TestConnection {
|
|
38
|
-
requestProgress(requestIds: ["test"]) {
|
|
39
|
-
requestId
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
`
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
next: () => {
|
|
46
|
-
resolve();
|
|
47
|
-
},
|
|
48
|
-
error: reject,
|
|
49
|
-
complete: () => {
|
|
50
|
-
resolve();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
// Add a timeout to avoid hanging
|
|
56
|
-
setTimeout(() => {
|
|
57
|
-
resolve();
|
|
58
|
-
}, 2000);
|
|
59
|
-
});
|
|
60
|
-
} catch (error) {
|
|
61
|
-
console.error('Failed to establish WebSocket connection:', error);
|
|
62
|
-
throw error;
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test.after.always('cleanup', async () => {
|
|
67
|
-
if (wsClient) {
|
|
68
|
-
wsClient.dispose();
|
|
69
|
-
}
|
|
70
|
-
if (testServer) {
|
|
71
|
-
await testServer.stop();
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
// Helper function to collect subscription events
|
|
76
|
-
async function collectSubscriptionEvents(subscription, timeout = 30000) {
|
|
77
|
-
const events = [];
|
|
78
|
-
|
|
79
|
-
return new Promise((resolve, reject) => {
|
|
80
|
-
const timeoutId = setTimeout(() => {
|
|
81
|
-
if (events.length > 0) {
|
|
82
|
-
resolve(events);
|
|
83
|
-
} else {
|
|
84
|
-
reject(new Error('Subscription timed out with no events'));
|
|
85
|
-
}
|
|
86
|
-
}, timeout);
|
|
87
|
-
|
|
88
|
-
const unsubscribe = wsClient.subscribe(
|
|
89
|
-
{
|
|
90
|
-
query: subscription.query,
|
|
91
|
-
variables: subscription.variables
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
next: (event) => {
|
|
95
|
-
events.push(event);
|
|
96
|
-
if (event?.data?.requestProgress?.progress === 1) {
|
|
97
|
-
clearTimeout(timeoutId);
|
|
98
|
-
unsubscribe();
|
|
99
|
-
resolve(events);
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
error: (error) => {
|
|
103
|
-
clearTimeout(timeoutId);
|
|
104
|
-
reject(error);
|
|
105
|
-
},
|
|
106
|
-
complete: () => {
|
|
107
|
-
clearTimeout(timeoutId);
|
|
108
|
-
resolve(events);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
);
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Test basic single-step task
|
|
116
|
-
test.serial('sys_entity_agent handles single-step task', async (t) => {
|
|
117
|
-
t.timeout(30000); // 30 second timeout
|
|
118
|
-
const response = await testServer.executeOperation({
|
|
119
|
-
query: `
|
|
120
|
-
query TestAgentSingleStep(
|
|
121
|
-
$text: String!,
|
|
122
|
-
$chatHistory: [MultiMessage]!
|
|
123
|
-
) {
|
|
124
|
-
sys_entity_agent(
|
|
125
|
-
text: $text,
|
|
126
|
-
chatHistory: $chatHistory,
|
|
127
|
-
stream: true
|
|
128
|
-
) {
|
|
129
|
-
result
|
|
130
|
-
contextId
|
|
131
|
-
tool
|
|
132
|
-
warnings
|
|
133
|
-
errors
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
`,
|
|
137
|
-
variables: {
|
|
138
|
-
text: 'What is the current time?',
|
|
139
|
-
chatHistory: [{
|
|
140
|
-
role: "user",
|
|
141
|
-
content: ["What is the current time?"]
|
|
142
|
-
}]
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
console.log('Single-step Agent Response:', JSON.stringify(response, null, 2));
|
|
147
|
-
|
|
148
|
-
// Check for successful response
|
|
149
|
-
t.falsy(response.body?.singleResult?.errors, 'Should not have GraphQL errors');
|
|
150
|
-
const requestId = response.body?.singleResult?.data?.sys_entity_agent?.result;
|
|
151
|
-
t.truthy(requestId, 'Should have a requestId in the result field');
|
|
152
|
-
|
|
153
|
-
// Collect events
|
|
154
|
-
const events = await collectSubscriptionEvents({
|
|
155
|
-
query: `
|
|
156
|
-
subscription OnRequestProgress($requestId: String!) {
|
|
157
|
-
requestProgress(requestIds: [$requestId]) {
|
|
158
|
-
requestId
|
|
159
|
-
progress
|
|
160
|
-
data
|
|
161
|
-
info
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
`,
|
|
165
|
-
variables: { requestId }
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
console.log(`Received ${events.length} events for single-step task`);
|
|
169
|
-
t.true(events.length > 0, 'Should have received events');
|
|
170
|
-
|
|
171
|
-
// Verify we got a completion event
|
|
172
|
-
const completionEvent = events.find(event =>
|
|
173
|
-
event.data.requestProgress.progress === 1
|
|
174
|
-
);
|
|
175
|
-
t.truthy(completionEvent, 'Should have received a completion event');
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
// Test multi-step task with tool usage
|
|
179
|
-
test.serial('sys_entity_agent handles multi-step task with tools', async (t) => {
|
|
180
|
-
t.timeout(120000); // 120 second timeout for multi-step task
|
|
181
|
-
const response = await testServer.executeOperation({
|
|
182
|
-
query: `
|
|
183
|
-
query TestAgentMultiStep(
|
|
184
|
-
$text: String!,
|
|
185
|
-
$chatHistory: [MultiMessage]!
|
|
186
|
-
) {
|
|
187
|
-
sys_entity_agent(
|
|
188
|
-
text: $text,
|
|
189
|
-
chatHistory: $chatHistory,
|
|
190
|
-
stream: true
|
|
191
|
-
) {
|
|
192
|
-
result
|
|
193
|
-
contextId
|
|
194
|
-
tool
|
|
195
|
-
warnings
|
|
196
|
-
errors
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
`,
|
|
200
|
-
variables: {
|
|
201
|
-
text: 'Research the latest developments in renewable energy and summarize the key trends.',
|
|
202
|
-
chatHistory: [{
|
|
203
|
-
role: "user",
|
|
204
|
-
content: ["Research the latest developments in renewable energy and summarize the key trends."]
|
|
205
|
-
}]
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
console.log('Multi-step Agent Response:', JSON.stringify(response, null, 2));
|
|
210
|
-
|
|
211
|
-
// Check for successful response
|
|
212
|
-
t.falsy(response.body?.singleResult?.errors, 'Should not have GraphQL errors');
|
|
213
|
-
const requestId = response.body?.singleResult?.data?.sys_entity_agent?.result;
|
|
214
|
-
t.truthy(requestId, 'Should have a requestId in the result field');
|
|
215
|
-
|
|
216
|
-
// Collect events with a longer timeout since this is a multi-step operation
|
|
217
|
-
const events = await collectSubscriptionEvents({
|
|
218
|
-
query: `
|
|
219
|
-
subscription OnRequestProgress($requestId: String!) {
|
|
220
|
-
requestProgress(requestIds: [$requestId]) {
|
|
221
|
-
requestId
|
|
222
|
-
progress
|
|
223
|
-
data
|
|
224
|
-
info
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
`,
|
|
228
|
-
variables: { requestId }
|
|
229
|
-
}, 60000);
|
|
230
|
-
|
|
231
|
-
console.log(`Received ${events.length} events for multi-step task`);
|
|
232
|
-
t.true(events.length > 0, 'Should have received events');
|
|
233
|
-
|
|
234
|
-
// Verify we got a completion event
|
|
235
|
-
const completionEvent = events.find(event =>
|
|
236
|
-
event.data.requestProgress.progress === 1
|
|
237
|
-
);
|
|
238
|
-
t.truthy(completionEvent, 'Should have received a completion event');
|
|
239
|
-
|
|
240
|
-
// Check for tool usage in the events
|
|
241
|
-
let foundToolUsage = false;
|
|
242
|
-
for (const event of events) {
|
|
243
|
-
if (event.data.requestProgress.info) {
|
|
244
|
-
try {
|
|
245
|
-
const info = JSON.parse(event.data.requestProgress.info);
|
|
246
|
-
if (info.toolUsed) {
|
|
247
|
-
foundToolUsage = true;
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
250
|
-
} catch (e) {
|
|
251
|
-
// Some info might not be JSON, which is fine
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
t.true(foundToolUsage, 'Should have used tools during execution');
|
|
256
|
-
});
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import { PathwayResolver } from '../server/pathwayResolver.js';
|
|
3
|
-
import sinon from 'sinon';
|
|
4
|
-
import { mockConfig, mockPathwayString, mockModelEndpoints } from './mocks.js';
|
|
5
|
-
|
|
6
|
-
const mockPathway = mockPathwayString;
|
|
7
|
-
mockPathway.useInputChunking = false;
|
|
8
|
-
mockPathway.prompt = 'What is AI?';
|
|
9
|
-
|
|
10
|
-
const mockArgs = {
|
|
11
|
-
text: 'Artificial intelligence',
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
test.beforeEach((t) => {
|
|
15
|
-
t.context.pathwayResolver = new PathwayResolver({
|
|
16
|
-
config: mockConfig,
|
|
17
|
-
pathway: mockPathway,
|
|
18
|
-
args: mockArgs,
|
|
19
|
-
endpoints: mockModelEndpoints,
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test('constructor initializes properties correctly', (t) => {
|
|
24
|
-
const resolver = t.context.pathwayResolver;
|
|
25
|
-
t.deepEqual(resolver.config, mockConfig);
|
|
26
|
-
t.deepEqual(resolver.pathway, mockPathway);
|
|
27
|
-
t.deepEqual(resolver.args, mockArgs);
|
|
28
|
-
t.is(resolver.useInputChunking, mockPathway.useInputChunking);
|
|
29
|
-
t.is(typeof resolver.requestId, 'string');
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test('resolve returns request id when async is true', async (t) => {
|
|
33
|
-
const resolver = t.context.pathwayResolver;
|
|
34
|
-
const requestId = await resolver.resolve({ ...mockArgs, async: true });
|
|
35
|
-
t.is(typeof requestId, 'string');
|
|
36
|
-
t.is(requestId, resolver.requestId);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test('resolve calls promptAndParse when async is false', async (t) => {
|
|
40
|
-
const resolver = t.context.pathwayResolver;
|
|
41
|
-
const promptAndParseStub = sinon.stub(resolver, 'promptAndParse').returns(Promise.resolve('test-result'));
|
|
42
|
-
|
|
43
|
-
const result = await resolver.resolve(mockArgs);
|
|
44
|
-
t.true(promptAndParseStub.calledOnce);
|
|
45
|
-
t.is(result, 'test-result');
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test('processInputText returns input text if no chunking', (t) => {
|
|
49
|
-
const resolver = t.context.pathwayResolver;
|
|
50
|
-
const text = 'This is a test input text';
|
|
51
|
-
const result = resolver.processInputText(text);
|
|
52
|
-
t.deepEqual(result, [text]);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test('applyPromptsSerially returns result of last prompt', async (t) => {
|
|
56
|
-
const resolver = t.context.pathwayResolver;
|
|
57
|
-
const text = 'This is a test input text';
|
|
58
|
-
const applyPromptStub = sinon.stub(resolver, 'applyPrompt');
|
|
59
|
-
applyPromptStub.onCall(0).returns(Promise.resolve('result1'));
|
|
60
|
-
applyPromptStub.onCall(1).returns(Promise.resolve('result2'));
|
|
61
|
-
|
|
62
|
-
resolver.pathwayPrompt = ['prompt1', 'prompt2'];
|
|
63
|
-
const result = await resolver.applyPromptsSerially(text, mockArgs);
|
|
64
|
-
|
|
65
|
-
t.is(result, 'result2');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test('processRequest returns empty result when input text is empty', async (t) => {
|
|
69
|
-
const resolver = t.context.pathwayResolver;
|
|
70
|
-
const text = '';
|
|
71
|
-
const processRequestStub = sinon.stub(resolver, 'processRequest').returns(Promise.resolve(''));
|
|
72
|
-
|
|
73
|
-
await resolver.resolve({ ...mockArgs, text });
|
|
74
|
-
|
|
75
|
-
t.true(processRequestStub.calledOnce);
|
|
76
|
-
const returnValue = await processRequestStub.firstCall.returnValue;
|
|
77
|
-
t.is(returnValue, text);
|
|
78
|
-
});
|