qtype 0.1.3__py3-none-any.whl → 0.1.9__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 (74) hide show
  1. qtype/base/types.py +1 -9
  2. qtype/base/ui_shapes.py +38 -0
  3. qtype/dsl/model.py +45 -19
  4. qtype/dsl/parser.py +3 -3
  5. qtype/interpreter/base/base_step_executor.py +10 -10
  6. qtype/interpreter/base/factory.py +6 -0
  7. qtype/interpreter/base/step_cache.py +3 -3
  8. qtype/interpreter/conversions.py +32 -7
  9. qtype/interpreter/executors/agent_executor.py +1 -2
  10. qtype/interpreter/executors/bedrock_reranker_executor.py +1 -2
  11. qtype/interpreter/executors/collect_executor.py +76 -0
  12. qtype/interpreter/executors/construct_executor.py +68 -0
  13. qtype/interpreter/executors/decoder_executor.py +1 -2
  14. qtype/interpreter/executors/doc_to_text_executor.py +1 -2
  15. qtype/interpreter/executors/document_embedder_executor.py +19 -4
  16. qtype/interpreter/executors/document_search_executor.py +1 -2
  17. qtype/interpreter/executors/document_source_executor.py +1 -2
  18. qtype/interpreter/executors/document_splitter_executor.py +1 -2
  19. qtype/interpreter/executors/echo_executor.py +1 -2
  20. qtype/interpreter/executors/explode_executor.py +49 -0
  21. qtype/interpreter/executors/field_extractor_executor.py +1 -2
  22. qtype/interpreter/executors/file_writer_executor.py +12 -13
  23. qtype/interpreter/executors/index_upsert_executor.py +3 -4
  24. qtype/interpreter/executors/invoke_embedding_executor.py +37 -26
  25. qtype/interpreter/executors/invoke_tool_executor.py +1 -2
  26. qtype/interpreter/executors/llm_inference_executor.py +1 -2
  27. qtype/interpreter/executors/prompt_template_executor.py +1 -2
  28. qtype/interpreter/executors/sql_source_executor.py +1 -2
  29. qtype/interpreter/executors/vector_search_executor.py +1 -2
  30. qtype/interpreter/flow.py +6 -4
  31. qtype/interpreter/types.py +18 -10
  32. qtype/interpreter/typing.py +53 -4
  33. qtype/interpreter/ui/404/index.html +1 -1
  34. qtype/interpreter/ui/404.html +1 -1
  35. qtype/interpreter/ui/_next/static/{20HoJN6otZ_LyHLHpCPE6 → YR7FgQl_Kpwjcqho0ogG4}/_buildManifest.js +1 -1
  36. qtype/interpreter/ui/_next/static/chunks/230-e22a519211de9624.js +33 -0
  37. qtype/interpreter/ui/_next/static/chunks/255-268261a96ffee0a9.js +1 -0
  38. qtype/interpreter/ui/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
  39. qtype/interpreter/ui/_next/static/chunks/app/_not-found/page-8f0e059659d8afd7.js +1 -0
  40. qtype/interpreter/ui/_next/static/chunks/app/layout-1615bcffa82ff884.js +1 -0
  41. qtype/interpreter/ui/_next/static/chunks/app/page-bfbb263eb356c6eb.js +1 -0
  42. qtype/interpreter/ui/_next/static/chunks/ba12c10f-8d3b3efcaddd4728.js +1 -0
  43. qtype/interpreter/ui/_next/static/chunks/framework-d7de93249215fb06.js +1 -0
  44. qtype/interpreter/ui/_next/static/chunks/main-090112344d9a19ce.js +1 -0
  45. qtype/interpreter/ui/_next/static/chunks/main-app-a5425c8070223ccc.js +1 -0
  46. qtype/interpreter/ui/_next/static/chunks/pages/{_app-0a0020ddd67f79cf.js → _app-7d307437aca18ad4.js} +1 -1
  47. qtype/interpreter/ui/_next/static/chunks/pages/{_error-03529f2c21436739.js → _error-cb2a52f75f2162e2.js} +1 -1
  48. qtype/interpreter/ui/_next/static/chunks/webpack-bd0771cb30dd12fa.js +1 -0
  49. qtype/interpreter/ui/_next/static/css/7906798f56607e8f.css +3 -0
  50. qtype/interpreter/ui/assets/video-sample.mp4 +0 -0
  51. qtype/interpreter/ui/index.html +1 -1
  52. qtype/interpreter/ui/index.txt +12 -12
  53. qtype/semantic/checker.py +83 -0
  54. qtype/semantic/generate.py +0 -1
  55. qtype/semantic/model.py +25 -18
  56. {qtype-0.1.3.dist-info → qtype-0.1.9.dist-info}/METADATA +2 -2
  57. {qtype-0.1.3.dist-info → qtype-0.1.9.dist-info}/RECORD +62 -57
  58. qtype/interpreter/ui/_next/static/chunks/434-b2112d19f25c44ff.js +0 -36
  59. qtype/interpreter/ui/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js +0 -1
  60. qtype/interpreter/ui/_next/static/chunks/964-2b041321a01cbf56.js +0 -1
  61. qtype/interpreter/ui/_next/static/chunks/app/_not-found/page-e110d2a9d0a83d82.js +0 -1
  62. qtype/interpreter/ui/_next/static/chunks/app/layout-a05273ead5de2c41.js +0 -1
  63. qtype/interpreter/ui/_next/static/chunks/app/page-8c67d16ac90d23cb.js +0 -1
  64. qtype/interpreter/ui/_next/static/chunks/ba12c10f-546f2714ff8abc66.js +0 -1
  65. qtype/interpreter/ui/_next/static/chunks/framework-7c95b8e5103c9e90.js +0 -1
  66. qtype/interpreter/ui/_next/static/chunks/main-app-6fc6346bc8f7f163.js +0 -1
  67. qtype/interpreter/ui/_next/static/chunks/main-e26b9cb206da2cac.js +0 -1
  68. qtype/interpreter/ui/_next/static/chunks/webpack-08642e441b39b6c2.js +0 -1
  69. qtype/interpreter/ui/_next/static/css/8a8d1269e362fef7.css +0 -3
  70. /qtype/interpreter/ui/_next/static/{20HoJN6otZ_LyHLHpCPE6 → YR7FgQl_Kpwjcqho0ogG4}/_ssgManifest.js +0 -0
  71. {qtype-0.1.3.dist-info → qtype-0.1.9.dist-info}/WHEEL +0 -0
  72. {qtype-0.1.3.dist-info → qtype-0.1.9.dist-info}/entry_points.txt +0 -0
  73. {qtype-0.1.3.dist-info → qtype-0.1.9.dist-info}/licenses/LICENSE +0 -0
  74. {qtype-0.1.3.dist-info → qtype-0.1.9.dist-info}/top_level.txt +0 -0
