synth-ai 0.2.8.dev8__py3-none-any.whl → 0.2.8.dev9__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.

Potentially problematic release.


This version of synth-ai might be problematic. Click here for more details.

@@ -16,9 +16,6 @@ from synth_ai.handshake import run_handshake, HandshakeError
16
16
  from synth_ai.demos.demo_task_apps.core import DemoEnv, DEFAULT_TASK_APP_SECRET_NAME
17
17
 
18
18
 
19
- TASK_APP_MODAL_SECRET = DEFAULT_TASK_APP_SECRET_NAME
20
-
21
-
22
19
  def _key_preview(value: str, label: str) -> str:
23
20
  """Return a short descriptor for a secret without leaking the full value."""
24
21
  try:
@@ -115,7 +112,6 @@ def cmd_setup(_args: argparse.Namespace) -> int:
115
112
  dotenv_values = {
116
113
  "TASK_APP_BASE_URL": new_url,
117
114
  "TASK_APP_NAME": env.task_app_name,
118
- "TASK_APP_SECRET_NAME": TASK_APP_MODAL_SECRET,
119
115
  }
120
116
  demo_core.persist_dotenv_values(dotenv_values)
121
117
  os.environ["TASK_APP_BASE_URL"] = new_url
@@ -237,67 +233,6 @@ def _popen_stream_capture(cmd: list[str], cwd: str | None = None, env: dict | No
237
233
  return int(proc.returncode or 0), "\n".join(buf_lines)
238
234
 
239
235
 
240
- def _mask_secret_args(args: list[str]) -> list[str]:
241
- masked: list[str] = []
242
- sensitive_prefixes = (
243
- "ENVIRONMENT_API_KEY=",
244
- "OPENAI_API_KEY=",
245
- "SYNTH_API_KEY=",
246
- )
247
- for a in args:
248
- if "=" in a and any(a.startswith(prefix) for prefix in sensitive_prefixes):
249
- try:
250
- key, value = a.split("=", 1)
251
- tail = value[-5:] if len(value) >= 5 else value
252
- masked.append(f"{key}=***{tail}")
253
- except Exception:
254
- masked.append("<masked>")
255
- else:
256
- masked.append(a)
257
- return masked
258
-
259
-
260
- def _ensure_modal_secret(
261
- secret_name: str,
262
- *,
263
- values: dict[str, str],
264
- label: str = "deploy",
265
- replace: bool = False,
266
- ) -> bool:
267
- prefix = f"[{label}]"
268
- if not secret_name.strip():
269
- raise RuntimeError("Secret name is required")
270
-
271
- if not values:
272
- raise RuntimeError("No values provided to create Modal secret")
273
-
274
- create_args = [f"{k}={v}" for k, v in values.items()]
275
- create_cmd = ["uv", "run", "modal", "secret", "create", secret_name, *create_args]
276
-
277
- if replace:
278
- print(f"{prefix} Removing Modal secret '{secret_name}' (if present)…")
279
- delete_commands = [
280
- ["bash", "-lc", f"printf 'y\\n' | uv run modal secret delete {secret_name}"],
281
- ["bash", "-lc", f"printf 'y\\n' | modal secret delete {secret_name}"],
282
- ]
283
- delete_code = None
284
- for delete_cmd in delete_commands:
285
- print(f"{prefix} Command:", " ".join(delete_cmd))
286
- delete_code = _popen_stream(delete_cmd)
287
- if delete_code in (0, 1):
288
- break
289
- if delete_code not in (0, 1):
290
- print(f"{prefix} Warning: delete command exited with {delete_code}; continuing to recreate")
291
-
292
- print(f"\n{prefix} Creating Modal secret '{secret_name}'…")
293
- print(f"{prefix} Command:", " ".join(_mask_secret_args(create_cmd)))
294
- code = _popen_stream(create_cmd)
295
- if code != 0:
296
- raise RuntimeError("Failed to provision Modal secret (see logs above)")
297
-
298
- return True
299
-
300
-
301
236
  def _fmt_float(value: float) -> str:
302
237
  return f"{value:.10g}"
303
238
 
@@ -666,22 +601,19 @@ def _ensure_task_app_ready(env: DemoEnv, synth_key: str, *, label: str) -> DemoE
666
601
  app_name = fallback
667
602
  demo_core.persist_task_url(task_url, name=app_name)
668
603
 
669
- secret_name = TASK_APP_MODAL_SECRET
670
604
  demo_core.persist_task_url(task_url, name=app_name)
671
605
  demo_core.persist_dotenv_values({
672
606
  "TASK_APP_BASE_URL": task_url,
673
607
  "TASK_APP_NAME": app_name,
674
- "TASK_APP_SECRET_NAME": secret_name,
608
+ "TASK_APP_SECRET_NAME": DEFAULT_TASK_APP_SECRET_NAME,
675
609
  })
676
610
 
677
- openai_key = (os.environ.get("OPENAI_API_KEY") or local_env.get("OPENAI_API_KEY") or "").strip()
678
- secret_values: dict[str, str] = {"ENVIRONMENT_API_KEY": env_key}
679
- if openai_key:
680
- secret_values["OPENAI_API_KEY"] = openai_key
681
611
  if synth_key:
682
- secret_values["SYNTH_API_KEY"] = synth_key
612
+ os.environ["SYNTH_API_KEY"] = synth_key
683
613
 
684
- _ensure_modal_secret(secret_name, values=secret_values, label=label, replace=True)
614
+ openai_key = (os.environ.get("OPENAI_API_KEY") or local_env.get("OPENAI_API_KEY") or "").strip()
615
+ if openai_key:
616
+ os.environ["OPENAI_API_KEY"] = openai_key
685
617
 
686
618
  rollout_url = task_url.rstrip("/") + "/health/rollout"
687
619
  print(f"[{label}] Verifying rollout health:")
@@ -712,8 +644,6 @@ def _ensure_task_app_ready(env: DemoEnv, synth_key: str, *, label: str) -> DemoE
712
644
  print(f"[{label}] Warning: rollout health check failed ({rc}). Response: {body}")
713
645
  try:
714
646
  print(f"[{label}] Sent header X-API-Key → {_key_preview(env_key, 'X-API-Key')}")
715
- if secret_name:
716
- print(f"[{label}] Modal secret name={secret_name}")
717
647
  except Exception:
718
648
  pass
719
649
  else:
@@ -721,16 +651,18 @@ def _ensure_task_app_ready(env: DemoEnv, synth_key: str, *, label: str) -> DemoE
721
651
 
722
652
  os.environ["TASK_APP_BASE_URL"] = task_url
723
653
  os.environ["ENVIRONMENT_API_KEY"] = env_key
654
+ os.environ["TASK_APP_SECRET_NAME"] = DEFAULT_TASK_APP_SECRET_NAME
724
655
  updated_env = demo_core.load_env()
725
656
  updated_env.env_api_key = env_key
726
657
  updated_env.task_app_base_url = task_url
727
658
  updated_env.task_app_name = app_name
728
- updated_env.task_app_secret_name = secret_name
659
+ updated_env.task_app_secret_name = DEFAULT_TASK_APP_SECRET_NAME
729
660
  return updated_env
730
661
 
731
662
 
732
663
  def cmd_deploy(args: argparse.Namespace) -> int:
733
664
  env = demo_core.load_env()
665
+ os.environ["TASK_APP_SECRET_NAME"] = DEFAULT_TASK_APP_SECRET_NAME
734
666
  cwd_env_path = os.path.join(os.getcwd(), ".env")
735
667
  local_env = demo_core.load_dotenv_file(cwd_env_path)
736
668
  url = ""
@@ -808,7 +740,6 @@ def cmd_deploy(args: argparse.Namespace) -> int:
808
740
  print("Aborted by user.")
809
741
  return 1
810
742
 
811
- secret_name = TASK_APP_MODAL_SECRET
812
743
  existing_env_key = (env.env_api_key or "").strip()
813
744
  env_key: str | None = existing_env_key or None
814
745
  if existing_env_key:
@@ -831,6 +762,8 @@ def cmd_deploy(args: argparse.Namespace) -> int:
831
762
  env.env_api_key = env_key
832
763
  local_env["ENVIRONMENT_API_KEY"] = env_key
833
764
  print("[deploy] Minted new ENVIRONMENT_API_KEY")
765
+ elif env_key:
766
+ os.environ["ENVIRONMENT_API_KEY"] = env_key
834
767
 
835
768
  # Optionally upload the new key to the backend using sealed box helper
836
769
  backend_base = (env.dev_backend_url or "").rstrip("/")
@@ -861,13 +794,14 @@ def cmd_deploy(args: argparse.Namespace) -> int:
861
794
 
862
795
  synth_key = (env.synth_api_key or os.environ.get("SYNTH_API_KEY") or local_env.get("SYNTH_API_KEY") or "").strip()
863
796
  if not synth_key:
864
- synth_key = input("Enter SYNTH_API_KEY for Modal secret (required): ").strip()
797
+ synth_key = input("Enter SYNTH_API_KEY for deployment (required): ").strip()
865
798
  if not synth_key:
866
- print("SYNTH_API_KEY is required to create the Modal secret.")
799
+ print("SYNTH_API_KEY is required for deployment.")
867
800
  return 1
868
801
  demo_core.persist_api_key(synth_key)
869
802
  demo_core.persist_dotenv_values({"SYNTH_API_KEY": synth_key})
870
803
  env.synth_api_key = synth_key
804
+ os.environ["SYNTH_API_KEY"] = synth_key
871
805
 
872
806
  openai_key = (os.environ.get("OPENAI_API_KEY") or local_env.get("OPENAI_API_KEY") or "").strip()
873
807
  if not openai_key:
@@ -875,25 +809,11 @@ def cmd_deploy(args: argparse.Namespace) -> int:
875
809
  "Enter your OpenAI API key, found at https://platform.openai.com/api-keys\n> "
876
810
  ).strip()
