flowquery 1.0.46 → 1.0.47
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/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/package.json +4 -1
- package/.editorconfig +0 -21
- package/.gitattributes +0 -3
- package/.github/workflows/npm-publish.yml +0 -32
- package/.github/workflows/python-publish.yml +0 -143
- package/.github/workflows/release.yml +0 -107
- package/.husky/pre-commit +0 -28
- package/.prettierrc +0 -22
- package/CODE_OF_CONDUCT.md +0 -10
- package/FlowQueryLogoIcon.png +0 -0
- package/SECURITY.md +0 -14
- package/SUPPORT.md +0 -13
- package/docs/flowquery.min.js +0 -1
- package/docs/index.html +0 -105
- package/flowquery-py/CONTRIBUTING.md +0 -127
- package/flowquery-py/README.md +0 -67
- package/flowquery-py/misc/data/test.json +0 -10
- package/flowquery-py/misc/data/users.json +0 -242
- package/flowquery-py/notebooks/TestFlowQuery.ipynb +0 -440
- package/flowquery-py/pyproject.toml +0 -121
- package/flowquery-py/setup_env.ps1 +0 -92
- package/flowquery-py/setup_env.sh +0 -87
- package/flowquery-py/src/__init__.py +0 -38
- package/flowquery-py/src/__main__.py +0 -10
- package/flowquery-py/src/compute/__init__.py +0 -6
- package/flowquery-py/src/compute/flowquery.py +0 -68
- package/flowquery-py/src/compute/runner.py +0 -64
- package/flowquery-py/src/extensibility.py +0 -52
- package/flowquery-py/src/graph/__init__.py +0 -31
- package/flowquery-py/src/graph/data.py +0 -136
- package/flowquery-py/src/graph/database.py +0 -141
- package/flowquery-py/src/graph/hops.py +0 -43
- package/flowquery-py/src/graph/node.py +0 -143
- package/flowquery-py/src/graph/node_data.py +0 -26
- package/flowquery-py/src/graph/node_reference.py +0 -50
- package/flowquery-py/src/graph/pattern.py +0 -115
- package/flowquery-py/src/graph/pattern_expression.py +0 -67
- package/flowquery-py/src/graph/patterns.py +0 -42
- package/flowquery-py/src/graph/physical_node.py +0 -41
- package/flowquery-py/src/graph/physical_relationship.py +0 -36
- package/flowquery-py/src/graph/relationship.py +0 -193
- package/flowquery-py/src/graph/relationship_data.py +0 -36
- package/flowquery-py/src/graph/relationship_match_collector.py +0 -85
- package/flowquery-py/src/graph/relationship_reference.py +0 -21
- package/flowquery-py/src/io/__init__.py +0 -5
- package/flowquery-py/src/io/command_line.py +0 -108
- package/flowquery-py/src/parsing/__init__.py +0 -17
- package/flowquery-py/src/parsing/alias.py +0 -20
- package/flowquery-py/src/parsing/alias_option.py +0 -11
- package/flowquery-py/src/parsing/ast_node.py +0 -147
- package/flowquery-py/src/parsing/base_parser.py +0 -84
- package/flowquery-py/src/parsing/components/__init__.py +0 -19
- package/flowquery-py/src/parsing/components/csv.py +0 -8
- package/flowquery-py/src/parsing/components/from_.py +0 -12
- package/flowquery-py/src/parsing/components/headers.py +0 -12
- package/flowquery-py/src/parsing/components/json.py +0 -8
- package/flowquery-py/src/parsing/components/null.py +0 -10
- package/flowquery-py/src/parsing/components/post.py +0 -8
- package/flowquery-py/src/parsing/components/text.py +0 -8
- package/flowquery-py/src/parsing/context.py +0 -50
- package/flowquery-py/src/parsing/data_structures/__init__.py +0 -15
- package/flowquery-py/src/parsing/data_structures/associative_array.py +0 -41
- package/flowquery-py/src/parsing/data_structures/json_array.py +0 -30
- package/flowquery-py/src/parsing/data_structures/key_value_pair.py +0 -38
- package/flowquery-py/src/parsing/data_structures/lookup.py +0 -51
- package/flowquery-py/src/parsing/data_structures/range_lookup.py +0 -42
- package/flowquery-py/src/parsing/expressions/__init__.py +0 -61
- package/flowquery-py/src/parsing/expressions/boolean.py +0 -20
- package/flowquery-py/src/parsing/expressions/expression.py +0 -141
- package/flowquery-py/src/parsing/expressions/expression_map.py +0 -26
- package/flowquery-py/src/parsing/expressions/f_string.py +0 -27
- package/flowquery-py/src/parsing/expressions/identifier.py +0 -21
- package/flowquery-py/src/parsing/expressions/number.py +0 -32
- package/flowquery-py/src/parsing/expressions/operator.py +0 -271
- package/flowquery-py/src/parsing/expressions/reference.py +0 -47
- package/flowquery-py/src/parsing/expressions/string.py +0 -27
- package/flowquery-py/src/parsing/functions/__init__.py +0 -127
- package/flowquery-py/src/parsing/functions/aggregate_function.py +0 -60
- package/flowquery-py/src/parsing/functions/async_function.py +0 -65
- package/flowquery-py/src/parsing/functions/avg.py +0 -55
- package/flowquery-py/src/parsing/functions/coalesce.py +0 -43
- package/flowquery-py/src/parsing/functions/collect.py +0 -75
- package/flowquery-py/src/parsing/functions/count.py +0 -79
- package/flowquery-py/src/parsing/functions/date_.py +0 -61
- package/flowquery-py/src/parsing/functions/datetime_.py +0 -62
- package/flowquery-py/src/parsing/functions/duration.py +0 -159
- package/flowquery-py/src/parsing/functions/element_id.py +0 -50
- package/flowquery-py/src/parsing/functions/function.py +0 -68
- package/flowquery-py/src/parsing/functions/function_factory.py +0 -170
- package/flowquery-py/src/parsing/functions/function_metadata.py +0 -148
- package/flowquery-py/src/parsing/functions/functions.py +0 -67
- package/flowquery-py/src/parsing/functions/head.py +0 -39
- package/flowquery-py/src/parsing/functions/id_.py +0 -49
- package/flowquery-py/src/parsing/functions/join.py +0 -49
- package/flowquery-py/src/parsing/functions/keys.py +0 -34
- package/flowquery-py/src/parsing/functions/last.py +0 -39
- package/flowquery-py/src/parsing/functions/localdatetime.py +0 -60
- package/flowquery-py/src/parsing/functions/localtime.py +0 -57
- package/flowquery-py/src/parsing/functions/max_.py +0 -49
- package/flowquery-py/src/parsing/functions/min_.py +0 -49
- package/flowquery-py/src/parsing/functions/nodes.py +0 -48
- package/flowquery-py/src/parsing/functions/predicate_function.py +0 -47
- package/flowquery-py/src/parsing/functions/predicate_sum.py +0 -49
- package/flowquery-py/src/parsing/functions/properties.py +0 -50
- package/flowquery-py/src/parsing/functions/rand.py +0 -28
- package/flowquery-py/src/parsing/functions/range_.py +0 -41
- package/flowquery-py/src/parsing/functions/reducer_element.py +0 -15
- package/flowquery-py/src/parsing/functions/relationships.py +0 -46
- package/flowquery-py/src/parsing/functions/replace.py +0 -39
- package/flowquery-py/src/parsing/functions/round_.py +0 -34
- package/flowquery-py/src/parsing/functions/schema.py +0 -40
- package/flowquery-py/src/parsing/functions/size.py +0 -34
- package/flowquery-py/src/parsing/functions/split.py +0 -54
- package/flowquery-py/src/parsing/functions/string_distance.py +0 -92
- package/flowquery-py/src/parsing/functions/stringify.py +0 -49
- package/flowquery-py/src/parsing/functions/substring.py +0 -76
- package/flowquery-py/src/parsing/functions/sum.py +0 -51
- package/flowquery-py/src/parsing/functions/tail.py +0 -37
- package/flowquery-py/src/parsing/functions/temporal_utils.py +0 -186
- package/flowquery-py/src/parsing/functions/time_.py +0 -57
- package/flowquery-py/src/parsing/functions/timestamp.py +0 -37
- package/flowquery-py/src/parsing/functions/to_float.py +0 -46
- package/flowquery-py/src/parsing/functions/to_integer.py +0 -46
- package/flowquery-py/src/parsing/functions/to_json.py +0 -35
- package/flowquery-py/src/parsing/functions/to_lower.py +0 -37
- package/flowquery-py/src/parsing/functions/to_string.py +0 -41
- package/flowquery-py/src/parsing/functions/trim.py +0 -37
- package/flowquery-py/src/parsing/functions/type_.py +0 -47
- package/flowquery-py/src/parsing/functions/value_holder.py +0 -24
- package/flowquery-py/src/parsing/logic/__init__.py +0 -15
- package/flowquery-py/src/parsing/logic/case.py +0 -28
- package/flowquery-py/src/parsing/logic/else_.py +0 -12
- package/flowquery-py/src/parsing/logic/end.py +0 -8
- package/flowquery-py/src/parsing/logic/then.py +0 -12
- package/flowquery-py/src/parsing/logic/when.py +0 -12
- package/flowquery-py/src/parsing/operations/__init__.py +0 -46
- package/flowquery-py/src/parsing/operations/aggregated_return.py +0 -25
- package/flowquery-py/src/parsing/operations/aggregated_with.py +0 -22
- package/flowquery-py/src/parsing/operations/call.py +0 -73
- package/flowquery-py/src/parsing/operations/create_node.py +0 -35
- package/flowquery-py/src/parsing/operations/create_relationship.py +0 -35
- package/flowquery-py/src/parsing/operations/delete_node.py +0 -29
- package/flowquery-py/src/parsing/operations/delete_relationship.py +0 -29
- package/flowquery-py/src/parsing/operations/group_by.py +0 -148
- package/flowquery-py/src/parsing/operations/limit.py +0 -33
- package/flowquery-py/src/parsing/operations/load.py +0 -148
- package/flowquery-py/src/parsing/operations/match.py +0 -52
- package/flowquery-py/src/parsing/operations/operation.py +0 -69
- package/flowquery-py/src/parsing/operations/order_by.py +0 -114
- package/flowquery-py/src/parsing/operations/projection.py +0 -21
- package/flowquery-py/src/parsing/operations/return_op.py +0 -88
- package/flowquery-py/src/parsing/operations/union.py +0 -115
- package/flowquery-py/src/parsing/operations/union_all.py +0 -17
- package/flowquery-py/src/parsing/operations/unwind.py +0 -42
- package/flowquery-py/src/parsing/operations/where.py +0 -43
- package/flowquery-py/src/parsing/operations/with_op.py +0 -18
- package/flowquery-py/src/parsing/parser.py +0 -1384
- package/flowquery-py/src/parsing/parser_state.py +0 -26
- package/flowquery-py/src/parsing/token_to_node.py +0 -109
- package/flowquery-py/src/tokenization/__init__.py +0 -23
- package/flowquery-py/src/tokenization/keyword.py +0 -54
- package/flowquery-py/src/tokenization/operator.py +0 -29
- package/flowquery-py/src/tokenization/string_walker.py +0 -158
- package/flowquery-py/src/tokenization/symbol.py +0 -19
- package/flowquery-py/src/tokenization/token.py +0 -693
- package/flowquery-py/src/tokenization/token_mapper.py +0 -53
- package/flowquery-py/src/tokenization/token_type.py +0 -21
- package/flowquery-py/src/tokenization/tokenizer.py +0 -214
- package/flowquery-py/src/tokenization/trie.py +0 -125
- package/flowquery-py/src/utils/__init__.py +0 -6
- package/flowquery-py/src/utils/object_utils.py +0 -20
- package/flowquery-py/src/utils/string_utils.py +0 -113
- package/flowquery-py/tests/__init__.py +0 -1
- package/flowquery-py/tests/compute/__init__.py +0 -1
- package/flowquery-py/tests/compute/test_runner.py +0 -4902
- package/flowquery-py/tests/graph/__init__.py +0 -1
- package/flowquery-py/tests/graph/test_create.py +0 -56
- package/flowquery-py/tests/graph/test_data.py +0 -73
- package/flowquery-py/tests/graph/test_match.py +0 -40
- package/flowquery-py/tests/parsing/__init__.py +0 -1
- package/flowquery-py/tests/parsing/test_context.py +0 -34
- package/flowquery-py/tests/parsing/test_expression.py +0 -248
- package/flowquery-py/tests/parsing/test_parser.py +0 -1237
- package/flowquery-py/tests/test_extensibility.py +0 -611
- package/flowquery-py/tests/tokenization/__init__.py +0 -1
- package/flowquery-py/tests/tokenization/test_token_mapper.py +0 -60
- package/flowquery-py/tests/tokenization/test_tokenizer.py +0 -198
- package/flowquery-py/tests/tokenization/test_trie.py +0 -30
- package/flowquery-vscode/.vscode-test.mjs +0 -5
- package/flowquery-vscode/.vscodeignore +0 -13
- package/flowquery-vscode/LICENSE +0 -21
- package/flowquery-vscode/README.md +0 -11
- package/flowquery-vscode/demo/FlowQueryVSCodeDemo.gif +0 -0
- package/flowquery-vscode/eslint.config.mjs +0 -25
- package/flowquery-vscode/extension.js +0 -508
- package/flowquery-vscode/flowQueryEngine/flowquery.min.js +0 -1
- package/flowquery-vscode/flowquery-worker.js +0 -66
- package/flowquery-vscode/images/FlowQueryLogoIcon.png +0 -0
- package/flowquery-vscode/jsconfig.json +0 -13
- package/flowquery-vscode/libs/page.css +0 -53
- package/flowquery-vscode/libs/table.css +0 -13
- package/flowquery-vscode/libs/tabs.css +0 -66
- package/flowquery-vscode/package-lock.json +0 -2917
- package/flowquery-vscode/package.json +0 -51
- package/flowquery-vscode/test/extension.test.js +0 -196
- package/flowquery-vscode/test/worker.test.js +0 -25
- package/flowquery-vscode/vsc-extension-quickstart.md +0 -42
- package/jest.config.js +0 -14
- package/misc/apps/RAG/README.md +0 -29
- package/misc/apps/RAG/data/chats.json +0 -302
- package/misc/apps/RAG/data/emails.json +0 -182
- package/misc/apps/RAG/data/events.json +0 -226
- package/misc/apps/RAG/data/files.json +0 -172
- package/misc/apps/RAG/data/users.json +0 -158
- package/misc/apps/RAG/jest.config.js +0 -21
- package/misc/apps/RAG/package.json +0 -48
- package/misc/apps/RAG/public/index.html +0 -18
- package/misc/apps/RAG/src/App.css +0 -42
- package/misc/apps/RAG/src/App.tsx +0 -50
- package/misc/apps/RAG/src/components/AdaptiveCardRenderer.css +0 -172
- package/misc/apps/RAG/src/components/AdaptiveCardRenderer.tsx +0 -380
- package/misc/apps/RAG/src/components/ApiKeySettings.tsx +0 -245
- package/misc/apps/RAG/src/components/ChatContainer.css +0 -67
- package/misc/apps/RAG/src/components/ChatContainer.tsx +0 -242
- package/misc/apps/RAG/src/components/ChatInput.css +0 -23
- package/misc/apps/RAG/src/components/ChatInput.tsx +0 -76
- package/misc/apps/RAG/src/components/ChatMessage.css +0 -160
- package/misc/apps/RAG/src/components/ChatMessage.tsx +0 -286
- package/misc/apps/RAG/src/components/FlowQueryAgent.ts +0 -708
- package/misc/apps/RAG/src/components/FlowQueryRunner.css +0 -113
- package/misc/apps/RAG/src/components/FlowQueryRunner.tsx +0 -371
- package/misc/apps/RAG/src/components/index.ts +0 -28
- package/misc/apps/RAG/src/graph/index.ts +0 -19
- package/misc/apps/RAG/src/graph/initializeGraph.ts +0 -254
- package/misc/apps/RAG/src/index.tsx +0 -29
- package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +0 -327
- package/misc/apps/RAG/src/prompts/index.ts +0 -10
- package/misc/apps/RAG/src/tests/graph.test.ts +0 -35
- package/misc/apps/RAG/src/utils/FlowQueryExecutor.ts +0 -130
- package/misc/apps/RAG/src/utils/FlowQueryExtractor.ts +0 -208
- package/misc/apps/RAG/src/utils/Llm.ts +0 -248
- package/misc/apps/RAG/src/utils/index.ts +0 -12
- package/misc/apps/RAG/tsconfig.json +0 -22
- package/misc/apps/RAG/webpack.config.js +0 -43
- package/misc/apps/README.md +0 -1
- package/misc/queries/analyze_catfacts.cql +0 -75
- package/misc/queries/azure_openai_completions.cql +0 -13
- package/misc/queries/azure_openai_models.cql +0 -9
- package/misc/queries/mock_pipeline.cql +0 -84
- package/misc/queries/openai_completions.cql +0 -15
- package/misc/queries/openai_models.cql +0 -13
- package/misc/queries/test.cql +0 -6
- package/misc/queries/tool_inference.cql +0 -24
- package/misc/queries/wisdom.cql +0 -6
- package/misc/queries/wisdom_letter_histogram.cql +0 -8
- package/src/compute/flowquery.ts +0 -46
- package/src/compute/runner.ts +0 -66
- package/src/extensibility.ts +0 -45
- package/src/graph/data.ts +0 -130
- package/src/graph/database.ts +0 -143
- package/src/graph/hops.ts +0 -22
- package/src/graph/node.ts +0 -122
- package/src/graph/node_data.ts +0 -18
- package/src/graph/node_reference.ts +0 -38
- package/src/graph/pattern.ts +0 -110
- package/src/graph/pattern_expression.ts +0 -48
- package/src/graph/patterns.ts +0 -36
- package/src/graph/physical_node.ts +0 -23
- package/src/graph/physical_relationship.ts +0 -23
- package/src/graph/relationship.ts +0 -167
- package/src/graph/relationship_data.ts +0 -31
- package/src/graph/relationship_match_collector.ts +0 -64
- package/src/graph/relationship_reference.ts +0 -25
- package/src/index.browser.ts +0 -46
- package/src/index.node.ts +0 -55
- package/src/index.ts +0 -12
- package/src/io/command_line.ts +0 -74
- package/src/parsing/alias.ts +0 -23
- package/src/parsing/alias_option.ts +0 -5
- package/src/parsing/ast_node.ts +0 -153
- package/src/parsing/base_parser.ts +0 -98
- package/src/parsing/components/csv.ts +0 -9
- package/src/parsing/components/from.ts +0 -12
- package/src/parsing/components/headers.ts +0 -12
- package/src/parsing/components/json.ts +0 -9
- package/src/parsing/components/null.ts +0 -9
- package/src/parsing/components/post.ts +0 -9
- package/src/parsing/components/text.ts +0 -9
- package/src/parsing/context.ts +0 -54
- package/src/parsing/data_structures/associative_array.ts +0 -43
- package/src/parsing/data_structures/json_array.ts +0 -31
- package/src/parsing/data_structures/key_value_pair.ts +0 -37
- package/src/parsing/data_structures/lookup.ts +0 -44
- package/src/parsing/data_structures/range_lookup.ts +0 -36
- package/src/parsing/expressions/boolean.ts +0 -21
- package/src/parsing/expressions/expression.ts +0 -150
- package/src/parsing/expressions/expression_map.ts +0 -22
- package/src/parsing/expressions/f_string.ts +0 -26
- package/src/parsing/expressions/identifier.ts +0 -22
- package/src/parsing/expressions/number.ts +0 -40
- package/src/parsing/expressions/operator.ts +0 -354
- package/src/parsing/expressions/reference.ts +0 -45
- package/src/parsing/expressions/string.ts +0 -34
- package/src/parsing/functions/aggregate_function.ts +0 -58
- package/src/parsing/functions/async_function.ts +0 -64
- package/src/parsing/functions/avg.ts +0 -47
- package/src/parsing/functions/coalesce.ts +0 -49
- package/src/parsing/functions/collect.ts +0 -54
- package/src/parsing/functions/count.ts +0 -54
- package/src/parsing/functions/date.ts +0 -63
- package/src/parsing/functions/datetime.ts +0 -63
- package/src/parsing/functions/duration.ts +0 -143
- package/src/parsing/functions/element_id.ts +0 -51
- package/src/parsing/functions/function.ts +0 -60
- package/src/parsing/functions/function_factory.ts +0 -195
- package/src/parsing/functions/function_metadata.ts +0 -217
- package/src/parsing/functions/functions.ts +0 -70
- package/src/parsing/functions/head.ts +0 -42
- package/src/parsing/functions/id.ts +0 -51
- package/src/parsing/functions/join.ts +0 -40
- package/src/parsing/functions/keys.ts +0 -29
- package/src/parsing/functions/last.ts +0 -42
- package/src/parsing/functions/localdatetime.ts +0 -63
- package/src/parsing/functions/localtime.ts +0 -58
- package/src/parsing/functions/max.ts +0 -37
- package/src/parsing/functions/min.ts +0 -37
- package/src/parsing/functions/nodes.ts +0 -54
- package/src/parsing/functions/predicate_function.ts +0 -48
- package/src/parsing/functions/predicate_sum.ts +0 -47
- package/src/parsing/functions/properties.ts +0 -56
- package/src/parsing/functions/rand.ts +0 -21
- package/src/parsing/functions/range.ts +0 -37
- package/src/parsing/functions/reducer_element.ts +0 -10
- package/src/parsing/functions/relationships.ts +0 -52
- package/src/parsing/functions/replace.ts +0 -38
- package/src/parsing/functions/round.ts +0 -28
- package/src/parsing/functions/schema.ts +0 -39
- package/src/parsing/functions/size.ts +0 -28
- package/src/parsing/functions/split.ts +0 -45
- package/src/parsing/functions/string_distance.ts +0 -83
- package/src/parsing/functions/stringify.ts +0 -37
- package/src/parsing/functions/substring.ts +0 -68
- package/src/parsing/functions/sum.ts +0 -41
- package/src/parsing/functions/tail.ts +0 -39
- package/src/parsing/functions/temporal_utils.ts +0 -180
- package/src/parsing/functions/time.ts +0 -58
- package/src/parsing/functions/timestamp.ts +0 -37
- package/src/parsing/functions/to_float.ts +0 -50
- package/src/parsing/functions/to_integer.ts +0 -50
- package/src/parsing/functions/to_json.ts +0 -28
- package/src/parsing/functions/to_lower.ts +0 -28
- package/src/parsing/functions/to_string.ts +0 -32
- package/src/parsing/functions/trim.ts +0 -28
- package/src/parsing/functions/type.ts +0 -39
- package/src/parsing/functions/value_holder.ts +0 -13
- package/src/parsing/logic/case.ts +0 -26
- package/src/parsing/logic/else.ts +0 -12
- package/src/parsing/logic/end.ts +0 -9
- package/src/parsing/logic/then.ts +0 -12
- package/src/parsing/logic/when.ts +0 -12
- package/src/parsing/operations/aggregated_return.ts +0 -22
- package/src/parsing/operations/aggregated_with.ts +0 -18
- package/src/parsing/operations/call.ts +0 -69
- package/src/parsing/operations/create_node.ts +0 -39
- package/src/parsing/operations/create_relationship.ts +0 -38
- package/src/parsing/operations/delete_node.ts +0 -33
- package/src/parsing/operations/delete_relationship.ts +0 -32
- package/src/parsing/operations/group_by.ts +0 -137
- package/src/parsing/operations/limit.ts +0 -31
- package/src/parsing/operations/load.ts +0 -146
- package/src/parsing/operations/match.ts +0 -54
- package/src/parsing/operations/operation.ts +0 -69
- package/src/parsing/operations/order_by.ts +0 -126
- package/src/parsing/operations/projection.ts +0 -18
- package/src/parsing/operations/return.ts +0 -76
- package/src/parsing/operations/union.ts +0 -114
- package/src/parsing/operations/union_all.ts +0 -16
- package/src/parsing/operations/unwind.ts +0 -36
- package/src/parsing/operations/where.ts +0 -42
- package/src/parsing/operations/with.ts +0 -20
- package/src/parsing/parser.ts +0 -1641
- package/src/parsing/parser_state.ts +0 -25
- package/src/parsing/token_to_node.ts +0 -114
- package/src/tokenization/keyword.ts +0 -50
- package/src/tokenization/operator.ts +0 -25
- package/src/tokenization/string_walker.ts +0 -197
- package/src/tokenization/symbol.ts +0 -15
- package/src/tokenization/token.ts +0 -764
- package/src/tokenization/token_mapper.ts +0 -53
- package/src/tokenization/token_type.ts +0 -16
- package/src/tokenization/tokenizer.ts +0 -250
- package/src/tokenization/trie.ts +0 -117
- package/src/utils/object_utils.ts +0 -17
- package/src/utils/string_utils.ts +0 -114
- package/tests/compute/runner.test.ts +0 -4559
- package/tests/extensibility.test.ts +0 -643
- package/tests/graph/create.test.ts +0 -36
- package/tests/graph/data.test.ts +0 -58
- package/tests/graph/match.test.ts +0 -29
- package/tests/parsing/context.test.ts +0 -27
- package/tests/parsing/expression.test.ts +0 -303
- package/tests/parsing/parser.test.ts +0 -1327
- package/tests/tokenization/token_mapper.test.ts +0 -47
- package/tests/tokenization/tokenizer.test.ts +0 -191
- package/tests/tokenization/trie.test.ts +0 -20
- package/tsconfig.json +0 -19
- package/typedoc.json +0 -16
- package/vscode-settings.json.recommended +0 -16
- package/webpack.config.js +0 -26
|
@@ -1,708 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FlowQuery Agent
|
|
3
|
-
*
|
|
4
|
-
* Orchestrates the multi-step flow:
|
|
5
|
-
* 1. Send user query to LLM to generate a FlowQuery statement
|
|
6
|
-
* 2. Execute the FlowQuery statement
|
|
7
|
-
* 3. Send results back to LLM for interpretation
|
|
8
|
-
* 4. Return final response to user
|
|
9
|
-
*/
|
|
10
|
-
import { generateInterpretationPrompt } from "../prompts";
|
|
11
|
-
import { FlowQueryExecutionResult, FlowQueryExecutor } from "../utils/FlowQueryExecutor";
|
|
12
|
-
import { FlowQueryExtraction, extractFlowQuery } from "../utils/FlowQueryExtractor";
|
|
13
|
-
import { LlmOptions, llm, llmStream } from "../utils/Llm";
|
|
14
|
-
import { isAdaptiveCard } from "./AdaptiveCardRenderer";
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Represents a step in the agent's execution process.
|
|
18
|
-
*/
|
|
19
|
-
export interface AgentStep {
|
|
20
|
-
type: "query_generation" | "query_execution" | "interpretation" | "direct_response" | "retry";
|
|
21
|
-
content: string;
|
|
22
|
-
timestamp: Date;
|
|
23
|
-
metadata?: {
|
|
24
|
-
query?: string;
|
|
25
|
-
executionResult?: FlowQueryExecutionResult;
|
|
26
|
-
extraction?: FlowQueryExtraction;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Result of the agent's processing.
|
|
32
|
-
*/
|
|
33
|
-
export interface AgentResult {
|
|
34
|
-
/** Final response text to show the user */
|
|
35
|
-
finalResponse: string;
|
|
36
|
-
/** Steps taken during processing (for debugging/transparency) */
|
|
37
|
-
steps: AgentStep[];
|
|
38
|
-
/** Whether processing was successful */
|
|
39
|
-
success: boolean;
|
|
40
|
-
/** Error message if processing failed */
|
|
41
|
-
error?: string;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Callback for streaming agent responses.
|
|
46
|
-
*/
|
|
47
|
-
export type AgentStreamCallback = (chunk: string, step: AgentStep["type"]) => void;
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Options for the FlowQuery agent.
|
|
51
|
-
*/
|
|
52
|
-
export interface FlowQueryAgentOptions {
|
|
53
|
-
/** System prompt for query generation */
|
|
54
|
-
systemPrompt: string;
|
|
55
|
-
/** LLM options to use */
|
|
56
|
-
llmOptions?: LlmOptions;
|
|
57
|
-
/** Conversation history */
|
|
58
|
-
conversationHistory?: Array<{ role: "user" | "assistant"; content: string }>;
|
|
59
|
-
/** Callback for streaming responses */
|
|
60
|
-
onStream?: AgentStreamCallback;
|
|
61
|
-
/** Whether to show intermediate steps to the user */
|
|
62
|
-
showIntermediateSteps?: boolean;
|
|
63
|
-
/** Maximum number of retry attempts for query execution (default: 2) */
|
|
64
|
-
maxRetries?: number;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* FlowQuery Agent class that orchestrates the multi-step query processing flow.
|
|
69
|
-
*
|
|
70
|
-
* @example
|
|
71
|
-
* ```typescript
|
|
72
|
-
* const agent = new FlowQueryAgent();
|
|
73
|
-
* const result = await agent.processQuery("Show me all users", {
|
|
74
|
-
* systemPrompt: "You are a helpful assistant..."
|
|
75
|
-
* });
|
|
76
|
-
* ```
|
|
77
|
-
*/
|
|
78
|
-
export class FlowQueryAgent {
|
|
79
|
-
private readonly flowQueryExecutor: FlowQueryExecutor;
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Creates a new FlowQueryAgent instance.
|
|
83
|
-
* @param executor - Optional custom FlowQueryExecutor instance. If not provided, a new one will be created.
|
|
84
|
-
*/
|
|
85
|
-
constructor(executor?: FlowQueryExecutor) {
|
|
86
|
-
this.flowQueryExecutor = executor ?? new FlowQueryExecutor();
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Process a user query through the FlowQuery agent.
|
|
91
|
-
*
|
|
92
|
-
* @param userQuery - The natural language query from the user
|
|
93
|
-
* @param options - Agent configuration options
|
|
94
|
-
* @returns The agent result including final response and steps taken
|
|
95
|
-
*/
|
|
96
|
-
async processQuery(userQuery: string, options: FlowQueryAgentOptions): Promise<AgentResult> {
|
|
97
|
-
const steps: AgentStep[] = [];
|
|
98
|
-
const {
|
|
99
|
-
systemPrompt,
|
|
100
|
-
llmOptions = {},
|
|
101
|
-
conversationHistory = [],
|
|
102
|
-
onStream,
|
|
103
|
-
showIntermediateSteps = true,
|
|
104
|
-
} = options;
|
|
105
|
-
|
|
106
|
-
try {
|
|
107
|
-
// Step 1: Generate FlowQuery from natural language
|
|
108
|
-
const generationResponse = await llm(userQuery, {
|
|
109
|
-
...llmOptions,
|
|
110
|
-
systemPrompt,
|
|
111
|
-
messages: conversationHistory,
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
const generationContent = generationResponse.choices[0]?.message?.content || "";
|
|
115
|
-
|
|
116
|
-
steps.push({
|
|
117
|
-
type: "query_generation",
|
|
118
|
-
content: generationContent,
|
|
119
|
-
timestamp: new Date(),
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
// Step 2: Extract the FlowQuery from the response
|
|
123
|
-
const extraction = extractFlowQuery(generationContent);
|
|
124
|
-
|
|
125
|
-
// If no query needed (direct response from LLM)
|
|
126
|
-
if (extraction.noQueryNeeded || !extraction.found) {
|
|
127
|
-
const directResponse = extraction.directResponse || generationContent;
|
|
128
|
-
|
|
129
|
-
steps.push({
|
|
130
|
-
type: "direct_response",
|
|
131
|
-
content: directResponse,
|
|
132
|
-
timestamp: new Date(),
|
|
133
|
-
metadata: { extraction },
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
return {
|
|
137
|
-
finalResponse: directResponse,
|
|
138
|
-
steps,
|
|
139
|
-
success: true,
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Step 3: Execute the FlowQuery
|
|
144
|
-
let executionResult = await this.flowQueryExecutor.execute(extraction.query!);
|
|
145
|
-
|
|
146
|
-
steps.push({
|
|
147
|
-
type: "query_execution",
|
|
148
|
-
content: this.flowQueryExecutor.formatResult(executionResult),
|
|
149
|
-
timestamp: new Date(),
|
|
150
|
-
metadata: {
|
|
151
|
-
query: extraction.query!,
|
|
152
|
-
executionResult,
|
|
153
|
-
extraction,
|
|
154
|
-
},
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
// If execution failed, attempt retry with error context
|
|
158
|
-
if (!executionResult.success) {
|
|
159
|
-
const maxRetries = options.maxRetries ?? 2;
|
|
160
|
-
let retryCount = 0;
|
|
161
|
-
let currentQuery = extraction.query!;
|
|
162
|
-
let currentError = executionResult.error;
|
|
163
|
-
let currentResult = executionResult;
|
|
164
|
-
|
|
165
|
-
while (!currentResult.success && retryCount < maxRetries) {
|
|
166
|
-
retryCount++;
|
|
167
|
-
|
|
168
|
-
steps.push({
|
|
169
|
-
type: "retry",
|
|
170
|
-
content: `Retry ${retryCount}: Error was "${currentError}"`,
|
|
171
|
-
timestamp: new Date(),
|
|
172
|
-
metadata: {
|
|
173
|
-
query: currentQuery,
|
|
174
|
-
executionResult: currentResult,
|
|
175
|
-
},
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
// Ask LLM to generate a corrected query
|
|
179
|
-
const correctedQuery = await this.generateCorrectedQuery(
|
|
180
|
-
userQuery,
|
|
181
|
-
currentQuery,
|
|
182
|
-
currentError || "Unknown error",
|
|
183
|
-
steps,
|
|
184
|
-
options
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
if (!correctedQuery) {
|
|
188
|
-
// LLM couldn't generate a correction, fall back to error interpretation
|
|
189
|
-
const errorInterpretation = await this.interpretError(
|
|
190
|
-
userQuery,
|
|
191
|
-
currentQuery,
|
|
192
|
-
currentResult,
|
|
193
|
-
options
|
|
194
|
-
);
|
|
195
|
-
|
|
196
|
-
return {
|
|
197
|
-
finalResponse: errorInterpretation,
|
|
198
|
-
steps,
|
|
199
|
-
success: false,
|
|
200
|
-
error: currentResult.error,
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Try executing the corrected query
|
|
205
|
-
currentQuery = correctedQuery;
|
|
206
|
-
currentResult = await this.flowQueryExecutor.execute(correctedQuery);
|
|
207
|
-
currentError = currentResult.error;
|
|
208
|
-
|
|
209
|
-
steps.push({
|
|
210
|
-
type: "query_execution",
|
|
211
|
-
content: this.flowQueryExecutor.formatResult(currentResult),
|
|
212
|
-
timestamp: new Date(),
|
|
213
|
-
metadata: {
|
|
214
|
-
query: correctedQuery,
|
|
215
|
-
executionResult: currentResult,
|
|
216
|
-
},
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// If still failing after retries, interpret the error
|
|
221
|
-
if (!currentResult.success) {
|
|
222
|
-
const errorInterpretation = await this.interpretError(
|
|
223
|
-
userQuery,
|
|
224
|
-
currentQuery,
|
|
225
|
-
currentResult,
|
|
226
|
-
options
|
|
227
|
-
);
|
|
228
|
-
|
|
229
|
-
return {
|
|
230
|
-
finalResponse: errorInterpretation,
|
|
231
|
-
steps,
|
|
232
|
-
success: false,
|
|
233
|
-
error: currentResult.error,
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// Update for interpretation phase
|
|
238
|
-
executionResult = currentResult;
|
|
239
|
-
extraction.query = currentQuery;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Step 4: Send results to LLM for interpretation
|
|
243
|
-
const interpretationPrompt = this.buildInterpretationPrompt(
|
|
244
|
-
userQuery,
|
|
245
|
-
extraction.query!,
|
|
246
|
-
executionResult
|
|
247
|
-
);
|
|
248
|
-
|
|
249
|
-
let finalResponse = "";
|
|
250
|
-
|
|
251
|
-
if (onStream) {
|
|
252
|
-
// Stream the interpretation response
|
|
253
|
-
for await (const chunk of llmStream(interpretationPrompt, {
|
|
254
|
-
...llmOptions,
|
|
255
|
-
systemPrompt: generateInterpretationPrompt(),
|
|
256
|
-
messages: conversationHistory,
|
|
257
|
-
})) {
|
|
258
|
-
const deltaContent = chunk.choices?.[0]?.delta?.content || "";
|
|
259
|
-
if (deltaContent) {
|
|
260
|
-
finalResponse += deltaContent;
|
|
261
|
-
onStream(deltaContent, "interpretation");
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
} else {
|
|
265
|
-
const interpretationResponse = await llm(interpretationPrompt, {
|
|
266
|
-
...llmOptions,
|
|
267
|
-
systemPrompt: generateInterpretationPrompt(),
|
|
268
|
-
messages: conversationHistory,
|
|
269
|
-
});
|
|
270
|
-
finalResponse = interpretationResponse.choices[0]?.message?.content || "";
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
steps.push({
|
|
274
|
-
type: "interpretation",
|
|
275
|
-
content: finalResponse,
|
|
276
|
-
timestamp: new Date(),
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
// Build the complete response with optional intermediate steps
|
|
280
|
-
let completeResponse = "";
|
|
281
|
-
|
|
282
|
-
if (showIntermediateSteps && extraction.explanation) {
|
|
283
|
-
completeResponse += extraction.explanation + "\n\n";
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if (showIntermediateSteps) {
|
|
287
|
-
completeResponse += `**Query executed:**\n\`\`\`flowquery\n${extraction.query}\n\`\`\`\n\n`;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
completeResponse += finalResponse;
|
|
291
|
-
|
|
292
|
-
return {
|
|
293
|
-
finalResponse: completeResponse,
|
|
294
|
-
steps,
|
|
295
|
-
success: true,
|
|
296
|
-
};
|
|
297
|
-
} catch (error) {
|
|
298
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
299
|
-
|
|
300
|
-
return {
|
|
301
|
-
finalResponse: `⚠️ An error occurred: ${errorMessage}`,
|
|
302
|
-
steps,
|
|
303
|
-
success: false,
|
|
304
|
-
error: errorMessage,
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
/**
|
|
310
|
-
* Process a query with streaming support for the final interpretation.
|
|
311
|
-
*/
|
|
312
|
-
async *processQueryStream(
|
|
313
|
-
userQuery: string,
|
|
314
|
-
options: FlowQueryAgentOptions
|
|
315
|
-
): AsyncGenerator<
|
|
316
|
-
{
|
|
317
|
-
chunk: string;
|
|
318
|
-
step: AgentStep["type"];
|
|
319
|
-
done: boolean;
|
|
320
|
-
steps?: AgentStep[];
|
|
321
|
-
adaptiveCard?: Record<string, unknown>;
|
|
322
|
-
newMessage?: boolean;
|
|
323
|
-
},
|
|
324
|
-
void,
|
|
325
|
-
unknown
|
|
326
|
-
> {
|
|
327
|
-
const steps: AgentStep[] = [];
|
|
328
|
-
const {
|
|
329
|
-
systemPrompt,
|
|
330
|
-
llmOptions = {},
|
|
331
|
-
conversationHistory = [],
|
|
332
|
-
showIntermediateSteps = true,
|
|
333
|
-
} = options;
|
|
334
|
-
|
|
335
|
-
try {
|
|
336
|
-
// Step 1: Generate FlowQuery from natural language (non-streaming for speed)
|
|
337
|
-
const generationResponse = await llm(userQuery, {
|
|
338
|
-
...llmOptions,
|
|
339
|
-
systemPrompt,
|
|
340
|
-
messages: conversationHistory,
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
const generationContent = generationResponse.choices[0]?.message?.content || "";
|
|
344
|
-
|
|
345
|
-
steps.push({
|
|
346
|
-
type: "query_generation",
|
|
347
|
-
content: generationContent,
|
|
348
|
-
timestamp: new Date(),
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
// Step 2: Extract the FlowQuery
|
|
352
|
-
const extraction = extractFlowQuery(generationContent);
|
|
353
|
-
|
|
354
|
-
// If no query needed
|
|
355
|
-
if (extraction.noQueryNeeded || !extraction.found) {
|
|
356
|
-
const directResponse = extraction.directResponse || generationContent;
|
|
357
|
-
|
|
358
|
-
steps.push({
|
|
359
|
-
type: "direct_response",
|
|
360
|
-
content: directResponse,
|
|
361
|
-
timestamp: new Date(),
|
|
362
|
-
metadata: { extraction },
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
yield { chunk: directResponse, step: "direct_response", done: true, steps };
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
// Emit intermediate step: show the query being executed
|
|
370
|
-
if (showIntermediateSteps) {
|
|
371
|
-
yield {
|
|
372
|
-
chunk: `\`\`\`flowquery\n${extraction.query}\n\`\`\`\n\n`,
|
|
373
|
-
step: "query_generation",
|
|
374
|
-
done: false,
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
// Step 3: Execute the FlowQuery
|
|
379
|
-
let executionResult = await this.flowQueryExecutor.execute(extraction.query!);
|
|
380
|
-
|
|
381
|
-
steps.push({
|
|
382
|
-
type: "query_execution",
|
|
383
|
-
content: this.flowQueryExecutor.formatResult(executionResult),
|
|
384
|
-
timestamp: new Date(),
|
|
385
|
-
metadata: {
|
|
386
|
-
query: extraction.query!,
|
|
387
|
-
executionResult,
|
|
388
|
-
extraction,
|
|
389
|
-
},
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
// Handle execution errors with retry logic
|
|
393
|
-
if (!executionResult.success) {
|
|
394
|
-
const maxRetries = options.maxRetries ?? 2;
|
|
395
|
-
let retryCount = 0;
|
|
396
|
-
let currentQuery = extraction.query!;
|
|
397
|
-
let currentError = executionResult.error;
|
|
398
|
-
let currentResult = executionResult;
|
|
399
|
-
|
|
400
|
-
while (!currentResult.success && retryCount < maxRetries) {
|
|
401
|
-
retryCount++;
|
|
402
|
-
|
|
403
|
-
// Show the failure in the current message before marking it complete
|
|
404
|
-
yield {
|
|
405
|
-
chunk: `\n⚠️ **Query execution failed:** ${currentError}\n`,
|
|
406
|
-
step: "query_execution",
|
|
407
|
-
done: false,
|
|
408
|
-
};
|
|
409
|
-
|
|
410
|
-
// Complete the previous message before starting a new one
|
|
411
|
-
yield {
|
|
412
|
-
chunk: "",
|
|
413
|
-
step: "query_execution",
|
|
414
|
-
done: true,
|
|
415
|
-
};
|
|
416
|
-
|
|
417
|
-
// Notify user of retry attempt - start a new message for the retry
|
|
418
|
-
yield {
|
|
419
|
-
chunk: `🔄 Attempting to fix (retry ${retryCount}/${maxRetries})...\n\n`,
|
|
420
|
-
step: "retry",
|
|
421
|
-
done: false,
|
|
422
|
-
newMessage: true,
|
|
423
|
-
};
|
|
424
|
-
|
|
425
|
-
steps.push({
|
|
426
|
-
type: "retry",
|
|
427
|
-
content: `Retry ${retryCount}: Error was "${currentError}"`,
|
|
428
|
-
timestamp: new Date(),
|
|
429
|
-
metadata: {
|
|
430
|
-
query: currentQuery,
|
|
431
|
-
executionResult: currentResult,
|
|
432
|
-
},
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
// Ask LLM to generate a corrected query
|
|
436
|
-
const correctedQuery = await this.generateCorrectedQuery(
|
|
437
|
-
userQuery,
|
|
438
|
-
currentQuery,
|
|
439
|
-
currentError || "Unknown error",
|
|
440
|
-
steps,
|
|
441
|
-
options
|
|
442
|
-
);
|
|
443
|
-
|
|
444
|
-
if (!correctedQuery) {
|
|
445
|
-
// LLM couldn't generate a correction
|
|
446
|
-
yield {
|
|
447
|
-
chunk: `Unable to generate a corrected query. Please try rephrasing your request.\n`,
|
|
448
|
-
step: "retry",
|
|
449
|
-
done: true,
|
|
450
|
-
steps,
|
|
451
|
-
};
|
|
452
|
-
return;
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
// Show the corrected query
|
|
456
|
-
if (showIntermediateSteps) {
|
|
457
|
-
yield {
|
|
458
|
-
chunk: `**Corrected query:**\n\`\`\`flowquery\n${correctedQuery}\n\`\`\`\n\n`,
|
|
459
|
-
step: "retry",
|
|
460
|
-
done: false,
|
|
461
|
-
};
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
// Try executing the corrected query
|
|
465
|
-
currentQuery = correctedQuery;
|
|
466
|
-
currentResult = await this.flowQueryExecutor.execute(correctedQuery);
|
|
467
|
-
currentError = currentResult.error;
|
|
468
|
-
|
|
469
|
-
steps.push({
|
|
470
|
-
type: "query_execution",
|
|
471
|
-
content: this.flowQueryExecutor.formatResult(currentResult),
|
|
472
|
-
timestamp: new Date(),
|
|
473
|
-
metadata: {
|
|
474
|
-
query: correctedQuery,
|
|
475
|
-
executionResult: currentResult,
|
|
476
|
-
},
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
// If still failing after retries, give up
|
|
481
|
-
if (!currentResult.success) {
|
|
482
|
-
const errorMessage = `⚠️ Query execution failed after ${maxRetries} retries: ${currentError}\n\nLast query attempted:\n\`\`\`flowquery\n${currentQuery}\n\`\`\``;
|
|
483
|
-
yield { chunk: errorMessage, step: "query_execution", done: true, steps };
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
// Mark the retry message as complete before proceeding to interpretation
|
|
488
|
-
yield {
|
|
489
|
-
chunk: "",
|
|
490
|
-
step: "retry",
|
|
491
|
-
done: true,
|
|
492
|
-
};
|
|
493
|
-
|
|
494
|
-
// Update executionResult for interpretation phase
|
|
495
|
-
executionResult = currentResult;
|
|
496
|
-
extraction.query = currentQuery;
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
// Check if the result contains an Adaptive Card
|
|
500
|
-
const adaptiveCard = this.extractAdaptiveCardFromResults(executionResult.results);
|
|
501
|
-
|
|
502
|
-
// Step 4: Stream the interpretation
|
|
503
|
-
const interpretationPrompt = this.buildInterpretationPrompt(
|
|
504
|
-
userQuery,
|
|
505
|
-
extraction.query!,
|
|
506
|
-
executionResult,
|
|
507
|
-
!!adaptiveCard
|
|
508
|
-
);
|
|
509
|
-
|
|
510
|
-
let interpretationContent = "";
|
|
511
|
-
|
|
512
|
-
for await (const chunk of llmStream(interpretationPrompt, {
|
|
513
|
-
...llmOptions,
|
|
514
|
-
systemPrompt: generateInterpretationPrompt(),
|
|
515
|
-
messages: conversationHistory,
|
|
516
|
-
})) {
|
|
517
|
-
const deltaContent = chunk.choices?.[0]?.delta?.content || "";
|
|
518
|
-
if (deltaContent) {
|
|
519
|
-
interpretationContent += deltaContent;
|
|
520
|
-
yield { chunk: deltaContent, step: "interpretation", done: false };
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
steps.push({
|
|
525
|
-
type: "interpretation",
|
|
526
|
-
content: interpretationContent,
|
|
527
|
-
timestamp: new Date(),
|
|
528
|
-
});
|
|
529
|
-
|
|
530
|
-
yield { chunk: "", step: "interpretation", done: true, steps, adaptiveCard };
|
|
531
|
-
} catch (error) {
|
|
532
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
533
|
-
yield {
|
|
534
|
-
chunk: `⚠️ An error occurred: ${errorMessage}`,
|
|
535
|
-
step: "interpretation",
|
|
536
|
-
done: true,
|
|
537
|
-
steps,
|
|
538
|
-
};
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
/**
|
|
543
|
-
* Extract an Adaptive Card from the execution results.
|
|
544
|
-
* Checks if any result is an Adaptive Card (type: "AdaptiveCard") and returns it.
|
|
545
|
-
* Searches for Adaptive Cards at the top level or within any property of result objects.
|
|
546
|
-
*/
|
|
547
|
-
private extractAdaptiveCardFromResults(
|
|
548
|
-
results: unknown[] | undefined
|
|
549
|
-
): Record<string, unknown> | undefined {
|
|
550
|
-
if (!results || !Array.isArray(results)) {
|
|
551
|
-
return undefined;
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
for (const result of results) {
|
|
555
|
-
// Check if the result itself is an Adaptive Card
|
|
556
|
-
if (isAdaptiveCard(result)) {
|
|
557
|
-
return result;
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
// Check if any property of the result object is an Adaptive Card
|
|
561
|
-
if (typeof result === "object" && result !== null) {
|
|
562
|
-
const obj = result as Record<string, unknown>;
|
|
563
|
-
for (const value of Object.values(obj)) {
|
|
564
|
-
if (isAdaptiveCard(value)) {
|
|
565
|
-
return value as Record<string, unknown>;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
return undefined;
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
/**
|
|
575
|
-
* Build the prompt for the interpretation phase.
|
|
576
|
-
*/
|
|
577
|
-
private buildInterpretationPrompt(
|
|
578
|
-
originalQuery: string,
|
|
579
|
-
flowQuery: string,
|
|
580
|
-
executionResult: FlowQueryExecutionResult,
|
|
581
|
-
hasAdaptiveCard: boolean = false
|
|
582
|
-
): string {
|
|
583
|
-
const resultsJson = JSON.stringify(executionResult.results, null, 2);
|
|
584
|
-
const resultCount = executionResult.results?.length || 0;
|
|
585
|
-
|
|
586
|
-
let prompt = `The user asked: "${originalQuery}"
|
|
587
|
-
|
|
588
|
-
This was translated to the following FlowQuery:
|
|
589
|
-
\`\`\`flowquery
|
|
590
|
-
${flowQuery}
|
|
591
|
-
\`\`\`
|
|
592
|
-
|
|
593
|
-
The query executed successfully in ${executionResult.executionTime.toFixed(2)}ms and returned ${resultCount} result(s):
|
|
594
|
-
|
|
595
|
-
\`\`\`json
|
|
596
|
-
${resultsJson}
|
|
597
|
-
\`\`\`
|
|
598
|
-
|
|
599
|
-
`;
|
|
600
|
-
|
|
601
|
-
if (hasAdaptiveCard) {
|
|
602
|
-
prompt += `The result is an Adaptive Card that will be rendered automatically in the UI. Please provide a brief introduction or context for the data shown in the card, but do NOT recreate the table or list the data in your response since the card will display it visually.`;
|
|
603
|
-
} else {
|
|
604
|
-
prompt += `Please interpret these results and provide a helpful response to the user's original question.`;
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
return prompt;
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
/**
|
|
611
|
-
* Generate a corrected FlowQuery by sending the error back to the LLM.
|
|
612
|
-
* This is used for retry logic when query execution fails.
|
|
613
|
-
*/
|
|
614
|
-
private async generateCorrectedQuery(
|
|
615
|
-
originalQuery: string,
|
|
616
|
-
failedQuery: string,
|
|
617
|
-
errorMessage: string,
|
|
618
|
-
previousSteps: AgentStep[],
|
|
619
|
-
options: FlowQueryAgentOptions
|
|
620
|
-
): Promise<string | null> {
|
|
621
|
-
const { systemPrompt, llmOptions = {}, conversationHistory = [] } = options;
|
|
622
|
-
|
|
623
|
-
// Build context from previous steps
|
|
624
|
-
const stepsContext = previousSteps
|
|
625
|
-
.filter((step) => step.type === "query_execution" || step.type === "retry")
|
|
626
|
-
.map((step) => {
|
|
627
|
-
if (step.type === "retry") {
|
|
628
|
-
return `- Retry attempt: ${step.content}`;
|
|
629
|
-
}
|
|
630
|
-
return `- Query: \`${step.metadata?.query}\` → Error: ${step.metadata?.executionResult?.error || "unknown"}`;
|
|
631
|
-
})
|
|
632
|
-
.join("\n");
|
|
633
|
-
|
|
634
|
-
const retryPrompt = `The user asked: "${originalQuery}"
|
|
635
|
-
|
|
636
|
-
I generated the following FlowQuery:
|
|
637
|
-
\`\`\`flowquery
|
|
638
|
-
${failedQuery}
|
|
639
|
-
\`\`\`
|
|
640
|
-
|
|
641
|
-
However, the query failed with this error:
|
|
642
|
-
${errorMessage}
|
|
643
|
-
|
|
644
|
-
${stepsContext ? `Previous attempts:\n${stepsContext}\n\n` : ""}Please analyze the error and generate a CORRECTED FlowQuery that will work. Pay close attention to:
|
|
645
|
-
- Syntax errors in the query
|
|
646
|
-
- Incorrect loader names or function names
|
|
647
|
-
- Missing or incorrect parameters
|
|
648
|
-
- Data type mismatches
|
|
649
|
-
|
|
650
|
-
Generate the corrected query using the same format as before (with explanation if needed).`;
|
|
651
|
-
|
|
652
|
-
try {
|
|
653
|
-
const response = await llm(retryPrompt, {
|
|
654
|
-
...llmOptions,
|
|
655
|
-
systemPrompt,
|
|
656
|
-
messages: conversationHistory,
|
|
657
|
-
});
|
|
658
|
-
|
|
659
|
-
const responseContent = response.choices[0]?.message?.content || "";
|
|
660
|
-
const extraction = extractFlowQuery(responseContent);
|
|
661
|
-
|
|
662
|
-
if (extraction.found && extraction.query) {
|
|
663
|
-
return extraction.query;
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
return null;
|
|
667
|
-
} catch (error) {
|
|
668
|
-
console.error("Error generating corrected query:", error);
|
|
669
|
-
return null;
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
/**
|
|
674
|
-
* Handle execution errors by asking LLM to explain or suggest fixes.
|
|
675
|
-
*/
|
|
676
|
-
private async interpretError(
|
|
677
|
-
originalQuery: string,
|
|
678
|
-
flowQuery: string,
|
|
679
|
-
executionResult: FlowQueryExecutionResult,
|
|
680
|
-
options: FlowQueryAgentOptions
|
|
681
|
-
): Promise<string> {
|
|
682
|
-
const errorPrompt = `The user asked: "${originalQuery}"
|
|
683
|
-
|
|
684
|
-
This was translated to the following FlowQuery:
|
|
685
|
-
\`\`\`flowquery
|
|
686
|
-
${flowQuery}
|
|
687
|
-
\`\`\`
|
|
688
|
-
|
|
689
|
-
However, the query failed with the following error:
|
|
690
|
-
${executionResult.error}
|
|
691
|
-
|
|
692
|
-
Please explain what went wrong in user-friendly terms and, if possible, suggest how to fix the issue or rephrase their request.`;
|
|
693
|
-
|
|
694
|
-
const response = await llm(errorPrompt, {
|
|
695
|
-
...options.llmOptions,
|
|
696
|
-
systemPrompt:
|
|
697
|
-
"You are a helpful assistant explaining query errors. Be concise and helpful.",
|
|
698
|
-
messages: options.conversationHistory,
|
|
699
|
-
});
|
|
700
|
-
|
|
701
|
-
return (
|
|
702
|
-
response.choices[0]?.message?.content ||
|
|
703
|
-
`The query failed with error: ${executionResult.error}`
|
|
704
|
-
);
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
export default FlowQueryAgent;
|