dominus-sdk-python 3.0.0__tar.gz → 3.0.1__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 (54) hide show
  1. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/PKG-INFO +7 -10
  2. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/README.md +6 -9
  3. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/__init__.py +1 -1
  4. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/helpers/core.py +0 -21
  5. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/ai.py +2 -2
  6. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/workflow.py +36 -44
  7. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus_sdk_python.egg-info/PKG-INFO +7 -10
  8. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/pyproject.toml +1 -1
  9. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/tests/test_workflow_lifecycle.py +11 -11
  10. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/config/__init__.py +0 -0
  11. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/config/endpoints.py +0 -0
  12. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/errors.py +0 -0
  13. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/helpers/__init__.py +0 -0
  14. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/helpers/auth.py +0 -0
  15. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/helpers/cache.py +0 -0
  16. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/helpers/console_capture.py +0 -0
  17. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/helpers/crypto.py +0 -0
  18. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/helpers/sse.py +0 -0
  19. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/helpers/trace.py +0 -0
  20. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/__init__.py +0 -0
  21. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/admin.py +0 -0
  22. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/artifacts.py +0 -0
  23. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/auth.py +0 -0
  24. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/courier.py +0 -0
  25. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/db.py +0 -0
  26. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/ddl.py +0 -0
  27. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/fastapi.py +0 -0
  28. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/files.py +0 -0
  29. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/health.py +0 -0
  30. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/jobs.py +0 -0
  31. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/logs.py +0 -0
  32. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/open.py +0 -0
  33. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/oracle/__init__.py +0 -0
  34. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/oracle/audio_capture.py +0 -0
  35. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/oracle/oracle_websocket.py +0 -0
  36. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/oracle/session.py +0 -0
  37. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/oracle/types.py +0 -0
  38. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/oracle/vad_gate.py +0 -0
  39. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/portal.py +0 -0
  40. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/processor.py +0 -0
  41. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/redis.py +0 -0
  42. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/secrets.py +0 -0
  43. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/secure.py +0 -0
  44. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/namespaces/sync.py +0 -0
  45. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/services/__init__.py +0 -0
  46. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus/start.py +0 -0
  47. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus_sdk_python.egg-info/SOURCES.txt +0 -0
  48. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus_sdk_python.egg-info/dependency_links.txt +0 -0
  49. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus_sdk_python.egg-info/requires.txt +0 -0
  50. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/dominus_sdk_python.egg-info/top_level.txt +0 -0
  51. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/setup.cfg +0 -0
  52. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/tests/test_logs.py +0 -0
  53. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/tests/test_public_exports.py +0 -0
  54. {dominus_sdk_python-3.0.0 → dominus_sdk_python-3.0.1}/tests/test_workflow_refs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dominus-sdk-python
3
- Version: 3.0.0
3
+ Version: 3.0.1
4
4
  Summary: Python SDK for the Dominus Orchestrator Platform
5
5
  Author-email: CareBridge Systems <dev@carebridge.io>
6
6
  License: Proprietary
@@ -49,7 +49,7 @@ Async Python SDK for CareBridge Dominus platform services. Routes calls through
49
49
  - Server-side, asyncio-first Python SDK (3.9+)
50
50
  - Namespace API with root-level shortcuts for common operations
51
51
  - Targets production Cloudflare Workers (gateway, JWT, logs) and Cloud Run (orchestrator)
52
- - Version: 3.0.0
52
+ - Version: 3.0.1
53
53
 
54
54
  ## Quick Start
55
55
 
@@ -97,13 +97,9 @@ execution = await dominus.workflow.ensure(
97
97
  inputs={"report_snapshot": "ar://carebridge/summit-radiology/production/snapshot/report-1"},
98
98
  )
99
99
 
100
- # Saved workflow lifecycle through workflow-manager when you need explicit artifacts
101
- run = await dominus.workflow.create_run(
102
- workflow_id="wf_saved_123",
103
- context={"report_ref": {"report_id": "r-1", "accession": "a-1", "session_number": "2"}},
104
- )
105
- await dominus.workflow.validate_run(run["run_id"])
106
- result = await dominus.workflow.start_run(run["run_id"])
100
+ # Inspect the canonical run after ensure
101
+ run_state = await dominus.workflow.get_run_state(execution["run_id"])
102
+ timeline = await dominus.workflow.get_run_timeline(execution["run_id"])
107
103
 
