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