From a5da533d5536330d8fdfbab84b3bd8a25429e22d Mon Sep 17 00:00:00 2001 From: KaifAhmad1 Date: Wed, 14 Jan 2026 12:37:29 +0530 Subject: [PATCH] chore: resolve dependencies, migrate Gemini SDK, and sanitize notebooks --- .../advanced_rag/01_GraphRAG_Complete.ipynb | 2 +- .../02_RAG_vs_GraphRAG_Comparison.ipynb | 4 +- .../01_Drug_Discovery_Pipeline.ipynb | 2 +- .../02_Genomic_Variant_Analysis.ipynb | 2 +- .../01_DeFi_Protocol_Intelligence.ipynb | 2 +- .../finance/02_Fraud_Detection.ipynb | 2 +- ...ligence_Analysis_Orchestrator_Worker.ipynb | 2 +- .../01_Energy_Market_Analysis.ipynb | 2 +- pyproject.toml | 10 +-- semantica/semantic_extract/providers.py | 84 ++++++++++++------- 10 files changed, 70 insertions(+), 42 deletions(-) diff --git a/cookbook/use_cases/advanced_rag/01_GraphRAG_Complete.ipynb b/cookbook/use_cases/advanced_rag/01_GraphRAG_Complete.ipynb index 6647f3f8..e728685d 100644 --- a/cookbook/use_cases/advanced_rag/01_GraphRAG_Complete.ipynb +++ b/cookbook/use_cases/advanced_rag/01_GraphRAG_Complete.ipynb @@ -110,7 +110,7 @@ "source": [ "# Set up API keys\n", "# Note: In production, use environment variables: export GROQ_API_KEY=\"your-key\"\n", - "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"Your Groq API\")\n" + "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"\")\n" ] }, { diff --git a/cookbook/use_cases/advanced_rag/02_RAG_vs_GraphRAG_Comparison.ipynb b/cookbook/use_cases/advanced_rag/02_RAG_vs_GraphRAG_Comparison.ipynb index de9ba0c4..169edb2c 100644 --- a/cookbook/use_cases/advanced_rag/02_RAG_vs_GraphRAG_Comparison.ipynb +++ b/cookbook/use_cases/advanced_rag/02_RAG_vs_GraphRAG_Comparison.ipynb @@ -30,7 +30,7 @@ "# Environment Setup\n", "import os\n", "\n", - "os.environ['GROQ_API_KEY'] = os.getenv('GROQ_API_KEY', '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')\n", + "os.environ['GROQ_API_KEY'] = os.getenv('GROQ_API_KEY', '')\n", "\n", "# Install Semantica and all required dependencies\n", "%pip install -qU semantica networkx matplotlib plotly pandas faiss-cpu beautifulsoup4 groq sentence-transformers\n" @@ -84,7 +84,7 @@ "source": [ "# Set up API keys\n", "# Note: In production, use environment variables: export GROQ_API_KEY=\"your-key\"\n", - "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"your-groq-api-key-here\")\n", + "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"\")\n", "\n", "print(\"API keys configured.\")\n" ] diff --git a/cookbook/use_cases/biomedical/01_Drug_Discovery_Pipeline.ipynb b/cookbook/use_cases/biomedical/01_Drug_Discovery_Pipeline.ipynb index 592521d9..fd207038 100644 --- a/cookbook/use_cases/biomedical/01_Drug_Discovery_Pipeline.ipynb +++ b/cookbook/use_cases/biomedical/01_Drug_Discovery_Pipeline.ipynb @@ -109,7 +109,7 @@ "source": [ "import os\n", "\n", - "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"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\")\n" + "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"\")\n" ] }, { diff --git a/cookbook/use_cases/biomedical/02_Genomic_Variant_Analysis.ipynb b/cookbook/use_cases/biomedical/02_Genomic_Variant_Analysis.ipynb index e284e6c7..d892c57a 100644 --- a/cookbook/use_cases/biomedical/02_Genomic_Variant_Analysis.ipynb +++ b/cookbook/use_cases/biomedical/02_Genomic_Variant_Analysis.ipynb @@ -85,7 +85,7 @@ "source": [ "import os\n", "\n", - "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"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\")\n" + "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"\")\n" ] }, { diff --git a/cookbook/use_cases/blockchain/01_DeFi_Protocol_Intelligence.ipynb b/cookbook/use_cases/blockchain/01_DeFi_Protocol_Intelligence.ipynb index a71599de..64fc75ad 100644 --- a/cookbook/use_cases/blockchain/01_DeFi_Protocol_Intelligence.ipynb +++ b/cookbook/use_cases/blockchain/01_DeFi_Protocol_Intelligence.ipynb @@ -81,7 +81,7 @@ "source": [ "import os\n", "\n", - "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"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\")\n", + "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"\")\n", "\n", "# Configuration constants\n", "EMBEDDING_DIMENSION = 384\n", diff --git a/cookbook/use_cases/finance/02_Fraud_Detection.ipynb b/cookbook/use_cases/finance/02_Fraud_Detection.ipynb index 085dd647..5af6600b 100644 --- a/cookbook/use_cases/finance/02_Fraud_Detection.ipynb +++ b/cookbook/use_cases/finance/02_Fraud_Detection.ipynb @@ -98,7 +98,7 @@ "source": [ "import os\n", "\n", - "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"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\")\n", + "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"\")\n", "\n", "# Configuration constants\n", "EMBEDDING_DIMENSION = 384\n", diff --git a/cookbook/use_cases/intelligence/02_Intelligence_Analysis_Orchestrator_Worker.ipynb b/cookbook/use_cases/intelligence/02_Intelligence_Analysis_Orchestrator_Worker.ipynb index 3c3a2027..8ba76f3e 100644 --- a/cookbook/use_cases/intelligence/02_Intelligence_Analysis_Orchestrator_Worker.ipynb +++ b/cookbook/use_cases/intelligence/02_Intelligence_Analysis_Orchestrator_Worker.ipynb @@ -83,7 +83,7 @@ "source": [ "import os\n", "\n", - "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"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\")\n", + "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"\")\n", "\n", "# Configuration constants\n", "EMBEDDING_DIMENSION = 384\n", diff --git a/cookbook/use_cases/renewable_energy/01_Energy_Market_Analysis.ipynb b/cookbook/use_cases/renewable_energy/01_Energy_Market_Analysis.ipynb index dc632ce7..d4060480 100644 --- a/cookbook/use_cases/renewable_energy/01_Energy_Market_Analysis.ipynb +++ b/cookbook/use_cases/renewable_energy/01_Energy_Market_Analysis.ipynb @@ -80,7 +80,7 @@ "source": [ "import os\n", "\n", - "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"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\")\n", + "os.environ[\"GROQ_API_KEY\"] = os.getenv(\"GROQ_API_KEY\", \"\")\n", "\n", "# Configuration constants\n", "EMBEDDING_DIMENSION = 384\n", diff --git a/pyproject.toml b/pyproject.toml index 9fcbb61d..d5165fb5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,8 +56,8 @@ dependencies = [ "requests>=2.28.0", "GitPython>=3.1.30", "chardet>=5.1.0", - "protobuf==4.25.8", - "grpcio==1.67.1", + "protobuf>=5.29.1,<7.0", + "grpcio>=1.71.2", "beautifulsoup4>=4.11.0", "lxml>=4.9.0", "pypdf2>=2.10.0", @@ -102,8 +102,8 @@ dependencies = [ "loguru>=0.6.0", "structlog>=22.1.0", "prometheus-client>=0.14.0", - "opentelemetry-api>=1.12.0", - "opentelemetry-sdk>=1.12.0", + "opentelemetry-api==1.37.0", + "opentelemetry-sdk==1.37.0", "opentelemetry-instrumentation", "fastapi>=0.78.0", "uvicorn>=0.18.0", @@ -166,7 +166,7 @@ llm-openai = [ "openai>=1.0.0" ] llm-gemini = [ - "google-generativeai>=0.3.0" + "google-genai>=0.1.0" ] llm-groq = [ "groq>=0.4.0" diff --git a/semantica/semantic_extract/providers.py b/semantica/semantic_extract/providers.py index ea8153b7..0a2aba92 100644 --- a/semantica/semantic_extract/providers.py +++ b/semantica/semantic_extract/providers.py @@ -530,26 +530,40 @@ class GeminiProvider(BaseProvider): self.api_key = api_key or config.get_api_key("gemini") self.model = model self.client = None + self._use_new_genai = False self._init_client() def _init_client(self): - """Initialize Gemini client.""" try: - import google.generativeai as genai - + from google import genai as new_genai if self.api_key: - genai.configure(api_key=self.api_key) - self.client = genai.GenerativeModel(self.model) - except (ImportError, OSError): + self.client = new_genai.Client(api_key=self.api_key) + self._use_new_genai = True + return + except Exception: + pass + try: + import google.generativeai as old_genai + if self.api_key: + old_genai.configure(api_key=self.api_key) + self.client = old_genai.GenerativeModel(self.model) + self._use_new_genai = False + except Exception: self.client = None - self.logger.warning( - "google-generativeai library not installed. Install with: pip install semantica[llm-gemini]" - ) + self.logger.warning("Gemini SDK not installed. Install with: pip install semantica[llm-gemini]") def is_available(self) -> bool: """Check if provider is available.""" return self.client is not None + def _resp_text(self, resp: Any) -> str: + if hasattr(resp, "text"): + return getattr(resp, "text") + try: + return resp.candidates[0].content.parts[0].text + except Exception: + return str(resp) + def generate(self, prompt: str, **kwargs) -> str: """Generate text from prompt.""" if not self.client: @@ -557,32 +571,46 @@ class GeminiProvider(BaseProvider): "Gemini client not initialized. Set GEMINI_API_KEY or pass api_key." ) - generation_config = {"temperature": kwargs.get("temperature", 0.3)} - if "max_tokens" in kwargs: - generation_config["max_output_tokens"] = kwargs["max_tokens"] - - # Pass through other common parameters - for param in ["top_p", "top_k", "stop_sequences", "candidate_count"]: - if param in kwargs: - generation_config[param] = kwargs[param] - - response = self.client.generate_content( - prompt, generation_config=generation_config - ) - return response.text + if self._use_new_genai: + model = kwargs.get("model", self.model) + temperature = kwargs.get("temperature", 0.3) + create_kwargs = {"model": model, "contents": prompt, "config": {"temperature": temperature}} + if "max_tokens" in kwargs: + create_kwargs["config"]["max_output_tokens"] = kwargs["max_tokens"] + for p in ["top_p", "top_k", "stop_sequences", "candidate_count"]: + if p in kwargs: + create_kwargs["config"][p] = kwargs[p] + resp = self.client.models.generate_content(**create_kwargs) + return self._resp_text(resp) + else: + generation_config = {"temperature": kwargs.get("temperature", 0.3)} + if "max_tokens" in kwargs: + generation_config["max_output_tokens"] = kwargs["max_tokens"] + for param in ["top_p", "top_k", "stop_sequences", "candidate_count"]: + if param in kwargs: + generation_config[param] = kwargs[param] + response = self.client.generate_content(prompt, generation_config=generation_config) + return self._resp_text(response) def generate_structured(self, prompt: str, **kwargs) -> dict: """Generate structured output.""" if not self.client: raise ProcessingError("Gemini client not initialized.") - # Add JSON format instruction to prompt json_prompt = f"{prompt}\n\nReturn the response as valid JSON only." - response = self.client.generate_content(json_prompt) - try: - return self._parse_json(response.text) - except Exception as e: - raise ProcessingError(f"Failed to parse JSON from Gemini response: {e}") + if self._use_new_genai: + model = kwargs.get("model", self.model) + resp = self.client.models.generate_content(model=model, contents=json_prompt) + try: + return self._parse_json(self._resp_text(resp)) + except Exception as e: + raise ProcessingError(f"Failed to parse JSON from Gemini response: {e}") + else: + response = self.client.generate_content(json_prompt) + try: + return self._parse_json(self._resp_text(response)) + except Exception as e: + raise ProcessingError(f"Failed to parse JSON from Gemini response: {e}") class GroqProvider(BaseProvider):