mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 00:16:23 +02:00
Refactor agent provenance so that the decision (thought + tool selection) and the result (observation) are separate DAG entities: Question ← Analysis+ToolUse ← Observation ← ... ← Conclusion Analysis gains tg:ToolUse as a mixin RDF type and is emitted before tool execution via an on_action callback in react(). This ensures sub-traces (e.g. GraphRAG) appear after their parent Analysis in the streaming event order. Observation becomes a standalone prov:Entity with tg:Observation type, emitted after tool execution. The linear DAG chain runs through Observation — subsequent iterations and the Conclusion derive from it, not from the Analysis. message_id is populated on streaming AgentResponse for thought and observation chunks, using the provenance URI of the entity being built. This lets clients group streamed chunks by entity. Wire changes: - provenance/agent.py: Add ToolUse type, new agent_observation_triples(), remove observation from iteration - agent_manager.py: Add on_action callback between reason() and tool execution - orchestrator/pattern_base.py: Split emit, wire message_id, chain through observation URIs - orchestrator/react_pattern.py: Emit Analysis via on_action before tool runs - agent/react/service.py: Same for non-orchestrator path - api/explainability.py: New Observation class, updated dispatch and chain walker - api/types.py: Add message_id to AgentThought/AgentObservation - cli: Render Observation separately, [analysis: tool] labels
53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
from dataclasses import dataclass
|
|
from ..core.topic import topic
|
|
from ..core.primitives import Error, Term
|
|
|
|
############################################################################
|
|
|
|
# Graph RAG text retrieval
|
|
|
|
@dataclass
|
|
class GraphRagQuery:
|
|
query: str = ""
|
|
user: str = ""
|
|
collection: str = ""
|
|
entity_limit: int = 0
|
|
triple_limit: int = 0
|
|
max_subgraph_size: int = 0
|
|
max_path_length: int = 0
|
|
edge_score_limit: int = 0
|
|
edge_limit: int = 0
|
|
streaming: bool = False
|
|
parent_uri: str = ""
|
|
|
|
@dataclass
|
|
class GraphRagResponse:
|
|
error: Error | None = None
|
|
response: str = ""
|
|
end_of_stream: bool = False # LLM response stream complete
|
|
explain_id: str | None = None # Single explain URI (announced as created)
|
|
explain_graph: str | None = None # Named graph where explain was stored (e.g., urn:graph:retrieval)
|
|
message_type: str = "" # "chunk" or "explain"
|
|
end_of_session: bool = False # Entire session complete
|
|
|
|
############################################################################
|
|
|
|
# Document RAG text retrieval
|
|
|
|
@dataclass
|
|
class DocumentRagQuery:
|
|
query: str = ""
|
|
user: str = ""
|
|
collection: str = ""
|
|
doc_limit: int = 0
|
|
streaming: bool = False
|
|
|
|
@dataclass
|
|
class DocumentRagResponse:
|
|
error: Error | None = None
|
|
response: str | None = ""
|
|
end_of_stream: bool = False # LLM response stream complete
|
|
explain_id: str | None = None # Single explain URI (announced as created)
|
|
explain_graph: str | None = None # Named graph where explain was stored (e.g., urn:graph:retrieval)
|
|
message_type: str = "" # "chunk" or "explain"
|
|
end_of_session: bool = False # Entire session complete
|