@@ -59,5 +59,4 @@ class EchoExecutor(StepExecutor):
59
59
  except Exception as e:
60
60
  # Emit error event to stream so frontend can display it
61
61
  await self.stream_emitter.error(str(e))
62
- message.set_error(self.step.id, e)
63
- yield message
62
+ yield message.copy_with_error(self.step.id, e)
@@ -0,0 +1,49 @@
1
+ from typing import AsyncIterator
2
+
3
+ from qtype.interpreter.base.base_step_executor import StepExecutor
4
+ from qtype.interpreter.base.executor_context import ExecutorContext
5
+ from qtype.interpreter.types import FlowMessage
6
+ from qtype.semantic.model import Explode
7
+
8
+
9
+ class ExplodeExecutor(StepExecutor):
10
+ """Executor for Explode steps."""
11
+
12
+ def __init__(
13
+ self,
14
+ step: Explode,
15
+ context: ExecutorContext,
16
+ **dependencies,
17
+ ):
18
+ super().__init__(step, context, **dependencies)
19
+ if not isinstance(step, Explode):
20
+ raise ValueError("ExplodeExecutor can only execute Explode steps.")
21
+ self.step = step
22
+
23
+ async def process_message(
24
+ self,
25
+ message: FlowMessage,
26
+ ) -> AsyncIterator[FlowMessage]:
27
+ """Process a FlowMessage for the Explode step.
28
+
29
+ Args:
30
+ message: A FlowMessage to process.
31
+ Yields:
32
+ FlowMessages with the results of processing.
33
+ """
34
+ try:
35
+ input_name = self.step.inputs[0].id
36
+ output_name = self.step.outputs[0].id
37
+
38
+ input_value = message.variables.get(input_name)
39
+
40
+ if not isinstance(input_value, list):
41
+ raise ValueError(
42
+ f"Explode step expected a list for input '{input_name}', "
43
+ f"but got: {type(input_value).__name__}"
44
+ )
45
+
46
+ for item in input_value:
47
+ yield message.copy_with_variables({output_name: item})
48
+ except Exception as e:
49
+ yield message.copy_with_error(self.step.id, e)
@@ -161,5 +161,4 @@ class FieldExtractorExecutor(StepExecutor):
161
161
  except Exception as e:
