Spaces:
Paused
Paused
File size: 4,835 Bytes
fa8d021 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | """
Chat functionality for the Dialectic API.
Provides the agentic_chat function for answering queries about peers
using the DialecticAgent.
"""
import logging
from collections.abc import AsyncIterator
from src import crud, schemas
from src.config import ReasoningLevel
from src.dependencies import tracked_db
from src.dialectic.core import DialecticAgent
from src.utils.config_helpers import get_configuration
logger = logging.getLogger(__name__)
async def agentic_chat(
workspace_name: str,
session_name: str | None,
query: str,
observer: str,
observed: str,
reasoning_level: ReasoningLevel = "low",
) -> str:
"""
Answer a query about a peer using the agentic dialectic.
Args:
workspace_name: Workspace identifier
session_name: Session identifier (may be None for global queries)
query: The question to answer about the peer
observer: The peer making the query
observed: The peer being queried about
reasoning_level: Level of reasoning to apply
Returns:
The synthesized answer string
"""
# Short-lived DB session for validation + config
async with tracked_db("dialectic.preflight") as db:
await crud.get_peer(db, workspace_name, schemas.PeerCreate(name=observer))
if observer != observed:
await crud.get_peer(db, workspace_name, schemas.PeerCreate(name=observed))
session = None
if session_name:
session = await crud.get_session(
db, workspace_name=workspace_name, session_name=session_name
)
workspace = await crud.get_workspace(db, workspace_name=workspace_name)
configuration = get_configuration(None, session, workspace)
observer_peer_card = None
observed_peer_card = None
if configuration.peer_card.use:
observer_peer_card = await crud.get_peer_card(
db, workspace_name, observer=observer, observed=observer
)
if observer != observed:
observed_peer_card = await crud.get_peer_card(
db, workspace_name, observer=observer, observed=observed
)
# DB session closed — agent runs without holding a connection
agent = DialecticAgent(
workspace_name=workspace_name,
session_name=session_name,
observer=observer,
observed=observed,
observer_peer_card=observer_peer_card,
observed_peer_card=observed_peer_card,
reasoning_level=reasoning_level,
)
return await agent.answer(query)
async def agentic_chat_stream(
workspace_name: str,
session_name: str | None,
query: str,
observer: str,
observed: str,
reasoning_level: ReasoningLevel = "low",
) -> AsyncIterator[str]:
"""
Stream an answer to a query about a peer using the agentic dialectic.
Args:
workspace_name: Workspace identifier
session_name: Session identifier (may be None for global queries)
query: The question to answer about the peer
observer: The peer making the query
observed: The peer being queried about
reasoning_level: Level of reasoning to apply
Yields:
Chunks of the response text as they are generated
"""
# Short-lived DB session for validation + config
async with tracked_db("dialectic.preflight") as db:
await crud.get_peer(db, workspace_name, schemas.PeerCreate(name=observer))
if observer != observed:
await crud.get_peer(db, workspace_name, schemas.PeerCreate(name=observed))
session = None
if session_name:
session = await crud.get_session(
db, workspace_name=workspace_name, session_name=session_name
)
workspace = await crud.get_workspace(db, workspace_name=workspace_name)
configuration = get_configuration(None, session, workspace)
observer_peer_card = None
observed_peer_card = None
if configuration.peer_card.use:
observer_peer_card = await crud.get_peer_card(
db, workspace_name, observer=observer, observed=observer
)
if observer != observed:
observed_peer_card = await crud.get_peer_card(
db, workspace_name, observer=observer, observed=observed
)
# DB session closed — agent streams without holding a connection
agent = DialecticAgent(
workspace_name=workspace_name,
session_name=session_name,
observer=observer,
observed=observed,
observer_peer_card=observer_peer_card,
observed_peer_card=observed_peer_card,
reasoning_level=reasoning_level,
)
async for chunk in agent.answer_stream(query):
yield chunk
|