@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.
Files changed (211) hide show
  1. package/.github/workflows/cortex-file-handler-test.yml +61 -0
  2. package/README.md +31 -7
  3. package/config/default.example.json +15 -0
  4. package/config.js +133 -12
  5. package/helper-apps/cortex-autogen2/DigiCertGlobalRootCA.crt.pem +22 -0
  6. package/helper-apps/cortex-autogen2/Dockerfile +31 -0
  7. package/helper-apps/cortex-autogen2/Dockerfile.worker +41 -0
  8. package/helper-apps/cortex-autogen2/README.md +183 -0
  9. package/helper-apps/cortex-autogen2/__init__.py +1 -0
  10. package/helper-apps/cortex-autogen2/agents.py +131 -0
  11. package/helper-apps/cortex-autogen2/docker-compose.yml +20 -0
  12. package/helper-apps/cortex-autogen2/function_app.py +55 -0
  13. package/helper-apps/cortex-autogen2/host.json +15 -0
  14. package/helper-apps/cortex-autogen2/main.py +126 -0
  15. package/helper-apps/cortex-autogen2/poetry.lock +3652 -0
  16. package/helper-apps/cortex-autogen2/pyproject.toml +36 -0
  17. package/helper-apps/cortex-autogen2/requirements.txt +20 -0
  18. package/helper-apps/cortex-autogen2/send_task.py +105 -0
  19. package/helper-apps/cortex-autogen2/services/__init__.py +1 -0
  20. package/helper-apps/cortex-autogen2/services/azure_queue.py +85 -0
  21. package/helper-apps/cortex-autogen2/services/redis_publisher.py +153 -0
  22. package/helper-apps/cortex-autogen2/task_processor.py +488 -0
  23. package/helper-apps/cortex-autogen2/tools/__init__.py +24 -0
  24. package/helper-apps/cortex-autogen2/tools/azure_blob_tools.py +175 -0
  25. package/helper-apps/cortex-autogen2/tools/azure_foundry_agents.py +601 -0
  26. package/helper-apps/cortex-autogen2/tools/coding_tools.py +72 -0
  27. package/helper-apps/cortex-autogen2/tools/download_tools.py +48 -0
  28. package/helper-apps/cortex-autogen2/tools/file_tools.py +545 -0
  29. package/helper-apps/cortex-autogen2/tools/search_tools.py +646 -0
  30. package/helper-apps/cortex-azure-cleaner/README.md +36 -0
  31. package/helper-apps/cortex-file-converter/README.md +93 -0
  32. package/helper-apps/cortex-file-converter/key_to_pdf.py +104 -0
  33. package/helper-apps/cortex-file-converter/list_blob_extensions.py +89 -0
  34. package/helper-apps/cortex-file-converter/process_azure_keynotes.py +181 -0
  35. package/helper-apps/cortex-file-converter/requirements.txt +1 -0
  36. package/helper-apps/cortex-file-handler/.env.test.azure.ci +7 -0
  37. package/helper-apps/cortex-file-handler/.env.test.azure.sample +1 -1
  38. package/helper-apps/cortex-file-handler/.env.test.gcs.ci +10 -0
  39. package/helper-apps/cortex-file-handler/.env.test.gcs.sample +2 -2
  40. package/helper-apps/cortex-file-handler/INTERFACE.md +41 -0
  41. package/helper-apps/cortex-file-handler/package.json +1 -1
  42. package/helper-apps/cortex-file-handler/scripts/setup-azure-container.js +41 -17
  43. package/helper-apps/cortex-file-handler/scripts/setup-test-containers.js +30 -15
  44. package/helper-apps/cortex-file-handler/scripts/test-azure.sh +32 -6
  45. package/helper-apps/cortex-file-handler/scripts/test-gcs.sh +24 -2
  46. package/helper-apps/cortex-file-handler/scripts/validate-env.js +128 -0
  47. package/helper-apps/cortex-file-handler/src/blobHandler.js +161 -51
  48. package/helper-apps/cortex-file-handler/src/constants.js +3 -0
  49. package/helper-apps/cortex-file-handler/src/fileChunker.js +10 -8
  50. package/helper-apps/cortex-file-handler/src/index.js +116 -9
  51. package/helper-apps/cortex-file-handler/src/redis.js +61 -1
  52. package/helper-apps/cortex-file-handler/src/services/ConversionService.js +11 -8
  53. package/helper-apps/cortex-file-handler/src/services/FileConversionService.js +2 -2
  54. package/helper-apps/cortex-file-handler/src/services/storage/AzureStorageProvider.js +88 -6
  55. package/helper-apps/cortex-file-handler/src/services/storage/GCSStorageProvider.js +58 -0
  56. package/helper-apps/cortex-file-handler/src/services/storage/StorageFactory.js +25 -5
  57. package/helper-apps/cortex-file-handler/src/services/storage/StorageProvider.js +9 -0
  58. package/helper-apps/cortex-file-handler/src/services/storage/StorageService.js +120 -16
  59. package/helper-apps/cortex-file-handler/src/start.js +27 -17
  60. package/helper-apps/cortex-file-handler/tests/FileConversionService.test.js +52 -1
  61. package/helper-apps/cortex-file-handler/tests/blobHandler.test.js +40 -0
  62. package/helper-apps/cortex-file-handler/tests/checkHashShortLived.test.js +553 -0
  63. package/helper-apps/cortex-file-handler/tests/cleanup.test.js +46 -52
  64. package/helper-apps/cortex-file-handler/tests/containerConversionFlow.test.js +451 -0
  65. package/helper-apps/cortex-file-handler/tests/containerNameParsing.test.js +229 -0
  66. package/helper-apps/cortex-file-handler/tests/containerParameterFlow.test.js +392 -0
  67. package/helper-apps/cortex-file-handler/tests/conversionResilience.test.js +7 -2
  68. package/helper-apps/cortex-file-handler/tests/deleteOperations.test.js +348 -0
  69. package/helper-apps/cortex-file-handler/tests/fileChunker.test.js +23 -2
  70. package/helper-apps/cortex-file-handler/tests/fileUpload.test.js +11 -5
  71. package/helper-apps/cortex-file-handler/tests/getOperations.test.js +58 -24
  72. package/helper-apps/cortex-file-handler/tests/postOperations.test.js +11 -4
  73. package/helper-apps/cortex-file-handler/tests/shortLivedUrlConversion.test.js +225 -0
  74. package/helper-apps/cortex-file-handler/tests/start.test.js +8 -12
  75. package/helper-apps/cortex-file-handler/tests/storage/StorageFactory.test.js +80 -0
  76. package/helper-apps/cortex-file-handler/tests/storage/StorageService.test.js +388 -22
  77. package/helper-apps/cortex-file-handler/tests/testUtils.helper.js +74 -0
  78. package/lib/cortexResponse.js +153 -0
  79. package/lib/entityConstants.js +21 -3
  80. package/lib/logger.js +21 -4
  81. package/lib/pathwayTools.js +28 -9
  82. package/lib/util.js +49 -0
  83. package/package.json +1 -1
  84. package/pathways/basePathway.js +1 -0
  85. package/pathways/bing_afagent.js +54 -1
  86. package/pathways/call_tools.js +2 -3
  87. package/pathways/chat_jarvis.js +1 -1
  88. package/pathways/google_cse.js +27 -0
  89. package/pathways/grok_live_search.js +18 -0
  90. package/pathways/system/entity/memory/sys_memory_lookup_required.js +1 -0
  91. package/pathways/system/entity/memory/sys_memory_required.js +1 -0
  92. package/pathways/system/entity/memory/sys_search_memory.js +1 -0
  93. package/pathways/system/entity/sys_entity_agent.js +56 -4
  94. package/pathways/system/entity/sys_generator_quick.js +1 -0
  95. package/pathways/system/entity/tools/sys_tool_bing_search_afagent.js +26 -0
  96. package/pathways/system/entity/tools/sys_tool_google_search.js +141 -0
  97. package/pathways/system/entity/tools/sys_tool_grok_x_search.js +237 -0
  98. package/pathways/system/entity/tools/sys_tool_image.js +1 -1
  99. package/pathways/system/rest_streaming/sys_claude_37_sonnet.js +21 -0
  100. package/pathways/system/rest_streaming/sys_claude_41_opus.js +21 -0
  101. package/pathways/system/rest_streaming/sys_claude_4_sonnet.js +21 -0
  102. package/pathways/system/rest_streaming/sys_google_gemini_25_flash.js +25 -0
  103. package/pathways/system/rest_streaming/{sys_google_gemini_chat.js → sys_google_gemini_25_pro.js} +6 -4
  104. package/pathways/system/rest_streaming/sys_grok_4.js +23 -0
  105. package/pathways/system/rest_streaming/sys_grok_4_fast_non_reasoning.js +23 -0
  106. package/pathways/system/rest_streaming/sys_grok_4_fast_reasoning.js +23 -0
  107. package/pathways/system/rest_streaming/sys_openai_chat.js +3 -0
  108. package/pathways/system/rest_streaming/sys_openai_chat_gpt41.js +22 -0
  109. package/pathways/system/rest_streaming/sys_openai_chat_gpt41_mini.js +21 -0
  110. package/pathways/system/rest_streaming/sys_openai_chat_gpt41_nano.js +21 -0
  111. package/pathways/system/rest_streaming/{sys_claude_35_sonnet.js → sys_openai_chat_gpt4_omni.js} +6 -4
  112. package/pathways/system/rest_streaming/sys_openai_chat_gpt4_omni_mini.js +21 -0
  113. package/pathways/system/rest_streaming/{sys_claude_3_haiku.js → sys_openai_chat_gpt5.js} +7 -5
  114. package/pathways/system/rest_streaming/sys_openai_chat_gpt5_chat.js +21 -0
  115. package/pathways/system/rest_streaming/sys_openai_chat_gpt5_mini.js +21 -0
  116. package/pathways/system/rest_streaming/sys_openai_chat_gpt5_nano.js +21 -0
  117. package/pathways/system/rest_streaming/{sys_openai_chat_o1.js → sys_openai_chat_o3.js} +6 -3
  118. package/pathways/system/rest_streaming/sys_openai_chat_o3_mini.js +3 -0
  119. package/pathways/system/workspaces/run_workspace_prompt.js +99 -0
  120. package/pathways/vision.js +1 -1
  121. package/server/graphql.js +1 -1
  122. package/server/modelExecutor.js +8 -0
  123. package/server/pathwayResolver.js +166 -16
  124. package/server/pathwayResponseParser.js +16 -8
  125. package/server/plugins/azureFoundryAgentsPlugin.js +1 -1
  126. package/server/plugins/claude3VertexPlugin.js +193 -45
  127. package/server/plugins/gemini15ChatPlugin.js +21 -0
  128. package/server/plugins/gemini15VisionPlugin.js +360 -0
  129. package/server/plugins/googleCsePlugin.js +94 -0
  130. package/server/plugins/grokVisionPlugin.js +365 -0
  131. package/server/plugins/modelPlugin.js +3 -1
  132. package/server/plugins/openAiChatPlugin.js +106 -13
  133. package/server/plugins/openAiVisionPlugin.js +42 -30
  134. package/server/resolver.js +28 -4
  135. package/server/rest.js +270 -53
  136. package/server/typeDef.js +1 -0
  137. package/tests/{mocks.js → helpers/mocks.js} +5 -2
  138. package/tests/{server.js → helpers/server.js} +2 -2
  139. package/tests/helpers/sseAssert.js +23 -0
  140. package/tests/helpers/sseClient.js +73 -0
  141. package/tests/helpers/subscriptionAssert.js +11 -0
  142. package/tests/helpers/subscriptions.js +113 -0
  143. package/tests/{sublong.srt → integration/features/translate/sublong.srt} +4543 -4543
  144. package/tests/integration/features/translate/translate_chunking_stream.test.js +100 -0
  145. package/tests/{translate_srt.test.js → integration/features/translate/translate_srt.test.js} +2 -2
  146. package/tests/integration/graphql/async/stream/agentic.test.js +477 -0
  147. package/tests/integration/graphql/async/stream/subscription_streaming.test.js +62 -0
  148. package/tests/integration/graphql/async/stream/sys_entity_start_streaming.test.js +71 -0
  149. package/tests/integration/graphql/async/stream/vendors/claude_streaming.test.js +56 -0
  150. package/tests/integration/graphql/async/stream/vendors/gemini_streaming.test.js +66 -0
  151. package/tests/integration/graphql/async/stream/vendors/grok_streaming.test.js +56 -0
  152. package/tests/integration/graphql/async/stream/vendors/openai_streaming.test.js +72 -0
  153. package/tests/integration/graphql/features/google/sysToolGoogleSearch.test.js +96 -0
  154. package/tests/integration/graphql/features/grok/grok.test.js +688 -0
  155. package/tests/integration/graphql/features/grok/grok_x_search_tool.test.js +354 -0
  156. package/tests/{main.test.js → integration/graphql/features/main.test.js} +1 -1
  157. package/tests/{call_tools.test.js → integration/graphql/features/tools/call_tools.test.js} +2 -2
  158. package/tests/{vision.test.js → integration/graphql/features/vision/vision.test.js} +1 -1
  159. package/tests/integration/graphql/subscriptions/connection.test.js +26 -0
  160. package/tests/{openai_api.test.js → integration/rest/oai/openai_api.test.js} +63 -238
  161. package/tests/integration/rest/oai/tool_calling_api.test.js +343 -0
  162. package/tests/integration/rest/oai/tool_calling_streaming.test.js +85 -0
  163. package/tests/integration/rest/vendors/claude_streaming.test.js +47 -0
  164. package/tests/integration/rest/vendors/claude_tool_calling_streaming.test.js +75 -0
  165. package/tests/integration/rest/vendors/gemini_streaming.test.js +47 -0
  166. package/tests/integration/rest/vendors/gemini_tool_calling_streaming.test.js +75 -0
  167. package/tests/integration/rest/vendors/grok_streaming.test.js +55 -0
  168. package/tests/integration/rest/vendors/grok_tool_calling_streaming.test.js +75 -0
  169. package/tests/{azureAuthTokenHelper.test.js → unit/core/azureAuthTokenHelper.test.js} +1 -1
  170. package/tests/{chunkfunction.test.js → unit/core/chunkfunction.test.js} +2 -2
  171. package/tests/{config.test.js → unit/core/config.test.js} +3 -3
  172. package/tests/{encodeCache.test.js → unit/core/encodeCache.test.js} +1 -1
  173. package/tests/{fastLruCache.test.js → unit/core/fastLruCache.test.js} +1 -1
  174. package/tests/{handleBars.test.js → unit/core/handleBars.test.js} +1 -1
  175. package/tests/{memoryfunction.test.js → unit/core/memoryfunction.test.js} +2 -2
  176. package/tests/unit/core/mergeResolver.test.js +952 -0
  177. package/tests/{parser.test.js → unit/core/parser.test.js} +3 -3
  178. package/tests/unit/core/pathwayResolver.test.js +187 -0
  179. package/tests/{requestMonitor.test.js → unit/core/requestMonitor.test.js} +1 -1
  180. package/tests/{requestMonitorDurationEstimator.test.js → unit/core/requestMonitorDurationEstimator.test.js} +1 -1
  181. package/tests/{truncateMessages.test.js → unit/core/truncateMessages.test.js} +3 -3
  182. package/tests/{util.test.js → unit/core/util.test.js} +1 -1
  183. package/tests/{apptekTranslatePlugin.test.js → unit/plugins/apptekTranslatePlugin.test.js} +3 -3
  184. package/tests/{azureFoundryAgents.test.js → unit/plugins/azureFoundryAgents.test.js} +136 -1
  185. package/tests/{claude3VertexPlugin.test.js → unit/plugins/claude3VertexPlugin.test.js} +32 -10
  186. package/tests/{claude3VertexToolConversion.test.js → unit/plugins/claude3VertexToolConversion.test.js} +3 -3
  187. package/tests/unit/plugins/googleCsePlugin.test.js +111 -0
  188. package/tests/unit/plugins/grokVisionPlugin.test.js +1392 -0
  189. package/tests/{modelPlugin.test.js → unit/plugins/modelPlugin.test.js} +3 -3
  190. package/tests/{multimodal_conversion.test.js → unit/plugins/multimodal_conversion.test.js} +4 -4
  191. package/tests/{openAiChatPlugin.test.js → unit/plugins/openAiChatPlugin.test.js} +13 -4
  192. package/tests/{openAiToolPlugin.test.js → unit/plugins/openAiToolPlugin.test.js} +35 -27
  193. package/tests/{tokenHandlingTests.test.js → unit/plugins/tokenHandlingTests.test.js} +5 -5
  194. package/tests/{translate_apptek.test.js → unit/plugins/translate_apptek.test.js} +3 -3
  195. package/tests/{streaming.test.js → unit/plugins.streaming/plugin_stream_events.test.js} +19 -58
  196. package/helper-apps/mogrt-handler/tests/test-files/test.gif +0 -1
  197. package/helper-apps/mogrt-handler/tests/test-files/test.mogrt +0 -1
  198. package/helper-apps/mogrt-handler/tests/test-files/test.mp4 +0 -1
  199. package/pathways/system/rest_streaming/sys_openai_chat_gpt4.js +0 -19
  200. package/pathways/system/rest_streaming/sys_openai_chat_gpt4_32.js +0 -19
  201. package/pathways/system/rest_streaming/sys_openai_chat_gpt4_turbo.js +0 -19
  202. package/pathways/system/workspaces/run_claude35_sonnet.js +0 -21
  203. package/pathways/system/workspaces/run_claude3_haiku.js +0 -20
  204. package/pathways/system/workspaces/run_gpt35turbo.js +0 -20
  205. package/pathways/system/workspaces/run_gpt4.js +0 -20
  206. package/pathways/system/workspaces/run_gpt4_32.js +0 -20
  207. package/tests/agentic.test.js +0 -256
  208. package/tests/pathwayResolver.test.js +0 -78
  209. package/tests/subscription.test.js +0 -387
  210. /package/tests/{subchunk.srt → integration/features/translate/subchunk.srt} +0 -0
  211. /package/tests/{subhorizontal.srt → integration/features/translate/subhorizontal.srt} +0 -0
