diff --git a/letta/orm/block_history.py b/letta/orm/block_history.py index de1b0c5d..20828124 100644 --- a/letta/orm/block_history.py +++ b/letta/orm/block_history.py @@ -4,9 +4,9 @@ from typing import Optional from sqlalchemy import JSON, BigInteger, ForeignKey, Index, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column -from letta.orm.enums import ActorType from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.schemas.enums import ActorType class BlockHistory(OrganizationMixin, SqlalchemyBase): diff --git a/letta/orm/enums.py b/letta/orm/enums.py index 1bb549a1..c885780b 100644 --- a/letta/orm/enums.py +++ b/letta/orm/enums.py @@ -1,3 +1,9 @@ +"""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 @@ -14,28 +20,3 @@ class ToolType(str, Enum): EXTERNAL_LANGCHAIN = "external_langchain" # TODO is "external" the right name here? Since as of now, MCP is local / doesn't support remote? EXTERNAL_MCP = "external_mcp" - - -class JobType(str, Enum): - JOB = "job" - RUN = "run" - BATCH = "batch" - - -class ToolSourceType(str, Enum): - """Defines what a tool was derived from""" - - python = "python" - json = "json" - - -class ActorType(str, Enum): - LETTA_USER = "letta_user" - LETTA_AGENT = "letta_agent" - LETTA_SYSTEM = "letta_system" - - -class MCPServerType(str, Enum): - SSE = "sse" - STDIO = "stdio" - STREAMABLE_HTTP = "streamable_http" diff --git a/letta/orm/job.py b/letta/orm/job.py index 6bb27a9f..5e2e14cc 100644 --- a/letta/orm/job.py +++ b/letta/orm/job.py @@ -4,10 +4,9 @@ from typing import TYPE_CHECKING, List, Optional from sqlalchemy import JSON, Index, String from sqlalchemy.orm import Mapped, mapped_column, relationship -from letta.orm.enums import JobType from letta.orm.mixins import UserMixin from letta.orm.sqlalchemy_base import SqlalchemyBase -from letta.schemas.enums import JobStatus +from letta.schemas.enums import JobStatus, JobType from letta.schemas.job import Job as PydanticJob from letta.schemas.job import LettaRequestConfig diff --git a/letta/orm/mcp_server.py b/letta/orm/mcp_server.py index 578c54e6..dd16485b 100644 --- a/letta/orm/mcp_server.py +++ b/letta/orm/mcp_server.py @@ -7,9 +7,9 @@ from letta.functions.mcp_client.types import StdioServerConfig from letta.orm.custom_columns import MCPStdioServerConfigColumn # TODO everything in functions should live in this model -from letta.orm.enums import MCPServerType from letta.orm.mixins import OrganizationMixin from letta.orm.sqlalchemy_base import SqlalchemyBase +from letta.schemas.enums import MCPServerType from letta.schemas.mcp import MCPServer if TYPE_CHECKING: diff --git a/letta/orm/tool.py b/letta/orm/tool.py index 6dbce85c..3a70ca46 100644 --- a/letta/orm/tool.py +++ b/letta/orm/tool.py @@ -4,9 +4,10 @@ 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 ToolSourceType, ToolType +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 from letta.schemas.tool import Tool as PydanticTool if TYPE_CHECKING: diff --git a/letta/schemas/enums.py b/letta/schemas/enums.py index c303d479..1794a37a 100644 --- a/letta/schemas/enums.py +++ b/letta/schemas/enums.py @@ -94,3 +94,43 @@ class FileProcessingStatus(str, Enum): EMBEDDING = "embedding" COMPLETED = "completed" ERROR = "error" + + +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" + EXTERNAL_LANGCHAIN = "external_langchain" + # TODO is "external" the right name here? Since as of now, MCP is local / doesn't support remote? + EXTERNAL_MCP = "external_mcp" + + +class JobType(str, Enum): + JOB = "job" + RUN = "run" + BATCH = "batch" + + +class ToolSourceType(str, Enum): + """Defines what a tool was derived from""" + + python = "python" + json = "json" + + +class ActorType(str, Enum): + LETTA_USER = "letta_user" + LETTA_AGENT = "letta_agent" + LETTA_SYSTEM = "letta_system" + + +class MCPServerType(str, Enum): + SSE = "sse" + STDIO = "stdio" + STREAMABLE_HTTP = "streamable_http" diff --git a/letta/schemas/job.py b/letta/schemas/job.py index 4f2b09c4..fadde684 100644 --- a/letta/schemas/job.py +++ b/letta/schemas/job.py @@ -4,8 +4,7 @@ from typing import List, Optional from pydantic import BaseModel, Field from letta.constants import DEFAULT_MESSAGE_TOOL, DEFAULT_MESSAGE_TOOL_KWARG -from letta.orm.enums import JobType -from letta.schemas.enums import JobStatus +from letta.schemas.enums import JobStatus, JobType from letta.schemas.letta_base import OrmMetadataBase from letta.schemas.letta_message import MessageType diff --git a/letta/schemas/run.py b/letta/schemas/run.py index acbcccb5..11e05839 100644 --- a/letta/schemas/run.py +++ b/letta/schemas/run.py @@ -2,7 +2,7 @@ from typing import Optional from pydantic import Field -from letta.orm.enums import JobType +from letta.schemas.enums import JobType from letta.schemas.job import Job, JobBase, LettaRequestConfig diff --git a/letta/server/rest_api/routers/v1/runs.py b/letta/server/rest_api/routers/v1/runs.py index 5974bc28..ae1c0f59 100644 --- a/letta/server/rest_api/routers/v1/runs.py +++ b/letta/server/rest_api/routers/v1/runs.py @@ -3,9 +3,8 @@ from typing import Annotated, List, Optional from fastapi import APIRouter, Depends, Header, HTTPException, Query from pydantic import Field -from letta.orm.enums import JobType from letta.orm.errors import NoResultFound -from letta.schemas.enums import JobStatus, MessageRole +from letta.schemas.enums import JobStatus, JobType, MessageRole from letta.schemas.letta_message import LettaMessageUnion from letta.schemas.openai.chat_completion_response import UsageStatistics from letta.schemas.run import Run diff --git a/letta/services/block_manager.py b/letta/services/block_manager.py index 12156cd4..82015805 100644 --- a/letta/services/block_manager.py +++ b/letta/services/block_manager.py @@ -7,12 +7,12 @@ from sqlalchemy.orm import Session from letta.log import get_logger from letta.orm.block import Block as BlockModel from letta.orm.block_history import BlockHistory -from letta.orm.enums import ActorType from letta.orm.errors import NoResultFound from letta.otel.tracing import trace_method from letta.schemas.agent import AgentState as PydanticAgentState from letta.schemas.block import Block as PydanticBlock from letta.schemas.block import BlockUpdate +from letta.schemas.enums import ActorType from letta.schemas.user import User as PydanticUser from letta.server.db import db_registry from letta.utils import enforce_types diff --git a/letta/services/job_manager.py b/letta/services/job_manager.py index c7201fc5..52d9498f 100644 --- a/letta/services/job_manager.py +++ b/letta/services/job_manager.py @@ -7,7 +7,6 @@ from sqlalchemy.orm import Session from letta.helpers.datetime_helpers import get_utc_time from letta.log import get_logger -from letta.orm.enums import JobType from letta.orm.errors import NoResultFound from letta.orm.job import Job as JobModel from letta.orm.job_messages import JobMessage @@ -16,7 +15,7 @@ from letta.orm.sqlalchemy_base import AccessType from letta.orm.step import Step from letta.orm.step import Step as StepModel from letta.otel.tracing import trace_method -from letta.schemas.enums import JobStatus, MessageRole +from letta.schemas.enums import JobStatus, JobType, MessageRole from letta.schemas.job import BatchJob as PydanticBatchJob from letta.schemas.job import Job as PydanticJob from letta.schemas.job import JobUpdate, LettaRequestConfig diff --git a/tests/integration_test_sleeptime_agent.py b/tests/integration_test_sleeptime_agent.py index db0a50b9..4bb5c20e 100644 --- a/tests/integration_test_sleeptime_agent.py +++ b/tests/integration_test_sleeptime_agent.py @@ -7,11 +7,10 @@ from letta.config import LettaConfig from letta.constants import DEFAULT_HUMAN from letta.groups.sleeptime_multi_agent_v2 import SleeptimeMultiAgentV2 from letta.orm import Provider, ProviderTrace, Step -from letta.orm.enums import JobType from letta.orm.errors import NoResultFound from letta.schemas.agent import CreateAgent from letta.schemas.block import CreateBlock -from letta.schemas.enums import JobStatus, ToolRuleType +from letta.schemas.enums import JobStatus, JobType, ToolRuleType from letta.schemas.group import GroupUpdate, ManagerType, SleeptimeManagerUpdate from letta.schemas.message import MessageCreate from letta.schemas.run import Run diff --git a/tests/test_managers.py b/tests/test_managers.py index cb972432..d3375f8a 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -46,7 +46,7 @@ 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 ActorType, JobType, ToolType +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 +54,7 @@ from letta.schemas.agent import AgentStepState, 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 AgentStepStatus, FileProcessingStatus, JobStatus, MessageRole, ProviderType +from letta.schemas.enums import ActorType, AgentStepStatus, FileProcessingStatus, JobStatus, JobType, MessageRole, ProviderType from letta.schemas.environment_variables import SandboxEnvironmentVariableCreate, SandboxEnvironmentVariableUpdate from letta.schemas.file import FileMetadata as PydanticFileMetadata from letta.schemas.identity import IdentityCreate, IdentityProperty, IdentityPropertyType, IdentityType, IdentityUpdate, IdentityUpsert