Yash030/claude-code-proxy
2
1"""Optimization handlers for fast-path API responses.2 3Each handler returns a MessagesResponse if the request matches and the4optimization is enabled, otherwise None.5"""6 7import uuid8 9from loguru import logger10 11from config.settings import Settings12 13from .command_utils import extract_command_prefix, extract_filepaths_from_command14from .detection import (15 is_filepath_extraction_request,16 is_prefix_detection_request,17 is_quota_check_request,18 is_suggestion_mode_request,19 is_title_generation_request,20 is_trivial_text_request,21)22from .models.anthropic import MessagesRequest23from .models.responses import MessagesResponse, Usage24 25 26def _text_response(27 request_data: MessagesRequest,28 text: str,29 *,30 input_tokens: int,31 output_tokens: int,32) -> MessagesResponse:33 return MessagesResponse(34 id=f"msg_{uuid.uuid4()}",35 model=request_data.model,36 content=[{"type": "text", "text": text}],37 stop_reason="end_turn",38 usage=Usage(input_tokens=input_tokens, output_tokens=output_tokens),39 )40 41 42def try_prefix_detection(43 request_data: MessagesRequest, settings: Settings44) -> MessagesResponse | None:45 """Fast prefix detection - return command prefix without API call."""46 if not settings.fast_prefix_detection:47 return None48 49 is_prefix_req, command = is_prefix_detection_request(request_data)50 if not is_prefix_req:51 return None52 53 logger.info("Optimization: Fast prefix detection request")54 return _text_response(55 request_data,56 extract_command_prefix(command),57 input_tokens=100,58 output_tokens=5,59 )60 61 62def try_quota_mock(63 request_data: MessagesRequest, settings: Settings64) -> MessagesResponse | None:65 """Mock quota probe requests."""66 if not settings.enable_network_probe_mock:67 return None68 if not is_quota_check_request(request_data):69 return None70 71 logger.info("Optimization: Intercepted and mocked quota probe")72 return _text_response(73 request_data,74 "Quota check passed.",75 input_tokens=10,76 output_tokens=5,77 )78 79 80def try_title_skip(81 request_data: MessagesRequest, settings: Settings82) -> MessagesResponse | None:83 """Skip title generation requests."""84 if not settings.enable_title_generation_skip:85 return None86 if not is_title_generation_request(request_data):87 return None88 89 logger.info("Optimization: Skipped title generation request")90 return _text_response(91 request_data,92 "Conversation",93 input_tokens=100,94 output_tokens=5,95 )96 97 98def try_suggestion_skip(99 request_data: MessagesRequest, settings: Settings100) -> MessagesResponse | None:101 """Skip suggestion mode requests."""102 if not settings.enable_suggestion_mode_skip:103 return None104 if not is_suggestion_mode_request(request_data):105 return None106 107 logger.info("Optimization: Skipped suggestion mode request")108 return _text_response(109 request_data,110 "",111 input_tokens=100,112 output_tokens=1,113 )114 115 116def try_filepath_mock(117 request_data: MessagesRequest, settings: Settings118) -> MessagesResponse | None:119 """Mock filepath extraction requests."""120 if not settings.enable_filepath_extraction_mock:121 return None122 123 is_fp, cmd, output = is_filepath_extraction_request(request_data)124 if not is_fp:125 return None126 127 filepaths = extract_filepaths_from_command(cmd, output)128 logger.info("Optimization: Mocked filepath extraction")129 return _text_response(130 request_data,131 filepaths,132 input_tokens=100,133 output_tokens=10,134 )135 136 137def try_trivial_text(138 request_data: MessagesRequest, settings: Settings139) -> MessagesResponse | None:140 """Fast-path trivial text requests (hi, ok, status checks) without API call."""141 is_trivial, text = is_trivial_text_request(request_data)142 if not is_trivial:143 return None144 145 logger.info("Optimization: Fast-path trivial text request")146 return _text_response(147 request_data,148 text,149 input_tokens=5,150 output_tokens=3,151 )152 153 154# Cheapest/most common optimizations first for faster short-circuit.155OPTIMIZATION_HANDLERS = [156 try_trivial_text,157 try_quota_mock,158 try_prefix_detection,159 try_title_skip,160 try_suggestion_skip,161 try_filepath_mock,162]163 164 165def try_optimizations(166 request_data: MessagesRequest, settings: Settings167) -> MessagesResponse | None:168 """Run optimization handlers in order. Returns first match or None."""169 for handler in OPTIMIZATION_HANDLERS:170 result = handler(request_data, settings)171 if result is not None:172 return result173 return None174 