veriscite / tests /test_full_graph_live.py
minoola's picture
Upload 51 files
5db2259 verified
Raw
History Blame Contribute Delete
2.6 kB
"""Full graph test β€” runs the actual compiled LangGraph (build_graph()),
not individual node functions. First test of LangGraph's own conditional
edges, the multi-claim loop, and build_report's aggregation.
Claim/evidence choices, for later documentation:
1. "Attention... without relying on recurrence" / Vaswani et al. 2017 β€”
reused from test_chain_live.py, already confirmed to produce a clean,
correct SUPPORT. Chosen here to check the loop can process a claim
end-to-end when NO escalation is needed.
2. A claim about training-data requirements, citing the same paper β€” the
Vaswani abstract does not discuss data efficiency at all, so this is
expected to land on NOT_ENOUGH_INFO. Chosen to exercise a second,
different verdict type in the same run (not to force disagreement β€”
escalate's retry/adjudicator logic was already confirmed separately
in test_escalate_live.py).
Requires GROQ_API_KEY and S2_API_KEY set in your environment.
Run from the veriscite/ root:
python -m tests.test_full_graph_live
"""
import asyncio
import json
from app.graph.build import build_graph
SAMPLE_TEXT = """
Body:
Attention mechanisms allow transformer models to capture long-range
dependencies in sequential data without relying on recurrence [1].
Transformers require substantially more labeled training data than
recurrent architectures to reach comparable accuracy [1].
References:
[1] Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez,
A. N., Kaiser, L., & Polosukhin, I. (2017). Attention is all you need.
In Advances in Neural Information Processing Systems (NeurIPS 2017).
"""
async def main():
graph = build_graph()
initial_state = {
"source_text": SAMPLE_TEXT,
"claims": [],
"audits": [],
"current_index": 0,
"report": None,
}
final_state = await graph.ainvoke(initial_state)
report = final_state["report"]
print("REPORT SUMMARY:")
print(" n_claims:", report["n_claims"])
print(" initial_agreement_rate:", report["initial_agreement_rate"])
print(" n_escalated:", report["n_escalated"])
print(" n_resolved_by_retry:", report["n_resolved_by_retry"])
print(" n_resolved_by_adjudicator:", report["n_resolved_by_adjudicator"])
print()
for i, audit in enumerate(report["claims"], 1):
print(f"CLAIM {i}: {audit['claim_citation']['claim']}")
print(f" final_verdict: {audit['final_verdict']}")
print(f" escalated: {audit['escalated']}")
print()
if __name__ == "__main__":
asyncio.run(main())