Release v2.0.0

This commit is contained in:
SMKRV
2024-11-21 17:30:59 +03:00
parent 9306c12fcd
commit 72bbfb3f58
+41 -18
View File
@@ -352,51 +352,74 @@ class HATextAICoordinator(DataUpdateCoordinator):
system_prompt: Optional[str] system_prompt: Optional[str]
) -> Dict[str, Any]: ) -> Dict[str, Any]:
"""Make API call to OpenAI.""" """Make API call to OpenAI."""
completion = None
try: try:
# Input validation
if not question:
raise ValueError("Question cannot be empty")
messages = [] messages = []
if system_prompt: if system_prompt:
messages.append({"role": "system", "content": system_prompt}) messages.append({"role": "system", "content": system_prompt})
messages.append({"role": "user", "content": question}) messages.append({"role": "user", "content": question})
_LOGGER.debug("Making API call with parameters: model=%s, messages=%s", # Prepare API parameters
model or self.model, messages) api_params = {
"model": model or self.model,
"messages": messages,
"temperature": temperature if temperature is not None else self.temperature,
"max_tokens": max_tokens if max_tokens is not None else self.max_tokens,
}
completion = await self.client.chat.completions.create( _LOGGER.debug("Making OpenAI API call with parameters: %s", api_params)
model=model or self.model,
messages=messages, # Make API call
temperature=temperature if temperature is not None else self.temperature, completion = await self.client.chat.completions.create(**api_params)
max_tokens=max_tokens if max_tokens is not None else self.max_tokens,
)
_LOGGER.debug("Raw API response: %s", completion) _LOGGER.debug("Raw API response: %s", completion)
# Validate response
if completion is None: if completion is None:
raise ValueError("Received null response from API") raise ValueError("Received null response from API")
if not hasattr(completion, 'choices') or not completion.choices: if not hasattr(completion, 'choices') or not completion.choices:
raise ValueError("No choices in API response") raise ValueError(f"No choices in API response: {completion}")
if not hasattr(completion.choices[0], 'message'): if not completion.choices[0] or not hasattr(completion.choices[0], 'message'):
raise ValueError("No message in API response choice") raise ValueError(f"Invalid choice structure in response: {completion.choices}")
message = completion.choices[0].message message = completion.choices[0].message
if not hasattr(message, 'content'): if not hasattr(message, 'content') or not message.content:
raise ValueError("No content in message") raise ValueError(f"No content in message: {message}")
response_text = message.content response_text = message.content.strip()
return { # Prepare response
response = {
"response": response_text, "response": response_text,
"model": getattr(completion, 'model', model or self.model), "model": getattr(completion, 'model', api_params['model']),
"tokens": completion.usage.total_tokens if hasattr(completion, 'usage') else 0 "tokens": completion.usage.total_tokens if hasattr(completion, 'usage') else 0
} }
_LOGGER.debug("Processed OpenAI response: %s", response)
return response
except Exception as e: except Exception as e:
_LOGGER.error("OpenAI API call error: %s", str(e)) _LOGGER.error("OpenAI API call error: %s", str(e))
# Добавим более подробное логирование
if completion: if completion:
_LOGGER.debug("Failed response structure: %s", str(completion)) _LOGGER.debug("Failed response structure: %s", str(completion))
raise _LOGGER.debug("Error details:", exc_info=True)
# Добавляем контекст к ошибке
error_context = {
"question": question,
"model": model or self.model,
"error_type": type(e).__name__,
"error_message": str(e)
}
_LOGGER.debug("Error context: %s", error_context)
raise RuntimeError(f"OpenAI API call failed: {str(e)}") from e
async def async_ask_question( async def async_ask_question(
self, self,