| from __future__ import annotations | |
| from typing import Any, Literal, TypedDict | |
| class BIState(TypedDict, total=False): | |
| question: str | |
| next_step: Literal["sql", "analysis", "reflection", "visualization", "end"] | None | |
| plan: dict[str, Any] | None | |
| sql: dict[str, Any] | None | |
| analysis: dict[str, Any] | None | |
| reflection: dict[str, Any] | None | |
| visualization: dict[str, Any] | None | |
| memories: list[dict[str, Any]] | |
| def build_initial_state(question: str, memories: list[dict[str, Any]] | None = None) -> BIState: | |
| return { | |
| "question": question, | |
| "next_step": None, | |
| "plan": None, | |
| "sql": None, | |
| "analysis": None, | |
| "reflection": None, | |
| "visualization": None, | |
| "memories": memories or [], | |
| } | |
| def final_answer(state: BIState) -> dict[str, Any]: | |
| return { | |
| "question": state["question"], | |
| "plan": state.get("plan"), | |
| "sql": state.get("sql"), | |
| "analysis": state.get("analysis"), | |
| "reflection": state.get("reflection"), | |
| "visualization": state.get("visualization"), | |
| "memories": state.get("memories", []), | |
| } | |