fix: support vision prompt modes

This commit is contained in:
Xin Wang
2026-08-12 19:13:04 +08:00
parent 09b07751b6
commit 94a02d7e2b
29 changed files with 676 additions and 439 deletions
+3 -2
View File
@@ -49,7 +49,7 @@ class WorkflowAgentStage:
if stage.vision_enabled:
stage_prompt = (
f"{stage_prompt}\n\n[视觉能力]\n"
f"{vision_system_hint(stage.vision_focus_prompt)}"
f"{vision_system_hint(stage.vision_prompt_mode, stage.vision_prompt)}"
)
instruction = (
EDGE_TOOL_STAGE_INSTRUCTION
@@ -112,7 +112,8 @@ class WorkflowAgentStage:
{
"enabled": stage.vision_enabled,
"vision_model_resource_id": stage.vision_model_resource_id,
"vision_focus_prompt": stage.vision_focus_prompt,
"vision_prompt_mode": stage.vision_prompt_mode,
"vision_prompt": stage.vision_prompt,
"llm_resource_id": stage.llm_resource_id,
}
)
+21 -14
View File
@@ -34,8 +34,9 @@ from services.vision import (
VISION_TOOL_NAME,
analyze_image_with_vision_model,
config_with_vision_resource,
resolve_vision_question,
vision_system_hint,
vision_tool_description,
vision_tool_schema_parts,
)
from services.workflow.agent import EDGE_TOOL_STAGE_INSTRUCTION
from services.workflow.models import WorkflowRuntimeState, WorkflowStatus
@@ -414,7 +415,10 @@ class WorkflowRealtimeController:
f"[工作流执行规则]\n{EDGE_TOOL_STAGE_INSTRUCTION}"
)
if stage.vision_enabled:
prompt = f"{prompt}\n{vision_system_hint(stage.vision_focus_prompt)}"
prompt = (
f"{prompt}\n"
f"{vision_system_hint(stage.vision_prompt_mode, stage.vision_prompt)}"
)
return prompt
def _build_agent_tools(self, node_id: str) -> list[RealtimeTool]:
@@ -573,10 +577,15 @@ class WorkflowRealtimeController:
{"status": "stale", "message": "当前 Agent 已经切换。"},
continue_response=False,
)
question = str(arguments.get("question") or "").strip()
if not question:
try:
question = resolve_vision_question(
stage.vision_prompt_mode,
stage.vision_prompt,
arguments,
)
except ValueError as exc:
return RealtimeToolResult(
{"status": "error", "message": "视觉问题为空"}
{"status": "error", "message": str(exc)}
)
if self._runtime.capture_image is None:
return RealtimeToolResult(
@@ -605,7 +614,6 @@ class WorkflowRealtimeController:
try:
if vision_cfg is not None:
vision_cfg.vision_focus_prompt = stage.vision_focus_prompt
observation = await analyze_image_with_vision_model(
vision_cfg,
frame,
@@ -634,17 +642,16 @@ class WorkflowRealtimeController:
}
)
description, properties, required = vision_tool_schema_parts(
stage.vision_prompt_mode,
stage.vision_prompt,
)
return (
RealtimeTool(
name=VISION_TOOL_NAME,
description=vision_tool_description(stage.vision_focus_prompt),
properties={
"question": {
"type": "string",
"description": "需要根据当前画面判断的具体问题",
}
},
required=("question",),
description=description,
properties=properties,
required=tuple(required),
),
handler,
)