evolve-sdk 0.0.55.dev1252__tar.gz → 0.0.55.dev1258__tar.gz

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 (44) hide show
  1. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/PKG-INFO +1 -1
  2. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/__init__.py +7 -1
  3. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/hosted.py +85 -27
  4. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve_sdk.egg-info/PKG-INFO +1 -1
  5. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/pyproject.toml +1 -1
  6. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/LICENSE +0 -0
  7. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/MANIFEST.in +0 -0
  8. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/README.md +0 -0
  9. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/bridge/__init__.py +0 -0
  10. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/bridge/dist/bridge.bundle.cjs +0 -0
  11. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/_http.py +0 -0
  12. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/agent.py +0 -0
  13. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/bridge.py +0 -0
  14. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/browser_credentials.py +0 -0
  15. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/browser_profiles.py +0 -0
  16. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/config.py +0 -0
  17. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/integrations.py +0 -0
  18. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/managed_secrets.py +0 -0
  19. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/pipeline/__init__.py +0 -0
  20. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/pipeline/pipeline.py +0 -0
  21. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/pipeline/types.py +0 -0
  22. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/prompts/__init__.py +0 -0
  23. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/prompts/agent_md/judge.md +0 -0
  24. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/prompts/agent_md/reduce.md +0 -0
  25. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/prompts/agent_md/verify.md +0 -0
  26. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/prompts/user/judge.md +0 -0
  27. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/prompts/user/retry_feedback.md +0 -0
  28. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/prompts/user/verify.md +0 -0
  29. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/py.typed +0 -0
  30. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/results.py +0 -0
  31. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/retry.py +0 -0
  32. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/schema.py +0 -0
  33. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/sessions_client.py +0 -0
  34. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/storage_client.py +0 -0
  35. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/swarm/__init__.py +0 -0
  36. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/swarm/results.py +0 -0
  37. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/swarm/swarm.py +0 -0
  38. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/swarm/types.py +0 -0
  39. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve/utils.py +0 -0
  40. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve_sdk.egg-info/SOURCES.txt +0 -0
  41. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve_sdk.egg-info/dependency_links.txt +0 -0
  42. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve_sdk.egg-info/requires.txt +0 -0
  43. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/evolve_sdk.egg-info/top_level.txt +0 -0
  44. {evolve_sdk-0.0.55.dev1252 → evolve_sdk-0.0.55.dev1258}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evolve-sdk
3
- Version: 0.0.55.dev1252
3
+ Version: 0.0.55.dev1258
4
4
  Summary: Pythonic SDK for multi-agent orchestration in E2B sandboxes
5
5
  Author-email: "Swarmlink, Inc." <brandomagnani@evolvingmachines.ai>
6
6
  License: Apache-2.0