877
811
  if not openai_key:
878
- print("OPENAI_API_KEY is required to create the Modal secret.")
812
+ print("OPENAI_API_KEY is required for deployment.")
879
813
  return 1
880
814
  demo_core.persist_dotenv_values({"OPENAI_API_KEY": openai_key})
881
815
  local_env["OPENAI_API_KEY"] = openai_key
882
-
883
- values = {
884
- "SYNTH_API_KEY": synth_key,
885
- "OPENAI_API_KEY": openai_key,
886
- }
887
- if env_key:
888
- values["ENVIRONMENT_API_KEY"] = env_key
889
-
890
- try:
891
- created = _ensure_modal_secret(secret_name, values=values, label="deploy", replace=True)
892
- except RuntimeError as secret_err:
893
- print(f"Failed to prepare Modal secret '{secret_name}': {secret_err}")
894
- return 2
895
- if created:
896
- print(f"[deploy] Modal secret '{secret_name}' provisioned.")
816
+ os.environ["OPENAI_API_KEY"] = openai_key
897
817
 
898
818
  deploy_cmd = ["uv", "run", "python", "-m", "modal", "deploy", "--name", name_in, app_path]
899
819
  print("\nStreaming Modal build/deploy logs (this can take several minutes on first run)…\n")
@@ -943,7 +863,7 @@ def cmd_deploy(args: argparse.Namespace) -> int:
943
863
  dotenv_values = {"TASK_APP_BASE_URL": url}
