Initial commit
This commit is contained in:
@@ -0,0 +1 @@
|
||||
"""Core functionality for the Mini SpecsComply Pro application."""
|
||||
@@ -0,0 +1,44 @@
|
||||
import os
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
class Settings(BaseModel):
|
||||
"""Application settings loaded from environment variables."""
|
||||
|
||||
# Application information
|
||||
APP_NAME: str = os.getenv("APP_NAME", "Mini SpecsComply Pro")
|
||||
APP_VERSION: str = os.getenv("APP_VERSION", "0.1.0")
|
||||
DEBUG: bool = os.getenv("DEBUG", "False").lower() in ("true", "1", "t")
|
||||
|
||||
# API keys
|
||||
GROQ_API_KEY: Optional[str] = os.getenv("GROQ_API_KEY")
|
||||
COHERE_API_KEY: Optional[str] = os.getenv("COHERE_API_KEY")
|
||||
|
||||
# Vector database settings
|
||||
# Pinecone
|
||||
PINECONE_API_KEY: Optional[str] = os.getenv("PINECONE_API_KEY")
|
||||
PINECONE_INDEX_NAME: str = os.getenv("PINECONE_INDEX_NAME", "specscomply_documents")
|
||||
|
||||
# Weaviate
|
||||
WEAVIATE_URL: Optional[str] = os.getenv("WEAVIATE_URL")
|
||||
WEAVIATE_API_KEY: Optional[str] = os.getenv("WEAVIATE_API_KEY")
|
||||
|
||||
# Models
|
||||
EMBEDDING_MODEL: str = "embed-english-v3.0" # Default embedding model
|
||||
RERANKER_MODEL: str = "rerank-english-v2.0" # Default reranker model
|
||||
REASONING_MODEL: str = "llama-3.3-70b-versatile" # Default reasoning model
|
||||
PROCESSING_MODEL: str = "llama-3.3-70b-versatile" # Default quick processing model
|
||||
|
||||
# Vector database selector (pinecone or weaviate)
|
||||
VECTOR_DB: str = os.getenv("VECTOR_DB", "pinecone").lower()
|
||||
|
||||
class Config:
|
||||
env_file = ".env"
|
||||
case_sensitive = True
|
||||
|
||||
# Create global settings instance
|
||||
settings = Settings()
|
||||
@@ -0,0 +1,127 @@
|
||||
# Data models
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import List, Dict, Optional, Any, Union
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
import uuid
|
||||
|
||||
class DocumentStatus(str, Enum):
|
||||
"""Enum for document processing status."""
|
||||
PENDING = "pending"
|
||||
PROCESSING = "processing"
|
||||
COMPLETED = "completed"
|
||||
FAILED = "failed"
|
||||
|
||||
class ComplianceLevel(str, Enum):
|
||||
"""Enum for compliance severity levels."""
|
||||
CRITICAL = "critical"
|
||||
MAJOR = "major"
|
||||
MINOR = "minor"
|
||||
INFO = "info"
|
||||
|
||||
class ComplianceIssue(BaseModel):
|
||||
"""Model for compliance issues found in the document."""
|
||||
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
section: str
|
||||
description: str
|
||||
level: ComplianceLevel
|
||||
line_number: Optional[int] = None
|
||||
reasoning: str = "" # Detailed explanation of why this is an issue
|
||||
standard_references: List[str] = [] # References to specific standards or requirements
|
||||
recommendation: str
|
||||
|
||||
class DocumentMetadata(BaseModel):
|
||||
"""Model for document metadata."""
|
||||
filename: str
|
||||
file_type: str
|
||||
file_size: int # In bytes
|
||||
upload_timestamp: datetime = Field(default_factory=datetime.now)
|
||||
last_modified: Optional[datetime] = None
|
||||
|
||||
class DocumentEmbedding(BaseModel):
|
||||
"""Model for document embeddings."""
|
||||
embedding_id: str
|
||||
embedding_model: str
|
||||
vector_db: str
|
||||
sections: Dict[str, str] # Section name to section ID in vector DB
|
||||
|
||||
class ComplianceReport(BaseModel):
|
||||
"""Model for the generated compliance report."""
|
||||
report_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
document_id: str
|
||||
timestamp: datetime = Field(default_factory=datetime.now)
|
||||
compliance_score: float # 0.0 to 1.0
|
||||
summary: str
|
||||
issues: List[ComplianceIssue] = []
|
||||
applied_standards: List[str] = [] # Standards used for analysis
|
||||
|
||||
@property
|
||||
def critical_issues_count(self) -> int:
|
||||
return sum(1 for issue in self.issues if issue.level == ComplianceLevel.CRITICAL)
|
||||
|
||||
@property
|
||||
def major_issues_count(self) -> int:
|
||||
return sum(1 for issue in self.issues if issue.level == ComplianceLevel.MAJOR)
|
||||
|
||||
@property
|
||||
def minor_issues_count(self) -> int:
|
||||
return sum(1 for issue in self.issues if issue.level == ComplianceLevel.MINOR)
|
||||
|
||||
@property
|
||||
def info_issues_count(self) -> int:
|
||||
return sum(1 for issue in self.issues if issue.level == ComplianceLevel.INFO)
|
||||
|
||||
class Document(BaseModel):
|
||||
"""Model for document tracking."""
|
||||
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
metadata: DocumentMetadata
|
||||
embedding: Optional[DocumentEmbedding] = None
|
||||
status: DocumentStatus = DocumentStatus.PENDING
|
||||
version: int = 1 # Incremented on resubmissions
|
||||
reports: List[str] = [] # List of report IDs
|
||||
|
||||
class DocumentUploadResponse(BaseModel):
|
||||
"""Response model for document uploads."""
|
||||
document_id: str
|
||||
filename: str
|
||||
status: DocumentStatus
|
||||
message: str
|
||||
|
||||
class DocumentAnalysisResponse(BaseModel):
|
||||
"""Response model for document analysis retrieval."""
|
||||
document_id: str
|
||||
status: DocumentStatus
|
||||
report: Optional[ComplianceReport] = None
|
||||
message: str
|
||||
|
||||
|
||||
class RequirementSeverity(str, Enum):
|
||||
"""Enum for requirement severity levels."""
|
||||
CRITICAL = "critical"
|
||||
MAJOR = "major"
|
||||
MINOR = "minor"
|
||||
INFO = "info"
|
||||
|
||||
|
||||
class Requirement(BaseModel):
|
||||
"""Model for a compliance requirement."""
|
||||
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
description: str
|
||||
severity: RequirementSeverity
|
||||
details: Optional[str] = None
|
||||
|
||||
|
||||
class Standard(BaseModel):
|
||||
"""Model for a compliance standard."""
|
||||
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
name: str
|
||||
description: str
|
||||
requirements: List[Requirement] = []
|
||||
|
||||
|
||||
class StandardUploadResponse(BaseModel):
|
||||
"""Response model for standard uploads."""
|
||||
standard_id: str
|
||||
name: str
|
||||
requirement_count: int
|
||||
message: str
|
||||
Reference in New Issue
Block a user