Commit Graph

6889 Commits

Author SHA1 Message Date
cthomas
ab4ccfca31 feat: add tags support to blocks (#8474)
* feat: add tags support to blocks

* fix: add timestamps and org scoping to blocks_tags

Addresses PR feedback:

1. Migration: Added timestamps (created_at, updated_at), soft delete
   (is_deleted), audit fields (_created_by_id, _last_updated_by_id),
   and organization_id to blocks_tags table for filtering support.
   Follows SQLite baseline pattern (composite PK of block_id+tag, no
   separate id column) to avoid insert failures.

2. ORM: Relationship already correct with lazy="raise" to prevent
   implicit joins and passive_deletes=True for efficient CASCADE deletes.

3. Schema: Changed normalize_tags() from Any to dict for type safety.

4. SQLite: Added blocks_tags to SQLite baseline schema to prevent
   table-not-found errors.

5. Code: Updated all tag row inserts to include organization_id.

🐾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta <noreply@letta.com>

* fix: add ORM columns and update SQLite baseline for blocks_tags

Fixes test failures (CompileError: Unconsumed column names: organization_id):

1. ORM: Added organization_id, timestamps, audit fields to BlocksTags
   ORM model to match database schema from migrations.

2. SQLite baseline: Added full column set to blocks_tags (organization_id,
   timestamps, audit fields) to match PostgreSQL schema.

3. Test: Added 'tags' to expected Block schema fields.

This ensures SQLite and PostgreSQL have matching schemas and the ORM
can consume all columns that the code inserts.

🐾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta <noreply@letta.com>

* revert change to existing alembic migration

* fix: remove passive_deletes and SQLite support for blocks_tags

1. Removed passive_deletes=True from Block.tags relationship to match
   AgentsTags pattern (neither have ondelete CASCADE in DB schema).

2. Removed SQLite branch from _replace_block_pivot_rows_async since
   blocks_tags table is PostgreSQL-only (migration skips SQLite).

🐾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta <noreply@letta.com>

* api sync

---------

Co-authored-by: Letta <noreply@letta.com>
2026-01-19 15:54:38 -08:00
jnjpng
c550457b60 feat: static redirect callback for mcp server oauth (#8611)
* base

* base

* more

* final

* remove

* pass
2026-01-19 15:54:38 -08:00
jnjpng
089ea415ab fix: update test_tool_schema_parsing.py to use requests.post directly (#8625)
The `make_post_request` function was removed in commit b1bbf9aabf as
part of cleaning up unused sync code, but the test file still imported
it. This change replaces the removed function with direct `requests.post`
calls.

🐾 Generated with [Letta Code](https://letta.com)

Co-authored-by: Letta <noreply@letta.com>
2026-01-19 15:54:37 -08:00
Kian Jones
6e803174f5 chore; bump ddtrace version (#8465)
* Revert "chore: temp revert to public ddtrace (#8462)"

This reverts commit 09e541b7732fdc03be4cd9c00cc2c8518300acf1.

* Update ddtrace version requirement in pyproject.toml

Removed specific ddtrace versions for profiling and updated to a minimum version requirement.
2026-01-19 15:54:37 -08:00
cthomas
870c5955d9 fix: wrap tpuf operations in thread pool (#8615)
* fix: wrap turbopuffer vector writes in thread pool

Turbopuffer library does CPU-intensive base64 encoding of vectors
synchronously in async functions (_async_transform_recursive →
b64encode_vector), blocking the event loop during file uploads.

Solution: Created _run_turbopuffer_write_in_thread() helper that runs
turbopuffer writes in an isolated event loop within a worker thread.

Applied to all vector write operations:
- insert_tools()
- insert_archival_memories()
- insert_messages()
- insert_file_passages()

This prevents pybase64.b64encode_as_string() from blocking the main
event loop during vector encoding.

🐾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta <noreply@letta.com>

* fix: wrap all turbopuffer operations in thread pool

Extended the thread pool wrapping to ALL turbopuffer write operations,
including delete operations, for complete isolation from the main event loop.

All turbopuffer namespace.write() calls now run in isolated event loops
within worker threads, preventing any potential CPU work from blocking.

🐾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta <noreply@letta.com>

---------

Co-authored-by: Letta <noreply@letta.com>
2026-01-19 15:54:37 -08:00
cthomas
c05f3cec0b fix: wrap markitdown PDF processing in asyncio.to_thread (#8614)
MarkItDown.convert() does blocking file I/O and CPU-intensive PDF parsing.
This was blocking the event loop during file uploads.

Now wraps the entire markitdown pipeline (tempfile write, convert, cleanup)
in asyncio.to_thread() to run in thread pool.

🐾 Generated with [Letta Code](https://letta.com)

Co-authored-by: Letta <noreply@letta.com>
2026-01-19 15:54:37 -08:00
cthomas
9b5067bed9 fix: remove unused sync code (#8613)
* chore: remove unused sync code

* chore: remove deprecated sync Google AI functions

Removes unused sync functions that used httpx.Client (blocking):
- google_ai_get_model_details()
- google_ai_get_model_context_window()
- GoogleGeminiProvider.get_model_context_window()

All code now uses async versions with httpx.AsyncClient.

🐾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta <noreply@letta.com>

---------

Co-authored-by: Letta <noreply@letta.com>
2026-01-19 15:54:37 -08:00
cthomas
57cb2d7566 fix: async functions must call async methods (#8612)
Critical fixes:
- llm_client_base.send_llm_request() now calls await self.request_async() instead of self.request()
- Remove unused sync get_openai_embedding() that used sync OpenAI client
- Remove deprecated compile_in_thread_async() from Memory

These were blocking the event loop during LLM requests and embeddings.

🐾 Generated with [Letta Code](https://letta.com)

Co-authored-by: Letta <noreply@letta.com>
2026-01-19 15:54:37 -08:00
Ari Webb
851798d71a fix: step_id is none (#8528) 2026-01-19 15:54:37 -08:00
jnjpng
aca5c99a2b feat: use fast mcp 2.0 oauth provider (#8608)
* base

* scopes
2026-01-19 15:54:37 -08:00
jnjpng
35ecf2279f chore: remove dead sync model validator code (#8606)
Remove commented-out sync_value_and_value_enc model validator and
unused imports (traceback, model_validator, logger). This code was
disabled and replaced with async decryption via from_orm_async methods.
2026-01-19 15:54:37 -08:00
Charles Packer
ff05f0e200 docs: pricing docs fix (#5791)
* fix: patch pricing

* fix: point out byok

* fix: updated

* fix: another boost
2026-01-19 15:54:23 -08:00
Shubham Naik
852e960d88 chore: regenerate api (#5624)
Co-authored-by: Shubham Naik <shub@memgpt.ai>
2026-01-19 15:53:10 -08:00
Cameron Pfiffer
399d04a3e1 feat: add shared memory block tutorial, update memory block guide (#5503)
feat: update documentation and add new tutorials for memory blocks and agent collaboration

- Updated navigation paths in docs.yml to reflect new tutorial locations.
- Added comprehensive guides on shared memory blocks and attaching/detaching memory blocks.
- Enhanced existing documentation for memory blocks with examples and best practices.
- Corrected API key references in prebuilt tools documentation.

These changes aim to improve user understanding and facilitate multi-agent collaboration through shared memory systems.
2026-01-19 15:52:23 -08:00
Sarah Wooders
b8a6496acb feat: add runs_metrics table (#5169) 2026-01-19 15:51:30 -08:00
Matthew Zhou
b824daec2f fix: Remove requirement for tool returns [LET-4715] (#5254)
* Keep legacy functionality

* Refactor for cleanliness
2026-01-19 15:47:07 -08:00
Kian Jones
2b29478c08 Kian/remove uv caching (#4903)
* remove enable cache

* trigger CI

* remove extra with paramters which I believe to be unecessary

* try installing uv manuallly to avoid post install step

* should be fixed by manually installing and not using the action

* remove comment to trigger
2026-01-19 15:43:57 -08:00
Charles Packer
265ec3b478 fix: update gh templates (#3155) 2026-01-18 13:50:17 -08:00
cthomas
67013ef1bb chore: bump version 0.16.2 (#3140) 2026-01-12 11:04:11 -08:00
Caren Thomas
a626dec278 uv lock 2026-01-12 11:00:12 -08:00
Ari Webb
6d859174c2 feat: make conversations throw http busy to stop race condition [LET-6842] (#8411)
* feat: make conversations throw http busy to stop race condition

* use redis lock instead

* move acquire lock into redis client, integration tests, move lock release into run manager

* fix tests, bug

* conditional import

* remove else

* better release

* run ci

* final reordering lock

* update tests

* wrong naming of lock holder token
2026-01-12 10:57:49 -08:00
jnjpng
59c2b19812 fix: remove sync model validator for env var (#8518)
* base

* import
2026-01-12 10:57:49 -08:00
cthomas
03a64993cf fix: make file reads async (#8513) 2026-01-12 10:57:49 -08:00
Ari Webb
cdca1a564f fix: conversation id not found in tpuf (#8469)
* fix: conversation id not found in tpuf

* add tests
2026-01-12 10:57:49 -08:00
cthomas
e964307f6a feat: add lazy=raise for passage-org relationship (#8482) 2026-01-12 10:57:49 -08:00
Sarah Wooders
0cbdf452fa fix: temporarily disable structured outputs for anthropic (#8491) 2026-01-12 10:57:49 -08:00
jnjpng
87e939deda feat: add fastmcp v2 client (#8457)
* base

* testing code

* update

* nit
2026-01-12 10:57:49 -08:00
Shubham Naik
c02f966ff1 chore: nah (#8479) 2026-01-12 10:57:49 -08:00
Christina Tong
318498bde3 feat: filter internal runs endpoint by conversation id [LET-6886] (#8437) 2026-01-12 10:57:49 -08:00
Kian Jones
d99195f19d fix: get prerelease in e2b pipeline (#8476)
* revert to public ddtrace

* latest pre-release version
2026-01-12 10:57:49 -08:00
Kian Jones
5cba41ca4e chore: temp revert to public ddtrace (#8462)
revert to public ddtrace
2026-01-12 10:57:49 -08:00
cthomas
938bb78afe fix: handle anthropic incorrect tool id bug (#8447) 2026-01-12 10:57:49 -08:00
jnjpng
dceed06f84 fix: set value on agent environment variable as pydantic obj (#8452)
base
2026-01-12 10:57:49 -08:00
jnjpng
28839f5180 fix: import cryptography default backend at top level (#8444)
* base

* comment
2026-01-12 10:57:49 -08:00
Shubham Naik
f3799fe4ee Shub/let 6883 users can create a feed [LET-6883] (#8432)
* chore: pdu

* chore: pdu

* chore: delete/disable

* chore: delete/disable

* chore: pdu

* chore: pdu

* chore: pdu

* chore: pdu

* chore: pdu

* chore: pdu

* chore: merge

* chore: merge

* cha

* chore: hotfix for convo id
2026-01-12 10:57:49 -08:00
Sarah Wooders
96cf24264c fix: avoid 'NoneType' object has no attribute 'name' error (#8407) 2026-01-12 10:57:49 -08:00
cthomas
b8e7c14f16 feat: enable optimized json response parsing (#8436) 2026-01-12 10:57:49 -08:00
cthomas
8adb88e7ea feat: set task name in safe_create_task (#8433) 2026-01-12 10:57:49 -08:00
github-actions[bot]
f2171447a8 fix: handle httpx.ReadError, WriteError, and ConnectError in LLM streaming clients (#8243)
Adds explicit handling for httpx network errors (ReadError, WriteError,
ConnectError) in AnthropicClient, OpenAIClient, and GoogleVertexClient.
These errors can occur during streaming when the connection is unexpectedly
closed while reading/writing data.

Maps these errors to LLMConnectionError for consistent error handling.

Fixes #8221 (and duplicate #8156)

🤖 Generated with [Letta Code](https://letta.com)

Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: Letta <noreply@letta.com>
Co-authored-by: Kian Jones <11655409+kianjones9@users.noreply.github.com>
2026-01-12 10:57:49 -08:00
Kian Jones
e60e8ed670 chore: bump wait_for_server from 30 to 60 seconds (#8435)
bump 30 to 60 seconds
2026-01-12 10:57:49 -08:00
github-actions[bot]
b559bf8403 fix: handle missing tool_call_id in Anthropic message conversion (#8381)
* fix: handle missing tool_call_id in Anthropic message conversion

- Add null check for self.tool_returns before iterating
- Fall back to message's tool_call_id when tool_return.tool_call_id is None
- Improve error message to show actual tool name from message.name
- Only raise error if no valid tool_call_id is available from either source

This fixes the error "Anthropic API requires tool_use_id to be set" that
occurs when a ToolReturn object in the database doesn't have tool_call_id
set, by using the message-level tool_call_id as a fallback.

Fixes #8379

🤖 Generated with [Letta Code](https://letta.com)

Co-authored-by: datadog-official[bot] <datadog-official[bot]@users.noreply.github.com>
Co-Authored-By: Letta <noreply@letta.com>

* fix: restrict tool_call_id fallback to single tool returns

The message-level `self.tool_call_id` is set to the first tool return's ID
for legacy compatibility. For parallel tool calls with multiple tool_returns,
using this as a fallback would incorrectly assign the first tool return's ID
to all subsequent returns missing their own ID.

This change:
- Only allows the fallback when there's exactly one tool return
- For multiple tool returns, each must have its own ID or raise an error
- Adds tool return index to error messages for better debugging

Co-authored-by: Kian Jones <kianjones9@users.noreply.github.com>

🤖 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta <noreply@letta.com>

---------

Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: datadog-official[bot] <datadog-official[bot]@users.noreply.github.com>
Co-authored-by: Letta <noreply@letta.com>
Co-authored-by: Kian Jones <11655409+kianjones9@users.noreply.github.com>
2026-01-12 10:57:49 -08:00
Christina Tong
d2e19bbc05 chore: conversation id filter to list_messages [LET-6875] (#8406)
* chore: add default conversation id filter to list_messages

* fix filter

* update comment
2026-01-12 10:57:48 -08:00
github-actions[bot]
05ec02e384 fix: handle Anthropic 413 request_too_large as ContextWindowExceededError (#8424)
The Anthropic API returns a 413 status code with error type `request_too_large`
when the request payload exceeds the maximum allowed size. This error should
be converted to `ContextWindowExceededError` so the system can handle it
appropriately (e.g., by summarizing the conversation to reduce context size).

Changes:
- Added `request_too_large` and `request exceeds the maximum size` to the
  early string-based error detection in `handle_llm_error`
- Added specific handling for HTTP 413 status code in the `APIStatusError`
  handler
- Added tests to verify the new error handling behavior

Fixes: #8422

🤖 Generated with [Letta Code](https://letta.com)

Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: Letta <noreply@letta.com>
Co-authored-by: datadog-official[bot] <datadog-official[bot]@users.noreply.github.com>
Co-authored-by: Kian Jones <11655409+kianjones9@users.noreply.github.com>
2026-01-12 10:57:48 -08:00
github-actions[bot]
adbc47ddc9 fix: downgrade McpError logging from warning to debug level (#8371)
MCP errors from external servers (e.g., "The specified key does not exist")
are user-facing issues, not system errors. Downgrading the log level from
warning to debug prevents these expected failures from triggering production
alerts in Datadog/Sentry.

Fixes #8370

🤖 Generated with [Letta Code](https://letta.com)

Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: datadog-official[bot] <datadog-official[bot]@users.noreply.github.com>
Co-authored-by: Kian Jones <11655409+kianjones9@users.noreply.github.com>
2026-01-12 10:57:48 -08:00
Kian Jones
4d31cecd00 feat: add custom version of ddtrace which supports anthropic (#8419)
* add built custom version of ddtrace

* trigger CI

* add linux-aarch54
2026-01-12 10:57:48 -08:00
Ari Webb
754e750cc5 feat: add conversation_id filter to list runs [LET-6865] (#8404)
feat: add conversation_id filter to list runs
2026-01-12 10:57:48 -08:00
Sarah Wooders
6fddcc0c57 fix: fix agent loop (#8401) 2026-01-12 10:57:48 -08:00
Kian Jones
55fecab485 Revert "fix: update temporalio min version to 1.11.0 for versioning_behavior support" (#8399)
Revert "fix: update temporalio min version to 1.11.0 for versioning_behavior …"

This reverts commit 53e477f158bc16f1f51c9a6c2af5e6c83133effb.
2026-01-12 10:57:48 -08:00
github-actions[bot]
8648eaf8fe fix: update temporalio min version to 1.11.0 for versioning_behavior support (#8397)
The code uses versioning_behavior parameter in start_workflow() and
execute_workflow() calls, which was only added in temporalio SDK 1.11.0.
The previous min version (1.8.0) caused TypeError in production.

Fixes #8396

🤖 Generated with [Letta Code](https://letta.com)

Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: datadog-official[bot] <datadog-official[bot]@users.noreply.github.com>
Co-authored-by: Letta <noreply@letta.com>
2026-01-12 10:57:48 -08:00
Charles Packer
ed6284cedb feat: Add conversation_id filtering to message endpoints (#8324)
* feat: Add conversation_id filtering to message list and search endpoints

Add optional conversation_id parameter to filter messages by conversation:
- client.agents.messages.list
- client.messages.list
- client.messages.search

Changes:
- Added conversation_id field to MessageSearchRequest and SearchAllMessagesRequest schemas
- Added conversation_id filtering to list_messages in message_manager.py
- Updated get_agent_recall_async and get_all_messages_recall_async in server.py
- Added conversation_id query parameter to router endpoints
- Updated Turbopuffer client to support conversation_id filtering in searches

Fixes #8320

🤖 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Charles Packer <cpacker@users.noreply.github.com>

* add conversation_id to message and tpuf

* default messages filter for backward compatibility

* add test and auto gen

* fix integration test

* fix test

* update test

---------

Co-authored-by: letta-code <248085862+letta-code@users.noreply.github.com>
Co-authored-by: Charles Packer <cpacker@users.noreply.github.com>
Co-authored-by: christinatong01 <christina@letta.com>
2026-01-12 10:57:48 -08:00