feat: send live flow context to AI Assist for full editor awareness
The AI panel now sends the current tree structure (troubleshooting) or steps + intake form (procedural/maintenance) with each message. This gives the AI full visibility into node details, questions, descriptions, options, and intake form fields — not just the node ID. - Backend: add flow_context param to schema, endpoint, and service - Frontend: add getFlowContext callback to useEditorAI hook - TreeEditorPage: passes treeStructure as flow context - ProceduralEditorPage: passes steps + intakeForm as flow context Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -172,6 +172,7 @@ async def post_message(
|
||||
session, data.content, db,
|
||||
action_type=data.action_type or "open_chat",
|
||||
focal_node_id=data.focal_node_id,
|
||||
flow_context=data.flow_context,
|
||||
)
|
||||
except Exception as e:
|
||||
logger.exception("AI chat message failed: %s", e)
|
||||
|
||||
@@ -533,13 +533,33 @@ async def send_message(
|
||||
db: AsyncSession,
|
||||
action_type: str = "open_chat",
|
||||
focal_node_id: str | None = None,
|
||||
flow_context: dict | None = None,
|
||||
) -> tuple[str, Optional[dict], Optional[str], Optional[dict]]:
|
||||
"""Send a user message and get AI response.
|
||||
|
||||
Args:
|
||||
flow_context: Live flow structure from the editor. Contains the current
|
||||
tree_structure (troubleshooting) or steps + intake_form (procedural).
|
||||
This gives the AI full awareness of the flow being edited.
|
||||
|
||||
Returns (ai_content, working_tree_update, new_phase, metadata_update).
|
||||
"""
|
||||
system_prompt = _build_system_prompt(session.flow_type)
|
||||
|
||||
# Inject live flow context so the AI can see current editor state
|
||||
if flow_context:
|
||||
context_json = json.dumps(flow_context, indent=2)
|
||||
system_prompt += (
|
||||
f"\n\nCURRENT FLOW STATE (live from editor):\n{context_json}"
|
||||
)
|
||||
if focal_node_id:
|
||||
focal_node = _find_node_by_id(flow_context, focal_node_id)
|
||||
if focal_node:
|
||||
system_prompt += (
|
||||
f"\n\nFOCAL NODE/STEP (the item being acted on):\n"
|
||||
f"{json.dumps(focal_node, indent=2)}"
|
||||
)
|
||||
|
||||
# Build messages array from conversation history
|
||||
now_iso = datetime.now(timezone.utc).isoformat()
|
||||
history = list(session.conversation_history)
|
||||
|
||||
@@ -43,6 +43,10 @@ class AIChatMessageRequest(BaseModel):
|
||||
default=None,
|
||||
description="ID of the node/step being acted on",
|
||||
)
|
||||
flow_context: Optional[dict[str, Any]] = Field(
|
||||
default=None,
|
||||
description="Live flow structure from the editor (tree structure, steps, intake form)",
|
||||
)
|
||||
|
||||
|
||||
class AIChatImportRequest(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user