jianmu.message¶
适用对象:Agent 应用开发者 / Provider 适配者 / 核心维护者
是否必读:是
相关模块:jianmu.model, jianmu.memory
1. 模块职责¶
jianmu.message 定义消息领域模型、消息存储协议、消息归一化与保留策略。
如果你要理解 jianmu 里的“对话消息”如何流动,这个模块是关键入口之一。
2. 适合查什么¶
- 基础消息类型:
Message - 快捷构造器:
system()、human()、ai()、tool() - 消息存储协议:
MessageStoreProtocol、AsyncMessageStoreProtocol - 消息归一化:
StrictMessageCoercer、LenientMessageCoercer - 存储实现:
StateMessageStore
3. 使用建议¶
- 普通业务代码优先通过快捷构造器产生消息
- 想定制消息兼容层时,查看 coercer 与 retention 相关对象
- Provider 编码层不要直接耦合底层存储实现
4. 最小示例¶
from pydantic import BaseModel
from jianmu import StateManager
from jianmu.message import StateMessageStore, human, ai
class AgentState(BaseModel):
messages: list = []
state_manager = StateManager(AgentState)
state_manager.initialize()
store = StateMessageStore(state_manager, key="messages", max_messages=50)
store.append(human("hello"))
store.append(ai("hi"))
recent = store.get_messages(limit=10)
5. 常见入口¶
- 想构造消息:看
system()、human()、ai()、tool() - 想把消息历史放进状态:看
StateMessageStore - 想兼容宽松输入:看
LenientMessageCoercer - 想限制保留条数:看
MaxCountRetention
6. 注意事项¶
- 普通应用代码通常不需要自己实现
MessageStoreProtocol - provider 编码层应依赖
Message领域模型,而不是直接耦合具体存储实现 - 需要外部持久化时,再实现
AsyncMessageStoreProtocol或自定义 store
7. API 参考¶
message
¶
Agent messaging protocols, message store interfaces, and retention policies in Jianmu.
Message
¶
Bases: BaseModel
Canonical message container for conversation history and tool payloads.
Supports system, user, assistant, and tool roles. content may be
plain text or a structured list of multimodal blocks.
Message is Jianmu's canonical chat/history format and is the type used
across model providers, message stores, and agent state.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
id |
str
|
Stable message identifier used for diffing, replay, and event tracking. |
role |
Literal['system', 'user', 'assistant', 'tool']
|
Chat role, one of |
content |
Union[str, List[Any]]
|
Message body as plain text or a structured block list. |
name |
Optional[str]
|
Optional speaker or tool-facing name. |
tool |
Optional[str]
|
Optional tool name associated with the message. |
tool_call_id |
Optional[str]
|
Optional provider-specific tool-call correlation ID. |
tool_calls |
Optional[List[Dict[str, Any]]]
|
Optional tool-call payloads emitted by an assistant message. |
metadata |
Dict[str, Any]
|
Arbitrary structured metadata attached to the message. |
to_text
¶
Convert a Message (or arbitrary content via class-call) to plain text.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
self_or_content
|
Any
|
Either a |
None
|
返回:
| 类型 | 描述 |
|---|---|
str
|
Decoded string representation of the content. |
源代码位于: jianmu/message/base.py
to_dict
¶
Convert the message into a plain dictionary payload.
返回:
| 类型 | 描述 |
|---|---|
Dict[str, Any]
|
Dictionary with |
Dict[str, Any]
|
plus any optional fields that are set. |
源代码位于: jianmu/message/base.py
MessageEvent
¶
Bases: BaseModel
Represents a lifecycle event of a message in the store.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
event_type |
Literal['added']
|
Event name describing the message lifecycle transition. |
message |
Message
|
Message payload associated with the event. |
MessageStoreProtocol
¶
Bases: Protocol
Protocol for storing and retrieving message history.
Most users will interact with StateMessageStore rather than implement
this directly. Custom implementations are useful for Redis, SQL, or other
external backends.
append
¶
append_many
¶
Append multiple message payloads in order.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
messages
|
Sequence[Any]
|
Iterable of messages or coercible payloads. |
必需 |
get_messages
¶
Return stored messages, optionally limited to the newest entries.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
limit
|
int | None
|
Maximum number of messages to return from the tail of the
store. Returns all messages when |
None
|
返回:
| 类型 | 描述 |
|---|---|
List[Message]
|
Ordered list of |
源代码位于: jianmu/message/base.py
subscribe
¶
Register a callback for message lifecycle events.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
callback
|
Callable[[MessageEvent], None]
|
Consumer invoked with a |
必需 |
返回:
| 类型 | 描述 |
|---|---|
Callable[[MessageEvent], None]
|
The same callback, for use as an unsubscribe token. |
源代码位于: jianmu/message/base.py
unsubscribe
¶
Remove a previously registered message event callback.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
callback
|
Callable[[MessageEvent], None]
|
The callback reference previously passed to |
必需 |
AsyncMessageStoreProtocol
¶
Bases: Protocol
Protocol for async message store implementations.
append
async
¶
Append a single message payload asynchronously.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
message
|
Any
|
Message or coercible payload to append. |
必需 |
append_many
async
¶
Append multiple messages asynchronously.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
messages
|
Sequence[Any]
|
Sequence of message payloads. |
必需 |
get_messages
async
¶
Return stored messages asynchronously.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
limit
|
int | None
|
Maximum number of messages to return. |
None
|
返回:
| 类型 | 描述 |
|---|---|
List[Message]
|
List of Message objects. |
subscribe
¶
Register a callback for message lifecycle events.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
callback
|
Callable[[MessageEvent], None]
|
Consumer callback for MessageEvent. |
必需 |
返回:
| 类型 | 描述 |
|---|---|
Callable[[MessageEvent], None]
|
The registered callback. |
源代码位于: jianmu/message/base.py
unsubscribe
¶
Remove a previously registered message event callback.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
callback
|
Callable[[MessageEvent], None]
|
The callback to unsubscribe. |
必需 |
MessageCoercerProtocol
¶
RetentionPolicyProtocol
¶
Bases: Protocol
Control how message history is retained on append.
MergeFnProtocol
¶
Bases: Protocol
Pure function protocol for combining existing history with incoming messages.
StrictMessageCoercer
¶
Strict coercer: accepts Message or valid dict, rejects everything else.
coerce
¶
Coerce only valid Message instances or message dicts.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
payload
|
Any
|
The message instance or dict to coerce. |
必需 |
返回:
| 类型 | 描述 |
|---|---|
Message | None
|
Coerced Message instance or None. |
引发:
| 类型 | 描述 |
|---|---|
ValueError
|
If the payload dictionary is invalid or the type is incorrect. |
源代码位于: jianmu/message/coercer.py
LenientMessageCoercer
¶
Lenient coercer for migration/debug use.
coerce
¶
Best-effort coerce arbitrary payloads into Message objects.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
payload
|
Any
|
The payload to coerce. |
必需 |
返回:
| 类型 | 描述 |
|---|---|
Message | None
|
Coerced Message instance or None. |
源代码位于: jianmu/message/coercer.py
MaxCountRetention
¶
Retention policy that keeps only the newest N messages.
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
max_messages |
Maximum number of messages retained after each append. |
Create a max-count retention policy.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
max_messages
|
Optional[int]
|
Maximum number of messages to retain. |
50
|
源代码位于: jianmu/message/retention.py
apply
¶
Append incoming messages and truncate to the newest entries.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
existing
|
List[Message]
|
List of existing messages. |
必需 |
incoming
|
List[Message]
|
List of new incoming messages. |
必需 |
返回:
| 类型 | 描述 |
|---|---|
List[Message]
|
List of combined messages truncated if needed. |
源代码位于: jianmu/message/retention.py
StateMessageStore
¶
StateMessageStore(
state_manager: "StateManager",
max_messages: int | None = None,
*,
key: str = "messages",
namespace: str | None = None,
coercer: MessageCoercerProtocol | None = None,
retention: RetentionPolicyProtocol | None = None,
merge_fn: MergeFnProtocol | None = None,
)
Bases: MessageStoreProtocol
Message store backed by StateManager with pluggable coercion/retention.
This is the default in-process message store for Jianmu agents. It keeps chat history inside a state field, applies message coercion on writes, and optionally truncates or custom-merges history.
Typical usage::
store = StateMessageStore(sm, key="messages", max_messages=50)
store.append(human("hello"))
recent = store.get_messages(limit=10)
属性:
| 名称 | 类型 | 描述 |
|---|---|---|
_state_manager |
Backing state manager storing the message list. |
|
_key |
State field key used for message history. |
|
_namespace |
Optional namespace applied to state operations. |
|
_coercer |
Message coercer used to normalize writes. |
|
_merge_fn |
MergeFnProtocol | None
|
Optional merge function applied during appends. |
_max_messages |
int | None
|
Optional tail-retention cap for stored history. |
_subscribers |
list[Callable[[MessageEvent], None]]
|
Registered message-event subscribers. |
_sub_lock |
Lock protecting subscriber registration and iteration. |
Initialize a StateMessageStore.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
state_manager
|
'StateManager'
|
The backing StateManager instance. |
必需 |
max_messages
|
int | None
|
Maximum number of messages to retain (tail truncation). If both merge_fn and max_messages are provided, truncation is applied after merge_fn returns. |
None
|
key
|
str
|
Field name within the schema (default: |
'messages'
|
namespace
|
str | None
|
Optional runtime namespace prefix for key routing. Use this when each sub-agent or subtree needs isolated chat history. |
None
|
coercer
|
MessageCoercerProtocol | None
|
Pluggable input normalization (default: StrictMessageCoercer). |
None
|
retention
|
RetentionPolicyProtocol | None
|
High-level retention policy (mutually exclusive with merge_fn). |
None
|
merge_fn
|
MergeFnProtocol | None
|
Low-level merge function. Takes (current, incoming) -> merged. Must be a sync function. Mutually exclusive with retention. |
None
|
源代码位于: jianmu/message/store.py
append
¶
Append one message through the configured coercion pipeline.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
message
|
Any
|
Message object or payload to be coerced and appended. |
必需 |
append_many
¶
Append multiple messages and emit per-message added events.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
messages
|
Sequence[Any]
|
Sequence of message objects or payloads to coerce and append. |
必需 |
replace
¶
Replace the full stored history with normalized messages.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
messages
|
Sequence[Any]
|
Sequence of message objects or payloads to replace with. |
必需 |
signal
|
bool
|
Whether to trigger change events on the state manager. |
True
|
源代码位于: jianmu/message/store.py
get_messages
¶
Fetch coerced messages from the backing state store.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
limit
|
int | None
|
Maximum number of messages to return from the tail of the store. |
None
|
返回:
| 类型 | 描述 |
|---|---|
List[Message]
|
A list of coerced Message instances. |
源代码位于: jianmu/message/store.py
read_input
¶
Normalize one raw state payload into message objects.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
raw
|
Any
|
Raw state payload read from the resolved input key. |
必需 |
fallback_role
|
str
|
Role used when wrapping scalar payloads. |
'user'
|
limit
|
int | None
|
Optional tail limit applied after normalization. |
None
|
返回:
| 类型 | 描述 |
|---|---|
List[Message]
|
A normalized list of |
源代码位于: jianmu/message/store.py
subscribe
¶
Register a message event subscriber.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
callback
|
Callable[[MessageEvent], None]
|
The callback function to subscribe. |
必需 |
返回:
| 类型 | 描述 |
|---|---|
Callable[[MessageEvent], None]
|
The subscribed callback function. |
源代码位于: jianmu/message/store.py
unsubscribe
¶
Remove a registered message event subscriber.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
callback
|
Callable[[MessageEvent], None]
|
The callback function to unsubscribe. |
必需 |
源代码位于: jianmu/message/store.py
system
¶
Create a system-role message.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
content
|
str
|
Message body text. |
必需 |
**kwargs
|
Any
|
Additional |
{}
|
返回:
| 类型 | 描述 |
|---|---|
Message
|
A |
These helper factories are primarily for readability in examples and tests.
源代码位于: jianmu/message/base.py
human
¶
Create a user-role message.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
content
|
str
|
Message body text. |
必需 |
**kwargs
|
Any
|
Additional |
{}
|
返回:
| 类型 | 描述 |
|---|---|
Message
|
A |
源代码位于: jianmu/message/base.py
ai
¶
Create an assistant-role message.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
content
|
str
|
Message body text. |
必需 |
**kwargs
|
Any
|
Additional |
{}
|
返回:
| 类型 | 描述 |
|---|---|
Message
|
A |
源代码位于: jianmu/message/base.py
tool
¶
Create a tool-role message.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
content
|
str
|
Tool observation or output text. |
必需 |
name
|
Optional[str]
|
Optional tool name associated with this message. |
None
|
**kwargs
|
Any
|
Additional |
{}
|
返回:
| 类型 | 描述 |
|---|---|
Message
|
A |
源代码位于: jianmu/message/base.py
normalize_message
¶
normalize_message(
payload: Any,
*,
fallback_role: str = "user",
coercer: MessageCoercerProtocol | None = None,
) -> Message | None
Normalize one arbitrary payload into a Message.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
payload
|
Any
|
Message-like payload to normalize. |
必需 |
fallback_role
|
str
|
Role used when wrapping non-message payloads. |
'user'
|
coercer
|
MessageCoercerProtocol | None
|
Optional explicit coercer override. When provided, its result takes precedence over the built-in best-effort normalization. |
None
|
返回:
| 类型 | 描述 |
|---|---|
Message | None
|
A normalized |
源代码位于: jianmu/message/coercer.py
normalize_messages
¶
normalize_messages(
payload: Sequence[Any] | Any | None,
*,
fallback_role: str = "user",
coercer: MessageCoercerProtocol | None = None,
) -> list[Message]
Normalize one message payload or a message sequence.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
payload
|
Sequence[Any] | Any | None
|
Single message-like value, sequence of values, or |
必需 |
fallback_role
|
str
|
Role used when wrapping non-message payloads. |
'user'
|
coercer
|
MessageCoercerProtocol | None
|
Optional explicit coercer override applied item-by-item. |
None
|
返回:
| 类型 | 描述 |
|---|---|
list[Message]
|
A list of normalized |