@@ -39,11 +39,13 @@ from .hosted import (
39
39
  Agent,
40
40
  AnalysesClient,
41
41
  AnalysisPage,
42
+ AnalysisLabel,
42
43
  AnalysisStatus,
43
44
  Check,
44
45
  CheckConfigInput,
45
46
  CheckPage,
46
47
  CheckSource,
48
+ CheckLabel,
47
49
  CheckStatus,
48
50
  ChecksClient,
49
51
  TaskCheck,
@@ -57,6 +59,7 @@ from .hosted import (
57
59
  AgentResult,
58
60
  AgentsClient,
59
61
  AnalysisCheck,
62
+ AnalysisEvidence,
60
63
  AnalysisFailure,
61
64
  AnalyzeConfig,
62
65
  AnalyzeConfigInput,
@@ -497,7 +500,7 @@ async def list_checkpoints(
497
500
  await store.close()
498
501
 
499
502
 
500
- __version__ = '0.0.55.dev1252'
503
+ __version__ = '0.0.55.dev1258'
501
504
 
502
505
  __all__ = [
503
506
  # Main classes
@@ -631,6 +634,7 @@ __all__ = [
631
634
  'AnalyzeConfig',
632
635
  'AnalyzeConfigInput',
633
636
  'AnalysisCheck',
637
+ 'AnalysisEvidence',
634
638
  'AnalysisFailure',
635
639
  'Rubric',
636
640
  'RubricCriterion',
@@ -686,7 +690,9 @@ __all__ = [
686
690
  'CheckPage',
687
691
  'JobListScope',
688
692
  'AnalysisStatus',
693
+ 'AnalysisLabel',
689
694
  'CheckStatus',
695
+ 'CheckLabel',
690
696
  'JobTaskRollupPage',
691
697
  'DatasetPage',
692
698
  'AgentPage',
@@ -568,6 +568,14 @@ AnalysisStatus = Literal['queued', 'running', 'completed', 'failed']
568
568
  #: ``'completed'`` once every task settled. A check never fails as a whole;
569
569
  #: each task carries its own typed failure (``TaskCheck['failure']``).
570
570
  CheckStatus = Literal['queued', 'running', 'completed']
571
+ #: The derived label of a trial analysis (spec ``TrialAnalysis.label``;
572
+ #: ``TrialAnalysis`` states the rule). None on the wire until completed and
573
+ #: under a custom rubric.
574
+ AnalysisLabel = Literal['flagged', 'env_fault', 'unclear', 'clean']
575
+ #: The derived label of one task's quality check (spec ``TaskCheck.label``;
576
+ #: ``TaskCheck`` states the rule). None until completed and under a custom
577
+ #: rubric.
578
+ CheckLabel = Literal['has_a_problem', 'unclear', 'no_problem_found']
571
579
  #: Which lane a settled trial's cost came from. Only ``'measured'`` is final.
572
580
  #: ``'measured_provisional'`` is a real gateway reading taken inside its
573
581
  #: asynchronous spend flush — an honest floor a deferred pass later confirms or
@@ -1553,12 +1561,14 @@ class RubricCriterion(TypedDict):
1553
1561
  every wire shape here.
1554
1562
  """
1555
1563
  #: Criterion identifier, snake_case (it keys the result's ``checks``).
1556
- #: Harbor's defaults are ``reward_hacking`` and ``task_specification``.
1564
+ #: The platform's default rubrics name seven criteria for analyze and
1565
+ #: eleven for check.
1557
1566
  name: str
1558
1567
  #: What the criterion evaluates, one sentence.
1559
1568
  description: str
1560
1569
  #: Evaluation guidance handed to the analyzer agent — what evidence to
1561
- #: read and what PASS / FAIL / NOT_APPLICABLE mean for this criterion.
1570
+ #: read and what PASS / FAIL / NOT_APPLICABLE / UNKNOWN mean for this
1571
+ #: criterion.
1562
1572
  guidance: str
1563
1573
 
1564
1574
 
@@ -1584,7 +1594,8 @@ class AnalyzeConfigInput(TypedDict, total=False):
1584
1594
  after it settles; CANCELLED trials are skipped); ``{}`` is legal and
1585
1595
  means "all defaults" — openrouter/deepseek/deepseek-v4.1-flash at its
1586
1596
  per-model effort (high)
1587
- over Harbor's default rubric (reward_hacking, task_specification). The analyzer always runs the
1597
+ over the platform's default analyze rubric (seven criteria) and its
1598
+ default prompt body. The analyzer always runs the
1588
1599
  claude-code harness in its own sealed sandbox — on the provider
1589
1600
  ``sandbox_provider`` names, or the platform's analysis default when it
1590
1601
  names none; its spend is capped per analysis and metered as its own
@@ -1609,8 +1620,8 @@ class AnalyzeConfigInput(TypedDict, total=False):
1609
1620
  model_name: str
1610
1621
  rubric: Rubric
1611
1622
  #: The analyzer's prompt template — the TEXT of Harbor's ``-p/--prompt
1612
- #: <file>`` (their cli/analyze.py:94-99). It REPLACES the built-in
1613
- #: template (their analyze/prompts/analyze.txt) as the body of the
1623
+ #: <file>`` (their cli/analyze.py:252-255). It REPLACES the platform's
1624
+ #: default body as the body of the
1614
1625
  #: analyzer's instruction and is rendered with the same three tokens
1615
1626
  #: (``{trial_path}``, ``{task_section}``, ``{criteria_guidance}``): the
1616
1627
  #: three tokens are substituted, an unknown ``{token}`` renders empty,
@@ -1690,8 +1701,8 @@ class AnalyzeConfig(TypedDict):
1690
1701
  """
1691
1702
  model_name: str
1692
1703
  rubric: Rubric
1693
- #: The caller's prompt template as stored; None = Harbor's built-in
1694
- #: analyze.txt.
1704
+ #: The caller's prompt template as stored; None = the platform's default
1705
+ #: analyze body.
1695
1706
  prompt: Optional[str]
1696
1707
  #: The effort this policy's analyses run at. Named at create it is
1697
1708
  #: served as stored; when the create named none, this echoes the
@@ -1722,13 +1733,30 @@ class AnalyzeConfig(TypedDict):
1722
1733
  n_trials: Optional[int]
1723
1734
 
1724
1735
 
1736
+ class AnalysisEvidence(TypedDict):
1737
+ """One place a verdict rests on. ``where`` names a step_id in the
1738
+ trajectory, a file and line, or a command; ``quote`` is the exact text
1739
+ found there. The page links each entry to the record; a reader verifies
1740
+ by eye — nothing verifies the quotes mechanically."""
1741
+ where: str
1742
+ quote: str
1743
+
1744
+
1725
1745
  class AnalysisCheck(TypedDict):
1726
- """One criterion's verdict — Harbor's QualityCheckModel verbatim (their
1727
- cli/quality_checker/models.py ``{explanation, outcome}``)."""
1728
- #: ``'pass'`` | ``'fail'`` | ``'not_applicable'``.
1746
+ """One criterion's verdict — Harbor's QualityCheckModel (their
1747
+ cli/quality_checker/models.py ``{explanation, outcome}``) extended by the
1748
+ platform's result schema: a fourth outcome, ``'unknown'``, for a
1749
+ criterion the record cannot decide (``'not_applicable'`` keeps Harbor's
1750
+ meaning, no subject), and the ``evidence`` list — at least one entry
1751
+ behind a ``'pass'`` or a ``'fail'``; ``'not_applicable'`` and
1752
+ ``'unknown'`` may carry none. Results stored before the evidence field
1753
+ existed serve an empty list."""
1754
+ #: ``'pass'`` | ``'fail'`` | ``'not_applicable'`` | ``'unknown'``.
1729
1755
  outcome: str
1730
- #: The analyzer's rationale, citing trial evidence.
1756
+ #: The analyzer's reasoning, in plain words, opening with a few words
1757
+ #: that name what it found.
1731
1758
  explanation: str
1759
+ evidence: List[AnalysisEvidence]
1732
1760
 
1733
1761
 
1734
1762
  class AnalysisFailure(TypedDict):
@@ -1736,9 +1764,11 @@ class AnalysisFailure(TypedDict):
1736
1764
  absence and never a fake pass."""
1737
1765
  #: Which part failed: ``invalid_result`` (the analyzer ran but its
1738
1766
  #: analysis.json failed validation — the message preserves every
1739
- #: validator reason, one per line), ``inputs`` (the trial tree or task
1740
- #: content could not be assembled), ``timeout`` (the analyzer's run
1741
- #: budget ran out with no analysis.json written — never re-run: a
1767
+ #: validator reason, one per line; a run cut by its budget is
1768
+ #: ``timeout`` instead), ``inputs`` (the trial tree or task content
1769
+ #: could not be assembled), ``timeout`` (the analyzer's run budget ran
1770
+ #: out with no valid analysis.json — the file missing, or a partial one
1771
+ #: that failed validation, its reasons in the message — never re-run: a
1742
1772
  #: timeout is deterministic; the message names the budget, the seconds
1743
1773
  #: used and the exit code), or an infrastructure stage of the analyzer
1744
1774
  #: run (``mint_key``, ``boot``, ``harness_install``, ``agent``,
@@ -1750,8 +1780,9 @@ class AnalysisFailure(TypedDict):
1750
1780
  class TrialAnalysis(TypedDict):
1751
1781
  """One trace analysis of a trial — ``Trial.analysis``.
1752
1782
 
1753
- The result half is Harbor's AnalyzeResult verbatim (their
1754
- analyze/models.py: ``summary``, ``checks`` keyed by criterion,
1783
+ The result half is Harbor's AnalyzeResult shape (their
1784
+ analyze/models.py: ``summary``, ``checks`` keyed by criterion — each
1785
+ check extended by the result schema: four outcomes and an evidence list —
1755
1786
  ``estimated_cost_usd``; the enclosing trial is Harbor's ``trial_name``);
1756
1787
  the rest is provenance — which model, rubric and prompt THIS analysis
1757
1788
  ran under, its lifecycle status, and its typed failure when it failed.
@@ -1785,7 +1816,7 @@ class TrialAnalysis(TypedDict):
1785
1816
  reasoning_effort: Optional[str]
1786
1817
  rubric: Rubric
1787
1818
  #: The prompt template THIS analysis ran under, frozen at enqueue
1788
- #: (``AnalyzeConfigInput['prompt']``); None = Harbor's built-in analyze.txt.
1819
+ #: (``AnalyzeConfigInput['prompt']``); None = the platform's default analyze body.
1789
1820
  prompt: Optional[str]
1790
1821
  #: 3–5 sentence overview of the trial (Harbor's summary contract). None
1791
1822
  #: until completed.
@@ -1793,6 +1824,17 @@ class TrialAnalysis(TypedDict):
1793
1824
  #: One entry per rubric criterion, keys exactly the rubric's criterion
1794
1825
  #: names (the frozen-criteria law). None until completed.
1795
1826
  checks: Optional[Dict[str, AnalysisCheck]]
1827
+ #: The derived label — ``'flagged'`` | ``'env_fault'`` | ``'unclear'`` |
1828
+ #: ``'clean'`` — computed by the platform from the outcomes when the
1829
+ #: result is stored, never asked from the model: ``'flagged'`` on a fail
1830
+ #: of score_is_earned, score_is_correct, task_was_fair or
1831
+ #: report_is_truthful; else ``'env_fault'`` on a fail of
1832
+ #: environment_worked; else ``'unclear'`` on an unknown of any of those
1833
+ #: five, or a not_applicable of score_is_earned or score_is_correct;
1834
+ #: else ``'clean'``. None until completed, and None on a completed
1835
+ #: analysis whose rubric is not the default one (a custom rubric carries
1836
+ #: its per-criterion outcomes and no label).
1837
+ label: Optional[AnalysisLabel]
1796
1838
  estimated_cost_usd: Optional[float]
1797
1839
  #: The analyzer's one-home usage reading — the SAME shape, same keys, the
1798
1840
  #: trial and session surfaces serve
@@ -1843,7 +1885,8 @@ class JobAnalysisStats(TypedDict):
1843
1885
  #: analysis recorded measured spend.
1844
1886
  cost_usd: Optional[float]
1845
1887
  #: Per-criterion outcome tally over the completed latest analyses, keyed
1846
- #: by criterion name: ``{n_pass, n_fail, n_not_applicable}`` each.
1888
+ #: by criterion name: ``{n_pass, n_fail, n_not_applicable, n_unknown}``
1889
+ #: each.
1847
1890
  checks: Dict[str, Dict[str, int]]
1848
1891
 
1849
1892
 
@@ -1856,10 +1899,10 @@ class CheckConfigInput(TypedDict, total=False):
1856
1899
  ``claude-sonnet-4-6``; this platform's is the analyzer's
1857
1900
  ``openrouter/deepseek/deepseek-v4.1-flash`` — one roster, one default
1858
1901
  for both rubric agents, a
1859
- recorded deviation), ``rubric`` (default: Harbor's
1860
- cli/quality_checker/default-rubric.toml, eleven criteria verbatim) and
1861
- ``prompt`` (the TEXT of Harbor's ``-p/--prompt`` file, replacing their
1862
- prompts/check.txt; rendered with ``{task_path}``, ``{file_tree}``,
1902
+ recorded deviation), ``rubric`` (default: the platform's check rubric,
1903
+ eleven criteria) and
1904
+ ``prompt`` (the TEXT of Harbor's ``-p/--prompt`` file, replacing the
1905
+ platform's default check body; rendered with ``{task_path}``, ``{file_tree}``,
1863
1906
  ``{criteria_guidance}``; the output contract appended after it exactly
1864
1907
  as Harbor appends it). ``reasoning_effort`` and ``sandbox_provider`` are
1865
1908
  the platform's two hosted knobs, exactly as on the analyze door.
@@ -1908,8 +1951,9 @@ class TaskCheck(TypedDict):
1908
1951
  words), the bounded attempt count, and a typed ``failure`` in place of
1909
1952
  Harbor's ``error`` string.
1910
1953
 
1911
- ``checks`` is the FLAT object Harbor's validate.py accepts — one key per
1912
- rubric criterion, each ``{outcome, explanation}``; no summary (analyze
1954
+ ``checks`` is the FLAT object the platform's validate.py accepts — one key
1955
+ per rubric criterion, each ``{outcome, explanation, evidence}``, four
1956
+ outcome words; no summary (analyze
1913
1957
  has one, check does not). ``cost_usd`` is the checker agent's OWN
1914
1958
  metered spend; None when nothing was measured, never a fabricated 0.
1915
1959
  A plain wire dict at runtime.
@@ -1922,6 +1966,20 @@ class TaskCheck(TypedDict):
1922
1966
  status: str
1923
1967
  #: One entry per rubric criterion, keys exactly the frozen criteria. None until completed.
1924
1968
  checks: Optional[Dict[str, AnalysisCheck]]
1969
+ #: The derived label — ``'has_a_problem'`` | ``'unclear'`` |
1970
+ #: ``'no_problem_found'`` — computed by the platform from the outcomes
1971
+ #: when the result is stored: ``'has_a_problem'`` on a fail of any
1972
+ #: criterion; else ``'unclear'`` on an unknown of any of the six
1973
+ #: file-based criteria; else ``'no_problem_found'``. None until
1974
+ #: completed, and None under a custom rubric.
1975
+ label: Optional[CheckLabel]
1976
+ #: Whether the box ran the task's environment: True when none of the
1977
+ #: five run-based criteria (reference_solution_is_valid,
1978
+ #: verifier_rejects_non_solutions, environment_builds_and_runs,
1979
+ #: verification_is_stable, limits_allow_the_task) is unknown, so a
1980
+ #: reading-only ``'no_problem_found'`` is never mistaken for a run.
1981
+ #: None exactly when ``label`` is None.
1982
+ executed: Optional[bool]
1925
1983
  cost_usd: Optional[float]
1926
1984
  #: 1, or 2 when the one automatic re-run fired.
1927
1985
  attempts: int
@@ -1947,7 +2005,7 @@ class Check(TypedDict):
1947
2005
  #: The effort every task's checker ran at — named at create, or the model's default, resolved at accept.
1948
2006
  reasoning_effort: str
1949
2007
  rubric: Rubric
1950
- #: The prompt template as stored; None = Harbor's built-in check.txt.
2008
+ #: The prompt template as stored; None = the platform's default check body.
1951
2009
  prompt: Optional[str]
1952
2010
  sandbox_provider: EvalSandboxProvider
1953
2011
  #: Harbor's -n as stored; None = the organization's ceiling alone.
@@ -7564,8 +7622,8 @@ class JobsClient:
7564
7622
  analysis.
7565
7623
  Every argument omitted means the defaults:
7566
7624
  openrouter/deepseek/deepseek-v4.1-flash at high
7567
- over Harbor's default rubric (reward_hacking,
7568
- task_specification), on the platform's analysis default provider.
7625
+ over the platform's default analyze rubric (seven criteria), on the
7626
+ platform's analysis default provider.
7569
7627
  CANCELLED trials are never analyzed.
7570
7628
  Which trials, and how wide, are Harbor's own analyze options with
7571
7629
  their exact names (their cli/analyze.py:278-290): ``passing`` /
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evolve-sdk
3
- Version: 0.0.55.dev1252
3
+ Version: 0.0.55.dev1258
4
4
  Summary: Pythonic SDK for multi-agent orchestration in E2B sandboxes
5
5
  Author-email: "Swarmlink, Inc." <brandomagnani@evolvingmachines.ai>
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "evolve-sdk"
7
- version = "0.0.55.dev1252"
7
+ version = "0.0.55.dev1258"
8
8
  description = "Pythonic SDK for multi-agent orchestration in E2B sandboxes"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"