| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- """
- 内容寻找 Agent
- 使用示例:
- python run.py
- """
- import asyncio
- import logging
- import sys
- import os
- from pathlib import Path
- sys.path.insert(0, str(Path(__file__).parent.parent.parent))
- from dotenv import load_dotenv
- load_dotenv()
- from agent import (
- AgentRunner,
- RunConfig,
- FileSystemTraceStore,
- Trace,
- Message,
- )
- from agent.llm import create_openrouter_llm_call
- from agent.llm.prompts import SimplePrompt
- # 导入工具(确保工具被注册)
- from tools import (
- douyin_search,
- douyin_user_videos,
- get_video_audience_profile,
- get_user_fans_profile,
- )
- # 配置日志
- log_dir = Path(__file__).parent / '.cache'
- log_dir.mkdir(exist_ok=True)
- logging.basicConfig(
- level=logging.INFO,
- format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
- handlers=[
- logging.FileHandler(log_dir / 'agent.log'),
- logging.StreamHandler()
- ]
- )
- logger = logging.getLogger(__name__)
- async def main():
- print("\n" + "=" * 60)
- print("内容寻找 Agent")
- print("=" * 60)
- print("开始执行...\n")
- # 加载 prompt
- prompt_path = Path(__file__).parent / "content_finder.prompt"
- prompt = SimplePrompt(prompt_path)
- # 构建消息
- messages = prompt.build_messages()
- # 初始化
- api_key = os.getenv("OPEN_ROUTER_API_KEY")
- if not api_key:
- raise ValueError("OPEN_ROUTER_API_KEY 未设置,请在 .env 文件中配置")
- model = os.getenv("MODEL", f"anthropic/claude-{prompt.config.get('model', 'sonnet-4.6')}")
- temperature = float(prompt.config.get("temperature", 0.3))
- max_iterations = int(os.getenv("MAX_ITERATIONS", "30"))
- trace_dir = os.getenv("TRACE_DIR", ".cache/traces")
- skills_dir = str(Path(__file__).parent / "skills")
- Path(trace_dir).mkdir(parents=True, exist_ok=True)
- store = FileSystemTraceStore(base_path=trace_dir)
- runner = AgentRunner(
- llm_call=create_openrouter_llm_call(model=model),
- trace_store=store,
- skills_dir=skills_dir,
- )
- config = RunConfig(
- model=model,
- temperature=temperature,
- max_iterations=max_iterations,
- )
- # 执行
- try:
- async for item in runner.run(messages=messages, config=config):
- if isinstance(item, Trace):
- if item.status == "completed":
- print(f"\n[完成] trace_id={item.trace_id}")
- elif item.status == "failed":
- print(f"\n[失败] {item.error_message}")
- elif isinstance(item, Message):
- if item.role == "assistant":
- content = item.content
- if isinstance(content, dict):
- text = content.get("text", "")
- tool_calls = content.get("tool_calls")
- if text and not tool_calls:
- print(f"\n{text}")
- elif text:
- print(f"[思考] {text[:100]}..." if len(text) > 100 else f"[思考] {text}")
- if tool_calls:
- for tc in tool_calls:
- tool_name = tc.get("function", {}).get("name", "unknown")
- print(f"[工具] {tool_name}")
- elif isinstance(content, str) and content:
- print(f"\n{content}")
- elif item.role == "tool":
- content = item.content
- if isinstance(content, dict):
- tool_name = content.get("tool_name", "unknown")
- print(f"[结果] {tool_name} ✓")
- except KeyboardInterrupt:
- print("\n用户中断")
- except Exception as e:
- logger.error(f"执行失败: {e}", exc_info=True)
- print(f"\n执行失败: {e}")
- sys.exit(1)
- if __name__ == "__main__":
- asyncio.run(main())
|