feat(session): add unified_session config to share one session across all channels

This commit is contained in:
whs
2026-04-09 11:09:25 +08:00
committed by Xubin Ren
parent bfec06a2c1
commit 743e73da3f
5 changed files with 205 additions and 1 deletions
+5 -1
View File
@@ -143,6 +143,7 @@ class AgentLoop:
channels_config: ChannelsConfig | None = None,
timezone: str | None = None,
hooks: list[AgentHook] | None = None,
unified_session: bool = False,
):
from nanobot.config.schema import ExecToolConfig, WebToolsConfig
@@ -189,7 +190,7 @@ class AgentLoop:
exec_config=self.exec_config,
restrict_to_workspace=restrict_to_workspace,
)
self._unified_session = unified_session
self._running = False
self._mcp_servers = mcp_servers or {}
self._mcp_stack: AsyncExitStack | None = None
@@ -390,6 +391,9 @@ class AgentLoop:
async def _dispatch(self, msg: InboundMessage) -> None:
"""Process a message: per-session serial, cross-session concurrent."""
if self._unified_session and not msg.session_key_override:
import dataclasses
msg = dataclasses.replace(msg, session_key_override="unified:default")
lock = self._session_locks.setdefault(msg.session_key, asyncio.Lock())
gate = self._concurrency_gate or nullcontext()
async with lock, gate:
+3
View File
@@ -590,6 +590,7 @@ def serve(
mcp_servers=runtime_config.tools.mcp_servers,
channels_config=runtime_config.channels,
timezone=runtime_config.agents.defaults.timezone,
unified_session=runtime_config.agents.defaults.unified_session,
)
model_name = runtime_config.agents.defaults.model
@@ -681,6 +682,7 @@ def gateway(
mcp_servers=config.tools.mcp_servers,
channels_config=config.channels,
timezone=config.agents.defaults.timezone,
unified_session=config.agents.defaults.unified_session,
)
# Set cron callback (needs agent)
@@ -912,6 +914,7 @@ def agent(
mcp_servers=config.tools.mcp_servers,
channels_config=config.channels,
timezone=config.agents.defaults.timezone,
unified_session=config.agents.defaults.unified_session,
)
restart_notice = consume_restart_notice_from_env()
if restart_notice and should_show_cli_restart_notice(restart_notice, session_id):
+1
View File
@@ -76,6 +76,7 @@ class AgentDefaults(Base):
provider_retry_mode: Literal["standard", "persistent"] = "standard"
reasoning_effort: str | None = None # low / medium / high / adaptive - enables LLM thinking mode
timezone: str = "UTC" # IANA timezone, e.g. "Asia/Shanghai", "America/New_York"
unified_session: bool = False # Share one session across all channels (single-user multi-device)
dream: DreamConfig = Field(default_factory=DreamConfig)
+1
View File
@@ -81,6 +81,7 @@ class Nanobot:
restrict_to_workspace=config.tools.restrict_to_workspace,
mcp_servers=config.tools.mcp_servers,
timezone=defaults.timezone,
unified_session=defaults.unified_session,
)
return cls(loop)