| 113 | return default_table |
| 114 | |
| 115 | class AdvancedRagApiHandler(http.server.BaseHTTPRequestHandler): |
| 116 | def do_OPTIONS(self): |
| 117 | """Handle CORS preflight requests for frontend integration.""" |
| 118 | self.send_response(200) |
| 119 | self.send_header('Access-Control-Allow-Origin', '*') |
| 120 | self.send_header('Access-Control-Allow-Methods', 'POST, OPTIONS') |
| 121 | self.send_header('Access-Control-Allow-Headers', 'Content-Type') |
| 122 | self.end_headers() |
| 123 | |
| 124 | def do_POST(self): |
| 125 | """Handle POST requests for chat and indexing.""" |
| 126 | parsed_path = urlparse(self.path) |
| 127 | |
| 128 | if parsed_path.path == '/chat': |
| 129 | self.handle_chat() |
| 130 | elif parsed_path.path == '/chat/stream': |
| 131 | self.handle_chat_stream() |
| 132 | elif parsed_path.path == '/index': |
| 133 | self.handle_index() |
| 134 | else: |
| 135 | self.send_json_response({"error": "Not Found"}, status_code=404) |
| 136 | |
| 137 | def do_GET(self): |
| 138 | parsed_path = urlparse(self.path) |
| 139 | |
| 140 | if parsed_path.path == '/models': |
| 141 | self.handle_models() |
| 142 | else: |
| 143 | self.send_json_response({"error": "Not Found"}, status_code=404) |
| 144 | |
| 145 | def handle_chat(self): |
| 146 | """Handles a chat query by calling the agentic RAG pipeline.""" |
| 147 | try: |
| 148 | content_length = int(self.headers['Content-Length']) |
| 149 | post_data = self.rfile.read(content_length) |
| 150 | data = json.loads(post_data.decode('utf-8')) |
| 151 | |
| 152 | query = data.get('query') |
| 153 | session_id = data.get('session_id') |
| 154 | compose_flag = data.get('compose_sub_answers') |
| 155 | decomp_flag = data.get('query_decompose') |
| 156 | ai_rerank_flag = data.get('ai_rerank') |
| 157 | ctx_expand_flag = data.get('context_expand') |
| 158 | verify_flag = data.get('verify') |
| 159 | |
| 160 | # ✨ NEW RETRIEVAL PARAMETERS |
| 161 | retrieval_k = data.get('retrieval_k', 20) |
| 162 | context_window_size = data.get('context_window_size', 1) |
| 163 | reranker_top_k = data.get('reranker_top_k', 10) |
| 164 | search_type = data.get('search_type', 'hybrid') |
| 165 | dense_weight = data.get('dense_weight', 0.7) |
| 166 | |
| 167 | # 🚩 NEW: Force RAG override from frontend |
| 168 | force_rag = bool(data.get('force_rag', False)) |
| 169 | |
| 170 | # 🌿 Provence sentence pruning |
| 171 | provence_prune = data.get('provence_prune') |
| 172 | provence_threshold = data.get('provence_threshold') |
nothing calls this directly
no outgoing calls
no test coverage detected