from __future__ import annotations import argparse import asyncio import sys from pathlib import Path from dotenv import load_dotenv from llama_agent_skills.agent import create_agent, run_agent from llama_agent_skills.config import Config from llama_agent_skills.registry import SkillRegistry def _parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="LlamaIndex Agent with SKILL support") parser.add_argument( "--skill-dir", type=Path, action="append", default=None, help="Path to a skill directory (can be specified multiple times)", ) parser.add_argument("--model", type=str, default=None, help="LLM model name") return parser.parse_args() async def _run_interactive(config: Config, registry: SkillRegistry) -> None: skills = registry.list_skills() agent = create_agent( skills=skills, model=config.llm_model, api_key=config.llm_api_key, base_url=config.llm_base_url or None, base_system_prompt=config.base_system_prompt, ) loaded_names = [s.name for s in skills] print(f"Agent ready. Loaded {len(skills)} skill(s): {loaded_names}") print("Type 'quit' or 'exit' to stop.\n") while True: try: user_input = input("You: ").strip() except (EOFError, KeyboardInterrupt): print("\nBye!") break if not user_input: continue if user_input.lower() in ("quit", "exit"): print("Bye!") break response = await run_agent(agent, user_input) print(f"Agent: {response}\n") def main() -> None: args = _parse_args() load_dotenv() config = Config.from_env() if args.model: config = Config( llm_api_key=config.llm_api_key, llm_base_url=config.llm_base_url, llm_model=args.model, skill_directories=config.skill_directories, base_system_prompt=config.base_system_prompt, ) registry = SkillRegistry() skill_dirs = args.skill_dir or config.skill_directories for skill_dir in skill_dirs: if skill_dir.is_dir(): registry.load_from_directory(skill_dir) else: print(f"Warning: skill directory not found: {skill_dir}", file=sys.stderr) asyncio.run(_run_interactive(config, registry))