feat(百家乐AI预测): 实现多厂商自动故障转移
- predict() 改为遍历所有已启用厂商,与 AiChatService 保持一致 - 首选 glm-5.1-free,失败后自动按 sort_order 切换下一个厂商 - 所有厂商均失败才返回 null 回退本地路单决策 - 每次调用成功/失败均写入日志,便于追踪
This commit is contained in:
@@ -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',或 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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user