diff --git a/letta/constants.py b/letta/constants.py index 65984d68..6f793a25 100644 --- a/letta/constants.py +++ b/letta/constants.py @@ -35,6 +35,7 @@ LETTA_TOOL_MODULE_NAMES = [ DEFAULT_ORG_ID = "org-00000000-0000-4000-8000-000000000000" DEFAULT_ORG_NAME = "default_org" +AGENT_ID_PATTERN = re.compile(r"^agent-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$", re.IGNORECASE) # String in the error message for when the context window is too large # Example full message: diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 048f083b..e31b760c 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -13,7 +13,7 @@ from sqlalchemy.exc import IntegrityError, OperationalError from starlette.responses import Response, StreamingResponse from letta.agents.letta_agent import LettaAgent -from letta.constants import DEFAULT_MAX_STEPS, DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG, REDIS_RUN_ID_PREFIX +from letta.constants import AGENT_ID_PATTERN, DEFAULT_MAX_STEPS, DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG, REDIS_RUN_ID_PREFIX from letta.data_sources.redis_client import get_redis_client from letta.errors import AgentExportIdMappingError, AgentExportProcessingError, AgentFileImportError, AgentNotFoundForExportError from letta.groups.sleeptime_multi_agent_v2 import SleeptimeMultiAgentV2 @@ -672,6 +672,10 @@ async def retrieve_agent( """ Get the state of the agent. """ + # Check if agent_id matches uuid4 format + if not AGENT_ID_PATTERN.match(agent_id): + raise HTTPException(status_code=400, detail=f"agent_id {agent_id} is not in the valid format 'agent-'") + actor = await server.user_manager.get_actor_or_default_async(actor_id=actor_id) try: