Skip to content

Commit 99fe1b1

Browse files
committed
new: agents can now optionally specify a minimum nerve required version
1 parent 409a87a commit 99fe1b1

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

nerve/cli/run.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def run(
8585
logger.info(f"🧠 nerve v{nerve.__version__}")
8686

8787
asyncio.run(
88-
execute_flow(
88+
_run(
8989
input_path,
9090
generator,
9191
# convert the conversation strategy string to a valid enum
@@ -130,7 +130,7 @@ def _resolve_input_path(input_path: pathlib.Path) -> pathlib.Path:
130130
return input_path
131131

132132

133-
async def execute_flow(
133+
async def _run(
134134
input_path: pathlib.Path,
135135
generator: str,
136136
conv_window_strategy: WindowStrategy,

nerve/models.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
import typing as t
33
from enum import Enum
44

5-
from pydantic import BaseModel, Field
5+
from loguru import logger
6+
from pydantic import AfterValidator, BaseModel, Field
67
from pydantic_yaml import parse_yaml_raw_as
78

9+
import nerve
10+
811

912
class Mode(str, Enum):
1013
"""
@@ -71,6 +74,30 @@ class Argument(BaseModel):
7174
tool: str | None = None
7275

7376

77+
def _check_required_version(required: str | None) -> str | None:
78+
if required:
79+
from packaging.requirements import Requirement
80+
81+
try:
82+
# a version was specified, convert to a valid requirement
83+
if required[0].isdigit():
84+
required_str = f"nerve-adk>={required}"
85+
else:
86+
# a full expression was specified, use it as is
87+
required_str = f"nerve-adk{required}"
88+
req = Requirement(required_str)
89+
except Exception as e:
90+
logger.error(f"error parsing required version '{required}': {e}")
91+
raise
92+
93+
if nerve.__version__ not in req.specifier:
94+
msg = f"required version {required} not satisfied by installed version {nerve.__version__}"
95+
logger.error(msg)
96+
raise ValueError(msg)
97+
98+
return required
99+
100+
74101
class Configuration(BaseModel):
75102
"""
76103
Configuration for an agent determining its "identity", task and capabilities.
@@ -81,6 +108,8 @@ class Configuration(BaseModel):
81108

82109
# optional generator
83110
generator: str | None = None
111+
# optional nerve version requirement
112+
requires: t.Annotated[str | None, AfterValidator(_check_required_version)] = None
84113
# used for versioning the agents
85114
version: str = "1.0.0"
86115
# the system prompt, the agent identity

poetry.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ types-pyperclip = { version = "^1.9.0.20250218", optional = true }
3636
termcolor = "^2.5.0"
3737
requests = "^2.32.3"
3838
types-requests = "^2.32.0.20250328"
39+
packaging = "^24.2"
3940

4041
[tool.poetry.extras]
4142
computer_use = [

0 commit comments

Comments
 (0)