162
162
  # Emit error event to stream so frontend can display it
163
163
  await self.stream_emitter.error(str(e))
164
- message.set_error(self.step.id, e)
165
- yield message
164
+ yield message.copy_with_error(self.step.id, e)
@@ -6,6 +6,7 @@ import pandas as pd
6
6
 
7
7
  from qtype.interpreter.base.batch_step_executor import BatchedStepExecutor
8
8
  from qtype.interpreter.base.executor_context import ExecutorContext
9
+ from qtype.interpreter.executors.collect_executor import _find_common_ancestors
9
10
  from qtype.interpreter.types import FlowMessage
10
11
  from qtype.semantic.model import ConstantPath, FileWriter, Variable
11
12
 
@@ -59,12 +60,11 @@ class FileWriterExecutor(BatchedStepExecutor):
59
60
  await self.stream_emitter.status(
60
61
  f"Wrote {len(df)} records to {file_path}"
61
62
  )
62
- for msg in batch:
63
- yield (
64
- msg
65
- if not output_name
66
- else msg.copy_with_variables({output_name: file_path})
67
- )
63
+ # Identify the common ancestors to propagate
64
+ result_vars = _find_common_ancestors(batch)
65
+ result_vars[output_name] = file_path # type: ignore[index]
66
+ yield FlowMessage(session=batch[0].session, variables=result_vars)
67
+
68
68
  else:
69
69
  # Group messages by file path (path is a Variable in this branch)
70
70
  if not isinstance(self.step.path, Variable):
@@ -101,10 +101,9 @@ class FileWriterExecutor(BatchedStepExecutor):
101
101
  await self.stream_emitter.status(
102
102
  f"Wrote {len(df_group)} records to {file_path}"
103
103
  )
104
- # Re-yield the original messages for this group
105
- for msg in batch:
106
- yield (
107
- msg
108
- if not output_name
109
- else msg.copy_with_variables({output_name: file_path})
110
- )
104
+ # Identify the common ancestors to propagate
105
+ result_vars = _find_common_ancestors(msg_list)
106
+ result_vars[output_name] = file_path # type: ignore[index]
107
+ yield FlowMessage(
108
+ session=msg_list[0].session, variables=result_vars
109
+ )
@@ -100,8 +100,7 @@ class IndexUpsertExecutor(BatchedStepExecutor):
100
100
 
101
101
  # Mark all messages with the error and yield them
102
102
  for message in batch:
103
- message.set_error(self.step.id, e)
104
- yield message
103
+ yield message.copy_with_error(self.step.id, e)
105
104
 
