File size: 4,241 Bytes
ec6d5f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46d9468
ec6d5f9
 
46d9468
 
 
ec6d5f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import os
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field, SecretStr, HttpUrl, validator, Json
from typing import List, Optional, Literal, Union

# Helper function to load .env file if it exists
# Ensure python-dotenv is installed: pip install python-dotenv
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 # Optional: Handle missing dotenv library


class Settings(BaseSettings):
    # Load from .env file
    model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8', extra='ignore')

    # Neo4j Credentials
    neo4j_uri: str = Field(..., validation_alias='NEO4J_URI')
    neo4j_username: str = Field("neo4j", validation_alias='NEO4J_USERNAME')
    neo4j_password: SecretStr = os.getenv("NEO4J_PASSWORD")

    # API Keys
    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')

    # LLM Configuration
    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')
    # Add other models if needed (e.g., cypher gen, concept selection)

    # Planner Configuration
    plan_method: Literal["generation", "modification"] = Field("generation", validation_alias='PLAN_METHOD')
    use_detailed_query: bool = Field(False, validation_alias='USE_DETAILED_QUERY')

    # Graph Operations Configuration
    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')

    # Processing Configuration
    # Load processing steps from JSON string in .env
    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 (set automatically based on key)
    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:
             # Ensure tracing is disabled if no key
            os.environ["LANGCHAIN_TRACING_V2"] = "false"
            print("Langsmith key not found, tracing disabled.")

# Create a single instance to be imported elsewhere
settings = Settings()
# Automatically configure Langsmith on import
settings.configure_langsmith()

# Optionally set Gemini key in environment if needed by library implicitly
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.")