reduce inline imports in ai client
This commit is contained in:
+6
-11
@@ -14,13 +14,16 @@ during chat creation to avoid massive history bloat.
|
|||||||
# ai_client.py
|
# ai_client.py
|
||||||
import anthropic
|
import anthropic
|
||||||
from google import genai
|
from google import genai
|
||||||
|
from google.api_core import exceptions as gac
|
||||||
from google.genai import types
|
from google.genai import types
|
||||||
|
from openai import OpenAI
|
||||||
import asyncio
|
import asyncio
|
||||||
import datetime
|
import datetime
|
||||||
import difflib
|
import difflib
|
||||||
import hashlib
|
import hashlib
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
from pathlib import Path as _P
|
||||||
import requests # type: ignore[import-untyped]
|
import requests # type: ignore[import-untyped]
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
@@ -38,7 +41,8 @@ from src import performance_monitor
|
|||||||
from src import project_manager
|
from src import project_manager
|
||||||
from src.tool_bias import ToolBiasEngine
|
from src.tool_bias import ToolBiasEngine
|
||||||
from src.models import ToolPreset, BiasProfile, Tool
|
from src.models import ToolPreset, BiasProfile, Tool
|
||||||
from src.gemini_cli_adapter import GeminiCliAdapter as GeminiCliAdapter
|
from src.gemini_cli_adapter import GeminiCliAdapter
|
||||||
|
from src.tool_presets import ToolPresetManager
|
||||||
|
|
||||||
_provider: str = "gemini"
|
_provider: str = "gemini"
|
||||||
_model: str = "gemini-2.5-flash-lite"
|
_model: str = "gemini-2.5-flash-lite"
|
||||||
@@ -356,7 +360,6 @@ def _classify_anthropic_error(exc: Exception) -> ProviderError:
|
|||||||
def _classify_gemini_error(exc: Exception) -> ProviderError:
|
def _classify_gemini_error(exc: Exception) -> ProviderError:
|
||||||
body = str(exc).lower()
|
body = str(exc).lower()
|
||||||
try:
|
try:
|
||||||
from google.api_core import exceptions as gac
|
|
||||||
if isinstance(exc, gac.ResourceExhausted):
|
if isinstance(exc, gac.ResourceExhausted):
|
||||||
return ProviderError("quota", "gemini", exc)
|
return ProviderError("quota", "gemini", exc)
|
||||||
if isinstance(exc, gac.TooManyRequests):
|
if isinstance(exc, gac.TooManyRequests):
|
||||||
@@ -586,7 +589,6 @@ def set_tool_preset(preset_name: Optional[str]) -> None:
|
|||||||
_active_tool_preset = None
|
_active_tool_preset = None
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
from src.tool_presets import ToolPresetManager
|
|
||||||
manager = ToolPresetManager()
|
manager = ToolPresetManager()
|
||||||
presets = manager.load_all()
|
presets = manager.load_all()
|
||||||
if preset_name in presets:
|
if preset_name in presets:
|
||||||
@@ -617,7 +619,6 @@ def set_bias_profile(profile_name: Optional[str]) -> None:
|
|||||||
_active_bias_profile = None
|
_active_bias_profile = None
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
from src.tool_presets import ToolPresetManager
|
|
||||||
manager = ToolPresetManager()
|
manager = ToolPresetManager()
|
||||||
profiles = manager.load_all_bias_profiles()
|
profiles = manager.load_all_bias_profiles()
|
||||||
if profile_name in profiles:
|
if profile_name in profiles:
|
||||||
@@ -886,7 +887,6 @@ def _reread_file_items(file_items: list[dict[str, Any]]) -> tuple[list[dict[str,
|
|||||||
if path is None:
|
if path is None:
|
||||||
refreshed.append(item)
|
refreshed.append(item)
|
||||||
continue
|
continue
|
||||||
from pathlib import Path as _P
|
|
||||||
p = path if isinstance(path, _P) else _P(path)
|
p = path if isinstance(path, _P) else _P(path)
|
||||||
try:
|
try:
|
||||||
current_mtime = p.stat().st_mtime
|
current_mtime = p.stat().st_mtime
|
||||||
@@ -1033,8 +1033,7 @@ def _estimate_message_tokens(msg: dict[str, Any]) -> int:
|
|||||||
total_chars += len(text)
|
total_chars += len(text)
|
||||||
inp = block.get("input")
|
inp = block.get("input")
|
||||||
if isinstance(inp, dict):
|
if isinstance(inp, dict):
|
||||||
import json as _json
|
total_chars += len(json.dumps(inp, ensure_ascii=False))
|
||||||
total_chars += len(_json.dumps(inp, ensure_ascii=False))
|
|
||||||
elif isinstance(block, str):
|
elif isinstance(block, str):
|
||||||
total_chars += len(block)
|
total_chars += len(block)
|
||||||
est = max(1, int(total_chars / _CHARS_PER_TOKEN))
|
est = max(1, int(total_chars / _CHARS_PER_TOKEN))
|
||||||
@@ -2082,7 +2081,6 @@ def _send_deepseek(md_content: str, user_message: str, base_dir: str,
|
|||||||
|
|
||||||
def _list_minimax_models(api_key: str) -> list[str]:
|
def _list_minimax_models(api_key: str) -> list[str]:
|
||||||
try:
|
try:
|
||||||
from openai import OpenAI
|
|
||||||
client = OpenAI(api_key=api_key, base_url="https://api.minimax.io/v1")
|
client = OpenAI(api_key=api_key, base_url="https://api.minimax.io/v1")
|
||||||
models_list = client.models.list()
|
models_list = client.models.list()
|
||||||
found = [m.id for m in models_list]
|
found = [m.id for m in models_list]
|
||||||
@@ -2095,7 +2093,6 @@ def _list_minimax_models(api_key: str) -> list[str]:
|
|||||||
def _ensure_minimax_client() -> None:
|
def _ensure_minimax_client() -> None:
|
||||||
global _minimax_client
|
global _minimax_client
|
||||||
if _minimax_client is None:
|
if _minimax_client is None:
|
||||||
from openai import OpenAI
|
|
||||||
creds = _load_credentials()
|
creds = _load_credentials()
|
||||||
api_key = creds.get("minimax", {}).get("api_key")
|
api_key = creds.get("minimax", {}).get("api_key")
|
||||||
if not api_key:
|
if not api_key:
|
||||||
@@ -2120,7 +2117,6 @@ def _send_minimax(md_content: str, user_message: str, base_dir: str,
|
|||||||
if not api_key:
|
if not api_key:
|
||||||
raise ValueError("MiniMax API key not found in credentials.toml")
|
raise ValueError("MiniMax API key not found in credentials.toml")
|
||||||
|
|
||||||
from openai import OpenAI
|
|
||||||
client = OpenAI(api_key=api_key, base_url="https://api.minimax.io/v1")
|
client = OpenAI(api_key=api_key, base_url="https://api.minimax.io/v1")
|
||||||
|
|
||||||
with _minimax_history_lock:
|
with _minimax_history_lock:
|
||||||
@@ -2574,7 +2570,6 @@ def run_subagent_summarization(file_path: str, content: str, is_code: bool, outl
|
|||||||
return f"ERROR: DeepSeek summarization failed: {e}"
|
return f"ERROR: DeepSeek summarization failed: {e}"
|
||||||
elif _provider == "gemini_cli":
|
elif _provider == "gemini_cli":
|
||||||
# Using the adapter for a one-off call
|
# Using the adapter for a one-off call
|
||||||
from src.gemini_cli_adapter import GeminiCliAdapter
|
|
||||||
adapter = GeminiCliAdapter(binary_path="gemini")
|
adapter = GeminiCliAdapter(binary_path="gemini")
|
||||||
resp_data = adapter.send(prompt, model=_model)
|
resp_data = adapter.send(prompt, model=_model)
|
||||||
return resp_data.get("text", "")
|
return resp_data.get("text", "")
|
||||||
|
|||||||
Reference in New Issue
Block a user