qtype 0.1.1__py3-none-any.whl → 0.1.2__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.
qtype/interpreter/flow.py CHANGED
@@ -1,6 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import json
3
4
  import logging
5
+ from collections.abc import AsyncIterator
4
6
 
5
7
  from openinference.semconv.trace import (
6
8
  OpenInferenceSpanKindValues,
@@ -21,7 +23,7 @@ logger = logging.getLogger(__name__)
21
23
 
22
24
  async def run_flow(
23
25
  flow: Flow,
24
- initial: list[FlowMessage] | FlowMessage,
26
+ initial: list[FlowMessage] | AsyncIterator[FlowMessage] | FlowMessage,
25
27
  show_progress: bool = False,
26
28
  **kwargs,
27
29
  ) -> list[FlowMessage]:
@@ -77,38 +79,38 @@ async def run_flow(
77
79
  # 1. Get the execution plan is just the steps in order
78
80
  execution_plan = flow.steps
79
81
 
80
- # 2. Initialize the stream
81
- if not isinstance(initial, list):
82
+ # 2. Convert the initial input to an iterable of some kind. Record telemetry if possible.
83
+ if isinstance(initial, FlowMessage):
84
+ span.set_attribute("flow.input_count", 1)
85
+ input_vars = {k: v for k, v in initial.variables.items()}
86
+ span.set_attribute(
87
+ SpanAttributes.INPUT_VALUE,
88
+ json.dumps(input_vars, default=str),
89
+ )
90
+ span.set_attribute(
91
+ SpanAttributes.INPUT_MIME_TYPE, "application/json"
92
+ )
82
93
  initial = [initial]
83
94
 
84
- span.set_attribute("flow.input_count", len(initial))
85
-
86
- # Record input variables for observability
87
- if initial:
88
- import json
89
-
90
- try:
91
- input_vars = {
92
- k: v for msg in initial for k, v in msg.variables.items()
93
- }
94
- span.set_attribute(
95
- SpanAttributes.INPUT_VALUE,
96
- json.dumps(input_vars, default=str),
97
- )
98
- span.set_attribute(
99
- SpanAttributes.INPUT_MIME_TYPE, "application/json"
100
- )
101
- except Exception:
102
- # If serialization fails, skip it
103
- pass
95
+ if isinstance(initial, list):
96
+ span.set_attribute("flow.input_count", len(initial))
104
97
 
105
- async def initial_stream():
106
- for message in initial:
107
- yield message
98
+ # convert to async iterator
99
+ async def list_stream():
100
+ for message in initial:
101
+ yield message
108
102
 
109
- current_stream = initial_stream()
103
+ current_stream = list_stream()
104
+ elif isinstance(initial, AsyncIterator):
105
+ # We can't know the count ahead of time
106
+ current_stream = initial
107
+ else:
108
+ raise ValueError(
109
+ "Initial input must be a FlowMessage, list of FlowMessages, "
110
+ "or AsyncIterator of FlowMessages"
111
+ )
110
112
 
111
- # 3. Chain executors together in the main loop
113
+ # 4. Chain executors together in the main loop
112
114
  for step in execution_plan:
113
115
  executor = factory.create_executor(step, exec_context, **kwargs)
114
116
  output_stream = executor.execute(
@@ -116,7 +118,7 @@ async def run_flow(
116
118
  )
117
119
  current_stream = output_stream
118
120
 
119
- # 4. Collect the final results from the last stream
121
+ # 5. Collect the final results from the last stream
120
122
  final_results = [state async for state in current_stream]
121
123
 
122
124
  # Close the progress bars if any
@@ -128,9 +130,7 @@ async def run_flow(
128
130
  span.set_attribute("flow.error_count", error_count)
129
131
 
130
132
  # Record output variables for observability
131
- if final_results:
132
- import json
133
-
133
+ if len(final_results) == 1 and span.is_recording():
134
134
  try:
135
135
  output_vars = {
136
136
  k: v
@@ -167,6 +167,9 @@ async def run_flow(
167
167
  span.set_status(Status(StatusCode.ERROR, f"Flow failed: {e}"))
168
168
  raise
169
169
  finally:
170
+ # Clean up context resources if we created it
171
+ if kwargs.get("context") is None:
172
+ exec_context.cleanup()
170
173
  # Detach the context and end the span
171
174
  # Only detach if we successfully attached (span was recording)
172
175
  if token is not None:
qtype/semantic/checker.py CHANGED
@@ -10,6 +10,7 @@ from qtype.dsl.model import AWSAuthProvider
10
10
  from qtype.semantic.model import (
11
11
  Agent,
12
12
  Application,
13
+ BedrockReranker,
13
14
  Decoder,
14
15
  DocToTextConverter,
15
16
  DocumentEmbedder,
@@ -20,11 +21,13 @@ from qtype.semantic.model import (
20
21
  FieldExtractor,
21
22
  Flow,
22
23
  IndexUpsert,
24
+ ListType,
23
25
  LLMInference,
24
26
  PromptTemplate,
25
27
  SecretReference,
26
28
  SQLSource,
27
29
  Step,
30
+ VectorIndex,
28
31
  VectorSearch,
29
32
  )
30
33
 
@@ -323,21 +326,29 @@ def _validate_document_embedder(step: DocumentEmbedder) -> None:
323
326
 
324
327
 
325
328
  def _validate_index_upsert(step: IndexUpsert) -> None:
326
- """Validate IndexUpsert has exactly one input of type RAGChunk or RAGDocument."""
327
- _validate_exact_input_count(step, 1)
328
- input_type = step.inputs[0].type
329
- if input_type not in (RAGChunk, RAGDocument):
330
- raise QTypeSemanticError(
331
- (
332
- f"IndexUpsert step '{step.id}' input must be of type "
333
- f"'RAGChunk' or 'RAGDocument', found '{input_type}'."
329
+ if isinstance(step.index, VectorIndex):
330
+ # Validate IndexUpsert has exactly one input of type RAGChunk or RAGDocument.
331
+ _validate_exact_input_count(step, 1)
332
+ input_type = step.inputs[0].type
333
+ if input_type not in (RAGChunk, RAGDocument):
334
+ raise QTypeSemanticError(
335
+ (
336
+ f"IndexUpsert step '{step.id}' on Vector Index '{step.index.id}' input must be of type "
337
+ f"'RAGChunk' or 'RAGDocument', found '{input_type}'."
338
+ )
339
+ )
340
+ else:
341
+ # Document index upsert just stores all variables in the message
342
+ if len(step.inputs) < 1:
343
+ raise QTypeSemanticError(
344
+ (
345
+ f"IndexUpsert step '{step.id}' on Document Index '{step.index.id}' must have at least one input."
346
+ )
334
347
  )
335
- )
336
348
 
337
349
 
338
350
  def _validate_vector_search(step: VectorSearch) -> None:
339
351
  """Validate VectorSearch has exactly one text input and one list[RAGSearchResult] output."""
340
- from qtype.dsl.model import ListType
341
352
 
342
353
  _validate_exact_input_count(step, 1, PrimitiveTypeEnum.text)
343
354
  _validate_exact_output_count(
@@ -347,7 +358,28 @@ def _validate_vector_search(step: VectorSearch) -> None:
347
358
 
348
359
  def _validate_document_search(step: DocumentSearch) -> None:
349
360
  """Validate DocumentSearch has exactly one text input for the query."""
361
+ from qtype.dsl.model import ListType
362
+
350
363
  _validate_exact_input_count(step, 1, PrimitiveTypeEnum.text)
364
+ _validate_exact_output_count(
365
+ step, 1, ListType(element_type="SearchResult")
366
+ )
367
+ # TODO: Restore below when ready to decompose into RAG search results for hybrid search
368
+ # actual_type = step.outputs[0].type
369
+ # acceptable_types = set(
370
+ # [
371
+ # ListType(element_type="RAGSearchResult"),
372
+ # ListType(element_type="SearchResult"),
373
+ # ]
374
+ # )
375
+ # if actual_type not in acceptable_types:
376
+ # raise QTypeSemanticError(
377
+ # (
378
+ # f"DocumentSearch step '{step.id}' output must be of type "
379
+ # f"'list[RAGSearchResult]' or 'list[SearchResult]', found "
380
+ # f"'{actual_type}'."
381
+ # )
382
+ # )
351
383
 
352
384
 
353
385
  def _validate_flow(flow: Flow) -> None:
@@ -523,25 +555,53 @@ def _validate_application(application: Application) -> None:
523
555
  )
524
556
 
525
557
 
558
+ def _validate_bedrock_reranker(reranker: BedrockReranker) -> None:
559
+ """Validate BedrockReranker configuration."""
560
+ _validate_exact_output_count(
561
+ reranker, 1, ListType(element_type="SearchResult")
562
+ )
563
+ _validate_exact_input_count(reranker, 2)
564
+ # Confirm at least one input is text (the query)
565
+ input_types = [inp.type for inp in reranker.inputs] # type: ignore
566
+ if PrimitiveTypeEnum.text not in input_types:
567
+ raise QTypeSemanticError(
568
+ (
569
+ f"BedrockReranker step '{reranker.id}' must have at least one "
570
+ f"input of type 'text' for the query, found input types: "
571
+ f"{input_types}."
572
+ )
573
+ )
574
+ # Confirm at least one input is list[SearchResult] (the results to rerank)
575
+ if ListType(element_type="SearchResult") not in input_types:
576
+ raise QTypeSemanticError(
577
+ (
578
+ f"BedrockReranker step '{reranker.id}' must have at least one "
579
+ f"input of type 'list[SearchResult]' for the results to rerank, "
580
+ f"found input types: {input_types}."
581
+ )
582
+ )
583
+
584
+
526
585
  # Mapping of types to their validation functions
527
586
  _VALIDATORS = {
528
587
  Agent: _validate_agent,
529
588
  Application: _validate_application,
530
- PromptTemplate: _validate_prompt_template,
531
589
  AWSAuthProvider: _validate_aws_auth,
532
- LLMInference: _validate_llm_inference,
590
+ BedrockReranker: _validate_bedrock_reranker,
533
591
  Decoder: _validate_decoder,
534
- Echo: _validate_echo,
535
- FieldExtractor: _validate_field_extractor,
536
- SQLSource: _validate_sql_source,
537
- DocumentSource: _validate_document_source,
538
592
  DocToTextConverter: _validate_doc_to_text_converter,
539
- DocumentSplitter: _validate_document_splitter,
540
593
  DocumentEmbedder: _validate_document_embedder,
541
- IndexUpsert: _validate_index_upsert,
542
- VectorSearch: _validate_vector_search,
543
594
  DocumentSearch: _validate_document_search,
595
+ DocumentSource: _validate_document_source,
596
+ DocumentSplitter: _validate_document_splitter,
597
+ Echo: _validate_echo,
598
+ FieldExtractor: _validate_field_extractor,
544
599
  Flow: _validate_flow,
600
+ IndexUpsert: _validate_index_upsert,
601
+ LLMInference: _validate_llm_inference,
602
+ PromptTemplate: _validate_prompt_template,
603
+ SQLSource: _validate_sql_source,
604
+ VectorSearch: _validate_vector_search,
545
605
  }
546
606
 
547
607
 
qtype/semantic/model.py CHANGED
@@ -558,6 +558,10 @@ class FieldExtractor(Step):
558
558
  ...,
559
559
  description="JSONPath expression to extract data from the input. Uses jsonpath-ng syntax.",
560
560
  )
561
+ fail_on_missing: bool = Field(
562
+ True,
563
+ description="Whether to raise an error if the JSONPath matches no data. If False, returns None.",
564
+ )
561
565
 
562
566
 
563
567
  class InvokeEmbedding(Step, ConcurrentStepMixin):
@@ -627,6 +631,12 @@ class PromptTemplate(Step):
627
631
  )
628
632
 
629
633
 
634
+ class Reranker(Step):
635
+ """Reranks a list of documents based on relevance to a query using an LLM."""
636
+
637
+ type: Literal["Reranker"] = Field("Reranker")
638
+
639
+
630
640
  class Search(Step):
631
641
  """Base class for search operations against indexes."""
632
642
 
@@ -637,6 +647,10 @@ class Search(Step):
637
647
  index: Index = Field(
638
648
  ..., description="Index to search against (object or ID reference)."
639
649
  )
650
+ default_top_k: int | None = Field(
651
+ 10,
652
+ description="Number of top results to retrieve if not provided in the inputs.",
653
+ )
640
654
 
641
655
 
642
656
  class Source(Step):
@@ -663,6 +677,10 @@ class DocumentIndex(Index):
663
677
  ...,
664
678
  description="URL endpoint for the search cluster (e.g., https://my-cluster.es.amazonaws.com).",
665
679
  )
680
+ id_field: str | None = Field(
681
+ None,
682
+ description="Field name to use as document ID. If not specified, auto-detects from: _id, id, doc_id, document_id, or uuid. If all are missing, a UUID is generated.",
683
+ )
666
684
 
667
685
 
668
686
  class VectorIndex(Index):
@@ -699,19 +717,41 @@ class Agent(LLMInference):
699
717
  )
700
718
 
701
719
 
720
+ class BedrockReranker(Reranker, ConcurrentStepMixin):
721
+ """Reranks documents using an AWS Bedrock model."""
722
+
723
+ type: Literal["BedrockReranker"] = Field("BedrockReranker")
724
+ auth: AWSAuthProvider | None = Field(
725
+ None, description="AWS authorization provider for Bedrock access."
726
+ )
727
+ model_id: str = Field(
728
+ ...,
729
+ description="Bedrock model ID to use for reranking. See https://docs.aws.amazon.com/bedrock/latest/userguide/rerank-supported.html",
730
+ )
731
+ num_results: int | None = Field(
732
+ None, description="Return this many results."
733
+ )
734
+
735
+
702
736
  class DocumentSearch(Search, ConcurrentStepMixin):
703
737
  """Performs document search against a document index."""
704
738
 
705
739
  type: Literal["DocumentSearch"] = Field("DocumentSearch")
740
+ index: DocumentIndex = Field(
741
+ ..., description="Index to search against (object or ID reference)."
742
+ )
743
+ query_args: dict[str, Any] = Field(
744
+ {"type": "best_fields", "fields": ["*"]},
745
+ description="The arguments (other than 'query') to specify to the query shape (see https://docs.opensearch.org/latest/query-dsl/full-text/multi-match/).",
746
+ )
706
747
 
707
748
 
708
749
  class VectorSearch(Search, BatchableStepMixin):
709
750
  """Performs vector similarity search against a vector index."""
710
751
 
711
752
  type: Literal["VectorSearch"] = Field("VectorSearch")
712
- default_top_k: int | None = Field(
713
- 50,
714
- description="Number of top results to retrieve if not provided in the inputs.",
753
+ index: VectorIndex = Field(
754
+ ..., description="Index to search against (object or ID reference)."
715
755
  )
716
756
 
717
757
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qtype
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: DSL for Generative AI Prototyping
5
5
  Author-email: Lou Kratz <lou.kratz+qtype@bazaarvoice.com>
6
6
  License-Expression: Apache-2.0
@@ -23,16 +23,26 @@ Provides-Extra: interpreter
23
23
  Requires-Dist: aiostream>=0.7.1; extra == "interpreter"
24
24
  Requires-Dist: arize-phoenix-otel>=0.12.1; extra == "interpreter"
25
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"
26
28
  Requires-Dist: docling>=2.55.1; extra == "interpreter"
27
- Requires-Dist: diskcache[interpreter]>=5.6.3; extra == "interpreter"
29
+ Requires-Dist: docx2txt>=0.9; extra == "interpreter"
28
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"
29
33
  Requires-Dist: llama-index-embeddings-bedrock>=0.5.2; extra == "interpreter"
30
34
  Requires-Dist: llama-index-embeddings-openai>=0.3.1; extra == "interpreter"
31
35
  Requires-Dist: llama-index-llms-bedrock-converse>=0.10.5; extra == "interpreter"
32
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"
33
41
  Requires-Dist: llama-index>=0.12.45; extra == "interpreter"
34
42
  Requires-Dist: openinference-instrumentation-llama-index>=4.3.4; extra == "interpreter"
35
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"
36
46
  Requires-Dist: pandas>=2.2.3; extra == "interpreter"
37
47
  Requires-Dist: psycopg2-binary>=2.9.10; extra == "interpreter"
38
48
  Requires-Dist: pyarrow>=21.0.0; extra == "interpreter"
@@ -41,15 +51,6 @@ Requires-Dist: python-magic>=0.4.27; extra == "interpreter"
41
51
  Requires-Dist: s3fs>=2025.7.0; extra == "interpreter"
42
52
  Requires-Dist: sqlalchemy>=2.0.42; extra == "interpreter"
43
53
  Requires-Dist: uvicorn[standard]>=0.35.0; extra == "interpreter"
44
- Requires-Dist: llama-index-llms-vertex>=0.6.1; extra == "interpreter"
45
- Requires-Dist: langfuse>=3.9.0; extra == "interpreter"
46
- Requires-Dist: opentelemetry-exporter-otlp>=1.35.0; extra == "interpreter"
47
- Requires-Dist: opentelemetry-sdk>=1.35.0; extra == "interpreter"
48
- Requires-Dist: docx2txt>=0.9; extra == "interpreter"
49
- Requires-Dist: llama-index-vector-stores-qdrant>=0.8.6; extra == "interpreter"
50
- Requires-Dist: jsonpath-ng>=1.7.0; extra == "interpreter"
51
- Requires-Dist: llama-index-readers-huggingface-fs>=0.4.1; extra == "interpreter"
52
- Requires-Dist: datasets>=4.4.1; extra == "interpreter"
53
54
  Dynamic: license-file
54
55
 
55
56
  # QType
@@ -1,8 +1,8 @@
1
1
  qtype/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- qtype/cli.py,sha256=JUieGAeKQ_8Q2LXZKScYIL__IXtJFu1D-huEyJk9_g0,4783
2
+ qtype/cli.py,sha256=AC2i9dROss5JsEhbaRpIz4kHVvm0Tq-ope3ENL8Qw5w,4797
3
3
  qtype/application/__init__.py,sha256=WS3x0b0NRt-nRmj1trsytlvMpQS5KN7Hi6THGfY8bKE,230
4
4
  qtype/application/documentation.py,sha256=ifmdt0jBW410baQuCUxovYDQQj-kxPZ4fmf6rWps9JY,4988
5
- qtype/application/facade.py,sha256=Qw378AV5hR93LWfO-etvXo8qyZwfQo9x0geUaBmHg_A,5795
5
+ qtype/application/facade.py,sha256=JjexkpTzP-aAJHs4AaxJbB4CU10jn3zcPFpQ6FYWJFg,5803
6
6
  qtype/application/commons/__init__.py,sha256=QyWAB2cvimM4DxNo2oBFCGkfBikH-ZeMBMGWmJcq4Uc,135
7
7
  qtype/application/commons/tools.py,sha256=U_jJdVN2NO5v9b3qb6dPIiVykfal6tp6NvcLGWR6HC8,5035
8
8
  qtype/application/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -15,25 +15,25 @@ qtype/base/logging.py,sha256=eqStjILlmhNryYRqUiyTdDHoUoiLKSY8J0GevvzvTKQ,1075
15
15
  qtype/base/types.py,sha256=zkweSHfpP6MrDEHzEpEWTZ-xVxQLZJj1QhKv-Mj4s0A,6834
16
16
  qtype/commands/__init__.py,sha256=Qo4M07zm5I63r8STxDjvt5fhP1jygdXTsExNGELkefc,257
17
17
  qtype/commands/convert.py,sha256=wh2-MSBlnMU5peAzVeQcGqqFzQbeCuL5WC5-EDZ-TFM,4636
18
- qtype/commands/generate.py,sha256=v_k_CN0ub-_18rquvX_B366K4bec1aFLnLO9Bp-NfRc,7287
19
- qtype/commands/run.py,sha256=uSh6_BxBY0mYpE7u26hpm_QTMAkauxAs1P2y5moMXUw,6303
18
+ qtype/commands/generate.py,sha256=OQEkuh3dTVu6ZUNAuH_HkU-9YktYySL0qjTdrz28FY8,7285
19
+ qtype/commands/run.py,sha256=rDIiDioWU-dNuw39F12Bb6buknsNGzzVhd41i9Yms8Y,6633
20
20
  qtype/commands/serve.py,sha256=lb5akSZ8fYLlCl8u8HDFFk6kyCHHwSRnP5wNzZry8sg,3216
21
21
  qtype/commands/validate.py,sha256=f0aOk6A08910bFfamfg8xafByADMx4EktXAGMrEeUXU,3067
22
22
  qtype/commands/visualize.py,sha256=J1eqwaVWTteGzib84g7Qtp0JlX9wIMmRQWSv1RhAns8,3763
23
23
  qtype/dsl/__init__.py,sha256=clrmM1ZlK6c0Le_183eo5bc9dDK53Ebp-vH5ZVfwhfw,397
24
24
  qtype/dsl/custom_types.py,sha256=N3qswimv0foH40YDubHaTZ3HYF9RUbZ2x5eQ4i798Ko,2901
25
- qtype/dsl/domain_types.py,sha256=7NH0UGqOW-DbNvJa5mErbJtpZzTHRnC1EVrQm0Uz950,3663
25
+ qtype/dsl/domain_types.py,sha256=-pX74DKwrRanoXBxYqAdN_f44ike6ssRV3tZ20R2PhQ,4319
26
26
  qtype/dsl/linker.py,sha256=c7PPTULy7_z_9u_qeseIaomR_B8kBa9YzOhQpjeGaSM,12975
27
27
  qtype/dsl/loader.py,sha256=mht0BqfmyTNHIEDaF3iTEmYQLJBP5GIZULwexxw9Dpg,9771
28
- qtype/dsl/model.py,sha256=--aSrcsH1ZjWCDqfagViTENzxPxRZfmCDNAVGnwxeqM,38964
28
+ qtype/dsl/model.py,sha256=0yKl3fKAWQ_BDH-z62oI47IiJQhaH6HFzYRD1tUZhME,40860
29
29
  qtype/dsl/parser.py,sha256=jpz32zyvOIo-R6Xr1lshzQiGfeo-2-fZczkdfURBufo,5487
30
30
  qtype/dsl/types.py,sha256=k6cgThA287bZ_pvTKQvxWhatcYCPNne8zpqOYOvLvOg,1687
31
31
  qtype/interpreter/__init__.py,sha256=IaRF90JLFbsTLKz9LTOMI_Pz4xwVaEyXPNaXV7sLou8,43
32
32
  qtype/interpreter/api.py,sha256=V7hjsmDhe1IwbcwdM5bnPGBiwH3TtlMLjUJdGJumCdA,4193
33
- qtype/interpreter/conversions.py,sha256=m5MKMystF5mK6SCqkX2W636Y71JN74mDYX2a7Z1miSs,20862
34
- qtype/interpreter/converters.py,sha256=90TkXZrZyq24fJUimacK3avg2TywspoMk7oPj-1Wtc8,2170
33
+ qtype/interpreter/conversions.py,sha256=SHtVVN8k36_iODKvHt1MV6V08GRaEBwE4yCN6VQvlHA,20986
34
+ qtype/interpreter/converters.py,sha256=gWyfizl7d-DT6jJ2aOrneUcZcwB-LdMDEvl-VT0-mLQ,2348
35
35
  qtype/interpreter/endpoints.py,sha256=un4iCYCk86lYKpTDFdzlByvebdctNwRF3n4oD4ZwpTw,11946
36
- qtype/interpreter/flow.py,sha256=7UaZtB_K26-CTZTcqzK5YGtUDANOZKfVFWfHpuTzyQQ,5728
36
+ qtype/interpreter/flow.py,sha256=eitRE1Hh6avmMzjLKKcrWztviSzJHFu4yZSbtIeMLQ0,6188
37
37
  qtype/interpreter/metadata_api.py,sha256=LfJjt9atsgiAra6aVBXLoJrPa06_CBUagYysT556nt8,3267
38
38
  qtype/interpreter/resource_cache.py,sha256=K0kzpm223COWk7FN9qyOvNOEoOcABR4yLeADL9ekE_o,1188
39
39
  qtype/interpreter/rich_progress.py,sha256=J7TokOIqIUVWJZCfGEexQCwvvj6b1SjRtKThk2DU0CA,6761
@@ -47,25 +47,26 @@ qtype/interpreter/auth/generic.py,sha256=WHXu3SxWzxJn_bv6R20Aod84Vwe73xTYHx754dY
47
47
  qtype/interpreter/base/base_step_executor.py,sha256=DFQOwRVXStxPLov-unG4IXq-iBQ66JVPeetNnUcdlZ8,16497
48
48
  qtype/interpreter/base/batch_step_executor.py,sha256=g5_yPd5VTy_slW5ZXyamgFyTRd0CoaeVfDHj8x4PvUk,5906
49
49
  qtype/interpreter/base/exceptions.py,sha256=7CIexzDfIjvAA0c6qwg4jsDcTQM1pKQLj6szxcqil_c,1586
50
- qtype/interpreter/base/executor_context.py,sha256=s_EiNURd7uDkUdOvuVC0u7zuWDGV89r4ppMFOC0C1m0,2839
51
- qtype/interpreter/base/factory.py,sha256=vpMvqVmBCrdJKbizEkjqNNDbq8d-CKsAEXiNX7PrJRM,3823
50
+ qtype/interpreter/base/executor_context.py,sha256=qDMb7GJebCw3E6oMiCSpu0-aRq-l6MPx6yPLwM2quOs,3561
51
+ qtype/interpreter/base/factory.py,sha256=9etq_vvds-C9QrwVutkPZmGwrMJ_WZwrkeXOzjOUEpk,3534
52
52
  qtype/interpreter/base/progress_tracker.py,sha256=zHtTp0JGrn1M3wNEEVfkwQmuHD-WKXV7tv4fDdHv1xs,3488
53
53
  qtype/interpreter/base/secrets.py,sha256=74NoU0Fx96vva6LGWXk7EkvFWD4uZEk12NjWrGHWZTc,11241
54
54
  qtype/interpreter/base/step_cache.py,sha256=iNtEFN-bvfG5S5iPhXR_U7iVtK-RWh9_nhCRetckukU,2432
55
55
  qtype/interpreter/base/stream_emitter.py,sha256=8l5bCFTjMA3Takjh51QdWw8ERb7_GamHVoU-x6xkG5I,13828
56
56
  qtype/interpreter/executors/agent_executor.py,sha256=pll5tdUD977fmMMfoXVhY-dLQttv-aqT04gyjrF6seo,8378
57
57
  qtype/interpreter/executors/aggregate_executor.py,sha256=Z3NJekpeo7aqqvOcXQqb6d6t9g4UB1r3N1lSV9EwZq4,3495
58
+ qtype/interpreter/executors/bedrock_reranker_executor.py,sha256=p25BMmM1paAlK2vfpwJ9T5st_2B-bmZoDnVFp9ynZIY,7154
58
59
  qtype/interpreter/executors/decoder_executor.py,sha256=KqLhnhiclMIcUNf3bu7H4vDAOXCQeVO0rc2hIXm1qZ4,5610
59
60
  qtype/interpreter/executors/doc_to_text_executor.py,sha256=ZkTtKUL0BfNIiuj-OcYybn1f0By6ujRmd1U4VEAtJt4,3804
60
61
  qtype/interpreter/executors/document_embedder_executor.py,sha256=wvARlFPb2dmMdxjW8L1422a-XmcUVxEJXWf24bDR9BE,3529
61
- qtype/interpreter/executors/document_search_executor.py,sha256=q_z8Lhl6jlIRt2I8NaINUiygr9T7nuz_tpRS6OowrvQ,4507
62
+ qtype/interpreter/executors/document_search_executor.py,sha256=ZmKAt__jC5cxZY0gSm9AgpC6n7MFavTHE01tQED3zFk,4051
62
63
  qtype/interpreter/executors/document_source_executor.py,sha256=ZpBrBaE16YeRk750TxvE08NnCIUzArjESZImESomaIo,4247
63
64
  qtype/interpreter/executors/document_splitter_executor.py,sha256=2mzrkkNqsPb5erDUd_VapnrykgywMXGXZnkWT1YJe_w,3815
64
65
  qtype/interpreter/executors/echo_executor.py,sha256=oQUgzQTHruT4on7wgEBOcikwOy6KP82d5zrul5QLoRU,2194
65
- qtype/interpreter/executors/field_extractor_executor.py,sha256=M7sPFR89PiAF0vU5veaAE8N130SeC0WGPNO1t3yV5dM,5551
66
+ qtype/interpreter/executors/field_extractor_executor.py,sha256=geDmT6GyvbDDJvPX1hPChAydDZ_LSHlOdskK-6ZGvbI,5796
66
67
  qtype/interpreter/executors/file_source_executor.py,sha256=OUT_zJrYN3iFMUgLECde93C4rv8PthcQsuJ--CJvEsI,3605
67
68
  qtype/interpreter/executors/file_writer_executor.py,sha256=x4BpgdXM7Xhz1tJJ5MmBIjFO4y80VC1V1ow3tox_Xrw,4099
68
- qtype/interpreter/executors/index_upsert_executor.py,sha256=YsEYqDg8GeD7gKcBtBTqykRYt0eE5ZYYM66o0A1EjVI,8170
69
+ qtype/interpreter/executors/index_upsert_executor.py,sha256=5MxG3GX2bbjX6jhCpCdEZ0YFJOshn649cfaOT50PLCA,8518
69
70
  qtype/interpreter/executors/invoke_embedding_executor.py,sha256=OPvd--x8iimjODLJkRpRfQDahL8LnYaPy3A8WVB5h00,3311
70
71
  qtype/interpreter/executors/invoke_flow_executor.py,sha256=U30cYM3F_zy1_2CD1Dde59xyZD0rDa5W46lST1hxF6s,1682
71
72
  qtype/interpreter/executors/invoke_tool_executor.py,sha256=hhbE8YTr0x5-kz_xsvdWGGzkLkVdvDoAVAF-3ZUK5as,12786
@@ -121,15 +122,15 @@ qtype/interpreter/ui/_next/static/media/9610d9e46709d722-s.woff2,sha256=N08hXnJf
121
122
  qtype/interpreter/ui/_next/static/media/ba015fad6dcf6784-s.woff2,sha256=92BKU6ACUPZttLR91EMnzipD9u3shQ1SF7uAI4gZ790,15292
122
123
  qtype/semantic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
124
  qtype/semantic/base_types.py,sha256=wfUlT0gV3_Mk1xLLI64SSXCB9GFmn29yz5adTaHrsOI,1540
124
- qtype/semantic/checker.py,sha256=B23bFmSISFgmL9ji_0QOFuTaSF55xLZNPDwyCXm1Z8U,19906
125
+ qtype/semantic/checker.py,sha256=TJTxSIMXNERpry98jqFNd8Ga5ljTvHOVosYb0AYbpbc,22291
125
126
  qtype/semantic/generate.py,sha256=s56N0ollRJVVxy6RUKZWFFReKYcSSVw33ixvT2MQRuA,21116
126
127
  qtype/semantic/loader.py,sha256=QRhTc_AJfsWSMn8ThaW60GmIGjFMN-3bBUy4pktFjz4,3041
127
- qtype/semantic/model.py,sha256=OMScGFp1FMe8k_yWFhFs5yJW67fKL75BrZDUBmPT9aI,26981
128
+ qtype/semantic/model.py,sha256=7yZ-Ufuo-gNJbhFXALuKZxILdhNB5zbL3a3oQQARI8g,28602
128
129
  qtype/semantic/resolver.py,sha256=bWPCSB8KJpVqN_n41U_r-qzUiT8vAMBOD3pOGmxL6TY,4618
129
130
  qtype/semantic/visualize.py,sha256=thjrZcfQuZJWrZ9EMAPhAa2kNikR5rLIJrfcD3hJ8XY,17426
130
- qtype-0.1.1.dist-info/licenses/LICENSE,sha256=1KA5EgYBSR0O6nCH2HEvk6Di53YKJ9r_VCR7G8G8qAY,11341
131
- qtype-0.1.1.dist-info/METADATA,sha256=PHlAs091t8uOXO0YXWlcjLzkbp64bj2QzKLssVz9SFw,5583
132
- qtype-0.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
133
- qtype-0.1.1.dist-info/entry_points.txt,sha256=5y4vj8RLvgl2tXSj-Hm7v5-Tn3kP4-UonjNoN-mfaQE,41
134
- qtype-0.1.1.dist-info/top_level.txt,sha256=ONroH5B0mZ51jr7NSWCK0weFwwCO7wBLmyVS1YqNU14,6
135
- qtype-0.1.1.dist-info/RECORD,,
131
+ qtype-0.1.2.dist-info/licenses/LICENSE,sha256=1KA5EgYBSR0O6nCH2HEvk6Di53YKJ9r_VCR7G8G8qAY,11341
132
+ qtype-0.1.2.dist-info/METADATA,sha256=lxoxEpkpLqsOuf7OIqjBliN6tq0YlUUXwfvty3CxGdk,5657
133
+ qtype-0.1.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
134
+ qtype-0.1.2.dist-info/entry_points.txt,sha256=5y4vj8RLvgl2tXSj-Hm7v5-Tn3kP4-UonjNoN-mfaQE,41
135
+ qtype-0.1.2.dist-info/top_level.txt,sha256=ONroH5B0mZ51jr7NSWCK0weFwwCO7wBLmyVS1YqNU14,6
136
+ qtype-0.1.2.dist-info/RECORD,,
File without changes