106
105
  async def _upsert_to_vector_store(
107
106
  self, batch: list[FlowMessage]
@@ -220,13 +219,13 @@ class IndexUpsertExecutor(BatchedStepExecutor):
220
219
  doc_id = item["index"]["_id"]
221
220
  message = message_by_id[doc_id]
222
221
  if "error" in item.get("index", {}):
223
- message.set_error(
222
+ yield message.copy_with_error(
224
223
  self.step.id,
225
224
  Exception(item["index"]["error"]),
226
225
  )
227
226
  else:
228
227
  num_inserted += 1
229
- yield message
228
+ yield message
230
229
  await self.stream_emitter.status(
231
230
  f"Upserted {num_inserted} items to index {self.step.index.name}, {len(batch) - num_inserted} errors occurred."
232
231
  )
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  from typing import AsyncIterator
2
3
 
3
4
  from openinference.semconv.trace import OpenInferenceSpanKindValues
@@ -30,7 +31,9 @@ class InvokeEmbeddingExecutor(StepExecutor):
30
31
  )
31
32
  self.step: InvokeEmbedding = step
32
33
  # Initialize the embedding model once for the executor
33
- self.embedding_model = to_embedding_model(self.step.model)
34
+ self.embedding_model = to_embedding_model(
35
+ self.step.model, context.secret_manager
36
+ )
34
37
 
35
38
  async def process_message(
36
39
  self,
@@ -54,32 +57,41 @@ class InvokeEmbeddingExecutor(StepExecutor):
54
57
  if input_value is None:
55
58
  raise ValueError(f"Input variable '{input_id}' is missing")
56
59
 
57
- # Generate embedding based on input type
58
- if input_type == PrimitiveTypeEnum.text:
59
- if not isinstance(input_value, str):
60
- input_value = str(input_value)
61
- vector = await self.embedding_model.aget_text_embedding(
62
- text=input_value
63
- )
64
- content = input_value
65
- elif input_type == PrimitiveTypeEnum.image:
66
- # For image embeddings
67
- vector = await self.embedding_model.aget_image_embedding(
68
- image_path=input_value
69
- )
70
- content = input_value
71
- else:
72
- raise ValueError(
73
- (
74
- f"Unsupported input type for embedding: "
75
- f"{input_type}. Must be 'text' or 'image'."
60
+ def _call(input_value=input_value):
61
+ # Generate embedding based on input type
62
+ if input_type == PrimitiveTypeEnum.text:
63
+ if not isinstance(input_value, str):
64
+ input_value = str(input_value)
65
+ vector = self.embedding_model.get_text_embedding(
66
+ text=input_value
67
+ )
68
+ content = input_value
69
+ elif input_type == PrimitiveTypeEnum.image:
70
+ # For image embeddings
71
+ vector = self.embedding_model.get_image_embedding(
72
+ image_path=input_value
76
73
  )
74
+ content = input_value
75
+ else:
76
+ raise ValueError(
77
+ (
78
+ f"Unsupported input type for embedding: "
79
+ f"{input_type}. Must be 'text' or 'image'."
80
+ )
81
+ )
82
+
83
+ # Create the Embedding object
84
+ embedding = Embedding(
85
+ vector=vector,
86
+ content=content,
77
87
  )
88
+ return embedding
78
89
 
79
- # Create the Embedding object
80
- embedding = Embedding(
81
- vector=vector,
82
- content=content,
90
+ # TODO: switch back to async once aws auth supports it.
91
+ # https://github.com/bazaarvoice/qtype/issues/108
92
+ loop = asyncio.get_running_loop()
93
+ embedding = await loop.run_in_executor(
94
+ self.context.thread_pool, _call
83
95
  )
84
96
 
85
97
  # Yield the result
@@ -88,5 +100,4 @@ class InvokeEmbeddingExecutor(StepExecutor):
88
100
  except Exception as e:
89
101
  # Emit error event to stream so frontend can display it
90
102
  await self.stream_emitter.error(str(e))
91
- message.set_error(self.step.id, e)
92
- yield message
103
+ yield message.copy_with_error(self.step.id, e)
@@ -354,5 +354,4 @@ class InvokeToolExecutor(StepExecutor, ToolExecutionMixin):
354
354
  except Exception as e:
355
355
  # Emit error event to stream so frontend can display it
356
356
  await self.stream_emitter.error(str(e))
357
- message.set_error(self.step.id, e)
358
- yield message
357
+ yield message.copy_with_error(self.step.id, e)
@@ -86,8 +86,7 @@ class LLMInferenceExecutor(StepExecutor):
86
86
  except Exception as e:
87
87
  # Emit error event to stream so frontend can display it
88
88
  await self.stream_emitter.error(str(e))
89
- message.set_error(self.step.id, e)
90
- yield message
89
+ yield message.copy_with_error(self.step.id, e)
91
90
 
92
91
  async def _process_chat(
93
92
  self,
@@ -74,5 +74,4 @@ class PromptTemplateExecutor(StepExecutor):
74
74
  except Exception as e:
75
75
  # Emit error event to stream so frontend can display it
76
76
  await self.stream_emitter.error(str(e))
77
- message.set_error(self.step.id, e)
78
- yield message
77
+ yield message.copy_with_error(self.step.id, e)
@@ -102,5 +102,4 @@ class SQLSourceExecutor(StepExecutor):
102
102
  # Emit error event to stream so frontend can display it
103
103
  await self.stream_emitter.error(str(e))
104
104
  # Set error on the message and yield it
105
- message.set_error(self.step.id, e)
106
- yield message
105
+ yield message.copy_with_error(self.step.id, e)
@@ -87,5 +87,4 @@ class VectorSearchExecutor(StepExecutor):
87
87
  logger.error(f"Vector search failed: {e}", exc_info=True)
88
88
  # Emit error event to stream so frontend can display it
89
89
  await self.stream_emitter.error(str(e))
90
- message.set_error(self.step.id, e)
91
- yield message
90
+ yield message.copy_with_error(self.step.id, e)
qtype/interpreter/flow.py CHANGED
@@ -12,13 +12,12 @@ from opentelemetry import context as otel_context
12
12
  from opentelemetry import trace
13
13
  from opentelemetry.trace import Status, StatusCode
14
14
  from rich.console import Console
15
- from transformers import ProgressCallback
16
15
 
17
16
  from qtype.interpreter.base import factory
18
17
  from qtype.interpreter.base.executor_context import ExecutorContext
19
18
  from qtype.interpreter.logging_progress import LoggingProgressCallback
20
19
  from qtype.interpreter.rich_progress import RichProgressCallback
21
- from qtype.interpreter.types import FlowMessage
20
+ from qtype.interpreter.types import FlowMessage, ProgressCallback
22
21
  from qtype.semantic.model import Flow
23
22
 
24
23
  logger = logging.getLogger(__name__)
@@ -57,12 +56,15 @@ async def run_flow(
57
56
  # Extract or create ExecutorContext
58
57
  exec_context = kwargs.pop("context", None)
59
58
  if exec_context is None:
59
+ # Track if we created the context so we know to clean it up
60
+ should_clean_context = True
60
61
  exec_context = ExecutorContext(
61
62
  secret_manager=NoOpSecretManager(),
62
63
  tracer=trace.get_tracer(__name__),
63
64
  on_progress=progress_callback,
64
65
  )
65
66
  else:
67
+ should_clean_context = False
66
68
  if exec_context.on_progress is None and show_progress:
67
69
  exec_context.on_progress = progress_callback
68
70
 
@@ -178,8 +180,8 @@ async def run_flow(
178
180
  span.set_status(Status(StatusCode.ERROR, f"Flow failed: {e}"))
179
181
  raise
180
182
  finally:
181
- # Clean up context resources if we created it
182
- if kwargs.get("context") is None:
183
+ # Clean up context resources ONLY if we created it
184
+ if should_clean_context:
183
185
  exec_context.cleanup()
184
186
  # Detach the context and end the span
185
187
  # Only detach if we successfully attached (span was recording)
@@ -292,6 +292,10 @@ class FlowMessage(BaseModel):
292
292
  This object is the primary data structure passed between StepExecutors.
293
293
  """
294
294
 
295
+ model_config = ConfigDict(
296
+ frozen=True
297
+ ) # Enforces immutability at the model level
298
+
295
299
  session: Session
296
300
  variables: Dict[str, Any] = Field(
297
301
  default_factory=dict,
@@ -303,21 +307,25 @@ class FlowMessage(BaseModel):
303
307
  """Checks if this state has encountered an error."""
304
308
  return self.error is not None
305
309
 
306
- def set_error(self, step_id: str, exc: Exception):
307
- """Marks this state as failed, capturing error details."""
308
- if not self.is_failed(): # Only capture the first error
309
- self.error = StepError(
310
- step_id=step_id,
311
- error_message=str(exc),
312
- exception_type=type(exc).__name__,
313
- )
310
+ def copy_with_error(self, step_id: str, exc: Exception) -> "FlowMessage":
311
+ """Returns a copy of this state marked as failed."""
312
+ return self.model_copy(
313
+ update={
314
+ "error": StepError(
315
+ step_id=step_id,
316
+ error_message=str(exc),
317
+ exception_type=type(exc).__name__,
318
+ )
319
+ }
320
+ )
314
321
 
315
322
  # It's useful to have copy-on-write style helpers
316
323
  def copy_with_variables(
317
324
  self, new_variables: dict[str, Any]
318
325
  ) -> "FlowMessage":
319
- new_state = self.model_copy(deep=True)
320
- new_state.variables.update(new_variables)
326
+ new_vars = self.variables.copy()
327
+ new_vars.update(new_variables)
328
+ new_state = self.model_copy(update={"variables": new_vars})
321
329
  return new_state
322
330
 
323
331
 
@@ -1,17 +1,18 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import uuid
4
- from typing import Any, Type
4
+ from typing import Any, Type, get_origin
5
5
 
6
- from pydantic import BaseModel, Field, create_model
6
+ from pydantic import BaseModel, Field, TypeAdapter, create_model
7
7
 
8
- from qtype.dsl.model import PrimitiveTypeEnum
8
+ from qtype.dsl.model import ListType, PrimitiveTypeEnum
9
+ from qtype.dsl.model import Variable as DSLVariable
9
10
  from qtype.dsl.types import PRIMITIVE_TO_PYTHON_TYPE
10
11
  from qtype.interpreter.types import FlowMessage, Session
11
12
  from qtype.semantic.model import Flow, Variable
12
13
 
13
14
 
14
- def _get_variable_type(var: Variable) -> tuple[Type, dict[str, Any]]:
15
+ def _get_variable_type(var: DSLVariable) -> tuple[Type, dict[str, Any]]:
15
16
  """Get the Python type and metadata for a variable.
16
17
 
17
18
  Returns:
@@ -23,6 +24,13 @@ def _get_variable_type(var: Variable) -> tuple[Type, dict[str, Any]]:
23
24
  if isinstance(var.type, PrimitiveTypeEnum):
24
25
  python_type = PRIMITIVE_TO_PYTHON_TYPE.get(var.type, str)
25
26
  field_metadata["qtype_type"] = var.type.value
27
+ elif isinstance(var.type, ListType):
28
+ python_type = list[
29
+ _get_variable_type(DSLVariable(id="", type=var.type.element_type))[
30
+ 0
31
+ ]
32
+ ]
33
+ field_metadata["qtype_type"] = f"list[{var.type.element_type}]"
26
34
  elif (
27
35
  isinstance(var.type, type)
28
36
  and issubclass(var.type, BaseModel)
@@ -40,6 +48,11 @@ def _fields_from_variables(variables: list[Variable]) -> dict:
40
48
  fields = {}
41
49
  for var in variables:
42
50
  python_type, type_metadata = _get_variable_type(var)
51
+
52
+ # Add UI config to schema if present (OpenAPI x- extension pattern)
53
+ if var.ui is not None:
54
+ type_metadata["x-ui"] = var.ui
55
+
43
56
  field_info = Field(
44
57
  title=var.id,
45
58
  json_schema_extra=type_metadata,
@@ -125,3 +138,39 @@ def flow_results_to_output_container(
125
138
  outputs.append(output_instance.model_dump())
126
139
 
127
140
  return output_container(outputs=outputs, errors=errors)
141
+
142
+
143
+ def instantiate_variable(variable: DSLVariable, value: Any) -> Any:
144
+ """
145
+ Unified contract to ensure data matches its QType definition.
146
+ Handles CustomTypes, DomainTypes, and Primitives.
147
+ """
148
+ target_type, _ = _get_variable_type(variable)
149
+
150
+ # 1. Handle the 'Parameterized Generic' Check (The isinstance fix)
151
+ # We check if target_type is a generic (like list[T]) vs a simple class.
152
+ origin = get_origin(target_type)
153
+
154
+ if origin is None:
155
+ # It's a simple type (int, RAGChunk, etc.)
156
+ if isinstance(value, target_type):
157
+ return value
158
+ else:
159
+ # It's a generic (list[str], etc.).
160
+ # We skip the identity check and let TypeAdapter handle it.
161
+ pass
162
+
163
+ # 2. Handle Pydantic Models (Custom/Domain Types)
164
+ if hasattr(target_type, "model_validate"):
165
+ return target_type.model_validate(value)
166
+
167
+ # 3. Handle Primitives & Complex Python Types (List, Optional, Union)
168
+ try:
169
+ # TypeAdapter is the "V2 way" to validate things that aren't
170
+ # full Pydantic models (like List[int] or Optional[str])
171
+ return TypeAdapter(target_type).validate_python(value)
172
+ except Exception:
173
+ # Fallback to your original manual cast if TypeAdapter is overkill
174
+ if isinstance(target_type, type):
175
+ return target_type(value)
176
+ raise ValueError(f"Unsupported target type: {target_type}")
@@ -1 +1 @@
1
- <!DOCTYPE html><!--20HoJN6otZ_LyHLHpCPE6--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="./_next/static/media/4cf2300e9c8272f7-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="./_next/static/media/93f479601ee12b01-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="./_next/static/css/8a8d1269e362fef7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="./_next/static/chunks/webpack-08642e441b39b6c2.js"/><script src="./_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js" async=""></script><script src="./_next/static/chunks/964-2b041321a01cbf56.js" async=""></script><script src="./_next/static/chunks/main-app-6fc6346bc8f7f163.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>QType</title><meta name="description" content="DSL for rapid prototyping of AI applications"/><link rel="icon" href="/ui/icon.png?5369ea17987f04b5" type="image/png" sizes="907x907"/><script src="./_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_c57559 __variable_152ec0 antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="./_next/static/chunks/webpack-08642e441b39b6c2.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[7555,[],\"\"]\n3:I[1295,[],\"\"]\n4:I[9665,[],\"OutletBoundary\"]\n6:I[4911,[],\"AsyncMetadataOutlet\"]\n8:I[9665,[],\"ViewportBoundary\"]\na:I[9665,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[8393,[],\"\"]\n:HL[\"./_next/static/media/4cf2300e9c8272f7-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"./_next/static/media/93f479601ee12b01-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"./_next/static/css/8a8d1269e362fef7.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"20HoJN6otZ_LyHLHpCPE6\",\"p\":\".\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"./_next/static/css/8a8d1269e362fef7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_c57559 __variable_152ec0 antialiased\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[8175,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"QType\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"DSL for rapid prototyping of AI applications\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/ui/icon.png?5369ea17987f04b5\",\"type\":\"image/png\",\"sizes\":\"907x907\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--YR7FgQl_Kpwjcqho0ogG4--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="./_next/static/media/4cf2300e9c8272f7-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="./_next/static/media/93f479601ee12b01-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="./_next/static/css/7906798f56607e8f.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="./_next/static/chunks/webpack-bd0771cb30dd12fa.js"/><script src="./_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="./_next/static/chunks/255-268261a96ffee0a9.js" async=""></script><script src="./_next/static/chunks/main-app-a5425c8070223ccc.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>QType</title><meta name="description" content="DSL for rapid prototyping of AI applications"/><link rel="icon" href="/ui/icon.png?5369ea17987f04b5" type="image/png" sizes="907x907"/><script src="./_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_c57559 __variable_152ec0 antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="./_next/static/chunks/webpack-bd0771cb30dd12fa.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"./_next/static/media/4cf2300e9c8272f7-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"./_next/static/media/93f479601ee12b01-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"./_next/static/css/7906798f56607e8f.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"YR7FgQl_Kpwjcqho0ogG4\",\"p\":\".\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"./_next/static/css/7906798f56607e8f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_c57559 __variable_152ec0 antialiased\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[622,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"QType\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"DSL for rapid prototyping of AI applications\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/ui/icon.png?5369ea17987f04b5\",\"type\":\"image/png\",\"sizes\":\"907x907\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><!--20HoJN6otZ_LyHLHpCPE6--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="./_next/static/media/4cf2300e9c8272f7-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="./_next/static/media/93f479601ee12b01-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="./_next/static/css/8a8d1269e362fef7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="./_next/static/chunks/webpack-08642e441b39b6c2.js"/><script src="./_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js" async=""></script><script src="./_next/static/chunks/964-2b041321a01cbf56.js" async=""></script><script src="./_next/static/chunks/main-app-6fc6346bc8f7f163.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>QType</title><meta name="description" content="DSL for rapid prototyping of AI applications"/><link rel="icon" href="/ui/icon.png?5369ea17987f04b5" type="image/png" sizes="907x907"/><script src="./_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_c57559 __variable_152ec0 antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="./_next/static/chunks/webpack-08642e441b39b6c2.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[7555,[],\"\"]\n3:I[1295,[],\"\"]\n4:I[9665,[],\"OutletBoundary\"]\n6:I[4911,[],\"AsyncMetadataOutlet\"]\n8:I[9665,[],\"ViewportBoundary\"]\na:I[9665,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[8393,[],\"\"]\n:HL[\"./_next/static/media/4cf2300e9c8272f7-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"./_next/static/media/93f479601ee12b01-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"./_next/static/css/8a8d1269e362fef7.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"20HoJN6otZ_LyHLHpCPE6\",\"p\":\".\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"./_next/static/css/8a8d1269e362fef7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_c57559 __variable_152ec0 antialiased\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[8175,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"QType\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"DSL for rapid prototyping of AI applications\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/ui/icon.png?5369ea17987f04b5\",\"type\":\"image/png\",\"sizes\":\"907x907\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--YR7FgQl_Kpwjcqho0ogG4--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="./_next/static/media/4cf2300e9c8272f7-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="./_next/static/media/93f479601ee12b01-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="./_next/static/css/7906798f56607e8f.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="./_next/static/chunks/webpack-bd0771cb30dd12fa.js"/><script src="./_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="./_next/static/chunks/255-268261a96ffee0a9.js" async=""></script><script src="./_next/static/chunks/main-app-a5425c8070223ccc.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>QType</title><meta name="description" content="DSL for rapid prototyping of AI applications"/><link rel="icon" href="/ui/icon.png?5369ea17987f04b5" type="image/png" sizes="907x907"/><script src="./_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_c57559 __variable_152ec0 antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="./_next/static/chunks/webpack-bd0771cb30dd12fa.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"./_next/static/media/4cf2300e9c8272f7-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"./_next/static/media/93f479601ee12b01-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"./_next/static/css/7906798f56607e8f.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"YR7FgQl_Kpwjcqho0ogG4\",\"p\":\".\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"./_next/static/css/7906798f56607e8f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_c57559 __variable_152ec0 antialiased\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[622,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"QType\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"DSL for rapid prototyping of AI applications\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/ui/icon.png?5369ea17987f04b5\",\"type\":\"image/png\",\"sizes\":\"907x907\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
@@ -1 +1 @@
1
- self.__BUILD_MANIFEST=function(e,r,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:3,errorRate:1e-4,numBits:58,numHashes:14,bitArray:[1,1,0,e,0,e,e,r,r,e,r,e,r,e,r,e,r,r,e,r,r,r,e,e,r,e,r,r,e,r,e,e,e,e,r,e,e,r,e,e,r,r,e,r,e,r,r,e,e,e,e,e,e,e,r,r,e,e]},__routerFilterDynamic:{numItems:r,errorRate:1e-4,numBits:r,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-03529f2c21436739.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
1
+ self.__BUILD_MANIFEST=function(e,r,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:3,errorRate:1e-4,numBits:58,numHashes:14,bitArray:[1,1,0,e,0,e,e,r,r,e,r,e,r,e,r,e,r,r,e,r,r,r,e,e,r,e,r,r,e,r,e,e,e,e,r,e,e,r,e,e,r,r,e,r,e,r,r,e,e,e,e,e,e,e,r,r,e,e]},__routerFilterDynamic:{numItems:r,errorRate:1e-4,numBits:r,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-cb2a52f75f2162e2.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();