ConferLLM
ConferLLM is a local command-line tool for asking configured AI models questions, continuing conversations, and working with images. Its bundled Agent Skill lets another agent use the same commands for a second opinion or a model comparison.
The Python package, import package, executable, and Skill are all named
conferllm. LiteLLM handles provider integration; callers select a local model
alias and keep the returned session ID.
Install
From an authorized ConferLLM source checkout:
uv tool install .
If you already use a Python virtual environment:
python -m pip install .
A supplied ConferLLM wheel can be used instead of .. Once a release of this
project has been published and its identity verified, it can be installed with
uv tool install conferllm. Do not assume that a same-named package is this project.
Verify the executable:
conferllm --version
conferllm --help
ConferLLM requires Python 3.10+ and POSIX file locking (macOS/Linux). Native Windows is not supported.
Configure models
Configuration belongs in ~/.conferllm/config.yaml, outside the repository.
From a source checkout, create a private directory and copy the example only
when no configuration exists:
mkdir -p ~/.conferllm
chmod 700 ~/.conferllm
test ! -e ~/.conferllm/config.yaml && cp config_example.yaml ~/.conferllm/config.yaml
chmod 600 ~/.conferllm/config.yaml
Alternatively, create the file using this minimal configuration and supply your own credentials:
model_list:
- model_name: reasoning
capabilities:
input_modalities: [text]
output_modalities: [text]
litellm_params:
model: openai/gpt-5
api_key: "replace-with-your-key"
- model_name: vision
capabilities:
input_modalities: [text, image]
output_modalities: [text]
max_input_images: 8
litellm_params:
model: openai/gpt-4o
api_key: "replace-with-your-key"
Provider model IDs and parameters are examples; availability depends on your
provider account. Each local alias must be non-empty and unique, and
litellm_params.model must identify a provider model. See
config_example.yaml for additional configuration shapes.
Values in litellm_params are forwarded to LiteLLM, except that ConferLLM owns
messages and always sets stream to false. Unknown application configuration
fields are rejected so typos do not silently change behavior.
Optional settings:
global_system_prompt: applied to every request.- A model's
system_prompt: overrides the global prompt;""disables it. sessions_dir: overrides the session root. Relative YAML paths resolve beside the configuration file, independently of the caller's working directory.image_limits: limits newly attached images per turn. Defaults are 16 images, 20 MiB per image, and 50 MiB in total.
Use --config PATH to select another file. An explicitly selected missing file
is an error. ConferLLM does not create, populate, or automatically migrate provider
credentials.
Check configuration without printing its values:
conferllm doctor --json
conferllm models --json
conferllm model-info reasoning
Doctor reports safe metadata and suggested next steps. It exits nonzero when configuration is missing, invalid, or has no model aliases, while still returning its diagnostic report.
Ask a model
Create a conversation:
conferllm chat --model reasoning --prompt "Explain Raft leader election."
Human-readable output includes the session ID, name, answer, output-image
locations, and any warnings. A name is derived locally from the first prompt;
use --name to choose one explicitly.
For scripts and agents, request structured output:
conferllm chat \
--model reasoning \
--name "Raft notes" \
--prompt "Explain Raft leader election." \
--json
The stable response envelope is conferllm.chat.response.v1. Its authoritative
fields are:
{
"schema_version": "conferllm.chat.response.v1",
"ok": true,
"session": {
"id": "20260905-0123456789abcdef0123456789abcdef",
"name": "Raft notes",
"model": "reasoning",
"turn": 1
},
"message": {
"text": "The answer...",
"content": [{"type": "text", "text": "The answer..."}]
},
"artifacts": [],
"warnings": []
}
Compatibility fields session_id, name, model, and answer are also
returned. New integrations should use the nested fields. Raw provider data
is excluded unless --include-raw-response is supplied.
For long or multiline prompts:
conferllm chat --model reasoning --prompt-file ./prompt.md --json
Successful JSON results are written to stdout. Runtime failures exit nonzero
and write a conferllm.error.v1 envelope to stderr; library logging is suppressed
in JSON mode so the envelope remains parseable. Argument-parser failures use
the normal CLI usage error and exit code 2.
Continue and find conversations
Use the actual session ID returned by the preceding call:
conferllm chat \
--session 20260905-0123456789abcdef0123456789abcdef \
--prompt "Now compare it with Paxos." \
--json
Exactly one of --model and --session is required. A session retains its
model and name; --name is only accepted when creating a conversation.
ConferLLM restores prior successful turns automatically.
Find conversations using metadata:
conferllm sessions list
conferllm sessions list --query raft --json
conferllm sessions list --model reasoning --since 2026-09-01 --limit 20 --json
Filters combine with AND semantics. --query matches the ID or name without
case sensitivity; model aliases match exactly. --since and --until are
inclusive creation dates. The default limit is 50; --limit 0 is unlimited.
Listing never searches message bodies and reports corrupt headers as warnings
without hiding unrelated valid sessions.
For a model comparison, create one independent session per model using the same prompt. Attribute each answer and retain each session ID; a conversation does not switch models.
Work with images
Repeat --image to preserve input order:
conferllm chat \
--model vision \
--prompt "Compare these screenshots." \
--image ./before.png \
--image ./after.png \
--json
Accepted images are copied into private, session-owned storage. Follow-ups use those copies even if the original files change or disappear. PNG, JPEG, GIF, WebP, BMP, and SVG MIME types are detected from content rather than file extensions.
Declared capabilities are checked before reading images or calling the
provider. Application limits bound new attachments; a model's
max_input_images also counts images replayed from history. Unknown image
capability produces a warning, not a claim of provider support.
Models that return images can produce multiple ordered output artifacts,
including image-only replies. message.content contains their references and
artifacts contains their MIME type, size, SHA-256, local path, and stable
conferllm://sessions/.../artifacts/... URI.
Use --image-output-dir PATH for additional exported copies. If export fails,
the canonical artifacts and successful conversation remain available. Preserve
the session ID and handle the warning instead of repeating the model call.
Generated images must be embedded data URLs. ConferLLM does not download remote-only image outputs, execute provider tool calls, or silently discard unsupported content.
Install the Agent Skill
The source layout is:
skills/conferllm/
├── SKILL.md
├── agents/openai.yaml
└── references/
├── installation.md
├── multimodal.md
└── errors.md
skills/conferllm/ is the single source of truth for the Skill. The wheel embeds the same files; the source distribution preserves this layout. Source and installed Skills use identical relative reference paths.
Install the version bundled with the executable:
conferllm skill install
conferllm skill install --target codex
conferllm skill install --destination /custom/skills/conferllm
Defaults are ~/.agents/skills/conferllm and ~/.codex/skills/conferllm. Installation
is idempotent. A different existing installation is preserved unless --force
is explicitly requested. Home, workspace, package directories, and their
ancestors are never valid replacement targets.
An agent invoking $conferllm discovers configured aliases, retains session IDs,
preserves image order, and attributes answers. It uses the CLI rather than
opening credential or session files.
Storage and reliability
Sessions are UTF-8 JSONL files below ~/.conferllm/sessions/YYYY/MM/DD/. Every
committed turn contains a complete user/assistant pair and its artifact
metadata. Directories use mode 0700; session and image files use 0600.
The configuration file remains user-managed.
Continuation holds a thread/process lock across loading, model execution, and atomic JSONL replacement. Stored image size/hash checks precede replay. Failed provider calls do not append a partial turn.
JSONL is the commit record. A locked continuation can recover the next uncommitted image directory left by a crash; it never removes committed turns. Early staging leftovers are not automatically swept. This is not an exactly-once guarantee for provider calls, and long histories are not silently summarized or truncated.
Session content can be sensitive. Keep credentials and conversations out of version control. Configuration/provider errors do not echo raw input or provider exception payloads.
Development
Use uv>=0.12.9,<0.13:
uv sync --extra dev
uv run ruff format --check .
uv run ruff check .
uv run mypy src/
uv run pytest
uv lock --check
uv build
git diff --check
Tests isolate the user home and block unmocked provider calls. They cover persistence, process/thread locking, fault recovery, protocol integration, Skill installation, and wheel/source-distribution content.
Key dependency major versions are bounded, and uv.lock records the development
resolution. Python 3.10 uses the verified LiteLLM 1.97.x line; Python 3.11+
permits LiteLLM 1.x from 1.99.0. The project uses uv's centralized environment
support so editable installs do not depend on hidden .pth files in synced
macOS folders.
License
ConferLLM is released under the MIT License.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file conferllm-0.1.0.tar.gz.
File metadata
- Download URL: conferllm-0.1.0.tar.gz
- Upload date:
- Size: 333.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
253db0fba03fa6550d0d63ca578bc8fc3810acad19a8efd0114cca440e607c72
|
|
| MD5 |
cdfa3c1b7eafbcdeb83f43d479ed9726
|
|
| BLAKE2b-256 |
ae6789023a79fd9c28c45f8f23163f131794486dfa2fb02470e8872642799cc9
|
File details
Details for the file conferllm-0.1.0-py3-none-any.whl.
File metadata
- Download URL: conferllm-0.1.0-py3-none-any.whl
- Upload date:
- Size: 59.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c382d7f123b7946e2ff075cee0040e8041879a8d62b97ff5295bea08205fa16f
|
|
| MD5 |
34d6b43a0ddf8d510894dc4c57254fbc
|
|
| BLAKE2b-256 |
ce9b59a17c4bdfa36359ffc66b6fbbb64fe47dbc733704f76b76b1820e307dba
|