944
864
  if app_name:
945
865
  dotenv_values["TASK_APP_NAME"] = app_name
946
- dotenv_values["TASK_APP_SECRET_NAME"] = TASK_APP_MODAL_SECRET
866
+ dotenv_values["TASK_APP_SECRET_NAME"] = DEFAULT_TASK_APP_SECRET_NAME
947
867
  dotenv_path = demo_core.persist_dotenv_values(dotenv_values)
948
868
  print(f"TASK_APP_BASE_URL={url}")
949
869
  if app_name:
@@ -952,7 +872,6 @@ def cmd_deploy(args: argparse.Namespace) -> int:
952
872
  print(f" export TASK_APP_BASE_URL={url}")
953
873
  if app_name:
954
874
  print(f" export TASK_APP_NAME={app_name}")
955
- print(f" export TASK_APP_SECRET_NAME={TASK_APP_MODAL_SECRET}")
956
875
  print(f"Persisted to {dotenv_path}")
957
876
  print("\nNext step:\n$ uvx synth-ai run")
958
877
  return 0
@@ -1228,7 +1147,7 @@ def cmd_run(args: argparse.Namespace) -> int:
1228
1147
  print(f" {_key_preview(sk, 'SYNTH_API_KEY')}")
1229
1148
  if ek:
1230
1149
  print(f" {_key_preview(ek, 'ENVIRONMENT_API_KEY')}")
1231
- print("Also ensure your Modal secret contains ENVIRONMENT_API_KEY and matches the task app.")
1150
+ print("Ensure the ENVIRONMENT_API_KEY you deployed with matches the task app and remains exported.")
1232
1151
  return code
1233
1152
 
1234
1153
  # Fallback: legacy jobs API flow
