From 28da31344261557100cf209ff0ac491cda064c21 Mon Sep 17 00:00:00 2001 From: cthomas Date: Mon, 4 Aug 2025 11:59:55 -0700 Subject: [PATCH] chore: deprecate orm enum file (#3724) --- .../versions/e20573fe9b86_add_tool_types.py | 2 +- .../f895232c144a_backfill_composio_tools.py | 2 +- letta/agent.py | 3 +-- letta/agents/letta_agent.py | 3 +-- letta/agents/letta_agent_batch.py | 3 +-- letta/agents/voice_agent.py | 3 +-- letta/agents/voice_sleeptime_agent.py | 3 +-- letta/groups/supervisor_multi_agent.py | 2 +- letta/orm/enums.py | 21 ------------------- letta/orm/tool.py | 6 +++--- letta/schemas/tool.py | 2 +- letta/services/agent_manager.py | 3 +-- .../tool_executor/tool_execution_manager.py | 2 +- letta/services/tool_manager.py | 2 +- tests/test_agent_serialization.py | 3 +-- tests/test_managers.py | 15 ++++++++++--- tests/test_sources.py | 3 +-- 17 files changed, 29 insertions(+), 49 deletions(-) delete mode 100644 letta/orm/enums.py diff --git a/alembic/versions/e20573fe9b86_add_tool_types.py b/alembic/versions/e20573fe9b86_add_tool_types.py index deff4368..3ec94685 100644 --- a/alembic/versions/e20573fe9b86_add_tool_types.py +++ b/alembic/versions/e20573fe9b86_add_tool_types.py @@ -13,7 +13,7 @@ from sqlalchemy.dialects import postgresql from alembic import op from letta.constants import BASE_MEMORY_TOOLS, BASE_TOOLS -from letta.orm.enums import ToolType +from letta.schemas.enums import ToolType from letta.settings import settings # revision identifiers, used by Alembic. diff --git a/alembic/versions/f895232c144a_backfill_composio_tools.py b/alembic/versions/f895232c144a_backfill_composio_tools.py index defc2367..15432ffe 100644 --- a/alembic/versions/f895232c144a_backfill_composio_tools.py +++ b/alembic/versions/f895232c144a_backfill_composio_tools.py @@ -9,7 +9,7 @@ Create Date: 2025-01-16 14:21:33.764332 from typing import Sequence, Union from alembic import op -from letta.orm.enums import ToolType +from letta.schemas.enums import ToolType from letta.settings import settings # revision identifiers, used by Alembic. diff --git a/letta/agent.py b/letta/agent.py index 3cfaec5a..ead504e1 100644 --- a/letta/agent.py +++ b/letta/agent.py @@ -41,12 +41,11 @@ from letta.local_llm.utils import num_tokens_from_functions, num_tokens_from_mes from letta.log import get_logger from letta.memory import summarize_messages from letta.orm import User -from letta.orm.enums import ToolType from letta.otel.tracing import log_event, trace_method from letta.schemas.agent import AgentState, AgentStepResponse, UpdateAgent, get_prompt_template_for_agent_type from letta.schemas.block import BlockUpdate from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.enums import MessageRole, ProviderType +from letta.schemas.enums import MessageRole, ProviderType, ToolType from letta.schemas.letta_message_content import ImageContent, TextContent from letta.schemas.memory import ContextWindowOverview, Memory from letta.schemas.message import Message, MessageCreate, ToolReturn diff --git a/letta/agents/letta_agent.py b/letta/agents/letta_agent.py index b5a4eac8..4a7bef96 100644 --- a/letta/agents/letta_agent.py +++ b/letta/agents/letta_agent.py @@ -30,12 +30,11 @@ from letta.llm_api.llm_client import LLMClient from letta.llm_api.llm_client_base import LLMClientBase from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.log import get_logger -from letta.orm.enums import ToolType from letta.otel.context import get_ctx_attributes from letta.otel.metric_registry import MetricRegistry from letta.otel.tracing import log_event, trace_method, tracer from letta.schemas.agent import AgentState, UpdateAgent -from letta.schemas.enums import JobStatus, MessageRole, ProviderType +from letta.schemas.enums import JobStatus, MessageRole, ProviderType, ToolType from letta.schemas.letta_message import MessageType from letta.schemas.letta_message_content import OmittedReasoningContent, ReasoningContent, RedactedReasoningContent, TextContent from letta.schemas.letta_response import LettaResponse diff --git a/letta/agents/letta_agent_batch.py b/letta/agents/letta_agent_batch.py index 52ed9334..5d1e6b17 100644 --- a/letta/agents/letta_agent_batch.py +++ b/letta/agents/letta_agent_batch.py @@ -16,10 +16,9 @@ from letta.jobs.types import RequestStatusUpdateInfo, StepStatusUpdateInfo from letta.llm_api.llm_client import LLMClient from letta.local_llm.constants import INNER_THOUGHTS_KWARG from letta.log import get_logger -from letta.orm.enums import ToolType from letta.otel.tracing import log_event, trace_method from letta.schemas.agent import AgentState -from letta.schemas.enums import AgentStepStatus, JobStatus, MessageStreamStatus, ProviderType, SandboxType +from letta.schemas.enums import AgentStepStatus, JobStatus, MessageStreamStatus, ProviderType, SandboxType, ToolType from letta.schemas.job import JobUpdate from letta.schemas.letta_message import LegacyLettaMessage, LettaMessage from letta.schemas.letta_message_content import OmittedReasoningContent, ReasoningContent, RedactedReasoningContent, TextContent diff --git a/letta/agents/voice_agent.py b/letta/agents/voice_agent.py index a75e7e8d..69ce9150 100644 --- a/letta/agents/voice_agent.py +++ b/letta/agents/voice_agent.py @@ -13,9 +13,8 @@ from letta.helpers.datetime_helpers import get_utc_time from letta.helpers.tool_execution_helper import add_pre_execution_message, enable_strict_mode, remove_request_heartbeat from letta.interfaces.openai_chat_completions_streaming_interface import OpenAIChatCompletionsStreamingInterface from letta.log import get_logger -from letta.orm.enums import ToolType from letta.schemas.agent import AgentState, AgentType -from letta.schemas.enums import MessageRole +from letta.schemas.enums import MessageRole, ToolType from letta.schemas.letta_response import LettaResponse from letta.schemas.message import Message, MessageCreate from letta.schemas.openai.chat_completion_request import ( diff --git a/letta/agents/voice_sleeptime_agent.py b/letta/agents/voice_sleeptime_agent.py index 359c49cd..f2b3b426 100644 --- a/letta/agents/voice_sleeptime_agent.py +++ b/letta/agents/voice_sleeptime_agent.py @@ -3,11 +3,10 @@ from typing import AsyncGenerator, List, Optional, Tuple, Union from letta.agents.helpers import _create_letta_response, serialize_message_history from letta.agents.letta_agent import LettaAgent from letta.constants import DEFAULT_MAX_STEPS -from letta.orm.enums import ToolType from letta.otel.tracing import trace_method from letta.schemas.agent import AgentState from letta.schemas.block import BlockUpdate -from letta.schemas.enums import MessageStreamStatus +from letta.schemas.enums import MessageStreamStatus, ToolType from letta.schemas.letta_message import LegacyLettaMessage, LettaMessage, MessageType from letta.schemas.letta_response import LettaResponse from letta.schemas.message import MessageCreate diff --git a/letta/groups/supervisor_multi_agent.py b/letta/groups/supervisor_multi_agent.py index ba8f6261..35b5bf98 100644 --- a/letta/groups/supervisor_multi_agent.py +++ b/letta/groups/supervisor_multi_agent.py @@ -7,7 +7,7 @@ from letta.functions.functions import parse_source_code from letta.functions.schema_generator import generate_schema from letta.interface import AgentInterface from letta.orm import User -from letta.orm.enums import ToolType +from letta.schemas.enums import ToolType from letta.schemas.letta_message_content import TextContent from letta.schemas.message import MessageCreate from letta.schemas.tool import Tool diff --git a/letta/orm/enums.py b/letta/orm/enums.py deleted file mode 100644 index 81bfb515..00000000 --- a/letta/orm/enums.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Compatibility module for enums that were moved to address circular imports. - -This module maintains the old enum definitions for backwards compatibility, -especially for pickled objects that reference the old import paths. -""" - -from enum import Enum - - -class ToolType(str, Enum): - CUSTOM = "custom" - LETTA_CORE = "letta_core" - LETTA_MEMORY_CORE = "letta_memory_core" - LETTA_MULTI_AGENT_CORE = "letta_multi_agent_core" - LETTA_SLEEPTIME_CORE = "letta_sleeptime_core" - LETTA_VOICE_SLEEPTIME_CORE = "letta_voice_sleeptime_core" - LETTA_BUILTIN = "letta_builtin" - LETTA_FILES_CORE = "letta_files_core" - EXTERNAL_COMPOSIO = "external_composio" - # TODO is "external" the right name here? Since as of now, MCP is local / doesn't support remote? - EXTERNAL_MCP = "external_mcp" diff --git a/letta/orm/tool.py b/letta/orm/tool.py index 3a70ca46..ebe4dcbc 100644 --- a/letta/orm/tool.py +++ b/letta/orm/tool.py @@ -3,11 +3,11 @@ from typing import TYPE_CHECKING, List, Optional from sqlalchemy import JSON, Index, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship -# TODO everything in functions should live in this model -from letta.orm.enums import ToolType from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase -from letta.schemas.enums import ToolSourceType + +# TODO everything in functions should live in this model +from letta.schemas.enums import ToolSourceType, ToolType from letta.schemas.tool import Tool as PydanticTool if TYPE_CHECKING: diff --git a/letta/schemas/tool.py b/letta/schemas/tool.py index c2964e63..cb12a4e7 100644 --- a/letta/schemas/tool.py +++ b/letta/schemas/tool.py @@ -22,7 +22,7 @@ from letta.functions.schema_generator import ( generate_tool_schema_for_mcp, ) from letta.log import get_logger -from letta.orm.enums import ToolType +from letta.schemas.enums import ToolType from letta.schemas.letta_base import LettaBase from letta.schemas.pip_requirement import PipRequirement diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index fdb8171c..6c0be674 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -35,7 +35,6 @@ from letta.orm import Source as SourceModel from letta.orm import SourcePassage, SourcesAgents from letta.orm import Tool as ToolModel from letta.orm import ToolsAgents -from letta.orm.enums import ToolType from letta.orm.errors import NoResultFound from letta.orm.sandbox_config import AgentEnvironmentVariable from letta.orm.sandbox_config import AgentEnvironmentVariable as AgentEnvironmentVariableModel @@ -47,7 +46,7 @@ from letta.schemas.block import DEFAULT_BLOCKS from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import BlockUpdate from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.enums import ProviderType +from letta.schemas.enums import ProviderType, ToolType from letta.schemas.file import FileMetadata as PydanticFileMetadata from letta.schemas.group import Group as PydanticGroup from letta.schemas.group import ManagerType diff --git a/letta/services/tool_executor/tool_execution_manager.py b/letta/services/tool_executor/tool_execution_manager.py index eca264a9..b06b3569 100644 --- a/letta/services/tool_executor/tool_execution_manager.py +++ b/letta/services/tool_executor/tool_execution_manager.py @@ -4,11 +4,11 @@ from typing import Any, Dict, Optional, Type from letta.constants import FUNCTION_RETURN_VALUE_TRUNCATED from letta.helpers.datetime_helpers import AsyncTimer from letta.log import get_logger -from letta.orm.enums import ToolType from letta.otel.context import get_ctx_attributes from letta.otel.metric_registry import MetricRegistry from letta.otel.tracing import trace_method from letta.schemas.agent import AgentState +from letta.schemas.enums import ToolType from letta.schemas.sandbox_config import SandboxConfig from letta.schemas.tool import Tool from letta.schemas.tool_execution_result import ToolExecutionResult diff --git a/letta/services/tool_manager.py b/letta/services/tool_manager.py index 43bf244b..123d2a25 100644 --- a/letta/services/tool_manager.py +++ b/letta/services/tool_manager.py @@ -22,12 +22,12 @@ from letta.constants import ( from letta.errors import LettaToolNameConflictError from letta.functions.functions import derive_openai_json_schema, load_function_set from letta.log import get_logger -from letta.orm.enums import ToolType # TODO: Remove this once we translate all of these to the ORM from letta.orm.errors import NoResultFound from letta.orm.tool import Tool as ToolModel from letta.otel.tracing import trace_method +from letta.schemas.enums import ToolType from letta.schemas.tool import Tool as PydanticTool from letta.schemas.tool import ToolCreate, ToolUpdate from letta.schemas.user import User as PydanticUser diff --git a/tests/test_agent_serialization.py b/tests/test_agent_serialization.py index cc090752..d0ccc36f 100644 --- a/tests/test_agent_serialization.py +++ b/tests/test_agent_serialization.py @@ -15,11 +15,10 @@ from rich.syntax import Syntax from letta.config import LettaConfig from letta.orm import Base -from letta.orm.enums import ToolType from letta.schemas.agent import AgentState, CreateAgent from letta.schemas.block import Block, CreateBlock from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.enums import MessageRole +from letta.schemas.enums import MessageRole, ToolType from letta.schemas.llm_config import LLMConfig from letta.schemas.message import MessageCreate from letta.schemas.organization import Organization diff --git a/tests/test_managers.py b/tests/test_managers.py index 3e177e27..9417d53b 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -46,7 +46,6 @@ from letta.helpers.datetime_helpers import AsyncTimer from letta.jobs.types import ItemUpdateInfo, RequestStatusUpdateInfo, StepStatusUpdateInfo from letta.orm import Base, Block from letta.orm.block_history import BlockHistory -from letta.orm.enums import ToolType from letta.orm.errors import NoResultFound, UniqueConstraintViolationError from letta.orm.file import FileContent as FileContentModel from letta.orm.file import FileMetadata as FileMetadataModel @@ -54,7 +53,17 @@ from letta.schemas.agent import CreateAgent, UpdateAgent from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import BlockUpdate, CreateBlock from letta.schemas.embedding_config import EmbeddingConfig -from letta.schemas.enums import ActorType, AgentStepStatus, FileProcessingStatus, JobStatus, JobType, MessageRole, ProviderType, SandboxType +from letta.schemas.enums import ( + ActorType, + AgentStepStatus, + FileProcessingStatus, + JobStatus, + JobType, + MessageRole, + ProviderType, + SandboxType, + ToolType, +) from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate from letta.schemas.file import FileMetadata from letta.schemas.file import FileMetadata as PydanticFileMetadata @@ -841,7 +850,7 @@ async def test_upsert_base_tools_excludes_local_only_in_production(server: SyncS async def test_upsert_multi_agent_tools_only(server: SyncServer, default_user, set_letta_environment, event_loop): """Test that upserting only multi-agent tools respects production filtering.""" - from letta.orm.enums import ToolType + from letta.schemas.enums import ToolType # Upsert only multi-agent tools tools = await server.tool_manager.upsert_base_tools_async(actor=default_user, allowed_types={ToolType.LETTA_MULTI_AGENT_CORE}) diff --git a/tests/test_sources.py b/tests/test_sources.py index 6343957a..7fadb91e 100644 --- a/tests/test_sources.py +++ b/tests/test_sources.py @@ -13,8 +13,7 @@ from letta_client import MessageCreate as ClientMessageCreate from letta_client.types import AgentState from letta.constants import DEFAULT_ORG_ID, FILES_TOOLS -from letta.orm.enums import ToolType -from letta.schemas.enums import FileProcessingStatus +from letta.schemas.enums import FileProcessingStatus, ToolType from letta.schemas.message import MessageCreate from letta.schemas.user import User from letta.settings import settings