import logging from typing import Dict, Any, List, Union from modules.aicore.aicoreBase import BaseConnectorAi from modules.datamodels.datamodelAi import AiModel, ModelCapabilitiesEnum, PriorityEnum, ProcessingModeEnum, OperationTypeEnum # Configure logger logger = logging.getLogger(__name__) class AiInternal(BaseConnectorAi): """Internal connector for document processing, generation, and rendering.""" def __init__(self): super().__init__() logger.info("Internal Connector initialized") def getConnectorType(self) -> str: """Get the connector type identifier.""" return "internal" def getModels(self) -> List[AiModel]: """Get all available internal models.""" return [ AiModel( name="internal_extraction", displayName="Internal Document Extractor", connectorType="internal", maxTokens=0, # Not token-based contextLength=0, costPer1kTokensInput=0.0, costPer1kTokensOutput=0.0, speedRating=8, qualityRating=8, capabilities=[ModelCapabilitiesEnum.CONTENT_EXTRACTION, ModelCapabilitiesEnum.TEXT_EXTRACTION], functionCall=self.extractDocument, priority=PriorityEnum.COST, processingMode=ProcessingModeEnum.BASIC, operationTypes=[OperationTypeEnum.EXTRACT], version="internal-extractor-v1", calculatePriceUsd=lambda processingTime, bytesSent, bytesReceived: 0.001 + (bytesSent + bytesReceived) / (1024 * 1024) * 0.01 ), AiModel( name="internal_generation", displayName="Internal Document Generator", connectorType="internal", maxTokens=0, # Not token-based contextLength=0, costPer1kTokensInput=0.0, costPer1kTokensOutput=0.0, speedRating=7, qualityRating=8, capabilities=[ModelCapabilitiesEnum.TEXT_GENERATION, ModelCapabilitiesEnum.ANALYSIS], functionCall=self.generateDocument, priority=PriorityEnum.COST, processingMode=ProcessingModeEnum.BASIC, operationTypes=[OperationTypeEnum.GENERATE], version="internal-generator-v1", calculatePriceUsd=lambda processingTime, bytesSent, bytesReceived: 0.002 + (bytesReceived / (1024 * 1024)) * 0.005 ), AiModel( name="internal_rendering", displayName="Internal Document Renderer", connectorType="internal", maxTokens=0, # Not token-based contextLength=0, costPer1kTokensInput=0.0, costPer1kTokensOutput=0.0, speedRating=6, qualityRating=9, capabilities=[ModelCapabilitiesEnum.TEXT_GENERATION, ModelCapabilitiesEnum.ANALYSIS], functionCall=self.renderDocument, priority=PriorityEnum.QUALITY, processingMode=ProcessingModeEnum.DETAILED, operationTypes=[OperationTypeEnum.GENERATE], version="internal-renderer-v1", calculatePriceUsd=lambda processingTime, bytesSent, bytesReceived: 0.003 + (bytesReceived / (1024 * 1024)) * 0.008 ) ] async def extractDocument(self, documentData: Union[str, bytes], extractionType: str = "basic") -> Dict[str, Any]: """ Extract content from a document. Args: documentData: The document data to extract from extractionType: Type of extraction (basic, advanced, detailed) Returns: Dictionary with extraction results """ try: logger.info(f"Starting document extraction with type: {extractionType}") # Simulate document extraction processing # In a real implementation, this would use actual document processing libraries if isinstance(documentData, bytes): content = documentData.decode('utf-8', errors='ignore') else: content = str(documentData) # Basic extraction logic extractedContent = { "text": content, "metadata": { "extraction_type": extractionType, "content_length": len(content), "processing_time": 0.1 # Simulated } } logger.info(f"Document extraction completed successfully") return extractedContent except Exception as e: logger.error(f"Error during document extraction: {str(e)}") return { "error": str(e), "success": False } async def generateDocument(self, template: str, data: Dict[str, Any], format: str = "html") -> Dict[str, Any]: """ Generate a document from a template and data. Args: template: The document template data: Data to populate the template format: Output format (html, pdf, docx, etc.) Returns: Dictionary with generated document """ try: logger.info(f"Starting document generation with format: {format}") # Simulate document generation processing # In a real implementation, this would use actual templating engines # Basic template processing generatedContent = template for key, value in data.items(): placeholder = f"{{{key}}}" generatedContent = generatedContent.replace(placeholder, str(value)) result = { "content": generatedContent, "format": format, "metadata": { "template_length": len(template), "data_keys": list(data.keys()), "processing_time": 0.2 # Simulated } } logger.info(f"Document generation completed successfully") return result except Exception as e: logger.error(f"Error during document generation: {str(e)}") return { "error": str(e), "success": False } async def renderDocument(self, content: str, targetFormat: str, options: Dict[str, Any] = None) -> Dict[str, Any]: """ Render a document to a specific format. Args: content: The content to render targetFormat: Target format (html, pdf, docx, etc.) options: Rendering options Returns: Dictionary with rendered document """ try: logger.info(f"Starting document rendering to format: {targetFormat}") if options is None: options = {} # Simulate document rendering processing # In a real implementation, this would use actual rendering libraries # Basic rendering logic based on target format if targetFormat.lower() == "html": renderedContent = f"{content}" elif targetFormat.lower() == "pdf": # Simulate PDF rendering renderedContent = f"PDF_CONTENT_PLACEHOLDER: {content}" else: # Default to plain text renderedContent = content result = { "content": renderedContent, "format": targetFormat, "metadata": { "input_length": len(content), "output_length": len(renderedContent), "processing_time": 0.3, # Simulated "options": options } } logger.info(f"Document rendering completed successfully") return result except Exception as e: logger.error(f"Error during document rendering: {str(e)}") return { "error": str(e), "success": False } async def _testConnection(self) -> bool: """ Tests the internal processing capabilities. Returns: True if internal processing is working, False otherwise """ try: # Test basic functionality testContent = "Test document content" result = await self.extractDocument(testContent) return result.get("success", True) and "error" not in result except Exception as e: logger.error(f"Internal connector test failed: {str(e)}") return False