diff --git a/app/Services/BaccaratPredictionService.php b/app/Services/BaccaratPredictionService.php index 9dd755a..3ae5ab9 100644 --- a/app/Services/BaccaratPredictionService.php +++ b/app/Services/BaccaratPredictionService.php @@ -40,37 +40,59 @@ class BaccaratPredictionService /** * 调用 AI 接口预测百家乐下注方向 * - * 将近期路单格式化后发给 AI,解析其返回的预测结果。 - * 若 AI 不可用或解析失败,返回 null 以便调用方回退本地逻辑。 + * 优先使用 PREFERRED_MODEL 对应的厂商,调用失败时自动按 + * sort_order 依次尝试其余已启用厂商(与 AiChatService 故障转移逻辑一致)。 + * 所有厂商均失败时返回 null,由调用方回退本地路单决策。 * * @param array $recentResults 近期已结算路单('big'|'small'|'triple',从最新到最旧) - * @return string|null 预测结果:'big'|'small'|'triple',或 null(AI 不可用) + * @return string|null 预测结果:'big'|'small'|'triple',或 null(AI 全部不可用) */ 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; } /**