Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/qwenpaw/agents/react_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ def __init__(
)
# Initialize parent ReActAgent
init_kwargs: dict[str, Any] = {
"name": "Friday",
"name": agent_config.name or "QwenPaw",
"model": model,
"sys_prompt": sys_prompt,
"toolkit": toolkit,
Expand Down
2 changes: 1 addition & 1 deletion src/qwenpaw/app/_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ async def __aexit__(self, exc_type, exc_val, exc_tb):
runner = DynamicMultiAgentRunner()

agent_app = AgentApp(
app_name="Friday",
app_name="QwenPaw",
app_description="A helpful assistant with background task support",
runner=runner,
enable_stream_task=True,
Expand Down
17 changes: 10 additions & 7 deletions src/qwenpaw/app/runner/command_dispatch.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ async def run_command_path( # pylint: disable=too-many-statements,too-many-bran
)
# Yield hint first so user sees it before restart runs.
hint = Msg(
name="Friday",
name=runner.agent_name,
role="assistant",
content=[
TextBlock(
Expand All @@ -142,8 +142,11 @@ async def run_command_path( # pylint: disable=too-many-statements,too-many-bran
manager=manager,
agent_id=agent_id,
session_id=session_id,
agent_name=runner.agent_name,
)
msg = await handler.handle_daemon_command(query, daemon_ctx)
if parsed[0] in ("reload-config", "restart"):
runner.invalidate_agent_name_cache()
yield msg, True
logger.info("handle_daemon_command %s completed", query)
return
Expand All @@ -156,7 +159,7 @@ async def run_command_path( # pylint: disable=too-many-statements,too-many-bran
"run_command_path: control command but workspace not set",
)
error_msg = Msg(
name="Friday",
name=runner.agent_name,
role="assistant",
content=[
TextBlock(
Expand Down Expand Up @@ -186,7 +189,7 @@ async def run_command_path( # pylint: disable=too-many-statements,too-many-bran
f"run_command_path: channel not found: {channel_id}",
)
error_msg = Msg(
name="Friday",
name=runner.agent_name,
role="assistant",
content=[
TextBlock(
Expand Down Expand Up @@ -219,7 +222,7 @@ async def run_command_path( # pylint: disable=too-many-statements,too-many-bran
control_ctx,
)
response_msg = Msg(
name="Friday",
name=runner.agent_name,
role="assistant",
content=[TextBlock(type="text", text=response_text)],
)
Expand All @@ -231,7 +234,7 @@ async def run_command_path( # pylint: disable=too-many-statements,too-many-bran
else:
logger.exception("Control command unexpected error: %s", query)
error_msg = Msg(
name="Friday",
name=runner.agent_name,
role="assistant",
content=[
TextBlock(
Expand All @@ -256,7 +259,7 @@ async def run_command_path( # pylint: disable=too-many-statements,too-many-bran
memory.load_state_dict(memory_state, strict=False)

conv_handler = CommandHandler(
agent_name="Friday",
agent_name=runner.agent_name,
memory=memory,
memory_manager=runner.memory_manager,
context_manager=context_manager,
Expand All @@ -265,7 +268,7 @@ async def run_command_path( # pylint: disable=too-many-statements,too-many-bran
response_msg = await conv_handler.handle_conversation_command(query)
except (RuntimeError, AppBaseException) as e:
response_msg = Msg(
name="Friday",
name=runner.agent_name,
role="assistant",
content=[TextBlock(type="text", text=str(e))],
)
Expand Down
5 changes: 3 additions & 2 deletions src/qwenpaw/app/runner/daemon_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class DaemonContext:
agent_id: Optional[str] = None
# Session ID for approval commands.
session_id: str = ""
agent_name: str = "QwenPaw"


def _get_last_lines(
Expand Down Expand Up @@ -235,7 +236,7 @@ async def handle_daemon_command(
parsed = parse_daemon_query(query)
if not parsed:
return Msg(
name="Friday",
name=context.agent_name,
role="assistant",
content=[
TextBlock(type="text", text="Unknown daemon command."),
Expand All @@ -261,7 +262,7 @@ async def handle_daemon_command(
text = "Unknown daemon subcommand."
logger.info("handle_daemon_command %s completed", query)
return Msg(
name="Friday",
name=context.agent_name,
role="assistant",
content=[TextBlock(type="text", text=text)],
)
3 changes: 2 additions & 1 deletion src/qwenpaw/app/runner/mission_dispatch.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ async def maybe_handle_mission_command(
agent_id: str,
rewrite_fn: Callable[[list, str], None],
session_id: str = "",
agent_name: str = "QwenPaw",
) -> Msg | dict[str, Any] | None:
"""Handle ``/mission`` if the query matches.

Expand All @@ -60,7 +61,7 @@ async def maybe_handle_mission_command(

if isinstance(result, str):
return Msg(
name="Friday",
name=agent_name,
role="assistant",
content=[TextBlock(type="text", text=result)],
)
Expand Down
21 changes: 19 additions & 2 deletions src/qwenpaw/app/runner/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,22 @@ def __init__(
self.memory_manager: BaseMemoryManager | None = None
self.context_manager: BaseContextManager | None = None
self._task_tracker = task_tracker # Task tracker for background tasks
self._agent_name: str | None = None

@property
def agent_name(self) -> str:
"""Agent display name from config, cached after first access."""
if self._agent_name is None:
try:
cfg = load_agent_config(self.agent_id)
self._agent_name = cfg.name if cfg and cfg.name else "QwenPaw"
except Exception:
self._agent_name = "QwenPaw"
return self._agent_name

def invalidate_agent_name_cache(self) -> None:
"""Clear cached agent_name so next access re-reads config."""
self._agent_name = None

def set_chat_manager(self, chat_manager):
"""Set chat manager for auto-registration.
Expand Down Expand Up @@ -182,8 +198,8 @@ def _parse_skill_query(
user_input = parts[1] if len(parts) > 1 else ""
return (name, user_input) if name else None

@staticmethod
def _maybe_inject_skill(
self,
query: str | None,
msgs: list,
skills: dict,
Expand Down Expand Up @@ -231,7 +247,7 @@ def _maybe_inject_skill(
desc = post.get("description") or "No description."
logger.info("Skill info: %s", name)
return Msg(
name="Friday",
name=self.agent_name,
role="assistant",
content=[
TextBlock(
Expand Down Expand Up @@ -419,6 +435,7 @@ async def query_handler(
agent_id=self.agent_id,
rewrite_fn=self._rewrite_last_message_text,
session_id=session_id,
agent_name=self.agent_name,
)
if isinstance(mission_result, Msg):
yield mission_result, True
Expand Down
Loading