@@ -1305,7 +1224,7 @@ def cmd_run(args: argparse.Namespace) -> int:
1305
1224
  print("Hint: HTTP 401 Unauthorized from backend. Verify SYNTH_API_KEY for:", base_url)
1306
1225
  if sk:
1307
1226
  print(f" {_key_preview(sk, 'SYNTH_API_KEY')}")
1308
- print("Also ensure your Modal secret contains a valid ENVIRONMENT_API_KEY.")
1227
+ print("Ensure the ENVIRONMENT_API_KEY and OPENAI_API_KEY used for deployment remain valid.")
1309
1228
  except Exception:
1310
1229
  pass
1311
1230
  return 2
@@ -4,7 +4,6 @@ import json
4
4
  import os
5
5
  import subprocess
6
6
  import sys
7
- import time
8
7
  from dataclasses import dataclass
9
8
  from typing import Any, Dict, Optional, Tuple
10
9
 
@@ -13,6 +12,9 @@ import urllib.request
13
12
  from synth_ai.config.base_url import PROD_BASE_URL_DEFAULT
14
13
 
15
14
 
15
+ DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-secret"
16
+
17
+
16
18
  @dataclass
17
19
  class DemoEnv:
18
20
  dev_backend_url: str = ""
@@ -20,10 +22,7 @@ class DemoEnv:
20
22
  env_api_key: str = ""
21
23
  task_app_base_url: str = ""
22
24
  task_app_name: str = ""
23
- task_app_secret_name: str = ""
24
-
25
-
26
- DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-secret"
25
+ task_app_secret_name: str = DEFAULT_TASK_APP_SECRET_NAME
27
26
 
28
27
  def _mask(value: str, keep: int = 4) -> str:
29
28
  if not value:
@@ -287,7 +286,7 @@ def load_env() -> DemoEnv:
287
286
  )
288
287
 
289
288
  task_app_name = str(state.get("TASK_APP_NAME") or "")
290
- task_app_secret_name = DEFAULT_TASK_APP_SECRET_NAME
289
+ task_app_secret_name = str(state.get("TASK_APP_SECRET_NAME") or DEFAULT_TASK_APP_SECRET_NAME)
291
290
 
292
291
  env.dev_backend_url = dev_url.rstrip("/")
293
292
  env.synth_api_key = synth_api_key
@@ -369,16 +368,17 @@ def persist_task_url(url: str, *, name: str | None = None) -> None:
369
368
  if data.get("TASK_APP_NAME") != name:
370
369
  data["TASK_APP_NAME"] = name
371
370
  changed.append("TASK_APP_NAME")
372
- secret_name = DEFAULT_TASK_APP_SECRET_NAME
373
- if data.get("TASK_APP_SECRET_NAME") != secret_name:
374
- data["TASK_APP_SECRET_NAME"] = secret_name
375
- if "TASK_APP_NAME" not in changed:
376
- changed.append("TASK_APP_SECRET_NAME")
371
+ if data.get("TASK_APP_SECRET_NAME") != DEFAULT_TASK_APP_SECRET_NAME:
372
+ data["TASK_APP_SECRET_NAME"] = DEFAULT_TASK_APP_SECRET_NAME
373
+ changed.append("TASK_APP_SECRET_NAME")
374
+ elif data.get("TASK_APP_SECRET_NAME") != DEFAULT_TASK_APP_SECRET_NAME:
375
+ data["TASK_APP_SECRET_NAME"] = DEFAULT_TASK_APP_SECRET_NAME
376
+ changed.append("TASK_APP_SECRET_NAME")
377
377
  _write_state(data)
378
378
  if changed:
379
379
  print(f"Saved {', '.join(changed)} to {_state_path()}")
380
- if "TASK_APP_NAME" in changed or "TASK_APP_SECRET_NAME" in changed:
381
- print(f"TASK_APP_SECRET_NAME={data.get('TASK_APP_SECRET_NAME', '')}")
380
+ if "TASK_APP_SECRET_NAME" in changed:
381
+ print(f"TASK_APP_SECRET_NAME={DEFAULT_TASK_APP_SECRET_NAME}")
382
382
 
383
383
 
384
384
  def persist_api_key(key: str) -> None:
@@ -7,7 +7,11 @@ from pathlib import Path
7
7
 
8
8
  from modal import App, Image, Secret, asgi_app
9
9
  from functools import lru_cache