@@ -1,387 +0,0 @@
1
- // subscription.test.js
2
- // Tests for GraphQL subscriptions and request progress messages
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 create a subscription
76
- async function createSubscription(query, variables) {
77
- return wsClient.subscribe(
78
- {
79
- query,
80
- variables
81
- },
82
- {
83
- next: () => {},
84
- error: (error) => console.error('Subscription error:', error),
85
- complete: () => {}
86
- }
87
- );
88
- }
89
-
90
- // Helper function to collect subscription events with support for different event types
91
- async function collectSubscriptionEvents(subscription, timeout = 30000, options = {}) {
92
- const events = [];
93
- const { requireCompletion = true, minEvents = 1 } = options;
94
-
95
- return new Promise((resolve, reject) => {
96
- let timeoutId;
97
-
98
- const checkAndResolve = () => {
99
- if (!requireCompletion && events.length >= minEvents) {
100
- clearTimeout(timeoutId);
101
- unsubscribe();
102
- resolve(events);
103
- }
104
- };
105
-
106
- timeoutId = setTimeout(() => {
107
- // If we have any events at all when the timeout hits, consider it a success
108
- if (events.length > 0) {
109
- resolve(events);
110
- } else {
111
- // Only reject if we have no events at all
112
- reject(new Error('Subscription timed out with no events'));
113
- }
114
- }, timeout);
115
-
116
- const unsubscribe = wsClient.subscribe(
117
- {
118
- query: subscription.query,
119
- variables: subscription.variables
120
- },
121
- {
122
- next: (event) => {
123
- events.push(event);
124
-
125
- // Check for completion or minimum events
126
- if (requireCompletion && event?.data?.requestProgress?.progress === 1) {
127
- clearTimeout(timeoutId);
128
- unsubscribe();
129
- resolve(events);
130
- } else {
131
- checkAndResolve();
132
- }
133
- },
134
- error: (error) => {
135
- clearTimeout(timeoutId);
136
- reject(error);
137
- },
138
- complete: () => {
139
- clearTimeout(timeoutId);
140
- resolve(events);
141
- }
142
- }
143
- );
144
- });
145
- }
146
-
147
- // Add validation helpers
148
- function validateProgressMessage(t, progress, requestId = null) {
149
- // Basic field existence checks
150
- t.truthy(progress, 'progress field should exist');
151
- t.truthy(progress.requestId, 'requestId field should exist');
152
- t.truthy(progress.progress !== undefined, 'progress value should exist');
153
-
154
- if (requestId) {
155
- t.is(progress.requestId, requestId, 'Request ID should match throughout');
156
- }
157
-
158
- // Validate data field if present
159
- if (progress.data) {
160
- t.true(typeof progress.data === 'string', 'Data field should be a string');
161
- t.notThrows(() => JSON.parse(progress.data), 'Data should be valid JSON');
162
- }
163
-
164
- // Validate info field if present and not an error
165
- if (progress.info) {
166
- t.true(typeof progress.info === 'string', 'Info field should be a string');
167
- t.notThrows(() => {
168
- const parsedInfo = JSON.parse(progress.info);
169
- t.true(typeof parsedInfo === 'object', 'Info should be valid JSON object');
170
- }, 'Info should be valid JSON');
171
- }
172
-
173
- // Validate error field if present
174
- if (progress.error) {
175
- t.true(typeof progress.error === 'string', 'Error field should be a string');
176
- t.notThrows(() => JSON.parse(progress.error), 'Error should be valid JSON');
177
- }
178
- }
179
-
180
- test.serial('Request progress messages have string data and info fields', async (t) => {
181
- // Execute an async pathway that will generate progress messages
182
- const response = await testServer.executeOperation({
183
- query: `
184
- query TestQuery($text: String!) {
185
- chat(text: $text, async: true, stream: true) {
186
- result
187
- }
188
- }
189
- `,
190
- variables: {
191
- text: 'Generate a long response to test streaming'
192
- }
193
- });
194
-
195
- console.log('Response:', JSON.stringify(response, null, 2));
196
-
197
- // Get requestId from response
198
- const requestId = response.body?.singleResult?.data?.chat?.result;
199
- t.truthy(requestId, 'Should have a requestId in the result field');
200
-
201
- // Collect all events from the subscription
202
- const events = await collectSubscriptionEvents({
203
- query: `
204
- subscription OnRequestProgress($requestId: String!) {
205
- requestProgress(requestIds: [$requestId]) {
206
- requestId
207
- progress
208
- data
209
- info
210
- }
211
- }
212
- `,
213
- variables: { requestId }
214
- }, 10000, { requireCompletion: false, minEvents: 1 });
215
-
216
- console.log('Events received:', JSON.stringify(events, null, 2));
217
- t.true(events.length > 0, 'Should have received events');
218
-
219
- // Verify each event has string data and info fields
220
- for (const event of events) {
221
- console.log('Processing event:', JSON.stringify(event, null, 2));
222
- const progress = event.data.requestProgress;
223
-
224
- validateProgressMessage(t, progress, requestId);
225
- }
226
- });
227
-
228
- test.serial('sys_entity_start streaming works correctly', async (t) => {
229
- // Execute sys_entity_start with streaming
230
- const response = await testServer.executeOperation({
231
- query: `
232
- query TestQuery($text: String!, $chatHistory: [MultiMessage]!, $stream: Boolean!) {
233
- sys_entity_start(text: $text, chatHistory: $chatHistory, stream: $stream) {
234
- result
235
- contextId
236
- tool
237
- warnings
238
- errors
239
- }
240
- }
241
- `,
242
- variables: {
243
- text: 'Tell me about the history of Al Jazeera',
244
- chatHistory: [{ role: "user", content: ["Tell me about the history of Al Jazeera"] }],
245
- stream: true
246
- }
247
- });
248
-
249
- console.log('Initial Response:', JSON.stringify(response, null, 2));
250
- const requestId = response.body?.singleResult?.data?.sys_entity_start?.result;
251
- t.truthy(requestId, 'Should have a requestId in the result field');
252
-
253
- // Collect events with a longer timeout since this is a real streaming operation
254
- const events = await collectSubscriptionEvents({
255
- query: `
256
- subscription OnRequestProgress($requestId: String!) {
257
- requestProgress(requestIds: [$requestId]) {
258
- requestId
259
- progress
260
- data
261
- info
262
- }
263
- }
264
- `,
265
- variables: { requestId },
266
- timeout: 30000, // Longer timeout for streaming response
267
- requireCompletion: false,
268
- minEvents: 1
269
- });
270
-
271
- console.log('Events received:', JSON.stringify(events, null, 2));
272
- t.true(events.length > 0, 'Should have received events');
273
-
274
- // Verify streaming data format matches expected structure
275
- for (const event of events) {
276
- console.log('Processing event:', JSON.stringify(event, null, 2));
277
- const progress = event.data.requestProgress;
278
- validateProgressMessage(t, progress, requestId);
279
-
280
- // Additional streaming-specific checks
281
- if (progress.data) {
282
- const parsed = JSON.parse(progress.data);
283
- t.true(
284
- typeof parsed === 'string' ||
285
- typeof parsed === 'object',
286
- 'Data should be either a string or an object'
287
- );
288
- }
289
- }
290
- });
291
-
292
- test.serial('Translate pathway handles chunked async processing correctly', async (t) => {
293
- // Create a long text that will be split into chunks
294
- const longText = `In the heart of the bustling metropolis, where skyscrapers pierce the clouds and streets pulse with endless energy,
295
- a story unfolds. It's a tale of innovation and perseverance, of dreams taking flight in the digital age.
296
- Entrepreneurs and visionaries gather in gleaming office towers, their minds focused on the next breakthrough that will reshape our world.
297
- In labs and workshops, engineers and designers collaborate, their fingers dancing across keyboards as they write the future in lines of code.
298
- The city never sleeps, its rhythm maintained by the constant flow of ideas and ambition. Coffee shops become impromptu meeting rooms,
299
- where startups are born on napkins and partnerships forged over steaming lattes. The energy is palpable, electric, contagious.
300
- In the background, servers hum in vast data centers, processing countless transactions and storing the collective knowledge of humanity.
301
- The digital revolution continues unabated, transforming how we live, work, and connect with one another.
302
- Young graduates fresh from university mingle with seasoned veterans, each bringing their unique perspective to the challenges at hand.
303
- The boundaries between traditional industries blur as technology weaves its way into every aspect of business and society.
304
- This is the story of progress, of human ingenuity pushing the boundaries of what's possible.
305
- It's a narrative that continues to evolve, page by digital page, in the great book of human achievement.`.repeat(10);
306
-
307
- // Execute translate with async mode
308
- const response = await testServer.executeOperation({
309
- query: `
310
- query TestQuery($text: String!, $to: String!) {
311
- translate_gpt4_omni(text: $text, to: $to, async: true) {
312
- result
313
- }
314
- }
315
- `,
316
- variables: {
317
- text: longText,
318
- to: 'Spanish'
319
- }
320
- });
321
-
322
- console.log('Initial Response:', JSON.stringify(response, null, 2));
323
- const requestId = response.body?.singleResult?.data?.translate_gpt4_omni?.result;
324
- t.truthy(requestId, 'Should have a requestId in the result field');
325
-
326
- // Collect events with a longer timeout since this is a chunked operation
327
- const events = await collectSubscriptionEvents({
328
- query: `
329
- subscription OnRequestProgress($requestId: String!) {
330
- requestProgress(requestIds: [$requestId]) {
331
- requestId
332
- progress
333
- data
334
- info
335
- }
336
- }
337
- `,
338
- variables: { requestId },
339
- timeout: 180000, // 3 minutes for large chunked processing
340
- requireCompletion: true
341
- });
342
-
343
- console.log('Events received:', JSON.stringify(events, null, 2));
344
- t.true(events.length > 0, 'Should have received events');
345
-
346
- // Track progress values to ensure they increase
347
- let lastProgress = -1;
348
- let finalTranslation = null;
349
- let progressValues = new Set();
350
- let processingMessages = 0;
351
-
352
- // Verify progress messages and final data
353
- for (const event of events) {
354
- console.log('Processing event:', JSON.stringify(event, null, 2));
355
- const progress = event.data.requestProgress;
356
-
357
- validateProgressMessage(t, progress, requestId);
358
-
359
- // Verify progress increases
360
- if (progress.progress !== null) {
361
- t.true(progress.progress >= lastProgress, 'Progress should increase monotonically');
362
- t.true(progress.progress >= 0 && progress.progress <= 1, 'Progress should be between 0 and 1');
363
- progressValues.add(progress.progress);
364
- lastProgress = progress.progress;
365
- }
366
-
367
- // Only expect translated data when progress is 1
368
- if (progress.progress === 1) {
369
- t.truthy(progress.data, 'Should have data in final progress message');
370
- const parsed = JSON.parse(progress.data);
371
- t.true(typeof parsed === 'string', 'Final data should be a string containing translation');
372
- t.true(parsed.length > 0, 'Translation should not be empty');
373
- finalTranslation = parsed;
374
- } else {
375
- // Count any non-final progress message
376
- processingMessages++;
377
- }
378
- }
379
-
380
- // Verify we got multiple distinct progress updates
381
- t.true(progressValues.size >= 2, 'Should have at least 2 different progress values');
382
- t.true(processingMessages >= 1, 'Should have at least one processing status message');
383
-
384
- // Verify we got to completion with final translation
385
- t.is(lastProgress, 1, 'Should have reached completion (progress = 1)');
386
- t.truthy(finalTranslation, 'Should have received final translation');
387
- });