idun-agent-schema 0.2.5__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.
@@ -0,0 +1,206 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+ .DS_Store
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ #uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ #poetry.lock
109
+
110
+ # pdm
111
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
112
+ #pdm.lock
113
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
114
+ # in version control.
115
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
116
+ .pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
121
+ __pypackages__/
122
+
123
+ # Celery stuff
124
+ celerybeat-schedule
125
+ celerybeat.pid
126
+
127
+ # SageMath parsed files
128
+ *.sage.py
129
+
130
+ # Environments
131
+ .env
132
+ .venv
133
+ env/
134
+ venv/
135
+ ENV/
136
+ env.bak/
137
+ venv.bak/
138
+
139
+ # Spyder project settings
140
+ .spyderproject
141
+ .spyproject
142
+
143
+ # Rope project settings
144
+ .ropeproject
145
+
146
+ # mkdocs documentation
147
+ /site
148
+
149
+ # mypy
150
+ .mypy_cache/
151
+ .dmypy.json
152
+ dmypy.json
153
+
154
+ # Pyre type checker
155
+ .pyre/
156
+
157
+ # pytype static type analyzer
158
+ .pytype/
159
+
160
+ # Cython debug symbols
161
+ cython_debug/
162
+
163
+ # PyCharm
164
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
165
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
166
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
167
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
168
+ #.idea/
169
+
170
+ # Ruff stuff:
171
+ .ruff_cache/
172
+
173
+ # PyPI configuration file
174
+ .pypirc
175
+
176
+ # Database files
177
+ *.db
178
+ *.db-shm
179
+ *.db-wai
180
+ *.db-journal*
181
+ *.sqlite
182
+ *.sqlite3
183
+ agents.db
184
+ checkpoint_async.db
185
+
186
+ # Python virtual environment
187
+ .venv/
188
+ venv/
189
+ ENV/
190
+
191
+ # Python cache
192
+ __pycache__/
193
+ *.pyc
194
+ *.pyo
195
+ *.pyd
196
+
197
+ # Poetry
198
+ poetry.lock
199
+
200
+ # Environment variables
201
+ .env
202
+
203
+ # Custom Gitignore for Idun
204
+ *.db-wal
205
+ .DS_Store
206
+ *.DS_Store
@@ -0,0 +1,39 @@
1
+ Metadata-Version: 2.4
2
+ Name: idun-agent-schema
3
+ Version: 0.2.5
4
+ Summary: Centralized Pydantic schema library for Idun Agent Engine and Manager
5
+ Project-URL: Homepage, https://github.com/geoffreyharrazi/idun-agent-platform
6
+ Project-URL: Repository, https://github.com/geoffreyharrazi/idun-agent-platform
7
+ Project-URL: Issues, https://github.com/geoffreyharrazi/idun-agent-platform/issues
8
+ Author-email: Idun Group <contact@idun-group.com>
9
+ License-Expression: MIT
10
+ Keywords: fastapi,idun,langgraph,pydantic,schemas
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3 :: Only
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Typing :: Typed
17
+ Requires-Python: <3.14,>=3.12
18
+ Requires-Dist: pydantic-settings<3.0.0,>=2.7.0
19
+ Requires-Dist: pydantic<3.0.0,>=2.11.7
20
+ Description-Content-Type: text/markdown
21
+
22
+ # Idun Agent Schema
23
+
24
+ Centralized Pydantic schema library shared by Idun Agent Engine and Idun Agent Manager.
25
+
26
+ ## Install
27
+
28
+ ```bash
29
+ pip install idun-agent-schema
30
+ ```
31
+
32
+ ## Usage
33
+
34
+ ```python
35
+ from idun_agent_schema.engine import EngineConfig
36
+ from idun_agent_schema.manager.api import AgentCreateRequest
37
+ ```
38
+
39
+ This package re-exports stable schema namespaces to avoid breaking existing imports. Prefer importing from this package directly going forward.
@@ -0,0 +1,18 @@
1
+ # Idun Agent Schema
2
+
3
+ Centralized Pydantic schema library shared by Idun Agent Engine and Idun Agent Manager.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pip install idun-agent-schema
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```python
14
+ from idun_agent_schema.engine import EngineConfig
15
+ from idun_agent_schema.manager.api import AgentCreateRequest
16
+ ```
17
+
18
+ This package re-exports stable schema namespaces to avoid breaking existing imports. Prefer importing from this package directly going forward.
@@ -0,0 +1,75 @@
1
+ [project]
2
+ name = "idun-agent-schema"
3
+ version = "0.2.5"
4
+ description = "Centralized Pydantic schema library for Idun Agent Engine and Manager"
5
+ authors = [{ name = "Idun Group", email = "contact@idun-group.com" }]
6
+ readme = "README.md"
7
+ license = "MIT"
8
+ requires-python = ">=3.12,<3.14"
9
+ keywords = ["pydantic", "schemas", "fastapi", "langgraph", "idun"]
10
+ classifiers = [
11
+ "License :: OSI Approved :: MIT License",
12
+ "Programming Language :: Python :: 3",
13
+ "Programming Language :: Python :: 3 :: Only",
14
+ "Programming Language :: Python :: 3.12",
15
+ "Programming Language :: Python :: 3.13",
16
+ "Typing :: Typed",
17
+ ]
18
+ dependencies = [
19
+ "pydantic>=2.11.7,<3.0.0",
20
+ "pydantic-settings>=2.7.0,<3.0.0",
21
+ ]
22
+
23
+ [project.urls]
24
+ Homepage = "https://github.com/geoffreyharrazi/idun-agent-platform"
25
+ Repository = "https://github.com/geoffreyharrazi/idun-agent-platform"
26
+ Issues = "https://github.com/geoffreyharrazi/idun-agent-platform/issues"
27
+
28
+ [build-system]
29
+ requires = ["hatchling>=1.25.0"]
30
+ build-backend = "hatchling.build"
31
+
32
+ [tool.hatch.build.targets.sdist]
33
+ include = [
34
+ "src/idun_agent_schema",
35
+ "src/idun_agent_schema/py.typed",
36
+ ]
37
+
38
+ [tool.hatch.build.targets.wheel]
39
+ include = [
40
+ "src/idun_agent_schema",
41
+ "src/idun_agent_schema/py.typed",
42
+ ]
43
+
44
+ [tool.hatch.build.targets.wheel.sources]
45
+ "src/idun_agent_schema" = "idun_agent_schema"
46
+
47
+ [tool.ruff]
48
+ target-version = "py312"
49
+ line-length = 88
50
+
51
+ [tool.ruff.lint]
52
+ select = [
53
+ "E", "F", "W", "I", "B", "UP", "N", "SIM", "D"
54
+ ]
55
+ extend-ignore = ["E501"]
56
+
57
+ [tool.black]
58
+ line-length = 88
59
+ target-version = ["py312", "py313"]
60
+ include = "\\.pyi?$"
61
+
62
+ [tool.mypy]
63
+ python_version = "3.12"
64
+ warn_return_any = true
65
+ warn_unused_ignores = true
66
+ ignore_missing_imports = true
67
+ strict_optional = true
68
+ no_implicit_optional = true
69
+ check_untyped_defs = true
70
+ pretty = true
71
+ show_error_codes = true
72
+
73
+ [tool.pytest.ini_options]
74
+ addopts = "-ra -q --strict-markers --disable-warnings"
75
+ testpaths = ["tests"]
@@ -0,0 +1,9 @@
1
+ """Idun Agent Schema - Centralized Pydantic schemas.
2
+
3
+ Public namespaces:
4
+ - idun_agent_schema.engine: Engine-related schemas
5
+ - idun_agent_schema.manager: Manager-related schemas
6
+ - idun_agent_schema.shared: Shared cross-cutting schemas
7
+ """
8
+
9
+ __version__ = "0.2.5"
@@ -0,0 +1,13 @@
1
+ """Engine-related schemas."""
2
+
3
+ from .agent import BaseAgentConfig,AgentConfig # noqa: F401
4
+ from .api import ChatRequest, ChatResponse # noqa: F401
5
+ from .agent_framework import AgentFramework # noqa: F401
6
+ from .engine import EngineConfig # noqa: F401
7
+ from .langgraph import ( # noqa: F401
8
+ CheckpointConfig,
9
+ LangGraphAgentConfig,
10
+ SqliteCheckpointConfig,
11
+ )
12
+ from .server import ServerAPIConfig, ServerConfig # noqa: F401
13
+ from .observability import ObservabilityConfig # noqa: F401
@@ -0,0 +1,42 @@
1
+ """Common agent model definitions (engine)."""
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+ from idun_agent_schema.engine.agent_framework import AgentFramework
8
+ from idun_agent_schema.engine.langgraph import LangGraphAgentConfig
9
+ from idun_agent_schema.engine.haystack import HaystackAgentConfig
10
+ from idun_agent_schema.engine.base_agent import BaseAgentConfig
11
+ from pydantic import model_validator
12
+
13
+
14
+ class AgentConfig(BaseModel):
15
+ """Configuration for agent specification and settings."""
16
+
17
+ type: AgentFramework
18
+ config: BaseAgentConfig | LangGraphAgentConfig | HaystackAgentConfig
19
+
20
+ @model_validator(mode="after")
21
+ def _validate_framework_config(self) -> "AgentConfig":
22
+ """Ensure the `config` type matches the selected framework.
23
+
24
+ - LANGGRAPH -> LangGraphAgentConfig
25
+ - HAYSTACK -> HaystackAgentConfig
26
+ - ADK/CREWAI/CUSTOM -> BaseAgentConfig (or subclass)
27
+ """
28
+ expected_type: type[BaseAgentConfig] | None = None
29
+
30
+ if self.type == AgentFramework.LANGGRAPH:
31
+ expected_type = LangGraphAgentConfig
32
+ elif self.type == AgentFramework.HAYSTACK:
33
+ expected_type = HaystackAgentConfig
34
+ elif self.type in {AgentFramework.ADK, AgentFramework.CREWAI, AgentFramework.CUSTOM}:
35
+ expected_type = BaseAgentConfig
36
+
37
+ if expected_type is not None and not isinstance(self.config, expected_type):
38
+ raise ValueError(
39
+ f"config must be {expected_type.__name__} when type is {self.type}"
40
+ )
41
+
42
+ return self
@@ -0,0 +1,13 @@
1
+ """Agent framework enumeration (engine)."""
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class AgentFramework(str, Enum):
7
+ """Supported agent frameworks for engine."""
8
+
9
+ LANGGRAPH = "LANGGRAPH"
10
+ ADK = "ADK"
11
+ CREWAI = "CREWAI"
12
+ HAYSTACK = "HAYSTACK"
13
+ CUSTOM = "CUSTOM"
@@ -0,0 +1,29 @@
1
+ """Schemas for engine HTTP API request/response payloads."""
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class ChatRequest(BaseModel):
7
+ """Request payload for synchronous and streaming chat endpoints.
8
+
9
+ Attributes:
10
+ session_id: Client-provided session identifier for routing state.
11
+ query: Natural language prompt or input for the agent.
12
+
13
+ """
14
+
15
+ session_id: str
16
+ query: str
17
+
18
+
19
+ class ChatResponse(BaseModel):
20
+ """Response payload for chat endpoints.
21
+
22
+ Attributes:
23
+ session_id: Echoed session identifier.
24
+ response: Agent's textual response.
25
+
26
+ """
27
+
28
+ session_id: str
29
+ response: str
@@ -0,0 +1,15 @@
1
+ """Common agent model definitions (engine)."""
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+ from idun_agent_schema.engine.observability import ObservabilityConfig
8
+
9
+ class BaseAgentConfig(BaseModel):
10
+ """Base model for agent configurations. Extend for specific frameworks."""
11
+
12
+ name: str
13
+ input_schema_definition: dict[str, Any] | None = Field(default_factory=dict)
14
+ output_schema_definition: dict[str, Any] | None = Field(default_factory=dict)
15
+ observability: ObservabilityConfig | None = Field(default=None)
@@ -0,0 +1,13 @@
1
+ """Main engine configuration model."""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from .server import ServerConfig
6
+ from .agent import AgentConfig
7
+
8
+
9
+ class EngineConfig(BaseModel):
10
+ """Main engine configuration model for the entire Idun Agent Engine."""
11
+
12
+ server: ServerConfig = Field(default_factory=ServerConfig)
13
+ agent: AgentConfig
@@ -0,0 +1,13 @@
1
+ """Configuration models for Haystack agents."""
2
+
3
+ from typing import Literal
4
+
5
+ from .base_agent import BaseAgentConfig
6
+
7
+
8
+ class HaystackAgentConfig(BaseAgentConfig):
9
+ """Configuration model for Haystack Agents."""
10
+
11
+ type: Literal["haystack"] = "haystack"
12
+ component_type: Literal["pipeline", "agent"]
13
+ component_definition: str
@@ -0,0 +1,47 @@
1
+ """Configuration models for LangGraph agents (engine)."""
2
+
3
+ from typing import Any, Literal
4
+ from urllib.parse import urlparse
5
+
6
+ from pydantic import BaseModel, field_validator
7
+
8
+ from .base_agent import BaseAgentConfig
9
+
10
+
11
+ class SqliteCheckpointConfig(BaseModel):
12
+ """Configuration for SQLite checkpointer."""
13
+
14
+ type: Literal["sqlite"]
15
+ db_url: str
16
+
17
+ @field_validator("db_url")
18
+ @classmethod
19
+ def db_url_must_be_sqlite(cls, v: str) -> str:
20
+ """Ensure the provided database URL uses the sqlite scheme.
21
+
22
+ Raises:
23
+ ValueError: If the URL does not start with 'sqlite:///'.
24
+
25
+ """
26
+ if not v.startswith("sqlite:///"):
27
+ raise ValueError("SQLite DB URL must start with 'sqlite:///'")
28
+ return v
29
+
30
+ @property
31
+ def db_path(self) -> str:
32
+ """Return filesystem path component derived from the sqlite URL."""
33
+ path = urlparse(self.db_url).path
34
+ if self.db_url.startswith("sqlite:///"):
35
+ return path.lstrip("/")
36
+ return path
37
+
38
+
39
+ CheckpointConfig = SqliteCheckpointConfig
40
+
41
+
42
+ class LangGraphAgentConfig(BaseAgentConfig):
43
+ """Configuration model for LangGraph agents."""
44
+
45
+ graph_definition: str
46
+ checkpointer: CheckpointConfig | None = None
47
+ store: dict[str, Any] | None = None
@@ -0,0 +1,56 @@
1
+ """Provider-agnostic observability configuration model (engine-scoped)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ from typing import Any
7
+
8
+ from pydantic import BaseModel, Field
9
+
10
+
11
+ def _resolve_env(value: Any) -> Any:
12
+ """Resolve environment placeholders in strings.
13
+
14
+ Supports patterns ${VAR} and $VAR. Non-strings are returned unchanged.
15
+ """
16
+ if isinstance(value, str):
17
+ if value.startswith("${") and value.endswith("}"):
18
+ return os.getenv(value[2:-1])
19
+ if value.startswith("$"):
20
+ return os.getenv(value[1:])
21
+ return value
22
+
23
+
24
+ class ObservabilityConfig(BaseModel):
25
+ """Provider-agnostic observability configuration based on Pydantic.
26
+
27
+ Example YAML:
28
+ observability:
29
+ provider: "langfuse" # or "phoenix"
30
+ enabled: true
31
+ options:
32
+ host: ${LANGFUSE_HOST}
33
+ public_key: ${LANGFUSE_PUBLIC_KEY}
34
+ secret_key: ${LANGFUSE_SECRET_KEY}
35
+ run_name: "my-run"
36
+ """
37
+
38
+ provider: str | None = Field(default=None)
39
+ enabled: bool = Field(default=False)
40
+ options: dict[str, Any] = Field(default_factory=dict)
41
+
42
+ def _resolve_value(self, value: Any) -> Any:
43
+ if isinstance(value, dict):
44
+ return {k: self._resolve_value(v) for k, v in value.items()}
45
+ if isinstance(value, list):
46
+ return [self._resolve_value(v) for v in value]
47
+ return _resolve_env(value)
48
+
49
+ def resolved(self) -> ObservabilityConfig:
50
+ """Return a copy with env placeholders resolved in options."""
51
+ resolved_options = self._resolve_value(self.options)
52
+ return ObservabilityConfig(
53
+ provider=self.provider,
54
+ enabled=self.enabled,
55
+ options=resolved_options,
56
+ )
@@ -0,0 +1,15 @@
1
+ """Server configuration models (engine)."""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class ServerAPIConfig(BaseModel):
7
+ """API server configuration."""
8
+
9
+ port: int = 8000
10
+
11
+
12
+ class ServerConfig(BaseModel):
13
+ """Configuration for the Engine's universal settings."""
14
+
15
+ api: ServerAPIConfig = Field(default_factory=ServerAPIConfig)
@@ -0,0 +1,9 @@
1
+ """Manager-related schemas."""
2
+
3
+ from .managed_agent import ( # noqa: F401
4
+ ManagedAgentCreate,
5
+ ManagedAgentRead,
6
+ ManagedAgentPatch,
7
+ AgentStatus,
8
+ )
9
+ from .api import ApiKeyResponse # noqa: F401
@@ -0,0 +1,17 @@
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
+ class ApiKeyResponse(BaseModel):
10
+ """Response shape for a single agent resource."""
11
+
12
+ api_key: str
13
+
14
+ class Config:
15
+ """Pydantic configuration for ORM compatibility."""
16
+
17
+ from_attributes = True
@@ -0,0 +1,58 @@
1
+ """Main managed agent configuration model."""
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, ConfigDict
8
+
9
+ from idun_agent_schema.engine import EngineConfig
10
+ from enum import Enum
11
+
12
+
13
+ class AgentStatus(str, Enum):
14
+ """Agent status enumeration."""
15
+
16
+ DRAFT = "draft"
17
+ ACTIVE = "active"
18
+ INACTIVE = "inactive"
19
+ DEPRECATED = "deprecated"
20
+ ERROR = "error"
21
+
22
+ # class ManagedAgentBase(BaseModel):
23
+ # """Base model for managed agent configuration."""
24
+
25
+ # id: UUID = Field(, description="Agent UUID")
26
+ # name: str
27
+ # status: AgentStatus = Field(AgentStatus.DRAFT, description="Agent status")
28
+ # version: str | None = Field(None, description="Agent version")
29
+ # engine_config: EngineConfig = Field(..., description="Idun Agent Engine configuration")
30
+ # created_at: datetime = Field(..., description="Creation timestamp")
31
+ # updated_at: datetime = Field(..., description="Last update timestamp")
32
+ # agent_hash: str | None = Field(default=None, description="Agent hash")
33
+
34
+ class ManagedAgentCreate(BaseModel):
35
+ """Create managed agent model for requests."""
36
+
37
+ name: str
38
+ version: str | None = Field(None, description="Agent version")
39
+ engine_config: EngineConfig = Field(..., description="Idun Agent Engine configuration")
40
+
41
+
42
+ class ManagedAgentRead(BaseModel):
43
+ """Complete managed agent model for responses."""
44
+ model_config = ConfigDict(from_attributes=True)
45
+
46
+ id: UUID
47
+ name: str
48
+ status: AgentStatus = Field(AgentStatus.DRAFT, description="Agent status")
49
+ version: str | None = Field(None, description="Agent version")
50
+ engine_config: EngineConfig = Field(..., description="Idun Agent Engine configuration")
51
+ created_at: datetime = Field(..., description="Creation timestamp")
52
+ updated_at: datetime = Field(..., description="Last update timestamp")
53
+
54
+
55
+ class ManagedAgentPatch(BaseModel):
56
+ """Full replacement schema for PUT of a managed agent."""
57
+ name: str
58
+ engine_config: EngineConfig = Field(..., description="Idun Agent Engine configuration")
File without changes
@@ -0,0 +1 @@
1
+ """Shared cross-cutting schemas used by both Engine and Manager."""