mirror of
https://github.com/smkrv/ha-text-ai.git
synced 2026-07-26 09:04:00 +08:00
Release v2.0.0
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user