feat(chat): fix support for mentioned connectors in new chat input state and runtime context, enhancing query rendering and context management

This commit is contained in:
Anish Sarkar 2026-06-03 22:51:55 +05:30
parent c75a080997
commit e68b3f9532
5 changed files with 62 additions and 3 deletions

View file

@ -62,6 +62,7 @@ async def build_new_chat_input_state(
user_image_data_urls: list[str] | None,
mentioned_document_ids: list[int] | None,
mentioned_folder_ids: list[int] | None,
mentioned_connectors: list[dict[str, Any]] | None,
mentioned_documents: list[dict[str, Any]] | None,
needs_history_bootstrap: bool,
thread_visibility: ChatVisibility,
@ -110,6 +111,7 @@ async def build_new_chat_input_state(
final_query = _render_query_with_context(
agent_user_query=agent_user_query,
mentioned_connectors=mentioned_connectors,
recent_reports=recent_reports,
)
@ -196,11 +198,16 @@ async def _resolve_mentions_for_query(
def _render_query_with_context(
*,
agent_user_query: str,
mentioned_connectors: list[dict[str, Any]] | None,
recent_reports: list[Report],
) -> str:
"""Prepend recent-reports XML block to the user query."""
"""Prepend connector/report XML context blocks to the user query."""
context_parts: list[str] = []
connector_context = _render_mentioned_connectors(mentioned_connectors)
if connector_context:
context_parts.append(connector_context)
if recent_reports:
report_lines: list[str] = []
for r in recent_reports:
@ -225,3 +232,40 @@ def _render_query_with_context(
return f"{context}\n\n<user_query>{agent_user_query}</user_query>"
return agent_user_query
def _render_mentioned_connectors(
mentioned_connectors: list[dict[str, Any]] | None,
) -> str | None:
"""Render selected connector account metadata for connector-backed tools."""
if not mentioned_connectors:
return None
connector_lines: list[str] = []
for connector in mentioned_connectors:
if not isinstance(connector, dict):
continue
connector_id = connector.get("id")
connector_type = connector.get("connector_type") or connector.get(
"document_type"
)
account_name = connector.get("account_name") or connector.get("title")
if connector_id is None or connector_type is None:
continue
connector_lines.append(
f' - connector_id={connector_id}, connector_type="{connector_type}", '
f'account_name="{account_name or ""}"'
)
if not connector_lines:
return None
return (
"<mentioned_connectors>\n"
"The user selected these exact connector accounts with @. "
"These entries are selection metadata, not retrieved connector content. "
"When a connector-backed tool needs an account, use the matching "
"connector_id from this list if the tool supports connector_id:\n"
+ "\n".join(connector_lines)
+ "\n</mentioned_connectors>"
)

View file

@ -124,6 +124,8 @@ async def stream_new_chat(
llm_config_id: int = -1,
mentioned_document_ids: list[int] | None = None,
mentioned_folder_ids: list[int] | None = None,
mentioned_connector_ids: list[int] | None = None,
mentioned_connectors: list[dict[str, Any]] | None = None,
mentioned_documents: list[dict[str, Any]] | None = None,
checkpoint_id: str | None = None,
needs_history_bootstrap: bool = False,
@ -435,6 +437,7 @@ async def stream_new_chat(
user_image_data_urls=user_image_data_urls,
mentioned_document_ids=mentioned_document_ids,
mentioned_folder_ids=mentioned_folder_ids,
mentioned_connectors=mentioned_connectors,
mentioned_documents=mentioned_documents,
needs_history_bootstrap=needs_history_bootstrap,
thread_visibility=visibility,
@ -588,6 +591,8 @@ async def stream_new_chat(
mentioned_document_ids=mentioned_document_ids,
accepted_folder_ids=accepted_folder_ids,
mentioned_folder_ids=mentioned_folder_ids,
mentioned_connector_ids=mentioned_connector_ids,
mentioned_connectors=mentioned_connectors,
request_id=request_id,
turn_id=stream_result.turn_id,
)

View file

@ -8,6 +8,8 @@ mention lists / request ids / turn ids without rebuilding the graph.
from __future__ import annotations
from typing import Any
from app.agents.new_chat.context import SurfSenseContextSchema
@ -17,6 +19,8 @@ def build_new_chat_runtime_context(
mentioned_document_ids: list[int] | None,
accepted_folder_ids: list[int],
mentioned_folder_ids: list[int] | None,
mentioned_connector_ids: list[int] | None,
mentioned_connectors: list[dict[str, Any]] | None,
request_id: str | None,
turn_id: str,
) -> SurfSenseContextSchema:
@ -31,6 +35,8 @@ def build_new_chat_runtime_context(
search_space_id=search_space_id,
mentioned_document_ids=list(mentioned_document_ids or []),
mentioned_folder_ids=list(accepted_folder_ids or mentioned_folder_ids or []),
mentioned_connector_ids=list(mentioned_connector_ids or []),
mentioned_connectors=list(mentioned_connectors or []),
request_id=request_id,
turn_id=turn_id,
)