feat(百家乐AI预测): 实现多厂商自动故障转移

- predict() 改为遍历所有已启用厂商,与 AiChatService 保持一致
- 首选 glm-5.1-free,失败后自动按 sort_order 切换下一个厂商
- 所有厂商均失败才返回 null 回退本地路单决策
- 每次调用成功/失败均写入日志,便于追踪
This commit is contained in:
2026-03-28 21:15:49 +08:00
parent 3bfc0e358f
commit d16626d121

View File

@@ -40,37 +40,59 @@ class BaccaratPredictionService
/**
* 调用 AI 接口预测百家乐下注方向
*
* 将近期路单格式化后发给 AI解析其返回的预测结果。
* AI 不可用或解析失败,返回 null 以便调用方回退本地逻辑
* 优先使用 PREFERRED_MODEL 对应的厂商,调用失败时自动按
* sort_order 依次尝试其余已启用厂商(与 AiChatService 故障转移逻辑一致)
* 所有厂商均失败时返回 null,由调用方回退本地路单决策。
*
* @param array<int, string> $recentResults 近期已结算路单('big'|'small'|'triple',从最新到最旧)
* @return string|null 预测结果:'big'|'small'|'triple',或 nullAI 不可用)
* @return string|null 预测结果:'big'|'small'|'triple',或 nullAI 全部不可用)
*/
public function predict(array $recentResults): ?string
{
// 优先使用指定模型,找不到则回退默认配置
$provider = AiProviderConfig::findByModel(self::PREFERRED_MODEL)
?? AiProviderConfig::getDefault();
// 获取所有已启用厂商PREFERRED_MODEL 对应的排在最前面
$providers = AiProviderConfig::getEnabledProviders();
if (! $provider) {
Log::warning('百家乐 AI 预测:无可用 AI 厂商配置,跳过 AI 预测');
if ($providers->isEmpty()) {
Log::warning('百家乐 AI 预测:无任何已启用的 AI 厂商配置');
return null;
}
// 将首选模型提到队列最前(若存在)
$preferred = $providers->firstWhere('model', self::PREFERRED_MODEL);
if ($preferred) {
$providers = $providers->reject(fn ($p) => $p->model === self::PREFERRED_MODEL)
->prepend($preferred);
}
$prompt = $this->buildPredictionPrompt($recentResults);
try {
return $this->callProvider($provider, $prompt);
} catch (\Exception $e) {
Log::warning('百家乐 AI 预测调用失败,将使用本地决策兜底', [
'provider' => $provider->name,
'model' => $provider->model,
'error' => $e->getMessage(),
]);
// 依次尝试每个厂商,失败则切换下一个
foreach ($providers as $provider) {
try {
$result = $this->callProvider($provider, $prompt);
Log::info('百家乐 AI 预测成功', [
'provider' => $provider->name,
'model' => $provider->model,
'result' => $result,
]);
return null;
return $result;
} catch (\Exception $e) {
Log::warning('百家乐 AI 预测厂商调用失败,尝试下一个', [
'provider' => $provider->name,
'model' => $provider->model,
'error' => $e->getMessage(),
]);
continue;
}
}
// 所有厂商均失败
Log::error('百家乐 AI 预测:所有 AI 厂商均不可用,将使用本地决策兜底');
return null;
}
/**