Spaces:
Sleeping
Sleeping
| """ | |
| echo/smoke_test.py | |
| ------------------ | |
| Runs the FULL agentic pipeline with MockLLM + mock tools β no GPU, no ML deps. | |
| Proves Curator/Screenwriter/Verifier/orchestrator/tree/tools all interoperate. | |
| Run: python -m echo.smoke_test | |
| """ | |
| from __future__ import annotations | |
| from .llm.client import MockLLM | |
| from .tools.research import MockResearch | |
| from .tools.voice import MockVoice | |
| from .core.orchestrator import Orchestrator | |
| def main(): | |
| print("=" * 60) | |
| print("The Echo β agentic pipeline smoke test (no ML deps)") | |
| print("=" * 60) | |
| llm = MockLLM(seed=7) | |
| orch = Orchestrator(llm, MockResearch(), MockVoice(), out_dir="/tmp/echo_out") | |
| # 1. seed the tree | |
| seed = "I left Brazil to study abroad instead of staying" | |
| root = orch.seed(seed, base_age=24) | |
| print(f"\n[1] Seed: {seed!r}") | |
| print(f" Root life: {root.facts.constraints_text()}") | |
| print(f" Voice line: {root.voice_line!r}") | |
| print(f" Audio: {root.voice_audio_path}") | |
| print(f" Planned forks: {root.pending_forks}") | |
| # 2. explore several branches (simulate the user navigating the tree) | |
| print("\n[2] Exploring branches...") | |
| cur = root | |
| for step in range(4): | |
| if not cur.pending_forks: | |
| break | |
| child = orch.choose_fork(cur.node_id, fork_index=step % 2, years=5) | |
| print(f" depth {child.depth}: chose {child.divergence!r}") | |
| print(f" -> {child.facts.constraints_text()}") | |
| print(f" tone: {child.tone.dominant_feeling} " | |
| f"(valence {child.tone.valence}, " | |
| f"{'gold' if child.tone.is_flourishing else 'dark'})") | |
| cur = child | |
| # 3. branch into a second direction from root | |
| print("\n[3] Branching the OTHER way from root...") | |
| other = orch.choose_fork(root.node_id, fork_index=1, years=8) | |
| print(f" depth {other.depth}: {other.divergence!r}") | |
| print(f" -> {other.facts.constraints_text()}") | |
| # 4. tree + telemetry | |
| g = orch.graph() | |
| print(f"\n[4] Tree: {len(g['nodes'])} nodes, {len(g['edges'])} edges, " | |
| f"max depth {orch.tree.max_depth}") | |
| print(f" Regeneration rate: {orch.stats.regen_rate:.0%} " | |
| f"({orch.stats.regenerations} regens / " | |
| f"{orch.stats.nodes_grown} grown)") | |
| # 5. closing artifact | |
| print(f"\n[5] Final map:\n {orch.final_map_summary()}") | |
| # 6. verify graph serialization (what Gradio will consume) | |
| assert all("valence" in n for n in g["nodes"]), "graph nodes well-formed" | |
| print(f"\n[6] Graph serialization OK β ready for the front-end.") | |
| print("\n" + "=" * 60) | |
| print("ALL STAGES PASSED β (agentic loop verified)") | |
| print("=" * 60) | |
| if __name__ == "__main__": | |
| main() | |