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.