10
- from synth_ai.demos.demo_task_apps.core import DEFAULT_TASK_APP_SECRET_NAME
10
+
11
+ try: # Backward compatibility with older installed SDKs
12
+ from synth_ai.demos.demo_task_apps.core import DEFAULT_TASK_APP_SECRET_NAME
13
+ except Exception: # pragma: no cover - occurs on older deployments
14
+ DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-secret"
11
15
 
12
16
  # Self-contained: no external problem bank installer required
13
17
 
@@ -43,15 +47,49 @@ if _SYNTH_HOSTED is not None:
43
47
 
44
48
  # No extra local dirs required; app is self-contained
45
49
 
50
+
51
+ def _build_inline_secret() -> Secret:
52
+ required = ("ENVIRONMENT_API_KEY",)
53
+ optional = ("SYNTH_API_KEY", "OPENAI_API_KEY")
54
+ payload: dict[str, str] = {}
55
+ missing: list[str] = []
56
+
57
+ for key in required:
58
+ value = (os.environ.get(key) or "").strip()
59
+ if not value:
60
+ missing.append(key)
61
+ else:
62
+ payload[key] = value
63
+
64
+ for key in optional:
65
+ value = (os.environ.get(key) or "").strip()
66
+ if value:
67
+ payload[key] = value
68
+
69
+ if missing:
70
+ raise RuntimeError(
71
+ "Missing required environment values for inline secret: " + ", ".join(missing)
72
+ )
73
+
74
+ previews = ", ".join(f"{k}:len={len(v)}" for k, v in payload.items())
75
+ print(f"[startup] TASK_APP_SECRET_NAME={DEFAULT_TASK_APP_SECRET_NAME}")
76
+ print(f"[startup] inline secret prepared ({previews})")
77
+
78
+ return Secret.from_dict(payload)
79
+
80
+
81
+ INLINE_SECRET = _build_inline_secret()
82
+
46
83
  app = App("hendrycks-math-task-app")
47
- hendryks_secret = DEFAULT_TASK_APP_SECRET_NAME
84
+
85
+
48
86
  @app.function(
49
87
  image=image,
50
88
  timeout=600,
51
89
  memory=16384,
52
90
  cpu=4,
53
91
  min_containers=1,
54
- secrets=[Secret.from_name(hendryks_secret)],
92
+ secrets=[INLINE_SECRET],
55
93
  )
56
94
  @asgi_app()
57
95
  def fastapi_app():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.2.8.dev8
3
+ Version: 0.2.8.dev9
4
4
  Summary: RL as a service SDK - Core AI functionality and tracing
5
5
  Author-email: Synth AI <josh@usesynth.ai>
6
6
  License-Expression: MIT
@@ -21,16 +21,16 @@ synth_ai/config/base_url.py,sha256=c85LaABBrvsl8Fp8KH0LNtJJrpnUwlzA5Ywbuth8fHE,3
21
21
  synth_ai/core/experiment.py,sha256=hLkPtzUFA7iY3-QpeJ5K8YjvQeyfqnjab5P2CFaojys,236
22
22
  synth_ai/core/system.py,sha256=s-Z7np2ISYmYc1r9YN-y2yb3cgRlOalrh0iaqnxeo84,206
23
23
  synth_ai/demos/core/__init__.py,sha256=A2FjhY7KXGtyzdQXqeTPCkEhHfrH-eQg6bvP8HaYhZM,36
24
- synth_ai/demos/core/cli.py,sha256=kXvW6hqEbjLp5m8tnsqbLxBbEt-c5gVAzphg4mPf2ik,56914
24
+ synth_ai/demos/core/cli.py,sha256=3yQSyygbK6Ix2UZCbVepVrSQF4LnI4E2TARLlyuhVF4,54009
25
25
  synth_ai/demos/demo_task_apps/__init__.py,sha256=8aUGEGpWUw11GRb3wQXRAmQ99yjAt5qd5FCTDJpXWjI,44
26
- synth_ai/demos/demo_task_apps/core.py,sha256=1JZBTW7J9lR_I4mSal7XlcK0QtVDQm-bA9WiNmPha4A,14624
26
+ synth_ai/demos/demo_task_apps/core.py,sha256=Eu7gp0VtZ9tE1HPLG14-pkjC1cD_7brsdl2IRbdSBts,14764
27
27
  synth_ai/demos/demo_task_apps/math/__init__.py,sha256=WBzpZwSn7pRarBmhopQi34i9bEm05-71eM3siboOavY,43
28
28
  synth_ai/demos/demo_task_apps/math/_common.py,sha256=SgtVW1pne4pgwGS2gYYQWkmG9BvU2sQTYzlncmUJ0NM,533
