diff --git a/optillm/__init__.py b/optillm/__init__.py index 0aad5ab0..a2f8df7e 100644 --- a/optillm/__init__.py +++ b/optillm/__init__.py @@ -14,7 +14,8 @@ del _os.environ[_hf_token_var] # Import from server module -from .server import ( +from .server import ( # noqa: E402 + main, server_config, app, diff --git a/optillm/autothink/classifier.py b/optillm/autothink/classifier.py index 261faaad..386e11c2 100644 --- a/optillm/autothink/classifier.py +++ b/optillm/autothink/classifier.py @@ -6,7 +6,7 @@ """ import logging -from typing import Dict, Any, Tuple, Optional, List, Union +from typing import Tuple, List import os import sys @@ -40,7 +40,6 @@ def _load_model(self): except ImportError: logger.info("Installing adaptive-classifier library...") os.system(f"{sys.executable} -m pip install adaptive-classifier") - import adaptive_classifier # Import the AdaptiveClassifier class from adaptive_classifier import AdaptiveClassifier diff --git a/optillm/autothink/processor.py b/optillm/autothink/processor.py index bade0fda..28e8b633 100644 --- a/optillm/autothink/processor.py +++ b/optillm/autothink/processor.py @@ -9,7 +9,7 @@ import random import logging from transformers import PreTrainedModel, PreTrainedTokenizer, DynamicCache -from typing import Dict, List, Any, Optional, Union, Tuple +from typing import Dict, List, Any, Tuple from .classifier import ComplexityClassifier from .steering import SteeringVectorManager, install_steering_hooks, remove_steering_hooks diff --git a/optillm/autothink/steering.py b/optillm/autothink/steering.py index 11facb8d..2e19043d 100644 --- a/optillm/autothink/steering.py +++ b/optillm/autothink/steering.py @@ -10,8 +10,7 @@ import random import json import datasets -from typing import Dict, List, Any, Tuple, Optional, Union -from collections import defaultdict +from typing import Dict, List, Any, Tuple, Optional logger = logging.getLogger(__name__) @@ -540,7 +539,6 @@ def update_token_history(self, new_tokens: List[int]): if random.random() < 0.01: logger.debug(f"STEERING: Token history updated, now has {len(self.token_history)} tokens") - def update_context(self, new_tokens: str): """ Update the context buffer with new tokens. diff --git a/optillm/batching.py b/optillm/batching.py index 2f761ec2..4ec90b56 100644 --- a/optillm/batching.py +++ b/optillm/batching.py @@ -17,7 +17,7 @@ import queue import time import logging -from typing import Dict, List, Any, Tuple, Optional +from typing import Dict, List, Any, Optional from concurrent.futures import Future from dataclasses import dataclass diff --git a/optillm/bon.py b/optillm/bon.py index e22ee188..cb39fb2d 100644 --- a/optillm/bon.py +++ b/optillm/bon.py @@ -1,5 +1,4 @@ import logging -import optillm from optillm import conversation_logger logger = logging.getLogger(__name__) diff --git a/optillm/cepo/cepo.py b/optillm/cepo/cepo.py index be687244..1c5cd722 100644 --- a/optillm/cepo/cepo.py +++ b/optillm/cepo/cepo.py @@ -6,12 +6,10 @@ import time import math_verify -from optillm import conversation_logger from collections import Counter from concurrent.futures import ThreadPoolExecutor, as_completed from dataclasses import dataclass from typing import Literal, Any, Optional -from cerebras.cloud.sdk import BadRequestError as CerebrasBadRequestError from openai import BadRequestError as OpenAIBadRequestError from openai import InternalServerError as OpenAIInternalServerError @@ -325,7 +323,7 @@ def llm_call_reason_effort_fallback( if len(reasoning_effort_levels) == 1 and bre.message.startswith("Error code: 400 - {'error': {'message': 'think value"): logger.info(f"The think level {effort} was not supported by the model; Disabling thinking") cepo_config.use_reasoning = False - except (OpenAIBadRequestError, OpenAIInternalServerError) as e: + except (OpenAIBadRequestError, OpenAIInternalServerError): # After 2 retries at this reasoning effort level it failed with error 400/500, lower level logger.debug(f"400/500 persisted after retries at reasoning effort {effort}; degrading effort") if logger.getEffectiveLevel() == logging.DEBUG: @@ -491,9 +489,9 @@ def generate_single_plan(i): messages.append({"role": "assistant", "content": response}) plans.append(response) - cb_log[f"messages_planning_fallback_used"] = messages + cb_log["messages_planning_fallback_used"] = messages if cepo_config.print_output: - print(f"\nCePO: No plans generated successfully. Taking the fallback.\n") + print("\nCePO: No plans generated successfully. Taking the fallback.\n") # Step 3 - Review and consolidate plans plans_message = "" @@ -575,7 +573,7 @@ def generate_single_plan(i): cb_log["messages"] = messages if cepo_config.print_output: - print(f"\nCePO: Answer generated for one bestofn_n attempt.") + print("\nCePO: Answer generated for one bestofn_n attempt.") return final_output, completion_tokens, cb_log @@ -692,7 +690,7 @@ def run_single_completion(i): cb_log[f"completion_{i}_completion_tokens"] = tokens_i if cepo_config.print_output or logger.getEffectiveLevel() == logging.DEBUG: - logger.debug(f"\nCePO: All Answers generated!") + logger.debug("\nCePO: All Answers generated!") completions = [c if isinstance(c, str) else "" for c in completions] return completions, completion_tokens, cb_log @@ -882,7 +880,7 @@ def extract_answer_mathverify(response_str, last_n_chars=100): try: float(response_str) return [float(response_str)] - except: + except Exception: response_str = response_str.split("", 1)[1] if "" in response_str else response_str if last_n_chars is not None: response_str = response_str[-last_n_chars:] diff --git a/optillm/cot_decoding.py b/optillm/cot_decoding.py index dbd880bf..0226daab 100644 --- a/optillm/cot_decoding.py +++ b/optillm/cot_decoding.py @@ -1,7 +1,6 @@ import torch from transformers import PreTrainedModel, PreTrainedTokenizer -from typing import List, Tuple, Dict, Optional -import numpy as np +from typing import List, Tuple, Dict def get_device(): if torch.backends.mps.is_available(): diff --git a/optillm/cot_reflection.py b/optillm/cot_reflection.py index 4596f6fa..a86998ec 100644 --- a/optillm/cot_reflection.py +++ b/optillm/cot_reflection.py @@ -1,7 +1,6 @@ import re import logging import optillm -from optillm import conversation_logger logger = logging.getLogger(__name__) @@ -68,7 +67,7 @@ def cot_reflection(system_prompt, initial_query, client, model: str, return_full thinking_match = re.search(r'(.*?)', full_response, re.DOTALL) output_match = re.search(r'(.*?)(?:|$)', full_response, re.DOTALL) - thinking = thinking_match.group(1).strip() if thinking_match else "No thinking process provided." + thinking_match.group(1).strip() if thinking_match else "No thinking process provided." output = output_match.group(1).strip() if output_match else full_response logger.info(f"Final output :\n{output}") diff --git a/optillm/deepconf/confidence.py b/optillm/deepconf/confidence.py index 1f7be1fd..2d9233f9 100644 --- a/optillm/deepconf/confidence.py +++ b/optillm/deepconf/confidence.py @@ -10,7 +10,7 @@ import torch import torch.nn.functional as F import numpy as np -from typing import List, Dict, Tuple, Optional +from typing import Dict, Optional import logging logger = logging.getLogger(__name__) diff --git a/optillm/deepconf/processor.py b/optillm/deepconf/processor.py index 14fc31fb..7a8667fb 100644 --- a/optillm/deepconf/processor.py +++ b/optillm/deepconf/processor.py @@ -10,11 +10,9 @@ import torch import logging -import random -from typing import List, Dict, Any, Optional, Tuple +from typing import List, Dict, Any, Tuple from transformers import PreTrainedModel, PreTrainedTokenizer, DynamicCache from collections import Counter, defaultdict -import numpy as np from .confidence import ConfidenceCalculator, ConfidenceThresholdCalibrator @@ -125,7 +123,7 @@ def generate_single_trace(self, messages: List[Dict[str, str]], kv_cache = outputs.past_key_values # Calculate confidence for current token - token_confidence = self.confidence_calculator.add_token_confidence(logits) + self.confidence_calculator.add_token_confidence(logits) # Check for early termination (only after minimum trace length) if (use_early_termination and diff --git a/optillm/entropy_decoding.py b/optillm/entropy_decoding.py index 3a768fcb..ad1066aa 100644 --- a/optillm/entropy_decoding.py +++ b/optillm/entropy_decoding.py @@ -1,7 +1,7 @@ import torch import torch.nn.functional as F from transformers import PreTrainedModel, PreTrainedTokenizer -from typing import List, Tuple, Dict, Optional +from typing import List, Tuple, Dict import logging # Set up logging diff --git a/optillm/inference.py b/optillm/inference.py index de4ebbb3..a47da043 100644 --- a/optillm/inference.py +++ b/optillm/inference.py @@ -7,7 +7,6 @@ from collections import OrderedDict, defaultdict import torch.nn.functional as F import torch.nn as nn -import math from transformers import AutoModelForCausalLM, AutoTokenizer, PreTrainedModel from peft import PeftModel, PeftConfig import bitsandbytes as bnb @@ -17,7 +16,6 @@ import threading import traceback import platform -import sys import re from optillm.cot_decoding import cot_decode @@ -1069,11 +1067,9 @@ def _load_model(): # Check for flash attention availability try: import flash_attn - has_flash_attn = True logger.info("Flash Attention 2 is available") model_kwargs["attn_implementation"] = "flash_attention_2" except ImportError: - has_flash_attn = False logger.info("Flash Attention 2 is not installed - falling back to default attention") elif 'mps' in device: @@ -1155,7 +1151,7 @@ def _get_adapter_name(self, adapter_id: str) -> str: def validate_adapter(self, adapter_id: str) -> bool: """Validate if adapter exists and is compatible""" try: - config = PeftConfig.from_pretrained( + PeftConfig.from_pretrained( adapter_id, trust_remote_code=True, token=os.getenv("HF_TOKEN") @@ -1591,8 +1587,8 @@ def process_batch( for i in range(0, len(formatted_prompts), self.optimal_batch_size): batch_prompts = formatted_prompts[i:i + self.optimal_batch_size] - batch_system = system_prompts[i:i + self.optimal_batch_size] - batch_user = user_prompts[i:i + self.optimal_batch_size] + system_prompts[i:i + self.optimal_batch_size] + user_prompts[i:i + self.optimal_batch_size] # Check cache first if enabled if self.model_config.enable_prompt_caching: diff --git a/optillm/leap.py b/optillm/leap.py index f5f54a85..9e76d1ec 100644 --- a/optillm/leap.py +++ b/optillm/leap.py @@ -3,7 +3,6 @@ from typing import List, Tuple import json import optillm -from optillm import conversation_logger # Setup logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') diff --git a/optillm/litellm_wrapper.py b/optillm/litellm_wrapper.py index 7bd93543..ed29a108 100644 --- a/optillm/litellm_wrapper.py +++ b/optillm/litellm_wrapper.py @@ -1,9 +1,8 @@ -import os import time import litellm from litellm import completion from litellm.utils import get_valid_models -from typing import List, Dict, Any, Optional +from typing import List, Dict, Optional # Configure litellm to drop unsupported parameters litellm.drop_params = True diff --git a/optillm/mars/agent.py b/optillm/mars/agent.py index 704c33d3..f313f103 100644 --- a/optillm/mars/agent.py +++ b/optillm/mars/agent.py @@ -5,7 +5,6 @@ import logging from typing import Dict, Any, Tuple from datetime import datetime -import random from .prompts import ( MATHEMATICAL_SYSTEM_PROMPT, AGENT_EXPLORATION_PROMPT, diff --git a/optillm/mars/mars.py b/optillm/mars/mars.py index 5ca3c9ce..499edd58 100644 --- a/optillm/mars/mars.py +++ b/optillm/mars/mars.py @@ -5,16 +5,13 @@ import asyncio import logging from typing import Dict, Any, List, Tuple -from datetime import datetime from concurrent.futures import ThreadPoolExecutor import time -import re from collections import Counter -import optillm from optillm import conversation_logger from optillm.utils.answer_extraction import extract_answer -from .workspace import MARSWorkspace, AgentSolution +from .workspace import MARSWorkspace from .agent import MARSAgent from .verifier import MARSVerifier from .aggregator import MARSAggregator @@ -117,7 +114,7 @@ async def _run_mars_parallel( config = LIGHTWEIGHT_CONFIG.copy() if use_lightweight else DEFAULT_CONFIG.copy() if use_lightweight: - logger.info(f"⚡ CONFIG: Using LIGHTWEIGHT MARS config for coding (fast mode)") + logger.info("⚡ CONFIG: Using LIGHTWEIGHT MARS config for coding (fast mode)") # Override with mars_config if provided if request_config and 'mars_config' in request_config: @@ -133,7 +130,7 @@ async def _run_mars_parallel( logger.info(f"⚙️ CONFIG: Using default max_tokens: {config['max_tokens']}") # Log complete configuration - logger.info(f"⚙️ CONFIG: Full MARS configuration:") + logger.info("⚙️ CONFIG: Full MARS configuration:") for key, value in config.items(): logger.info(f"⚙️ CONFIG: {key}: {value}") @@ -181,7 +178,7 @@ async def _run_mars_parallel( # Phase 2a: RSA-inspired Aggregation (if enabled) if config.get('enable_aggregation', True): phase_start = time.time() - logger.info(f"📊 PHASE 2a: RSA-inspired Solution Aggregation") + logger.info("📊 PHASE 2a: RSA-inspired Solution Aggregation") aggregator = MARSAggregator(client, model, config) aggregation_tokens, aggregation_summary = await aggregator.run_aggregation_loops( workspace, request_id, executor @@ -193,7 +190,7 @@ async def _run_mars_parallel( # Phase 2b: Cross-Agent Strategy Sharing (if enabled) if config.get('enable_strategy_network', True): phase_start = time.time() - logger.info(f"📊 PHASE 2b: Cross-Agent Strategy Network") + logger.info("📊 PHASE 2b: Cross-Agent Strategy Network") strategy_network = StrategyNetwork(client, model, config) # Extract reasoning strategies from agent solutions @@ -204,7 +201,7 @@ async def _run_mars_parallel( # Share strategies across agents and generate enhanced solutions if config.get('cross_agent_enhancement', True) and extracted_strategies: - strategy_sharing_summary = await strategy_network.share_strategies_across_agents( + await strategy_network.share_strategies_across_agents( workspace, extracted_strategies, request_id, executor ) @@ -270,14 +267,14 @@ async def _run_mars_parallel( total_time = time.time() - start_time summary = workspace.get_summary() - logger.info(f"🏁 MARS COMPLETION SUMMARY:") + logger.info("🏁 MARS COMPLETION SUMMARY:") logger.info(f"🏁 Total execution time: {total_time:.2f}s") logger.info(f"🏁 Solutions: {summary['verified_solutions']}/{summary['total_solutions']} verified") logger.info(f"🏁 Total reasoning tokens: {total_reasoning_tokens}") logger.info(f"🏁 Final solution length: {len(final_solution)} characters") # Log phase timing breakdown - logger.info(f"🏁 TIMING BREAKDOWN:") + logger.info("🏁 TIMING BREAKDOWN:") for phase, duration in phase_times.items(): percentage = (duration / total_time) * 100 logger.info(f"🏁 {phase}: {duration:.2f}s ({percentage:.1f}%)") @@ -306,7 +303,7 @@ async def _run_mars_parallel( logger.warning(f"⚠️ Falling back to raw synthesis output ({len(final_solution)} chars)") return final_solution, total_reasoning_tokens else: - logger.info(f"📝 ANSWER EXTRACTION: Thinking tags disabled, returning raw synthesis") + logger.info("📝 ANSWER EXTRACTION: Thinking tags disabled, returning raw synthesis") return final_solution, total_reasoning_tokens except Exception as e: @@ -319,7 +316,7 @@ async def _run_mars_parallel( fallback_agent = MARSAgent(0, client, model, config) fallback_solution, fallback_tokens = fallback_agent.generate_solution(initial_query, request_id) return fallback_solution.solution, fallback_tokens - except: + except Exception: return error_response, 0 async def _run_exploration_phase_parallel( @@ -456,7 +453,7 @@ def _synthesize_final_solution( answer_counts = Counter([ans for ans, _ in numerical_answers]) most_common_answers = answer_counts.most_common() - logger.info(f"🗳️ VOTING: Answer distribution:") + logger.info("🗳️ VOTING: Answer distribution:") for answer, count in most_common_answers: percentage = (count / len(numerical_answers)) * 100 agents_with_answer = [sol.agent_id for ans, sol in numerical_answers if ans == answer] @@ -482,7 +479,7 @@ def _synthesize_final_solution( logger.info(f"🗳️ VOTING: Insufficient numerical answers for voting ({len(numerical_answers)} < 2)") # If no consensus, fall back to synthesis with answer preservation - logger.info(f"🤔 VOTING FALLBACK: No numerical consensus found, falling back to answer-preserving synthesis") + logger.info("🤔 VOTING FALLBACK: No numerical consensus found, falling back to answer-preserving synthesis") # Log extracted answers for synthesis guidance all_extracted = getattr(workspace, '_extracted_answers_info', []) @@ -491,7 +488,7 @@ def _synthesize_final_solution( for answer, solution, method in all_extracted: logger.info(f"🔍 EXTRACTED ANSWERS SUMMARY: '{answer}' from Agent {solution.agent_id} via {method}") else: - logger.info(f"🔍 EXTRACTED ANSWERS SUMMARY: No extracted answers found") + logger.info("🔍 EXTRACTED ANSWERS SUMMARY: No extracted answers found") synthesis_data = workspace.get_synthesis_input() @@ -590,7 +587,7 @@ def _synthesize_final_solution( reasoning_tokens = getattr(response.usage, 'reasoning_tokens', 0) # ENHANCED LOGGING: Log synthesis details - logger.info(f"🤝 SYNTHESIS SUCCESS: Synthesis completed") + logger.info("🤝 SYNTHESIS SUCCESS: Synthesis completed") logger.info(f"🤝 SYNTHESIS SUCCESS: Output solution length: {len(final_solution)} characters") logger.info(f"🤝 SYNTHESIS SUCCESS: Reasoning tokens: {reasoning_tokens}") logger.info(f"🤝 SYNTHESIS SUCCESS: Total tokens: {total_tokens}") @@ -607,7 +604,7 @@ def _synthesize_final_solution( logger.info(f"🚑 SYNTHESIS FALLBACK: Solution length: {len(fallback_solution.solution):,} chars, score: {fallback_solution.verification_score:.2f}") return fallback_solution.solution, 0 - logger.error(f"🚨 SYNTHESIS ERROR: No solutions available for fallback") + logger.error("🚨 SYNTHESIS ERROR: No solutions available for fallback") return "Unable to generate solution due to synthesis failure.", 0 def _log_solution_overview(workspace: MARSWorkspace): @@ -619,7 +616,7 @@ def _log_solution_overview(workspace: MARSWorkspace): avg_chars = total_chars / len(workspace.solutions) if workspace.solutions else 0 verified_solutions = workspace.get_verified_solutions() - logger.info(f"📋 SOLUTION OVERVIEW: Statistics:") + logger.info("📋 SOLUTION OVERVIEW: Statistics:") logger.info(f"📋 SOLUTION OVERVIEW: Total solutions: {len(workspace.solutions)}") logger.info(f"📋 SOLUTION OVERVIEW: Verified solutions: {len(verified_solutions)}") logger.info(f"📋 SOLUTION OVERVIEW: Total characters: {total_chars:,}") diff --git a/optillm/mars/verifier.py b/optillm/mars/verifier.py index 85b1bd17..055a64b3 100644 --- a/optillm/mars/verifier.py +++ b/optillm/mars/verifier.py @@ -4,10 +4,10 @@ import asyncio import logging -from typing import Dict, List, Any, Tuple +from typing import Dict, List, Any from datetime import datetime from concurrent.futures import ThreadPoolExecutor -from .workspace import MARSWorkspace, AgentSolution, VerificationResult +from .workspace import MARSWorkspace, AgentSolution from .agent import MARSAgent logger = logging.getLogger(__name__) diff --git a/optillm/mcts.py b/optillm/mcts.py index 2baf35b3..aba72fdd 100644 --- a/optillm/mcts.py +++ b/optillm/mcts.py @@ -3,7 +3,6 @@ import numpy as np import networkx as nx from typing import List, Dict -import optillm from optillm import conversation_logger logger = logging.getLogger(__name__) @@ -94,7 +93,7 @@ def search(self, initial_state: DialogueState, num_simulations: int) -> Dialogue if not self.root: self.root = MCTSNode(initial_state) self.graph.add_node(id(self.root)) - self.node_labels[id(self.root)] = f"Root\nVisits: 0\nValue: 0.00" + self.node_labels[id(self.root)] = "Root\nVisits: 0\nValue: 0.00" logger.debug("Created root node") for i in range(num_simulations): diff --git a/optillm/moa.py b/optillm/moa.py index 6f5f9ad7..b0444c15 100644 --- a/optillm/moa.py +++ b/optillm/moa.py @@ -1,5 +1,4 @@ import logging -import optillm from optillm import conversation_logger logger = logging.getLogger(__name__) diff --git a/optillm/plansearch.py b/optillm/plansearch.py index 85e91a7e..6a6120b8 100644 --- a/optillm/plansearch.py +++ b/optillm/plansearch.py @@ -1,7 +1,6 @@ import logging from typing import List, Tuple import optillm -from optillm import conversation_logger logger = logging.getLogger(__name__) diff --git a/optillm/plugins/coc_plugin.py b/optillm/plugins/coc_plugin.py index 3db92e91..be6240f8 100644 --- a/optillm/plugins/coc_plugin.py +++ b/optillm/plugins/coc_plugin.py @@ -18,12 +18,8 @@ import re import logging -from typing import Tuple, Dict, Any, List +from typing import Tuple, Any, List import ast -import traceback -import math -import importlib -import json import nbformat from nbconvert.preprocessors import ExecutePreprocessor import os @@ -222,7 +218,7 @@ def execute_code(code: str) -> Tuple[Any, str]: # Clean up temporary file try: os.unlink(tmp_name) - except: + except Exception: pass except Exception as e: @@ -274,7 +270,7 @@ def simulate_execution(code: str, error: str, client, model: str) -> Tuple[Any, # Try to convert to appropriate type try: answer = ast.literal_eval(result) - except: + except Exception: answer = result logger.info(f"Simulation successful. Result: {answer}") return answer, response.usage.completion_tokens diff --git a/optillm/plugins/deep_research/research_engine.py b/optillm/plugins/deep_research/research_engine.py index d36cb6bb..61c39200 100644 --- a/optillm/plugins/deep_research/research_engine.py +++ b/optillm/plugins/deep_research/research_engine.py @@ -8,13 +8,10 @@ through denoising and retrieval, generating comprehensive research reports. """ -import asyncio -import json import re -from typing import Tuple, List, Dict, Optional, Any +from typing import Tuple, List, Dict, Any from datetime import datetime -from collections import defaultdict -from optillm.plugins.web_search_plugin import run as web_search_run, BrowserSessionManager +from optillm.plugins.web_search_plugin import run as web_search_run from optillm.plugins.readurls_plugin import run as readurls_run from optillm.plugins.deep_research.session_state import get_session_manager, close_session import uuid @@ -442,7 +439,7 @@ def decompose_query(self, system_prompt: str, initial_query: str) -> List[str]: return queries[:5] # Limit to 5 sub-queries - except Exception as e: + except Exception: # Fallback: use original query return [initial_query] @@ -593,7 +590,7 @@ def evaluate_completeness(self, system_prompt: str, query: str, current_synthesi return is_complete, missing_aspects - except Exception as e: + except Exception: # Default to not complete on error return False, ["Error in evaluation"] @@ -744,7 +741,7 @@ def analyze_draft_gaps(self, current_draft: str, original_query: str) -> List[Di return gaps - except Exception as e: + except Exception: # Fallback: create basic gaps from the draft return [{ 'id': '1', @@ -795,7 +792,7 @@ def perform_gap_targeted_search(self, gaps: List[Dict[str, str]]) -> str: gap_context = f"[ADDRESSING GAP: {gap.get('section', 'Unknown')} - {gap.get('specific_need', 'General research')}]\n" all_results.append(gap_context + enhanced_query) - except Exception as e: + except Exception: continue return "\n\n".join(all_results) if all_results else "No gap-targeted search results obtained" @@ -930,7 +927,7 @@ def evaluate_draft_quality(self, draft: str, previous_draft: str, original_query return scores - except Exception as e: + except Exception: # Default scores return { 'completeness': 0.5, @@ -1192,7 +1189,7 @@ def finalize_research_report(self, system_prompt: str, original_query: str, fina # Validate citation usage before adding references citation_validation = validate_citation_usage(polished_report, len(self.citations)) - print(f"📊 Citation Statistics:") + print("📊 Citation Statistics:") print(f" - Used citations: {citation_validation['citations_used']}/{citation_validation['citations_total']}") print(f" - Usage percentage: {citation_validation['usage_percentage']:.1f}%") @@ -1217,7 +1214,7 @@ def finalize_research_report(self, system_prompt: str, original_query: str, fina # Add TTD-DR metadata metadata = "\n---\n\n**TTD-DR Research Metadata:**\n" - metadata += f"- Algorithm: Test-Time Diffusion Deep Researcher\n" + metadata += "- Algorithm: Test-Time Diffusion Deep Researcher\n" metadata += f"- Denoising iterations: {len(self.draft_history) - 1}\n" metadata += f"- Total gaps addressed: {sum(len(gaps) for gaps in self.gap_analysis_history)}\n" metadata += f"- Total sources consulted: {len(self.citations)}\n" diff --git a/optillm/plugins/deep_research/session_state.py b/optillm/plugins/deep_research/session_state.py index 7a1331a3..a16d1e6e 100644 --- a/optillm/plugins/deep_research/session_state.py +++ b/optillm/plugins/deep_research/session_state.py @@ -89,7 +89,7 @@ def _cleanup_old_sessions(self): if session_id in self._sessions: try: self._sessions[session_id].close() - except: + except Exception: pass del self._sessions[session_id] del self._session_timestamps[session_id] diff --git a/optillm/plugins/deep_research_plugin.py b/optillm/plugins/deep_research_plugin.py index 75a58f0f..df38ba24 100644 --- a/optillm/plugins/deep_research_plugin.py +++ b/optillm/plugins/deep_research_plugin.py @@ -29,7 +29,6 @@ def __init__(self, client, timeout=1800.0, max_retries=0): def _detect_client_type(self): """Detect the type of client based on class name""" class_name = self.client.__class__.__name__ - module_name = self.client.__class__.__module__ # Check for OpenAI-compatible clients (OpenAI, Cerebras, AzureOpenAI) if 'OpenAI' in class_name or 'Cerebras' in class_name: diff --git a/optillm/plugins/deepthink/self_discover.py b/optillm/plugins/deepthink/self_discover.py index 5564cf99..2e4e6a9e 100644 --- a/optillm/plugins/deepthink/self_discover.py +++ b/optillm/plugins/deepthink/self_discover.py @@ -8,7 +8,7 @@ import json import logging import re -from typing import List, Dict, Any, Tuple +from typing import List, Dict, Any from .reasoning_modules import get_all_modules, get_module_descriptions logger = logging.getLogger(__name__) @@ -295,7 +295,7 @@ def _parse_json_structure(self, response_text: str) -> Dict[str, Any]: logger.debug(f"Strategy {i} failed: {e}") continue - logger.warning(f"All JSON parsing strategies failed. Using fallback structure.") + logger.warning("All JSON parsing strategies failed. Using fallback structure.") logger.debug(f"Raw response that failed to parse: {response_text[:500]}...") return fallback_structure @@ -347,7 +347,7 @@ def _extract_json_strategy_3(self, text: str) -> Dict[str, Any]: json_str = match.group(1).strip() try: return json.loads(json_str) - except: + except (json.JSONDecodeError, ValueError): continue raise ValueError("No valid JSON found in code blocks") diff --git a/optillm/plugins/deepthink/uncertainty_cot.py b/optillm/plugins/deepthink/uncertainty_cot.py index d9e056c7..964aa870 100644 --- a/optillm/plugins/deepthink/uncertainty_cot.py +++ b/optillm/plugins/deepthink/uncertainty_cot.py @@ -7,8 +7,7 @@ import re import logging -import json -from typing import List, Dict, Any, Tuple +from typing import List, Dict, Any from collections import Counter from difflib import SequenceMatcher diff --git a/optillm/plugins/executecode_plugin.py b/optillm/plugins/executecode_plugin.py index 8e8a8ce5..6952d02d 100644 --- a/optillm/plugins/executecode_plugin.py +++ b/optillm/plugins/executecode_plugin.py @@ -4,7 +4,6 @@ from nbconvert.preprocessors import ExecutePreprocessor import os import tempfile -import json SLUG = "executecode" diff --git a/optillm/plugins/genselect_plugin.py b/optillm/plugins/genselect_plugin.py index f78aac3d..3d8fe026 100644 --- a/optillm/plugins/genselect_plugin.py +++ b/optillm/plugins/genselect_plugin.py @@ -11,8 +11,7 @@ """ import logging -from typing import Tuple, Dict, Any, List, Optional -import json +from typing import Tuple, Dict, Any, List logger = logging.getLogger(__name__) @@ -249,7 +248,7 @@ def run( # Get the selected candidate selected_candidate = candidates[selected_index] - logger.info(f"GenSelect Summary:") + logger.info("GenSelect Summary:") logger.info(f" - Generated {len(candidates)} candidates") logger.info(f" - Selected candidate {selected_index + 1}") logger.info(f" - Total tokens used: {total_tokens}") diff --git a/optillm/plugins/json_plugin.py b/optillm/plugins/json_plugin.py index c686859e..648ecd32 100644 --- a/optillm/plugins/json_plugin.py +++ b/optillm/plugins/json_plugin.py @@ -127,7 +127,7 @@ def extract_schema_from_response_format(response_format: Dict[str, Any]) -> Opti return json.dumps(schema_data["schema"]) return json.dumps(schema_data) - logger.warning(f"Could not extract valid schema from response_format") + logger.warning("Could not extract valid schema from response_format") return None except Exception as e: logger.error(f"Error extracting schema from response_format: {str(e)}") diff --git a/optillm/plugins/longcepo/chunking.py b/optillm/plugins/longcepo/chunking.py index 37dd5f13..9463b12d 100644 --- a/optillm/plugins/longcepo/chunking.py +++ b/optillm/plugins/longcepo/chunking.py @@ -216,7 +216,7 @@ def split_into_granular_chunks( new_last_chunk = new_sentences[end] + new_last_chunk end -= 1 flag = True - if flag == False: + if not flag: break if start < end: # If there is any unallocated part, split it by punctuation or space and then allocate it diff --git a/optillm/plugins/longcepo/mapreduce.py b/optillm/plugins/longcepo/mapreduce.py index 66497afb..4fd360c3 100644 --- a/optillm/plugins/longcepo/mapreduce.py +++ b/optillm/plugins/longcepo/mapreduce.py @@ -14,7 +14,8 @@ get_prompt_length, ) -format_chunk_list = lambda chunk_list: [ +def format_chunk_list(chunk_list): + return [ f"Information of Chunk {index}:\n{doc}\n" for index, doc in enumerate(chunk_list) ] diff --git a/optillm/plugins/longcepo/utils.py b/optillm/plugins/longcepo/utils.py index cd3a3c69..f8a4e4b4 100644 --- a/optillm/plugins/longcepo/utils.py +++ b/optillm/plugins/longcepo/utils.py @@ -78,7 +78,8 @@ def concurrent_map( Tuple[List[str], CBLog]: List of responses (in original order) and updated log object. """ result = [None] * len(context_chunks) - wrapped_gen_function = lambda index, *args: (index, gen_function(*args)) + def wrapped_gen_function(index, *args): + return (index, gen_function(*args)) with ThreadPoolExecutor(max_workers=workers) as executor: future_to_idx = {} for idx, chunk in enumerate(context_chunks): diff --git a/optillm/plugins/majority_voting_plugin.py b/optillm/plugins/majority_voting_plugin.py index b7ee484b..af29c951 100644 --- a/optillm/plugins/majority_voting_plugin.py +++ b/optillm/plugins/majority_voting_plugin.py @@ -7,7 +7,7 @@ import re import logging -from typing import Tuple, Dict, Any, List, Optional +from typing import Tuple, Dict, Any from collections import Counter logger = logging.getLogger(__name__) diff --git a/optillm/plugins/mcp_plugin.py b/optillm/plugins/mcp_plugin.py index 49983eeb..065c05c7 100644 --- a/optillm/plugins/mcp_plugin.py +++ b/optillm/plugins/mcp_plugin.py @@ -9,12 +9,8 @@ import json import logging import asyncio -import sys -import time -import re import shutil -import subprocess -from typing import Dict, List, Any, Optional, Tuple, Set, Union, Callable +from typing import Dict, List, Any, Optional, Tuple from dataclasses import dataclass from pathlib import Path import traceback @@ -23,7 +19,6 @@ from mcp.client.stdio import stdio_client from mcp.client.sse import sse_client from mcp.client.websocket import websocket_client -import mcp.types as types from mcp.shared.exceptions import McpError # Configure logging @@ -61,14 +56,14 @@ def log_mcp_message(direction: str, method: str, params: Any = None, result: Any try: params_str = json.dumps(params, indent=2) message_parts.append(f"Params: {params_str}") - except: + except (TypeError, ValueError): message_parts.append(f"Params: {params}") if result: try: result_str = json.dumps(result, indent=2) message_parts.append(f"Result: {result_str}") - except: + except (TypeError, ValueError): message_parts.append(f"Result: {result}") if error: @@ -453,13 +448,13 @@ async def log_stdout(): asyncio.create_task(log_stdout()) # Wait a bit for the server to start up - logger.debug(f"Waiting for server to start up...") + logger.debug("Waiting for server to start up...") await asyncio.sleep(2) # Use the MCP client with proper context management logger.debug(f"Establishing MCP client connection to {self.server_name}") async with stdio_client(server_params) as (read_stream, write_stream): - logger.debug(f"Connection established, creating session") + logger.debug("Connection established, creating session") # Use our logging session instead of the regular one async with LoggingClientSession(read_stream, write_stream) as session: return await self.connect_stdio(session) @@ -680,7 +675,7 @@ async def execute_tool(server_name: str, tool_name: str, arguments: Dict[str, An return {"error": f"Server {server_name} not found in configuration"} # Log the tool call in detail - logger.debug(f"Tool call details:") + logger.debug("Tool call details:") logger.debug(f" Server: {server_name}") logger.debug(f" Tool: {tool_name}") logger.debug(f" Arguments: {json.dumps(arguments, indent=2)}") diff --git a/optillm/plugins/memory_plugin.py b/optillm/plugins/memory_plugin.py index 0a41f98d..40755988 100644 --- a/optillm/plugins/memory_plugin.py +++ b/optillm/plugins/memory_plugin.py @@ -4,7 +4,6 @@ import re import tempfile from typing import Optional, Tuple, List -import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity diff --git a/optillm/plugins/privacy_plugin.py b/optillm/plugins/privacy_plugin.py index 5ba2228a..8a6a0ca1 100644 --- a/optillm/plugins/privacy_plugin.py +++ b/optillm/plugins/privacy_plugin.py @@ -1,6 +1,6 @@ import spacy from presidio_analyzer import AnalyzerEngine -from presidio_anonymizer import AnonymizerEngine, DeanonymizeEngine, OperatorConfig +from presidio_anonymizer import AnonymizerEngine, OperatorConfig from presidio_anonymizer.operators import Operator, OperatorType from typing import Dict, Tuple, Optional diff --git a/optillm/plugins/proxy/approach_handler.py b/optillm/plugins/proxy/approach_handler.py index 4dc5976b..2ad6e518 100644 --- a/optillm/plugins/proxy/approach_handler.py +++ b/optillm/plugins/proxy/approach_handler.py @@ -5,7 +5,7 @@ import importlib.util import logging import inspect -from typing import Optional, Tuple, Dict, Any +from typing import Optional, Tuple from pathlib import Path logger = logging.getLogger(__name__) @@ -108,7 +108,6 @@ def _discover_plugins(self): """Discover available plugins dynamically""" try: import optillm - import os import glob # Get plugin directories diff --git a/optillm/plugins/proxy/client.py b/optillm/plugins/proxy/client.py index f26bf151..94dcb9ef 100644 --- a/optillm/plugins/proxy/client.py +++ b/optillm/plugins/proxy/client.py @@ -3,9 +3,7 @@ """ import time import logging -import random -from typing import Dict, List, Any, Optional -import concurrent.futures +from typing import Dict, Optional import threading from openai import OpenAI, AzureOpenAI from optillm.plugins.proxy.routing import RouterFactory @@ -184,7 +182,7 @@ def _test_system_message_support(self, provider, model: str) -> bool: return self._system_message_support_cache[cache_key] try: - test_response = provider.client.chat.completions.create( + provider.client.chat.completions.create( model=model, messages=[ {"role": "system", "content": "test"}, diff --git a/optillm/plugins/proxy/health.py b/optillm/plugins/proxy/health.py index 40286d0e..3ecf15e1 100644 --- a/optillm/plugins/proxy/health.py +++ b/optillm/plugins/proxy/health.py @@ -48,7 +48,7 @@ def _check_provider(self, provider): try: # Simple health check - try to get models # This creates a minimal request to verify the endpoint is responsive - response = provider.client.models.list() + provider.client.models.list() # Mark as healthy if not provider.is_healthy: diff --git a/optillm/plugins/proxy/routing.py b/optillm/plugins/proxy/routing.py index e330ab06..64c15f0a 100644 --- a/optillm/plugins/proxy/routing.py +++ b/optillm/plugins/proxy/routing.py @@ -40,7 +40,6 @@ def select(self, providers: List) -> Optional: logger.debug(f"Round-robin: Starting selection, index={self.index}, providers={[p.name for p in providers]}") # Find next available provider in round-robin fashion - start_index = self.index attempts = 0 while attempts < len(self.all_providers): # Get provider at current index from all providers diff --git a/optillm/plugins/proxy_plugin.py b/optillm/plugins/proxy_plugin.py index edcdc474..d2a631d2 100644 --- a/optillm/plugins/proxy_plugin.py +++ b/optillm/plugins/proxy_plugin.py @@ -1,3 +1,4 @@ +import os """ Proxy Plugin for OptiLLM - Load balancing and failover for LLM providers @@ -6,7 +7,7 @@ """ import logging import threading -from typing import Tuple, Optional, Dict +from typing import Tuple, Dict from optillm.plugins.proxy.config import ProxyConfig from optillm.plugins.proxy.client import ProxyClient from optillm.plugins.proxy.approach_handler import ApproachHandler @@ -15,7 +16,6 @@ logger = logging.getLogger(__name__) # Configure logging based on environment -import os log_level = os.environ.get('OPTILLM_LOG_LEVEL', 'INFO') logging.basicConfig(level=getattr(logging, log_level)) @@ -33,7 +33,7 @@ def _test_system_message_support(proxy_client, model: str) -> bool: """ try: # Try a minimal system message request - test_response = proxy_client.chat.completions.create( + proxy_client.chat.completions.create( model=model, messages=[ {"role": "system", "content": "test"}, diff --git a/optillm/plugins/readurls_plugin.py b/optillm/plugins/readurls_plugin.py index b799bca6..143476cb 100644 --- a/optillm/plugins/readurls_plugin.py +++ b/optillm/plugins/readurls_plugin.py @@ -1,7 +1,6 @@ import re from typing import Tuple, List, Optional import requests -import os from bs4 import BeautifulSoup from urllib.parse import urlparse from optillm import __version__, server_config diff --git a/optillm/plugins/router_plugin.py b/optillm/plugins/router_plugin.py index 2a6f5a21..4a11abdc 100644 --- a/optillm/plugins/router_plugin.py +++ b/optillm/plugins/router_plugin.py @@ -3,11 +3,9 @@ import torch import torch.nn as nn import torch.nn.functional as F -from transformers import AutoModel, AutoTokenizer, AutoConfig +from transformers import AutoModel, AutoTokenizer from huggingface_hub import hf_hub_download -from safetensors import safe_open from safetensors.torch import load_model -from transformers import AutoTokenizer, AutoModel from optillm.mcts import chat_with_mcts from optillm.bon import best_of_n_sampling from optillm.moa import mixture_of_agents diff --git a/optillm/plugins/spl/evaluation.py b/optillm/plugins/spl/evaluation.py index 87d07f86..0b8dbcd6 100644 --- a/optillm/plugins/spl/evaluation.py +++ b/optillm/plugins/spl/evaluation.py @@ -4,7 +4,7 @@ import logging from datetime import datetime -from typing import Dict, List, Optional, Tuple, Any +from typing import Dict, List, Optional, Any from optillm.plugins.spl.strategy import Strategy from optillm.plugins.spl.utils import extract_thinking diff --git a/optillm/plugins/spl/generation.py b/optillm/plugins/spl/generation.py index 76dbbeb5..766ac580 100644 --- a/optillm/plugins/spl/generation.py +++ b/optillm/plugins/spl/generation.py @@ -4,7 +4,7 @@ import uuid import logging -from typing import Tuple, Optional, List, Dict, Any +from typing import Tuple, Optional, List from optillm.plugins.spl.strategy import Strategy, StrategyDatabase from optillm.plugins.spl.utils import extract_thinking diff --git a/optillm/plugins/spl/main.py b/optillm/plugins/spl/main.py index d47d52c1..ac6370b4 100644 --- a/optillm/plugins/spl/main.py +++ b/optillm/plugins/spl/main.py @@ -4,9 +4,9 @@ import time import logging -from typing import Tuple, Dict, List, Optional, Any +from typing import Tuple -from .strategy import Strategy, StrategyDatabase +from .strategy import StrategyDatabase from .generation import ( classify_problem, generate_strategy, @@ -109,7 +109,7 @@ def run_spl(system_prompt: str, initial_query: str, client, model: str, request_ logger.info(f"Merged {merged_count} similar strategies") # 4.2 Limit strategies per problem type (applies storage limit, not inference limit) - limited_count = db.limit_strategies_per_type(max_per_type=MAX_STRATEGIES_PER_TYPE) + db.limit_strategies_per_type(max_per_type=MAX_STRATEGIES_PER_TYPE) # 4.3 Prune low-performing strategies pruned_count = db.prune_strategies() @@ -133,7 +133,7 @@ def run_spl(system_prompt: str, initial_query: str, client, model: str, request_ else: # Strategies exist but don't meet the minimum success rate logger.info(f"Strategies exist for problem type '{problem_type}' but none meet the minimum success rate threshold of {MIN_SUCCESS_RATE_FOR_INFERENCE:.2f}.") - logger.info(f"Enable learning mode with 'spl_learning=True' to improve strategies.") + logger.info("Enable learning mode with 'spl_learning=True' to improve strategies.") # Use the original system prompt without augmentation logger.info("Running without strategy augmentation - using base system prompt only.") diff --git a/optillm/plugins/spl/strategy.py b/optillm/plugins/spl/strategy.py index ef87faa9..97baa291 100644 --- a/optillm/plugins/spl/strategy.py +++ b/optillm/plugins/spl/strategy.py @@ -6,9 +6,8 @@ import logging import os from datetime import datetime -from typing import Dict, List, Optional, Tuple, Any, Union +from typing import Dict, List, Optional, Tuple, Any -import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity diff --git a/optillm/plugins/spl/utils.py b/optillm/plugins/spl/utils.py index 7c5b2815..095933af 100644 --- a/optillm/plugins/spl/utils.py +++ b/optillm/plugins/spl/utils.py @@ -3,9 +3,8 @@ """ import re -import uuid import logging -from typing import Tuple, Optional, List, Dict, Any +from typing import Tuple, Optional, List, Any from optillm.plugins.spl.prompts import STRATEGY_APPLICATION_PROMPT diff --git a/optillm/plugins/web_search_plugin.py b/optillm/plugins/web_search_plugin.py index f3724fa1..56c71538 100644 --- a/optillm/plugins/web_search_plugin.py +++ b/optillm/plugins/web_search_plugin.py @@ -1,6 +1,5 @@ import re import time -import json import random from typing import Tuple, List, Dict, Optional from selenium import webdriver @@ -71,7 +70,7 @@ def search(self, query: str, num_results: int = 10, delay_seconds: Optional[int] if self._searcher: try: self._searcher.close() - except: + except Exception: pass # Ignore errors during cleanup self._searcher = None @@ -170,18 +169,18 @@ def detect_captcha(self) -> bool: try: self.driver.find_element(By.CSS_SELECTOR, "iframe[src*='recaptcha']") return True - except: + except Exception: pass # Check for CAPTCHA challenge div try: self.driver.find_element(By.ID, "captcha") return True - except: + except Exception: pass return False - except: + except Exception: return False def wait_for_captcha_resolution(self, max_wait: int = 300) -> bool: @@ -247,7 +246,7 @@ def search(self, query: str, num_results: int = 10, delay_seconds: Optional[int] accept_button = self.driver.find_element(By.XPATH, "//button[contains(text(), 'Accept') or contains(text(), 'I agree') or contains(text(), 'Agree')]") accept_button.click() time.sleep(1) - except: + except Exception: pass # No consent form # Find search box and enter query @@ -260,7 +259,7 @@ def search(self, query: str, num_results: int = 10, delay_seconds: Optional[int] EC.presence_of_element_located(selector) ) break - except: + except Exception: continue if search_box: @@ -285,7 +284,7 @@ def search(self, query: str, num_results: int = 10, delay_seconds: Optional[int] return [] else: raise Exception("Could not find search box") - except: + except Exception: # Fallback to direct URL navigation print("Using direct URL navigation...") search_url = f"https://www.google.com/search?q={quote_plus(query)}&num={num_results}" @@ -312,7 +311,7 @@ def search(self, query: str, num_results: int = 10, delay_seconds: Optional[int] wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.g")) ) - except: + except Exception: print("No results found after CAPTCHA resolution") return [] else: @@ -352,7 +351,7 @@ def search(self, query: str, num_results: int = 10, delay_seconds: Optional[int] WebDriverWait(self.driver, 10).until( lambda driver: driver.find_elements(By.CSS_SELECTOR, "div.g") ) - except: + except Exception: print("Still no results after CAPTCHA resolution") return [] else: @@ -384,7 +383,7 @@ def search(self, query: str, num_results: int = 10, delay_seconds: Optional[int] link = elem.find_element(By.CSS_SELECTOR, "a[href]") if h3 and link: search_results.append(elem) - except: + except Exception: continue print(f"Filtered to {len(search_results)} valid result elements") @@ -426,9 +425,9 @@ def search(self, query: str, num_results: int = 10, delay_seconds: Optional[int] if snippet_elem and snippet_elem.text: snippet = snippet_elem.text break - except: + except Exception: pass - except: + except Exception: pass # Add result @@ -444,7 +443,7 @@ def search(self, query: str, num_results: int = 10, delay_seconds: Optional[int] print(f"Failed to parse result {i+1}") continue - except Exception as e: + except Exception: # Skip problematic results continue diff --git a/optillm/pvg.py b/optillm/pvg.py index bb327d3c..f8449ffe 100644 --- a/optillm/pvg.py +++ b/optillm/pvg.py @@ -2,7 +2,6 @@ import re from typing import List, Tuple import optillm -from optillm import conversation_logger logger = logging.getLogger(__name__) diff --git a/optillm/reread.py b/optillm/reread.py index 6b48873b..05a58bff 100644 --- a/optillm/reread.py +++ b/optillm/reread.py @@ -1,6 +1,5 @@ import logging import optillm -from optillm import conversation_logger logger = logging.getLogger(__name__) diff --git a/optillm/rstar.py b/optillm/rstar.py index 520641bc..f234d6d1 100644 --- a/optillm/rstar.py +++ b/optillm/rstar.py @@ -1,13 +1,10 @@ import math import random import logging -from typing import List, Dict, Any, Tuple +from typing import List, Tuple import re import asyncio -import aiohttp -from concurrent.futures import ThreadPoolExecutor import optillm -from optillm import conversation_logger # Set up logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') diff --git a/optillm/rto.py b/optillm/rto.py index 60a5cfeb..325f424a 100644 --- a/optillm/rto.py +++ b/optillm/rto.py @@ -1,7 +1,6 @@ import re import logging import optillm -from optillm import conversation_logger logger = logging.getLogger(__name__) diff --git a/optillm/self_consistency.py b/optillm/self_consistency.py index 0622a19c..240578f3 100644 --- a/optillm/self_consistency.py +++ b/optillm/self_consistency.py @@ -2,7 +2,6 @@ from typing import List, Dict from difflib import SequenceMatcher import optillm -from optillm import conversation_logger logger = logging.getLogger(__name__) diff --git a/optillm/server.py b/optillm/server.py index c9697369..9ed34b67 100644 --- a/optillm/server.py +++ b/optillm/server.py @@ -3,7 +3,6 @@ import os import secrets import time -import traceback from pathlib import Path from flask import Flask, request, jsonify from cerebras.cloud.sdk import Cerebras @@ -14,9 +13,7 @@ import glob import asyncio import re -from concurrent.futures import ThreadPoolExecutor -from typing import Tuple, Optional, Union, Dict, Any, List -from importlib.metadata import version +from typing import Tuple, Union, Dict, Any, List from dataclasses import fields # Import approach modules @@ -1028,14 +1025,14 @@ def parse_args(): for arg, env, type_, default, help_text, *extra in args_env: env_value = os.environ.get(env) if env_value is not None: - if type_ == bool: + if type_ is bool: default = env_value.lower() in ('true', '1', 'yes') else: default = type_(env_value) if extra and extra[0]: # Check if there are choices for this argument parser.add_argument(arg, type=type_, default=default, help=help_text, choices=extra[0]) else: - if type_ == bool: + if type_ is bool: # For boolean flags, use store_true action parser.add_argument(arg, action='store_true', default=default, help=help_text) else: @@ -1149,7 +1146,6 @@ def process_batch_requests(batch_requests): logger.info(f"Processing batch of {len(batch_requests)} requests") # Check if we can use true batching (all requests compatible and using 'none' approach) - can_use_true_batching = True first_req = batch_requests[0] # Check compatibility across all requests @@ -1158,7 +1154,6 @@ def process_batch_requests(batch_requests): req_data['approaches'] != first_req['approaches'] or req_data['operation'] != first_req['operation'] or req_data['model'] != first_req['model']): - can_use_true_batching = False break # For now, implement sequential processing but with proper infrastructure diff --git a/optillm/thinkdeeper.py b/optillm/thinkdeeper.py index 56a2a8ca..c99e8766 100644 --- a/optillm/thinkdeeper.py +++ b/optillm/thinkdeeper.py @@ -1,7 +1,7 @@ import torch import random from transformers import PreTrainedModel, PreTrainedTokenizer, DynamicCache -from typing import Tuple, Dict, Any, List +from typing import Dict, Any, List import logging logger = logging.getLogger(__name__) diff --git a/optillm/thinkdeeper_mlx.py b/optillm/thinkdeeper_mlx.py index 42c099d6..70a46d83 100644 --- a/optillm/thinkdeeper_mlx.py +++ b/optillm/thinkdeeper_mlx.py @@ -4,7 +4,7 @@ """ import random -from typing import Tuple, Dict, Any, List +from typing import Dict, Any, List import logging logger = logging.getLogger(__name__) diff --git a/optillm/utils/answer_extraction.py b/optillm/utils/answer_extraction.py index 6e039934..44c8ee46 100644 --- a/optillm/utils/answer_extraction.py +++ b/optillm/utils/answer_extraction.py @@ -7,7 +7,7 @@ import re import logging -from typing import Optional, Union, Any, Dict, List +from typing import Optional, Any import math_verify logger = logging.getLogger(__name__) diff --git a/optillm/z3_solver.py b/optillm/z3_solver.py index 0f0b9405..677ecb12 100644 --- a/optillm/z3_solver.py +++ b/optillm/z3_solver.py @@ -1,5 +1,5 @@ from typing import Dict, Any -from z3 import * +from z3 import * # noqa: F403 import sympy import io import re @@ -10,7 +10,6 @@ import multiprocessing import traceback import optillm -from optillm import conversation_logger class TimeoutException(Exception): pass @@ -63,9 +62,6 @@ def prepare_execution_globals(): def execute_code_in_process(code: str): import z3 - import sympy - import math - import itertools from fractions import Fraction execution_globals = prepare_execution_globals() diff --git a/scripts/eval_aime_benchmark.py b/scripts/eval_aime_benchmark.py index 7aaa32fb..6aabb124 100644 --- a/scripts/eval_aime_benchmark.py +++ b/scripts/eval_aime_benchmark.py @@ -5,9 +5,7 @@ import re import time import math -import numpy as np -from typing import List, Dict, Tuple, Optional, Union, Counter -from datetime import datetime +from typing import List, Dict, Tuple, Optional, Union from openai import OpenAI from datasets import load_dataset from tqdm import tqdm @@ -165,7 +163,6 @@ def analyze_thinking(response: str) -> Dict: result["thinking_tokens_text"] = thinking_text # Count thought transitions - position = 0 for phrase in THOUGHT_TRANSITIONS: # Find all occurrences of each transition phrase for match in re.finditer(r'\b' + re.escape(phrase) + r'\b', thinking_text): @@ -496,9 +493,9 @@ def analyze_results(results: List[Dict], n: int, analyze_thoughts: bool = False, successful_attempts = [r['first_correct_attempt'] for r in results if r['is_correct']] if successful_attempts: avg_attempts = sum(successful_attempts) / len(successful_attempts) - print(f"\nFor correct solutions:") + print("\nFor correct solutions:") print(f"Average attempts needed: {avg_attempts:.2f}") - print(f"Attempt distribution:") + print("Attempt distribution:") for i in range(1, n + 1): count = sum(1 for x in successful_attempts if x == i) print(f" Attempt {i}: {count} problems") @@ -564,7 +561,7 @@ def calc_stats(attempts): print(f"- Average thought transitions: {all_stats['avg_thought_transitions']:.2f}") print(f"- Median thought transitions: {all_stats['median_thought_transitions']}") print(f"- Percentage with tags: {all_stats['has_think_tags_pct']:.2f}%") - print(f"- Transition phrase usage:") + print("- Transition phrase usage:") for phrase, count in all_stats['transition_usage'].items(): print(f" - {phrase}: {count} occurrences") @@ -574,7 +571,7 @@ def calc_stats(attempts): print(f"- Average thought transitions: {correct_stats['avg_thought_transitions']:.2f}") print(f"- Median thought transitions: {correct_stats['median_thought_transitions']}") print(f"- Percentage with tags: {correct_stats['has_think_tags_pct']:.2f}%") - print(f"- Transition phrase usage:") + print("- Transition phrase usage:") for phrase, count in correct_stats['transition_usage'].items(): print(f" - {phrase}: {count} occurrences") @@ -584,7 +581,7 @@ def calc_stats(attempts): print(f"- Average thought transitions: {incorrect_stats['avg_thought_transitions']:.2f}") print(f"- Median thought transitions: {incorrect_stats['median_thought_transitions']}") print(f"- Percentage with tags: {incorrect_stats['has_think_tags_pct']:.2f}%") - print(f"- Transition phrase usage:") + print("- Transition phrase usage:") for phrase, count in incorrect_stats['transition_usage'].items(): print(f" - {phrase}: {count} occurrences") @@ -727,12 +724,12 @@ def calc_logit_stats(attempts): print(f"- Average entropy std: {all_stats['entropy']['std']:.4f}") if all_stats['entropy']['quartiles']: - print(f"- Entropy by generation quartile:") + print("- Entropy by generation quartile:") for i, q in enumerate(all_stats['entropy']['quartiles']): print(f" - Q{i+1}: {q:.4f}") if all_stats['transitions']: - print(f"- Entropy around thought transitions:") + print("- Entropy around thought transitions:") for phrase, stats in all_stats['transitions'].items(): change = stats['entropy_change'] change_dir = "increases" if change > 0 else "decreases" @@ -755,7 +752,7 @@ def calc_logit_stats(attempts): # Compare entropy progression if (correct_stats['entropy']['quartiles'] and incorrect_stats['entropy']['quartiles']): - print(f"- Entropy progression through generation:") + print("- Entropy progression through generation:") for i in range(min(len(correct_stats['entropy']['quartiles']), len(incorrect_stats['entropy']['quartiles']))): @@ -769,7 +766,7 @@ def calc_logit_stats(attempts): common_transitions = set(correct_stats['transitions'].keys()) & set(incorrect_stats['transitions'].keys()) if common_transitions: - print(f"- Entropy changes around thought transitions:") + print("- Entropy changes around thought transitions:") for phrase in common_transitions: c_stats = correct_stats['transitions'][phrase] @@ -863,9 +860,9 @@ def main(model: str, n_attempts: int, year: int = 2024, analyze_thoughts: bool = predicted_answers = [attempt.get('predicted_answer') for attempt in attempts] print(f" Predicted: {predicted_answers}") if is_correct: - print(f" ✅ CORRECT!") + print(" ✅ CORRECT!") else: - print(f" ❌ Incorrect") + print(" ❌ Incorrect") result = { "index": id, diff --git a/scripts/eval_frames_benchmark.py b/scripts/eval_frames_benchmark.py index 931f341b..54163580 100644 --- a/scripts/eval_frames_benchmark.py +++ b/scripts/eval_frames_benchmark.py @@ -1,7 +1,6 @@ import argparse import json import os -import time from typing import List, Dict from openai import OpenAI diff --git a/scripts/eval_imo25_benchmark.py b/scripts/eval_imo25_benchmark.py index a9eb7955..6b66a8ef 100644 --- a/scripts/eval_imo25_benchmark.py +++ b/scripts/eval_imo25_benchmark.py @@ -1,3 +1,4 @@ +from imo25_reference import IMO_2025_PROBLEMS, verify_answer_format, verify_key_insights """ Evaluation script for IMO 2025 problems using OptiLLM approaches Designed to test MARS and other approaches on challenging proof-based problems @@ -9,7 +10,7 @@ import logging import re import time -from typing import List, Dict, Tuple, Optional +from typing import List, Dict from datetime import datetime from openai import OpenAI from tqdm import tqdm @@ -27,7 +28,6 @@ client = OpenAI(api_key="optillm", base_url="http://localhost:8001/v1") # Import the actual IMO 2025 problems and reference solutions -from imo25_reference import IMO_2025_PROBLEMS, verify_answer_format, verify_key_insights SYSTEM_PROMPT = '''You are solving IMO (International Mathematical Olympiad) problems - the most challenging mathematical competition problems for high school students. @@ -640,7 +640,7 @@ def analyze_results(results: List[Dict], approach_name: str = None): print(f"Average reasoning tokens per problem: {avg_reasoning_tokens:.0f}") # Problem type breakdown - print(f"\nProblem Type Breakdown:") + print("\nProblem Type Breakdown:") type_stats = {} for result in results: prob_type = result['problem_data']['type'] @@ -657,7 +657,7 @@ def analyze_results(results: List[Dict], approach_name: str = None): print(f" {prob_type}: {stats['correct']}/{stats['total']} ({accuracy:.1%}) - Avg score: {avg_score:.3f}") # Detailed problem results - print(f"\nDetailed Results:") + print("\nDetailed Results:") print("-" * 80) for result in results: prob_id = result['problem_data']['id'] @@ -669,7 +669,7 @@ def analyze_results(results: List[Dict], approach_name: str = None): print(f"Problem {prob_id} ({prob_type}): {status} {verdict} - {tokens:,} tokens") # Quality analysis summary - print(f"\nSolution Quality Analysis:") + print("\nSolution Quality Analysis:") print("-" * 40) quality_metrics = [ "has_proof_structure", "uses_mathematical_notation", "has_logical_steps", diff --git a/scripts/eval_imobench_answer.py b/scripts/eval_imobench_answer.py index f98b27fe..73a3c664 100644 --- a/scripts/eval_imobench_answer.py +++ b/scripts/eval_imobench_answer.py @@ -11,7 +11,7 @@ import re import pandas as pd import requests -from typing import List, Dict, Optional +from typing import List, Dict from datetime import datetime from openai import OpenAI from tqdm import tqdm diff --git a/scripts/eval_imobench_proof.py b/scripts/eval_imobench_proof.py index 7a7ae2b8..0cdadd50 100644 --- a/scripts/eval_imobench_proof.py +++ b/scripts/eval_imobench_proof.py @@ -12,7 +12,7 @@ import re import pandas as pd import requests -from typing import List, Dict, Optional +from typing import List, Dict from datetime import datetime from openai import OpenAI from tqdm import tqdm diff --git a/scripts/eval_math500_benchmark.py b/scripts/eval_math500_benchmark.py index 165eefd5..b57c0d30 100644 --- a/scripts/eval_math500_benchmark.py +++ b/scripts/eval_math500_benchmark.py @@ -3,7 +3,7 @@ import os import logging import re -from typing import Dict, Optional, Union +from typing import Dict, Optional from datasets import load_dataset from tqdm import tqdm from openai import OpenAI @@ -109,7 +109,7 @@ def numerically_equal(str1: str, str2: str) -> bool: """Compare if two numeric strings represent the same value.""" try: return abs(float(str1) - float(str2)) < 1e-10 - except: + except Exception: return False def normalize_fraction(fraction_str: str) -> str: @@ -602,7 +602,7 @@ def normalize_answer(answer: str) -> str: result = normalize_algebraic_expression(answer) logger.debug(f"Normalized as algebraic expression: {repr(result)}") return result - except: + except Exception: logger.debug("Failed to normalize as algebraic expression") pass diff --git a/scripts/eval_optillmbench.py b/scripts/eval_optillmbench.py index eb84a806..1ef59c26 100644 --- a/scripts/eval_optillmbench.py +++ b/scripts/eval_optillmbench.py @@ -711,7 +711,7 @@ def evaluate_model( failures = len([r for r in detailed_results if "error" in r]) if failures > 0: logger.warning(f"Approach {approach}: {failures}/{total_expected} examples failed due to errors") - logger.warning(f"Failed examples are counted as incorrect in accuracy calculation") + logger.warning("Failed examples are counted as incorrect in accuracy calculation") # Add category-specific metrics for category, cat_metrics in category_metrics.items(): @@ -825,7 +825,7 @@ def generate_report(all_metrics: Dict[str, Dict[str, float]], output_dir: str, i maj5_acc = all_metrics["maj@5"]["accuracy"] * 100 genselect5_acc = all_metrics["genselect@5"]["accuracy"] * 100 - report.append(f"\n**Key Metrics:**") + report.append("\n**Key Metrics:**") report.append(f"- **avg@5** (average of 5 responses): {avg5_acc:.2f}%") report.append(f"- **pass@5** (success if any correct): {pass5_acc:.2f}%") report.append(f"- **maj@5** (majority voting): {maj5_acc:.2f}%") @@ -837,7 +837,7 @@ def generate_report(all_metrics: Dict[str, Dict[str, float]], output_dir: str, i maj_improvement = ((maj5_acc - avg5_acc) / avg5_acc) * 100 genselect_improvement = ((genselect5_acc - avg5_acc) / avg5_acc) * 100 - report.append(f"\n**Improvements over avg@5 baseline:**") + report.append("\n**Improvements over avg@5 baseline:**") report.append(f"- pass@5: {'+' if pass_improvement > 0 else ''}{pass_improvement:.1f}%") report.append(f"- maj@5: {'+' if maj_improvement > 0 else ''}{maj_improvement:.1f}%") report.append(f"- genselect@5: {'+' if genselect_improvement > 0 else ''}{genselect_improvement:.1f}%") @@ -845,7 +845,7 @@ def generate_report(all_metrics: Dict[str, Dict[str, float]], output_dir: str, i # Show variance indicator if pass5_acc > avg5_acc: variance_ratio = (pass5_acc - avg5_acc) / avg5_acc * 100 - report.append(f"\n**Response Variance Indicator:**") + report.append("\n**Response Variance Indicator:**") report.append(f"- Gap between pass@5 and avg@5: {variance_ratio:.1f}%") report.append(f"- This indicates {'high' if variance_ratio > 50 else 'moderate' if variance_ratio > 20 else 'low'} variance in response quality") diff --git a/scripts/eval_simpleqa_benchmark.py b/scripts/eval_simpleqa_benchmark.py index 6ae79343..97ca89be 100644 --- a/scripts/eval_simpleqa_benchmark.py +++ b/scripts/eval_simpleqa_benchmark.py @@ -11,18 +11,15 @@ import argparse import json -import os import logging import re import csv -import time import pandas as pd from datetime import datetime from pathlib import Path -from typing import Dict, List, Optional, Tuple, Any +from typing import Dict, List, Optional, Tuple from tqdm import tqdm import requests -from urllib.parse import urlparse import httpx from openai import OpenAI @@ -201,7 +198,7 @@ def load_dataset(self, num_samples: Optional[int] = None, start_index: int = 0) # Original SimpleQA dataset try: metadata = json.loads(row['metadata']) if row.get('metadata') else {} - except: + except Exception: metadata = {} question_id = i diff --git a/scripts/gen_optillm_dataset.py b/scripts/gen_optillm_dataset.py index b10d8615..27e3f7a5 100644 --- a/scripts/gen_optillm_dataset.py +++ b/scripts/gen_optillm_dataset.py @@ -1,4 +1,3 @@ -import os import json import argparse import asyncio diff --git a/scripts/gen_optillm_ground_truth_dataset.py b/scripts/gen_optillm_ground_truth_dataset.py index 8227fb32..f742b1ba 100644 --- a/scripts/gen_optillm_ground_truth_dataset.py +++ b/scripts/gen_optillm_ground_truth_dataset.py @@ -1,12 +1,10 @@ -import os import json import argparse import asyncio from tqdm import tqdm from datasets import load_dataset from openai import AsyncOpenAI -from typing import List, Dict, Any, Tuple -import random +from typing import List, Dict, Any # OptILM approaches remain the same as in original script APPROACHES = ["none", "mcts", "bon", "moa", "rto", "z3", "self_consistency", "pvg", "rstar", "cot_reflection", "plansearch", "leap", "re2"] diff --git a/scripts/gen_optillmbench.py b/scripts/gen_optillmbench.py index 880bcdb4..07c5d8c3 100644 --- a/scripts/gen_optillmbench.py +++ b/scripts/gen_optillmbench.py @@ -1,6 +1,4 @@ #!/usr/bin/env python3 -import os -import json import random from typing import List, Dict, Any import datasets diff --git a/scripts/imo25_reference.py b/scripts/imo25_reference.py index 9680529a..0fc7f7bc 100644 --- a/scripts/imo25_reference.py +++ b/scripts/imo25_reference.py @@ -4,7 +4,7 @@ """ import re -from typing import Dict, List, Set, Any, Optional +from typing import Dict, Any, Optional # Actual IMO 2025 problems from the official contest IMO_2025_PROBLEMS = [ diff --git a/scripts/train_optillm_classifier.py b/scripts/train_optillm_classifier.py index a295fdfe..a2baf5f0 100644 --- a/scripts/train_optillm_classifier.py +++ b/scripts/train_optillm_classifier.py @@ -2,7 +2,6 @@ import torch from torch.utils.data import Dataset, DataLoader, SubsetRandomSampler from transformers import AutoTokenizer, AutoModel -from transformers import PreTrainedModel, PretrainedConfig, AutoConfig from datasets import load_dataset from sklearn.model_selection import KFold from tqdm import tqdm @@ -11,7 +10,6 @@ from safetensors.torch import save_model, load_model from collections import Counter from torch.optim.lr_scheduler import ReduceLROnPlateau -import numpy as np # Constants APPROACHES = ["none", "mcts", "bon", "moa", "rto", "z3", "self_consistency", "pvg", "rstar", "cot_reflection", "plansearch", "leap", "re2"] @@ -139,7 +137,7 @@ def train(model, train_dataloader, val_dataloader, optimizer, scheduler, num_epo for batch in tqdm(train_dataloader, desc=f"Epoch {epoch+1}/{num_epochs}"): input_ids = batch['input_ids'].to(device) attention_mask = batch['attention_mask'].to(device) - approaches = batch['approaches'].to(device) + batch['approaches'].to(device) ranks = batch['ranks'].to(device) tokens = batch['tokens'].to(device) @@ -202,7 +200,7 @@ def validate(model, val_dataloader): for batch in val_dataloader: input_ids = batch['input_ids'].to(device) attention_mask = batch['attention_mask'].to(device) - approaches = batch['approaches'].to(device) + batch['approaches'].to(device) ranks = batch['ranks'].to(device) tokens = batch['tokens'].to(device) diff --git a/tests/test.py b/tests/test.py index 25aabbe6..15caa474 100644 --- a/tests/test.py +++ b/tests/test.py @@ -13,7 +13,6 @@ from test_utils import TEST_MODEL -from optillm.litellm_wrapper import LiteLLMWrapper from optillm.mcts import chat_with_mcts from optillm.bon import best_of_n_sampling from optillm.moa import mixture_of_agents @@ -27,7 +26,7 @@ from optillm.leap import leap from optillm.reread import re2_approach from optillm.mars import multi_agent_reasoning_system -from optillm.cepo.cepo import cepo, CepoConfig, init_cepo_config +from optillm.cepo.cepo import cepo, init_cepo_config # Setup logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') diff --git a/tests/test_api_compatibility.py b/tests/test_api_compatibility.py index 5324acd1..f9fe7e02 100644 --- a/tests/test_api_compatibility.py +++ b/tests/test_api_compatibility.py @@ -6,8 +6,6 @@ import pytest import os import sys -from openai import OpenAI -import json # Add parent directory to path for imports sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @@ -232,7 +230,7 @@ def test_reasoning_tokens_backward_compatibility(client): print(f"❌ FAILED: {e}") failed += 1 - print(f"\n=== Test Summary ===") + print("\n=== Test Summary ===") print(f"Passed: {passed}") print(f"Failed: {failed}") print(f"Total: {passed + failed}") diff --git a/tests/test_batching.py b/tests/test_batching.py index 0cf65682..7e0057d5 100644 --- a/tests/test_batching.py +++ b/tests/test_batching.py @@ -11,21 +11,16 @@ import unittest import time -import json import os -import subprocess -import tempfile -from typing import List, Dict, Any -import threading import concurrent.futures -from unittest.mock import patch, MagicMock +from unittest.mock import patch # Import the modules we're testing from optillm.batching import RequestBatcher, BatchingError from optillm.inference import InferencePipeline, MLXInferencePipeline, MLXModelConfig, MLX_AVAILABLE # Import test utilities -from test_utils import TEST_MODEL, TEST_MODEL_MLX +from test_utils import TEST_MODEL_MLX class TestRequestBatcher(unittest.TestCase): @@ -180,7 +175,7 @@ def test_mlx_batch_creation(self): from optillm.inference import MLXInferencePipeline # This would fail if the model isn't available, but we can test the interface self.assertTrue(hasattr(MLXInferencePipeline, 'process_batch')) - except Exception as e: + except Exception: # Expected if model isn't downloaded pass @@ -208,7 +203,7 @@ def test_mlx_batch_parameters(self): @unittest.skipIf(not MLX_AVAILABLE, "MLX not available") def test_mlx_batch_generation(self): """Test MLX batch processing with actual generation""" - print(f"\n🧪 Testing MLX batch generation...") + print("\n🧪 Testing MLX batch generation...") # Create the pipeline pipeline = MLXInferencePipeline(self.model_config, self.cache_manager) @@ -248,7 +243,6 @@ class TestPyTorchBatching(unittest.TestCase): def test_pytorch_batch_method_exists(self): """Test that PyTorch InferencePipeline has process_batch method""" # The method should exist even if we can't test it fully - from optillm.inference import InferencePipeline self.assertTrue(hasattr(InferencePipeline, 'process_batch')) @unittest.skipIf(not os.getenv("OPTILLM_API_KEY"), "Requires local inference") @@ -339,7 +333,6 @@ class TestIntegration(unittest.TestCase): def test_cli_arguments(self): """Test that CLI arguments are properly parsed""" # Test parsing batch arguments - import argparse from optillm import parse_args # Mock sys.argv for testing @@ -452,7 +445,6 @@ def test_default_max_new_tokens_env_override(self): def test_resolve_eos_prefers_generation_config(self): from types import SimpleNamespace - from optillm.inference import InferencePipeline # tokenizer EOS (<|end_of_text|>=1) differs from the chat end token # (<|im_end|>=49154); both must be honoured, generation_config first. @@ -465,7 +457,6 @@ def test_resolve_eos_prefers_generation_config(self): def test_resolve_eos_dedupes_list(self): from types import SimpleNamespace - from optillm.inference import InferencePipeline fake = SimpleNamespace( current_model=SimpleNamespace(generation_config=SimpleNamespace(eos_token_id=[100, 200])), @@ -475,7 +466,6 @@ def test_resolve_eos_dedupes_list(self): def test_resolve_eos_falls_back_to_tokenizer(self): from types import SimpleNamespace - from optillm.inference import InferencePipeline fake = SimpleNamespace( current_model=SimpleNamespace(generation_config=SimpleNamespace(eos_token_id=None)), diff --git a/tests/test_ci_quick.py b/tests/test_ci_quick.py index 1660d89f..8d2b6517 100644 --- a/tests/test_ci_quick.py +++ b/tests/test_ci_quick.py @@ -12,7 +12,7 @@ # Import key modules to ensure they load try: - from optillm import parse_combined_approach, execute_single_approach, plugin_approaches + from optillm import parse_combined_approach print("✅ Core optillm module imported successfully") except Exception as e: print(f"❌ Failed to import core modules: {e}") @@ -20,20 +20,12 @@ # Test importing approach modules try: - from optillm.mcts import chat_with_mcts - from optillm.bon import best_of_n_sampling - from optillm.moa import mixture_of_agents print("✅ Approach modules imported successfully") except Exception as e: print(f"❌ Failed to import approach modules: {e}") # Test plugin existence try: - import optillm.plugins.memory_plugin - import optillm.plugins.readurls_plugin - import optillm.plugins.privacy_plugin - import optillm.plugins.genselect_plugin - import optillm.plugins.majority_voting_plugin print("✅ Basic plugin modules exist and can be imported") except Exception as e: print(f"❌ Basic plugin import test failed: {e}") @@ -77,5 +69,5 @@ except Exception as e: print(f"❌ Approach parsing test failed: {e}") -print(f"\n✅ All CI quick tests completed!") +print("\n✅ All CI quick tests completed!") print(f"Total test time: {time.time() - start_time:.2f}s") \ No newline at end of file diff --git a/tests/test_compact_plugin.py b/tests/test_compact_plugin.py index acd1cfb0..e7d5bbc7 100644 --- a/tests/test_compact_plugin.py +++ b/tests/test_compact_plugin.py @@ -1,7 +1,6 @@ """Tests for compact_plugin.""" import os -import pytest from unittest.mock import MagicMock, patch from optillm.plugins.compact_plugin import ( estimate_tokens, diff --git a/tests/test_conversation_logger.py b/tests/test_conversation_logger.py index b3a19b72..de97b542 100644 --- a/tests/test_conversation_logger.py +++ b/tests/test_conversation_logger.py @@ -7,7 +7,7 @@ import sys sys.path.append('..') -from optillm.conversation_logger import ConversationLogger, ConversationEntry +from optillm.conversation_logger import ConversationLogger class TestConversationLogger(unittest.TestCase): @@ -189,7 +189,7 @@ def test_invalid_request_id_and_stats(self): # Test enabled logger stats with active conversations request_id1 = self.logger_enabled.start_conversation({}, "test", "model") - request_id2 = self.logger_enabled.start_conversation({}, "test", "model") + self.logger_enabled.start_conversation({}, "test", "model") stats = self.logger_enabled.get_stats() diff --git a/tests/test_conversation_logging_approaches.py b/tests/test_conversation_logging_approaches.py index 0123259e..ee03d918 100644 --- a/tests/test_conversation_logging_approaches.py +++ b/tests/test_conversation_logging_approaches.py @@ -8,7 +8,7 @@ import sys import os import json -from unittest.mock import Mock, MagicMock, patch, call +from unittest.mock import Mock, MagicMock, patch import tempfile from pathlib import Path diff --git a/tests/test_conversation_logging_server.py b/tests/test_conversation_logging_server.py index d61cf8df..c6d52b51 100644 --- a/tests/test_conversation_logging_server.py +++ b/tests/test_conversation_logging_server.py @@ -23,7 +23,7 @@ if _project_dir not in sys.path: sys.path.insert(0, _project_dir) -from test_utils import TEST_MODEL, setup_test_env, start_test_server, stop_test_server +from test_utils import TEST_MODEL, setup_test_env, stop_test_server class TestConversationLoggingWithServer(unittest.TestCase): @@ -452,10 +452,8 @@ def test_error_handling_logging(self): entries = self._get_new_log_entries() # Should have at least some entry (success or partial) - found_relevant_entry = False for entry in entries: if "error logging scenarios" in str(entry.get("client_request", {})): - found_relevant_entry = True break # Even if no specific entry found, logging system should be working @@ -574,7 +572,7 @@ def test_logging_performance_impact(self): # Should be reasonably fast (under 10 seconds for small model) self.assertLess(avg_time, 10.0, f"Average response time too slow: {avg_time:.2f}s") - print(f"\n📊 Server Performance with Logging:") + print("\n📊 Server Performance with Logging:") print(f" Average response time: {avg_time:.3f}s") print(f" Response times: {[f'{t:.3f}s' for t in times]}") diff --git a/tests/test_deepconf.py b/tests/test_deepconf.py index cd96f12d..98622d89 100644 --- a/tests/test_deepconf.py +++ b/tests/test_deepconf.py @@ -151,7 +151,7 @@ def test_info_function(): for key in required_keys: assert key in info, f"Missing key: {key}" - assert info["local_models_only"] == True + assert info["local_models_only"] assert "low" in info["variants"] and "high" in info["variants"] logger.info("✓ Info function tests passed") diff --git a/tests/test_json_plugin.py b/tests/test_json_plugin.py index c42ea2c7..4cc5026a 100644 --- a/tests/test_json_plugin.py +++ b/tests/test_json_plugin.py @@ -1,17 +1,15 @@ """Test the JSON plugin functionality""" import unittest -from unittest.mock import Mock, patch, MagicMock +from unittest.mock import Mock, patch import json import sys import os -from typing import Dict, Any # Add parent directory to path for imports sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # Import test utilities -from test_utils import setup_test_env, get_test_client, TEST_MODEL # We'll use real dependencies since the outlines version has been updated diff --git a/tests/test_mars_imo25.py b/tests/test_mars_imo25.py index 37a765b6..16fa89b5 100644 --- a/tests/test_mars_imo25.py +++ b/tests/test_mars_imo25.py @@ -10,7 +10,6 @@ import logging import io import unittest -from unittest.mock import Mock # Add parent directory to path to import optillm modules sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @@ -29,7 +28,7 @@ def __init__(self, response_delay=0.1, reasoning_tokens=2000): def chat_completions_create(self, **kwargs): """Mock completions.create with realistic IMO25 responses""" - start_time = time.time() + time.time() time.sleep(self.response_delay) self.call_count += 1 self.call_times.append(time.time()) @@ -63,10 +62,10 @@ def __init__(self, content, reasoning_tokens): # Generate appropriate responses based on problem content and call type if "verifying" in problem_content.lower(): # Verification response - content = f"VERIFICATION: This solution appears CORRECT. The analysis is mathematically sound and the final answer is properly justified. Confidence: 8/10." + content = "VERIFICATION: This solution appears CORRECT. The analysis is mathematically sound and the final answer is properly justified. Confidence: 8/10." elif "improving" in problem_content.lower(): # Improvement response - content = f"IMPROVEMENT: The original approach is good but can be enhanced. Here's the improved version with stronger reasoning..." + content = "IMPROVEMENT: The original approach is good but can be enhanced. Here's the improved version with stronger reasoning..." elif "bonza" in problem_content.lower(): # IMO25 Problem 3 - functional equation responses = [ @@ -152,7 +151,7 @@ def test_imo25_problem3_functional_equation(self): Determine the smallest real constant c such that f(n)≤cn for all bonza functions f and all positive integers n.""" - print(f"\n🧮 Testing MARS on IMO25 Problem 3 (Expected answer: c = 4)...") + print("\n🧮 Testing MARS on IMO25 Problem 3 (Expected answer: c = 4)...") client = MockOpenAIClient(response_delay=0.05, reasoning_tokens=3000) @@ -207,11 +206,11 @@ def test_imo25_problem3_functional_equation(self): response_lines = response.split('\n') key_lines = [line for line in response_lines if any(keyword in line.lower() for keyword in ['constant', 'c =', 'answer', '= 4', 'therefore'])] if key_lines: - print(f" 🔑 Key response lines:") + print(" 🔑 Key response lines:") for line in key_lines[:5]: print(f" {line.strip()}") - print(f"✅ IMO25 Problem 3 test completed") + print("✅ IMO25 Problem 3 test completed") def test_imo25_problem4_number_theory(self): """Test MARS on IMO25 Problem 4 - Number Theory (Expected: 6J·12^K formula)""" @@ -221,7 +220,7 @@ def test_imo25_problem4_number_theory(self): Determine all possible values of a_1.""" - print(f"\n🔢 Testing MARS on IMO25 Problem 4 (Expected: 6J·12^K formula)...") + print("\n🔢 Testing MARS on IMO25 Problem 4 (Expected: 6J·12^K formula)...") client = MockOpenAIClient(response_delay=0.05, reasoning_tokens=3000) @@ -251,11 +250,11 @@ def test_imo25_problem4_number_theory(self): print(f" 🎯 Contains '12^K': {has_formula_12K}") print(f" 🎯 Contains 'gcd': {has_gcd_condition}") - print(f"✅ IMO25 Problem 4 test completed") + print("✅ IMO25 Problem 4 test completed") def test_answer_extraction_analysis(self): """Test answer extraction specifically with controlled responses""" - print(f"\n🔍 Testing answer extraction with controlled responses...") + print("\n🔍 Testing answer extraction with controlled responses...") class ControlledMockClient(MockOpenAIClient): def __init__(self): @@ -299,7 +298,7 @@ def chat_completions_create(self, **kwargs): for i, log in enumerate(voting_logs[:3]): print(f" Vote {i+1}: {log}") - print(f"✅ Answer extraction analysis completed") + print("✅ Answer extraction analysis completed") def run_imo25_tests(): diff --git a/tests/test_mars_parallel.py b/tests/test_mars_parallel.py index 7a0ff4db..002eea51 100644 --- a/tests/test_mars_parallel.py +++ b/tests/test_mars_parallel.py @@ -7,21 +7,16 @@ import sys import os import time -import asyncio import unittest import logging import io from unittest.mock import Mock, patch -from concurrent.futures import ThreadPoolExecutor # Add parent directory to path to import optillm modules sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from optillm.mars import multi_agent_reasoning_system -from optillm.mars.mars import _run_mars_parallel from optillm.mars.agent import MARSAgent -from optillm.mars.verifier import MARSVerifier -from optillm.mars.workspace import MARSWorkspace class MockOpenAIClient: @@ -35,7 +30,7 @@ def __init__(self, response_delay=0.1, reasoning_tokens=1000): def chat_completions_create(self, **kwargs): """Mock completions.create with configurable delay""" - start_time = time.time() + time.time() time.sleep(self.response_delay) # Simulate API call delay self.call_count += 1 self.call_times.append(time.time()) @@ -516,7 +511,6 @@ def chat_completions_create(self, **kwargs): def test_mars_agent_temperatures(): """Test that MARS uses different temperatures for agents""" from optillm.mars.mars import DEFAULT_CONFIG - from optillm.mars.agent import MARSAgent client = MockOpenAIClient() model = "mock-model" diff --git a/tests/test_mcp_plugin.py b/tests/test_mcp_plugin.py index 09f56461..e98e3bdb 100644 --- a/tests/test_mcp_plugin.py +++ b/tests/test_mcp_plugin.py @@ -8,7 +8,7 @@ import asyncio import json import pytest -from unittest.mock import Mock, AsyncMock, patch, MagicMock +from unittest.mock import Mock, AsyncMock, patch from pathlib import Path # Try to import pytest, but don't fail if it's not available @@ -22,7 +22,7 @@ from optillm.plugins.mcp_plugin import ( ServerConfig, MCPServer, MCPConfigManager, MCPServerManager, execute_tool, execute_tool_stdio, execute_tool_sse, execute_tool_websocket, - LoggingClientSession, SLUG + SLUG ) @@ -377,7 +377,7 @@ async def test_github_mcp_server_connection(self): if connected: assert server.connected assert len(server.tools) > 0 or len(server.resources) > 0 or len(server.prompts) > 0 - print(f"GitHub MCP server connected successfully!") + print("GitHub MCP server connected successfully!") print(f"Found: {len(server.tools)} tools, {len(server.resources)} resources, {len(server.prompts)} prompts") # List some tools @@ -452,7 +452,7 @@ def test_environment_variable_expansion(self): headers={"Authorization": "${TEST_TOKEN}"} ) - server = MCPServer("test", config) + MCPServer("test", config) # Test the header expansion logic from connect_sse method expanded_headers = {} diff --git a/tests/test_n_parameter.py b/tests/test_n_parameter.py index 6c325041..02e665e3 100755 --- a/tests/test_n_parameter.py +++ b/tests/test_n_parameter.py @@ -5,8 +5,6 @@ import os import sys -from openai import OpenAI -import json # Add parent directory to path for imports sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) diff --git a/tests/test_plugins.py b/tests/test_plugins.py index e7f6b744..3134c9d4 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -15,7 +15,7 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from optillm import plugin_approaches, load_plugins +from optillm import plugin_approaches, load_plugins # noqa: E402 def test_plugin_module_imports(): @@ -309,8 +309,6 @@ def test_proxy_plugin_timeout_config(): def test_proxy_plugin_timeout_handling(): """Test that proxy plugin handles timeouts correctly""" from optillm.plugins.proxy.client import ProxyClient - from unittest.mock import Mock, patch - import concurrent.futures # Create config with short timeout config = { @@ -433,7 +431,7 @@ def test_no_relative_import_errors(): # reloaded on every request. These tests mock the heavy loaders so they need # no network or real weights. # --------------------------------------------------------------------------- -import threading as _threading +import threading as _threading # noqa: E402 import contextlib as _contextlib from unittest import mock as _mock diff --git a/tests/test_reasoning_integration.py b/tests/test_reasoning_integration.py index d6737543..d1f450bc 100644 --- a/tests/test_reasoning_integration.py +++ b/tests/test_reasoning_integration.py @@ -7,19 +7,17 @@ import sys import os import unittest -import re # Add parent directory to path for imports sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # Import test utilities from test_utils import ( - setup_test_env, get_test_client, is_mlx_available, - TEST_MODEL, get_simple_test_messages, get_thinking_test_messages + setup_test_env, is_mlx_available, + TEST_MODEL, get_simple_test_messages ) # Import the thinkdeeper functions for testing -from optillm.thinkdeeper import thinkdeeper_decode try: from optillm.thinkdeeper_mlx import thinkdeeper_decode_mlx MLX_THINKDEEPER_AVAILABLE = True @@ -205,7 +203,6 @@ class TestAPIResponseStructure(unittest.TestCase): def test_chat_completion_response_structure(self): """Test that chat completion responses have proper structure""" - from unittest.mock import Mock from optillm.inference import ChatCompletion, ChatCompletionUsage # Create mock response structure diff --git a/tests/test_reasoning_tokens.py b/tests/test_reasoning_tokens.py index 7e3aea4d..d3fdd9e5 100644 --- a/tests/test_reasoning_tokens.py +++ b/tests/test_reasoning_tokens.py @@ -8,7 +8,6 @@ import os import unittest from unittest.mock import Mock -import re # Add parent directory to path for imports sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) diff --git a/tests/test_ssl_config.py b/tests/test_ssl_config.py index 82f3d4e8..caa192f9 100644 --- a/tests/test_ssl_config.py +++ b/tests/test_ssl_config.py @@ -8,11 +8,9 @@ """ import unittest -from unittest.mock import Mock, patch, MagicMock, call +from unittest.mock import patch, MagicMock import sys import os -import tempfile -import httpx # Add parent directory to path to import optillm modules sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @@ -109,7 +107,7 @@ def test_httpx_client_ssl_verify_disabled(self): # Create client with patch('httpx.Client') as mock_httpx_client, \ - patch('optillm.server.OpenAI') as mock_openai: + patch('optillm.server.OpenAI'): get_config() # Verify httpx.Client was called with verify=False mock_httpx_client.assert_called_once_with(verify=False) @@ -125,7 +123,7 @@ def test_httpx_client_ssl_verify_enabled(self): # Create client with patch('httpx.Client') as mock_httpx_client, \ - patch('optillm.server.OpenAI') as mock_openai: + patch('optillm.server.OpenAI'): get_config() # Verify httpx.Client was called with verify=True mock_httpx_client.assert_called_once_with(verify=True) @@ -142,7 +140,7 @@ def test_httpx_client_custom_cert_path(self): # Create client with patch('httpx.Client') as mock_httpx_client, \ - patch('optillm.server.OpenAI') as mock_openai: + patch('optillm.server.OpenAI'): get_config() # Verify httpx.Client was called with custom cert path mock_httpx_client.assert_called_once_with(verify=test_cert_path) @@ -162,7 +160,7 @@ def test_openai_client_receives_http_client(self): mock_http_client_instance = MagicMock() - with patch('httpx.Client', return_value=mock_http_client_instance) as mock_httpx_client, \ + with patch('httpx.Client', return_value=mock_http_client_instance), \ patch('optillm.server.OpenAI') as mock_openai: get_config() @@ -187,7 +185,7 @@ def test_cerebras_client_receives_http_client(self): mock_http_client_instance = MagicMock() - with patch('httpx.Client', return_value=mock_http_client_instance) as mock_httpx_client, \ + with patch('httpx.Client', return_value=mock_http_client_instance), \ patch('optillm.server.Cerebras') as mock_cerebras: get_config() @@ -211,7 +209,7 @@ def test_azure_client_receives_http_client(self): mock_http_client_instance = MagicMock() - with patch('httpx.Client', return_value=mock_http_client_instance) as mock_httpx_client, \ + with patch('httpx.Client', return_value=mock_http_client_instance), \ patch('optillm.server.AzureOpenAI') as mock_azure: get_config() @@ -329,8 +327,8 @@ def test_warning_when_ssl_disabled(self): server_config['ssl_verify'] = False server_config['ssl_cert_path'] = '' - with patch('httpx.Client') as mock_httpx_client, \ - patch('optillm.server.OpenAI') as mock_openai, \ + with patch('httpx.Client'), \ + patch('optillm.server.OpenAI'), \ patch('optillm.server.logger.warning') as mock_logger_warning: get_config() @@ -354,8 +352,8 @@ def test_info_when_custom_cert_used(self): server_config['ssl_verify'] = True server_config['ssl_cert_path'] = test_cert_path - with patch('httpx.Client') as mock_httpx_client, \ - patch('optillm.server.OpenAI') as mock_openai, \ + with patch('httpx.Client'), \ + patch('optillm.server.OpenAI'), \ patch('optillm.server.logger.info') as mock_logger_info: get_config() diff --git a/tests/test_utils.py b/tests/test_utils.py index d49c1eec..091b9ee1 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -8,7 +8,6 @@ import time import subprocess import platform -from typing import Optional from openai import OpenAI # Standard test model for all tests - small and fast (~250M params)