refactor(agent): remove obsolete MCP prompt annotations
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# Image Generation
|
# Image Generation
|
||||||
|
|
||||||
nanobot can generate and edit images through the `generate_image` tool. In the WebUI, users can enable **Image Generation** from the composer, choose an aspect ratio, and keep iterating on generated images inside the same chat.
|
nanobot can generate and edit images through the `generate_image` tool. Enable the tool in WebUI Settings, then ask for an image normally in chat; the agent decides when to call it and can keep iterating on generated images in the same conversation.
|
||||||
|
|
||||||
The feature is disabled by default. Enable it in `~/.nanobot/config.json`, configure a supported image provider, then restart the gateway.
|
The feature is disabled by default. Enable it in `~/.nanobot/config.json`, configure a supported image provider, then restart the gateway.
|
||||||
|
|
||||||
@@ -32,11 +32,9 @@ See [Provider Notes](#provider-notes) for Custom, AIHubMix, MiniMax, Gemini, Oll
|
|||||||
|
|
||||||
## WebUI Usage
|
## WebUI Usage
|
||||||
|
|
||||||
In the WebUI composer:
|
1. Open Settings and enable **Image Generation** with a configured provider and model.
|
||||||
|
2. Describe the image or edit you want in chat.
|
||||||
1. Click **Image Generation**.
|
3. Include an aspect ratio or size in the request when the configured defaults are not suitable.
|
||||||
2. Choose an aspect ratio: `Auto`, `1:1`, `3:4`, `9:16`, `4:3`, or `16:9`.
|
|
||||||
3. Describe the image or the edit you want.
|
|
||||||
4. Attach reference images when editing an existing image.
|
4. Attach reference images when editing an existing image.
|
||||||
|
|
||||||
Generated images are rendered as assistant media in the chat. Follow-up prompts such as "make it warmer", "change the background", or "try a 16:9 version" can reuse the most recent generated artifact.
|
Generated images are rendered as assistant media in the chat. Follow-up prompts such as "make it warmer", "change the background", or "try a 16:9 version" can reuse the most recent generated artifact.
|
||||||
|
|||||||
@@ -1121,63 +1121,6 @@ def session_extra(metadata: Mapping[str, Any] | None) -> dict[str, Any]:
|
|||||||
return {"mcp_presets": mcp_presets} if isinstance(mcp_presets, list) and mcp_presets else {}
|
return {"mcp_presets": mcp_presets} if isinstance(mcp_presets, list) and mcp_presets else {}
|
||||||
|
|
||||||
|
|
||||||
def runtime_lines(
|
|
||||||
message: Any,
|
|
||||||
*,
|
|
||||||
available_server_names: set[str] | None = None,
|
|
||||||
configured_server_names: set[str] | None = None,
|
|
||||||
connected_server_names: set[str] | None = None,
|
|
||||||
skip: bool = False,
|
|
||||||
) -> list[str]:
|
|
||||||
"""Return model-visible MCP preset annotations for the current turn."""
|
|
||||||
if skip:
|
|
||||||
return []
|
|
||||||
if configured_server_names is None:
|
|
||||||
configured_server_names = available_server_names
|
|
||||||
if connected_server_names is None:
|
|
||||||
connected_server_names = available_server_names
|
|
||||||
metadata = message.metadata if isinstance(getattr(message, "metadata", None), Mapping) else None
|
|
||||||
structured = metadata.get("mcp_presets") if isinstance(metadata, Mapping) else None
|
|
||||||
if not isinstance(structured, list):
|
|
||||||
return []
|
|
||||||
|
|
||||||
lines: list[str] = []
|
|
||||||
for item in structured[:8]:
|
|
||||||
if not isinstance(item, Mapping):
|
|
||||||
continue
|
|
||||||
raw_name = str(item.get("name") or "").strip().lower()
|
|
||||||
if not raw_name:
|
|
||||||
continue
|
|
||||||
display = str(item.get("display_name") or raw_name).strip() or raw_name
|
|
||||||
transport = str(item.get("transport") or "mcp").strip() or "mcp"
|
|
||||||
prefix = f"mcp_{raw_name}_"
|
|
||||||
if configured_server_names is not None and raw_name not in configured_server_names:
|
|
||||||
lines.append(
|
|
||||||
"MCP Preset Attachment: "
|
|
||||||
f"@{raw_name} ({display}; transport={transport}) is configured in WebUI Settings, "
|
|
||||||
"but this gateway has not loaded the latest MCP settings yet. "
|
|
||||||
f"Tools with prefix `{prefix}` may not be available yet; if they are missing, "
|
|
||||||
"tell the user to restart nanobot."
|
|
||||||
)
|
|
||||||
continue
|
|
||||||
if connected_server_names is not None and raw_name not in connected_server_names:
|
|
||||||
lines.append(
|
|
||||||
"MCP Preset Attachment: "
|
|
||||||
f"@{raw_name} ({display}; transport={transport}) is configured, "
|
|
||||||
"but its MCP connection is not currently live. "
|
|
||||||
f"Tools with prefix `{prefix}` may be unavailable; tell the user to open Settings, "
|
|
||||||
"run the preset test, and restart nanobot only if hot reload is unavailable."
|
|
||||||
)
|
|
||||||
continue
|
|
||||||
lines.append(
|
|
||||||
"MCP Preset Attachment: "
|
|
||||||
f"@{raw_name} ({display}; transport={transport}; tool_prefix={prefix}). "
|
|
||||||
f"Prefer available tools whose names start with `{prefix}` for this request; "
|
|
||||||
"do not substitute shell commands for this MCP integration unless the user asks."
|
|
||||||
)
|
|
||||||
return lines
|
|
||||||
|
|
||||||
|
|
||||||
async def connect_missing_servers(state: Any, registry: ToolRegistry) -> None:
|
async def connect_missing_servers(state: Any, registry: ToolRegistry) -> None:
|
||||||
"""Connect configured MCP servers that are not currently live."""
|
"""Connect configured MCP servers that are not currently live."""
|
||||||
async with _reload_lock(state):
|
async with _reload_lock(state):
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""Compatibility exports for WebUI-attached MCP preset annotations."""
|
"""Compatibility export for persisted WebUI MCP preset metadata."""
|
||||||
|
|
||||||
from nanobot.agent.tools.mcp import runtime_lines, session_extra
|
from nanobot.agent.tools.mcp import session_extra
|
||||||
|
|
||||||
__all__ = ["runtime_lines", "session_extra"]
|
__all__ = ["session_extra"]
|
||||||
|
|||||||
@@ -1,78 +1,8 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from types import SimpleNamespace
|
|
||||||
|
|
||||||
from nanobot.webui import mcp_presets_runtime
|
from nanobot.webui import mcp_presets_runtime
|
||||||
|
|
||||||
|
|
||||||
def test_mcp_preset_runtime_lines_describe_tool_prefix() -> None:
|
|
||||||
msg = SimpleNamespace(
|
|
||||||
content="use @browserbase",
|
|
||||||
metadata={
|
|
||||||
"mcp_presets": [{
|
|
||||||
"name": "browserbase",
|
|
||||||
"display_name": "Browserbase",
|
|
||||||
"transport": "streamableHttp",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
lines = mcp_presets_runtime.runtime_lines(
|
|
||||||
msg,
|
|
||||||
configured_server_names={"browserbase"},
|
|
||||||
connected_server_names={"browserbase"},
|
|
||||||
)
|
|
||||||
|
|
||||||
assert lines
|
|
||||||
assert "@browserbase" in lines[0]
|
|
||||||
assert "mcp_browserbase_" in lines[0]
|
|
||||||
assert "shell commands" in lines[0]
|
|
||||||
|
|
||||||
|
|
||||||
def test_mcp_preset_runtime_lines_warn_when_restart_needed() -> None:
|
|
||||||
msg = SimpleNamespace(
|
|
||||||
content="use @browserbase",
|
|
||||||
metadata={
|
|
||||||
"mcp_presets": [{
|
|
||||||
"name": "browserbase",
|
|
||||||
"display_name": "Browserbase",
|
|
||||||
"transport": "streamableHttp",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
lines = mcp_presets_runtime.runtime_lines(
|
|
||||||
msg,
|
|
||||||
configured_server_names=set(),
|
|
||||||
connected_server_names=set(),
|
|
||||||
)
|
|
||||||
|
|
||||||
assert lines
|
|
||||||
assert "has not loaded the latest MCP settings" in lines[0]
|
|
||||||
|
|
||||||
|
|
||||||
def test_mcp_preset_runtime_lines_warn_when_connection_not_live() -> None:
|
|
||||||
msg = SimpleNamespace(
|
|
||||||
content="use @browserbase",
|
|
||||||
metadata={
|
|
||||||
"mcp_presets": [{
|
|
||||||
"name": "browserbase",
|
|
||||||
"display_name": "Browserbase",
|
|
||||||
"transport": "streamableHttp",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
lines = mcp_presets_runtime.runtime_lines(
|
|
||||||
msg,
|
|
||||||
configured_server_names={"browserbase"},
|
|
||||||
connected_server_names=set(),
|
|
||||||
)
|
|
||||||
|
|
||||||
assert lines
|
|
||||||
assert "connection is not currently live" in lines[0]
|
|
||||||
|
|
||||||
|
|
||||||
def test_mcp_preset_session_extra_only_persists_structured_mentions() -> None:
|
def test_mcp_preset_session_extra_only_persists_structured_mentions() -> None:
|
||||||
assert mcp_presets_runtime.session_extra({}) == {}
|
assert mcp_presets_runtime.session_extra({}) == {}
|
||||||
assert mcp_presets_runtime.session_extra({
|
assert mcp_presets_runtime.session_extra({
|
||||||
|
|||||||
Reference in New Issue
Block a user