0.9.0

letta-ai/letta0.9.0Jul 24, 2025by sarahwooders

Full Release Notes

# v0.9.0

## Letta Filesystem 
We are introducing a big revamp in how Letta handles uploaded documents like PDFs! Letta Filesystem allows you to create folders and files (uploaded documents) that contextualize your agent's responses -- think Claude Projects, but transparent and controllable. 
```python
# upload a file into the folder
job = client.folders.files.upload(
    folder_id=folder.id,
    file=open("my_file.txt", "rb")
)

# wait until the job is completed
while True:
    job = client.jobs.retrieve(job.id)
    if job.status == "completed":
        break
    elif job.status == "failed":
        raise ValueError(f"Job failed: {job.metadata}")
    print(f"Job status: {job.status}")
    time.sleep(1)

```

When documents are uploaded to Letta, they are represented in the context window as files in a folder, and can be "open" (in-context) or "closed" (hidden). The agent manages this automatically will tools, but you can also manually open/close files (add/remove to the context window).

### Options for converting documents to markdown
There are two options for parsing files: the default [`markitdown`](https://github.com/microsoft/markitdown) packages, or [Mistral's OCR endpoint](https://mistral.ai/news/mistral-ocr). To use Mistral, you must set `LETTA_MISTRAL_API_KEY`. If you're using Letta Cloud, Mistral OCR will be enabled by default. 

### Memory blocks vs. filesystem vs. archival memory
Curious on when to use memory blocks vs. filesystem vs. archival memory? See our [guidelines](https://docs.letta.com/guides/agents/context-hierarchy) on how to manage a context hierarchy.