idun-agent-schema 0.1.41__tar.gz → 0.2.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.

Potentially problematic release.


This version of idun-agent-schema might be problematic. Click here for more details.

Files changed (24) hide show
  1. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/PKG-INFO +1 -1
  2. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/pyproject.toml +1 -1
  3. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/engine/__init__.py +1 -2
  4. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/engine/config.py +15 -10
  5. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/engine/haystack.py +1 -1
  6. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/manager/__init__.py +5 -2
  7. idun_agent_schema-0.2.0/src/idun_agent_schema/manager/api.py +286 -0
  8. idun_agent_schema-0.1.41/src/idun_agent_schema/manager/api.py +0 -158
  9. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/.gitignore +0 -0
  10. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/README.md +0 -0
  11. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/__init__.py +0 -0
  12. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/engine/agent.py +0 -0
  13. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/engine/api.py +0 -0
  14. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/engine/langgraph.py +0 -0
  15. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/engine/server.py +0 -0
  16. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/manager/deployments.py +0 -0
  17. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/manager/deps.py +0 -0
  18. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/manager/domain.py +0 -0
  19. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/manager/dto.py +0 -0
  20. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/manager/errors.py +0 -0
  21. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/manager/settings.py +0 -0
  22. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/py.typed +0 -0
  23. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/shared/__init__.py +0 -0
  24. {idun_agent_schema-0.1.41 → idun_agent_schema-0.2.0}/src/idun_agent_schema/shared/observability.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: idun-agent-schema
3
- Version: 0.1.41
3
+ Version: 0.2.0
4
4
  Summary: Centralized Pydantic schema library for Idun Agent Engine and Manager
5
5
  Project-URL: Homepage, https://github.com/geoffreyharrazi/idun-agent-platform
6
6
  Project-URL: Repository, https://github.com/geoffreyharrazi/idun-agent-platform
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "idun-agent-schema"
3
- version = "0.1.41"
3
+ version = "0.2.0"
4
4
  description = "Centralized Pydantic schema library for Idun Agent Engine and Manager"
5
5
  authors = [{ name = "Idun Team", email = "team@idun.com" }]
6
6
  readme = "README.md"
@@ -2,8 +2,7 @@
2
2
 
3
3
  from .agent import BaseAgentConfig # noqa: F401
4
4
  from .api import ChatRequest, ChatResponse # noqa: F401
