qtype 0.0.12__py3-none-any.whl → 0.1.7__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/application/commons/tools.py +1 -1
- qtype/application/converters/tools_from_api.py +476 -11
- qtype/application/converters/tools_from_module.py +38 -14
- qtype/application/converters/types.py +15 -30
- qtype/application/documentation.py +1 -1
- qtype/application/facade.py +102 -85
- qtype/base/types.py +227 -7
- qtype/cli.py +5 -1
- qtype/commands/convert.py +52 -6
- qtype/commands/generate.py +44 -4
- qtype/commands/run.py +78 -36
- qtype/commands/serve.py +74 -44
- qtype/commands/validate.py +37 -14
- qtype/commands/visualize.py +46 -25
- qtype/dsl/__init__.py +6 -5
- qtype/dsl/custom_types.py +1 -1
- qtype/dsl/domain_types.py +86 -5
- qtype/dsl/linker.py +384 -0
- qtype/dsl/loader.py +315 -0
- qtype/dsl/model.py +753 -264
- qtype/dsl/parser.py +200 -0
- qtype/dsl/types.py +50 -0
- qtype/interpreter/api.py +63 -136
- qtype/interpreter/auth/aws.py +19 -9
- qtype/interpreter/auth/generic.py +93 -16
- qtype/interpreter/base/base_step_executor.py +436 -0
- qtype/interpreter/base/batch_step_executor.py +171 -0
- qtype/interpreter/base/exceptions.py +50 -0
- qtype/interpreter/base/executor_context.py +91 -0
- qtype/interpreter/base/factory.py +84 -0
- qtype/interpreter/base/progress_tracker.py +110 -0
- qtype/interpreter/base/secrets.py +339 -0
- qtype/interpreter/base/step_cache.py +74 -0
- qtype/interpreter/base/stream_emitter.py +469 -0
- qtype/interpreter/conversions.py +495 -24
- qtype/interpreter/converters.py +79 -0
- qtype/interpreter/endpoints.py +355 -0
- qtype/interpreter/executors/agent_executor.py +242 -0
- qtype/interpreter/executors/aggregate_executor.py +93 -0
- qtype/interpreter/executors/bedrock_reranker_executor.py +195 -0
- qtype/interpreter/executors/decoder_executor.py +163 -0
- qtype/interpreter/executors/doc_to_text_executor.py +112 -0
- qtype/interpreter/executors/document_embedder_executor.py +123 -0
- qtype/interpreter/executors/document_search_executor.py +113 -0
- qtype/interpreter/executors/document_source_executor.py +118 -0
- qtype/interpreter/executors/document_splitter_executor.py +105 -0
- qtype/interpreter/executors/echo_executor.py +63 -0
- qtype/interpreter/executors/field_extractor_executor.py +165 -0
- qtype/interpreter/executors/file_source_executor.py +101 -0
- qtype/interpreter/executors/file_writer_executor.py +110 -0
- qtype/interpreter/executors/index_upsert_executor.py +232 -0
- qtype/interpreter/executors/invoke_embedding_executor.py +104 -0
- qtype/interpreter/executors/invoke_flow_executor.py +51 -0
- qtype/interpreter/executors/invoke_tool_executor.py +358 -0
- qtype/interpreter/executors/llm_inference_executor.py +272 -0
- qtype/interpreter/executors/prompt_template_executor.py +78 -0
- qtype/interpreter/executors/sql_source_executor.py +106 -0
- qtype/interpreter/executors/vector_search_executor.py +91 -0
- qtype/interpreter/flow.py +172 -22
- qtype/interpreter/logging_progress.py +61 -0
- qtype/interpreter/metadata_api.py +115 -0
- qtype/interpreter/resource_cache.py +5 -4
- qtype/interpreter/rich_progress.py +225 -0
- qtype/interpreter/stream/chat/__init__.py +15 -0
- qtype/interpreter/stream/chat/converter.py +391 -0
- qtype/interpreter/{chat → stream/chat}/file_conversions.py +2 -2
- qtype/interpreter/stream/chat/ui_request_to_domain_type.py +140 -0
- qtype/interpreter/stream/chat/vercel.py +609 -0
- qtype/interpreter/stream/utils/__init__.py +15 -0
- qtype/interpreter/stream/utils/build_vercel_ai_formatter.py +74 -0
- qtype/interpreter/stream/utils/callback_to_stream.py +66 -0
- qtype/interpreter/stream/utils/create_streaming_response.py +18 -0
- qtype/interpreter/stream/utils/default_chat_extract_text.py +20 -0
- qtype/interpreter/stream/utils/error_streaming_response.py +20 -0
- qtype/interpreter/telemetry.py +135 -8
- qtype/interpreter/tools/__init__.py +5 -0
- qtype/interpreter/tools/function_tool_helper.py +265 -0
- qtype/interpreter/types.py +330 -0
- qtype/interpreter/typing.py +83 -89
- qtype/interpreter/ui/404/index.html +1 -1
- qtype/interpreter/ui/404.html +1 -1
- qtype/interpreter/ui/_next/static/{OT8QJQW3J70VbDWWfrEMT → 20HoJN6otZ_LyHLHpCPE6}/_buildManifest.js +1 -1
- qtype/interpreter/ui/_next/static/chunks/434-b2112d19f25c44ff.js +36 -0
- qtype/interpreter/ui/_next/static/chunks/{964-ed4ab073db645007.js → 964-2b041321a01cbf56.js} +1 -1
- qtype/interpreter/ui/_next/static/chunks/app/{layout-5ccbc44fd528d089.js → layout-a05273ead5de2c41.js} +1 -1
- qtype/interpreter/ui/_next/static/chunks/app/page-8c67d16ac90d23cb.js +1 -0
- qtype/interpreter/ui/_next/static/chunks/ba12c10f-546f2714ff8abc66.js +1 -0
- qtype/interpreter/ui/_next/static/chunks/{main-6d261b6c5d6fb6c2.js → main-e26b9cb206da2cac.js} +1 -1
- qtype/interpreter/ui/_next/static/chunks/webpack-08642e441b39b6c2.js +1 -0
- qtype/interpreter/ui/_next/static/css/8a8d1269e362fef7.css +3 -0
- qtype/interpreter/ui/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- qtype/interpreter/ui/icon.png +0 -0
- qtype/interpreter/ui/index.html +1 -1
- qtype/interpreter/ui/index.txt +5 -5
- qtype/semantic/checker.py +643 -0
- qtype/semantic/generate.py +268 -85
- qtype/semantic/loader.py +95 -0
- qtype/semantic/model.py +535 -163
- qtype/semantic/resolver.py +63 -19
- qtype/semantic/visualize.py +50 -35
- {qtype-0.0.12.dist-info → qtype-0.1.7.dist-info}/METADATA +22 -5
- qtype-0.1.7.dist-info/RECORD +137 -0
- qtype/dsl/base_types.py +0 -38
- qtype/dsl/validator.py +0 -464
- qtype/interpreter/batch/__init__.py +0 -0
- qtype/interpreter/batch/flow.py +0 -95
- qtype/interpreter/batch/sql_source.py +0 -95
- qtype/interpreter/batch/step.py +0 -63
- qtype/interpreter/batch/types.py +0 -41
- qtype/interpreter/batch/utils.py +0 -179
- qtype/interpreter/chat/chat_api.py +0 -237
- qtype/interpreter/chat/vercel.py +0 -314
- qtype/interpreter/exceptions.py +0 -10
- qtype/interpreter/step.py +0 -67
- qtype/interpreter/steps/__init__.py +0 -0
- qtype/interpreter/steps/agent.py +0 -114
- qtype/interpreter/steps/condition.py +0 -36
- qtype/interpreter/steps/decoder.py +0 -88
- qtype/interpreter/steps/llm_inference.py +0 -150
- qtype/interpreter/steps/prompt_template.py +0 -54
- qtype/interpreter/steps/search.py +0 -24
- qtype/interpreter/steps/tool.py +0 -53
- qtype/interpreter/streaming_helpers.py +0 -123
- qtype/interpreter/ui/_next/static/chunks/736-7fc606e244fedcb1.js +0 -36
- qtype/interpreter/ui/_next/static/chunks/app/page-c72e847e888e549d.js +0 -1
- qtype/interpreter/ui/_next/static/chunks/ba12c10f-22556063851a6df2.js +0 -1
- qtype/interpreter/ui/_next/static/chunks/webpack-8289c17c67827f22.js +0 -1
- qtype/interpreter/ui/_next/static/css/a262c53826df929b.css +0 -3
- qtype/interpreter/ui/_next/static/media/569ce4b8f30dc480-s.p.woff2 +0 -0
- qtype/interpreter/ui/favicon.ico +0 -0
- qtype/loader.py +0 -389
- qtype-0.0.12.dist-info/RECORD +0 -105
- /qtype/interpreter/ui/_next/static/{OT8QJQW3J70VbDWWfrEMT → 20HoJN6otZ_LyHLHpCPE6}/_ssgManifest.js +0 -0
- {qtype-0.0.12.dist-info → qtype-0.1.7.dist-info}/WHEEL +0 -0
- {qtype-0.0.12.dist-info → qtype-0.1.7.dist-info}/entry_points.txt +0 -0
- {qtype-0.0.12.dist-info → qtype-0.1.7.dist-info}/licenses/LICENSE +0 -0
- {qtype-0.0.12.dist-info → qtype-0.1.7.dist-info}/top_level.txt +0 -0
qtype/loader.py
DELETED
|
@@ -1,389 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
YAML loading and validation with environment variable support and file inclusion.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
from __future__ import annotations
|
|
6
|
-
|
|
7
|
-
import os
|
|
8
|
-
import re
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
11
|
-
from urllib.parse import urljoin, urlparse
|
|
12
|
-
|
|
13
|
-
import fsspec # type: ignore[import-untyped]
|
|
14
|
-
import yaml
|
|
15
|
-
from dotenv import load_dotenv
|
|
16
|
-
from fsspec.core import url_to_fs # type: ignore[import-untyped]
|
|
17
|
-
|
|
18
|
-
from qtype.base.types import CustomTypeRegistry, DocumentRootType
|
|
19
|
-
from qtype.dsl import model as dsl
|
|
20
|
-
from qtype.dsl.custom_types import build_dynamic_types
|
|
21
|
-
from qtype.dsl.validator import validate
|
|
22
|
-
from qtype.semantic.model import Application
|
|
23
|
-
from qtype.semantic.resolver import resolve
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class _StringStream:
|
|
27
|
-
"""
|
|
28
|
-
A file-like stream wrapper around string content for YAML loading.
|
|
29
|
-
This class provides a readable stream interface that PyYAML can use
|
|
30
|
-
to parse string content as if it were reading from a file.
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
def __init__(self, content: str, name: str | None = None) -> None:
|
|
34
|
-
"""
|
|
35
|
-
Initialize the string stream.
|
|
36
|
-
|
|
37
|
-
Args:
|
|
38
|
-
content: The string content to wrap.
|
|
39
|
-
name: Optional name/path for the stream (used for relative path resolution).
|
|
40
|
-
"""
|
|
41
|
-
self.content = content
|
|
42
|
-
self.name = name
|
|
43
|
-
self._pos = 0
|
|
44
|
-
|
|
45
|
-
def read(self, size: int = -1) -> str:
|
|
46
|
-
"""
|
|
47
|
-
Read content from the stream.
|
|
48
|
-
|
|
49
|
-
Args:
|
|
50
|
-
size: Number of characters to read. If -1, read all remaining content.
|
|
51
|
-
|
|
52
|
-
Returns:
|
|
53
|
-
The requested content as a string.
|
|
54
|
-
"""
|
|
55
|
-
if size == -1:
|
|
56
|
-
result = self.content[self._pos :]
|
|
57
|
-
self._pos = len(self.content)
|
|
58
|
-
else:
|
|
59
|
-
result = self.content[self._pos : self._pos + size]
|
|
60
|
-
self._pos += len(result)
|
|
61
|
-
return result
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
class YamlLoader(yaml.SafeLoader):
|
|
65
|
-
"""
|
|
66
|
-
YAML loader that supports environment variable substitution and file inclusion.
|
|
67
|
-
|
|
68
|
-
Supports the following syntax:
|
|
69
|
-
- ${VAR_NAME} - Required environment variable (raises error if not found)
|
|
70
|
-
- ${VAR_NAME:default_value} - Optional with default value
|
|
71
|
-
- !include path/to/file.yaml - Include external YAML file
|
|
72
|
-
- !include_raw path/to/file.txt - Include raw text file as string
|
|
73
|
-
|
|
74
|
-
File paths can be:
|
|
75
|
-
- Local filesystem paths (relative or absolute)
|
|
76
|
-
- URLs (http://, https://)
|
|
77
|
-
- GitHub URLs (github://)
|
|
78
|
-
- S3 URLs (s3://)
|
|
79
|
-
- Any fsspec-supported protocol
|
|
80
|
-
"""
|
|
81
|
-
|
|
82
|
-
def __init__(self, stream: Any) -> None:
|
|
83
|
-
super().__init__(stream)
|
|
84
|
-
# Store the base path/URL of the current file for relative path resolution
|
|
85
|
-
if hasattr(stream, "name") and stream.name is not None:
|
|
86
|
-
self._current_path = stream.name
|
|
87
|
-
else:
|
|
88
|
-
self._current_path = str(Path.cwd())
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
def _env_var_constructor(loader: YamlLoader, node: yaml.ScalarNode) -> str:
|
|
92
|
-
"""
|
|
93
|
-
Constructor for environment variable substitution.
|
|
94
|
-
|
|
95
|
-
Args:
|
|
96
|
-
loader: The YAML loader instance.
|
|
97
|
-
node: The YAML node containing the environment variable reference.
|
|
98
|
-
|
|
99
|
-
Returns:
|
|
100
|
-
The resolved environment variable value.
|
|
101
|
-
|
|
102
|
-
Raises:
|
|
103
|
-
ValueError: If a required environment variable is not found.
|
|
104
|
-
"""
|
|
105
|
-
value = loader.construct_scalar(node)
|
|
106
|
-
|
|
107
|
-
# Pattern to match ${VAR_NAME} or ${VAR_NAME:default}
|
|
108
|
-
pattern = r"\$\{([^}:]+)(?::([^}]*))?\}"
|
|
109
|
-
|
|
110
|
-
def replace_env_var(match: re.Match[str]) -> str:
|
|
111
|
-
var_name = match.group(1)
|
|
112
|
-
default_value = match.group(2)
|
|
113
|
-
|
|
114
|
-
env_value = os.getenv(var_name)
|
|
115
|
-
|
|
116
|
-
if env_value is not None:
|
|
117
|
-
return env_value
|
|
118
|
-
elif default_value is not None:
|
|
119
|
-
return default_value
|
|
120
|
-
else:
|
|
121
|
-
msg = f"Environment variable '{var_name}' is required but not set"
|
|
122
|
-
raise ValueError(msg)
|
|
123
|
-
|
|
124
|
-
return re.sub(pattern, replace_env_var, value)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def _include_file_constructor(
|
|
128
|
-
loader: YamlLoader, node: yaml.ScalarNode
|
|
129
|
-
) -> Any:
|
|
130
|
-
"""
|
|
131
|
-
Constructor for !include tag to load external YAML files using fsspec.
|
|
132
|
-
|
|
133
|
-
Args:
|
|
134
|
-
loader: The YAML loader instance.
|
|
135
|
-
node: The YAML node containing the file path/URL.
|
|
136
|
-
|
|
137
|
-
Returns:
|
|
138
|
-
The parsed YAML data from the included file.
|
|
139
|
-
|
|
140
|
-
Raises:
|
|
141
|
-
FileNotFoundError: If the included file doesn't exist.
|
|
142
|
-
yaml.YAMLError: If the included file is malformed YAML.
|
|
143
|
-
"""
|
|
144
|
-
file_path = loader.construct_scalar(node)
|
|
145
|
-
|
|
146
|
-
# Resolve relative paths/URLs relative to the current file
|
|
147
|
-
resolved_path = _resolve_path(loader._current_path, file_path)
|
|
148
|
-
|
|
149
|
-
try:
|
|
150
|
-
with fsspec.open(resolved_path, "r", encoding="utf-8") as f:
|
|
151
|
-
content = f.read() # type: ignore[misc]
|
|
152
|
-
|
|
153
|
-
# Create a string stream with the resolved path for nested includes
|
|
154
|
-
stream = _StringStream(content, resolved_path)
|
|
155
|
-
return yaml.load(stream, Loader=YamlLoader)
|
|
156
|
-
except ValueError:
|
|
157
|
-
# Re-raise ValueError (e.g., missing environment variables) without wrapping
|
|
158
|
-
raise
|
|
159
|
-
except Exception as e:
|
|
160
|
-
msg = f"Failed to load included file '{resolved_path}': {e}"
|
|
161
|
-
raise FileNotFoundError(msg) from e
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
def _include_raw_constructor(loader: YamlLoader, node: yaml.ScalarNode) -> str:
|
|
165
|
-
"""
|
|
166
|
-
Constructor for !include_raw tag to load external text files using fsspec.
|
|
167
|
-
|
|
168
|
-
Args:
|
|
169
|
-
loader: The YAML loader instance.
|
|
170
|
-
node: The YAML node containing the file path/URL.
|
|
171
|
-
|
|
172
|
-
Returns:
|
|
173
|
-
The raw text content of the included file.
|
|
174
|
-
|
|
175
|
-
Raises:
|
|
176
|
-
FileNotFoundError: If the included file doesn't exist.
|
|
177
|
-
"""
|
|
178
|
-
file_path = loader.construct_scalar(node)
|
|
179
|
-
|
|
180
|
-
# Resolve relative paths/URLs relative to the current file
|
|
181
|
-
resolved_path = _resolve_path(loader._current_path, file_path)
|
|
182
|
-
|
|
183
|
-
try:
|
|
184
|
-
with fsspec.open(resolved_path, "r", encoding="utf-8") as f:
|
|
185
|
-
return f.read() # type: ignore[no-any-return]
|
|
186
|
-
except Exception as e:
|
|
187
|
-
msg = f"Failed to load included file '{resolved_path}': {e}"
|
|
188
|
-
raise FileNotFoundError(msg) from e
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
def _resolve_path(current_path: str, target_path: str) -> str:
|
|
192
|
-
"""
|
|
193
|
-
Resolve a target path relative to the current file path.
|
|
194
|
-
|
|
195
|
-
Args:
|
|
196
|
-
current_path: The path/URL of the current file.
|
|
197
|
-
target_path: The target path/URL to resolve.
|
|
198
|
-
|
|
199
|
-
Returns:
|
|
200
|
-
The resolved absolute path/URL.
|
|
201
|
-
"""
|
|
202
|
-
# If target is already absolute (has scheme or starts with /), use as-is
|
|
203
|
-
parsed_target = urlparse(target_path)
|
|
204
|
-
if parsed_target.scheme or target_path.startswith("/"):
|
|
205
|
-
return target_path
|
|
206
|
-
|
|
207
|
-
# Check if current path is a URL
|
|
208
|
-
parsed_current = urlparse(current_path)
|
|
209
|
-
if parsed_current.scheme:
|
|
210
|
-
# Current is a URL, use urljoin for proper URL resolution
|
|
211
|
-
return urljoin(current_path, target_path)
|
|
212
|
-
else:
|
|
213
|
-
# Current is a local path, resolve relative to its directory
|
|
214
|
-
current_path_obj = Path(current_path)
|
|
215
|
-
if current_path_obj.is_dir():
|
|
216
|
-
current_dir = current_path_obj
|
|
217
|
-
else:
|
|
218
|
-
# If it's a directory or doesn't exist yet, use it as-is
|
|
219
|
-
current_dir = current_path_obj.parent
|
|
220
|
-
return str(current_dir / target_path)
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
def _load_env_files(directories: list[Path]) -> None:
|
|
224
|
-
"""Load .env files from the specified directories."""
|
|
225
|
-
for directory in directories:
|
|
226
|
-
env_file = directory / ".env"
|
|
227
|
-
if env_file.exists():
|
|
228
|
-
load_dotenv(env_file)
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
# Register constructors for YamlLoader
|
|
232
|
-
YamlLoader.add_constructor("tag:yaml.org,2002:str", _env_var_constructor)
|
|
233
|
-
YamlLoader.add_constructor("!include", _include_file_constructor)
|
|
234
|
-
YamlLoader.add_constructor("!include_raw", _include_raw_constructor)
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
def load_yaml_from_string(
|
|
238
|
-
content: str, original_uri: str | None = None
|
|
239
|
-
) -> dict[str, Any]:
|
|
240
|
-
"""
|
|
241
|
-
Load a YAML file with environment variable substitution and file inclusion support.
|
|
242
|
-
|
|
243
|
-
Args:
|
|
244
|
-
content: The YAML content to load.
|
|
245
|
-
|
|
246
|
-
Returns:
|
|
247
|
-
The parsed YAML data with includes resolved and environment variables substituted.
|
|
248
|
-
|
|
249
|
-
Raises:
|
|
250
|
-
ValueError: If a required environment variable is not found.
|
|
251
|
-
FileNotFoundError: If the YAML file or included files don't exist.
|
|
252
|
-
yaml.YAMLError: If the YAML file is malformed.
|
|
253
|
-
"""
|
|
254
|
-
|
|
255
|
-
# Create a string stream for the loader
|
|
256
|
-
# Note: When loading from string, relative paths will be resolved relative to cwd
|
|
257
|
-
stream = _StringStream(content, original_uri)
|
|
258
|
-
# Use the string stream directly with the loader
|
|
259
|
-
result = yaml.load(stream, Loader=YamlLoader)
|
|
260
|
-
|
|
261
|
-
return result # type: ignore[no-any-return]
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
def load_yaml(content: str) -> dict[str, Any]:
|
|
265
|
-
"""
|
|
266
|
-
Load a YAML file with environment variable substitution and file inclusion support.
|
|
267
|
-
|
|
268
|
-
Args:
|
|
269
|
-
content: Either a fsspec uri/file path to load, or a string containing YAML content.
|
|
270
|
-
|
|
271
|
-
Returns:
|
|
272
|
-
The parsed YAML data with includes resolved and environment variables substituted.
|
|
273
|
-
|
|
274
|
-
Raises:
|
|
275
|
-
ValueError: If a required environment variable is not found.
|
|
276
|
-
FileNotFoundError: If the YAML file or included files don't exist.
|
|
277
|
-
yaml.YAMLError: If the YAML file is malformed.
|
|
278
|
-
"""
|
|
279
|
-
try:
|
|
280
|
-
# First check if content looks like a file path or URI
|
|
281
|
-
if "\n" in content:
|
|
282
|
-
# If it contains newlines, treat as raw YAML content
|
|
283
|
-
is_uri = False
|
|
284
|
-
else:
|
|
285
|
-
# it has no new lines, so it's probably a uri
|
|
286
|
-
# try to resolve it
|
|
287
|
-
_ = url_to_fs(content)
|
|
288
|
-
is_uri = True
|
|
289
|
-
except (ValueError, OSError):
|
|
290
|
-
is_uri = False
|
|
291
|
-
|
|
292
|
-
# Load the environment variables from .env files
|
|
293
|
-
directories = [Path.cwd()]
|
|
294
|
-
|
|
295
|
-
if is_uri:
|
|
296
|
-
# if the content is a uri, see if it is a local path. if it is, add the directory
|
|
297
|
-
try:
|
|
298
|
-
parsed = urlparse(content)
|
|
299
|
-
if parsed.scheme in ["file", ""]:
|
|
300
|
-
# For file-like URIs, resolve the path and add its directory
|
|
301
|
-
directories.append(Path(parsed.path).parent)
|
|
302
|
-
except Exception:
|
|
303
|
-
pass
|
|
304
|
-
|
|
305
|
-
# Load .env files from the specified directories
|
|
306
|
-
_load_env_files(directories)
|
|
307
|
-
|
|
308
|
-
# Load the yaml content
|
|
309
|
-
if is_uri:
|
|
310
|
-
original_uri = content
|
|
311
|
-
with fsspec.open(content, "r", encoding="utf-8") as f:
|
|
312
|
-
content = f.read() # type: ignore[misc]
|
|
313
|
-
return load_yaml_from_string(content, original_uri)
|
|
314
|
-
else:
|
|
315
|
-
return load_yaml_from_string(content)
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
def _resolve_root(doc: dsl.Document) -> DocumentRootType:
|
|
319
|
-
root = doc.root
|
|
320
|
-
# If the docroot is a type that ends in the name `List`, resolve it again
|
|
321
|
-
types_to_resolve = set(
|
|
322
|
-
[
|
|
323
|
-
dsl.AuthorizationProviderList,
|
|
324
|
-
dsl.IndexList,
|
|
325
|
-
dsl.ModelList,
|
|
326
|
-
dsl.ToolList,
|
|
327
|
-
dsl.VariableList,
|
|
328
|
-
]
|
|
329
|
-
)
|
|
330
|
-
if root is not None and type(root) in types_to_resolve:
|
|
331
|
-
root = root.root # type: ignore
|
|
332
|
-
return root # type: ignore[return-value]
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
def _list_dynamic_types_from_document(
|
|
336
|
-
loaded_yaml: dict[str, Any],
|
|
337
|
-
) -> list[dict]:
|
|
338
|
-
"""
|
|
339
|
-
Build dynamic types from the loaded YAML data.
|
|
340
|
-
|
|
341
|
-
Args:
|
|
342
|
-
loaded_yaml: The parsed YAML data containing type definitions.
|
|
343
|
-
|
|
344
|
-
Returns:
|
|
345
|
-
A registry of dynamically created Pydantic BaseModel classes.
|
|
346
|
-
"""
|
|
347
|
-
rv = []
|
|
348
|
-
|
|
349
|
-
# add any "types" if the loaded doc is an application
|
|
350
|
-
rv.extend(loaded_yaml.get("types", []))
|
|
351
|
-
|
|
352
|
-
# check for TypeList by seeing if we have root + custom types
|
|
353
|
-
if "root" in loaded_yaml:
|
|
354
|
-
root = loaded_yaml["root"]
|
|
355
|
-
if (
|
|
356
|
-
isinstance(root, list)
|
|
357
|
-
and len(root) > 0
|
|
358
|
-
and "properties" in root[0]
|
|
359
|
-
):
|
|
360
|
-
rv.extend(root)
|
|
361
|
-
|
|
362
|
-
# call recursively for any references
|
|
363
|
-
if "references" in loaded_yaml:
|
|
364
|
-
for ref in loaded_yaml["references"]:
|
|
365
|
-
rv.extend(_list_dynamic_types_from_document(ref))
|
|
366
|
-
return rv
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
def load_document(content: str) -> tuple[DocumentRootType, CustomTypeRegistry]:
|
|
370
|
-
"""Load a QType YAML file, validate it, and return the resolved root."""
|
|
371
|
-
yaml_data = load_yaml(content)
|
|
372
|
-
dynamic_types_lists = _list_dynamic_types_from_document(yaml_data)
|
|
373
|
-
dynamic_types_registry = build_dynamic_types(dynamic_types_lists)
|
|
374
|
-
document = dsl.Document.model_validate(
|
|
375
|
-
yaml_data, context={"custom_types": dynamic_types_registry}
|
|
376
|
-
)
|
|
377
|
-
root = _resolve_root(document)
|
|
378
|
-
return root, dynamic_types_registry
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
def load(content: str) -> tuple[Application, CustomTypeRegistry]:
|
|
382
|
-
"""Load a QType YAML file, validate it, and return the resolved root."""
|
|
383
|
-
root, dynamic_types_registry = load_document(content)
|
|
384
|
-
if not isinstance(root, dsl.Application):
|
|
385
|
-
raise ValueError(
|
|
386
|
-
f"Root document is not an Application, found {type(root)}."
|
|
387
|
-
)
|
|
388
|
-
root = validate(root)
|
|
389
|
-
return resolve(root), dynamic_types_registry
|
qtype-0.0.12.dist-info/RECORD
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
qtype/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
qtype/cli.py,sha256=XSVtfzpjTbQBQ60iyb5oupwi-mFpGH5jT8H1bJQdjis,4697
|
|
3
|
-
qtype/loader.py,sha256=5yqD19-ke5iBemeO1XC-o77y8WzNHWh3YKKs2cEY3MU,12782
|
|
4
|
-
qtype/application/__init__.py,sha256=WS3x0b0NRt-nRmj1trsytlvMpQS5KN7Hi6THGfY8bKE,230
|
|
5
|
-
qtype/application/documentation.py,sha256=_ftD344BS7xca6zxjAoiUzTyBrLTtH4iDXUkN4OO4Hs,4992
|
|
6
|
-
qtype/application/facade.py,sha256=GQ05OFs_FL5m-l8wAf05tujwUnoO5ciEX0vGozLlMcI,5660
|
|
7
|
-
qtype/application/commons/__init__.py,sha256=QyWAB2cvimM4DxNo2oBFCGkfBikH-ZeMBMGWmJcq4Uc,135
|
|
8
|
-
qtype/application/commons/tools.py,sha256=pJFY5mPiFErXVFLw2GtiFoWnS8xCNaDVtk-opkoB-zs,5004
|
|
9
|
-
qtype/application/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
-
qtype/application/converters/tools_from_api.py,sha256=qsycjLGZDnawND8JtK97avAEJcpAm5FGs8nDgePXzbc,774
|
|
11
|
-
qtype/application/converters/tools_from_module.py,sha256=zNyJdgMButHOmgXy0m1OKVPDUhl-4ZaSrSRsQBcSjvA,8017
|
|
12
|
-
qtype/application/converters/types.py,sha256=MNH0WOkY2ijGV17kLZIsp8mcHbfgUgLitpagKSaSYSU,1184
|
|
13
|
-
qtype/base/__init__.py,sha256=4jwcB8cDHzDNF3NBv8WqHNk3sDZDNvUFNjx2CKZ-pyY,283
|
|
14
|
-
qtype/base/exceptions.py,sha256=NR6-p6FnIabFPid9xIUTTeNhCYoIw8sbxEzaWQ11a4o,1155
|
|
15
|
-
qtype/base/logging.py,sha256=eqStjILlmhNryYRqUiyTdDHoUoiLKSY8J0GevvzvTKQ,1075
|
|
16
|
-
qtype/base/types.py,sha256=2kV4xnXYD_D0_xWhZbrrSlwAy14TtTyNuzbX5chqeVg,603
|
|
17
|
-
qtype/commands/__init__.py,sha256=Qo4M07zm5I63r8STxDjvt5fhP1jygdXTsExNGELkefc,257
|
|
18
|
-
qtype/commands/convert.py,sha256=ihYftUsnpBYxLZdtRZDV-J0s0pZDEl8EJ6gfEexGTFo,3167
|
|
19
|
-
qtype/commands/generate.py,sha256=783o4trRPGxkav8GfbGoYbycuNt-Ajk0Z5YBUnHBEI4,5677
|
|
20
|
-
qtype/commands/run.py,sha256=XQyuKW1igVU8AJ3vUcqIb0dRjoqdrenHvJ2Cv5j0Vy4,5105
|
|
21
|
-
qtype/commands/serve.py,sha256=KPp6vUOCIACFRkXyA5VwpK32NhrLIv_AxP7_WmqHz0o,2529
|
|
22
|
-
qtype/commands/validate.py,sha256=ERPa8dqfUPJzqHSV8UbDeA9MMjmSZxlfYYFL2gRnpaM,2259
|
|
23
|
-
qtype/commands/visualize.py,sha256=r_HeWeEoADXhMDBAuMcBXBdi8mvcB9pAH5a1YysJsAU,2992
|
|
24
|
-
qtype/dsl/__init__.py,sha256=EolSauOwNTWah8IKBkwikxLIsA0WIekvEkHhfQdnTE0,297
|
|
25
|
-
qtype/dsl/base_types.py,sha256=_Mw-r6TEbXwJeO0nThOiUyEL1S1_Q7Vtk4WWtCzGyNg,907
|
|
26
|
-
qtype/dsl/custom_types.py,sha256=t6odgKHQcLfJsoEqnqChOoqJ0rQrgFpeGPVS9ogMvOI,2920
|
|
27
|
-
qtype/dsl/domain_types.py,sha256=T0fVhdTyTrdtH4oOYvaRb7fstcReiwTQFCFYbDzPeew,1656
|
|
28
|
-
qtype/dsl/model.py,sha256=xhvTYyuNIerypQ-Dog5ncr80a1-iy7tketLbEtCKvN0,24542
|
|
29
|
-
qtype/dsl/validator.py,sha256=w3JZvBoFBGfmFJhFNYm6knmaY9IKVtPc3HVKcAvjQL8,18213
|
|
30
|
-
qtype/interpreter/__init__.py,sha256=IaRF90JLFbsTLKz9LTOMI_Pz4xwVaEyXPNaXV7sLou8,43
|
|
31
|
-
qtype/interpreter/api.py,sha256=8yAWFE_Vrue_gfyAA7eohwgdFNBMma2oTgEQYz5UCRU,7576
|
|
32
|
-
qtype/interpreter/conversions.py,sha256=SFkALpQc2qIApYe7ICuQp6eSuB0YLsE9-gJT_B0e2cU,6072
|
|
33
|
-
qtype/interpreter/exceptions.py,sha256=Il8IF0UAtYWQXwvOVQCY-csfRzC1iOejHM1G-nF5EfY,288
|
|
34
|
-
qtype/interpreter/flow.py,sha256=2u1wRahNFQaRRklnU4uW7_UKSD73-uZe_WiYlKitXQg,1233
|
|
35
|
-
qtype/interpreter/resource_cache.py,sha256=U7gFQGSzkcCETbBgLJIBWjuDOVvGdGEYhZWntbhSH2A,1072
|
|
36
|
-
qtype/interpreter/step.py,sha256=6rLznFCc8FT0edCbeA7mUYCz8NHhZzTIBpXTxrlG9eE,2084
|
|
37
|
-
qtype/interpreter/streaming_helpers.py,sha256=RlYFAwEFaczC5DGM60KAMZMgGOUgNyopY-CyNFkZybQ,4448
|
|
38
|
-
qtype/interpreter/telemetry.py,sha256=p1nmup-V_TBM64giYySewpjJOF5_FZgK_KTE5ad38Uk,632
|
|
39
|
-
qtype/interpreter/typing.py,sha256=HlEGsum7DSTgfNlsjWEb0RFM3EgaI_otBpUqwovTiyo,4687
|
|
40
|
-
qtype/interpreter/auth/__init__.py,sha256=L98AxaSizb6LMdXEr8FGe9MBtPBnfCeWxjI0oi7sg_o,62
|
|
41
|
-
qtype/interpreter/auth/aws.py,sha256=rNCf0njllNxIQwsl9_oZIDrYJ2Z-udICtCmT08GCD3o,7681
|
|
42
|
-
qtype/interpreter/auth/cache.py,sha256=uVyJ_jkbprRdlvbnm1DVIaYyTDLEsPXvi3xjuRneH2k,1825
|
|
43
|
-
qtype/interpreter/auth/generic.py,sha256=UFVbyX8kuqKqm_9ZtiHub8YZbwwnoOye6ln7ddY_jIE,3326
|
|
44
|
-
qtype/interpreter/batch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
-
qtype/interpreter/batch/flow.py,sha256=MzlZcqygOP3I-vQj9ESDKkko39zoSY-POIRhJ6gheAg,3118
|
|
46
|
-
qtype/interpreter/batch/sql_source.py,sha256=8Nu2TwSvKA8uSlQE9PEtehaTwuhM2Nk595h1eUGPrnc,3241
|
|
47
|
-
qtype/interpreter/batch/step.py,sha256=PLfIRxTahVHmgIVG10mDmr7MGU2M2A-zEq53mxaLJJ8,1907
|
|
48
|
-
qtype/interpreter/batch/types.py,sha256=3EMzsaFrEtcY2FFvMHvbRm54n34EMoe-mtJV68LAkKg,1098
|
|
49
|
-
qtype/interpreter/batch/utils.py,sha256=Q_AptPjy8e-B9d6ML9We9wuLG-fS5LgVCM3HgmNDRDA,6038
|
|
50
|
-
qtype/interpreter/chat/chat_api.py,sha256=-YAIyVATRbHR3sCqH-iOwsR73sv6UnVCHZXzVWlkSNA,9042
|
|
51
|
-
qtype/interpreter/chat/file_conversions.py,sha256=7_XWDFQwWVoYgA-mY4EknhOJrMKeybDzqA3VBJM5Psw,1751
|
|
52
|
-
qtype/interpreter/chat/vercel.py,sha256=yKjFFk2wXDbtvaDTXlES9d9mvLVPXu-g_iXDjKfOlIM,7261
|
|
53
|
-
qtype/interpreter/steps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
54
|
-
qtype/interpreter/steps/agent.py,sha256=Yg56YjTlrwc4oJ-f7ZBazF4ii2oJX8zMhETHF0-ArAU,4008
|
|
55
|
-
qtype/interpreter/steps/condition.py,sha256=E86aRWQpjz18QuKwcGyoIPoOKAvTDZgnpg9qXw6xYas,1128
|
|
56
|
-
qtype/interpreter/steps/decoder.py,sha256=toKiZHpM3_y6imV8xQXmAOvGGFhqJzXaWlM1HLIyOzw,2993
|
|
57
|
-
qtype/interpreter/steps/llm_inference.py,sha256=k7OD40QT95AfjMjAk-5nxCjYCnDe4RdNgIV0Cqn5R8A,5419
|
|
58
|
-
qtype/interpreter/steps/prompt_template.py,sha256=tK1j6DTUMvlDMcJZDGQ2lLgwq_LkaICIq0U5u-QK_WU,1597
|
|
59
|
-
qtype/interpreter/steps/search.py,sha256=wyVFwg5wVXytsm2JyNPwkuBAWpxEunP-dAiqhDZyii4,660
|
|
60
|
-
qtype/interpreter/steps/tool.py,sha256=zAL9us_KRrcaw_sktD1z2pm0Z2W9ruMd3rrjqk7TI_k,1996
|
|
61
|
-
qtype/interpreter/ui/404.html,sha256=K5zBsOVZB0Lh7R4BogHR_h4NU4sbBSP97ZL5dwlWiM0,6869
|
|
62
|
-
qtype/interpreter/ui/favicon.ico,sha256=K4rS0zRVqPc2_DqOv48L3qiEitTA20iigzvQ-c13WTI,25931
|
|
63
|
-
qtype/interpreter/ui/file.svg,sha256=K2eBLDJcGZoCU2zb7qDFk6cvcH0yO3LuPgjbqwZ1O9Q,391
|
|
64
|
-
qtype/interpreter/ui/globe.svg,sha256=thS5vxg5JZV2YayFFJj-HYAp_UOmL7_thvniYkpX588,1035
|
|
65
|
-
qtype/interpreter/ui/index.html,sha256=7VzTqVFXjI3NKv4wMtwUGMcDOMJxBevJ9d7XQpzcGbU,6391
|
|
66
|
-
qtype/interpreter/ui/index.txt,sha256=Hs_t7FgIDjYIrtDdhY4tUmwwjRtCk9FAG07S-FmafP8,3611
|
|
67
|
-
qtype/interpreter/ui/next.svg,sha256=VZld-tbstJRaHoVt3KA8XhaqW_E_0htN9qdK55NXvPw,1375
|
|
68
|
-
qtype/interpreter/ui/vercel.svg,sha256=8IEzey_uY1tFW2MnVAaj5_OdagFOJa2Q2rWmfmKhKsQ,128
|
|
69
|
-
qtype/interpreter/ui/window.svg,sha256=ZEdoxKrrR2e84pM0TusMEl-4BKlNgBRAQkByIC2F46E,385
|
|
70
|
-
qtype/interpreter/ui/404/index.html,sha256=K5zBsOVZB0Lh7R4BogHR_h4NU4sbBSP97ZL5dwlWiM0,6869
|
|
71
|
-
qtype/interpreter/ui/_next/static/OT8QJQW3J70VbDWWfrEMT/_buildManifest.js,sha256=j1u6BhF-PCQQBDiSp0UbEYyjZ1-hjTIIosO4Tx9e3KI,544
|
|
72
|
-
qtype/interpreter/ui/_next/static/OT8QJQW3J70VbDWWfrEMT/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
|
|
73
|
-
qtype/interpreter/ui/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js,sha256=LZF4GSB27wWEGfcZ8svgftIhKsR-dbSEPQOMFE1UMZk,172729
|
|
74
|
-
qtype/interpreter/ui/_next/static/chunks/736-7fc606e244fedcb1.js,sha256=yNH_WyfbOoWw0NRsePJlqmHvPCmDN3w2244GCXmOfVc,337788
|
|
75
|
-
qtype/interpreter/ui/_next/static/chunks/964-ed4ab073db645007.js,sha256=v5dtcpE2ZECkVNy0i9L7x835eE3qyfQ3yUQ95r1dTb8,166060
|
|
76
|
-
qtype/interpreter/ui/_next/static/chunks/ba12c10f-22556063851a6df2.js,sha256=eXW_aPZ8VSINIvVP-NviGhRkDqxNFH58YFNVtZv_DC0,26277
|
|
77
|
-
qtype/interpreter/ui/_next/static/chunks/framework-7c95b8e5103c9e90.js,sha256=DOKGYsI-E-_-bPetqL9T2YAkmfJw74DS4rMmb0q-Nu4,182720
|
|
78
|
-
qtype/interpreter/ui/_next/static/chunks/main-6d261b6c5d6fb6c2.js,sha256=LmsLY5w7lACmWyCyKhqJDnAMmk1ffssrNmCbtzWjM_o,117652
|
|
79
|
-
qtype/interpreter/ui/_next/static/chunks/main-app-6fc6346bc8f7f163.js,sha256=1ZmGHUk2IyojKisUhbDSHd92tWVBzkjQFWXfHfa6xGw,557
|
|
80
|
-
qtype/interpreter/ui/_next/static/chunks/polyfills-42372ed130431b0a.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
|
|
81
|
-
qtype/interpreter/ui/_next/static/chunks/webpack-8289c17c67827f22.js,sha256=xGAsqiCnTkzrQhTmQAoMy45UIK7SPjOOC_0fA4qJe68,3344
|
|
82
|
-
qtype/interpreter/ui/_next/static/chunks/app/layout-5ccbc44fd528d089.js,sha256=wVtButfgWSCi8dj8zkWwpIXVYN5ot8pj9IKOgXixDVQ,589
|
|
83
|
-
qtype/interpreter/ui/_next/static/chunks/app/page-c72e847e888e549d.js,sha256=efrxDdRrxeLPaS_c-jdZFRDo7xaeqklfuRbvBxRpavM,35662
|
|
84
|
-
qtype/interpreter/ui/_next/static/chunks/app/_not-found/page-e110d2a9d0a83d82.js,sha256=0vU7y8ruY2D5Gsa9ymwbZeK7yZbfPDm0yYiQ8SG8ZmI,2670
|
|
85
|
-
qtype/interpreter/ui/_next/static/chunks/pages/_app-0a0020ddd67f79cf.js,sha256=42mX-qEGt0LNFAAUjOhcM71wHqZHO_xQFM53G5WPiSc,233
|
|
86
|
-
qtype/interpreter/ui/_next/static/chunks/pages/_error-03529f2c21436739.js,sha256=m8CkMJwrMUfIvaSXNXOsO6TOxsWPXQjBa9R52GCvaQk,218
|
|
87
|
-
qtype/interpreter/ui/_next/static/css/a262c53826df929b.css,sha256=5HQ8Q1p6A9NJKRYWqPWPqWZkOtuKL3BU6OgBa_bh8Sk,40788
|
|
88
|
-
qtype/interpreter/ui/_next/static/media/569ce4b8f30dc480-s.p.woff2,sha256=G16_s6AalzQ6yWhz5tWajLKFxmAStqGsUJyydl6ZW6g,28356
|
|
89
|
-
qtype/interpreter/ui/_next/static/media/747892c23ea88013-s.woff2,sha256=fVYJU4p5VF7JReAZdx7VYuLGWmwcPEzMTqNDcuJ3w5Y,13036
|
|
90
|
-
qtype/interpreter/ui/_next/static/media/8d697b304b401681-s.woff2,sha256=L-8o3IIethe91jtC7gxTC4zX1J0g83yrYaTKeWUUpwM,14676
|
|
91
|
-
qtype/interpreter/ui/_next/static/media/93f479601ee12b01-s.p.woff2,sha256=t6wUSzlMvYEFLWOX7AwzOXl3sdfpvAledE5lKjeMb7M,31288
|
|
92
|
-
qtype/interpreter/ui/_next/static/media/9610d9e46709d722-s.woff2,sha256=N08hXnJfWWXM9XN7Rteie_5rOzIOaof0kGjkiIksSAk,12608
|
|
93
|
-
qtype/interpreter/ui/_next/static/media/ba015fad6dcf6784-s.woff2,sha256=92BKU6ACUPZttLR91EMnzipD9u3shQ1SF7uAI4gZ790,15292
|
|
94
|
-
qtype/semantic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
95
|
-
qtype/semantic/base_types.py,sha256=wfUlT0gV3_Mk1xLLI64SSXCB9GFmn29yz5adTaHrsOI,1540
|
|
96
|
-
qtype/semantic/generate.py,sha256=4xYDSz7sJG-py4MqLP1ePZjm5uwvAmOxsNRfF1NZFWY,15369
|
|
97
|
-
qtype/semantic/model.py,sha256=pFFUuLgKIKac9-vgPkv3m9wL5hjaGGuNrcUptnKgt3o,15256
|
|
98
|
-
qtype/semantic/resolver.py,sha256=rhePhY1m4h-qYZucIcBcu0DMocjlOs5OVSbhR5HZ2xo,3404
|
|
99
|
-
qtype/semantic/visualize.py,sha256=8eHKgiPOqbJIEd7LUQ1PiSO0RF6GUrnBQue9tV6EbMU,16924
|
|
100
|
-
qtype-0.0.12.dist-info/licenses/LICENSE,sha256=1KA5EgYBSR0O6nCH2HEvk6Di53YKJ9r_VCR7G8G8qAY,11341
|
|
101
|
-
qtype-0.0.12.dist-info/METADATA,sha256=o4iYQxFZQyK9By7ozLQJx8ZVmlL_1Pez4ilCbrfLAq8,4589
|
|
102
|
-
qtype-0.0.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
103
|
-
qtype-0.0.12.dist-info/entry_points.txt,sha256=5y4vj8RLvgl2tXSj-Hm7v5-Tn3kP4-UonjNoN-mfaQE,41
|
|
104
|
-
qtype-0.0.12.dist-info/top_level.txt,sha256=ONroH5B0mZ51jr7NSWCK0weFwwCO7wBLmyVS1YqNU14,6
|
|
105
|
-
qtype-0.0.12.dist-info/RECORD,,
|
/qtype/interpreter/ui/_next/static/{OT8QJQW3J70VbDWWfrEMT → 20HoJN6otZ_LyHLHpCPE6}/_ssgManifest.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|