modus-sdk 0.2.2__tar.gz → 0.3.0__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 (125) hide show
  1. modus_sdk-0.3.0/CHANGELOG.md +89 -0
  2. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/PKG-INFO +1 -1
  3. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/examples/apps/modus_skill_chat/README.md +1 -1
  4. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/examples/apps/modus_skill_chat/app.py +3 -3
  5. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/__init__.py +21 -3
  6. modus_sdk-0.3.0/modus/_agent_run_request.py +22 -0
  7. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_chat.py +2 -3
  8. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_deprecation.py +4 -3
  9. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_generated/__init__.py +8 -4
  10. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_generated/models.py +170 -155
  11. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_generated/operations.py +31 -31
  12. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_http.py +60 -2
  13. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_pagination.py +21 -1
  14. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_version.py +2 -2
  15. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/__init__.py +15 -1
  16. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/_client.py +0 -6
  17. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/__init__.py +0 -3
  18. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/context/custom_items.py +16 -4
  19. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/scopes/scopes.py +16 -7
  20. modus_sdk-0.3.0/modus/management/resources/usage.py +142 -0
  21. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/workflows/interfaces.py +20 -7
  22. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/workflows/workflows.py +17 -8
  23. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/__init__.py +9 -0
  24. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/agents.py +1 -1
  25. modus_sdk-0.3.0/modus/management/types/scopes.py +5 -0
  26. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/skills.py +1 -1
  27. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/toolset.py +1 -1
  28. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/usage.py +11 -1
  29. modus_sdk-0.3.0/modus/management/types/workflows.py +5 -0
  30. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/modus/conversations.py +5 -5
  31. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/scopes/scopes.py +4 -4
  32. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/suggestions/suggestions.py +39 -25
  33. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/workflows/runs.py +3 -1
  34. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/workflows/workflows.py +4 -4
  35. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/__init__.py +18 -1
  36. modus_sdk-0.3.0/modus/types/agents.py +23 -0
  37. modus_sdk-0.3.0/modus/types/conversations.py +43 -0
  38. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/pagination.py +3 -3
  39. modus_sdk-0.3.0/modus/types/scopes.py +25 -0
  40. modus_sdk-0.3.0/modus/types/skills.py +22 -0
  41. modus_sdk-0.3.0/modus/types/workflows.py +26 -0
  42. modus_sdk-0.2.2/CHANGELOG.md +0 -40
  43. modus_sdk-0.2.2/modus/management/resources/organization.py +0 -52
  44. modus_sdk-0.2.2/modus/management/resources/usage.py +0 -92
  45. modus_sdk-0.2.2/modus/types/agents.py +0 -17
  46. modus_sdk-0.2.2/modus/types/conversations.py +0 -30
  47. modus_sdk-0.2.2/modus/types/skills.py +0 -16
  48. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/.gitignore +0 -0
  49. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/CONTRIBUTING.md +0 -0
  50. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/LICENSE +0 -0
  51. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/README.md +0 -0
  52. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/assets/modus-logo.png +0 -0
  53. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/assets/modus-logo.svg +0 -0
  54. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/examples/apps/modus_skill_chat/.streamlit/config.toml +0 -0
  55. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/examples/apps/modus_skill_chat/pyproject.toml +0 -0
  56. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/examples/scripts/chat.py +0 -0
  57. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/examples/scripts/manage_skill.py +0 -0
  58. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/examples/scripts/modus_chat.py +0 -0
  59. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/examples/scripts/quickstart.py +0 -0
  60. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_auth.py +0 -0
  61. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_client.py +0 -0
  62. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_config.py +0 -0
  63. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_exceptions.py +0 -0
  64. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_openapi_invoke.py +0 -0
  65. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_query.py +0 -0
  66. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_retry.py +0 -0
  67. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_streaming.py +0 -0
  68. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/_validation.py +0 -0
  69. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/_access_config_write.py +0 -0
  70. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/context/__init__.py +0 -0
  71. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/context/_content_merge.py +0 -0
  72. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/context/context.py +0 -0
  73. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/context/items.py +0 -0
  74. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/scopes/__init__.py +0 -0
  75. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/scopes/_update_body.py +0 -0
  76. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/scopes/conversations.py +0 -0
  77. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/scopes/evaluations.py +0 -0
  78. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/scopes/memories.py +0 -0
  79. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/scopes/supervision.py +0 -0
  80. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/users.py +0 -0
  81. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/workflows/__init__.py +0 -0
  82. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/resources/workflows/_update_body.py +0 -0
  83. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/_guardrails_access.py +0 -0
  84. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/_serialize.py +0 -0
  85. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/agent_selection.py +0 -0
  86. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/context.py +0 -0
  87. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/conversations.py +0 -0
  88. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/evaluations.py +0 -0
  89. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/json_blob.py +0 -0
  90. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/memories.py +0 -0
  91. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/ownership.py +0 -0
  92. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/triggers.py +0 -0
  93. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/management/types/workflow.py +0 -0
  94. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/py.typed +0 -0
  95. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/__init__.py +0 -0
  96. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/connections/__init__.py +0 -0
  97. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/connections/connections.py +0 -0
  98. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/context/__init__.py +0 -0
  99. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/context/context.py +0 -0
  100. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/context/items.py +0 -0
  101. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/modus/__init__.py +0 -0
  102. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/modus/modus.py +0 -0
  103. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/scopes/__init__.py +0 -0
  104. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/scopes/conversations.py +0 -0
  105. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/suggestions/__init__.py +0 -0
  106. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/workflows/__init__.py +0 -0
  107. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/resources/workflows/workflow_actions.py +0 -0
  108. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/agent_runs.py +0 -0
  109. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/chat.py +0 -0
  110. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/compose.py +0 -0
  111. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/connections.py +0 -0
  112. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/context.py +0 -0
  113. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/context_accessors.py +0 -0
  114. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/context_compose.py +0 -0
  115. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/context_values.py +0 -0
  116. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/json_blob.py +0 -0
  117. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/runs.py +0 -0
  118. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/suggestions.py +0 -0
  119. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/tool_calls.py +0 -0
  120. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/modus/types/views.py +0 -0
  121. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/project.json +0 -0
  122. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/pyproject.toml +0 -0
  123. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/pyrightconfig.json +0 -0
  124. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/requirements.txt +0 -0
  125. {modus_sdk-0.2.2 → modus_sdk-0.3.0}/uv.lock +0 -0
