feat: add OpenRouter AI service integration
This commit is contained in:
@@ -3,28 +3,45 @@ from ..base import BaseIntegrationService
|
|||||||
from .config import get_openrouter_config
|
from .config import get_openrouter_config
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
import locale
|
import traceback
|
||||||
|
|
||||||
# Патч для исправления проблемы с кодировкой в httpx на Windows
|
# Патч для исправления проблемы с кодировкой в httpx на Windows
|
||||||
# Устанавливаем кодировку по умолчанию для Python
|
# Устанавливаем кодировку по умолчанию для Python
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
try:
|
try:
|
||||||
import httpx._models
|
import httpx._models
|
||||||
original_normalize_header_value = httpx._models._normalize_header_value
|
|
||||||
|
# Сохраняем оригинальную функцию, если она есть
|
||||||
|
_original_normalize_header_value = getattr(httpx._models, '_normalize_header_value', None)
|
||||||
|
|
||||||
def patched_normalize_header_value(value, encoding):
|
def patched_normalize_header_value(value, encoding):
|
||||||
"""Патч для использования UTF-8 вместо ASCII для заголовков"""
|
"""Патч для использования UTF-8 вместо ASCII для заголовков"""
|
||||||
# Если значение уже bytes, возвращаем его как есть
|
try:
|
||||||
if isinstance(value, bytes):
|
# Если значение уже bytes, возвращаем его как есть
|
||||||
return value
|
if isinstance(value, bytes):
|
||||||
# Всегда используем UTF-8 вместо ASCII
|
return value
|
||||||
encoding = encoding or 'utf-8'
|
|
||||||
if encoding.lower() == 'ascii':
|
# Если значение не строка и не байты, приводим к строке
|
||||||
encoding = 'utf-8'
|
if not isinstance(value, str):
|
||||||
return value.encode(encoding)
|
value = str(value)
|
||||||
|
|
||||||
|
# Всегда используем UTF-8 вместо ASCII
|
||||||
|
encoding = encoding or 'utf-8'
|
||||||
|
if encoding.lower() == 'ascii':
|
||||||
|
encoding = 'utf-8'
|
||||||
|
|
||||||
|
return value.encode(encoding)
|
||||||
|
except Exception as e:
|
||||||
|
# В случае ошибки логируем и пробуем максимально безопасный вариант
|
||||||
|
logging.getLogger(__name__).error(f"Error in patched_normalize_header_value: {e}. Value: {repr(value)}")
|
||||||
|
if isinstance(value, str):
|
||||||
|
return value.encode('utf-8', errors='ignore')
|
||||||
|
return b''
|
||||||
|
|
||||||
httpx._models._normalize_header_value = patched_normalize_header_value
|
httpx._models._normalize_header_value = patched_normalize_header_value
|
||||||
logging.getLogger(__name__).info("Applied patch for httpx header encoding on Windows")
|
logging.getLogger(__name__).info("Applied robust patch for httpx header encoding on Windows")
|
||||||
|
except ImportError:
|
||||||
|
logging.getLogger(__name__).warning("httpx module not found, patch skipped")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.getLogger(__name__).warning(f"Failed to apply httpx patch: {e}")
|
logging.getLogger(__name__).warning(f"Failed to apply httpx patch: {e}")
|
||||||
|
|
||||||
@@ -148,8 +165,10 @@ class OpenRouterIntegrationService(BaseIntegrationService):
|
|||||||
}
|
}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Ошибка генерации текста с помощью OpenRouter: {str(e)}")
|
error_msg = str(e)
|
||||||
return False, f"Ошибка генерации: {str(e)}", None
|
logger.error(f"Ошибка генерации текста с помощью OpenRouter: {error_msg}")
|
||||||
|
logger.error(traceback.format_exc())
|
||||||
|
return False, f"Ошибка генерации: {error_msg}", None
|
||||||
|
|
||||||
def generate_code(self,
|
def generate_code(self,
|
||||||
prompt: str,
|
prompt: str,
|
||||||
@@ -196,5 +215,7 @@ class OpenRouterIntegrationService(BaseIntegrationService):
|
|||||||
}
|
}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Ошибка генерации кода с помощью OpenRouter: {str(e)}")
|
error_msg = str(e)
|
||||||
return False, f"Ошибка генерации кода: {str(e)}", None
|
logger.error(f"Ошибка генерации кода с помощью OpenRouter: {error_msg}")
|
||||||
|
logger.error(traceback.format_exc())
|
||||||
|
return False, f"Ошибка генерации кода: {error_msg}", None
|
||||||
|
|||||||
Reference in New Issue
Block a user