5
- from .config import AgentConfig, EngineConfig # noqa: F401
6
- from .haystack import HaystackAgentConfig
5
+ from .config import AgentConfig, AgentFramework, EngineConfig # noqa: F401
7
6
  from .langgraph import ( # noqa: F401
8
7
  CheckpointConfig,
9
8
  LangGraphAgentConfig,
@@ -1,25 +1,30 @@
1
1
  """Top-level engine configuration models."""
2
2
 
3
- from typing import Literal
4
-
3
+ from enum import Enum
5
4
  from pydantic import BaseModel, Field
6
5
 
7
- from idun_agent_schema.engine.haystack import HaystackAgentConfig
8
-
9
6
  from .agent import BaseAgentConfig
10
7
  from .langgraph import LangGraphAgentConfig
11
8
  from .server import ServerConfig
12
9
 
13
10
 
14
- class AgentConfig(BaseModel):
15
- """Configuration for agent specification and settings."""
11
+ class AgentFramework(str, Enum):
12
+ """Supported agent frameworks for engine."""
16
13
 
17
- type: Literal["langgraph", "ADK", "CREWAI", "haystack"] = Field(default="langgraph")
14
+ LANGGRAPH = "langgraph"
15
+ ADK = "ADK"
16
+ CREWAI = "CREWAI"
17
+ HAYSTACK = "haystack"
18
+ CUSTOM = "custom"
18
19
 
19
20
 
20
- config: BaseAgentConfig | HaystackAgentConfig | LangGraphAgentConfig = Field(
21
- default_factory=BaseAgentConfig
22
- )
21
+ class AgentConfig(BaseModel):
22
+ """Configuration for agent specification and settings."""
23
+
24
+ type: AgentFramework = Field(default=AgentFramework.LANGGRAPH)
25
+ config: BaseAgentConfig | LangGraphAgentConfig = Field(
26
+ default_factory=BaseAgentConfig
27
+ )
23
28
 
24
29
 
25
30
  class EngineConfig(BaseModel):
@@ -2,7 +2,7 @@
2
2
 
3
3
  from typing import Literal
4
4
 
5
- from .agent import BaseAgentConfig
5
+ from idun_agent_engine.core.engine_config import BaseAgentConfig
6
6
 
7
7
 
8
8
  class HaystackAgentConfig(BaseAgentConfig):
@@ -1,14 +1,17 @@
1
1
  """Manager-related schemas."""
2
2
 
3
3
  from .api import ( # noqa: F401
4
- AgentCreateRequest,
4
+ Agent,
5
+ AgentCreate,
6
+ AgentPatch,
7
+ AgentReplace,
5
8
  AgentResponse,
6
9
  AgentRunRequest,
7
10
  AgentRunResponse,
8
11
  AgentRunSummaryResponse,
9
12
  AgentStatsResponse,
10
13
  AgentSummaryResponse,
11
- AgentUpdateRequest,
14
+ AgentUpdate,
12
15
  PaginatedAgentsResponse,
13
16
  PaginatedResponse,
14
17
  PaginatedRunsResponse,
@@ -0,0 +1,286 @@
1
+ """Pydantic schemas for Agent Manager API I/O."""
2
+
3
+ from datetime import datetime
4
+ from typing import Any
5
+ from uuid import UUID
6
+
7
+ from pydantic import BaseModel, Field, field_validator
8
+
9
+ from ..engine.config import AgentConfig
10
+ from .domain import AgentFramework, AgentStatus
11
+
12
+
13
+
14
+
15
+ class AgentRunRequest(BaseModel):
16
+ """Request payload to execute an agent run."""
17
+
18
+ input_data: dict[str, Any]
19
+ trace_id: str | None = Field(None, max_length=100)
20
+
21
+
22
+ class AgentResponse(BaseModel):
23
+ """Response shape for a single agent resource."""
24
+
25
+ id: UUID
26
+ name: str
27
+ description: str | None
28
+ framework: AgentFramework
29
+ status: AgentStatus
30
+ config: dict[str, Any]
31
+ environment_variables: dict[str, str]
32
+ version: str
33
+ tags: list[str]
34
+ tenant_id: UUID
35
+ created_at: datetime
36
+ updated_at: datetime
37
+ deployed_at: datetime | None
38
+ total_runs: int
39
+ success_rate: float | None
40
+ avg_response_time_ms: float | None
41
+
42
+ class Config:
43
+ """Pydantic configuration for ORM compatibility."""
44
+
45
+ from_attributes = True
46
+
47
+
48
+ class AgentSummaryResponse(BaseModel):
49
+ """Reduced agent fields for listing views."""
50
+
51
+ id: UUID
52
+ name: str
53
+ description: str | None
54
+ framework: AgentFramework
55
+ status: AgentStatus
56
+ version: str
57
+ tags: list[str]
58
+ created_at: datetime
59
+ updated_at: datetime
60
+ total_runs: int
61
+ success_rate: float | None
62
+
63
+ class Config:
64
+ """Pydantic configuration for ORM compatibility."""
65
+
66
+ from_attributes = True
67
+
68
+
69
+ class AgentRunResponse(BaseModel):
70
+ """Detailed run record returned after execution."""
71
+
72
+ id: UUID
73
+ agent_id: UUID
74
+ tenant_id: UUID
75
+ input_data: dict[str, Any]
76
+ output_data: dict[str, Any] | None
77
+ status: str
78
+ started_at: datetime
79
+ completed_at: datetime | None
80
+ error_message: str | None
81
+ response_time_ms: float | None
82
+ tokens_used: int | None
83
+ cost_usd: float | None
84
+ trace_id: str | None
85
+ span_id: str | None
86
+
87
+ class Config:
88
+ """Pydantic configuration for ORM compatibility."""
89
+
90
+ from_attributes = True
91
+
92
+
93
+ class AgentRunSummaryResponse(BaseModel):
94
+ """Reduced run fields for list views."""
95
+
96
+ id: UUID
97
+ agent_id: UUID
98
+ status: str
99
+ started_at: datetime
100
+ completed_at: datetime | None
101
+ response_time_ms: float | None
102
+ tokens_used: int | None
103
+ cost_usd: float | None
104
+
105
+ class Config:
106
+ """Pydantic configuration for ORM compatibility."""
107
+
108
+ from_attributes = True
109
+
110
+
111
+ class PaginatedResponse(BaseModel):
112
+ """Base pagination container used by list endpoints."""
113
+
114
+ total: int
115
+ limit: int
116
+ offset: int
117
+ has_more: bool
118
+
119
+
120
+ class PaginatedAgentsResponse(PaginatedResponse):
121
+ """Paginated list of agents."""
122
+
123
+ items: list[AgentSummaryResponse]
124
+
125
+
126
+ class PaginatedRunsResponse(PaginatedResponse):
127
+ """Paginated list of agent runs."""
128
+
129
+ items: list[AgentRunSummaryResponse]
130
+
131
+
132
+ class AgentStatsResponse(BaseModel):
133
+ """Aggregated statistics across all agents."""
134
+
135
+ total_agents: int
136
+ active_agents: int
137
+ total_runs_today: int
138
+ total_runs_this_month: int
139
+ avg_success_rate: float | None
140
+ avg_response_time_ms: float | None
141
+
142
+
143
+ class AgentCreate(BaseModel):
144
+ """Schema for creating a new agent.
145
+
146
+ Framework is inferred from config.type (e.g., config.type = "langgraph").
147
+ """
148
+
149
+ name: str = Field(..., min_length=1, max_length=100, description="Agent name")
150
+ description: str | None = Field(
151
+ None, max_length=500, description="Agent description"
152
+ )
153
+ # Use schema's AgentConfig instead of AgentPayload
154
+ config: AgentConfig = Field(
155
+ ..., description="Framework-specific agent configuration"
156
+ )
157
+
158
+ @field_validator("name") # noqa: N805 - Pydantic validator uses `cls` by convention
159
+ @classmethod
160
+ def validate_name(cls, v):
161
+ if not v.strip():
162
+ raise ValueError("Name cannot be empty or whitespace only")
163
+ return v.strip()
164
+
165
+ class Config:
166
+ json_schema_extra = {
167
+ "example": {
168
+ "name": "My AI Assistant",
169
+ "description": "A helpful AI assistant for customer support",
170
+ "config": {
171
+ "type": "langgraph",
172
+ "config": {
173
+ "name": "My AI Assistant",
174
+ "graph_definition": "./examples/01_basic_config_file/example_agent.py:app",
175
+ "checkpointer": None,
176
+ "store": None,
177
+ "input_schema_definition": {},
178
+ "output_schema_definition": {},
179
+ "observability": None,
180
+ },
181
+ },
182
+ }
183
+ }
184
+
185
+
186
+ class AgentUpdate(BaseModel):
187
+ """Schema for updating an existing agent."""
188
+
189
+ name: str | None = Field(
190
+ None, min_length=1, max_length=100, description="Agent name"
191
+ )
192
+ description: str | None = Field(
193
+ None, max_length=500, description="Agent description"
194
+ )
195
+ framework: AgentFramework | None = Field(None, description="Agent framework")
196
+
197
+ @field_validator("name") # noqa: N805
198
+ @classmethod
199
+ def validate_name(cls, v):
200
+ if v is not None and not v.strip():
201
+ raise ValueError("Name cannot be empty or whitespace only")
202
+ return v.strip() if v else v
203
+
204
+ class Config:
205
+ json_schema_extra = {
206
+ "example": {
207
+ "name": "Updated Agent Name",
208
+ "description": "Updated description",
209
+ "framework": "langchain",
210
+ }
211
+ }
212
+
213
+
214
+ class Agent(BaseModel):
215
+ """Complete agent model for responses."""
216
+
217
+ id: str = Field(..., description="Unique agent identifier")
218
+ name: str = Field(..., description="Agent name")
219
+ description: str | None = Field(None, description="Agent description")
220
+ framework: AgentFramework = Field(..., description="Agent framework")
221
+ status: AgentStatus = Field(AgentStatus.DRAFT, description="Agent status")
222
+ created_at: datetime = Field(..., description="Creation timestamp")
223
+ updated_at: datetime = Field(..., description="Last update timestamp")
224
+
225
+ class Config:
226
+ json_schema_extra = {
227
+ "example": {
228
+ "id": "550e8400-e29b-41d4-a716-446655440000",
229
+ "name": "My AI Assistant",
230
+ "description": "A helpful AI assistant",
231
+ "framework": "langgraph",
232
+ "status": "draft",
233
+ "created_at": "2024-01-01T00:00:00",
234
+ "updated_at": "2024-01-01T00:00:00",
235
+ }
236
+ }
237
+
238
+
239
+ class AgentReplace(BaseModel):
240
+ """Full replacement schema for PUT of an agent.
241
+
242
+ Represents the complete updatable representation of an agent.
243
+ Server-managed fields like id, status, and timestamps are excluded.
244
+ """
245
+
246
+ name: str = Field(..., min_length=1, max_length=100, description="Agent name")
247
+ description: str | None = Field(
248
+ None, max_length=500, description="Agent description"
249
+ )
250
+ config: AgentConfig = Field(
251
+ ..., description="Framework-specific agent configuration"
252
+ )
253
+
254
+ @field_validator("name") # noqa: N805
255
+ @classmethod
256
+ def validate_name(cls, v):
257
+ if not v.strip():
258
+ raise ValueError("Name cannot be empty or whitespace only")
259
+ return v.strip()
260
+
261
+
262
+ class AgentPatch(BaseModel):
263
+ """Partial update schema for PATCH of an agent.
264
+
265
+ Only provided fields will be updated. If config is provided, the
266
+ framework will be inferred from config.type.
267
+ """
268
+
269
+ name: str | None = Field(
270
+ None, min_length=1, max_length=100, description="Agent name"
271
+ )
272
+ description: str | None = Field(
273
+ None, max_length=500, description="Agent description"
274
+ )
275
+ config: AgentConfig | None = Field(
276
+ None, description="Framework-specific agent configuration"
277
+ )
278
+
279
+ @field_validator("name") # noqa: N805
280
+ @classmethod
281
+ def validate_name(cls, v):
282
+ if v is not None and not v.strip():
283
+ raise ValueError("Name cannot be empty or whitespace only")
284
+ return v.strip() if v else v
285
+
286
+
@@ -1,158 +0,0 @@
1
- """Pydantic schemas for Agent Manager API I/O."""
2
-
3
- from datetime import datetime
4
- from typing import Any
5
- from uuid import UUID
6
-
7
- from pydantic import BaseModel, Field
8
-
9
- from .domain import AgentFramework, AgentStatus
10
-
11
-
12
- class AgentCreateRequest(BaseModel):
13
- """Request payload to create a new agent."""
14
-
15
- name: str = Field(..., min_length=1, max_length=255)
16
- description: str | None = Field(None, max_length=1000)
17
- framework: AgentFramework
18
- config: dict[str, Any] = Field(default_factory=dict)
19
- environment_variables: dict[str, str] = Field(default_factory=dict)
20
- tags: list[str] = Field(default_factory=list)
21
-
22
-
23
- class AgentUpdateRequest(BaseModel):
24
- """Request payload to update an existing agent (partial)."""
25
-
26
- name: str | None = Field(None, min_length=1, max_length=255)
27
- description: str | None = Field(None, max_length=1000)
28
- config: dict[str, Any] | None = None
29
- environment_variables: dict[str, str] | None = None
30
- tags: list[str] | None = None
31
-
32
-
33
- class AgentRunRequest(BaseModel):
34
- """Request payload to execute an agent run."""
35
-
36
- input_data: dict[str, Any]
37
- trace_id: str | None = Field(None, max_length=100)
38
-
39
-
40
- class AgentResponse(BaseModel):
41
- """Response shape for a single agent resource."""
42
-
43
- id: UUID
44
- name: str
45
- description: str | None
46
- framework: AgentFramework
47
- status: AgentStatus
48
- config: dict[str, Any]
49
- environment_variables: dict[str, str]
50
- version: str
51
- tags: list[str]
52
- tenant_id: UUID
53
- created_at: datetime
54
- updated_at: datetime
55
- deployed_at: datetime | None
56
- total_runs: int
57
- success_rate: float | None
58
- avg_response_time_ms: float | None
59
-
60
- class Config:
61
- """Pydantic configuration for ORM compatibility."""
62
-
63
- from_attributes = True
64
-
65
-
66
- class AgentSummaryResponse(BaseModel):
67
- """Reduced agent fields for listing views."""
68
-
69
- id: UUID
70
- name: str
71
- description: str | None
72
- framework: AgentFramework
73
- status: AgentStatus
74
- version: str
75
- tags: list[str]
76
- created_at: datetime
77
- updated_at: datetime
78
- total_runs: int
79
- success_rate: float | None
80
-
81
- class Config:
82
- """Pydantic configuration for ORM compatibility."""
83
-
84
- from_attributes = True
85
-
86
-
87
- class AgentRunResponse(BaseModel):
88
- """Detailed run record returned after execution."""
89
-
90
- id: UUID
91
- agent_id: UUID
92
- tenant_id: UUID
93
- input_data: dict[str, Any]
94
- output_data: dict[str, Any] | None
95
- status: str
96
- started_at: datetime
97
- completed_at: datetime | None
98
- error_message: str | None
99
- response_time_ms: float | None
100
- tokens_used: int | None
101
- cost_usd: float | None
102
- trace_id: str | None
103
- span_id: str | None
104
-
105
- class Config:
106
- """Pydantic configuration for ORM compatibility."""
107
-
108
- from_attributes = True
109
-
110
-
111
- class AgentRunSummaryResponse(BaseModel):
112
- """Reduced run fields for list views."""
113
-
114
- id: UUID
115
- agent_id: UUID
116
- status: str
117
- started_at: datetime
118
- completed_at: datetime | None
119
- response_time_ms: float | None
120
- tokens_used: int | None
121
- cost_usd: float | None
122
-
123
- class Config:
124
- """Pydantic configuration for ORM compatibility."""
125
-
126
- from_attributes = True
127
-
128
-
129
- class PaginatedResponse(BaseModel):
130
- """Base pagination container used by list endpoints."""
131
-
132
- total: int
133
- limit: int
134
- offset: int
135
- has_more: bool
136
-
137
-
138
- class PaginatedAgentsResponse(PaginatedResponse):
139
- """Paginated list of agents."""
140
-
141
- items: list[AgentSummaryResponse]
142
-
143
-
144
- class PaginatedRunsResponse(PaginatedResponse):
145
- """Paginated list of agent runs."""
146
-
147
- items: list[AgentRunSummaryResponse]
148
-
149
-
150
- class AgentStatsResponse(BaseModel):
151
- """Aggregated statistics across all agents."""
152
-
153
- total_agents: int
154
- active_agents: int
155
- total_runs_today: int
156
- total_runs_this_month: int
157
- avg_success_rate: float | None
158
- avg_response_time_ms: float | None