diff --git a/backend/app/agents/devrel/github/github_toolkit.py b/backend/app/agents/devrel/github/github_toolkit.py index 87f293b9..6d5b8a78 100644 --- a/backend/app/agents/devrel/github/github_toolkit.py +++ b/backend/app/agents/devrel/github/github_toolkit.py @@ -1,7 +1,7 @@ import logging -import os import json import re +import config from typing import Dict, Any from langchain_google_genai import ChatGoogleGenerativeAI from langchain_core.messages import HumanMessage @@ -14,7 +14,7 @@ logger = logging.getLogger(__name__) -DEFAULT_ORG = os.getenv("GITHUB_ORG") +DEFAULT_ORG = config.GITHUB_ORG def normalize_org(org_from_user: str = None) -> str: diff --git a/backend/app/agents/devrel/github/services/github_mcp_client.py b/backend/app/agents/devrel/github/services/github_mcp_client.py index ad8d4197..ef6cde1a 100644 --- a/backend/app/agents/devrel/github/services/github_mcp_client.py +++ b/backend/app/agents/devrel/github/services/github_mcp_client.py @@ -1,8 +1,8 @@ import logging -import os from typing import Dict, Any, Optional, List, Union import aiohttp import asyncio +import config logger = logging.getLogger(__name__) @@ -13,7 +13,7 @@ def __init__(self, mcp_server_url: str = "http://localhost:8001"): self.mcp_server_url = mcp_server_url self.session: Optional[aiohttp.ClientSession] = None # Default org pulled from environment - self.org = os.getenv("GITHUB_ORG", "Aossie-org") + self.org = config.GITHUB_ORG async def __aenter__(self): # Async context manager entry diff --git a/backend/app/agents/devrel/github/services/github_mcp_server.py b/backend/app/agents/devrel/github/services/github_mcp_server.py index 9229a3fc..73f1c992 100644 --- a/backend/app/agents/devrel/github/services/github_mcp_server.py +++ b/backend/app/agents/devrel/github/services/github_mcp_server.py @@ -1,17 +1,12 @@ import os import logging import asyncio -from dotenv import load_dotenv, find_dotenv +import config from fastapi import FastAPI, HTTPException from pydantic import BaseModel from .github_mcp_service import GitHubMCPService from typing import Optional -dotenv_path = find_dotenv(usecwd=True) -if dotenv_path: - load_dotenv(dotenv_path=dotenv_path) -else: - load_dotenv() logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @@ -19,13 +14,13 @@ app = FastAPI(title="GitHub MCP Server", version="1.0.0") # Load env vars -GITHUB_ORG = os.getenv("GITHUB_ORG") +GITHUB_ORG = config.GITHUB_ORG if not GITHUB_ORG: logger.warning("GITHUB_ORG not set in .env — defaulting to manual owner input") github_service: Optional[GitHubMCPService] = None try: - token = os.getenv("GITHUB_TOKEN") or os.getenv("GH_TOKEN") + token = config.GITHUB_TOKEN if not token: logger.warning("GITHUB_TOKEN/GH_TOKEN not set; GitHub API calls may be rate-limited or fail.") github_service = GitHubMCPService(token=token) diff --git a/backend/app/agents/devrel/github/services/github_mcp_service.py b/backend/app/agents/devrel/github/services/github_mcp_service.py index 6301cb51..4060f0af 100644 --- a/backend/app/agents/devrel/github/services/github_mcp_service.py +++ b/backend/app/agents/devrel/github/services/github_mcp_service.py @@ -2,17 +2,11 @@ import requests import asyncio from typing import Optional -from dotenv import load_dotenv, find_dotenv - -dotenv_path = find_dotenv(usecwd=True) -if dotenv_path: - load_dotenv(dotenv_path=dotenv_path) -else: - load_dotenv() +import config class GitHubMCPService: def __init__(self, token: str = None): - self.token = token or os.getenv("GITHUB_TOKEN") + self.token = token or config.GITHUB_TOKEN if not self.token: raise ValueError("GitHub token required; export as GITHUB_TOKEN or place in backend/.env file") self.base_url = "https://api.github.com" @@ -110,7 +104,7 @@ def _headers(self): def _get_service(token: Optional[str] = None) -> GitHubMCPService: - return GitHubMCPService(token=token or os.getenv("GITHUB_TOKEN")) + return GitHubMCPService(token=token or config.GITHUB_TOKEN) async def get_org_repositories(org: str): try: diff --git a/backend/app/agents/devrel/github/tools/github_support.py b/backend/app/agents/devrel/github/tools/github_support.py index 011a1394..ee3d9ff9 100644 --- a/backend/app/agents/devrel/github/tools/github_support.py +++ b/backend/app/agents/devrel/github/tools/github_support.py @@ -1,4 +1,4 @@ -import os +import config import re import logging from typing import Optional @@ -6,7 +6,7 @@ logger = logging.getLogger(__name__) -DEFAULT_ORG = os.getenv("GITHUB_ORG", "Aossie-org") +DEFAULT_ORG = config.GITHUB_ORG GH_URL_RE = re.compile( r'(?:https?://|git@)github\.com[/:]' diff --git a/backend/app/agents/state.py b/backend/app/agents/state.py index 8651ca4c..cb3f38a1 100644 --- a/backend/app/agents/state.py +++ b/backend/app/agents/state.py @@ -1,5 +1,5 @@ from typing import Dict, Any, List, Optional, Annotated -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, ConfigDict from datetime import datetime from operator import add @@ -69,5 +69,6 @@ class AgentState(BaseModel): # Response final_response: Optional[str] = None - class Config: + model_config = ConfigDict( arbitrary_types_allowed = True + ) diff --git a/backend/app/core/config/settings.py b/backend/app/core/config/settings.py index f314a94d..bbf007c6 100644 --- a/backend/app/core/config/settings.py +++ b/backend/app/core/config/settings.py @@ -1,6 +1,6 @@ from pydantic_settings import BaseSettings from dotenv import load_dotenv -from pydantic import field_validator +from pydantic import field_validator,ConfigDict from typing import Optional load_dotenv() @@ -46,9 +46,10 @@ def _not_empty(cls, v, field): raise ValueError(f"{field.name} must be set") return v - class Config: - env_file = ".env" - extra = "ignore" # to prevent errors from extra env variables + model_config = ConfigDict( + env_file = ".env", + extra = "ignore" + ) # to prevent errors from extra env variables settings = Settings() diff --git a/backend/app/models/database/weaviate.py b/backend/app/models/database/weaviate.py index 612806bf..a685a091 100644 --- a/backend/app/models/database/weaviate.py +++ b/backend/app/models/database/weaviate.py @@ -1,4 +1,4 @@ -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, ConfigDict from typing import List, Optional from datetime import datetime @@ -63,67 +63,66 @@ class WeaviateUserProfile(BaseModel): last_updated: datetime = Field(default_factory=datetime.now, description="The date and time the profile was last updated.") - class Config: - """ - Pydantic model configuration. - """ - orm_mode = True - schema_extra = { - "example": { - "user_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef", - "github_username": "jane-dev", - "display_name": "Jane Developer", - "bio": "Creator of innovative open-source tools. Full-stack developer with a passion for Rust and WebAssembly.", - "location": "Berlin, Germany", - "repositories": [ - { - "name": "rust-web-framework", - "description": "A high-performance web framework for Rust.", - "languages": ["Rust", "TOML"], - "topics": ["rust", "webdev", "performance", "framework"], - "stars": 2500, - "forks": 400 - }, - { - "name": "data-viz-lib", - "description": "A declarative data visualization library for JavaScript.", - "languages": ["JavaScript", "TypeScript"], - "topics": ["data-visualization", "d3", "charts"], - "stars": 1200, - "forks": 150 - } - ], - "pull_requests": [ - { - "title": "Add async support for database connections", - "body": "This PR adds comprehensive async support for database connections, improving performance by 40%...", - "state": "closed", - "repository": "microsoft/vscode", - "created_at": "2024-01-15T10:30:00Z", - "closed_at": "2024-01-20T14:20:00Z", - "merged_at": "2024-01-20T14:20:00Z", - "labels": ["enhancement", "database", "performance"], - "url": "https://github.com/microsoft/vscode/pull/12345", - }, - { - "title": "Fix memory leak in WebAssembly module", - "body": "Fixes a critical memory leak that was causing crashes in production environments...", - "state": "open", - "repository": "facebook/react", - "created_at": "2024-02-01T09:15:00Z", - "closed_at": None, - "merged_at": None, - "labels": ["bug", "wasm", "critical"], - "url": "https://github.com/facebook/react/pull/67890", - } - ], - "languages": ["Rust", "JavaScript", "TypeScript", "TOML"], - "topics": ["rust", "webdev", "performance", "framework", "data-visualization", "d3", "charts"], - "followers_count": 1800, - "following_count": 250, - "total_stars_received": 3700, - "total_forks": 550, - "profile_text_for_embedding": "Jane Developer, Creator of innovative open-source tools. Full-stack developer with a passion for Rust and WebAssembly. Repositories: rust-web-framework, A high-performance web framework for Rust. data-viz-lib, A declarative data visualization library for JavaScript. Languages: Rust, JavaScript, TypeScript. Topics: rust, webdev, performance, data-visualization.", - "last_updated": "2025-06-23T12:21:00Z" - } + model_config = ConfigDict( + from_attributes = True, + json_schema_extra = { + "example": { + "user_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef", + "github_username": "jane-dev", + "display_name": "Jane Developer", + "bio": "Creator of innovative open-source tools. Full-stack developer with a passion for Rust and WebAssembly.", + "location": "Berlin, Germany", + "repositories": [ + { + "name": "rust-web-framework", + "description": "A high-performance web framework for Rust.", + "languages": ["Rust", "TOML"], + "topics": ["rust", "webdev", "performance", "framework"], + "stars": 2500, + "forks": 400 + }, + { + "name": "data-viz-lib", + "description": "A declarative data visualization library for JavaScript.", + "languages": ["JavaScript", "TypeScript"], + "topics": ["data-visualization", "d3", "charts"], + "stars": 1200, + "forks": 150 + } + ], + "pull_requests": [ + { + "title": "Add async support for database connections", + "body": "This PR adds comprehensive async support for database connections, improving performance by 40%...", + "state": "closed", + "repository": "microsoft/vscode", + "created_at": "2024-01-15T10:30:00Z", + "closed_at": "2024-01-20T14:20:00Z", + "merged_at": "2024-01-20T14:20:00Z", + "labels": ["enhancement", "database", "performance"], + "url": "https://github.com/microsoft/vscode/pull/12345", + }, + { + "title": "Fix memory leak in WebAssembly module", + "body": "Fixes a critical memory leak that was causing crashes in production environments...", + "state": "open", + "repository": "facebook/react", + "created_at": "2024-02-01T09:15:00Z", + "closed_at": None, + "merged_at": None, + "labels": ["bug", "wasm", "critical"], + "url": "https://github.com/facebook/react/pull/67890", + } + ], + "languages": ["Rust", "JavaScript", "TypeScript", "TOML"], + "topics": ["rust", "webdev", "performance", "framework", "data-visualization", "d3", "charts"], + "followers_count": 1800, + "following_count": 250, + "total_stars_received": 3700, + "total_forks": 550, + "profile_text_for_embedding": "Jane Developer, Creator of innovative open-source tools. Full-stack developer with a passion for Rust and WebAssembly. Repositories: rust-web-framework, A high-performance web framework for Rust. data-viz-lib, A declarative data visualization library for JavaScript. Languages: Rust, JavaScript, TypeScript. Topics: rust, webdev, performance, data-visualization.", + "last_updated": "2025-06-23T12:21:00Z" } + } + + ) \ No newline at end of file diff --git a/backend/app/services/embedding_service/service.py b/backend/app/services/embedding_service/service.py index ea8948d4..4527c4f9 100644 --- a/backend/app/services/embedding_service/service.py +++ b/backend/app/services/embedding_service/service.py @@ -1,9 +1,8 @@ import logging -import os +import config from typing import List, Dict, Any, Optional import torch from pydantic import BaseModel -from dotenv import load_dotenv from sentence_transformers import SentenceTransformer from langchain_google_genai import ChatGoogleGenerativeAI from langchain_core.messages import HumanMessage @@ -11,11 +10,11 @@ from app.models.database.weaviate import WeaviateUserProfile from app.services.embedding_service.profile_summarization.prompts.summarization_prompt import PROFILE_SUMMARIZATION_PROMPT -load_dotenv() -MODEL_NAME = os.getenv("EMBEDDING_MODEL", "BAAI/bge-small-en-v1.5") -MAX_BATCH_SIZE = int(os.getenv("EMBEDDING_MAX_BATCH_SIZE", "32")) -EMBEDDING_DEVICE = os.getenv("EMBEDDING_DEVICE", "cpu") +MODEL_NAME = config.MODEL_NAME +MAX_BATCH_SIZE = config.MAX_BATCH_SIZE +EMBEDDING_DEVICE = config.EMBEDDING_DEVICE + logger = logging.getLogger(__name__) diff --git a/backend/config.py b/backend/config.py new file mode 100644 index 00000000..4dfc6aba --- /dev/null +++ b/backend/config.py @@ -0,0 +1,16 @@ +from dotenv import load_dotenv, find_dotenv +import os + + +dotenv_path = find_dotenv(usecwd=True) +if dotenv_path: + load_dotenv(dotenv_path=dotenv_path) +else: + load_dotenv() + +GITHUB_ORG = os.getenv("GITHUB_ORG", "Aossie-org") +GITHUB_TOKEN = os.getenv("GITHUB_TOKEN") or os.getenv("GH_TOKEN") + +MODEL_NAME = os.getenv("EMBEDDING_MODEL", "BAAI/bge-small-en-v1.5") +MAX_BATCH_SIZE = int(os.getenv("EMBEDDING_MAX_BATCH_SIZE", "32")) +EMBEDDING_DEVICE = os.getenv("EMBEDDING_DEVICE", "cpu") \ No newline at end of file