synth-ai 0.2.12__py3-none-any.whl → 0.2.13.dev1__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.

Files changed (48) hide show
  1. examples/agora_ex/README_MoE.md +224 -0
  2. examples/agora_ex/__init__.py +7 -0
  3. examples/agora_ex/agora_ex.py +65 -0
  4. examples/agora_ex/agora_ex_task_app.py +590 -0
  5. examples/agora_ex/configs/rl_lora_qwen3_moe_2xh200.toml +121 -0
  6. examples/agora_ex/reward_fn_grpo-human.py +129 -0
  7. examples/agora_ex/system_prompt_CURRENT.md +63 -0
  8. examples/agora_ex/task_app/agora_ex_task_app.py +590 -0
  9. examples/agora_ex/task_app/reward_fn_grpo-human.py +129 -0
  10. examples/agora_ex/task_app/system_prompt_CURRENT.md +63 -0
  11. examples/multi_step/configs/crafter_rl_outcome.toml +74 -0
  12. examples/multi_step/configs/crafter_rl_stepwise_hosted_judge.toml +175 -0
  13. examples/multi_step/configs/crafter_rl_stepwise_shaped.toml +83 -0
  14. examples/multi_step/configs/crafter_rl_stepwise_simple.toml +78 -0
  15. examples/multi_step/crafter_rl_lora.md +51 -10
  16. examples/multi_step/sse_metrics_streaming_notes.md +357 -0
  17. examples/multi_step/task_app_config_notes.md +7 -1
  18. examples/warming_up_to_rl/configs/eval_stepwise_complex.toml +4 -2
  19. examples/warming_up_to_rl/configs/eval_stepwise_simple.toml +4 -2
  20. examples/warming_up_to_rl/run_eval.py +127 -18
  21. examples/warming_up_to_rl/task_app/grpo_crafter.py +3 -33
  22. examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py +109 -45
  23. examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py +42 -46
  24. examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py +232 -193
  25. synth_ai/__init__.py +41 -1
  26. synth_ai/api/train/builders.py +49 -19
  27. synth_ai/api/train/configs/__init__.py +44 -0
  28. synth_ai/api/train/configs/rl.py +133 -0
  29. synth_ai/api/train/configs/sft.py +94 -0
  30. synth_ai/api/train/configs/shared.py +24 -0
  31. synth_ai/cli/demo.py +38 -39
  32. synth_ai/cli/rl_demo.py +81 -102
  33. synth_ai/cli/task_apps.py +3 -0
  34. synth_ai/demos/core/cli.py +121 -159
  35. synth_ai/environments/examples/crafter_classic/environment.py +16 -0
  36. synth_ai/evals/__init__.py +15 -0
  37. synth_ai/evals/client.py +85 -0
  38. synth_ai/evals/types.py +42 -0
  39. synth_ai/judge_schemas.py +127 -0
  40. synth_ai/rubrics/__init__.py +22 -0
  41. synth_ai/rubrics/validators.py +126 -0
  42. synth_ai/tracing_v3/serialization.py +130 -0
  43. {synth_ai-0.2.12.dist-info → synth_ai-0.2.13.dev1.dist-info}/METADATA +1 -1
  44. {synth_ai-0.2.12.dist-info → synth_ai-0.2.13.dev1.dist-info}/RECORD +48 -22
  45. {synth_ai-0.2.12.dist-info → synth_ai-0.2.13.dev1.dist-info}/entry_points.txt +0 -1
  46. {synth_ai-0.2.12.dist-info → synth_ai-0.2.13.dev1.dist-info}/WHEEL +0 -0
  47. {synth_ai-0.2.12.dist-info → synth_ai-0.2.13.dev1.dist-info}/licenses/LICENSE +0 -0
  48. {synth_ai-0.2.12.dist-info → synth_ai-0.2.13.dev1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,127 @@
1
+ """
2
+ Judge API Contract Schemas
3
+
4
+ These schemas define the expected structure for requests and responses
5
+ to the judge scoring endpoint at POST /api/judge/v1/score.
6
+
7
+ This is the canonical contract that the backend MUST conform to.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import Any, Dict, List, Literal, Optional
13
+
14
+ from pydantic import BaseModel, Field
15
+
16
+
17
+ class CriterionScorePayload(BaseModel):
18
+ """Per-criterion score returned by the judge."""
19
+
20
+ score: float = Field(..., description="Numeric score for this criterion")
21
+ reason: str = Field(default="", description="Explanation for the score")
22
+ weight: float = Field(default=1.0, description="Weight of this criterion")
23
+ description: str = Field(default="", description="Description of the criterion")
24
+
25
+
26
+ class ReviewPayload(BaseModel):
27
+ """Rubric review (event-level or outcome-level)."""
28
+
29
+ criteria: Dict[str, CriterionScorePayload] = Field(
30
+ default_factory=dict,
31
+ description="Map of criterion keys to their scores"
32
+ )
33
+ total: float = Field(default=0.0, description="Aggregated total score")
34
+ summary: Optional[str] = Field(None, description="Optional text summary")
35
+
36
+
37
+ class JudgeScoreResponse(BaseModel):
38
+ """
39
+ Response body for POST /api/judge/v1/score.
40
+
41
+ This is the canonical contract that judge backends MUST return.
42
+ """
43
+
44
+ status: Literal["ok", "failed"] = Field(default="ok", description="Request status")
45
+ event_reviews: List[ReviewPayload] = Field(
46
+ default_factory=list,
47
+ description="List of per-event rubric reviews (one per step)"
48
+ )
49
+ outcome_review: Optional[ReviewPayload] = Field(
50
+ None,
51
+ description="Optional outcome-level rubric review"
52
+ )
53
+ event_totals: List[float] = Field(
54
+ default_factory=list,
55
+ description="List of aggregated scores per event (matches event_reviews length)"
56
+ )
57
+ details: Dict[str, Any] = Field(
58
+ default_factory=dict,
59
+ description="Additional details (provider, latency, etc.)"
60
+ )
61
+ metadata: Dict[str, Any] = Field(
62
+ default_factory=dict,
63
+ description="Request metadata (provider, options, etc.)"
64
+ )
65
+
66
+ def aggregate_event_reward(self) -> float | None:
67
+ """
68
+ Aggregate all event totals into a single reward.
69
+
70
+ Returns:
71
+ Sum of all event_totals, or None if empty
72
+ """
73
+ if not self.event_totals:
74
+ return None
75
+ return sum(self.event_totals)
76
+
77
+ def aggregate_outcome_reward(self) -> float | None:
78
+ """
79
+ Extract outcome reward from outcome_review.
80
+
81
+ Returns:
82
+ outcome_review.total, or None if no outcome review
83
+ """
84
+ if self.outcome_review is None:
85
+ return None
86
+ return self.outcome_review.total
87
+
88
+
89
+ # Request schemas for completeness
90
+
91
+ class JudgeTaskApp(BaseModel):
92
+ """Task application metadata."""
93
+
94
+ id: str = Field(..., description="Task app identifier")
95
+ base_url: Optional[str] = Field(None, description="Optional base URL for task app")
96
+
97
+
98
+ class JudgeOptions(BaseModel):
99
+ """Judge provider and configuration options."""
100
+
101
+ provider: Optional[str] = Field(None, description="Judge provider (e.g., 'openai', 'groq')")
102
+ model: Optional[str] = Field(None, description="Model identifier")
103
+ rubric_id: Optional[str] = Field(None, description="Rubric identifier")
104
+ event: bool = Field(True, description="Enable event-level judging")
105
+ outcome: bool = Field(True, description="Enable outcome-level judging")
106
+
107
+
108
+ class JudgeTracePayload(BaseModel):
109
+ """Trace payload containing trajectory context."""
110
+
111
+ event_history: List[Dict[str, Any]] = Field(..., description="List of events/steps")
112
+ markov_blanket_message_history: List[Dict[str, Any]] = Field(
113
+ default_factory=list,
114
+ description="Optional message history for context"
115
+ )
116
+ metadata: Dict[str, Any] = Field(default_factory=dict, description="Trace metadata")
117
+
118
+
119
+ class JudgeScoreRequest(BaseModel):
120
+ """Request body for POST /api/judge/v1/score."""
121
+
122
+ policy_name: str = Field(..., description="Name of the policy being evaluated")
123
+ task_app: JudgeTaskApp = Field(..., description="Task application metadata")
124
+ trace: JudgeTracePayload = Field(..., description="Trajectory trace to evaluate")
125
+ options: JudgeOptions = Field(default_factory=lambda: JudgeOptions(), description="Judge options")
126
+ rubric: Optional[Dict[str, Any]] = Field(None, description="Optional explicit rubric criteria")
127
+
@@ -0,0 +1,22 @@
1
+ """
2
+ Rubric utilities.
3
+
4
+ Exposes helpers for validating rubric specifications that are used across
5
+ Crafter-style judge configurations.
6
+ """
7
+
8
+ from .validators import (
9
+ RubricCriterion,
10
+ RubricSpec,
11
+ ValidationError,
12
+ validate_rubric_dict,
13
+ validate_rubric_file,
14
+ )
15
+
16
+ __all__ = [
17
+ "RubricCriterion",
18
+ "RubricSpec",
19
+ "ValidationError",
20
+ "validate_rubric_dict",
21
+ "validate_rubric_file",
22
+ ]
@@ -0,0 +1,126 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import math
5
+ from pathlib import Path
6
+ from typing import Any, Iterable, Literal
7
+
8
+ import pydantic
9
+
10
+
11
+ class RubricCriterion(pydantic.BaseModel):
12
+ """Single scoring criterion within a rubric."""
13
+
14
+ id: str
15
+ description: str
16
+ weight: float
17
+ scale: str | None = None
18
+
19
+ @pydantic.field_validator("weight")
20
+ @classmethod
21
+ def _validate_weight(cls, value: float) -> float:
22
+ if not math.isfinite(value):
23
+ raise ValueError("weight must be a finite number")
24
+ if value <= 0.0:
25
+ raise ValueError("weight must be positive")
26
+ if value > 1.0:
27
+ raise ValueError("weight must be <= 1.0")
28
+ return value
29
+
30
+ @pydantic.field_validator("id", "description", mode="before")
31
+ @classmethod
32
+ def _strip_string(cls, value: Any) -> Any:
33
+ if isinstance(value, str):
34
+ return value.strip()
35
+ return value
36
+
37
+
38
+ class RubricSpec(pydantic.BaseModel):
39
+ """High-level rubric definition used by step-wise judges."""
40
+
41
+ version: str
42
+ goal_text: str
43
+ aggregation: Literal["weighted_sum"]
44
+ criteria: list[RubricCriterion]
45
+
46
+ @pydantic.model_validator(mode="after")
47
+ def _validate_weights(self) -> "RubricSpec":
48
+ if not self.criteria:
49
+ raise ValueError("rubric must declare at least one criterion")
50
+ total_weight = sum(criterion.weight for criterion in self.criteria)
51
+ if not math.isclose(total_weight, 1.0, abs_tol=1e-6, rel_tol=1e-6):
52
+ raise ValueError(
53
+ f"criterion weights must sum to 1 (got {total_weight:.6f})"
54
+ )
55
+ return self
56
+
57
+ @pydantic.field_validator("version")
58
+ @classmethod
59
+ def _non_empty_version(cls, value: str) -> str:
60
+ value = value.strip()
61
+ if not value:
62
+ raise ValueError("version string must not be empty")
63
+ return value
64
+
65
+ @pydantic.field_validator("goal_text")
66
+ @classmethod
67
+ def _non_empty_goal_text(cls, value: str) -> str:
68
+ value = value.strip()
69
+ if not value:
70
+ raise ValueError("goal_text must not be empty")
71
+ return value
72
+
73
+
74
+ ValidationError = pydantic.ValidationError
75
+
76
+
77
+ def validate_rubric_dict(payload: dict[str, Any]) -> RubricSpec:
78
+ """
79
+ Validate an in-memory rubric payload and return the parsed model.
80
+
81
+ Args:
82
+ payload: Dictionary representing the rubric JSON.
83
+ Returns:
84
+ Validated RubricSpec instance.
85
+ Raises:
86
+ ValidationError: If the payload is missing required fields or contains
87
+ invalid weights.
88
+ """
89
+
90
+ if not isinstance(payload, dict):
91
+ raise TypeError("rubric payload must be a dictionary")
92
+ return RubricSpec.model_validate(payload)
93
+
94
+
95
+ def _load_payload_from_file(path: Path) -> dict[str, Any]:
96
+ if path.suffix.lower() != ".json":
97
+ raise ValueError(f"Unsupported rubric file type: {path}")
98
+ text = path.read_text(encoding="utf-8")
99
+ return json.loads(text)
100
+
101
+
102
+ def validate_rubric_file(path: Path) -> RubricSpec:
103
+ """
104
+ Load and validate a rubric file.
105
+
106
+ Args:
107
+ path: Path to a JSON rubric document.
108
+ Returns:
109
+ Validated RubricSpec instance.
110
+ """
111
+
112
+ payload = _load_payload_from_file(path)
113
+ return validate_rubric_dict(payload)
114
+
115
+
116
+ def validate_rubric_files(paths: Iterable[Path]) -> list[RubricSpec]:
117
+ """
118
+ Validate multiple rubric files and return their parsed models.
119
+
120
+ Useful for bulk validation inside tests or CI checks.
121
+ """
122
+
123
+ validated: list[RubricSpec] = []
124
+ for path in paths:
125
+ validated.append(validate_rubric_file(path))
126
+ return validated
@@ -0,0 +1,130 @@
1
+ """HTTP-safe serialization helpers for tracing v3.
2
+
3
+ These utilities normalize tracing structures (including dataclasses) into
4
+ JSON-serializable forms and provide a compact JSON encoder suitable for
5
+ HTTP transmission to backend services.
6
+
7
+ Design goals:
8
+ - Preserve structure while ensuring standard-compliant JSON (no NaN/Infinity)
9
+ - Handle common non-JSON types: datetime, Decimal, bytes, set/tuple, numpy scalars
10
+ - Keep output compact (no unnecessary whitespace) while readable if needed
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import base64
16
+ import json
17
+ from dataclasses import asdict, is_dataclass
18
+ from datetime import date, datetime
19
+ from decimal import Decimal
20
+ from enum import Enum
21
+ from typing import Any
22
+
23
+ try:
24
+ import numpy as _np # type: ignore
25
+ except Exception: # pragma: no cover - numpy optional at runtime
26
+ _np = None # type: ignore
27
+
28
+
29
+ def normalize_for_json(value: Any) -> Any:
30
+ """Return a JSON-serializable version of ``value``.
31
+
32
+ Rules:
33
+ - dataclass → dict (recursively normalized)
34
+ - datetime/date → ISO-8601 string (UTC-aware datetimes preserve tzinfo)
35
+ - Decimal → float (fallback to string if not finite)
36
+ - bytes/bytearray → base64 string (RFC 4648)
37
+ - set/tuple → list
38
+ - Enum → enum.value (normalized)
39
+ - numpy scalar → corresponding Python scalar
40
+ - float NaN/Inf/−Inf → None (to keep JSON standard compliant)
41
+ - dict / list → recursively normalized
42
+ - other primitives (str, int, bool, None, float) passed through
43
+ """
44
+
45
+ # Dataclasses
46
+ if is_dataclass(value) and not isinstance(value, type):
47
+ try:
48
+ return normalize_for_json(asdict(value))
49
+ except Exception:
50
+ # Fallback: best-effort conversion via __dict__
51
+ return normalize_for_json(getattr(value, "__dict__", {}))
52
+
53
+ # Mapping
54
+ if isinstance(value, dict):
55
+ return {str(k): normalize_for_json(v) for k, v in value.items()}
56
+
57
+ # Sequences
58
+ if isinstance(value, (list, tuple, set)):
59
+ return [normalize_for_json(v) for v in value]
60
+
61
+ # Datetime / Date
62
+ if isinstance(value, (datetime, date)):
63
+ return value.isoformat()
64
+
65
+ # Decimal
66
+ if isinstance(value, Decimal):
67
+ try:
68
+ f = float(value)
69
+ if f != f or f in (float("inf"), float("-inf")):
70
+ return str(value)
71
+ return f
72
+ except Exception:
73
+ return str(value)
74
+
75
+ # Bytes-like
76
+ if isinstance(value, (bytes, bytearray)):
77
+ return base64.b64encode(bytes(value)).decode("ascii")
78
+
79
+ # Enum
80
+ if isinstance(value, Enum):
81
+ return normalize_for_json(value.value)
82
+
83
+ # Numpy scalars / arrays
84
+ if _np is not None:
85
+ if isinstance(value, (_np.generic,)): # type: ignore[attr-defined]
86
+ return normalize_for_json(value.item())
87
+ if isinstance(value, (_np.ndarray,)):
88
+ return normalize_for_json(value.tolist())
89
+
90
+ # Floats: sanitize NaN / Infinity to None
91
+ if isinstance(value, float):
92
+ if value != value or value in (float("inf"), float("-inf")):
93
+ return None
94
+ return value
95
+
96
+ return value
97
+
98
+
99
+ def dumps_http_json(payload: Any) -> str:
100
+ """Dump ``payload`` into a compact, HTTP-safe JSON string.
101
+
102
+ - Recursively normalizes non-JSON types (see ``normalize_for_json``)
103
+ - Disallows NaN/Infinity per RFC 8259 (allow_nan=False)
104
+ - Uses compact separators and preserves Unicode (ensure_ascii=False)
105
+ """
106
+
107
+ normalized = normalize_for_json(payload)
108
+ return json.dumps(
109
+ normalized,
110
+ ensure_ascii=False,
111
+ allow_nan=False,
112
+ separators=(",", ":"),
113
+ )
114
+
115
+
116
+ def serialize_trace_for_http(trace: Any) -> str:
117
+ """Serialize a tracing v3 session (or dict-like) to HTTP-safe JSON.
118
+
119
+ Accepts either a dataclass (e.g., SessionTrace) or a dict/list and
120
+ applies normalization and compact JSON encoding.
121
+ """
122
+
123
+ if is_dataclass(trace) and not isinstance(trace, type):
124
+ try:
125
+ return dumps_http_json(asdict(trace))
126
+ except Exception:
127
+ return dumps_http_json(getattr(trace, "__dict__", {}))
128
+ return dumps_http_json(trace)
129
+
130
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synth-ai
3
- Version: 0.2.12
3
+ Version: 0.2.13.dev1
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
@@ -2,9 +2,24 @@ examples/__init__.py,sha256=S1h7WGBIgk2CmmSIqsE4nkhxv2XTniHSBUqKETgSNQI,543
2
2
  examples/analyze_semantic_words.sh,sha256=z-3qJBAlQuMrfRzoszofle_2b3Fy79rymvEAcoBQGXU,652
3
3
  examples/crafter_debug_render.py,sha256=McPkX8z6ffANOfoR0Xw26h81HNHtT0F5y4bzUhwYonQ,6261
4
4
  examples/run_crafter_demo.sh,sha256=7FNvooSgq-ezccGy5j_h_uRXObiQtcnybPcTwaVGDpo,392
5
+ examples/agora_ex/README_MoE.md,sha256=EXM-tLE4WuqwmhdbgrRFf7lP0VhlszpDz4jO2j30klI,5770
6
+ examples/agora_ex/__init__.py,sha256=oZU7CCBKQRTlIC1WeYA7QgArSQ5b6Kn4KDEu5KbMYyU,171
7
+ examples/agora_ex/agora_ex.py,sha256=rjySIJVehB5lSYW_tV3fanq044uzzDo9o9EprQ5hpaM,2154
8
+ examples/agora_ex/agora_ex_task_app.py,sha256=Va_A00AWT7byzKAujqEiF1vNRYjmXzkw_nMsCe8n2SU,20987
9
+ examples/agora_ex/reward_fn_grpo-human.py,sha256=sgaUrWOt1malqX1GEN1fMpEvO1LPKWo30RO3fvO95OQ,4796
10
+ examples/agora_ex/system_prompt_CURRENT.md,sha256=sz9txJsFzqG1mljbJH01iIYOynfGf98DNuSQHBu9RQw,2640
11
+ examples/agora_ex/configs/rl_lora_qwen3_moe_2xh200.toml,sha256=VZBOahFd4aFj5SRl9_cfMqXn3sBRv8UQInQZ9LkNkD0,2922
12
+ examples/agora_ex/task_app/agora_ex_task_app.py,sha256=Va_A00AWT7byzKAujqEiF1vNRYjmXzkw_nMsCe8n2SU,20987
13
+ examples/agora_ex/task_app/reward_fn_grpo-human.py,sha256=sgaUrWOt1malqX1GEN1fMpEvO1LPKWo30RO3fvO95OQ,4796
14
+ examples/agora_ex/task_app/system_prompt_CURRENT.md,sha256=sz9txJsFzqG1mljbJH01iIYOynfGf98DNuSQHBu9RQw,2640
5
15
  examples/dev/qwen3_32b_qlora_4xh100.toml,sha256=YXLo1I_eHamUHMjIvsD9Tx3_HXcLfjlasd6X2BF7i5g,766
6
- examples/multi_step/crafter_rl_lora.md,sha256=yv7C7lyBELT8OWufi8PtG-Z7Hqxr5KxVTmK8XUxOAIw,1033
7
- examples/multi_step/task_app_config_notes.md,sha256=nCyJYZwPI_5ifmuNw_cJATeRaO0aikk67tbG_J4WQns,21841
16
+ examples/multi_step/crafter_rl_lora.md,sha256=sZHliCaYCq_T70JyTyK0jr-1yQ17zkZremj9GSeHG_I,2815
17
+ examples/multi_step/sse_metrics_streaming_notes.md,sha256=2k5nNOB4IgXrfC0czdup5KryMOwbHT_HbSpS53UNX2U,15630
18
+ examples/multi_step/task_app_config_notes.md,sha256=1ngz8aGCykA1iMCrVdc1yGbqXan530893Xzf4KK9xe4,22212
19
+ examples/multi_step/configs/crafter_rl_outcome.toml,sha256=gZwpQBqRoGLkQnYvOk98dTjKO8EMUd3lg8daxXNoD-8,1378
20
+ examples/multi_step/configs/crafter_rl_stepwise_hosted_judge.toml,sha256=4IorHrf9E8LcjDXVFWzh95AsFQabnruvhtSxplzUl1E,5047
21
+ examples/multi_step/configs/crafter_rl_stepwise_shaped.toml,sha256=MjNyqzbWmer1S6UtiWHvzFLaJl5JX3yfwGcvnU_F4r8,1864
22
+ examples/multi_step/configs/crafter_rl_stepwise_simple.toml,sha256=VUXFDFUMlni95Dtj1v9k52_LAl6Iq97ra4UTw6v2-60,1492
8
23
  examples/qwen_coder/README.md,sha256=xhoGKdIlRt8fO3F6HTpq6rzw3bs4ezDsGcRBNCz90Fs,3145
9
24
  examples/qwen_coder/_shared.py,sha256=oGUmx7gKkgkmToXHXAPocG72YKO9WGRjguVhmX3XE7s,3557
10
25
  examples/qwen_coder/generate_dataset.py,sha256=bfa1LMvV7jd2GmNkFE5rn2K1SETNEzMjv7SXD0C24K0,4484
@@ -85,7 +100,7 @@ examples/warming_up_to_rl/export_trace_sft.py,sha256=qcVOgZduYYImDv2xs-h_CoyMpX_
85
100
  examples/warming_up_to_rl/groq_test.py,sha256=vffVVTwQNypkqppxMLy17ySafoD2WKIK-Qf9w13lbyE,3138
86
101
  examples/warming_up_to_rl/manage_secrets.py,sha256=qLe_zglOLCd0dxPPCyQQ9CnhGkvtLOkBrZ0Xd4mmnIw,4372
87
102
  examples/warming_up_to_rl/readme.md,sha256=u2KX7grlDnOMRRrC3vzTej1K0OOmTdx5LHs2opTfLt4,6431
88
- examples/warming_up_to_rl/run_eval.py,sha256=-jd7_TtAyNKiHyH92slvDF-JzfCDH23M8q5CK-_usCo,26212
103
+ examples/warming_up_to_rl/run_eval.py,sha256=zN4hZLJILulQNUw_WiDwEZUA3xIAcG6ewl7X_iNP-n8,31390
89
104
  examples/warming_up_to_rl/run_fft_and_save.py,sha256=RVbMuHUB0F7h_CO26hvAhEx5W3fqxVvokb4VlOiR6RQ,15095
90
105
  examples/warming_up_to_rl/run_local_rollout.py,sha256=uRfCR1E066fF6cQTajllb0Dzv0sU4iT6QOitZ_jRVHw,8783
91
106
  examples/warming_up_to_rl/run_local_rollout_modal.py,sha256=oGHqSCNUSAluJFlVkOKItONWh0wUu4UxRXmqnkD37E8,8948
@@ -98,16 +113,16 @@ examples/warming_up_to_rl/configs/crafter_fft_4b.toml,sha256=q_cnU3P-eGG_VFOepw9
98
113
  examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml,sha256=YP4HLWDh6iIvw6McPXw5kK1RUFQF4dvKP4yH5bHT5nI,678
99
114
  examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml,sha256=zQi31JYa83kW-ceEqDZi-7oajsCmEPrlJR57zN5ygO8,340
100
115
  examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml,sha256=6eeU1GVvK1cYSEuGXk-AhOwJLgRcf74CTOI5XlqNYBc,817
101
- examples/warming_up_to_rl/configs/eval_stepwise_complex.toml,sha256=sTfzF4z9IXFmReftdgHMw5k3aH78bdpSlF_ANyovsdo,941
116
+ examples/warming_up_to_rl/configs/eval_stepwise_complex.toml,sha256=M1YGni8ng1RTJQR3xM65cv1jotNrJqseru47bd6omtY,1040
102
117
  examples/warming_up_to_rl/configs/eval_stepwise_consistent.toml,sha256=N5xt_9_AaVvJX6up90bSuXpF8Yt-cGJfmTA-Au3NY_4,591
103
118
  examples/warming_up_to_rl/configs/eval_stepwise_per_achievement.toml,sha256=ly42h8kIeSX8Y9mygC8mx7G_0KypUcPB9vqx8P-6QmQ,825
104
- examples/warming_up_to_rl/configs/eval_stepwise_simple.toml,sha256=ZNCryLgVCEkv8anP1pKkfNZ_X2kiloW4lmTqeJXtbxs,783
119
+ examples/warming_up_to_rl/configs/eval_stepwise_simple.toml,sha256=g_Q8EsHOpatX0VfKKBHMGxX0T3yZv42_UzLhF5evGa8,882
105
120
  examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml,sha256=MrcjPlR-5s7XayBXl087QcGuR6484HcdSgS9yYUE5uo,1868
106
121
  examples/warming_up_to_rl/configs/rl_from_ft.toml,sha256=d1cIoLeC80NgOjn0Wohk0a5IXE_ImHVgMsxWPkyAFKQ,1381
107
122
  examples/warming_up_to_rl/old/event_rewards.md,sha256=gHJd3ZeYOnj4xPXt-7sSJamgOaJQ-BpfdaF-CKJK3-0,13450
108
123
  examples/warming_up_to_rl/old/notes.md,sha256=Y9Zs_tUb2Y6kv0MmGe-kAvGM9zCtEDY3Ccf5j7PoFGU,4468
109
124
  examples/warming_up_to_rl/task_app/README.md,sha256=xjt_l7BGJmAMwanKoLAhoy2cCVav_Hh5Z4iKGLUNz3E,1664
110
- examples/warming_up_to_rl/task_app/grpo_crafter.py,sha256=4GrgnVL0ifhJ12Q10tiyr3OTb2hafHBgCd5MUYNcfmY,25067
125
+ examples/warming_up_to_rl/task_app/grpo_crafter.py,sha256=f9KxV2S90f90H6BH7MyuEayyq4-p2U00VRUv2WiqrXM,24328
111
126
  examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py,sha256=dw0OCq1guI8rH6yA5twSRUmFztbgl2SNwMW_7sOxYUA,5405
112
127
  examples/warming_up_to_rl/task_app/synth_envs_hosted/README.md,sha256=kJaN1do8V4XM2_g51WMI3edCDpv5zEw_nrMFtEwO1SQ,4614
113
128
  examples/warming_up_to_rl/task_app/synth_envs_hosted/__init__.py,sha256=KrGX5yedzYZQeKVt5FTSVzln52d1tsVGRtqFDId68zw,120
@@ -115,9 +130,9 @@ examples/warming_up_to_rl/task_app/synth_envs_hosted/branching.py,sha256=YpDgOaj
115
130
  examples/warming_up_to_rl/task_app/synth_envs_hosted/environment_routes.py,sha256=Y0iaLQ1nUkxBCD4aY39J4XEt66J-N4_J0uPj492i75g,49640
116
131
  examples/warming_up_to_rl/task_app/synth_envs_hosted/hosted_app.py,sha256=hr1jblOUsx0bakgy6zXoEHROeUDoVPY1I66aNyyRQDg,7547
117
132
  examples/warming_up_to_rl/task_app/synth_envs_hosted/main.py,sha256=-GL__EH3Xr47vp3aD30XNXNrFPOj1bRLpOYQ-yvfwIU,2481
118
- examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py,sha256=6Wq62ni5qnW2fXuEuoGD0cMKAxjtNve_oG378Aqz1as,48568
133
+ examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py,sha256=WOs0XzyEAAs_tbjSP-A4K5hw--IyMsnk5fSgEMh1GX0,48503
119
134
  examples/warming_up_to_rl/task_app/synth_envs_hosted/registry.py,sha256=5dN2Z-qVU4T_UUflHC9XGiIdDqFUl03G7uejcrYRbTE,5480
120
- examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py,sha256=8pzUbpdIYTmrfLPGxzwr0tgn7ng75ijEMY4_XONBMC4,84720
135
+ examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py,sha256=Uuxy4nbVPRdmUm1RhQ_2xE6H0vg8u9LwQ60utbHeh4g,84409
121
136
  examples/warming_up_to_rl/task_app/synth_envs_hosted/test_agents.py,sha256=-TDfCs-LSlRgyWHGvO_6YAmjauwi1x4618D8CA9d8aA,5600
122
137
  examples/warming_up_to_rl/task_app/synth_envs_hosted/test_service.py,sha256=jFEtE3UqVCq552MSPliS2eO0pDbAS3tSDRJL0A-edTA,5111
123
138
  examples/warming_up_to_rl/task_app/synth_envs_hosted/utils.py,sha256=8Rnp0NTKTD_kPXg8zfpIy_we2hfk2agKPUVH_aqMsE0,1994
@@ -130,18 +145,19 @@ examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/react_agent.py
130
145
  examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/shared.py,sha256=NfhgJPkzjhA-bLDF6zYP57Cs1pnpqteJqzO3lsFOdMk,10074
131
146
  examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/tools.py,sha256=zmTxJ8IpTod7DRDCQhkLDw7KgFCeAVFbf4cQpuOgSgI,1788
132
147
  examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/__init__.py,sha256=TA47fqudhRMma0iANDvMotfC0U5YqJJQudeZFRGiPX4,179
133
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py,sha256=rXEnoZA04IWnEVNfORBaffELa4ub0dqes4sMAc3Nw_Y,27793
148
+ examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py,sha256=R3lsxp2T55Y3YY4S4NqG6IjN5KCLyB7iNt2Php5Z9Xk,31754
134
149
  examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/__init__.py,sha256=1nwfPuiIFXPjj6JnxoudYq6GE4tpg5tiPL0uIpGsIUc,134
135
150
  examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/volume.py,sha256=1YJt5gpKhhJaFT8Cs7DdK_QDZCdUBAXQmpZfC5TX5Q4,6517
136
- synth_ai/__init__.py,sha256=pRBmoVw5oPO-vKrvHh9ioLk_RsbJTYxhpmkC95GMKfo,1342
151
+ synth_ai/__init__.py,sha256=36R8UX48aD2ybWdrt79puVFDRyrDYGIC7gjwU0enrPI,2565
137
152
  synth_ai/__main__.py,sha256=Kh1xBKkTE5Vs2qNMtDuuOXerHUptMcOiF3YziOpC6DA,146
138
153
  synth_ai/demo_registry.py,sha256=vqt_E7-YdjXc-Q4qcY36wfvwHPGyYBb7lw_sPjKiH3w,9949
139
154
  synth_ai/handshake.py,sha256=Qxe0aLNcBVH5V02fNKq96GPF_2Z8GOAToDR_2HyaeaA,3739
140
155
  synth_ai/http.py,sha256=ACzDOkwa7kIniZVOZngPc6Zfp05h6rQE1oNqsWG_FKo,1038
141
156
  synth_ai/http_client.py,sha256=5AkwvGf7HpvYUpxr_IIM1xdsDjLYois7xTht5ueHYkk,5058
157
+ synth_ai/judge_schemas.py,sha256=IGM-8ZHKwNKISgWyxk9JhQySEAu0rn_07HlF2NkTs4c,4536
142
158
  synth_ai/api/models/supported.py,sha256=vQu6Ahw1jn1X3-nL190pH_Z45tkQj8hdDyTTda8t5LQ,12671
143
159
  synth_ai/api/train/__init__.py,sha256=aBwlmrj1HWVwDcvUrX4TqpS0BgvkE7Pv7npoIZmtTFU,118
144
- synth_ai/api/train/builders.py,sha256=k8EQSX2jYFbiePn2p-2sdG5rAbfxeeIOxrYI4UE6288,11026
160
+ synth_ai/api/train/builders.py,sha256=6vMMcFZSLlM5Xan2iUhsop7L51Su7j3PeK22mZcpQfE,12106
145
161
  synth_ai/api/train/cli.py,sha256=YZc_Scx-ClE6aJjVMEIzfsiBOlX7caSdg4mPGC-xPm0,23167
146
162
  synth_ai/api/train/config_finder.py,sha256=4touziSykzQ9YCYL2CjXUfojDcJdKO3vFnoWXQ1fOx8,7178
147
163
  synth_ai/api/train/env_resolver.py,sha256=X6ILO46UebkFJo0CDhzfVCb9y3HC-pOPIwkNhbGgvOo,11854
@@ -149,20 +165,24 @@ synth_ai/api/train/pollers.py,sha256=-rcVrGMN7Rj2HrzJ1IAgphwcrsCzpwwTy0KDk76Sx2A
149
165
  synth_ai/api/train/supported_algos.py,sha256=AqCtrfiJkocULlDtTPppKWuvOOzQ4tBbh-k3e9MEDZk,5156
150
166
  synth_ai/api/train/task_app.py,sha256=MiJ0DLFjqdFNmgk-YHaHVQt31Kxl91Exh9IFfk7GSxM,6439
151
167
  synth_ai/api/train/utils.py,sha256=_8C1uoXyXXuEmthquHH5XtowVQkf84Kde4jCdmfKnCk,6165
168
+ synth_ai/api/train/configs/__init__.py,sha256=cmf4jS2pyTZQXw35b4OCox1MBhuUwDXTa51M01BA7Ck,915
169
+ synth_ai/api/train/configs/rl.py,sha256=3WrgrNSQZ76zNPa9eyq0NQfgvlnHwF7S9qaz1ugUI34,3673
170
+ synth_ai/api/train/configs/sft.py,sha256=aIxS_xF3Zaq5dc1BaEFWwbwuavxXH2gsJXQq1HlwmlM,2656
171
+ synth_ai/api/train/configs/shared.py,sha256=EZ296HzlbOfp414ERbMdyO0s_9UvOKWs7PiQPlAEMjU,492
152
172
  synth_ai/cli/__init__.py,sha256=WhaUb9_UNcQBM1c7W3VzeUKUaBBSV31C0cwvHI-9UFM,2423
153
173
  synth_ai/cli/_modal_wrapper.py,sha256=DHVP-wQi_gdxWyeEiA_DO0nRiMv7XpaOJ3T3-R2pVoI,599
154
174
  synth_ai/cli/_storage.py,sha256=ABfpzyVnCNWFdAgzxvG0_6CGvEEl91BYNTcrTw_V3dY,680
155
175
  synth_ai/cli/_typer_patch.py,sha256=xBTshJadUQjtOr-PyGZUytpxyV28UvfU5DPWBCa_mTo,1562
156
176
  synth_ai/cli/balance.py,sha256=VTeJJ98JTA6Z7FujwNzRZAlTzO2BNcFueSnXJYV5f50,8432
157
177
  synth_ai/cli/calc.py,sha256=cAED6qRzc9g_eKjk7o_ZQsGKw6TA4Dib7NNze8e8L2s,2740
158
- synth_ai/cli/demo.py,sha256=FCsohnKHzNmqT1wZ4PzJ2kLXOF7Mr0jS_ZZrEM_nFpM,5610
178
+ synth_ai/cli/demo.py,sha256=iGp9OASFBPj4lBgdWaA-KBTnkrJoDGsL6CpRCgXRAug,5383
159
179
  synth_ai/cli/legacy_root_backup.py,sha256=Ab3cVlOu3k3kLlrTc2SOtSTJTRxlwJ4JvZg9Ol2BbXg,15961
160
180
  synth_ai/cli/man.py,sha256=JQDon73ZkuKP9xr1_vRh5fjV9_b5xiUb7zNjny7ArB8,3765
161
181
  synth_ai/cli/recent.py,sha256=iY7vwVH8T6YwEOEC0QLenZSZXpyedrYc_epbP8WORzE,4415
162
- synth_ai/cli/rl_demo.py,sha256=SBH5t5EnRgpq0nZm9LXlAunC8CprXwZkkTzjhWDrXaQ,9257
182
+ synth_ai/cli/rl_demo.py,sha256=bSwjLATZWlpUjG9AShwTjVYEbgLv8qwMWK46YQStt4k,8118
163
183
  synth_ai/cli/root.py,sha256=78oCkjtMaLSHEpHRbiaX-FEsdB3gieI7OrZcUMpqrSU,13740
164
184
  synth_ai/cli/status.py,sha256=vjr4ifL48pitKojBhuJdY4oIB8NnJ0RZF44fOzKS4SI,4635
165
- synth_ai/cli/task_apps.py,sha256=d49vSAOqk-aKhQH1dWXwOhcEu3my-tRsjbdOBRQ3Mp8,105691
185
+ synth_ai/cli/task_apps.py,sha256=0Y8KiLmaacD41RMqejMekPFM2BiXfSfCtMD98rQ9R34,105830
166
186
  synth_ai/cli/traces.py,sha256=tyt2OUcREK82an9hc2Uq3H-xn0vWuTf_Pirt0CWkodg,6617
167
187
  synth_ai/cli/turso.py,sha256=y9aHehGA1VvaWkoZyBhu5fLulWUT65powrpvvVp7gpA,2301
168
188
  synth_ai/cli/watch.py,sha256=Wi5H2YdV3gsEVMd5YIte2LHMweWqLkGpsK3aopdjCQE,17481
@@ -171,7 +191,7 @@ synth_ai/config/base_url.py,sha256=c85LaABBrvsl8Fp8KH0LNtJJrpnUwlzA5Ywbuth8fHE,3
171
191
  synth_ai/core/experiment.py,sha256=5ErxMLOMDHgBjWJjId-uViCyxwfx3Ns5NVrgMkPEpZk,234
172
192
  synth_ai/core/system.py,sha256=s-Z7np2ISYmYc1r9YN-y2yb3cgRlOalrh0iaqnxeo84,206
173
193
  synth_ai/demos/core/__init__.py,sha256=A2FjhY7KXGtyzdQXqeTPCkEhHfrH-eQg6bvP8HaYhZM,36
174
- synth_ai/demos/core/cli.py,sha256=Nmkw-0v66xv1HON6IQHxvfYTDMx7b6ii2t9XO4EUMqE,66212
194
+ synth_ai/demos/core/cli.py,sha256=QknHcnrMz2WYQLzVMvt6DOHRDyPjpcV3U6WMfOSRwgU,64723
175
195
  synth_ai/demos/demo_task_apps/__init__.py,sha256=fj5IgEaCWLjYx-8DpfzmUdHIEE2TlpauEDvJRgAnLy0,267
176
196
  synth_ai/demos/demo_task_apps/core.py,sha256=Pwh7Q9HV1njZWhb479nBXM9z57bXDveUV2ZapXaSuSU,15448
177
197
  synth_ai/demos/demo_task_apps/crafter/__init__.py,sha256=3SnNZTzBjGR9eudStcww259vPmzoFBHJL-M0GDUD7Qo,24
@@ -211,7 +231,7 @@ synth_ai/environments/examples/crafter_classic/debug_translation.py,sha256=47DEQ
211
231
  synth_ai/environments/examples/crafter_classic/engine.py,sha256=i13hDJe-6BXWFqXAsdjNCrfjU_HpwWLE5-4KNT-VSbs,25257
212
232
  synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py,sha256=IMmqt0S9wh0sdP42G_Q6W_2j22gKX4YQZVvuIqLzLWc,2802
213
233
  synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py,sha256=oC1y_CdnB_xit4FH72dMo8ljlZW_Mpa3cMpbDVCtqyU,11127
214
- synth_ai/environments/examples/crafter_classic/environment.py,sha256=hDRBVNDYVj1dJRFLYTYxHucDsjwF-ZXXUEQsv7UYSLg,21668
234
+ synth_ai/environments/examples/crafter_classic/environment.py,sha256=Vw70KPCR_45S7Qewlk5vcSQrskOqFofn85PxoWskTzU,22287
215
235
  synth_ai/environments/examples/crafter_classic/taskset.py,sha256=9uZpQOllUqMupIBwlz2Jv38hBYqY09czi1LOonCTk5c,9843
216
236
  synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py,sha256=lka-3tNuYsvYQ6acEvJjvBPkylbqgCzuCd2QMOjNCRs,7194
217
237
  synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py,sha256=wHT2pyOJ55Jlh9iq-UND4cd-GQdyKxQmo9ncCuQ_Jiw,10166
@@ -407,7 +427,10 @@ synth_ai/environments/tasks/filters.py,sha256=CJDXMUF4HDVQgdR3tIqHddUuvGmwwQG27O
407
427
  synth_ai/environments/tasks/utils.py,sha256=2UfWqN5WE7blfpdd8GcPuT56sDAPXzlF0pGUyGO_M1g,2576
408
428
  synth_ai/environments/v0_observability/history.py,sha256=gW0SozHmxeL6PFNaTAQ7em8BNUlObsRpP4_MJ3drMBE,54
409
429
  synth_ai/environments/v0_observability/log.py,sha256=B4LvbPh0a1_E5dki2PlKAVHESB8oCQz0CmDBvC0GwdQ,38
430
+ synth_ai/evals/__init__.py,sha256=NBInP4HqnLUtI7USUwOqnar2c7JT4g8ngvm612CMuqA,306
410
431
  synth_ai/evals/base.py,sha256=Pu_h3oJAAEqJxgj5eigqbVhrNjAGJnBtlxpacSbGXCI,353
432
+ synth_ai/evals/client.py,sha256=oTs0rNijPm5b5H4Ise7LsilXKiZJRMs4X_mCudGtGxA,2581
433
+ synth_ai/evals/types.py,sha256=vpg2u4vLi7EqXJYgMM44TPXKKQKDxkcK3_KzYeHU6l0,930
411
434
  synth_ai/inference/__init__.py,sha256=5xwgFMKRfbLC7TX3lwMqGOZ8HHOEnXwlDqV_FLjsd5A,74
412
435
  synth_ai/inference/client.py,sha256=FA1h4rcMu7M0qCCCJ4yQTqC9dM1weVhDWylry8znnCc,1262
413
436
  synth_ai/jobs/client.py,sha256=_NtmBlm7LLZX22W6arfaa0DAq-0vsV-h_Ep2yHAiwnE,10125
@@ -435,6 +458,8 @@ synth_ai/learning/sft/client.py,sha256=9KxDcnwQl5FKZgXOUsEvsihFJUg2CHJA6sc791cyp
435
458
  synth_ai/learning/sft/config.py,sha256=pdUvwmhYMSIrFTD7-a9MglPwHevP4OSed9TuOzdjkOc,9791
436
459
  synth_ai/learning/sft/data.py,sha256=gM9ObMO7L3woKUVL2p-Pz6iTikS1Yr40vce5zRy2H84,9454
437
460
  synth_ai/lm/__init__.py,sha256=uXZFG6zFox_oV6FM7cJQxmnCNUBBa50ZuhdXCNxx0Lo,875
461
+ synth_ai/rubrics/__init__.py,sha256=hymlNv1PezlMibEIzQWGBNy412lwE5dIPa98tiX6AiI,411
462
+ synth_ai/rubrics/validators.py,sha256=DrvQKcHQwbt8thAEFeqvlFZMdaApkwZOHda6hdm6Va8,3613
438
463
  synth_ai/task/__init__.py,sha256=FyzWbFjQCXga_ZT1oWVLt2N58dHsLcM5sMu7kjoTpW0,2409
439
464
  synth_ai/task/auth.py,sha256=IUD3DcU-43qczWV9sSccXsjDOkZe8sJHmcQtues1YWQ,5652
440
465
  synth_ai/task/client.py,sha256=ccbcYRaZZ5MBMcfFdA8x2t7PjXEdvKuFmwRxrRl_8vk,5741
@@ -460,6 +485,7 @@ synth_ai/tracing_v3/llm_call_record_helpers.py,sha256=zZ0i6SB7l6WYud9mRLBTyZ4BJC
460
485
  synth_ai/tracing_v3/lm_call_record_abstractions.py,sha256=j2RGuXVaV_EXmIosuXRDjptJSlrDXwb8x06k2fF6lqo,9195
461
486
  synth_ai/tracing_v3/migration_helper.py,sha256=izm7SNHtG3VDv_5ZmMk_mmwKitmShxUK3joNFOArZIY,4177
462
487
  synth_ai/tracing_v3/replica_sync.py,sha256=H3ReiULH3McnGxdrH9BWkSeIOFfUQ6enHk5SWeuRV6k,8843
488
+ synth_ai/tracing_v3/serialization.py,sha256=KiMkIeV5FyvOU6fgCV1F5hhOCY_0BsyQdNrfEDREmgY,4132
463
489
  synth_ai/tracing_v3/session_tracer.py,sha256=z9-gt7SK68X_q0aOHwWOtGOaGClpoWkUkAxAOwTKpI8,18996
464
490
  synth_ai/tracing_v3/utils.py,sha256=t-ZEyP03j8k7jNxtLsOSvzQnq8SXBaRPdK7jCgPdVdI,3450
465
491
  synth_ai/tracing_v3/examples/basic_usage.py,sha256=gSIWxeCYNe5WL38FjCaOCv0RvmxZ8SDiPWhA1-8XAeg,7342
@@ -576,9 +602,9 @@ synth_ai/v0/tracing_v3/abstractions.py,sha256=7IHKkzicFEJ4UXJbodK11Pi8YYq7Vt8Ev_
576
602
  synth_ai/v0/tracing_v3/decorators.py,sha256=fRyVBKEbxAPZoDsBH7t8OVLVixvgD_Lw_1ONF1TuZxU,108
577
603
  synth_ai/v0/tracing_v3/llm_call_record_helpers.py,sha256=JYSpGtW-RC-DnhUIPdVADNF3rK5x8Tl8DOymbmRI99I,121
578
604
  synth_ai/v0/tracing_v3/session_tracer.py,sha256=TSUzb_fUUlpwOqFE1X-Fs14nG2CNe7MZLKOvH7cV2kE,112
579
- synth_ai-0.2.12.dist-info/licenses/LICENSE,sha256=ynhjRQUfqA_RdGRATApfFA_fBAy9cno04sLtLUqxVFM,1069
580
- synth_ai-0.2.12.dist-info/METADATA,sha256=SOcZAekWv6vMdvP5lLzyVitE1zRdUZHGCN-YEZnsiP4,5424
581
- synth_ai-0.2.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
582
- synth_ai-0.2.12.dist-info/entry_points.txt,sha256=Neq-3bT7TAijjgOIR77pKL-WYg6TWBDeO8pp_nL4vGY,91
583
- synth_ai-0.2.12.dist-info/top_level.txt,sha256=1moNHgctEUJ3F3eH3V-7FSMb2iTTze1V13dj1R04oUY,18
584
- synth_ai-0.2.12.dist-info/RECORD,,
605
+ synth_ai-0.2.13.dev1.dist-info/licenses/LICENSE,sha256=ynhjRQUfqA_RdGRATApfFA_fBAy9cno04sLtLUqxVFM,1069
606
+ synth_ai-0.2.13.dev1.dist-info/METADATA,sha256=7RpJWL82aHYN-jx-yaaJ9WVozXidWUR4tWS2MkNXxNk,5429
607
+ synth_ai-0.2.13.dev1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
608
+ synth_ai-0.2.13.dev1.dist-info/entry_points.txt,sha256=GSFXaJreq4PJXbixkUI0GHZwGh2dZDG5pYaoVmqr_KE,46
609
+ synth_ai-0.2.13.dev1.dist-info/top_level.txt,sha256=1moNHgctEUJ3F3eH3V-7FSMb2iTTze1V13dj1R04oUY,18
610
+ synth_ai-0.2.13.dev1.dist-info/RECORD,,
@@ -1,3 +1,2 @@
1
1
  [console_scripts]
2
2
  synth-ai = synth_ai.cli:cli
3
- synth-ai-demo = synth_ai.demos.core.cli:main