Spaces:
Build error
Build error
| from rdflib import Graph, Namespace, URIRef, Literal | |
| from typing import Dict, List, Optional | |
| from langgraph.graph import StateGraph | |
| from langchain.prompts import ChatPromptTemplate | |
| import json | |
| from dotenv import load_dotenv | |
| import os | |
| from dataclasses import dataclass | |
| from langchain_community.chat_models import ChatOllama | |
| from langchain_groq import ChatGroq | |
| import logging | |
| # Import the DrugInteractionAnalyzer | |
| from analyzers import DrugInteractionAnalyzer | |
| # Load environment variables | |
| load_dotenv() | |
| # Configure logging | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format='%(asctime)s [%(levelname)s] %(message)s', | |
| handlers=[ | |
| logging.FileHandler("app.log"), | |
| logging.StreamHandler() | |
| ] | |
| ) | |
| # Validating API key | |
| GROQ_API_KEY = os.getenv("GROQ_API_KEY") | |
| if not GROQ_API_KEY: | |
| logging.error("GROQ_API_KEY not found in environment variables. Please add it to your .env file.") | |
| raise ValueError("GROQ_API_KEY not found in environment variables. Please add it to your .env file.") | |
| class GraphState: | |
| """State type for the graph.""" | |
| input: str | |
| query: Optional[str] = None | |
| ontology_results: Optional[str] = None | |
| response: Optional[str] = None | |
| class OntologyAgent: | |
| def __init__(self, owl_file_path: str): | |
| """Initialize the OntologyAgent with an OWL file.""" | |
| self.g = Graph() | |
| try: | |
| self.g.parse(owl_file_path, format="xml") | |
| self.ns = Namespace("http://www.example.org/DrugInteraction.owl#") | |
| logging.info(f"Ontology loaded successfully from {owl_file_path}") | |
| except Exception as e: | |
| logging.error(f"Failed to load ontology file: {e}") | |
| raise ValueError(f"Failed to load ontology file: {e}") | |
| def create_agent_graph(owl_file_path: str) -> StateGraph: | |
| """Create a processing graph for drug interaction analysis using separate agents.""" | |
| analyzer = DrugInteractionAnalyzer(owl_file_path) | |
| def user_input_node(state: GraphState) -> Dict[str, str]: | |
| logging.info("Processing user input.") | |
| return {"query": state.input} | |
| def ontology_query_node(state: GraphState) -> Dict[str, str]: | |
| try: | |
| logging.info("Executing ontology queries.") | |
| drug_names = [d.strip() for d in state.input.split(",")] | |
| results = analyzer.analyze_drugs(drug_names) | |
| logging.info(f"Ontology query results: {results}") | |
| return {"ontology_results": json.dumps(results, indent=2)} | |
| except Exception as e: | |
| logging.warning(f"Ontology query failed: {e}") | |
| return {"ontology_results": json.dumps({"error": str(e)})} | |
| def llm_processing_node(state: GraphState) -> Dict[str, str]: | |
| template = """ | |
| Based on the drug interaction analysis results: | |
| {ontology_results} | |
| Please provide a comprehensive summary of: | |
| 1. Direct interactions between the drugs | |
| 2. Potential conflicts | |
| 3. Similar drug alternatives | |
| 4. Recommended alternatives if conflicts exist | |
| If no results were found, please indicate this clearly. | |
| Format the response in a clear, structured manner. | |
| """ | |
| prompt = ChatPromptTemplate.from_template(template) | |
| try: | |
| llm = ChatGroq( | |
| model_name="llama3-groq-70b-8192-tool-use-preview", | |
| api_key=GROQ_API_KEY, | |
| temperature=0.7 | |
| ) | |
| logging.info("LLM initialized successfully.") | |
| except Exception as e: | |
| logging.error(f"Error initializing LLM: {e}") | |
| return {"response": f"Error initializing LLM: {str(e)}"} | |
| chain = prompt | llm | |
| try: | |
| response = chain.invoke({ | |
| "ontology_results": state.ontology_results | |
| }) | |
| logging.info("LLM processing completed successfully.") | |
| return {"response": response.content} | |
| except Exception as e: | |
| logging.error(f"Error processing results with LLM: {e}") | |
| return {"response": f"Error processing results: {str(e)}"} | |
| # Create and configure the graph | |
| workflow = StateGraph(GraphState) | |
| workflow.add_node("input_processor", user_input_node) | |
| workflow.add_node("ontology_query", ontology_query_node) | |
| workflow.add_node("llm_processing", llm_processing_node) | |
| workflow.add_edge("input_processor", "ontology_query") | |
| workflow.add_edge("ontology_query", "llm_processing") | |
| workflow.set_entry_point("input_processor") | |
| logging.info("Agent graph created and configured successfully.") | |
| return workflow.compile() | |
| def main(): | |
| """Main function to run the drug interaction analysis.""" | |
| try: | |
| logging.info("Starting Drug Interaction Analysis System.") | |
| print("Drug Interaction Analysis System") | |
| print("Enter drug names separated by commas (e.g., Aspirin, Warfarin):") | |
| user_input = input("Drugs: ").strip() | |
| if not user_input: | |
| logging.warning("No drug names provided. Exiting.") | |
| print("No drug names provided. Exiting.") | |
| return | |
| owl_file_path = os.path.join("ontology", "DrugInteraction.owl") | |
| if not os.path.exists(owl_file_path): | |
| logging.error(f"Ontology file not found: {owl_file_path}") | |
| raise FileNotFoundError(f"Ontology file not found: {owl_file_path}") | |
| agent_graph = create_agent_graph(owl_file_path) | |
| result = agent_graph.invoke(GraphState(input=user_input)) | |
| print("\nAnalysis Results:") | |
| print(result["response"]) | |
| logging.info("Analysis completed and results displayed.") | |
| except Exception as e: | |
| logging.error(f"An error occurred: {str(e)}") | |
| print(f"An error occurred: {str(e)}") | |
| print("Please check your input and try again.") | |
| if __name__ == "__main__": | |
| main() | |