aidialog
aidialog provides the Dialog/Message model used by solveit and the fastai AI tooling ecosystem. An AI dialog is a Jupyter notebook whose cells are messages: notes, runnable code, and prompts with replies. Five modules build on each other:
aidialog.msg_parts: the canonicalMsg/Partchat message model and its wire text formaidialog.dialog: the coreDialog/Messagemodel, including plain-text rendering of Jupyter outputsaidialog.ipynb: reading and writing dialogs as.ipynbfilesaidialog.hist: conversions between dialogs, chat histories, and formatted repliesaidialog.dlgskill: search and editing tools for dialogs and notebooks, registered as a pyskill
Provider session files (Claude Code transcripts, Codex rollouts) and conversation compaction live in llmsurgery.
The theory
A dialog is a conversation between a human, an AI, and an interpreter. Each message type addresses one of them and expects a certain kind of answer:
- A prompt asks the AI a question and holds its reply.
- A code message gives the interpreter source and holds its outputs.
- A note is read by everyone and answered by nobody.
- A raw message addresses no one. It is inert matter the conversation carries along.
A reply may itself contain runnable code with results, so a whole dialog can live inside one message. reply2dlg opens a reply up as a dialog and dlg2reply puts it back.
Dialogs and Jupyter notebooks both serialize to the ipynb format, but they are not the same thing. A notebook has cells. A dialog has messages. Messages can be prompts, which notebooks cannot express, and they make structure explicit that notebooks leave implicit. E.g a heading opens a section that runs to the next heading of the same level; an export directive marks the code that belongs to a module. The shared file format means the same tools read both. The word tells you which layer you are on. File-level tools such as fastcore.nbio and exhash speak of cells and notebooks. Everything in this library speaks of messages and dialogs.
The Dialog is the center of the library. Everything else is a projection of it. A storage projection must preserve everything that means something. What it does not understand it carries verbatim in metadata, and what is broken it heals rather than rejects. A transmission projection normalizes on purpose, and what it drops is written into its contract. A display projection only goes one way. The rule is to convert in, edit at the center, and project out. The function names say the same thing. Every converter has dlg on exactly one side.
| projection | contract | in | out |
|---|---|---|---|
| ipynb file | storage, pragmatically lossless | read_ipynb |
write_ipynb |
| Claude Code session | storage | sess2dlg |
dlg2sess |
| Codex thread | storage (write-only so far) | dlg2thread |
|
canonical chat (Msg/Part) |
transmission, normalizing | chat2dlg |
dlg2chat |
| hist (live call input) | transmission, one-way | dlg2hist |
|
| a prompt’s reply | self-similar | reply2dlg |
dlg2reply |
| XML views | display, one-way | view_dlg, msg2xml |
The session codecs (in llmsurgery) route through chat on their way to the wire: ant’s dlg2msgs and oai’s dlg2items are each denorm_msgs(dlg2chat(...)).
Usage
Installation
Install latest from the GitHub repository:
$ pip install git+https://github.com/AnswerDotAI/aidialog.git
or from pypi:
$ pip install aidialog
Documentation
Documentation can be found hosted on this GitHub repository’s pages.
How to use
A quick taste - create a dialog, add a message, and view it as concise XML:
from aidialog.dlgskill import *
import tempfile
p = tempfile.mkdtemp() + '/demo.ipynb'
d = create_dlg(p, '## A tiny dialog', 'note')
add_msg('6*7', after=d.messages[0].id, dlg=p)
view_dlg(p)
<dialog name="demo"><markdown id="1d693c32">## A tiny dialog</markdown><code id="02048a43">6*7</code></dialog>
To make a file the default for subsequent calls, use set_dlg(p). It expands ~ and resolves an absolute path immediately, so the current dialog stays the same after %cd or another working-directory change.
Command line
The flat commands expose dialog-aware reading and structural edits without a Python kernel:
aidialog-summary nbs/00_core.ipynb
aidialog-find nbs/00_core.ipynb 'read_csv' --context 1
aidialog-view nbs/00_core.ipynb ab12cd34 --out
aidialog-add nbs/00_core.ipynb --after ab12cd34 --msg-type code < new-cell.py
aidialog-del nbs/00_core.ipynb ab12cd34
aidialog-move nbs/00_core.ipynb ab12cd34,ef56ab78 --before 9012cdef
aidialog-summary and summary_dlg show one preview per message. Truncated previews end with …[N], where N is the number of omitted characters.
Message ID arguments are comma-separated where a command accepts several. Mutating commands accept --dry-run; run any command with --help for its full filters and display options.
Release files for aidialog 0.0.36
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aidialog-0.0.36.tar.gz | 56.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aidialog-0.0.36-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 113.0 kB
Release files / aidialog-0.0.36.tar.gz
| Download URL | aidialog-0.0.36.tar.gz |
|---|---|
| Size | 56.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5f3fb36309093905e9b9f4adddfa3553088624d1e2b9cf1658e66269338bee37
|
|
BLAKE2b-256 checksum How to use checksums |
6be59ebb0c56c29d144942588693b4272b1d1f3e5e7d34c775c6cd32c876fa48
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / aidialog-0.0.36-py3-none-any.whl
| Download URL | aidialog-0.0.36-py3-none-any.whl |
|---|---|
| Size | 56.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b8a6f60815b71ace96df6096543d71f5e99cba423cb3772800d9d119bd210b25
|
|
BLAKE2b-256 checksum How to use checksums |
db815a5403be9735ad1461e8ad5fa577b02a1f36892307b689c097bca1ca27fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|