|
import os |
|
from pydantic_settings import BaseSettings, SettingsConfigDict |
|
from pydantic import Field, SecretStr, HttpUrl, validator, Json |
|
from typing import List, Optional, Literal, Union |
|
|
|
|
|
|
|
try: |
|
from dotenv import load_dotenv |
|
print("Attempting to load .env file...") |
|
if load_dotenv(): |
|
print(".env file loaded successfully.") |
|
else: |
|
print(".env file not found or empty.") |
|
except ImportError: |
|
print("python-dotenv not installed, skipping .env file loading.") |
|
pass |
|
|
|
|
|
class Settings(BaseSettings): |
|
|
|
model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8', extra='ignore') |
|
|
|
|
|
neo4j_uri: str = Field(..., validation_alias='NEO4J_URI') |
|
neo4j_username: str = Field("neo4j", validation_alias='NEO4J_USERNAME') |
|
neo4j_password: SecretStr = os.getenv("NEO4J_PASSWORD") |
|
|
|
|
|
openai_api_key: Optional[SecretStr] = os.getenv("OPENAI_API_KEY") |
|
gemini_api_key: Optional[SecretStr] = os.getenv("GEMINI_API_KEY") |
|
langsmith_api_key: Optional[SecretStr] = os.getenv("LANGSMITH_API_KEY") |
|
langchain_project: Optional[str] = Field("KIG_Refactored", validation_alias='LANGCHAIN_PROJECT') |
|
|
|
|
|
main_llm_model: str = Field("gemini-1.5-flash", validation_alias='MAIN_LLM_MODEL') |
|
eval_llm_model: str = Field("gemini-1.5-flash", validation_alias='EVAL_LLM_MODEL') |
|
summarize_llm_model: str = Field("gemini-1.5-flash", validation_alias='SUMMARIZE_LLM_MODEL') |
|
|
|
|
|
|
|
plan_method: Literal["generation", "modification"] = Field("generation", validation_alias='PLAN_METHOD') |
|
use_detailed_query: bool = Field(False, validation_alias='USE_DETAILED_QUERY') |
|
|
|
|
|
cypher_gen_method: Literal["guided", "auto"] = Field("guided", validation_alias='CYPHER_GEN_METHOD') |
|
validate_cypher: bool = Field(False, validation_alias='VALIDATE_CYPHER') |
|
eval_method: Literal["binary", "score"] = Field("binary", validation_alias='EVAL_METHOD') |
|
eval_threshold: float = Field(0.7, validation_alias='EVAL_THRESHOLD') |
|
max_docs: int = Field(10, validation_alias='MAX_DOCS') |
|
|
|
|
|
|
|
process_steps: Json[List[Union[str, dict]]] = Field('["summarize"]', validation_alias='PROCESS_STEPS') |
|
compression_method: Optional[str] = Field(None, validation_alias='COMPRESSION_METHOD') |
|
compress_rate: Optional[float] = Field(0.5, validation_alias='COMPRESS_RATE') |
|
|
|
|
|
langsmith_tracing_v2: str = "false" |
|
|
|
@validator('langsmith_tracing_v2', pre=True, always=True) |
|
def set_langsmith_tracing(cls, v, values): |
|
return "true" if values.get('langsmith_api_key') else "false" |
|
|
|
def configure_langsmith(self): |
|
"""Sets Langsmith environment variables if API key is provided.""" |
|
if self.langsmith_api_key: |
|
os.environ["LANGCHAIN_TRACING_V2"] = self.langsmith_tracing_v2 |
|
os.environ["LANGCHAIN_API_KEY"] = self.langsmith_api_key.get_secret_value() |
|
if self.langchain_project: |
|
os.environ["LANGCHAIN_PROJECT"] = self.langchain_project |
|
print("Langsmith configured.") |
|
else: |
|
|
|
os.environ["LANGCHAIN_TRACING_V2"] = "false" |
|
print("Langsmith key not found, tracing disabled.") |
|
|
|
|
|
settings = Settings() |
|
|
|
settings.configure_langsmith() |
|
|
|
|
|
if settings.gemini_api_key: |
|
os.environ["GOOGLE_API_KEY"] = settings.gemini_api_key.get_secret_value() |
|
print("Set GOOGLE_API_KEY environment variable.") |
|
if settings.openai_api_key: |
|
os.environ["OPENAI_API_KEY"] = settings.openai_api_key.get_secret_value() |
|
print("Set OPENAI_API_KEY environment variable.") |