From ed57f599bd3e572b26c2965c9e5e3620c8ee6e9f Mon Sep 17 00:00:00 2001 From: cthomas Date: Fri, 14 Mar 2025 16:29:32 -0700 Subject: [PATCH] feat: bake otel collector into letta image (#1292) (#2490) --- Dockerfile | 19 +++++-- compose.tracing.yaml | 19 ------- compose.yaml | 4 ++ letta/__init__.py | 2 +- letta/server/startup.sh | 20 +++++++ letta/services/agent_manager.py | 3 - letta/settings.py | 1 + letta/tracing.py | 2 +- otel-collector-config-clickhouse.yaml | 73 ++++++++++++++++++++++++ otel-collector-config-file.yaml | 27 +++++++++ otel-collector-config.yaml | 32 ----------- poetry.lock | 80 +++++++++++++-------------- pyproject.toml | 2 +- tests/test_client.py | 4 +- tests/test_streaming.py | 2 - 15 files changed, 183 insertions(+), 107 deletions(-) delete mode 100644 compose.tracing.yaml create mode 100644 otel-collector-config-clickhouse.yaml create mode 100644 otel-collector-config-file.yaml delete mode 100644 otel-collector-config.yaml diff --git a/Dockerfile b/Dockerfile index c1abecc4..0e99ff19 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,12 +40,22 @@ RUN poetry lock --no-update && \ # Runtime stage FROM ankane/pgvector:v0.5.1 AS runtime -# Install Python packages +# Install Python packages and OpenTelemetry Collector RUN apt-get update && apt-get install -y \ python3 \ python3-venv \ + curl \ && rm -rf /var/lib/apt/lists/* \ - && mkdir -p /app + && mkdir -p /app \ + # Install OpenTelemetry Collector + && curl -L https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.96.0/otelcol-contrib_0.96.0_linux_amd64.tar.gz -o /tmp/otel-collector.tar.gz \ + && tar xzf /tmp/otel-collector.tar.gz -C /usr/local/bin \ + && rm /tmp/otel-collector.tar.gz \ + && mkdir -p /etc/otel + +# Add OpenTelemetry Collector configs +COPY otel-collector-config-file.yaml /etc/otel/config-file.yaml +COPY otel-collector-config-clickhouse.yaml /etc/otel/config-clickhouse.yaml ARG LETTA_ENVIRONMENT=PRODUCTION ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} \ @@ -54,7 +64,8 @@ ENV LETTA_ENVIRONMENT=${LETTA_ENVIRONMENT} \ POSTGRES_USER=letta \ POSTGRES_PASSWORD=letta \ POSTGRES_DB=letta \ - COMPOSIO_DISABLE_VERSION_CHECK=true + COMPOSIO_DISABLE_VERSION_CHECK=true \ + OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 WORKDIR /app @@ -64,7 +75,7 @@ COPY --from=builder /app . # Copy initialization SQL if it exists COPY init.sql /docker-entrypoint-initdb.d/ -EXPOSE 8283 5432 +EXPOSE 8283 5432 4317 4318 ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] CMD ["./letta/server/startup.sh"] diff --git a/compose.tracing.yaml b/compose.tracing.yaml deleted file mode 100644 index 169ab517..00000000 --- a/compose.tracing.yaml +++ /dev/null @@ -1,19 +0,0 @@ -services: - letta_server: - environment: - - ENV_NAME=${ENV_NAME} # optional service name - - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 - - otel-collector: - image: otel/opentelemetry-collector-contrib:0.92.0 - command: ["--config=/etc/otel-collector-config.yaml"] - volumes: - - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml - environment: - - CLICKHOUSE_ENDPOINT=${CLICKHOUSE_ENDPOINT} - - CLICKHOUSE_DATABASE=${CLICKHOUSE_DATABASE} - - CLICKHOUSE_USER=${CLICKHOUSE_USER} - - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD} - ports: - - "4317:4317" - - "4318:4318" diff --git a/compose.yaml b/compose.yaml index f6d13abc..d7ce6e6d 100644 --- a/compose.yaml +++ b/compose.yaml @@ -49,6 +49,10 @@ services: - VLLM_API_BASE=${VLLM_API_BASE} - OPENLLM_AUTH_TYPE=${OPENLLM_AUTH_TYPE} - OPENLLM_API_KEY=${OPENLLM_API_KEY} + - CLICKHOUSE_ENDPOINT=${CLICKHOUSE_ENDPOINT} + - CLICKHOUSE_DATABASE=${CLICKHOUSE_DATABASE} + - CLICKHOUSE_USERNAME=${CLICKHOUSE_USERNAME} + - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD} # volumes: # - ./configs/server_config.yaml:/root/.letta/config # config file # - ~/.letta/credentials:/root/.letta/credentials # credentials file diff --git a/letta/__init__.py b/letta/__init__.py index 6cb151ab..285a2eba 100644 --- a/letta/__init__.py +++ b/letta/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.6.40" +__version__ = "0.6.41" # import clients from letta.client.client import LocalClient, RESTClient, create_client diff --git a/letta/server/startup.sh b/letta/server/startup.sh index 44b790f1..60f427ac 100755 --- a/letta/server/startup.sh +++ b/letta/server/startup.sh @@ -53,6 +53,26 @@ if [ "${SECURE:-false}" = "true" ]; then CMD="$CMD --secure" fi +# Start OpenTelemetry Collector in the background +if [ -n "$CLICKHOUSE_ENDPOINT" ] && [ -n "$CLICKHOUSE_PASSWORD" ]; then + echo "Starting OpenTelemetry Collector with Clickhouse export..." + CONFIG_FILE="/etc/otel/config-clickhouse.yaml" +else + echo "Starting OpenTelemetry Collector with file export only..." + CONFIG_FILE="/etc/otel/config-file.yaml" +fi + +/usr/local/bin/otelcol-contrib --config "$CONFIG_FILE" & +OTEL_PID=$! + +# Function to cleanup processes on exit +cleanup() { + echo "Shutting down..." + kill $OTEL_PID + wait $OTEL_PID +} +trap cleanup EXIT + echo "Starting Letta server at http://$HOST:$PORT..." echo "Executing: $CMD" exec $CMD diff --git a/letta/services/agent_manager.py b/letta/services/agent_manager.py index d751544c..6bf4a5cf 100644 --- a/letta/services/agent_manager.py +++ b/letta/services/agent_manager.py @@ -59,7 +59,6 @@ from letta.services.passage_manager import PassageManager from letta.services.source_manager import SourceManager from letta.services.tool_manager import ToolManager from letta.settings import settings -from letta.tracing import trace_method from letta.utils import enforce_types, united_diff logger = get_logger(__name__) @@ -83,7 +82,6 @@ class AgentManager: # ====================================================================================================================== # Basic CRUD operations # ====================================================================================================================== - @trace_method @enforce_types def create_agent( self, @@ -446,7 +444,6 @@ class AgentManager: agent = AgentModel.read(db_session=session, name=agent_name, actor=actor) return agent.to_pydantic() - @trace_method @enforce_types def delete_agent(self, agent_id: str, actor: PydanticUser) -> None: """ diff --git a/letta/settings.py b/letta/settings.py index 2aad93ba..bb8eae16 100644 --- a/letta/settings.py +++ b/letta/settings.py @@ -173,6 +173,7 @@ class Settings(BaseSettings): # telemetry logging verbose_telemetry_logging: bool = False + otel_exporter_otlp_endpoint: str = "http://localhost:4317" # uvicorn settings uvicorn_workers: int = 1 diff --git a/letta/tracing.py b/letta/tracing.py index 6971cad1..2275759c 100644 --- a/letta/tracing.py +++ b/letta/tracing.py @@ -207,7 +207,7 @@ def log_event(name: str, attributes: Optional[Dict[str, Any]] = None, timestamp: current_span = trace.get_current_span() if current_span: if timestamp is None: - timestamp = int(time.perf_counter_ns()) + timestamp = time.time_ns() def _safe_convert(v): if isinstance(v, (str, bool, int, float)): diff --git a/otel-collector-config-clickhouse.yaml b/otel-collector-config-clickhouse.yaml new file mode 100644 index 00000000..c18a1843 --- /dev/null +++ b/otel-collector-config-clickhouse.yaml @@ -0,0 +1,73 @@ +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + filelog: + include: + - /root/.letta/logs/Letta.log + multiline: + line_start_pattern: ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} + operators: + # Extract timestamp and other fields + - type: regex_parser + regex: '^(?P\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})\s+-\s+(?P[\w\.-]+)\s+-\s+(?P\w+)\s+-\s+(?P.*)$' + # Parse the timestamp + - type: time_parser + parse_from: attributes.timestamp + layout: '%Y-%m-%d %H:%M:%S,%L' + # Set severity + - type: severity_parser + parse_from: attributes.severity + mapping: + debug: DEBUG + info: INFO + warning: WARN + error: ERROR + critical: FATAL + # Add resource attributes + - type: add + field: resource.service_name + value: letta-server + - type: add + field: resource.environment + value: ${ENV_NAME} + +processors: + batch: + timeout: 1s + send_batch_size: 1024 + +exporters: + file: + path: /root/.letta/logs/traces.json + rotation: + max_megabytes: 100 + max_days: 7 + max_backups: 5 + clickhouse: + endpoint: ${CLICKHOUSE_ENDPOINT} + database: ${CLICKHOUSE_DATABASE} + username: ${CLICKHOUSE_USERNAME} + password: ${CLICKHOUSE_PASSWORD} + timeout: 5s + sending_queue: + queue_size: 100 + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s + +service: + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [file, clickhouse] + logs: + receivers: [filelog] + processors: [batch] + exporters: [clickhouse] diff --git a/otel-collector-config-file.yaml b/otel-collector-config-file.yaml new file mode 100644 index 00000000..2552c0cc --- /dev/null +++ b/otel-collector-config-file.yaml @@ -0,0 +1,27 @@ +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + +processors: + batch: + timeout: 1s + send_batch_size: 1024 + +exporters: + file: + path: /root/.letta/logs/traces.json + rotation: + max_megabytes: 100 + max_days: 7 + max_backups: 5 + +service: + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [file] diff --git a/otel-collector-config.yaml b/otel-collector-config.yaml deleted file mode 100644 index d13164ea..00000000 --- a/otel-collector-config.yaml +++ /dev/null @@ -1,32 +0,0 @@ -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 - -processors: - batch: - timeout: 1s - send_batch_size: 1024 - -exporters: - clickhouse: - endpoint: ${CLICKHOUSE_ENDPOINT} - username: ${CLICKHOUSE_USER} - password: ${CLICKHOUSE_PASSWORD} - database: ${CLICKHOUSE_DATABASE} - timeout: 10s - retry_on_failure: - enabled: true - initial_interval: 5s - max_interval: 30s - max_elapsed_time: 300s - -service: - pipelines: - traces: - receivers: [otlp] - processors: [batch] - exporters: [clickhouse] diff --git a/poetry.lock b/poetry.lock index 520c3962..b5a61aa1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -447,17 +447,17 @@ files = [ [[package]] name = "boto3" -version = "1.37.12" +version = "1.37.13" description = "The AWS SDK for Python" optional = true python-versions = ">=3.8" files = [ - {file = "boto3-1.37.12-py3-none-any.whl", hash = "sha256:516feaa0d2afaeda1515216fd09291368a1215754bbccb0f28414c0a91a830a2"}, - {file = "boto3-1.37.12.tar.gz", hash = "sha256:9412d404f103ad6d14f033eb29cd5e0cdca2b9b08cbfa9d4dabd1d7be2de2625"}, + {file = "boto3-1.37.13-py3-none-any.whl", hash = "sha256:90fa5a91d7d7456219f0b7c4a93b38335dc5cf4613d885da4d4c1d099e04c6b7"}, + {file = "boto3-1.37.13.tar.gz", hash = "sha256:295648f887464ab74c5c301a44982df76f9ba39ebfc16be5b8f071ad1a81fe95"}, ] [package.dependencies] -botocore = ">=1.37.12,<1.38.0" +botocore = ">=1.37.13,<1.38.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.11.0,<0.12.0" @@ -466,13 +466,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.37.12" +version = "1.37.13" description = "Low-level, data-driven core of boto 3." optional = true python-versions = ">=3.8" files = [ - {file = "botocore-1.37.12-py3-none-any.whl", hash = "sha256:ba1948c883bbabe20d95ff62c3e36954c9269686f7db9361857835677ca3e676"}, - {file = "botocore-1.37.12.tar.gz", hash = "sha256:ae2d5328ce6ad02eb615270507235a6e90fd3eeed615a6c0732b5a68b12f2017"}, + {file = "botocore-1.37.13-py3-none-any.whl", hash = "sha256:aa417bac0f4d79533080e6e17c0509e149353aec83cfe7879597a7942f7f08d0"}, + {file = "botocore-1.37.13.tar.gz", hash = "sha256:60dfb831c54eb466db9b91891a6c8a0c223626caa049969d5d42858ad1e7f8c7"}, ] [package.dependencies] @@ -874,13 +874,13 @@ test = ["pytest"] [[package]] name = "composio-core" -version = "0.7.7" +version = "0.7.8" description = "Core package to act as a bridge between composio platform and other services." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_core-0.7.7-py3-none-any.whl", hash = "sha256:2ee4824ea916509fb374ca11243bc9379f2fac01fa17fdfa23255e8a06f65ef8"}, - {file = "composio_core-0.7.7.tar.gz", hash = "sha256:386f14c906c9dd121c7af65cb12197e20c16633278627be06f89c821d17eeecb"}, + {file = "composio_core-0.7.8-py3-none-any.whl", hash = "sha256:c481f02d64e1b7f5a7907bde626c36271b116cc6c7d82439ce37f7f7bbeea583"}, + {file = "composio_core-0.7.8.tar.gz", hash = "sha256:7bf5fde0889c353fd79654e90f216f60cc8c36b190b1b406bfa95d6fcfcdc73f"}, ] [package.dependencies] @@ -911,13 +911,13 @@ tools = ["diskcache", "flake8", "networkx", "pathspec", "pygments", "ruff", "tra [[package]] name = "composio-langchain" -version = "0.7.7" +version = "0.7.8" description = "Use Composio to get an array of tools with your LangChain agent." optional = false python-versions = "<4,>=3.9" files = [ - {file = "composio_langchain-0.7.7-py3-none-any.whl", hash = "sha256:514ce3ccdb3dbea5ce24df55a967fa7297384235195eb1976d47e39bfe745252"}, - {file = "composio_langchain-0.7.7.tar.gz", hash = "sha256:9d520c523222c068a2601f5396acee9bcb3e25649069eea229c65adf9c26147b"}, + {file = "composio_langchain-0.7.8-py3-none-any.whl", hash = "sha256:78c49c8387d83e573b3d4837325c9f44ff4ca0adc0a9aadbaf31d6953ed01ef3"}, + {file = "composio_langchain-0.7.8.tar.gz", hash = "sha256:b6dd2f9ff0bdd50e01200d837e1d00806590591da4abd3bf1067e17b3efbbd62"}, ] [package.dependencies] @@ -1332,13 +1332,13 @@ standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "htt [[package]] name = "filelock" -version = "3.17.0" +version = "3.18.0" description = "A platform independent file lock." optional = true python-versions = ">=3.9" files = [ - {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"}, - {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"}, + {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, + {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, ] [package.extras] @@ -2630,13 +2630,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-core" -version = "0.3.44" +version = "0.3.45" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.44-py3-none-any.whl", hash = "sha256:d989ce8bd62f1d07765acd575e6ec1254aec0cf7775aaea39fe4af8102377459"}, - {file = "langchain_core-0.3.44.tar.gz", hash = "sha256:7c0a01e78360f007cbca448178fe7e032404068e6431dbe8ce905f84febbdfa5"}, + {file = "langchain_core-0.3.45-py3-none-any.whl", hash = "sha256:fe560d644c102c3f5dcfb44eb5295e26d22deab259fdd084f6b1b55a0350b77c"}, + {file = "langchain_core-0.3.45.tar.gz", hash = "sha256:a39b8446495d1ea97311aa726478c0a13ef1d77cb7644350bad6d9d3c0141a0c"}, ] [package.dependencies] @@ -2699,13 +2699,13 @@ types-requests = ">=2.31.0.2,<3.0.0.0" [[package]] name = "langsmith" -version = "0.3.13" +version = "0.3.14" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langsmith-0.3.13-py3-none-any.whl", hash = "sha256:73aaf52bbc293b9415fff4f6dad68df40658081eb26c9cb2c7bd1ff57cedd695"}, - {file = "langsmith-0.3.13.tar.gz", hash = "sha256:14014058cff408772acb93344e03cb64174837292d5f1ae09b2c8c1d8df45e92"}, + {file = "langsmith-0.3.14-py3-none-any.whl", hash = "sha256:1c3565aa5199c7ef40a21898ea9a9132fb3c0dae1d4dafc76ef27a83c5807a2f"}, + {file = "langsmith-0.3.14.tar.gz", hash = "sha256:54d9f74015bc533201b945ed03de8f45d9cb9cca6e63c58d7d3d277515d4c338"}, ] [package.dependencies] @@ -2726,13 +2726,13 @@ pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4,<14.0.0)"] [[package]] name = "letta-client" -version = "0.1.68" +version = "0.1.71" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "letta_client-0.1.68-py3-none-any.whl", hash = "sha256:2b027f79281560abc88a7033b8ff4b3ecdd3be7ba2fa4f17f844ec0ba8d7dfe1"}, - {file = "letta_client-0.1.68.tar.gz", hash = "sha256:c956498c6e0d726ec3f205a1dbaa0552d7945147a30d45ca7ea8ee7b77ac81aa"}, + {file = "letta_client-0.1.71-py3-none-any.whl", hash = "sha256:b18831ae94c2e5685a95e0cec2f7530cebe1d26377a6e3aee6c193518cd855f6"}, + {file = "letta_client-0.1.71.tar.gz", hash = "sha256:4c5a865cfef82091f005dbe1f3280bcd44bcc37bebd472f8145c881e9dd4d074"}, ] [package.dependencies] @@ -2778,19 +2778,19 @@ python-dotenv = ">=1.0.1,<2.0.0" [[package]] name = "llama-index" -version = "0.12.23" +version = "0.12.24" description = "Interface between LLMs and your data" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index-0.12.23-py3-none-any.whl", hash = "sha256:a099e06005f0e776a75b1cbac68af966bd2866c31f868d5c4f4e5be6ba641c60"}, - {file = "llama_index-0.12.23.tar.gz", hash = "sha256:af1e3b0ecb63c2e6ff95874189ca68e3fcdba19bb312abb7df19c6855cc709c0"}, + {file = "llama_index-0.12.24-py3-none-any.whl", hash = "sha256:9b35c90110177630d7bfd1f92c5ccd637ec3bbeebb268b8d29e29639ae3fb0bb"}, + {file = "llama_index-0.12.24.tar.gz", hash = "sha256:66f2c064620a5ef7f0fb858d79b3ea45bdd04efefd3b4ebb5e557295681fff24"}, ] [package.dependencies] llama-index-agent-openai = ">=0.4.0,<0.5.0" llama-index-cli = ">=0.4.1,<0.5.0" -llama-index-core = ">=0.12.23,<0.13.0" +llama-index-core = ">=0.12.24,<0.13.0" llama-index-embeddings-openai = ">=0.3.0,<0.4.0" llama-index-indices-managed-llama-cloud = ">=0.4.0" llama-index-llms-openai = ">=0.3.0,<0.4.0" @@ -2835,13 +2835,13 @@ llama-index-llms-openai = ">=0.3.0,<0.4.0" [[package]] name = "llama-index-core" -version = "0.12.23.post2" +version = "0.12.24.post1" description = "Interface between LLMs and your data" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_core-0.12.23.post2-py3-none-any.whl", hash = "sha256:3665583d69ca9859b019aacf9496af29ec2fa3b24d031344ddeeefb0dbd00e26"}, - {file = "llama_index_core-0.12.23.post2.tar.gz", hash = "sha256:b8e8abc2c11c2fa26bbfeebc79b00d8d12aaba370e43e3450045b50048744b90"}, + {file = "llama_index_core-0.12.24.post1-py3-none-any.whl", hash = "sha256:cc2cb1f0508b6a7ae85dae72082a4e597e29fca349c67b7e319c2698f24cac61"}, + {file = "llama_index_core-0.12.24.post1.tar.gz", hash = "sha256:2d0ab7e819dc064a8a9256cf2719d25fe12018fc5357e681a2e97f7b5988562c"}, ] [package.dependencies] @@ -2885,13 +2885,13 @@ openai = ">=1.1.0" [[package]] name = "llama-index-indices-managed-llama-cloud" -version = "0.6.8" +version = "0.6.9" description = "llama-index indices llama-cloud integration" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "llama_index_indices_managed_llama_cloud-0.6.8-py3-none-any.whl", hash = "sha256:b741fa3c286fb91600d8e54a4c62084b5e230ea624c2a778a202ed4abf6a8e9b"}, - {file = "llama_index_indices_managed_llama_cloud-0.6.8.tar.gz", hash = "sha256:6581a1a4e966c80d108706880dc39a12e38634eddff9e859f2cc0d4bb11c6483"}, + {file = "llama_index_indices_managed_llama_cloud-0.6.9-py3-none-any.whl", hash = "sha256:8f4002d6d508b8afe7edd003d41e7236868b2774ec0ca266e84d002616e5b96c"}, + {file = "llama_index_indices_managed_llama_cloud-0.6.9.tar.gz", hash = "sha256:c6450ef8aa99643cf8e78e1371b861a4f209a3bb80b3ec67fd937741f9da8e74"}, ] [package.dependencies] @@ -3209,13 +3209,13 @@ traitlets = "*" [[package]] name = "mcp" -version = "1.4.0" +version = "1.4.1" description = "Model Context Protocol SDK" optional = false python-versions = ">=3.10" files = [ - {file = "mcp-1.4.0-py3-none-any.whl", hash = "sha256:d2760e1ea7635b1e70da516698620a016cde214976416dd894f228600b08984c"}, - {file = "mcp-1.4.0.tar.gz", hash = "sha256:5b750b14ca178eeb7b2addbd94adb21785d7b4de5d5f3577ae193d787869e2dd"}, + {file = "mcp-1.4.1-py3-none-any.whl", hash = "sha256:a7716b1ec1c054e76f49806f7d96113b99fc1166fc9244c2c6f19867cb75b593"}, + {file = "mcp-1.4.1.tar.gz", hash = "sha256:b9655d2de6313f9d55a7d1df62b3c3fe27a530100cc85bf23729145b0dba4c7a"}, ] [package.dependencies] @@ -4385,7 +4385,6 @@ files = [ {file = "psycopg2-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:0435034157049f6846e95103bd8f5a668788dd913a7c30162ca9503fdf542cb4"}, {file = "psycopg2-2.9.10-cp312-cp312-win32.whl", hash = "sha256:65a63d7ab0e067e2cdb3cf266de39663203d38d6a8ed97f5ca0cb315c73fe067"}, {file = "psycopg2-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:4a579d6243da40a7b3182e0430493dbd55950c493d8c68f4eec0b302f6bbf20e"}, - {file = "psycopg2-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:91fd603a2155da8d0cfcdbf8ab24a2d54bca72795b90d2a3ed2b6da8d979dee2"}, {file = "psycopg2-2.9.10-cp39-cp39-win32.whl", hash = "sha256:9d5b3b94b79a844a986d029eee38998232451119ad653aea42bb9220a8c5066b"}, {file = "psycopg2-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:88138c8dedcbfa96408023ea2b0c369eda40fe5d75002c0964c78f46f11fa442"}, {file = "psycopg2-2.9.10.tar.gz", hash = "sha256:12ec0b40b0273f95296233e8750441339298e6a572f7039da5b260e3c8b60e11"}, @@ -4445,7 +4444,6 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, - {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, diff --git a/pyproject.toml b/pyproject.toml index 8d3be978..53037ecf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "letta" -version = "0.6.40" +version = "0.6.41" packages = [ {include = "letta"}, ] diff --git a/tests/test_client.py b/tests/test_client.py index 856c4227..5dcb7da6 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1,14 +1,12 @@ import asyncio -import json import os import threading import time import uuid -from typing import List, Union import pytest from dotenv import load_dotenv -from letta_client import AgentState, JobStatus, Letta, MessageCreate, MessageRole +from letta_client import AgentState, Letta, MessageCreate from letta_client.core.api_error import ApiError from sqlalchemy import delete diff --git a/tests/test_streaming.py b/tests/test_streaming.py index 635677f0..55300ab5 100644 --- a/tests/test_streaming.py +++ b/tests/test_streaming.py @@ -5,8 +5,6 @@ import time import pytest from dotenv import load_dotenv from letta_client import AgentState, Letta, LlmConfig, MessageCreate -from letta_client.core.api_error import ApiError -from pytest import fixture def run_server():