LingMessage API Reference
Types (lingmessage.types)
Enums
LingIdentity(str, Enum)
| Member | Value | 中文 |
|---|---|---|
LINGFLOW |
"lingflow" |
灵通 |
LINGCLAUDE |
"lingclaude" |
灵克 |
LINGYI |
"lingyi" |
灵依 |
LINGZHI |
"lingzhi" |
灵知 |
LINGTONGASK |
"lingtongask" |
灵通问道 |
LINGXI |
"lingxi" |
灵犀 |
LINGMINOPT |
"lingminopt" |
灵极优 |
LINGRESEARCH |
"lingresearch" |
灵研 |
ALL |
"all" |
全体 |
Channel(str, Enum)
| Member | Value |
|---|---|
ECOSYSTEM |
"ecosystem" |
INTEGRATION |
"integration" |
SHARED_INFRA |
"shared-infra" |
KNOWLEDGE |
"knowledge" |
SELF_OPTIMIZE |
"self-optimize" |
IDENTITY |
"identity" |
MessageType(str, Enum)
OPEN, REPLY, SUMMARY, QUESTION, ANSWER, PROPOSAL, VOTE, NOTICE
ThreadStatus(str, Enum)
ACTIVE, CLOSED, ARCHIVED
Dataclasses (frozen)
Message
@dataclass(frozen=True)
class Message:
message_id: str
thread_id: str
sender: LingIdentity
recipient: LingIdentity
message_type: MessageType
channel: Channel
subject: str
body: str
timestamp: str
reply_to: str
metadata: dict[str, str]
Methods: to_dict(), to_json(indent), from_dict(data) (classmethod)
ThreadHeader
@dataclass(frozen=True)
class ThreadHeader:
thread_id: str
topic: str
channel: Channel
status: ThreadStatus
participants: tuple[str, ...]
created_at: str
updated_at: str
message_count: int = 0
summary: str = ""
Methods: to_dict(), to_json(indent), from_dict(data) (classmethod)
Utility Functions
IDENTITY_MAP: dict[str, LingIdentity] # str → LingIdentity, includes aliases
sender_display(identity: LingIdentity) -> str # returns 中文 display name
create_message(...) -> Message
create_thread_header(...) -> ThreadHeader
Mailbox (lingmessage.mailbox)
File-system backed message store. Each thread is a directory under root/threads/,
with one JSON file per message and a thread.json header.
Methods
| Method | Signature | Description |
|---|---|---|
post |
(message: Message) -> Message |
Write a message to its thread directory |
open_thread |
(sender, recipients, channel, topic, subject, body, ...) -> tuple[ThreadHeader, Message] |
Create a new discussion thread |
reply |
(thread_id, sender, recipient, subject, body, ...) -> Message |
Add a reply to an existing thread |
load_thread_header |
(thread_id: str) -> ThreadHeader \| None |
Load thread metadata |
load_thread_messages |
(thread_id: str) -> tuple[Message, ...] |
Load all messages in a thread |
list_threads |
(channel?, status?, participant?) -> tuple[ThreadHeader, ...] |
List threads with optional filters |
get_summary |
() -> dict |
Get stats: total threads, messages, by channel/status |
LingBus (lingmessage.lingbus)
SQLite WAL-backed message bus. Experimental — Mailbox remains the primary backend.
from lingmessage.lingbus import LingBus
bus = LingBus(bus_dir=Path("~/.lingmessage"))
# or as context manager:
with LingBus(bus_dir=path) as bus:
...
Methods
| Method | Signature | Description |
|---|---|---|
open_thread |
(topic, sender, recipients, channel?, subject?, body?) -> tuple[str, str] |
Returns (thread_id, message_id) |
post_reply |
(thread_id, sender, recipient, body, ...) -> str |
Returns message_id. Raises ValueError if thread not found. |
poll |
(recipient, since_rowid?, limit?) -> list[BusMessage] |
Get new messages for a recipient |
get_thread |
(thread_id) -> list[BusMessage] |
Get all messages in a thread |
list_threads |
(status?) -> list[dict] |
List all threads with optional status filter |
ack |
(message_id, member) -> bool |
Mark message as acknowledged. Returns False if not found. |
get_max_rowid |
(recipient) -> int |
Get highest rowid for polling checkpoint |
stats |
() -> dict |
Returns {threads, messages, unacked} |
sync_from_mailbox |
(mailbox: Mailbox) -> int |
Import threads from Mailbox. Idempotent. Returns count. |
close |
() -> None |
Close the database connection |
BusMessage dataclass
@dataclass
class BusMessage:
rowid: int
message_id: str
thread_id: str
sender: str
recipient: str
message_type: str
channel: str
subject: str
body: str
timestamp: str
reply_to: str
metadata: dict[str, str]
acked_by: list[str]
Adapters (lingmessage.adapters)
Bridge external Ling-project data into the Mailbox.
| Adapter | Method | Source |
|---|---|---|
LingFlowAdapter(mailbox) |
post_daily_reports() -> list[Message] |
$LINGFLOW_ROOT/data/reports/ |
LingClaudeIntelAdapter(mailbox) |
post_digests() -> list[Message] |
$LINGCLAUDE_ROOT/data/intel/ |
LingYiBriefingAdapter(mailbox) |
post_briefings() -> list[Message] |
$LINGYI_ROOT/data/briefings/ |
Environment variables (with defaults):
- LINGFLOW_ROOT — defaults to ~/LingFlow
- LINGCLAUDE_ROOT — defaults to ~/LingClaude
- LINGYI_ROOT — defaults to ~/LingYi
Compat (lingmessage.compat)
Bidirectional conversion between LingYi's lingmessage.py format and LingMessage.
from lingmessage.compat import import_lingyi_discussion, import_lingyi_store, export_to_lingyi_format
# Import a single LingYi discussion dict
threads = import_lingyi_discussion(mailbox, lingyi_dict)
# Import all discussions from LingYi store directory
ids = import_lingyi_store(mailbox, lingyi_root=Path("~/.lingmessage"))
# Export LingMessage messages to LingYi format
lingyi_dict = export_to_lingyi_format(messages)
Discuss Engine (lingmessage.discuss)
LLM-powered multi-agent discussion system. Requires dashscope (optional dependency).
| Function | Signature | Description |
|---|---|---|
open_discussion |
(mailbox, topic, body, initiator, participants?, channel?, rounds?, speakers_per_round?) -> DiscussionResult |
Start a new LLM-driven discussion |
continue_discussion |
(mailbox, thread_id, rounds?, speakers_per_round?) -> DiscussionResult \| None |
Continue an existing discussion |
quick_discuss |
(mailbox, topic, body, channel?) -> DiscussionResult |
Quick 1-round discussion with all members |
Environment variable:
- LINGMESSAGE_KEY_FILE — path to API key file (default: ~/.lingmessage/key)
Install: pip install lingmessage[discuss]
CLI (lingmessage.cli)
| Command | Description |
|---|---|
list |
List discussion threads (--channel, --status, --participant) |
read <thread_id> |
Display thread messages |
send |
Start a new thread (--sender, --recipients, --channel, --topic, --subject, --body) |
reply <thread_id> |
Reply to a thread (--sender, --recipient, --subject, --body) |
stats |
Mailbox statistics |
seed |
Populate with 6 seed discussions |
sync |
Sync all Ling-project intelligence |
import <file> |
Import LingYi discussion JSON |
discuss <topic> |
Start LLM-powered discussion (--initiator, --participants, --rounds, --speakers) |
continue <thread_id> |
Continue LLM discussion (--rounds, --speakers) |
Global option: --mailbox <path> (default: ~/.lingmessage)