How Conversation History Works in Open Interpreter: Save and Restore Chat Sessions
Open Interpreter automatically persists every chat turn to a JSON file in your local config directory and provides CLI flags and Python APIs to restore previous sessions.
Open Interpreter maintains a complete conversation history for every interactive session, enabling you to resume long-running coding tasks without losing context. According to the Open Interpreter source code, the system uses a combination of automatic JSON serialization, platform-specific storage paths, and a conversation navigator to manage chat persistence.
Where Conversation History Is Stored
The storage location is determined by get_storage_path() in interpreter/terminal_interface/utils/local_storage_path.py. This helper uses platformdirs to resolve the OS-specific config directory (typically ~/.config/open-interpreter on Linux, ~/Library/Application Support/open-interpreter on macOS, or %LOCALAPPDATA%\open-interpreter on Windows) and appends a conversations subdirectory.
# interpreter/terminal_interface/utils/local_storage_path.py
def get_storage_path(subdirectory=None):
if subdirectory is None:
return config_dir
else:
return os.path.join(config_dir, subdirectory)
When the Interpreter class initializes in interpreter/core/core.py, it sets conversation_history_path=get_storage_path("conversations") by default.
Automatic Saving of Chat Sessions
By default, conversation_history=True in the Interpreter constructor. After every turn in _streaming_chat() (lines 61‑90 of interpreter/core/core.py), the system serializes the entire self.messages list to JSON.
The filename generation logic creates human-readable names:
- Extracts the first 25 words of the first user message
- Sanitizes the string to remove filesystem-unsafe characters
- Appends a timestamp (
datetime.now().strftime("%B_%d_%Y_%H-%M-%S"))
# interpreter/core/core.py – excerpt from _streaming_chat
if self.conversation_history:
if not self.conversation_filename:
first_few_words = ... # sanitized first message
date = datetime.now().strftime("%B_%d_%Y_%H-%M-%S")
self.conversation_filename = f"{first_few_words}__{date}.json"
if not os.path.exists(self.conversation_history_path):
os.makedirs(self.conversation_history_path)
with open(os.path.join(self.conversation_history_path,
self.conversation_filename), "w") as f:
json.dump(self.messages, f)
Restoring Previous Chat Sessions
Open Interpreter provides two methods to restore conversation history: the --conversations CLI flag and programmatic loading.
Using the CLI Conversation Navigator
Running interpreter --conversations triggers the conversation navigator flow in interpreter/terminal_interface/start_terminal_interface.py. This invokes conversation_navigator() from interpreter/terminal_interface/conversation_navigator.py, which:
- Calls
get_conversations()frominterpreter/terminal_interface/utils/get_conversations.pyto list all JSON files in the storage directory - Displays a numbered list in the terminal
- Loads the selected file using
json.load()and assigns the list tointerpreter.messages - Sets
interpreter.conversation_filenameto the selected file so subsequent turns append to the same history
# Launch the conversation navigator
interpreter --conversations
# Terminal output:
# 1) hello_world__April_01_2024_12-30-45.json
# 2) data_analysis__April_02_2024_09-15-12.json
# Select a conversation to resume: 2
Programmatic Restoration
You can manually load a saved JSON file into a new Interpreter instance via the messages parameter:
import json
from interpreter import Interpreter
# Load a previously exported JSON file
with open("/home/user/data_analysis__April_02_2024_09-15-12.json") as f:
previous_messages = json.load(f)
# Restore the conversation history
interpreter = Interpreter(messages=previous_messages)
# Continue the session
interpreter.chat("Continue where we left off.")
Exporting Conversations to Markdown or Jupyter
In addition to automatic JSON persistence, Open Interpreter provides magic commands for human-readable exports. These are implemented in interpreter/terminal_interface/magic_commands.py.
%markdown [path]: Exports the current conversation to Markdown. If no path is provided, it saves to the Downloads folder using the current conversation filename (with.mdextension).%jupyter: Exports the conversation as a Jupyter notebook (.ipynb).
# Inside an Open Interpreter session
%markdown # Saves to ~/Downloads/<conversation_name>.md
%markdown /tmp/report.md # Explicit custom path
%jupyter # Creates .ipynb in Downloads
The implementation (lines 301‑311 of magic_commands.py) uses get_downloads_path() to determine the default export location:
# interpreter/terminal_interface/magic_commands.py
export_path = get_downloads_path() + f"/{self.conversation_filename[:-4]}.md"
Programmatic Control of Conversation History
You can disable automatic persistence or configure custom storage locations when instantiating the Interpreter class.
Disable History
from interpreter import Interpreter
# No JSON files will be written
interpreter = Interpreter(conversation_history=False)
Custom Storage Path
import os
from interpreter import Interpreter
custom_path = os.path.expanduser("~/custom_chat_backups")
interpreter = Interpreter(conversation_history_path=custom_path)
Manual Save to Custom Location
Even with automatic history enabled, you can manually export the current state:
import json
import os
from interpreter import Interpreter
interpreter = Interpreter()
interpreter.chat("Analyze the CSV file.")
# Manual export
backup_path = os.path.expanduser("~/backups/manual_backup.json")
os.makedirs(os.path.dirname(backup_path), exist_ok=True)
with open(backup_path, "w") as f:
json.dump(interpreter.messages, f, indent=2)
Summary
- Automatic Persistence: Open Interpreter saves every turn to a JSON file in
~/.config/open-interpreter/conversations(or OS-specific equivalent) whenconversation_history=True(default). - Filename Generation: Files are named using the first 25 words of the first user message plus a timestamp, implemented in
interpreter/core/core.py. - Restoration: Use the
--conversationsCLI flag to launch an interactive navigator, or programmatically load JSON into themessagesparameter of a newInterpreterinstance. - Export Options: Magic commands
%markdownand%jupyterininterpreter/terminal_interface/magic_commands.pyexport to human-readable formats. - Key Files:
local_storage_path.py(storage resolution),core.py(saving logic),conversation_navigator.py(loading UI),magic_commands.py(exports).
Frequently Asked Questions
Where does Open Interpreter store conversation history files?
Open Interpreter stores conversation history as JSON files in the conversations subdirectory of your platform-specific config directory, typically ~/.config/open-interpreter/conversations on Linux, ~/Library/Application Support/open-interpreter/conversations on macOS, or %LOCALAPPDATA%\open-interpreter\conversations on Windows. This path is determined by the get_storage_path() function in interpreter/terminal_interface/utils/local_storage_path.py.
How do I resume a previous chat session?
You can resume a previous session by running interpreter --conversations in your terminal, which launches an interactive navigator listing all saved JSON files. Select the desired conversation by number to restore the full message history. Alternatively, you can programmatically load a saved JSON file using Interpreter(messages=previous_messages) where previous_messages is a list loaded via json.load().
Can I disable automatic conversation history?
Yes. When instantiating the Interpreter class, set conversation_history=False to prevent the system from writing JSON files after each turn. For example: interpreter = Interpreter(conversation_history=False). This disables the automatic persistence logic found in interpreter/core/core.py while still allowing manual exports via magic commands.
How do I export a conversation to Markdown or Jupyter notebook?
Within an active Open Interpreter session, use the magic command %markdown to export the current conversation to a Markdown file in your Downloads folder, or specify a custom path with %markdown /path/to/file.md. To export as a Jupyter notebook, use %jupyter. These commands are implemented in interpreter/terminal_interface/magic_commands.py and convert the internal message list to human-readable formats.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →