Skip to content

Commit 3570792

Browse files
authored
Add orderby field to postgres endpoints (#84)
Adds an order_by field to the following model's get endpoints: 1. Tasks 2. Agents 3. Spans 4. Agent Task Tracker 5. Deployment History I've only made this change to the postgres models since it was easy to just expose the order_by field in the ORM up to the API layer. Doing it for the mongoDB objects might be _slightly_ more complex and should probably come in a separate PR.
1 parent 35e0c41 commit 3570792

19 files changed

Lines changed: 449 additions & 29 deletions

agentex/src/api/routes/agent_task_tracker.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,19 @@ async def filter_agent_task_tracker(
5252
task_id: str | None = Query(None, description="Task ID"),
5353
limit: int = Query(50, description="Limit", ge=1),
5454
page_number: int = Query(1, description="Page number", ge=1),
55+
order_by: str | None = Query(None, description="Field to order by"),
56+
order_direction: str = Query("desc", description="Order direction (asc or desc)"),
5557
) -> list[AgentTaskTracker]:
5658
"""
5759
Filter agent task tracker by query parameters.
5860
"""
5961
agent_task_tracker_entities = await agent_task_tracker_use_case.list(
60-
agent_id=agent_id, task_id=task_id, limit=limit, page_number=page_number
62+
agent_id=agent_id,
63+
task_id=task_id,
64+
limit=limit,
65+
page_number=page_number,
66+
order_by=order_by,
67+
order_direction=order_direction,
6168
)
6269
return [
6370
AgentTaskTracker.model_validate(entity)

agentex/src/api/routes/agents.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,16 @@ async def list_agents(
9595
task_id: str | None = Query(None, description="Task ID"),
9696
limit: int = Query(50, description="Limit", ge=1),
9797
page_number: int = Query(1, description="Page number", ge=1),
98+
order_by: str | None = Query(None, description="Field to order by"),
99+
order_direction: str = Query("desc", description="Order direction (asc or desc)"),
98100
):
99101
"""List all registered agents."""
100102
agent_entities = await agents_use_case.list(
101103
task_id=task_id,
102104
limit=limit,
103105
page_number=page_number,
106+
order_by=order_by,
107+
order_direction=order_direction,
104108
**{"id": _authorized_ids} if _authorized_ids is not None else {},
105109
)
106110
return [Agent.model_validate(agent_entity) for agent_entity in agent_entities]

agentex/src/api/routes/deployment_history.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ async def list_deployments(
4949
agent_name: str | None = None,
5050
limit: int = 50,
5151
page_number: int = 1,
52+
order_by: str | None = None,
53+
order_direction: str = "desc",
5254
) -> list[DeploymentHistory]:
5355
"""List deployment history"""
5456
if not agent_id and not agent_name:
@@ -63,7 +65,11 @@ async def list_deployments(
6365
)
6466
agent = await agent_use_case.get(id=agent_id, name=agent_name)
6567
deployments = await deployment_history_use_case.list_deployments(
66-
agent_id=agent.id, limit=limit, page_number=page_number
68+
agent_id=agent.id,
69+
limit=limit,
70+
page_number=page_number,
71+
order_by=order_by,
72+
order_direction=order_direction,
6773
)
6874

6975
# Convert entities to API schemas

agentex/src/api/routes/spans.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,18 @@ async def list_spans(
8282
trace_id: str | None = None,
8383
limit: int = 50,
8484
page_number: int = 1,
85+
order_by: str | None = None,
86+
order_direction: str = "desc",
8587
) -> list[Span]:
8688
"""
8789
List all spans for a given trace ID
8890
"""
8991
logger.info(f"Listing spans for trace ID: {trace_id}")
9092
spans = await span_use_case.list(
91-
trace_id=trace_id, limit=limit, page_number=page_number
93+
trace_id=trace_id,
94+
limit=limit,
95+
page_number=page_number,
96+
order_by=order_by,
97+
order_direction=order_direction,
9298
)
9399
return [Span.model_validate(span) for span in spans]

agentex/src/api/routes/tasks.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ async def list_tasks(
7979
agent_name: str | None = None,
8080
limit: int = 50,
8181
page_number: int = 1,
82+
order_by: str | None = None,
83+
order_direction: str = "desc",
8284
relationships: Annotated[list[TaskRelationships], Query()] = None,
8385
):
8486
"""List all tasks."""
@@ -89,6 +91,8 @@ async def list_tasks(
8991
agent_name=agent_name,
9092
limit=limit,
9193
page_number=page_number,
94+
order_by=order_by,
95+
order_direction=order_direction,
9296
relationships=relationships,
9397
)
9498
return [TaskResponse.model_validate(task_entity) for task_entity in task_entities]

agentex/src/domain/repositories/agent_repository.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,17 @@ async def list(
2828
filters: dict | None = None,
2929
limit: int | None = None,
3030
page_number: int | None = None,
31+
order_by: str | None = None,
32+
order_direction: str | None = None,
3133
) -> list[AgentEntity]:
3234
"""
3335
List agents with optional filtering.
3436
3537
Args:
3638
filters: Dictionary of filters to apply. Currently supports:
3739
- task_id: Filter agents by task ID using the join table
40+
order_by: Field to order by
41+
order_direction: Direction to order by (asc or desc)
3842
"""
3943
query = select(AgentORM)
4044
if filters and "task_id" in filters:
@@ -43,7 +47,12 @@ async def list(
4347
).where(TaskAgentORM.task_id == filters["task_id"])
4448
query = query.where(AgentORM.status != AgentStatus.DELETED)
4549
return await super().list(
46-
filters=filters, query=query, limit=limit, page_number=page_number
50+
filters=filters,
51+
query=query,
52+
limit=limit,
53+
page_number=page_number,
54+
order_by=order_by,
55+
order_direction=order_direction,
4756
)
4857

4958
@asynccontextmanager

agentex/src/domain/repositories/deployment_history_repository.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,30 @@ async def list(
3434
filters: dict | None = None,
3535
limit: int | None = None,
3636
page_number: int | None = None,
37+
order_by: str | None = None,
38+
order_direction: str | None = None,
3739
) -> list[DeploymentHistoryEntity]:
3840
"""
3941
List deployment history with optional filtering.
4042
4143
Args:
4244
filters: Dictionary of filters to apply. Currently supports:
4345
- agent_id: Filter agents by agent ID using the join table
46+
order_by: Field to order by
47+
order_direction: Order direction (asc or desc)
4448
"""
4549
query = select(DeploymentHistoryORM)
4650
if filters and "agent_id" in filters:
4751
query = query.join(
4852
AgentORM, AgentORM.id == DeploymentHistoryORM.agent_id
4953
).where(AgentORM.id == filters["agent_id"])
5054
return await super().list(
51-
filters=filters, query=query, limit=limit, page_number=page_number
55+
filters=filters,
56+
query=query,
57+
limit=limit,
58+
page_number=page_number,
59+
order_by=order_by,
60+
order_direction=order_direction,
5261
)
5362

5463
async def get_last_deployment_for_agent(

agentex/src/domain/repositories/span_repository.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,22 @@ def __init__(
1616
):
1717
super().__init__(async_read_write_session_maker, SpanORM, SpanEntity)
1818

19-
def list(
19+
async def list(
2020
self,
2121
filters: dict[str, Any] | None = None,
2222
limit: int | None = None,
2323
page_number: int | None = None,
24+
order_by: str | None = None,
25+
order_direction: str | None = None,
2426
) -> list[SpanEntity]:
25-
return super().list(
26-
filters, order_by="start_time", limit=limit, page_number=page_number
27+
# Default to start_time if no order_by specified
28+
effective_order_by = order_by or "start_time"
29+
return await super().list(
30+
filters=filters,
31+
order_by=effective_order_by,
32+
order_direction=order_direction,
33+
limit=limit,
34+
page_number=page_number,
2735
)
2836

2937

agentex/src/domain/services/task_service.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ async def list_tasks(
181181
id: str | list[str] | None = None,
182182
agent_id: str | None = None,
183183
agent_name: str | None = None,
184+
order_by: str | None = None,
185+
order_direction: str = "desc",
184186
relationships: list[TaskRelationships] | None = None,
185187
) -> list[TaskEntity]:
186188
"""
@@ -191,6 +193,8 @@ async def list_tasks(
191193
task_filters={"id": id} if id is not None else None,
192194
agent_id=agent_id,
193195
agent_name=agent_name,
196+
order_by=order_by,
197+
order_direction=order_direction,
194198
limit=limit,
195199
page_number=page_number,
196200
relationships=relationships,

agentex/src/domain/use_cases/agent_task_tracker_use_case.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,28 +28,25 @@ async def list(
2828
page_number: int,
2929
agent_id: str | None = None,
3030
task_id: str | None = None,
31+
order_by: str | None = None,
32+
order_direction: str = "desc",
3133
) -> list[AgentTaskTrackerEntity]:
3234
"""
3335
List agent task trackers.
3436
"""
35-
if agent_id and task_id:
36-
return await self._tracker_repository.list(
37-
filters={"agent_id": agent_id, "task_id": task_id},
38-
limit=limit,
39-
page_number=page_number,
40-
)
41-
elif agent_id:
42-
return await self._tracker_repository.list(
43-
filters={"agent_id": agent_id}, limit=limit, page_number=page_number
44-
)
45-
elif task_id:
46-
return await self._tracker_repository.list(
47-
filters={"task_id": task_id}, limit=limit, page_number=page_number
48-
)
49-
else:
50-
return await self._tracker_repository.list(
51-
limit=limit, page_number=page_number
52-
)
37+
filters = {}
38+
if agent_id:
39+
filters["agent_id"] = agent_id
40+
if task_id:
41+
filters["task_id"] = task_id
42+
43+
return await self._tracker_repository.list(
44+
filters=filters if filters else None,
45+
limit=limit,
46+
page_number=page_number,
47+
order_by=order_by,
48+
order_direction=order_direction,
49+
)
5350

5451
async def update_agent_task_tracker(
5552
self,

0 commit comments

Comments
 (0)