29
29
  synth_ai/demos/demo_task_apps/math/app.py,sha256=gNopoAhwM0vzdKuCa7AwQqSwiV2xagrjMxMH9YIniv4,1160
30
30
  synth_ai/demos/demo_task_apps/math/config.toml,sha256=Kxrzuyj7Az5mvzXaipPIyngKTDqphohf6uSWOHCF5cw,2105
31
31
  synth_ai/demos/demo_task_apps/math/deploy_modal.py,sha256=O4745sFuGEZTsygl-mz6ZOFJ7mog8CquXMgMyjFKr_c,2288
32
32
  synth_ai/demos/demo_task_apps/math/deploy_task_app.sh,sha256=qVffbAmsiCAxzFDzcxNVF4f7yyLWnmqPc1cNydHT5BQ,791
33
- synth_ai/demos/demo_task_apps/math/modal_task_app.py,sha256=1hv0CYNmIV-6aiiUYw_myR1cM1_ApcMiCQ6NmavLP94,20244
33
+ synth_ai/demos/demo_task_apps/math/modal_task_app.py,sha256=JKSlBxl5BetTx8211PomHvqPibj6bglx-iXFYYmO87s,21313
34
34
  synth_ai/environments/__init__.py,sha256=BQW0Nc_BFQq_N-pcqTyJVjW56kSEXu7XZyaSer-U95Q,1032
35
35
  synth_ai/environments/environment/__init__.py,sha256=EBol9AKxPTIPXWcbH9Tja-l3yL-N2kB8e5atyf6F66c,31
36
36
  synth_ai/environments/environment/core.py,sha256=0jd0CZ88_s_qqA3d1lOgVsnv-ucw_1lJDAIUj1gTSt0,2201
@@ -412,9 +412,9 @@ synth_ai/v0/tracing_v1/events/manage.py,sha256=ZDXXP-ZwLH9LCsmw7Ru9o55d7bl_diPtJ
412
412
  synth_ai/v0/tracing_v1/events/scope.py,sha256=BuBkhSpVHUJt8iGT9HJZF82rbb88mQcd2vM2shg-w2I,2550
413
413
  synth_ai/v0/tracing_v1/events/store.py,sha256=0342lvAcalyJbVEIzQFaPuMQGgwiFm7M5rE6gr-G0E8,9041
414
414
  synth_ai/zyk/__init__.py,sha256=htVLnzTYQ5rxzYpzSYBm7_o6uNKZ3pB_PrqkBrgTRS4,771
415
- synth_ai-0.2.8.dev8.dist-info/licenses/LICENSE,sha256=ynhjRQUfqA_RdGRATApfFA_fBAy9cno04sLtLUqxVFM,1069
416
- synth_ai-0.2.8.dev8.dist-info/METADATA,sha256=nHpXX9X8FZHz-rYwQul-fAM8ImsHge6OGUQEXJuUrc0,5152
417
- synth_ai-0.2.8.dev8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
418
- synth_ai-0.2.8.dev8.dist-info/entry_points.txt,sha256=Neq-3bT7TAijjgOIR77pKL-WYg6TWBDeO8pp_nL4vGY,91
419
- synth_ai-0.2.8.dev8.dist-info/top_level.txt,sha256=fBmtZyVHuKaGa29oHBaaUkrUIWTqSpoVMPiVdCDP3k8,9
420
- synth_ai-0.2.8.dev8.dist-info/RECORD,,
415
+ synth_ai-0.2.8.dev9.dist-info/licenses/LICENSE,sha256=ynhjRQUfqA_RdGRATApfFA_fBAy9cno04sLtLUqxVFM,1069
416
+ synth_ai-0.2.8.dev9.dist-info/METADATA,sha256=GhbfwG2ZggpD4GgfnWfSc4DoRG1OKktoRQL4XBKJ1gw,5152
417
+ synth_ai-0.2.8.dev9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
418
+ synth_ai-0.2.8.dev9.dist-info/entry_points.txt,sha256=Neq-3bT7TAijjgOIR77pKL-WYg6TWBDeO8pp_nL4vGY,91
419
+ synth_ai-0.2.8.dev9.dist-info/top_level.txt,sha256=fBmtZyVHuKaGa29oHBaaUkrUIWTqSpoVMPiVdCDP3k8,9
420
+ synth_ai-0.2.8.dev9.dist-info/RECORD,,