z-agent / main.py
ProgramerSalar's picture
fix: track binary files with Git LFS
dc00adb
Raw
History Blame Contribute Delete
3.97 kB
import langchain
langchain.debug = True
import pathlib
from google import genai
from zagent.client import BreakdownClient
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv("API_KEY")
from zagent.client import AnimationClient
def my_progress_tracker(topic_index, iteration, message):
print(f"⏳ [Topic {topic_index} | Attempt {iteration}] {message}")
def main():
print("Hello from z-agent!")
# Initialize Gemini client
gemini_client = genai.Client(api_key=api_key)
# ═══════════════════════════════════════════════════
# Step 1: Break down a PDF into atomic topics
# ═══════════════════════════════════════════════════
breakdown_client = BreakdownClient(gemini_client)
breakdown, _ = breakdown_client.breakdown(
file_path=pathlib.Path("./deepseek_mhc.pdf"),
model="gemini-2.5-flash",
# thinking_level="high"
)
print(f"Document: {breakdown.document_title}")
for i, topic in enumerate(breakdown.topics):
print(f" Topic {i}: {topic.name}")
# ═══════════════════════════════════════════════════
# Step 2: Generate storyboards for each topic
# ═══════════════════════════════════════════════════
storyboards = {}
for topic in breakdown.topics:
storyboard, _ = breakdown_client.storyboard(
topic=topic,
model="gemini-2.5-flash",
# thinking_level="high"
)
storyboards[topic.name] = storyboard
print("==============> [storyboards]", storyboards)
# ═══════════════════════════════════════════════════
# Step 3: Animate storyboards with the Manim agent
# ═══════════════════════════════════════════════════
from langchain_google_genai import ChatGoogleGenerativeAI
langchain_model = ChatGoogleGenerativeAI(
model="gemini-2.5-flash",
temperature=1.0,
api_key=api_key
)
animation_client = AnimationClient(
langchain_model=langchain_model,
agent_workspace_path="./examples/agent_workspace/"
)
# ---------------------------------------------------------------------------------------------------------
# # Dynamically search for the "Multi-Head" topic
# target_index = -1
# target_topic_name = ""
# for i, topic in enumerate(breakdown.topics):
# if "Multi-Head" in topic.name:
# target_index = i
# target_topic_name = topic.name
# break # Stop searching once we find it
# # Safety check in case the LLM didn't generate that specific topic this time
# if target_index == -1:
# print("❌ Error: Could not find a topic containing 'Multi-Head' in this run.")
# return # Exit the program gracefully
# print(f"\n🎯 Found target at index {target_index}: {target_topic_name}")
target_index = 4
target_topic_name = breakdown.topics[target_index].name
# Animate a single topic
result = animation_client.animate_single(
breakdown=breakdown,
storyboard=storyboards[target_topic_name],
topic_index=target_index,
max_iterations=3,
on_progress=my_progress_tracker
)
if result.success:
print(f"Video saved to: {result.video_path}")
else:
print(f"Failed: {result.error_message}")
if __name__ == "__main__":
main()