Skip to content

Commit a72fa23

Browse files
Expose downstream task queue budget-group admission in Python SDK
Expose budget group admission fields in task queue admission responses.
1 parent c4769a2 commit a72fa23

3 files changed

Lines changed: 24 additions & 1 deletion

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ for queue in queues.task_queues:
174174
The workflow and activity admission objects expose both queue-level and
175175
namespace-level server budgets, including active lease caps and per-minute
176176
dispatch-rate limits, so automation can detect whether local worker slots,
177-
queue caps, or namespace caps are constraining throughput.
177+
queue caps, namespace caps, or downstream dispatch budget groups are
178+
constraining throughput.
178179

179180
## Replay captured histories
180181

src/durable_workflow/client.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ class TaskQueueTaskAdmission:
127127
server_max_dispatches_per_minute_per_namespace: int | None = None
128128
server_namespace_dispatch_count_this_minute: int | None = None
129129
server_remaining_namespace_dispatch_capacity: int | None = None
130+
server_dispatch_budget_group: str | None = None
131+
server_max_dispatches_per_minute_per_budget_group: int | None = None
132+
server_budget_group_dispatch_count_this_minute: int | None = None
133+
server_remaining_budget_group_dispatch_capacity: int | None = None
130134
server_lock_required: bool | None = None
131135
server_lock_supported: bool | None = None
132136

@@ -159,6 +163,16 @@ def from_dict(cls, data: dict[str, Any] | None) -> TaskQueueTaskAdmission | None
159163
),
160164
server_namespace_dispatch_count_this_minute=data.get("server_namespace_dispatch_count_this_minute"),
161165
server_remaining_namespace_dispatch_capacity=data.get("server_remaining_namespace_dispatch_capacity"),
166+
server_dispatch_budget_group=data.get("server_dispatch_budget_group"),
167+
server_max_dispatches_per_minute_per_budget_group=data.get(
168+
"server_max_dispatches_per_minute_per_budget_group"
169+
),
170+
server_budget_group_dispatch_count_this_minute=data.get(
171+
"server_budget_group_dispatch_count_this_minute"
172+
),
173+
server_remaining_budget_group_dispatch_capacity=data.get(
174+
"server_remaining_budget_group_dispatch_capacity"
175+
),
162176
server_lock_required=data.get("server_lock_required"),
163177
server_lock_supported=data.get("server_lock_supported"),
164178
)

tests/test_client.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,10 @@ async def test_list_task_queues_parses_admission(self, client: Client) -> None:
459459
"server_max_dispatches_per_minute_per_namespace": 240,
460460
"server_namespace_dispatch_count_this_minute": 200,
461461
"server_remaining_namespace_dispatch_capacity": 40,
462+
"server_dispatch_budget_group": "downstream-openai",
463+
"server_max_dispatches_per_minute_per_budget_group": 75,
464+
"server_budget_group_dispatch_count_this_minute": 75,
465+
"server_remaining_budget_group_dispatch_capacity": 0,
462466
"server_lock_required": True,
463467
"server_lock_supported": True,
464468
},
@@ -497,6 +501,10 @@ async def test_list_task_queues_parses_admission(self, client: Client) -> None:
497501
assert queue.admission.workflow_tasks.server_max_dispatches_per_minute_per_namespace == 240
498502
assert queue.admission.workflow_tasks.server_namespace_dispatch_count_this_minute == 200
499503
assert queue.admission.workflow_tasks.server_remaining_namespace_dispatch_capacity == 40
504+
assert queue.admission.workflow_tasks.server_dispatch_budget_group == "downstream-openai"
505+
assert queue.admission.workflow_tasks.server_max_dispatches_per_minute_per_budget_group == 75
506+
assert queue.admission.workflow_tasks.server_budget_group_dispatch_count_this_minute == 75
507+
assert queue.admission.workflow_tasks.server_remaining_budget_group_dispatch_capacity == 0
500508
assert queue.admission.activity_tasks is not None
501509
assert queue.admission.activity_tasks.configured_slot_count == 5
502510
assert queue.admission.query_tasks is not None

0 commit comments

Comments
 (0)