import argparse import asyncio import logging import os from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.ui import Console from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_ext.tools.graphrag import ( GlobalSearchTool, LocalSearchTool, ) def download_sample_data(input_dir: str) -> None: import requests from pathlib import Path url = "https://www.gutenberg.org/files/1661/1661-0.txt" file_path = Path(input_dir) / "sherlock_book.txt" try: response = requests.get(url, timeout=30) response.raise_for_status() with open(file_path, 'w', encoding='utf-8') as f: f.write(response.text) print(f"✅ Successfully downloaded to: {file_path}") except requests.exceptions.RequestException as e: print(f"❌ Error downloading file: {e}") except IOError as e: print(f"❌ Error saving file: {e}") async def main() -> None: # Check if OPENAI_API_KEY is set api_key = os.environ.get("OPENAI_API_KEY") if not api_key: print("Error: OPENAI_API_KEY environment variable is not set!") print("Please run: export OPENAI_API_KEY='your-api-key-here'") return # create input directory if it doesn't exist and download sample data if not present input_dir = "input" if not os.path.exists(input_dir): os.makedirs(input_dir) print(f"Created input directory: {input_dir}") sherlock_path = os.path.join(input_dir, "sherlock_book.txt") if not os.path.exists(sherlock_path): download_sample_data(input_dir) else: print(f"Sample data already exists: {sherlock_path}") # Initialize the model client model_client = OpenAIChatCompletionClient(model="gpt-4o-mini", api_key=api_key) # Set up global search tool from pathlib import Path global_tool = GlobalSearchTool.from_settings(root_dir=Path("./"), config_filepath=Path("./settings.yaml")) local_tool = LocalSearchTool.from_settings(root_dir=Path("./"), config_filepath=Path("./settings.yaml")) # Create assistant agent with both search tools assistant_agent = AssistantAgent( name="search_assistant", tools=[global_tool, local_tool], model_client=model_client, system_message=( "You are a tool selector AI assistant using the GraphRAG framework. " "Your primary task is to determine the appropriate search tool to call based on the user's query. " "For specific, detailed information about particular entities or relationships, call the 'local_search' function. " "For broader, abstract questions requiring a comprehensive understanding of the dataset, call the 'global_search' function. " "Do not attempt to answer the query directly; focus solely on selecting and calling the correct function." ), ) # Run a sample query query = "What does the station-master say about Dr. Becher?" print(f"\nQuery: {query}") await Console(assistant_agent.run_stream(task=query)) await model_client.close() if __name__ == "__main__": parser = argparse.ArgumentParser(description="Run a GraphRAG search with an agent.") parser.add_argument("--verbose", action="store_true", help="Enable verbose logging.") args = parser.parse_args() if args.verbose: logging.basicConfig(level=logging.WARNING) logging.getLogger("autogen_core").setLevel(logging.DEBUG) handler = logging.FileHandler("graphrag_search.log") logging.getLogger("autogen_core").addHandler(handler) asyncio.run(main())