qtype 0.1.12__py3-none-any.whl → 0.1.13__py3-none-any.whl

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 (252) hide show
  1. qtype/` +0 -0
  2. qtype/application/__init__.py +0 -2
  3. qtype/application/converters/tools_from_api.py +28 -22
  4. qtype/application/converters/tools_from_module.py +66 -32
  5. qtype/commands/generate.py +90 -7
  6. qtype/commands/run.py +116 -44
  7. qtype/docs/.pages +8 -0
  8. {docs → qtype/docs}/Concepts/mental-model-and-philosophy.md +1 -1
  9. qtype/docs/Contributing/.pages +4 -0
  10. {docs → qtype/docs}/Contributing/index.md +8 -1
  11. {docs → qtype/docs}/Gallery/dataflow_pipelines.md +3 -2
  12. {docs → qtype/docs}/Gallery/research_assistant.md +3 -4
  13. {docs → qtype/docs}/Gallery/simple_chatbot.md +3 -1
  14. {docs → qtype/docs}/How To/Authentication/configure_aws_authentication.md +2 -2
  15. {docs → qtype/docs}/How To/Authentication/use_api_key_authentication.md +2 -2
  16. {docs → qtype/docs}/How To/Command Line Usage/load_multiple_inputs_from_files.md +24 -9
  17. {docs → qtype/docs}/How To/Command Line Usage/pass_inputs_on_the_cli.md +3 -3
  18. {docs → qtype/docs}/How To/Command Line Usage/serve_with_auto_reload.md +3 -2
  19. {docs → qtype/docs}/How To/Data Processing/adjust_concurrency.md +3 -4
  20. {docs → qtype/docs}/How To/Data Processing/cache_step_results.md +2 -2
  21. {docs → qtype/docs}/How To/Data Processing/decode_json_xml.md +1 -1
  22. {docs → qtype/docs}/How To/Data Processing/explode_collections.md +2 -2
  23. {docs → qtype/docs}/How To/Data Processing/gather_results.md +4 -4
  24. qtype/docs/How To/Data Processing/invoke_other_flows.md +71 -0
  25. qtype/docs/How To/Data Processing/load_data_from_athena.md +49 -0
  26. qtype/docs/How To/Data Processing/read_data_from_files.md +61 -0
  27. {docs → qtype/docs}/How To/Data Processing/read_sql_databases.md +2 -3
  28. {docs → qtype/docs}/How To/Data Processing/write_data_to_file.md +1 -2
  29. {docs → qtype/docs}/How To/Invoke Models/call_large_language_models.md +1 -1
  30. {docs → qtype/docs}/How To/Invoke Models/create_embeddings.md +1 -1
  31. {docs → qtype/docs}/How To/Invoke Models/reuse_prompts_with_templates.md +2 -3
  32. {docs → qtype/docs}/How To/Language Features/include_raw_text_from_other_files.md +2 -1
  33. {docs → qtype/docs}/How To/Language Features/reference_entities_by_id.md +2 -2
  34. qtype/docs/How To/Language Features/use_agent_skills.md +29 -0
  35. {docs → qtype/docs}/How To/Language Features/use_environment_variables.md +2 -1
  36. qtype/docs/How To/Language Features/use_optional_variables.md +42 -0
  37. {docs → qtype/docs}/How To/Language Features/use_qtype_mcp.md +4 -4
  38. {docs → qtype/docs}/How To/Observability & Debugging/trace_calls_with_open_telemetry.md +1 -1
  39. {docs → qtype/docs}/How To/Observability & Debugging/validate_qtype_yaml.md +3 -2
  40. {docs → qtype/docs}/How To/Observability & Debugging/visualize_application_architecture.md +1 -1
  41. {docs → qtype/docs}/How To/Qtype Server/serve_flows_as_apis.md +3 -3
  42. {docs → qtype/docs}/How To/Qtype Server/serve_flows_as_ui.md +2 -3
  43. {docs → qtype/docs}/How To/Qtype Server/use_conversational_interfaces.md +1 -4
  44. {docs → qtype/docs}/How To/Qtype Server/use_variables_with_ui_hints.md +3 -2
  45. {docs → qtype/docs}/How To/Tools & Integration/bind_tool_inputs_and_outputs.md +1 -2
  46. {docs → qtype/docs}/How To/Tools & Integration/create_tools_from_openapi_specifications.md +10 -14
  47. {docs → qtype/docs}/How To/Tools & Integration/create_tools_from_python_modules.md +5 -8
  48. {docs → qtype/docs}/Reference/cli.md +13 -15
  49. {docs → qtype/docs}/Reference/plugins.md +4 -0
  50. {docs → qtype/docs}/Reference/semantic-validation-rules.md +6 -1
  51. qtype/docs/Tutorials/.pages +1 -0
  52. {docs → qtype/docs}/Tutorials/01-first-qtype-application.md +3 -2
  53. {docs → qtype/docs}/Tutorials/02-conversational-chatbot.md +3 -3
  54. {docs → qtype/docs}/Tutorials/03-structured-data.md +9 -10
  55. {docs → qtype/docs}/Tutorials/04-tools-and-function-calling.md +12 -19
  56. {docs → qtype/docs}/components/APITool.md +1 -1
  57. qtype/docs/components/Aggregate.md +7 -0
  58. qtype/docs/components/Collect.md +6 -0
  59. qtype/docs/components/Construct.md +6 -0
  60. {docs → qtype/docs}/components/DocumentEmbedder.md +0 -1
  61. {docs → qtype/docs}/components/DocumentSplitter.md +0 -1
  62. qtype/docs/components/Explode.md +5 -0
  63. {docs → qtype/docs}/components/FieldExtractor.md +2 -1
  64. qtype/docs/components/InvokeFlow.md +8 -0
  65. qtype/docs/components/InvokeTool.md +8 -0
  66. {docs → qtype/docs}/components/PrimitiveTypeEnum.md +0 -1
  67. {docs → qtype/docs}/components/Source.md +0 -1
  68. {docs → qtype/docs}/components/Step.md +0 -1
  69. {docs → qtype/docs}/components/Tool.md +2 -2
  70. {docs → qtype/docs}/components/Variable.md +2 -0
  71. qtype/docs/legacy_how_tos/.pages +6 -0
  72. qtype/docs/skills/architect/SKILL.md +188 -0
  73. qtype/docs/skills/architect/references/cheatsheet.md +198 -0
  74. qtype/docs/skills/architect/references/patterns.md +29 -0
  75. qtype/docs/stylesheets/extra.css +27 -0
  76. qtype/dsl/linker.py +8 -0
  77. qtype/dsl/model.py +177 -84
  78. qtype/examples/data_processing/athena_query.qtype.yaml +56 -0
  79. qtype/examples/data_processing/batch_inputs.csv +5 -0
  80. qtype/examples/data_processing/create_sample_db.py +129 -0
  81. qtype/examples/data_processing/invoke_other_flows.qtype.yaml +98 -0
  82. qtype/examples/data_processing/reviews.db +0 -0
  83. qtype/examples/data_processing/sample_article.txt +1 -0
  84. qtype/examples/data_processing/sample_documents.jsonl +5 -0
  85. qtype/examples/language_features/optional_variables.qtype.yaml +32 -0
  86. qtype/examples/language_features/story_prompt.txt +6 -0
  87. qtype/examples/legacy/data/customers.csv +6 -0
  88. qtype/examples/legacy/echo/readme.md +29 -0
  89. qtype/examples/legacy/qtype_plugin_example.py +51 -0
  90. qtype/examples/legacy/sample_data.txt +43 -0
  91. qtype/examples/legacy/vertex/README.md +11 -0
  92. qtype/examples/research_assistant/tavily.qtype.yaml +216 -0
  93. {examples → qtype/examples}/tutorials/03_structured_data.qtype.yaml +2 -2
  94. {examples → qtype/examples}/tutorials/04_tools_and_function_calling.qtype.yaml +5 -5
  95. qtype/interpreter/base/stream_emitter.py +19 -13
  96. qtype/interpreter/converters.py +142 -26
  97. qtype/interpreter/executors/agent_executor.py +2 -3
  98. qtype/interpreter/executors/aggregate_executor.py +3 -4
  99. qtype/interpreter/executors/construct_executor.py +15 -15
  100. qtype/interpreter/executors/doc_to_text_executor.py +1 -3
  101. qtype/interpreter/executors/field_extractor_executor.py +13 -12
  102. qtype/interpreter/executors/file_source_executor.py +18 -31
  103. qtype/interpreter/executors/invoke_embedding_executor.py +1 -4
  104. qtype/interpreter/executors/invoke_flow_executor.py +2 -2
  105. qtype/interpreter/executors/invoke_tool_executor.py +19 -18
  106. qtype/interpreter/executors/llm_inference_executor.py +16 -18
  107. qtype/interpreter/executors/prompt_template_executor.py +1 -3
  108. qtype/interpreter/tools/function_tool_helper.py +11 -10
  109. qtype/interpreter/types.py +89 -4
  110. qtype/interpreter/typing.py +31 -32
  111. qtype/mcp/server.py +312 -57
  112. {schema → qtype/schema}/qtype.schema.json +77 -79
  113. qtype/semantic/checker.py +19 -0
  114. qtype/semantic/generate.py +3 -6
  115. qtype/semantic/model.py +26 -33
  116. qtype/semantic/resolver.py +7 -0
  117. qtype/semantic/visualize.py +8 -3
  118. {qtype-0.1.12.dist-info → qtype-0.1.13.dist-info}/METADATA +47 -46
  119. qtype-0.1.13.dist-info/RECORD +352 -0
  120. {qtype-0.1.12.dist-info → qtype-0.1.13.dist-info}/WHEEL +1 -2
  121. docs/How To/Data Processing/read_data_from_files.md +0 -35
  122. docs/components/Aggregate.md +0 -8
  123. docs/components/InvokeFlow.md +0 -8
  124. docs/components/InvokeTool.md +0 -8
  125. docs/components/ToolParameter.md +0 -6
  126. examples/research_assistant/tavily.qtype.yaml +0 -289
  127. qtype/application/facade.py +0 -177
  128. qtype-0.1.12.dist-info/RECORD +0 -325
  129. qtype-0.1.12.dist-info/top_level.txt +0 -1
  130. {docs → qtype/docs}/Contributing/roadmap.md +0 -0
  131. {docs → qtype/docs}/Decisions/ADR-001-Chat-vs-Completion-Endpoint-Features.md +0 -0
  132. {docs → qtype/docs}/Gallery/dataflow_pipelines.mermaid +0 -0
  133. {docs → qtype/docs}/Gallery/research_assistant.mermaid +0 -0
  134. {docs → qtype/docs}/Gallery/simple_chatbot.mermaid +0 -0
  135. {docs → qtype/docs}/How To/Language Features/include_qtype_yaml.md +0 -0
  136. {docs → qtype/docs}/How To/Observability & Debugging/visualize_example.mermaid +0 -0
  137. {docs → qtype/docs}/How To/Qtype Server/flow_as_ui.png +0 -0
  138. {docs → qtype/docs}/Tutorials/example_chat.png +0 -0
  139. {docs → qtype/docs}/Tutorials/index.md +0 -0
  140. {docs → qtype/docs}/components/APIKeyAuthProvider.md +0 -0
  141. {docs → qtype/docs}/components/AWSAuthProvider.md +0 -0
  142. {docs → qtype/docs}/components/AWSSecretManager.md +0 -0
  143. {docs → qtype/docs}/components/Agent.md +0 -0
  144. {docs → qtype/docs}/components/AggregateStats.md +0 -0
  145. {docs → qtype/docs}/components/Application.md +0 -0
  146. {docs → qtype/docs}/components/AuthorizationProvider.md +0 -0
  147. {docs → qtype/docs}/components/AuthorizationProviderList.md +0 -0
  148. {docs → qtype/docs}/components/BearerTokenAuthProvider.md +0 -0
  149. {docs → qtype/docs}/components/BedrockReranker.md +0 -0
  150. {docs → qtype/docs}/components/ChatContent.md +0 -0
  151. {docs → qtype/docs}/components/ChatMessage.md +0 -0
  152. {docs → qtype/docs}/components/ConstantPath.md +0 -0
  153. {docs → qtype/docs}/components/CustomType.md +0 -0
  154. {docs → qtype/docs}/components/Decoder.md +0 -0
  155. {docs → qtype/docs}/components/DecoderFormat.md +0 -0
  156. {docs → qtype/docs}/components/DocToTextConverter.md +0 -0
  157. {docs → qtype/docs}/components/Document.md +0 -0
  158. {docs → qtype/docs}/components/DocumentIndex.md +0 -0
  159. {docs → qtype/docs}/components/DocumentSearch.md +0 -0
  160. {docs → qtype/docs}/components/DocumentSource.md +0 -0
  161. {docs → qtype/docs}/components/Echo.md +0 -0
  162. {docs → qtype/docs}/components/Embedding.md +0 -0
  163. {docs → qtype/docs}/components/EmbeddingModel.md +0 -0
  164. {docs → qtype/docs}/components/FileSource.md +0 -0
  165. {docs → qtype/docs}/components/FileWriter.md +0 -0
  166. {docs → qtype/docs}/components/Flow.md +0 -0
  167. {docs → qtype/docs}/components/FlowInterface.md +0 -0
  168. {docs → qtype/docs}/components/Index.md +0 -0
  169. {docs → qtype/docs}/components/IndexUpsert.md +0 -0
  170. {docs → qtype/docs}/components/InvokeEmbedding.md +0 -0
  171. {docs → qtype/docs}/components/LLMInference.md +0 -0
  172. {docs → qtype/docs}/components/ListType.md +0 -0
  173. {docs → qtype/docs}/components/Memory.md +0 -0
  174. {docs → qtype/docs}/components/MessageRole.md +0 -0
  175. {docs → qtype/docs}/components/Model.md +0 -0
  176. {docs → qtype/docs}/components/ModelList.md +0 -0
  177. {docs → qtype/docs}/components/OAuth2AuthProvider.md +0 -0
  178. {docs → qtype/docs}/components/PromptTemplate.md +0 -0
  179. {docs → qtype/docs}/components/PythonFunctionTool.md +0 -0
  180. {docs → qtype/docs}/components/RAGChunk.md +0 -0
  181. {docs → qtype/docs}/components/RAGDocument.md +0 -0
  182. {docs → qtype/docs}/components/RAGSearchResult.md +0 -0
  183. {docs → qtype/docs}/components/Reranker.md +0 -0
  184. {docs → qtype/docs}/components/SQLSource.md +0 -0
  185. {docs → qtype/docs}/components/Search.md +0 -0
  186. {docs → qtype/docs}/components/SearchResult.md +0 -0
  187. {docs → qtype/docs}/components/SecretManager.md +0 -0
  188. {docs → qtype/docs}/components/SecretReference.md +0 -0
  189. {docs → qtype/docs}/components/TelemetrySink.md +0 -0
  190. {docs → qtype/docs}/components/ToolList.md +0 -0
  191. {docs → qtype/docs}/components/TypeList.md +0 -0
  192. {docs → qtype/docs}/components/VariableList.md +0 -0
  193. {docs → qtype/docs}/components/VectorIndex.md +0 -0
  194. {docs → qtype/docs}/components/VectorSearch.md +0 -0
  195. {docs → qtype/docs}/components/VertexAuthProvider.md +0 -0
  196. {docs → qtype/docs}/components/Writer.md +0 -0
  197. {docs → qtype/docs}/example_ui.png +0 -0
  198. {docs → qtype/docs}/index.md +0 -0
  199. {docs → qtype/docs}/legacy_how_tos/Configuration/modular-yaml.md +0 -0
  200. {docs → qtype/docs}/legacy_how_tos/Configuration/phoenix_projects.png +0 -0
  201. {docs → qtype/docs}/legacy_how_tos/Configuration/phoenix_traces.png +0 -0
  202. {docs → qtype/docs}/legacy_how_tos/Configuration/reference-by-id.md +0 -0
  203. {docs → qtype/docs}/legacy_how_tos/Configuration/telemetry-setup.md +0 -0
  204. {docs → qtype/docs}/legacy_how_tos/Data Types/custom-types.md +0 -0
  205. {docs → qtype/docs}/legacy_how_tos/Data Types/domain-types.md +0 -0
  206. {docs → qtype/docs}/legacy_how_tos/Debugging/visualize-apps.md +0 -0
  207. {docs → qtype/docs}/legacy_how_tos/Tools/api-tools.md +0 -0
  208. {docs → qtype/docs}/legacy_how_tos/Tools/python-tools.md +0 -0
  209. {examples → qtype/examples}/authentication/aws_authentication.qtype.yaml +0 -0
  210. {examples → qtype/examples}/conversational_ai/hello_world_chat.qtype.yaml +0 -0
  211. {examples → qtype/examples}/conversational_ai/simple_chatbot.qtype.yaml +0 -0
  212. {examples → qtype/examples}/data_processing/batch_processing.qtype.yaml +0 -0
  213. {examples → qtype/examples}/data_processing/cache_step_results.qtype.yaml +0 -0
  214. {examples → qtype/examples}/data_processing/collect_results.qtype.yaml +0 -0
  215. {examples → qtype/examples}/data_processing/dataflow_pipelines.qtype.yaml +0 -0
  216. {examples → qtype/examples}/data_processing/decode_json.qtype.yaml +0 -0
  217. {examples → qtype/examples}/data_processing/explode_items.qtype.yaml +0 -0
  218. {examples → qtype/examples}/data_processing/read_file.qtype.yaml +0 -0
  219. {examples → qtype/examples}/invoke_models/create_embeddings.qtype.yaml +0 -0
  220. {examples → qtype/examples}/invoke_models/simple_llm_call.qtype.yaml +0 -0
  221. {examples → qtype/examples}/language_features/include_raw.qtype.yaml +0 -0
  222. {examples → qtype/examples}/language_features/ui_hints.qtype.yaml +0 -0
  223. {examples → qtype/examples}/legacy/bedrock/data_analysis_with_telemetry.qtype.yaml +0 -0
  224. {examples → qtype/examples}/legacy/bedrock/hello_world.qtype.yaml +0 -0
  225. {examples → qtype/examples}/legacy/bedrock/hello_world_chat.qtype.yaml +0 -0
  226. {examples → qtype/examples}/legacy/bedrock/hello_world_chat_with_telemetry.qtype.yaml +0 -0
  227. {examples → qtype/examples}/legacy/bedrock/hello_world_chat_with_thinking.qtype.yaml +0 -0
  228. {examples → qtype/examples}/legacy/bedrock/hello_world_completion.qtype.yaml +0 -0
  229. {examples → qtype/examples}/legacy/bedrock/hello_world_completion_with_auth.qtype.yaml +0 -0
  230. {examples → qtype/examples}/legacy/bedrock/simple_agent_chat.qtype.yaml +0 -0
  231. {examples → qtype/examples}/legacy/chat_with_langfuse.qtype.yaml +0 -0
  232. {examples → qtype/examples}/legacy/data_processor.qtype.yaml +0 -0
  233. {examples → qtype/examples}/legacy/echo/debug_example.qtype.yaml +0 -0
  234. {examples → qtype/examples}/legacy/echo/prompt.qtype.yaml +0 -0
  235. {examples → qtype/examples}/legacy/echo/test.qtype.yaml +0 -0
  236. {examples → qtype/examples}/legacy/echo/video.qtype.yaml +0 -0
  237. {examples → qtype/examples}/legacy/field_extractor_example.qtype.yaml +0 -0
  238. {examples → qtype/examples}/legacy/multi_flow_example.qtype.yaml +0 -0
  239. {examples → qtype/examples}/legacy/openai/hello_world_chat.qtype.yaml +0 -0
  240. {examples → qtype/examples}/legacy/openai/hello_world_chat_with_telemetry.qtype.yaml +0 -0
  241. {examples → qtype/examples}/legacy/rag.qtype.yaml +0 -0
  242. {examples → qtype/examples}/legacy/time_utilities.qtype.yaml +0 -0
  243. {examples → qtype/examples}/legacy/vertex/hello_world_chat.qtype.yaml +0 -0
  244. {examples → qtype/examples}/legacy/vertex/hello_world_completion.qtype.yaml +0 -0
  245. {examples → qtype/examples}/legacy/vertex/hello_world_completion_with_auth.qtype.yaml +0 -0
  246. {examples → qtype/examples}/observability_debugging/trace_with_opentelemetry.qtype.yaml +0 -0
  247. {examples → qtype/examples}/research_assistant/research_assistant.qtype.yaml +0 -0
  248. {examples → qtype/examples}/research_assistant/tavily.oas.yaml +0 -0
  249. {examples → qtype/examples}/tutorials/01_hello_world.qtype.yaml +0 -0
  250. {examples → qtype/examples}/tutorials/02_conversational_chat.qtype.yaml +0 -0
  251. {qtype-0.1.12.dist-info → qtype-0.1.13.dist-info}/entry_points.txt +0 -0
  252. {qtype-0.1.12.dist-info → qtype-0.1.13.dist-info}/licenses/LICENSE +0 -0
@@ -68,20 +68,20 @@
68
68
  "type": "string"
69
69
  },
70
70
  "inputs": {
71
- "additionalProperties": {
72
- "$ref": "#/$defs/ToolParameter"
73
- },
74
71
  "description": "Input parameters required by this tool.",
72
+ "items": {
73
+ "$ref": "#/$defs/Variable"
74
+ },
75
75
  "title": "Inputs",
76
- "type": "object"
76
+ "type": "array"
77
77
  },
78
78
  "outputs": {
79
- "additionalProperties": {
80
- "$ref": "#/$defs/ToolParameter"
81
- },
82
79
  "description": "Output parameters produced by this tool.",
80
+ "items": {
81
+ "$ref": "#/$defs/Variable"
82
+ },
83
83
  "title": "Outputs",
84
- "type": "object"
84
+ "type": "array"
85
85
  },
86
86
  "type": {
87
87
  "const": "APITool",
@@ -125,12 +125,12 @@
125
125
  "type": "object"
126
126
  },
127
127
  "parameters": {
128
- "additionalProperties": {
129
- "$ref": "#/$defs/ToolParameter"
128
+ "description": "Path and query parameters for the API call.",
129
+ "items": {
130
+ "$ref": "#/$defs/Variable"
130
131
  },
131
- "description": "Output parameters produced by this tool.",
132
132
  "title": "Parameters",
133
- "type": "object"
133
+ "type": "array"
134
134
  }
135
135
  },
136
136
  "required": [
@@ -439,7 +439,7 @@
439
439
  },
440
440
  "Aggregate": {
441
441
  "additionalProperties": false,
442
- "description": "A terminal step that consumes an entire input stream and produces a single\nsummary message with success/error counts.",
442
+ "description": "A step that, after all messages have been processed,\nreturns a single message containing the counts of successful and failed\nmessages. Other messages are passed through unchanged.",
443
443
  "properties": {
444
444
  "cache_config": {
445
445
  "anyOf": [
@@ -480,7 +480,7 @@
480
480
  "type": "array"
481
481
  },
482
482
  "outputs": {
483
- "description": "References to the variables for the output. There should be one and only one output with type AggregateStats",
483
+ "description": "References to the variables where output is stored.",
484
484
  "items": {
485
485
  "anyOf": [
486
486
  {
@@ -1084,18 +1084,25 @@
1084
1084
  "title": "Outputs",
1085
1085
  "type": "array"
1086
1086
  },
1087
- "field_mapping": {
1087
+ "field_bindings": {
1088
1088
  "additionalProperties": {
1089
- "type": "string"
1089
+ "anyOf": [
1090
+ {
1091
+ "$ref": "#/$defs/Reference_Variable_"
1092
+ },
1093
+ {
1094
+ "type": "string"
1095
+ }
1096
+ ]
1090
1097
  },
1091
- "description": "Mapping of type inputs to variable names, if needed.",
1092
- "title": "Field Mapping",
1098
+ "description": "Mapping from type field names to flow variable names.",
1099
+ "title": "Field Bindings",
1093
1100
  "type": "object"
1094
1101
  }
1095
1102
  },
1096
1103
  "required": [
1097
1104
  "id",
1098
- "field_mapping"
1105
+ "field_bindings"
1099
1106
  ],
1100
1107
  "title": "Construct",
1101
1108
  "type": "object"
@@ -1962,7 +1969,7 @@
1962
1969
  },
1963
1970
  "FieldExtractor": {
1964
1971
  "additionalProperties": false,
1965
- "description": "Extracts specific fields from input data using JSONPath expressions.\n\nThis step uses JSONPath syntax to extract data from structured inputs\n(Pydantic models, dicts, lists). The input is first converted to a dict\nusing model_dump() if it's a Pydantic model, then the JSONPath expression\nis evaluated.\n\nIf the JSONPath matches multiple values, the step yields multiple output\nmessages (1-to-many cardinality). If it matches a single value, it yields\none output message. If it matches nothing, it raises an error.\n\nThe extracted data is used to construct the output variable by passing it\nas keyword arguments to the output type's constructor.\n\nExample JSONPath expressions:\n- `$.field_name` - Extract a single field\n- `$.items[*]` - Extract all items from a list\n- `$.items[?(@.price > 10)]` - Filter items by condition",
1972
+ "description": "Extracts specific fields from input data using JSONPath expressions.\n\nThis step uses JSONPath syntax to extract data from structured inputs\n(Pydantic models, dicts, lists). The input is first converted to a dict\nusing model_dump() if it's a Pydantic model, then the JSONPath expression\nis evaluated.\n\nIf the JSONPath matches multiple values, the step yields multiple output\nmessages (1-to-many cardinality). If it matches a single value, it yields\none output message. If it matches nothing, it raises an error.\n\nThe extracted data is used to construct the output variable by passing it\nas keyword arguments to the output type's constructor.\n\nIf there is no match and the output variable is optional, it is set to None.\nIf there is no match and the output variable is required, an error is raised.\n\nExample JSONPath expressions:\n- `$.field_name` - Extract a single field\n- `$.items[*]` - Extract all items from a list\n- `$.items[?(@.price > 10)]` - Filter items by condition",
1966
1973
  "properties": {
1967
1974
  "cache_config": {
1968
1975
  "anyOf": [
@@ -2021,12 +2028,6 @@
2021
2028
  "description": "JSONPath expression to extract data from the input. Uses jsonpath-ng syntax.",
2022
2029
  "title": "Json Path",
2023
2030
  "type": "string"
2024
- },
2025
- "fail_on_missing": {
2026
- "default": true,
2027
- "description": "Whether to raise an error if the JSONPath matches no data. If False, returns None.",
2028
- "title": "Fail On Missing",
2029
- "type": "boolean"
2030
2031
  }
2031
2032
  },
2032
2033
  "required": [
@@ -2678,23 +2679,31 @@
2678
2679
  },
2679
2680
  "input_bindings": {
2680
2681
  "additionalProperties": {
2681
- "type": "string"
2682
- },
2683
- "description": "Mapping from variable references to flow input variable IDs.",
2684
- "propertyNames": {
2685
- "$ref": "#/$defs/Reference_Variable_"
2682
+ "anyOf": [
2683
+ {
2684
+ "$ref": "#/$defs/Reference_Variable_"
2685
+ },
2686
+ {
2687
+ "type": "string"
2688
+ }
2689
+ ]
2686
2690
  },
2691
+ "description": "Mapping from flow input variable IDs to step variable names.",
2687
2692
  "title": "Input Bindings",
2688
2693
  "type": "object"
2689
2694
  },
2690
2695
  "output_bindings": {
2691
2696
  "additionalProperties": {
2692
- "type": "string"
2693
- },
2694
- "description": "Mapping from variable references to flow output variable IDs.",
2695
- "propertyNames": {
2696
- "$ref": "#/$defs/Reference_Variable_"
2697
+ "anyOf": [
2698
+ {
2699
+ "$ref": "#/$defs/Reference_Variable_"
2700
+ },
2701
+ {
2702
+ "type": "string"
2703
+ }
2704
+ ]
2697
2705
  },
2706
+ "description": "Mapping from flow output variable IDs to step variable names.",
2698
2707
  "title": "Output Bindings",
2699
2708
  "type": "object"
2700
2709
  }
@@ -2783,17 +2792,31 @@
2783
2792
  },
2784
2793
  "input_bindings": {
2785
2794
  "additionalProperties": {
2786
- "type": "string"
2795
+ "anyOf": [
2796
+ {
2797
+ "$ref": "#/$defs/Reference_Variable_"
2798
+ },
2799
+ {
2800
+ "type": "string"
2801
+ }
2802
+ ]
2787
2803
  },
2788
- "description": "Mapping from variable references to tool input parameter names.",
2804
+ "description": "Mapping from tool parameter names to flow variable names.",
2789
2805
  "title": "Input Bindings",
2790
2806
  "type": "object"
2791
2807
  },
2792
2808
  "output_bindings": {
2793
2809
  "additionalProperties": {
2794
- "type": "string"
2810
+ "anyOf": [
2811
+ {
2812
+ "$ref": "#/$defs/Reference_Variable_"
2813
+ },
2814
+ {
2815
+ "type": "string"
2816
+ }
2817
+ ]
2795
2818
  },
2796
- "description": "Mapping from variable references to tool output parameter names.",
2819
+ "description": "Mapping from tool output names to flow variable names.",
2797
2820
  "title": "Output Bindings",
2798
2821
  "type": "object"
2799
2822
  }
@@ -3230,20 +3253,20 @@
3230
3253
  "type": "string"
3231
3254
  },
3232
3255
  "inputs": {
3233
- "additionalProperties": {
3234
- "$ref": "#/$defs/ToolParameter"
3235
- },
3236
3256
  "description": "Input parameters required by this tool.",
3257
+ "items": {
3258
+ "$ref": "#/$defs/Variable"
3259
+ },
3237
3260
  "title": "Inputs",
3238
- "type": "object"
3261
+ "type": "array"
3239
3262
  },
3240
3263
  "outputs": {
3241
- "additionalProperties": {
3242
- "$ref": "#/$defs/ToolParameter"
3243
- },
3244
3264
  "description": "Output parameters produced by this tool.",
3265
+ "items": {
3266
+ "$ref": "#/$defs/Variable"
3267
+ },
3245
3268
  "title": "Outputs",
3246
- "type": "object"
3269
+ "type": "array"
3247
3270
  },
3248
3271
  "type": {
3249
3272
  "const": "PythonFunctionTool",
@@ -3658,37 +3681,6 @@
3658
3681
  "title": "ToolList",
3659
3682
  "type": "array"
3660
3683
  },
3661
- "ToolParameter": {
3662
- "description": "Defines a tool input or output parameter with type and optional flag.",
3663
- "properties": {
3664
- "type": {
3665
- "anyOf": [
3666
- {
3667
- "$ref": "#/$defs/PrimitiveTypeEnum"
3668
- },
3669
- {},
3670
- {
3671
- "$ref": "#/$defs/ListType"
3672
- },
3673
- {
3674
- "type": "string"
3675
- }
3676
- ],
3677
- "title": "Type"
3678
- },
3679
- "optional": {
3680
- "default": false,
3681
- "description": "Whether this parameter is optional",
3682
- "title": "Optional",
3683
- "type": "boolean"
3684
- }
3685
- },
3686
- "required": [
3687
- "type"
3688
- ],
3689
- "title": "ToolParameter",
3690
- "type": "object"
3691
- },
3692
3684
  "TypeList": {
3693
3685
  "description": "Schema for a standalone list of type definitions.",
3694
3686
  "items": {
@@ -3722,6 +3714,12 @@
3722
3714
  "description": "Type of data expected or produced. Either a CustomType or domain specific type.",
3723
3715
  "title": "Type"
3724
3716
  },
3717
+ "optional": {
3718
+ "default": false,
3719
+ "description": "Whether this variable can be unset or None. Use '?' suffix in type string as shorthand (e.g., 'text?').",
3720
+ "title": "Optional",
3721
+ "type": "boolean"
3722
+ },
3725
3723
  "ui": {
3726
3724
  "anyOf": [
3727
3725
  {
qtype/semantic/checker.py CHANGED
@@ -50,6 +50,10 @@ class FlowHasNoStepsError(QTypeValidationError):
50
50
  # Alias for backward compatibility and semantic clarity
51
51
  QTypeSemanticError = SemanticError
52
52
 
53
+ # Step types that support text streaming
54
+ # These are the only step types that can produce streaming text output
55
+ STREAMING_STEP_TYPES = (LLMInference, Agent)
56
+
53
57
 
54
58
  # ---- Helper Functions for Common Validation Patterns ----
55
59
 
@@ -543,6 +547,21 @@ def _validate_flow(flow: Flow) -> None:
543
547
  f"Flow {flow.id} has a Complete interface but {len(text_outputs)} text outputs -- there should be 1."
544
548
  )
545
549
 
550
+ # Ensure the final step supports streaming for Complete interface
551
+ if flow.steps:
552
+ final_step = flow.steps[-1]
553
+ if not isinstance(final_step, STREAMING_STEP_TYPES):
554
+ streaming_type_names = ", ".join(
555
+ t.__name__ for t in STREAMING_STEP_TYPES
556
+ )
557
+ raise QTypeSemanticError(
558
+ (
559
+ f"Flow {flow.id} has a Complete interface which requires streaming output, "
560
+ f"but the final step '{final_step.id}' is of type '{final_step.type}' which does not support streaming. "
561
+ f"The final step must be one of: {streaming_type_names}."
562
+ )
563
+ )
564
+
546
565
 
547
566
  def _has_secret_reference(obj: Any) -> bool:
548
567
  """
@@ -144,8 +144,7 @@ def generate_semantic_model(args: argparse.Namespace) -> None:
144
144
  CustomType,
145
145
  DecoderFormat,
146
146
  ListType,
147
- PrimitiveTypeEnum,
148
- ToolParameter
147
+ PrimitiveTypeEnum
149
148
  )
150
149
  from qtype.dsl.model import Variable as DSLVariable # noqa: F401
151
150
  from qtype.dsl.model import VariableType # noqa: F401
@@ -158,10 +157,8 @@ def generate_semantic_model(args: argparse.Namespace) -> None:
158
157
  f.write(
159
158
  dedent('''
160
159
  class Variable(DSLVariable, BaseModel):
161
- """Semantic version of DSL Variable with ID references resolved."""
162
- value: Any | None = Field(None, description="The value of the variable")
163
- def is_set(self) -> bool:
164
- return self.value is not None
160
+ """Semantic version of DSL Variable."""
161
+ pass
165
162
 
166
163
  ''').lstrip()
167
164
  )
qtype/semantic/model.py CHANGED
@@ -32,19 +32,15 @@ from qtype.dsl.model import ( # noqa: F401
32
32
  DecoderFormat,
33
33
  ListType,
34
34
  PrimitiveTypeEnum,
35
- ToolParameter,
36
35
  )
37
36
  from qtype.dsl.model import Variable as DSLVariable # noqa: F401
38
37
  from qtype.semantic.base_types import ImmutableModel
39
38
 
40
39
 
41
40
  class Variable(DSLVariable, BaseModel):
42
- """Semantic version of DSL Variable with ID references resolved."""
41
+ """Semantic version of DSL Variable."""
43
42
 
44
- value: Any | None = Field(None, description="The value of the variable")
45
-
46
- def is_set(self) -> bool:
47
- return self.value is not None
43
+ pass
48
44
 
49
45
 
50
46
  class AuthorizationProvider(ImmutableModel):
@@ -66,12 +62,12 @@ class Tool(ImmutableModel):
66
62
  description: str = Field(
67
63
  ..., description="Description of what the tool does."
68
64
  )
69
- inputs: dict[str, ToolParameter] = Field(
70
- default_factory=dict,
65
+ inputs: list[Variable] = Field(
66
+ default_factory=list,
71
67
  description="Input parameters required by this tool.",
72
68
  )
73
- outputs: dict[str, ToolParameter] = Field(
74
- default_factory=dict,
69
+ outputs: list[Variable] = Field(
70
+ default_factory=list,
75
71
  description="Output parameters produced by this tool.",
76
72
  )
77
73
 
@@ -421,9 +417,9 @@ class APITool(Tool):
421
417
  default_factory=dict,
422
418
  description="Optional HTTP headers to include in the request.",
423
419
  )
424
- parameters: dict[str, ToolParameter] = Field(
425
- default_factory=dict,
426
- description="Output parameters produced by this tool.",
420
+ parameters: list[Variable] = Field(
421
+ default_factory=list,
422
+ description="Path and query parameters for the API call.",
427
423
  )
428
424
 
429
425
 
@@ -447,15 +443,12 @@ class AWSSecretManager(SecretManager):
447
443
 
448
444
  class Aggregate(Step):
449
445
  """
450
- A terminal step that consumes an entire input stream and produces a single
451
- summary message with success/error counts.
446
+ A step that, after all messages have been processed,
447
+ returns a single message containing the counts of successful and failed
448
+ messages. Other messages are passed through unchanged.
452
449
  """
453
450
 
454
451
  type: Literal["Aggregate"] = Field("Aggregate")
455
- outputs: list[Variable] = Field(
456
- default_factory=list,
457
- description="References to the variables for the output. There should be one and only one output with type AggregateStats",
458
- )
459
452
 
460
453
 
461
454
  class Collect(Step, BatchableStepMixin):
@@ -472,8 +465,9 @@ class Construct(Step):
472
465
  """A step that converts variables into an instance of a Custom or Domain Type"""
473
466
 
474
467
  type: Literal["Construct"] = Field("Construct")
475
- field_mapping: dict[str, str] = Field(
476
- ..., description="Mapping of type inputs to variable names, if needed."
468
+ field_bindings: dict[str, Variable] = Field(
469
+ ...,
470
+ description="Mapping from type field names to flow variable names.",
477
471
  )
478
472
 
479
473
 
@@ -558,6 +552,9 @@ class FieldExtractor(Step):
558
552
  The extracted data is used to construct the output variable by passing it
559
553
  as keyword arguments to the output type's constructor.
560
554
 
555
+ If there is no match and the output variable is optional, it is set to None.
556
+ If there is no match and the output variable is required, an error is raised.
557
+
561
558
  Example JSONPath expressions:
562
559
  - `$.field_name` - Extract a single field
563
560
  - `$.items[*]` - Extract all items from a list
@@ -569,10 +566,6 @@ class FieldExtractor(Step):
569
566
  ...,
570
567
  description="JSONPath expression to extract data from the input. Uses jsonpath-ng syntax.",
571
568
  )
572
- fail_on_missing: bool = Field(
573
- True,
574
- description="Whether to raise an error if the JSONPath matches no data. If False, returns None.",
575
- )
576
569
 
577
570
 
578
571
  class InvokeEmbedding(Step, ConcurrentStepMixin):
@@ -590,13 +583,13 @@ class InvokeFlow(Step):
590
583
 
591
584
  type: Literal["InvokeFlow"] = Field("InvokeFlow")
592
585
  flow: Flow = Field(..., description="Flow to invoke.")
593
- input_bindings: dict[Variable, str] = Field(
586
+ input_bindings: dict[str, Variable] = Field(
594
587
  ...,
595
- description="Mapping from variable references to flow input variable IDs.",
588
+ description="Mapping from flow input variable IDs to step variable names.",
596
589
  )
597
- output_bindings: dict[Variable, str] = Field(
590
+ output_bindings: dict[str, Variable] = Field(
598
591
  ...,
599
- description="Mapping from variable references to flow output variable IDs.",
592
+ description="Mapping from flow output variable IDs to step variable names.",
600
593
  )
601
594
 
602
595
 
@@ -605,13 +598,13 @@ class InvokeTool(Step, ConcurrentStepMixin):
605
598
 
606
599
  type: Literal["InvokeTool"] = Field("InvokeTool")
607
600
  tool: Tool = Field(..., description="Tool to invoke.")
608
- input_bindings: dict[str, str] = Field(
601
+ input_bindings: dict[str, Variable] = Field(
609
602
  ...,
610
- description="Mapping from variable references to tool input parameter names.",
603
+ description="Mapping from tool parameter names to flow variable names.",
611
604
  )
612
- output_bindings: dict[str, str] = Field(
605
+ output_bindings: dict[str, Variable] = Field(
613
606
  ...,
614
- description="Mapping from variable references to tool output parameter names.",
607
+ description="Mapping from tool output names to flow variable names.",
615
608
  )
616
609
 
617
610
 
@@ -71,6 +71,13 @@ def to_semantic_ir(
71
71
  # If the object is already in the symbol table, return it.
72
72
  return symbol_table[obj_id]
73
73
 
74
+ if isinstance(dslobj, dict):
75
+ # If the object is a dict, recursively resolve each value
76
+ return {
77
+ key: to_semantic_ir(value, symbol_table)
78
+ for key, value in dslobj.items()
79
+ }
80
+
74
81
  if isinstance(dslobj, list):
75
82
  # If the object is a list, we will resolve each item in the list.
76
83
  return [to_semantic_ir(item, symbol_table) for item in dslobj] # type: ignore
@@ -21,6 +21,7 @@ from qtype.semantic.model import (
21
21
  DocumentIndex,
22
22
  DocumentSearch,
23
23
  Flow,
24
+ InvokeFlow,
24
25
  InvokeTool,
25
26
  LLMInference,
26
27
  Memory,
@@ -168,10 +169,14 @@ def _generate_step_node(
168
169
  lines = []
169
170
  external_connections = []
170
171
 
171
- if isinstance(step, Flow):
172
- # Nested flow
172
+ if isinstance(step, InvokeFlow):
173
173
  lines.append(
174
- f' {node_id}@{{shape: subproc, label: "📋 {step.id}"}}'
174
+ f' {node_id}@{{shape: sub-r, label: "🔄 {step.id}"}}'
175
+ )
176
+ # Connect to the invoked flow
177
+ invoked_flow_id = f"FLOW_{_sanitize_id(step.flow.id)}"
178
+ external_connections.append(
179
+ f" {node_id} -.->|invokes| {invoked_flow_id}"
175
180
  )
176
181
  elif isinstance(step, Agent):
177
182
  # Agent with tools
@@ -1,60 +1,61 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qtype
3
- Version: 0.1.12
3
+ Version: 0.1.13
4
4
  Summary: DSL for Generative AI Prototyping
5
+ Project-URL: Homepage, https://github.com/bazaarvoice/qtype
5
6
  Author-email: Lou Kratz <lou.kratz+qtype@bazaarvoice.com>
6
7
  License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://github.com/bazaarvoice/qtype
8
- Requires-Python: >=3.10
9
- Description-Content-Type: text/markdown
10
8
  License-File: LICENSE
11
- Requires-Dist: jsonschema>=4.24.0
12
- Requires-Dist: pydantic>=2.12.4
13
- Requires-Dist: pyyaml>=6.0.2
14
- Requires-Dist: python-dotenv>=1.0.0
15
- Requires-Dist: openai>=1.93.0
9
+ Requires-Python: >=3.10
16
10
  Requires-Dist: fsspec>=2025.5.1
11
+ Requires-Dist: google-cloud-aiplatform>=1.120.0
12
+ Requires-Dist: jsonschema>=4.24.0
17
13
  Requires-Dist: mkdocs-awesome-pages-plugin>=2.10.1
18
- Requires-Dist: pip-system-certs>=5.2
14
+ Requires-Dist: openai>=1.93.0
19
15
  Requires-Dist: openapi3-parser>=1.1.21
16
+ Requires-Dist: pip-system-certs>=5.2
20
17
  Requires-Dist: pydantic-yaml>=1.6.0
21
- Requires-Dist: google-cloud-aiplatform>=1.120.0
18
+ Requires-Dist: pydantic>=2.12.4
19
+ Requires-Dist: python-dotenv>=1.0.0
20
+ Requires-Dist: pyyaml>=6.0.2
22
21
  Provides-Extra: interpreter
23
- Requires-Dist: aiostream>=0.7.1; extra == "interpreter"
24
- Requires-Dist: arize-phoenix-otel>=0.12.1; extra == "interpreter"
25
- Requires-Dist: boto3>=1.34.0; extra == "interpreter"
26
- Requires-Dist: datasets>=4.4.1; extra == "interpreter"
27
- Requires-Dist: diskcache>=5.6.3; extra == "interpreter"
28
- Requires-Dist: docling>=2.55.1; extra == "interpreter"
29
- Requires-Dist: docx2txt>=0.9; extra == "interpreter"
30
- Requires-Dist: fastapi>=0.116.1; extra == "interpreter"
31
- Requires-Dist: jsonpath-ng>=1.7.0; extra == "interpreter"
32
- Requires-Dist: langfuse>=3.9.0; extra == "interpreter"
33
- Requires-Dist: llama-index-embeddings-bedrock>=0.5.2; extra == "interpreter"
34
- Requires-Dist: llama-index-embeddings-openai>=0.3.1; extra == "interpreter"
35
- Requires-Dist: llama-index-llms-bedrock-converse>=0.10.5; extra == "interpreter"
36
- Requires-Dist: llama-index-llms-bedrock>=0.3.8; extra == "interpreter"
37
- Requires-Dist: llama-index-llms-vertex>=0.6.1; extra == "interpreter"
38
- Requires-Dist: llama-index-postprocessor-bedrock-rerank>=0.5.1; extra == "interpreter"
39
- Requires-Dist: llama-index-readers-huggingface-fs>=0.4.1; extra == "interpreter"
40
- Requires-Dist: llama-index-vector-stores-qdrant>=0.8.6; extra == "interpreter"
41
- Requires-Dist: llama-index>=0.12.45; extra == "interpreter"
42
- Requires-Dist: openinference-instrumentation-llama-index>=4.3.4; extra == "interpreter"
43
- Requires-Dist: opensearch-py>=2.7.0; extra == "interpreter"
44
- Requires-Dist: opentelemetry-exporter-otlp>=1.35.0; extra == "interpreter"
45
- Requires-Dist: opentelemetry-sdk>=1.35.0; extra == "interpreter"
46
- Requires-Dist: pandas>=2.2.3; extra == "interpreter"
47
- Requires-Dist: psycopg2-binary>=2.9.10; extra == "interpreter"
48
- Requires-Dist: pyarrow>=21.0.0; extra == "interpreter"
49
- Requires-Dist: pyathena[sqlalchemy]>=3.18.0; extra == "interpreter"
50
- Requires-Dist: python-magic>=0.4.27; extra == "interpreter"
51
- Requires-Dist: s3fs>=2025.7.0; extra == "interpreter"
52
- Requires-Dist: sqlalchemy>=2.0.42; extra == "interpreter"
53
- Requires-Dist: uvicorn[standard]>=0.35.0; extra == "interpreter"
22
+ Requires-Dist: aiostream>=0.7.1; extra == 'interpreter'
23
+ Requires-Dist: arize-phoenix-otel>=0.12.1; extra == 'interpreter'
24
+ Requires-Dist: boto3>=1.34.0; extra == 'interpreter'
25
+ Requires-Dist: datasets>=4.4.1; extra == 'interpreter'
26
+ Requires-Dist: diskcache>=5.6.3; extra == 'interpreter'
27
+ Requires-Dist: docling>=2.55.1; extra == 'interpreter'
28
+ Requires-Dist: docx2txt>=0.9; extra == 'interpreter'
29
+ Requires-Dist: fastapi>=0.116.1; extra == 'interpreter'
30
+ Requires-Dist: jsonpath-ng>=1.7.0; extra == 'interpreter'
31
+ Requires-Dist: langfuse>=3.9.0; extra == 'interpreter'
32
+ Requires-Dist: llama-index-embeddings-bedrock>=0.5.2; extra == 'interpreter'
33
+ Requires-Dist: llama-index-embeddings-openai>=0.3.1; extra == 'interpreter'
34
+ Requires-Dist: llama-index-llms-bedrock-converse>=0.10.5; extra == 'interpreter'
35
+ Requires-Dist: llama-index-llms-bedrock>=0.3.8; extra == 'interpreter'
36
+ Requires-Dist: llama-index-llms-vertex>=0.6.1; extra == 'interpreter'
37
+ Requires-Dist: llama-index-postprocessor-bedrock-rerank>=0.5.1; extra == 'interpreter'
38
+ Requires-Dist: llama-index-readers-huggingface-fs>=0.4.1; extra == 'interpreter'
39
+ Requires-Dist: llama-index-vector-stores-qdrant>=0.8.6; extra == 'interpreter'
40
+ Requires-Dist: llama-index>=0.12.45; extra == 'interpreter'
41
+ Requires-Dist: openinference-instrumentation-llama-index>=4.3.4; extra == 'interpreter'
42
+ Requires-Dist: opensearch-py>=2.7.0; extra == 'interpreter'
43
+ Requires-Dist: opentelemetry-exporter-otlp>=1.35.0; extra == 'interpreter'
44
+ Requires-Dist: opentelemetry-sdk>=1.35.0; extra == 'interpreter'
45
+ Requires-Dist: pandas>=2.2.3; extra == 'interpreter'
46
+ Requires-Dist: psycopg2-binary>=2.9.10; extra == 'interpreter'
47
+ Requires-Dist: pyarrow>=21.0.0; extra == 'interpreter'
48
+ Requires-Dist: pyathena[sqlalchemy]>=3.18.0; extra == 'interpreter'
49
+ Requires-Dist: python-magic>=0.4.27; extra == 'interpreter'
50
+ Requires-Dist: s3fs>=2025.7.0; extra == 'interpreter'
51
+ Requires-Dist: sqlalchemy>=2.0.42; extra == 'interpreter'
52
+ Requires-Dist: uvicorn[standard]>=0.35.0; extra == 'interpreter'
54
53
  Provides-Extra: mcp
55
- Requires-Dist: httpx>=0.28.1; extra == "mcp"
56
- Requires-Dist: mcp[cli]>=1.25.0; extra == "mcp"
57
- Dynamic: license-file
54
+ Requires-Dist: cachetools>=6.2.1; extra == 'mcp'
55
+ Requires-Dist: httpx>=0.28.1; extra == 'mcp'
56
+ Requires-Dist: mcp[cli]>=1.25.0; extra == 'mcp'
57
+ Requires-Dist: tantivy>=0.25.1; extra == 'mcp'
58
+ Description-Content-Type: text/markdown
58
59
 
59
60
  # QType
60
61
 
@@ -178,4 +179,4 @@ Stay tuned for upcoming features like:
178
179
  Happy hacking with QType! 🛠️
179
180
 
180
181
 
181
- [![Generate JSON Schema](https://github.com/bazaarvoice/qtype/actions/workflows/github_workflows_generate-schema.yml/badge.svg)](https://github.com/bazaarvoice/qtype/actions/workflows/github_workflows_generate-schema.yml) [![Publish to PyPI](https://github.com/bazaarvoice/qtype/actions/workflows/publish-pypi.yml/badge.svg)](https://github.com/bazaarvoice/qtype/actions/workflows/publish-pypi.yml)
182
+ [![Generate JSON Schema](https://github.com/bazaarvoice/qtype/actions/workflows/github_workflows_generate-schema.yml/badge.svg)](https://github.com/bazaarvoice/qtype/actions/workflows/github_workflows_generate-schema.yml) [![Publish to PyPI](https://github.com/bazaarvoice/qtype/actions/workflows/publish-pypi.yml/badge.svg)](https://github.com/bazaarvoice/qtype/actions/workflows/publish-pypi.yml)