@@ -0,0 +1,89 @@
1
+ # Changelog
2
+
3
+ **Current release:** [`0.3.0`](https://pypi.org/project/modus-sdk/0.3.0/).
4
+
5
+
6
+
7
+ ## [0.3.0] — 2026-07-26
8
+
9
+ > Breaking surface vs `0.2.x` (pre-1.0 minor bump). See `distribution/docs/COMPATIBILITY.md`.
10
+
11
+ ### Added
12
+
13
+ - `mgmt.usage.list()` / `list_async()` gain an optional `user_email` filter (repeated query param).
14
+ - `mgmt.usage.list_users(since, until)` (sync + async) — distinct acting-user emails observed in the window.
15
+
16
+ ### Deprecated
17
+
18
+ - **`Skill` / `Agent` type names** — use `Scope` / `Workflow` (and `ScopeStatus` / `WorkflowStatus`, `WorkflowType`, etc.). `Skill` and `Agent` remain as aliases.
19
+ - **`conversation_skill_id()`** — use `conversation_scope_id()`.
20
+
21
+ ### Changed
22
+
23
+ - SDK read types are now exported as `Scope` / `Workflow` backed by generated `ScopeDto` / `WorkflowDto`.
24
+ - Custom context create responses always expose `.uid` (same value as `contextItemId`).
25
+
26
+ ### Removed
27
+
28
+ - Dual list/deploy envelopes — responses use `scopes` / `workflows` and `scope` / `workflow` only (no `skills` / `agents` / `skill` / `agent` aliases).
29
+ - Public Python type aliases **`SkillDto` / `AgentDto`** — use `ScopeDto` / `WorkflowDto` (thin `Skill` / `Agent` aliases remain).
30
+ - Conversation `kind=skills` — use `kind=scopes` (`all` | `modus` | `scopes`).
31
+ - `ModusManagement.organization.delete()` — organization deletion is no longer
32
+ part of the public API / PAT surface (SPA-only).
33
+ - `GET /api/v1/users/member-groups` and `/org-members` no longer advertise `pageSize` /
34
+ `pageToken` query params or an always-`None` `next_page_token` response field (OpenAPI /
35
+ Management MCP surface — `ModusManagement.users.list_member_groups()` /
36
+ `list_org_members()` never exposed either). Both endpoints return the full org-bounded
37
+ roster; pagination was never honored server-side.
38
+
39
+ ### Fixed
40
+
41
+ - `examples/apps/modus_skill_chat/app.py` called the removed `client.skills` accessor
42
+ (raised `AttributeError`); switched to `client.scopes.chat()` / `chat_stream()`.
43
+
44
+ ## [Unreleased]
45
+
46
+ ## [0.2.3] — 2026-07-20
47
+
48
+ ### Fixed
49
+
50
+ - Streaming requests send `Accept: text/event-stream`; a non-SSE response (e.g. JSON polling body) raises `ModusError` instead of being silently treated as an empty stream.
51
+ - `runs.create()` / `create_modus()` / `create_scope()` / `resume()` always mint (or reuse) a `sessionId`, matching `chat_stream`'s existing behavior.
52
+
53
+ ## [0.2.2] — 2026-07-20
54
+
55
+ ### Fixed
56
+
57
+ - Streaming always sends `sessionId` (thread id or generated UUID) on agent-host runs.
58
+ - Optional `organization_id` / `MODUS_ORGANIZATION_ID` for stream bodies; agent-service accepts omitted org and uses the PAT principal.
59
+ - Default API/agent hosts are `*.getmodus.com` (no longer `*.modus.com`).
60
+ - `base_urls['agent-service']` drives the streaming agent-host client (parity with TypeScript).
61
+
62
+ ### Added
63
+
64
+ - Create responses expose `.uid` as an alias of `context_item_id`.
65
+
66
+ ## [0.2.0] — 2026-07-20
67
+
68
+ ### Added
69
+
70
+ - **`modus.Modus` / `AsyncModus`** — read and invoke: scopes, workflows, context, connections, Modus assistant chat, runs, suggestions.
71
+ - **`modus.management.ModusManagement` / `AsyncModusManagement`** — configure: CRUD, deploy, context creators, usage, org admin, scope evaluations.
72
+ - Canonical **`client.scopes` / `client.workflows`** (and management equivalents) against `/api/v1/scopes` and `/api/v1/workflows`.
73
+ - **`client.modus`** — org-wide Modus assistant (`chat`, `chat_stream`, `get_context`, `conversations`).
74
+ - **`client.suggestions`** — list approved suggested questions; record impression/click/dismiss events.
75
+ - **`client.workflows.runs.active()` / `active_by_session(...)`** — list or look up active conversation runs.
76
+ - **`mgmt.scopes.evaluations(scope_id)`** — evaluation config, manual trigger, run history.
77
+ - Bounded conversation windows via optional `message_limit` / `before_message_index` on `conversations(...).get()`.
78
+ - MCP **`get_context_data`** batch + ACL: `{ items: [{ itemId, field?, mode?, limit? }, …], sessionId? }` → `{ results: [...] }` (max 20; per-item partial failures).
79
+ - Cursor pagination, retries on 429/5xx, SSE streaming chat.
80
+ - Full public OpenAPI operation coverage (contract-tested).
81
+
82
+ ### Changed
83
+
84
+ - Public surface uses **Scope** / **Workflow** vocabulary (types remain `Skill` / `Agent` where the API still uses those names).
85
+ - Scope-run helper: `client.workflows.runs.create_scope(scope_id, body)` (not `create_skill`).
86
+
87
+ ### Removed
88
+
89
+ - Legacy **`client.skills` / `client.agents`** accessors (and management equivalents).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modus-sdk
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: Official Python client for Modus — your organization's context layer for AI
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  # Modus Skill Chat (Streamlit)
2
2
 
3
- Optional interactive demo: compare **streaming** (`client.skills.chat_stream()`) vs **buffered** (`client.skills.chat()`) skill chat side by side.
3
+ Optional interactive demo: compare **streaming** (`client.scopes.chat_stream()`) vs **buffered** (`client.scopes.chat()`) scope chat side by side.
4
4
 
5
5
  ## Setup
6
6
 
@@ -80,7 +80,7 @@ def get_buffered_client() -> modus.Modus:
80
80
  def load_active_skills() -> list[dict[str, Any]]:
81
81
  client = get_list_client()
82
82
  skills = []
83
- for skill in client.skills.list().auto_paging_iter():
83
+ for skill in client.scopes.list().auto_paging_iter():
84
84
  if skill.status == "active":
85
85
  skills.append(
86
86
  {
@@ -105,7 +105,7 @@ def _run_buffered_chat(
105
105
  thread_id: str | None,
106
106
  ) -> ChatResult | BaseException:
107
107
  try:
108
- return get_buffered_client().skills.chat(
108
+ return get_buffered_client().scopes.chat(
109
109
  skill_id,
110
110
  message,
111
111
  model=model,
@@ -178,7 +178,7 @@ def _handle_parallel_send(
178
178
  stream_placeholder = st.empty()
179
179
  accumulated = ""
180
180
  try:
181
- with get_stream_client().skills.chat_stream(
181
+ with get_stream_client().scopes.chat_stream(
182
182
  skill_id,
183
183
  prompt,
184
184
  model=model,
@@ -6,13 +6,13 @@ Quick start:
6
6
 
7
7
  client = modus.Modus(api_key="modus_xxx")
8
8
 
9
- for skill in client.skills.list():
10
- print(skill.name, skill.status)
9
+ for scope in client.scopes.list():
10
+ print(scope.name, scope.status)
11
11
 
12
12
  for item in client.context.items.list():
13
13
  print(modus.context_item_label(item))
14
14
 
15
- To create or configure skills, use modus.management.ModusManagement.
15
+ To create or configure scopes, use modus.management.ModusManagement.
16
16
  """
17
17
 
18
18
  from importlib.metadata import PackageNotFoundError
@@ -53,6 +53,9 @@ from .types import (
53
53
  ModusRunCreateRequest,
54
54
  Page,
55
55
  ResumeRunRequest,
56
+ Scope,
57
+ ScopeStatus,
58
+ ScopeVariation,
56
59
  Skill,
57
60
  SkillContextComposition,
58
61
  SkillRunCreateRequest,
@@ -60,8 +63,14 @@ from .types import (
60
63
  SuggestionEventSource,
61
64
  SuggestionEventType,
62
65
  SuggestionQuestion,
66
+ Workflow,
63
67
  WorkflowActionRequest,
68
+ WorkflowStatus,
69
+ WorkflowType,
70
+ WorkflowVariation,
64
71
  context_item_label,
72
+ conversation_scope_id,
73
+ conversation_skill_id,
65
74
  is_verified,
66
75
  link_title,
67
76
  link_url,
@@ -128,6 +137,9 @@ __all__ = [
128
137
  "RateLimitError",
129
138
  "ResumeRunRequest",
130
139
  "RunCancelledError",
140
+ "Scope",
141
+ "ScopeStatus",
142
+ "ScopeVariation",
131
143
  "Skill",
132
144
  "SkillContextComposition",
133
145
  "SkillRunCreateRequest",
@@ -139,6 +151,12 @@ __all__ = [
139
151
  "StreamTimeoutEvent",
140
152
  "TokenEvent",
141
153
  "UnprocessableError",
154
+ "Workflow",
142
155
  "WorkflowActionRequest",
156
+ "WorkflowStatus",
157
+ "WorkflowType",
158
+ "WorkflowVariation",
159
+ "conversation_scope_id",
160
+ "conversation_skill_id",
143
161
  "__version__",
144
162
  ]
@@ -0,0 +1,22 @@
1
+ """Shared agent-host run request helpers (chat_stream + runs.create*)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Mapping, Optional
6
+ from uuid import uuid4
7
+
8
+
9
+ def resolve_agent_run_session_id(session_id: Optional[str] = None) -> str:
10
+ """Mint or reuse a non-empty sessionId for agent-host runs."""
11
+ if isinstance(session_id, str) and session_id.strip():
12
+ return session_id.strip()
13
+ return str(uuid4())
14
+
15
+
16
+ def with_agent_run_session_id(body: Mapping[str, Any]) -> dict[str, Any]:
17
+ """Copy body and ensure sessionId is set (parity with chat_stream)."""
18
+ out: dict[str, Any] = dict(body)
19
+ out["sessionId"] = resolve_agent_run_session_id(
20
+ out.get("sessionId") if isinstance(out.get("sessionId"), str) else None
21
+ )
22
+ return out
@@ -2,10 +2,10 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import uuid
6
5
  from typing import Any, AsyncIterator, Dict, Iterator, List, Literal, Optional, Union
7
6
  from urllib.parse import quote
8
7
 
8
+ from ._agent_run_request import resolve_agent_run_session_id
9
9
  from ._exceptions import ModusError, RunCancelledError, StreamTimeoutError
10
10
  from ._generated.models import SkillChatRequestDto, SkillChatResponseDto
11
11
  from ._http import AsyncHttpClient, HttpClient
@@ -37,8 +37,7 @@ def _effective_thread_id(thread_id: Optional[str]) -> Optional[str]:
37
37
 
38
38
  def _resolve_session_id(thread_id: Optional[str]) -> str:
39
39
  """Agent-host runs always require sessionId — reuse thread_id or mint a UUID."""
40
- tid = _effective_thread_id(thread_id)
41
- return tid if tid is not None else str(uuid.uuid4())
40
+ return resolve_agent_run_session_id(_effective_thread_id(thread_id))
42
41
 
43
42
 
44
43
  def _chat_path(
@@ -1,8 +1,9 @@
1
1
  """Shared deprecation warnings for public SDK surfaces.
2
2
 
3
3
  Call :func:`warn_deprecated` at the start of any public method that still
4
- invokes an OpenAPI operation marked ``deprecated: true``. Release N keeps the
5
- method working and warns; release N+1 removes the operation and the method.
4
+ invokes an OpenAPI operation marked ``deprecated: true``. Soft deprecation is
5
+ optional — keep the method working and warn; remove it in a later **MAJOR**
6
+ when the operation leaves the public spec.
6
7
  """
7
8
 
8
9
  from __future__ import annotations
@@ -23,7 +24,7 @@ def warn_deprecated(*, old: str, new: str, stacklevel: int = 2) -> None:
23
24
  Passed to :func:`warnings.warn` (default 2 points at the caller).
24
25
  """
25
26
  warnings.warn(
26
- f"{old} is deprecated and will be removed in the next release; use {new} instead.",
27
+ f"{old} is deprecated and may be removed in a future MAJOR release; use {new} instead.",
27
28
  DeprecationWarning,
28
29
  stacklevel=stacklevel,
29
30
  )
@@ -10,7 +10,6 @@ from .models import (
10
10
  AddAgentInterfaceDto,
11
11
  AgentAccessConfigDto,
12
12
  AgentDeployResponseDto,
13
- AgentDto,
14
13
  AgentGroupPermissionDto,
15
14
  AgentInterfaceDto,
16
15
  AgentInterfaceType,
@@ -94,6 +93,7 @@ from .models import (
94
93
  ListSkillsResponseDto,
95
94
  ListSuggestionQuestionsResponseDto,
96
95
  ListUsageResponseDto,
96
+ ListUsageUsersResponseDto,
97
97
  LookupContextItemDto,
98
98
  LookupContextItemResponseDto,
99
99
  LookupContextItemRowDto,
@@ -121,13 +121,13 @@ from .models import (
121
121
  RunReasoningEffort,
122
122
  RunSource,
123
123
  Scope,
124
+ ScopeDto,
124
125
  SearchMemoriesRequestDto,
125
126
  SetSupervisionRequestDto,
126
127
  SharedUserDto,
127
128
  SharedUserPermission,
128
129
  SkillChatRequestDto,
129
130
  SkillChatResponseDto,
130
- SkillDto,
131
131
  SkillMcpInterfaceConfigDto,
132
132
  SkillRunDto,
133
133
  SkillVariationDto,
@@ -156,6 +156,7 @@ from .models import (
156
156
  UpdateSkillDto,
157
157
  UsageBucketDto,
158
158
  UsageTotalsDto,
159
+ UsageUserDto,
159
160
  UserContextDto,
160
161
  UserFeedback,
161
162
  Version,
@@ -163,6 +164,7 @@ from .models import (
163
164
  Weekday,
164
165
  WorkflowActionDto,
165
166
  WorkflowActionSource,
167
+ WorkflowDto,
166
168
  WorkflowEdgeDto,
167
169
  WorkflowNodeDto,
168
170
  WorkflowNodePositionDto,
@@ -180,7 +182,6 @@ __all__ = [
180
182
  "AddAgentInterfaceDto",
181
183
  "AgentAccessConfigDto",
182
184
  "AgentDeployResponseDto",
183
- "AgentDto",
184
185
  "AgentGroupPermissionDto",
185
186
  "AgentInterfaceDto",
186
187
  "AgentInterfaceType",
@@ -264,6 +265,7 @@ __all__ = [
264
265
  "ListSkillsResponseDto",
265
266
  "ListSuggestionQuestionsResponseDto",
266
267
  "ListUsageResponseDto",
268
+ "ListUsageUsersResponseDto",
267
269
  "LookupContextItemDto",
268
270
  "LookupContextItemResponseDto",
269
271
  "LookupContextItemRowDto",
@@ -291,13 +293,13 @@ __all__ = [
291
293
  "RunReasoningEffort",
292
294
  "RunSource",
293
295
  "Scope",
296
+ "ScopeDto",
294
297
  "SearchMemoriesRequestDto",
295
298
  "SetSupervisionRequestDto",
296
299
  "SharedUserDto",
297
300
  "SharedUserPermission",
298
301
  "SkillChatRequestDto",
299
302
  "SkillChatResponseDto",
300
- "SkillDto",
301
303
  "SkillMcpInterfaceConfigDto",
302
304
  "SkillRunDto",
303
305
  "SkillVariationDto",
@@ -326,6 +328,7 @@ __all__ = [
326
328
  "UpdateSkillDto",
327
329
  "UsageBucketDto",
328
330
  "UsageTotalsDto",
331
+ "UsageUserDto",
329
332
  "UserContextDto",
330
333
  "UserFeedback",
331
334
  "Version",
@@ -333,6 +336,7 @@ __all__ = [
333
336
  "Weekday",
334
337
  "WorkflowActionDto",
335
338
  "WorkflowActionSource",
339
+ "WorkflowDto",
336
340
  "WorkflowEdgeDto",
337
341
  "WorkflowNodeDto",
338
342
  "WorkflowNodePositionDto",