mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-04-25 11:18:22 +00:00
* feat: add optional prompt-toolkit support to debug.py Use PromptSession.prompt_async() for arrow-key navigation and input history when prompt-toolkit is available, falling back to plain input() with a helpful install tip otherwise. Made-with: Cursor * fix: handle EOFError gracefully in debug.py Catch EOFError alongside KeyboardInterrupt so that Ctrl-D exits cleanly instead of printing a traceback. Made-with: Cursor
111 lines
3.0 KiB
Python
111 lines
3.0 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Debug script for lead_agent.
|
|
Run this file directly in VS Code with breakpoints.
|
|
|
|
Requirements:
|
|
Run with `uv run` from the backend/ directory so that the uv workspace
|
|
resolves deerflow-harness and app packages correctly:
|
|
|
|
cd backend && PYTHONPATH=. uv run python debug.py
|
|
|
|
Usage:
|
|
1. Set breakpoints in agent.py or other files
|
|
2. Press F5 or use "Run and Debug" panel
|
|
3. Input messages in the terminal to interact with the agent
|
|
"""
|
|
|
|
import asyncio
|
|
import logging
|
|
|
|
from dotenv import load_dotenv
|
|
from langchain_core.messages import HumanMessage
|
|
from langgraph.runtime import Runtime
|
|
|
|
from deerflow.agents import make_lead_agent
|
|
|
|
try:
|
|
from prompt_toolkit import PromptSession
|
|
from prompt_toolkit.history import InMemoryHistory
|
|
|
|
_HAS_PROMPT_TOOLKIT = True
|
|
except ImportError:
|
|
_HAS_PROMPT_TOOLKIT = False
|
|
|
|
load_dotenv()
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
datefmt="%Y-%m-%d %H:%M:%S",
|
|
)
|
|
|
|
|
|
async def main():
|
|
# Initialize MCP tools at startup
|
|
try:
|
|
from deerflow.mcp import initialize_mcp_tools
|
|
|
|
await initialize_mcp_tools()
|
|
except Exception as e:
|
|
print(f"Warning: Failed to initialize MCP tools: {e}")
|
|
|
|
# Create agent with default config
|
|
config = {
|
|
"configurable": {
|
|
"thread_id": "debug-thread-001",
|
|
"thinking_enabled": True,
|
|
"is_plan_mode": True,
|
|
# Uncomment to use a specific model
|
|
"model_name": "kimi-k2.5",
|
|
}
|
|
}
|
|
|
|
runtime = Runtime(context={"thread_id": config["configurable"]["thread_id"]})
|
|
config["configurable"]["__pregel_runtime"] = runtime
|
|
|
|
agent = make_lead_agent(config)
|
|
|
|
session = PromptSession(history=InMemoryHistory()) if _HAS_PROMPT_TOOLKIT else None
|
|
|
|
print("=" * 50)
|
|
print("Lead Agent Debug Mode")
|
|
print("Type 'quit' or 'exit' to stop")
|
|
if not _HAS_PROMPT_TOOLKIT:
|
|
print("Tip: `uv sync --group dev` to enable arrow-key & history support")
|
|
print("=" * 50)
|
|
|
|
while True:
|
|
try:
|
|
if session:
|
|
user_input = (await session.prompt_async("\nYou: ")).strip()
|
|
else:
|
|
user_input = input("\nYou: ").strip()
|
|
if not user_input:
|
|
continue
|
|
if user_input.lower() in ("quit", "exit"):
|
|
print("Goodbye!")
|
|
break
|
|
|
|
# Invoke the agent
|
|
state = {"messages": [HumanMessage(content=user_input)]}
|
|
result = await agent.ainvoke(state, config=config)
|
|
|
|
# Print the response
|
|
if result.get("messages"):
|
|
last_message = result["messages"][-1]
|
|
print(f"\nAgent: {last_message.content}")
|
|
|
|
except (KeyboardInterrupt, EOFError):
|
|
print("\nGoodbye!")
|
|
break
|
|
except Exception as e:
|
|
print(f"\nError: {e}")
|
|
import traceback
|
|
|
|
traceback.print_exc()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|