the-echo / echo /smoke_test.py
frankyy03's picture
Deploy The Echo (MockLLM path): Gradio app + echo package
897d5bd verified
Raw
History Blame Contribute Delete
2.72 kB
"""
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()