| from typing import TypedDict, Optional |
| from dataclasses import dataclass, field |
|
|
|
|
| |
| |
| |
|
|
| @dataclass |
| class Paper: |
| title: str |
| abstract: str |
| year: int |
| citation_count: int |
| paper_id: str |
| authors: list[str] = field(default_factory=list) |
| references: list[str] = field(default_factory=list) |
| doi: str = "" |
| hybrid_score: float = 0.0 |
| source: str = "semantic_scholar" |
|
|
|
|
| @dataclass |
| class WebResult: |
| url: str |
| snippet: str |
| title: str |
| inferred_year: Optional[int] = None |
| hybrid_score: float = 0.0 |
| source: str = "web" |
|
|
|
|
| @dataclass |
| class Claim: |
| text: str |
| source_title: str |
| source_year: int |
| confidence: str |
| flagged: bool = False |
|
|
|
|
| @dataclass |
| class SessionContext: |
| prior_positions: list[str] = field(default_factory=list) |
| flagged_contradictions: list[str] = field(default_factory=list) |
| prior_queries: list[str] = field(default_factory=list) |
|
|
|
|
| @dataclass |
| class SessionUpdate: |
| position: str |
| query: str |
| claim_confidences: list[Claim] = field(default_factory=list) |
| contradictions_found: list[str] = field(default_factory=list) |
|
|
|
|
| |
| |
| |
|
|
| class Verdict: |
| PASS = "PASS" |
| STALE = "STALE" |
| CONTRADICTED = "CONTRADICTED" |
| INSUFFICIENT = "INSUFFICIENT" |
| FORCED_PASS = "FORCED_PASS" |
|
|
|
|
| |
| |
| |
|
|
| class ResearchState(TypedDict): |
| |
| original_query: str |
| session_id: str |
|
|
| |
| session_context: Optional[SessionContext] |
| sub_questions: list[str] |
|
|
| |
| retrieved_papers: list[Paper] |
| citation_graph: dict |
| web_results: list[WebResult] |
|
|
| |
| critic_verdict: str |
| critic_notes: str |
| rewritten_questions: list[str] |
| retry_count: int |
|
|
| |
| synthesized_position: str |
| claim_confidences: list[Claim] |
| session_update: Optional[SessionUpdate] |
| export_md: str |
|
|
| |
| decay_config: str |
| calibration_bin: str |
| latency_ms: float |
| paper_reliability_scores: dict |