import time from schemas import CodeXRequest, CodeXResponse, CodeTaskType, ResponseMeta from code_router import detect_task_type from prompt_builder import build_prompt from model_client import model_client from response_formatter import build_response, build_error_response from code_retriever import retrieve_code_evidence from context_manager import context_manager from scope_router import decide_scope, ScopeRoute from config import settings def should_use_retrieval(task_type: CodeTaskType, request: CodeXRequest) -> bool: if not request.use_retrieval: return False if task_type == CodeTaskType.FIX and settings.ENABLE_RETRIEVAL_FOR_FIX: return True if task_type == CodeTaskType.GENERATE and settings.ENABLE_RETRIEVAL_FOR_GENERATE: return True if task_type == CodeTaskType.EXPLAIN and settings.ENABLE_RETRIEVAL_FOR_EXPLAIN: return True return False def get_retrieved_evidence(task_type: CodeTaskType, request: CodeXRequest): return retrieve_code_evidence(task_type, request) def build_scope_response( route: ScopeRoute, message: str, processing_time_ms: int, ) -> CodeXResponse: warnings = [] if route == ScopeRoute.RESTRICTED: warnings.append("Restricted or unsafe request detected.") elif route == ScopeRoute.IMAGE: warnings.append("Image-related request detected.") elif route == ScopeRoute.NON_CODE: warnings.append("Out-of-scope non-code request detected.") elif route == ScopeRoute.GREETING: warnings.append("Greeting request detected.") else: warnings.append("Unsupported or unclear request detected.") return CodeXResponse( answer=message, task_type=CodeTaskType.UNKNOWN, code_output=None, explanation=message, warnings=warnings, sources=[], needs_clarification=False, meta=ResponseMeta( used_model="scope_router", fallback_used=False, retrieval_used=False, source_count=0, processing_time_ms=processing_time_ms, ), ) def process_codex_request(request: CodeXRequest) -> CodeXResponse: start_time = time.perf_counter() try: scope_decision = decide_scope(request) if not scope_decision.should_continue_to_codex: processing_time_ms = int((time.perf_counter() - start_time) * 1000) return build_scope_response( route=scope_decision.route, message=scope_decision.message, processing_time_ms=processing_time_ms, ) enriched_request = context_manager.enrich_request_with_context( request=request, session_id=request.session_id, ) task_type = detect_task_type( message=enriched_request.message, code=enriched_request.code, error_message=enriched_request.error_message, mode_hint=enriched_request.mode, ) evidence_list = [] retrieval_used = False if should_use_retrieval(task_type, enriched_request): evidence_list = get_retrieved_evidence(task_type, enriched_request) retrieval_used = len(evidence_list) > 0 prompt = build_prompt( task_type=task_type, message=enriched_request.message, code=enriched_request.code, error_message=enriched_request.error_message, language=enriched_request.language, framework=enriched_request.framework, previous_context=enriched_request.previous_context, evidence_list=evidence_list, ) model_output, model_used, used_fallback = model_client.generate(prompt) processing_time_ms = int((time.perf_counter() - start_time) * 1000) response = build_response( task_type=task_type, model_output=model_output, model_used=model_used, used_fallback=used_fallback, retrieval_used=retrieval_used, source_count=len(evidence_list), processing_time_ms=processing_time_ms, original_code=enriched_request.code, sources=evidence_list, ) if response.code_output and response.code_output.strip(): context_manager.save_artifact( session_id=enriched_request.session_id, code=response.code_output, task_type=task_type, language=enriched_request.language, framework=enriched_request.framework, last_user_goal=enriched_request.message, ) return response except Exception as e: processing_time_ms = int((time.perf_counter() - start_time) * 1000) fallback_task = request.mode if request.mode else CodeTaskType.UNKNOWN return build_error_response( task_type=fallback_task, error_message=str(e), processing_time_ms=processing_time_ms, )