refactor: unify skills+cli runtime and streamline ag-ui flow

This commit is contained in:
qzl
2026-04-22 17:09:37 +08:00
parent eeed737949
commit 4d55df45ab
111 changed files with 4858 additions and 3264 deletions
+12 -23
View File
@@ -5,7 +5,6 @@ import contextlib
from dataclasses import dataclass
from datetime import datetime, timezone
from typing import TYPE_CHECKING, Any, Awaitable, Callable
from uuid import UUID
from ag_ui.core.types import RunAgentInput
from agentscope.formatter import OpenAIChatFormatter
@@ -18,7 +17,6 @@ from core.agentscope.schemas.agui_input import extract_latest_user_payload
from core.agentscope.runtime.json_react_agent import JsonReActAgent
from core.agentscope.runtime.model_tracking import TrackingChatModel
from core.agentscope.runtime.stage_emitter import PipelineStageEmitter
from core.agentscope.tools.tool_config import AgentTool, resolve_tool_function_names
from core.agentscope.tools.toolkit import build_toolkit
from core.agentscope.utils import (
finalize_json_response,
@@ -38,8 +36,8 @@ from schemas.agent.forwarded_props import (
from schemas.agent.runtime_models import (
RouterAgentOutput,
WorkerAgentOutputLite,
resolve_worker_output_model,
)
from schemas.agent.skill_config import SkillName
from schemas.agent.system_agent import (
AgentType,
SystemAgentLLMConfig,
@@ -83,7 +81,6 @@ class AgentScopeRunner:
work_memory: WorkProfileContent | None = None,
cancel_checker: Callable[[], Awaitable[bool]] | None = None,
) -> dict[str, Any]:
owner_id = UUID(user_context.id)
runtime_client_time = self._resolve_runtime_client_time(run_input=run_input)
runtime_mode = self._resolve_runtime_mode(run_input=run_input)
stop_cancel_watch = asyncio.Event()
@@ -110,9 +107,7 @@ class AgentScopeRunner:
agent_type=AgentType.WORKER,
)
worker_toolkit = self._build_toolkit(
session=session,
owner_id=owner_id,
enabled_tools=runtime_config.enabled_tools,
enabled_skills=runtime_config.enabled_skills
)
router_output = await self._execute_router_step(
@@ -178,19 +173,11 @@ class AgentScopeRunner:
def _build_toolkit(
self,
*,
session: AsyncSession,
owner_id: UUID,
enabled_tools: list[AgentTool],
enabled_skills: list[SkillName],
) -> Any:
tool_names = (
sorted(resolve_tool_function_names(set(enabled_tools)))
if enabled_tools
else []
)
enabled_skill_names = {str(skill.value) for skill in enabled_skills}
return build_toolkit(
session=session,
owner_id=owner_id,
enabled_tool_names=set(tool_names) if tool_names else None,
enabled_skill_names=enabled_skill_names if enabled_skill_names else None
)
async def _load_stage_config(
@@ -279,7 +266,6 @@ class AgentScopeRunner:
runtime_mode: RuntimeMode,
work_memory: WorkProfileContent | None,
) -> WorkerAgentOutputLite:
worker_output_model = resolve_worker_output_model(router_output.execution_mode)
await self._emit_step_event(
pipeline=pipeline,
run_input=run_input,
@@ -295,13 +281,14 @@ class AgentScopeRunner:
toolkit=toolkit,
run_input=run_input,
stage_config=stage_config,
worker_output_model=worker_output_model,
worker_output_model=WorkerAgentOutputLite,
pipeline=pipeline,
runtime_client_time=runtime_client_time,
runtime_mode=runtime_mode,
work_memory=work_memory,
requires_tool_evidence=router_output.requires_tool_evidence,
)
worker_output = worker_output_model.model_validate(worker_result.payload)
worker_output = WorkerAgentOutputLite.model_validate(worker_result.payload)
await self._emit_step_event(
pipeline=pipeline,
run_input=run_input,
@@ -338,7 +325,6 @@ class AgentScopeRunner:
user_context=user_context,
now_utc=datetime.now(timezone.utc),
runtime_client_time=runtime_client_time,
tools=None,
user_memory=user_memory,
),
"system",
@@ -400,6 +386,7 @@ class AgentScopeRunner:
runtime_client_time: ClientTimeContext | None,
runtime_mode: RuntimeMode,
work_memory: WorkProfileContent | None,
requires_tool_evidence: bool = False,
) -> StageExecutionResult:
tracking_model = self._build_model(stage_config=stage_config)
emitter = PipelineStageEmitter(
@@ -420,12 +407,12 @@ class AgentScopeRunner:
now_utc=datetime.now(timezone.utc),
runtime_client_time=runtime_client_time,
extra_context=stage_config.extra_context,
tools=None,
work_memory=work_memory,
),
toolkit=toolkit,
model=tracking_model,
emitter=emitter,
force_tool_on_first_reasoning=requires_tool_evidence,
)
async with self._active_agent_lock:
self._active_agent = agent
@@ -494,6 +481,7 @@ class AgentScopeRunner:
toolkit: Any,
model: TrackingChatModel,
emitter: PipelineStageEmitter | None = None,
force_tool_on_first_reasoning: bool = False,
) -> JsonReActAgent:
return JsonReActAgent(
name=agent_name,
@@ -503,6 +491,7 @@ class AgentScopeRunner:
toolkit=toolkit,
memory=InMemoryMemory(),
emitter=emitter,
force_tool_on_first_reasoning=force_tool_on_first_reasoning,
)
async def _emit_step_event(