mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-05-20 00:22:31 +00:00
refactor: address code review feedback on AgentLoop.from_config()
- Accept optional `provider` kwarg in from_config() to avoid double instantiation in _run_gateway (which already builds provider_snapshot) - Restore try/except ValueError wrappers in serve() and agent() for clean error messages on provider creation failure - Update test: _FakeAgentLoop captures provider from kwargs, restore strong assertion (seen["provider"] is provider)
This commit is contained in:
parent
3202f58c41
commit
733b34d685
@ -348,13 +348,18 @@ class AgentLoop:
|
|||||||
bus: MessageBus | None = None,
|
bus: MessageBus | None = None,
|
||||||
**extra: Any,
|
**extra: Any,
|
||||||
) -> AgentLoop:
|
) -> AgentLoop:
|
||||||
"""Create an AgentLoop from config with the common parameter set."""
|
"""Create an AgentLoop from config with the common parameter set.
|
||||||
|
|
||||||
|
Extra keyword arguments are forwarded to ``AgentLoop.__init__``,
|
||||||
|
allowing callers to override or extend the standard config-derived
|
||||||
|
parameters (e.g. ``cron_service``, ``session_manager``).
|
||||||
|
"""
|
||||||
from nanobot.providers.factory import make_provider
|
from nanobot.providers.factory import make_provider
|
||||||
|
|
||||||
if bus is None:
|
if bus is None:
|
||||||
bus = MessageBus()
|
bus = MessageBus()
|
||||||
defaults = config.agents.defaults
|
defaults = config.agents.defaults
|
||||||
provider = make_provider(config)
|
provider = extra.pop("provider", None) or make_provider(config)
|
||||||
return cls(
|
return cls(
|
||||||
bus=bus,
|
bus=bus,
|
||||||
provider=provider,
|
provider=provider,
|
||||||
|
|||||||
@ -543,14 +543,18 @@ def serve(
|
|||||||
sync_workspace_templates(runtime_config.workspace_path)
|
sync_workspace_templates(runtime_config.workspace_path)
|
||||||
bus = MessageBus()
|
bus = MessageBus()
|
||||||
session_manager = SessionManager(runtime_config.workspace_path)
|
session_manager = SessionManager(runtime_config.workspace_path)
|
||||||
agent_loop = AgentLoop.from_config(
|
try:
|
||||||
runtime_config, bus,
|
agent_loop = AgentLoop.from_config(
|
||||||
session_manager=session_manager,
|
runtime_config, bus,
|
||||||
image_generation_provider_configs={
|
session_manager=session_manager,
|
||||||
"openrouter": runtime_config.providers.openrouter,
|
image_generation_provider_configs={
|
||||||
"aihubmix": runtime_config.providers.aihubmix,
|
"openrouter": runtime_config.providers.openrouter,
|
||||||
},
|
"aihubmix": runtime_config.providers.aihubmix,
|
||||||
)
|
},
|
||||||
|
)
|
||||||
|
except ValueError as exc:
|
||||||
|
console.print(f"[red]Error: {exc}[/red]")
|
||||||
|
raise typer.Exit(1) from exc
|
||||||
|
|
||||||
model_name = runtime_config.agents.defaults.model
|
model_name = runtime_config.agents.defaults.model
|
||||||
console.print(f"{__logo__} Starting OpenAI-compatible API server")
|
console.print(f"{__logo__} Starting OpenAI-compatible API server")
|
||||||
@ -650,6 +654,7 @@ def _run_gateway(
|
|||||||
# Create agent with cron service
|
# Create agent with cron service
|
||||||
agent = AgentLoop.from_config(
|
agent = AgentLoop.from_config(
|
||||||
config, bus,
|
config, bus,
|
||||||
|
provider=provider_snapshot.provider,
|
||||||
cron_service=cron,
|
cron_service=cron,
|
||||||
session_manager=session_manager,
|
session_manager=session_manager,
|
||||||
image_generation_provider_configs={
|
image_generation_provider_configs={
|
||||||
@ -1025,10 +1030,14 @@ def agent(
|
|||||||
else:
|
else:
|
||||||
logger.disable("nanobot")
|
logger.disable("nanobot")
|
||||||
|
|
||||||
agent_loop = AgentLoop.from_config(
|
try:
|
||||||
config, bus,
|
agent_loop = AgentLoop.from_config(
|
||||||
cron_service=cron,
|
config, bus,
|
||||||
)
|
cron_service=cron,
|
||||||
|
)
|
||||||
|
except ValueError as exc:
|
||||||
|
console.print(f"[red]Error: {exc}[/red]")
|
||||||
|
raise typer.Exit(1) from exc
|
||||||
restart_notice = consume_restart_notice_from_env()
|
restart_notice = consume_restart_notice_from_env()
|
||||||
if restart_notice and should_show_cli_restart_notice(restart_notice, session_id):
|
if restart_notice and should_show_cli_restart_notice(restart_notice, session_id):
|
||||||
_print_agent_response(
|
_print_agent_response(
|
||||||
|
|||||||
@ -1144,7 +1144,7 @@ def test_gateway_cron_evaluator_receives_scheduled_reminder_context(
|
|||||||
return cls(**extra)
|
return cls(**extra)
|
||||||
def __init__(self, *args, **kwargs) -> None:
|
def __init__(self, *args, **kwargs) -> None:
|
||||||
self.model = "test-model"
|
self.model = "test-model"
|
||||||
self.provider = object()
|
self.provider = kwargs.get("provider", object())
|
||||||
self.tools = {}
|
self.tools = {}
|
||||||
|
|
||||||
async def process_direct(self, *_args, **_kwargs):
|
async def process_direct(self, *_args, **_kwargs):
|
||||||
@ -1209,7 +1209,7 @@ def test_gateway_cron_evaluator_receives_scheduled_reminder_context(
|
|||||||
|
|
||||||
assert response == "Time to stretch."
|
assert response == "Time to stretch."
|
||||||
assert seen["response"] == "Time to stretch."
|
assert seen["response"] == "Time to stretch."
|
||||||
assert seen["provider"] is not None
|
assert seen["provider"] is provider
|
||||||
assert seen["model"] == "test-model"
|
assert seen["model"] == "test-model"
|
||||||
assert seen["task_context"] == (
|
assert seen["task_context"] == (
|
||||||
"The scheduled time has arrived. Deliver this reminder to the user now, "
|
"The scheduled time has arrived. Deliver this reminder to the user now, "
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user