108
104
  # Raw orchestration lifecycle with inline workflow definition
109
105
  raw_run = await dominus.ai.workflow.create_run(
@@ -204,7 +200,8 @@ python -m pytest tests -q
204
200
 
205
201
  ## Workflow Surfaces
206
202
 
207
- - `dominus.workflow.*` is the saved-workflow facade through `dominus-workflow-manager`. Use it for stored workflow IDs and the artifact-aware run lifecycle: `create_run -> register_artifact -> validate_run -> start_run`.
203
+ - `dominus.workflow.ensure()` is the canonical saved-workflow launch path through Authority.
204
+ - `dominus.workflow.ensure_instance()` / `stream_ensure_instance()` are lower-level instance controls, not the default launch surface.
208
205
  - `dominus.ai.workflow.*` is the raw orchestration surface. It requires inline `workflow_definition` data. It does not support saved-workflow IDs directly.
209
206
  - `dominus.workflow.execute_pipeline()` runs stored pipelines through workflow-manager's native orchestration-backed runner.
210
207
  - `dominus.artifacts.*` now supports addressed V2 artifact refs alongside legacy helpers. Prefer `store_v2()`, `head_v2()`, `compare_v2()`, bookmark helpers, and watcher helpers with canonical `ar://{group}/{owner}/{environment}/{kind}/{artifact_key}` refs for new code; `target_project_id` / `use_shared` remain compatibility-only targeting concepts.
@@ -7,7 +7,7 @@ Async Python SDK for CareBridge Dominus platform services. Routes calls through
7
7
  - Server-side, asyncio-first Python SDK (3.9+)
8
8
  - Namespace API with root-level shortcuts for common operations
9
9
  - Targets production Cloudflare Workers (gateway, JWT, logs) and Cloud Run (orchestrator)
10
- - Version: 3.0.0
10
+ - Version: 3.0.1
11
11
 
12
12
  ## Quick Start
13
13
 
@@ -55,13 +55,9 @@ execution = await dominus.workflow.ensure(
55
55
  inputs={"report_snapshot": "ar://carebridge/summit-radiology/production/snapshot/report-1"},
56
56
  )
57
57
 
58
- # Saved workflow lifecycle through workflow-manager when you need explicit artifacts
59
- run = await dominus.workflow.create_run(
60
- workflow_id="wf_saved_123",
61
- context={"report_ref": {"report_id": "r-1", "accession": "a-1", "session_number": "2"}},
62
- )
63
- await dominus.workflow.validate_run(run["run_id"])
64
- result = await dominus.workflow.start_run(run["run_id"])
58
+ # Inspect the canonical run after ensure
59
+ run_state = await dominus.workflow.get_run_state(execution["run_id"])
60
+ timeline = await dominus.workflow.get_run_timeline(execution["run_id"])
65
61
 
66
62
  # Raw orchestration lifecycle with inline workflow definition
67
63
  raw_run = await dominus.ai.workflow.create_run(
@@ -162,7 +158,8 @@ python -m pytest tests -q
162
158
 
163
159
  ## Workflow Surfaces
164
160
 
165
- - `dominus.workflow.*` is the saved-workflow facade through `dominus-workflow-manager`. Use it for stored workflow IDs and the artifact-aware run lifecycle: `create_run -> register_artifact -> validate_run -> start_run`.
161
+ - `dominus.workflow.ensure()` is the canonical saved-workflow launch path through Authority.
162
+ - `dominus.workflow.ensure_instance()` / `stream_ensure_instance()` are lower-level instance controls, not the default launch surface.
166
163
  - `dominus.ai.workflow.*` is the raw orchestration surface. It requires inline `workflow_definition` data. It does not support saved-workflow IDs directly.
167
164
  - `dominus.workflow.execute_pipeline()` runs stored pipelines through workflow-manager's native orchestration-backed runner.
168
165
  - `dominus.artifacts.*` now supports addressed V2 artifact refs alongside legacy helpers. Prefer `store_v2()`, `head_v2()`, `compare_v2()`, bookmark helpers, and watcher helpers with canonical `ar://{group}/{owner}/{environment}/{kind}/{artifact_key}` refs for new code; `target_project_id` / `use_shared` remain compatibility-only targeting concepts.
@@ -181,7 +181,7 @@ from .errors import (
181
181
  TimeoutError as DominusTimeoutError,
182
182
  )
183
183
 
184
- __version__ = "3.0.0"
184
+ __version__ = "3.0.1"
185
185
  __all__ = [
186
186
  # Main SDK instance
187
187
  "dominus",
@@ -600,27 +600,6 @@ async def mint_selected_project_jwt(
600
600
  raise RuntimeError(f"Selected-project JWT mint failed: {e}") from e
601
601
 
602
602
 
603
- async def delegate_jwt(
604
- psk_token: str,
605
- target_project_id: str,
606
- target_environment: str,
607
- use_shared: bool = False
608
- ) -> str:
609
- """
610
- Compatibility alias for :func:`mint_selected_project_jwt`.
611
-
612
- .. deprecated::
613
- Prefer :func:`mint_selected_project_jwt` for new code; "delegated" naming is
614
- legacy terminology only.
615
- """
616
- return await mint_selected_project_jwt(
617
- psk_token=psk_token,
618
- target_project_id=target_project_id,
619
- target_environment=target_environment,
620
- use_shared=use_shared,
621
- )
622
-
623
-
624
603
  def verify_token_format(token: str) -> bool:
625
604
  """
626
605
  Verify token format is valid (basic check, not server verification).
@@ -576,7 +576,7 @@ class WorkflowSubNamespace(GatewayMixin):
576
576
  if workflow_id:
577
577
  raise ValueError(
578
578
  f"dominus.ai.workflow.{method_name}() does not support saved workflow IDs. "
579
- "Pass workflow_definition for raw orchestration or use dominus.workflow.create_run() "
579
+ "Pass workflow_definition for raw orchestration or use dominus.workflow.ensure() "
580
580
  "for saved-workflow execution."
581
581
  )
582
582
  raise ValueError(
@@ -624,7 +624,7 @@ class WorkflowSubNamespace(GatewayMixin):
624
624
 
625
625
  Args:
626
626
  workflow_definition: Inline orchestration workflow definition
627
- workflow_id: Unsupported for raw orchestration; use dominus.workflow.create_run()
627
+ workflow_id: Unsupported for raw orchestration; use dominus.workflow.ensure()
628
628
  initial_artifacts: Initial artifact key -> artifact ID mapping
629
629
  input: Legacy alias for initial_artifacts
630
630
  conversation_id: Optional conversation ID for context
@@ -63,7 +63,7 @@ class WorkflowNamespace:
63
63
  def _reject_legacy_runs_facade(self, method: str) -> None:
64
64
  raise RuntimeError(
65
65
  f"dominus.workflow.{method} was removed: /api/workflow/runs is retired. "
66
- "Use ensure() with Authority fields (subject, company, inputs, context, ...) or ensure_instance()."
66
+ "Use ensure() through Authority."
67
67
  )
68
68
 
69
69
  @staticmethod
@@ -795,48 +795,29 @@ class WorkflowNamespace:
795
795
  idempotency_key: Optional[str] = None,
796
796
  ) -> Dict[str, Any]:
797
797
  """Ensure a workflow instance exists and optionally launch execution."""
798
- if (
799
- subject is not None
800
- or company is not None
801
- or inputs is not None
802
- or workflow_ref is not None
803
- or target_project_id is not None
804
- or target_environment is not None
805
- or initiator_type is not None
806
- or initiator_id is not None
807
- or idempotency_key is not None
808
- or group is None
809
- or owner is None
810
- ):
811
- return await self._api(
812
- endpoint="/api/authority/runs/ensure",
813
- body=self._build_authority_ensure_body(
814
- workflow_id,
815
- workflow_ref=workflow_ref,
816
- subject=subject,
817
- company=company,
818
- inputs=inputs,
819
- context=context,
820
- bindings=bindings,
821
- instance_id=instance_id,
822
- mode=mode,
823
- target_project_id=target_project_id,
824
- target_environment=target_environment,
825
- initiator_type=initiator_type,
826
- initiator_id=initiator_id,
827
- idempotency_key=idempotency_key,
828
- ),
798
+ if mode == "streaming":
799
+ raise ValueError(
800
+ "dominus.workflow.ensure() is Authority-only and supports blocking, async, or ensure_only. "
801
+ "Use execution polling after launch instead of instance streaming on this surface."
829
802
  )
830
- return await self.ensure_instance(
831
- workflow_id,
832
- instance_id=instance_id,
833
- group=group,
834
- owner=owner,
835
- environment=environment,
836
- nudge_policy=nudge_policy,
837
- bindings=bindings,
838
- mode=mode,
839
- context=context,
803
+ return await self._api(
804
+ endpoint="/api/authority/runs/ensure",
805
+ body=self._build_authority_ensure_body(
806
+ workflow_id,
807
+ workflow_ref=workflow_ref,
808
+ subject=subject,
809
+ company=company,
810
+ inputs=inputs,
811
+ context=context,
812
+ bindings=bindings,
813
+ instance_id=instance_id,
814
+ mode=mode,
815
+ target_project_id=target_project_id,
816
+ target_environment=target_environment,
817
+ initiator_type=initiator_type,
818
+ initiator_id=initiator_id,
819
+ idempotency_key=idempotency_key,
820
+ ),
840
821
  )
841
822
 
842
823
  async def ensure_instance(
@@ -852,7 +833,13 @@ class WorkflowNamespace:
852
833
  mode: str = "blocking",
853
834
  context: Optional[Dict[str, Any]] = None,
854
835
  ) -> Dict[str, Any]:
855
- """Ensure a workflow instance exists and optionally launch execution."""
836
+ """
837
+ Advanced instance-control surface for workflow-manager.
838
+
839
+ This is not the canonical public launch path. Prefer ensure() for
840
+ Authority-backed launch and use instance APIs only when you
841
+ intentionally need lower-level instance reuse or nudge/retry control.
842
+ """
856
843
  if mode == "streaming":
857
844
  raise ValueError("Use stream_ensure_instance() for streaming instance execution")
858
845
 
@@ -883,7 +870,12 @@ class WorkflowNamespace:
883
870
  context: Optional[Dict[str, Any]] = None,
884
871
  on_chunk: Optional[Any] = None,
885
872
  ):
886
- """Ensure a workflow instance and stream execution events."""
873
+ """
874
+ Advanced instance-control SSE helper for workflow-manager.
875
+
876
+ This bypasses Authority launch and is retained only for explicit,
877
+ lower-level instance operations.
878
+ """
887
879
  async for chunk in self._client._stream_request(
888
880
  endpoint=f"{self._instance_base_endpoint(workflow_id)}/ensure",
889
881
  body=self._build_ensure_instance_body(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dominus-sdk-python
3
- Version: 3.0.0
3
+ Version: 3.0.1
4
4
  Summary: Python SDK for the Dominus Orchestrator Platform
5
5
  Author-email: CareBridge Systems <dev@carebridge.io>
6
6
  License: Proprietary
@@ -49,7 +49,7 @@ Async Python SDK for CareBridge Dominus platform services. Routes calls through
49
49
  - Server-side, asyncio-first Python SDK (3.9+)
50
50
  - Namespace API with root-level shortcuts for common operations
51
51
  - Targets production Cloudflare Workers (gateway, JWT, logs) and Cloud Run (orchestrator)
52
- - Version: 3.0.0
52
+ - Version: 3.0.1
53
53
 
54
54
  ## Quick Start
55
55
 
@@ -97,13 +97,9 @@ execution = await dominus.workflow.ensure(
97
97
  inputs={"report_snapshot": "ar://carebridge/summit-radiology/production/snapshot/report-1"},
98
98
  )
99
99
 
100
- # Saved workflow lifecycle through workflow-manager when you need explicit artifacts
101
- run = await dominus.workflow.create_run(
102
- workflow_id="wf_saved_123",
103
- context={"report_ref": {"report_id": "r-1", "accession": "a-1", "session_number": "2"}},
104
- )
105
- await dominus.workflow.validate_run(run["run_id"])
106
- result = await dominus.workflow.start_run(run["run_id"])
100
+ # Inspect the canonical run after ensure
101
+ run_state = await dominus.workflow.get_run_state(execution["run_id"])
102
+ timeline = await dominus.workflow.get_run_timeline(execution["run_id"])
107
103
 
108
104
  # Raw orchestration lifecycle with inline workflow definition
109
105
  raw_run = await dominus.ai.workflow.create_run(
@@ -204,7 +200,8 @@ python -m pytest tests -q
204
200
 
205
201
  ## Workflow Surfaces
206
202
 
207
- - `dominus.workflow.*` is the saved-workflow facade through `dominus-workflow-manager`. Use it for stored workflow IDs and the artifact-aware run lifecycle: `create_run -> register_artifact -> validate_run -> start_run`.
203
+ - `dominus.workflow.ensure()` is the canonical saved-workflow launch path through Authority.
204
+ - `dominus.workflow.ensure_instance()` / `stream_ensure_instance()` are lower-level instance controls, not the default launch surface.
208
205
  - `dominus.ai.workflow.*` is the raw orchestration surface. It requires inline `workflow_definition` data. It does not support saved-workflow IDs directly.
209
206
  - `dominus.workflow.execute_pipeline()` runs stored pipelines through workflow-manager's native orchestration-backed runner.
210
207
  - `dominus.artifacts.*` now supports addressed V2 artifact refs alongside legacy helpers. Prefer `store_v2()`, `head_v2()`, `compare_v2()`, bookmark helpers, and watcher helpers with canonical `ar://{group}/{owner}/{environment}/{kind}/{artifact_key}` refs for new code; `target_project_id` / `use_shared` remain compatibility-only targeting concepts.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dominus-sdk-python"
7
- version = "3.0.0"
7
+ version = "3.0.1"
8
8
  description = "Python SDK for the Dominus Orchestrator Platform"
9
9
  readme = "README.md"
10
10
  license = {text = "Proprietary"}
@@ -374,26 +374,26 @@ async def test_saved_workflow_instance_ensure_contract_matches_workflow_manager(
374
374
 
375
375
 
376
376
  @pytest.mark.asyncio
377
- async def test_saved_workflow_instance_ensure_alias_and_stream_guard():
377
+ async def test_saved_workflow_ensure_is_authority_only_and_stream_guard():
378
378
  client = FakeClient()
379
379
  namespace = WorkflowNamespace(client)
380
380
 
381
381
  await namespace.ensure(
382
382
  "wf-instance",
383
- group="reports",
384
- owner="company:acme",
385
383
  mode="ensure_only",
386
384
  )
387
385
 
388
386
  call = client.calls[0]
389
- assert call["endpoint"] == "/api/workflow/workflows/wf-instance/instances/ensure"
390
- assert call["body"] == {
391
- "params": {
392
- "group": "reports",
393
- "owner": "company:acme",
394
- },
395
- "mode": "ensure_only",
396
- }
387
+ assert call["endpoint"] == "/api/authority/runs/ensure"
388
+ assert call["body"]["workflow_id"] == "wf-instance"
389
+ assert call["body"]["mode"] == "ensure_only"
390
+ assert isinstance(call["body"]["idempotency_key"], str)
391
+
392
+ with pytest.raises(ValueError, match="Authority-only and supports blocking, async, or ensure_only"):
393
+ await namespace.ensure(
394
+ "wf-instance",
395
+ mode="streaming",
396
+ )
397
397
 
398
398
  with pytest.raises(ValueError, match="Use stream_ensure_instance\\(\\) for streaming instance execution"):
399
399
  await namespace.ensure_instance(