File size: 5,097 Bytes
6fe7c36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64c1026
6fe7c36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64c1026
6fe7c36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
"""Configuration for multi-agent RAG system."""
import os
from typing import Optional
from dataclasses import dataclass
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()


@dataclass
class Config:
    """Application configuration."""

    # API Keys
    GOOGLE_API_KEY: Optional[str] = None
    COINGECKO_API_KEY: Optional[str] = None
    ALPHA_VANTAGE_API_KEY: Optional[str] = None
    ELEVENLABS_API_KEY: Optional[str] = None
    # ChromaDB Cloud Configuration
    CHROMA_API_KEY: Optional[str] = None
    CHROMA_TENANT: Optional[str] = None
    CHROMA_DATABASE: Optional[str] = None
    CHROMA_CLOUD_HOST: str = "api.trychroma.com"

    # ChromaDB Collection Names
    DOCUMENTS_COLLECTION: str = "test-embed"

    # Embedding Configuration
    EMBEDDING_FUNCTION: str = "default"  # Options: default, openai, cohere, jina, voyageai

    # Google Cloud SQL Configuration
    CLOUD_SQL_INSTANCE_CONNECTION_NAME: Optional[str] = None  # Format: project:region:instance
    CLOUD_SQL_DB_USER: Optional[str] = None
    CLOUD_SQL_DB_PASS: Optional[str] = None
    CLOUD_SQL_DB_NAME: Optional[str] = None
    CLOUD_SQL_PRIVATE_IP: bool = False  # Set to True to use private IP

    # MCP Toolbox Configuration (for Finance Tracker Agent)
    GCP_PROJECT_ID: Optional[str] = None  # Google Cloud Project ID
    CLOUD_SQL_REGION: Optional[str] = None  # e.g., us-central1
    CLOUD_SQL_INSTANCE: Optional[str] = None  # Instance name only (not full connection string)
    MCP_TOOLBOX_SERVER_URL: str = "http://localhost:5000"  # MCP Toolbox HTTP server URL

    # CoinGecko MCP Server Configuration
    COINGECKO_MCP_URL: str = "https://mcp.pro-api.coingecko.com/mcp"
    COINGECKO_MCP_AUTH_URL: str = "https://mcp.pro-api.coingecko.com/auth"

    # UI Configuration
    UI_PORT: int = 7860
    UI_HOST: str = "0.0.0.0"
    MAX_FILE_SIZE_MB: int = 50
    ALLOWED_FILE_TYPES: list = None

    def __post_init__(self):
        """Initialize mutable default values."""
        if self.ALLOWED_FILE_TYPES is None:
            self.ALLOWED_FILE_TYPES = [".pdf", ".txt", ".docx"]
    
    @classmethod
    def from_env(cls) -> "Config":
        """Load configuration from environment variables."""
        return cls(
            ALPHA_VANTAGE_API_KEY=os.getenv("ALPHA_VANTAGE_API_KEY"),
            GOOGLE_API_KEY=os.getenv("GOOGLE_API_KEY"),
            COINGECKO_API_KEY=os.getenv("COINGECKO_API_KEY"),
            ELEVENLABS_API_KEY=os.getenv("ELEVENLABS_API_KEY"),
            COINGECKO_MCP_URL=os.getenv(
                "COINGECKO_MCP_URL",
                "https://mcp.pro-api.coingecko.com/mcp"
            ),
            COINGECKO_MCP_AUTH_URL=os.getenv(
                "COINGECKO_MCP_AUTH_URL",
                "https://mcp.pro-api.coingecko.com/auth"
            ),
            CHROMA_API_KEY=os.getenv("CHROMA_API_KEY"),
            CHROMA_TENANT=os.getenv("CHROMA_TENANT"),
            CHROMA_DATABASE=os.getenv("CHROMA_DATABASE"),
            CHROMA_CLOUD_HOST=os.getenv("CHROMA_CLOUD_HOST", "api.trychroma.com"),
            EMBEDDING_FUNCTION=os.getenv("CHROMA_EMBEDDING_FUNCTION", "default"),
            DOCUMENTS_COLLECTION=os.getenv("DOCUMENTS_COLLECTION", "mcp-test"),
            MAX_FILE_SIZE_MB=int(os.getenv("MAX_FILE_SIZE_MB", "50")),
            CLOUD_SQL_INSTANCE_CONNECTION_NAME=os.getenv("CLOUD_SQL_INSTANCE_CONNECTION_NAME"),
            CLOUD_SQL_DB_USER=os.getenv("CLOUD_SQL_DB_USER"),
            CLOUD_SQL_DB_PASS=os.getenv("CLOUD_SQL_DB_PASS"),
            CLOUD_SQL_DB_NAME=os.getenv("CLOUD_SQL_DB_NAME", "finance_tracker"),
            CLOUD_SQL_PRIVATE_IP=os.getenv("CLOUD_SQL_PRIVATE_IP", "False").lower() == "true",
            GCP_PROJECT_ID=os.getenv("GCP_PROJECT_ID"),
            CLOUD_SQL_REGION=os.getenv("CLOUD_SQL_REGION"),
            CLOUD_SQL_INSTANCE=os.getenv("CLOUD_SQL_INSTANCE"),
            MCP_TOOLBOX_SERVER_URL=os.getenv("MCP_TOOLBOX_SERVER_URL", "http://localhost:5000"),
        )
    
    def validate(self) -> None:
        """Validate required configuration."""
        errors = []

        if not self.GOOGLE_API_KEY:
            errors.append("GOOGLE_API_KEY environment variable is required")

        if not self.CHROMA_API_KEY:
            errors.append("CHROMA_API_KEY environment variable is required for ChromaDB Cloud")

        if not self.CHROMA_TENANT:
            errors.append("CHROMA_TENANT environment variable is required for ChromaDB Cloud")

        if not self.CHROMA_DATABASE:
            errors.append("CHROMA_DATABASE environment variable is required for ChromaDB Cloud")

        if not self.ALPHA_VANTAGE_API_KEY:
                raise ValueError(
                    "ALPHA_VANTAGE_API_KEY not configured. "
                    "Add it to your .env file. "
                    "Get your API key from: https://www.alphavantage.co/support/#api-key"
                )
        if errors:
            raise ValueError(
                "Configuration validation failed:\n" + "\n".join(f"  - {e}" for e in errors)
            )


# Global config instance
config = Config.from_env()