Files

1 line
15 KiB
JSON

{"repo": "anandarimal/rag--mastery", "files": {"lightrag/examples/lightrag_openai_compatible_demo.py": {"3fa141a89ed6e2f75a63a7142c7ee5f293a1947c": {"t": 1785746640.268227, "n": 7311, "h": "68e41e988fe674d3", "c": "import os\nimport asyncio\nimport inspect\nimport logging\nimport logging.config\nfrom lightrag import LightRAG, QueryParam\nfrom lightrag.llm.openai import openai_complete_if_cache\nfrom lightrag.llm.ollama import ollama_embed\nfrom lightrag.utils import EmbeddingFunc, logger, set_verbose_debug\nfrom lightrag.kg.shared_storage import initialize_pipeline_status\n\nfrom dotenv import load_dotenv\n\nload_dotenv(dotenv_path=\".env\", override=False)\n\nWORKING_DIR = \"./dickens\"\n\n\ndef configure_logging():\n \"\"\"Configure logging for the application\"\"\"\n\n # Reset any existing handlers to ensure clean configuration\n for logger_name in [\"uvicorn\", \"uvicorn.access\", \"uvicorn.error\", \"lightrag\"]:\n logger_instance = logging.getLogger(logger_name)\n logger_instance.handlers = []\n logger_instance.filters = []\n\n # Get log directory path from environment variable or use current directory\n log_dir = os.getenv(\"LOG_DIR\", os.getcwd())\n log_file_path = os.path.abspath(\n os.path.join(log_dir, \"lightrag_compatible_demo.log\")\n )\n\n print(f\"\\nLightRAG compatible demo log file: {log_file_path}\\n\")\n os.makedirs(os.path.dirname(log_dir), exist_ok=True)\n\n # Get log file max size and backup count from environment variables\n log_max_bytes = int(os.getenv(\"LOG_MAX_BYTES\", 10485760)) # Default 10MB\n log_backup_count = int(os.getenv(\"LOG_BACKUP_COUNT\", 5)) # Default 5 backups\n\n logging.config.dictConfig(\n {\n \"version\": 1,\n \"disable_existing_loggers\": False,\n \"formatters\": {\n \"default\": {\n \"format\": \"%(levelname)s: %(message)s\",\n },\n \"detailed\": {\n \"format\": \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\",\n },\n },\n \"handlers\": {\n \"console\": {\n \"formatter\": \"default\",\n \"class\": \"logging.StreamHandler\",\n \"stream\": \"ext://sys.stderr\",\n },\n \"file\": {\n \"formatter\": \"detailed\",\n \"class\": \"logging.handlers.RotatingFileHandler\",\n \"filename\": log_file_path,\n \"maxBytes\": log_max_bytes,\n \"backupCount\": log_backup_count,\n \"encoding\": \"utf-8\",\n },\n },\n \"loggers\": {\n \"lightrag\": {\n \"handlers\": [\"console\", \"file\"],\n \"level\": \"INFO\",\n \"propagate\": False,\n },\n },\n }\n )\n\n # Set the logger level to INFO\n logger.setLevel(logging.INFO)\n # Enable verbose debug if needed\n set_verbose_debug(os.getenv(\"VERBOSE_DEBUG\", \"false\").lower() == \"true\")\n\n\nif not os.path.exists(WORKING_DIR):\n os.mkdir(WORKING_DIR)\n\n\nasync def llm_model_func(\n prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs\n) -> str:\n return await openai_complete_if_cache(\n os.getenv(\"LLM_MODEL\", \"deepseek-chat\"),\n prompt,\n system_prompt=system_prompt,\n history_messages=history_messages,\n api_key=os.getenv(\"LLM_BINDING_API_KEY\") or os.getenv(\"OPENAI_API_KEY\"),\n base_url=os.getenv(\"LLM_BINDING_HOST\", \"https://api.deepseek.com\"),\n **kwargs,\n )\n\n\nasync def print_stream(stream):\n async for chunk in stream:\n if chunk:\n print(chunk, end=\"\", flush=True)\n\n\nasync def initialize_rag():\n rag = LightRAG(\n working_dir=WORKING_DIR,\n llm_model_func=llm_model_func,\n embedding_func=EmbeddingFunc(\n embedding_dim=int(os.getenv(\"EMBEDDING_DIM\", \"1024\")),\n max_token_size=int(os.getenv(\"MAX_EMBED_TOKENS\", \"8192\")),\n func=lambda texts: ollama_embed(\n texts,\n embed_model=os.getenv(\"EMBEDDING_MODEL\", \"bge-m3:latest\"),\n host=os.getenv(\"EMBEDDING_BINDING_HOST\", \"http://localhost:11434\"),\n ),\n ),\n )\n\n await rag.initialize_storages()\n await initialize_pipeline_status()\n\n return rag\n\n\nasync def main():\n try:\n # Clear old data files\n files_to_delete = [\n \"graph_chunk_entity_relation.graphml\",\n \"kv_store_doc_status.json\",\n \"kv_store_full_docs.json\",\n \"kv_store_text_chunks.json\",\n \"vdb_chunks.json\",\n \"vdb_entities.json\",\n \"vdb_relationships.json\",\n ]\n\n for file in files_to_delete:\n file_path = os.path.join(WORKING_DIR, file)\n if os.path.exists(file_path):\n os.remove(file_path)\n print(f\"Deleting old file:: {file_path}\")\n\n # Initialize RAG instance\n rag = await initialize_rag()\n\n # Test embedding function\n test_text = [\"This is a test string for embedding.\"]\n embedding = await rag.embedding_func(test_text)\n embedding_dim = embedding.shape[1]\n print(\"\\n=======================\")\n print(\"Test embedding function\")\n print(\"========================\")\n print(f\"Test dict: {test_text}\")\n print(f\"Detected embedding dimension: {embedding_dim}\\n\\n\")\n\n with open(\"./book.txt\", \"r\", encoding=\"utf-8\") as f:\n await rag.ainsert(f.read())\n\n # Perform naive search\n print(\"\\n=====================\")\n print(\"Query mode: naive\")\n print(\"=====================\")\n resp = await rag.aquery(\n \"What are the top themes in this story?\",\n param=QueryParam(mode=\"naive\", stream=True),\n )\n if inspect.isasyncgen(resp):\n await print_stream(resp)\n else:\n print(resp)\n\n # Perform local search\n print(\"\\n=====================\")\n print(\"Query mode: local\")\n print(\"=====================\")\n resp = await rag.aquery(\n \"What are the top themes in this story?\",\n param=QueryParam(mode=\"local\", stream=True),\n )\n if inspect.isasyncgen(resp):\n await print_stream(resp)\n else:\n print(resp)\n\n # Perform global search\n print(\"\\n=====================\")\n print(\"Query mode: global\")\n print(\"=====================\")\n resp = await rag.aquery(\n \"What are the top themes in this story?\",\n param=QueryParam(mode=\"global\", stream=True),\n )\n if inspect.isasyncgen(resp):\n await print_stream(resp)\n else:\n print(resp)\n\n # Perform hybrid search\n print(\"\\n=====================\")\n print(\"Query mode: hybrid\")\n print(\"=====================\")\n resp = await rag.aquery(\n \"What are the top themes in this story?\",\n param=QueryParam(mode=\"hybrid\", stream=True),\n )\n if inspect.isasyncgen(resp):\n await print_stream(resp)\n else:\n print(resp)\n\n except Exception as e:\n print(f\"An error occurred: {e}\")\n finally:\n if rag:\n await rag.finalize_storages()\n\n\nif __name__ == \"__main__\":\n # Configure logging before running the main function\n configure_logging()\n asyncio.run(main())\n print(\"\\nDone!\")\n"}, "5b574d0c8c9aafcab24e74ab2835b2be4b191fa1": {"t": 1785766515.93037, "n": 7311, "h": "68e41e988fe674d3", "c": "import os\nimport asyncio\nimport inspect\nimport logging\nimport logging.config\nfrom lightrag import LightRAG, QueryParam\nfrom lightrag.llm.openai import openai_complete_if_cache\nfrom lightrag.llm.ollama import ollama_embed\nfrom lightrag.utils import EmbeddingFunc, logger, set_verbose_debug\nfrom lightrag.kg.shared_storage import initialize_pipeline_status\n\nfrom dotenv import load_dotenv\n\nload_dotenv(dotenv_path=\".env\", override=False)\n\nWORKING_DIR = \"./dickens\"\n\n\ndef configure_logging():\n \"\"\"Configure logging for the application\"\"\"\n\n # Reset any existing handlers to ensure clean configuration\n for logger_name in [\"uvicorn\", \"uvicorn.access\", \"uvicorn.error\", \"lightrag\"]:\n logger_instance = logging.getLogger(logger_name)\n logger_instance.handlers = []\n logger_instance.filters = []\n\n # Get log directory path from environment variable or use current directory\n log_dir = os.getenv(\"LOG_DIR\", os.getcwd())\n log_file_path = os.path.abspath(\n os.path.join(log_dir, \"lightrag_compatible_demo.log\")\n )\n\n print(f\"\\nLightRAG compatible demo log file: {log_file_path}\\n\")\n os.makedirs(os.path.dirname(log_dir), exist_ok=True)\n\n # Get log file max size and backup count from environment variables\n log_max_bytes = int(os.getenv(\"LOG_MAX_BYTES\", 10485760)) # Default 10MB\n log_backup_count = int(os.getenv(\"LOG_BACKUP_COUNT\", 5)) # Default 5 backups\n\n logging.config.dictConfig(\n {\n \"version\": 1,\n \"disable_existing_loggers\": False,\n \"formatters\": {\n \"default\": {\n \"format\": \"%(levelname)s: %(message)s\",\n },\n \"detailed\": {\n \"format\": \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\",\n },\n },\n \"handlers\": {\n \"console\": {\n \"formatter\": \"default\",\n \"class\": \"logging.StreamHandler\",\n \"stream\": \"ext://sys.stderr\",\n },\n \"file\": {\n \"formatter\": \"detailed\",\n \"class\": \"logging.handlers.RotatingFileHandler\",\n \"filename\": log_file_path,\n \"maxBytes\": log_max_bytes,\n \"backupCount\": log_backup_count,\n \"encoding\": \"utf-8\",\n },\n },\n \"loggers\": {\n \"lightrag\": {\n \"handlers\": [\"console\", \"file\"],\n \"level\": \"INFO\",\n \"propagate\": False,\n },\n },\n }\n )\n\n # Set the logger level to INFO\n logger.setLevel(logging.INFO)\n # Enable verbose debug if needed\n set_verbose_debug(os.getenv(\"VERBOSE_DEBUG\", \"false\").lower() == \"true\")\n\n\nif not os.path.exists(WORKING_DIR):\n os.mkdir(WORKING_DIR)\n\n\nasync def llm_model_func(\n prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs\n) -> str:\n return await openai_complete_if_cache(\n os.getenv(\"LLM_MODEL\", \"deepseek-chat\"),\n prompt,\n system_prompt=system_prompt,\n history_messages=history_messages,\n api_key=os.getenv(\"LLM_BINDING_API_KEY\") or os.getenv(\"OPENAI_API_KEY\"),\n base_url=os.getenv(\"LLM_BINDING_HOST\", \"https://api.deepseek.com\"),\n **kwargs,\n )\n\n\nasync def print_stream(stream):\n async for chunk in stream:\n if chunk:\n print(chunk, end=\"\", flush=True)\n\n\nasync def initialize_rag():\n rag = LightRAG(\n working_dir=WORKING_DIR,\n llm_model_func=llm_model_func,\n embedding_func=EmbeddingFunc(\n embedding_dim=int(os.getenv(\"EMBEDDING_DIM\", \"1024\")),\n max_token_size=int(os.getenv(\"MAX_EMBED_TOKENS\", \"8192\")),\n func=lambda texts: ollama_embed(\n texts,\n embed_model=os.getenv(\"EMBEDDING_MODEL\", \"bge-m3:latest\"),\n host=os.getenv(\"EMBEDDING_BINDING_HOST\", \"http://localhost:11434\"),\n ),\n ),\n )\n\n await rag.initialize_storages()\n await initialize_pipeline_status()\n\n return rag\n\n\nasync def main():\n try:\n # Clear old data files\n files_to_delete = [\n \"graph_chunk_entity_relation.graphml\",\n \"kv_store_doc_status.json\",\n \"kv_store_full_docs.json\",\n \"kv_store_text_chunks.json\",\n \"vdb_chunks.json\",\n \"vdb_entities.json\",\n \"vdb_relationships.json\",\n ]\n\n for file in files_to_delete:\n file_path = os.path.join(WORKING_DIR, file)\n if os.path.exists(file_path):\n os.remove(file_path)\n print(f\"Deleting old file:: {file_path}\")\n\n # Initialize RAG instance\n rag = await initialize_rag()\n\n # Test embedding function\n test_text = [\"This is a test string for embedding.\"]\n embedding = await rag.embedding_func(test_text)\n embedding_dim = embedding.shape[1]\n print(\"\\n=======================\")\n print(\"Test embedding function\")\n print(\"========================\")\n print(f\"Test dict: {test_text}\")\n print(f\"Detected embedding dimension: {embedding_dim}\\n\\n\")\n\n with open(\"./book.txt\", \"r\", encoding=\"utf-8\") as f:\n await rag.ainsert(f.read())\n\n # Perform naive search\n print(\"\\n=====================\")\n print(\"Query mode: naive\")\n print(\"=====================\")\n resp = await rag.aquery(\n \"What are the top themes in this story?\",\n param=QueryParam(mode=\"naive\", stream=True),\n )\n if inspect.isasyncgen(resp):\n await print_stream(resp)\n else:\n print(resp)\n\n # Perform local search\n print(\"\\n=====================\")\n print(\"Query mode: local\")\n print(\"=====================\")\n resp = await rag.aquery(\n \"What are the top themes in this story?\",\n param=QueryParam(mode=\"local\", stream=True),\n )\n if inspect.isasyncgen(resp):\n await print_stream(resp)\n else:\n print(resp)\n\n # Perform global search\n print(\"\\n=====================\")\n print(\"Query mode: global\")\n print(\"=====================\")\n resp = await rag.aquery(\n \"What are the top themes in this story?\",\n param=QueryParam(mode=\"global\", stream=True),\n )\n if inspect.isasyncgen(resp):\n await print_stream(resp)\n else:\n print(resp)\n\n # Perform hybrid search\n print(\"\\n=====================\")\n print(\"Query mode: hybrid\")\n print(\"=====================\")\n resp = await rag.aquery(\n \"What are the top themes in this story?\",\n param=QueryParam(mode=\"hybrid\", stream=True),\n )\n if inspect.isasyncgen(resp):\n await print_stream(resp)\n else:\n print(resp)\n\n except Exception as e:\n print(f\"An error occurred: {e}\")\n finally:\n if rag:\n await rag.finalize_storages()\n\n\nif __name__ == \"__main__\":\n # Configure logging before running the main function\n configure_logging()\n asyncio.run(main())\n print(\"\\nDone!\")\n"}}}}