taravel/app/Services/AiProviderService.php
2024-11-13 16:26:27 +08:00

77 lines
1.9 KiB
PHP

<?php
namespace App\Services;
use App\Models\ApiProvider;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class AiProviderService
{
/**
* 處理提示並獲取 AI 回應
*
* @param string $prompt
* @return array
*/
public function processPrompt(string $prompt): array
{
try {
$active_provider = $this->getActiveProvider();
if (!$active_provider) {
throw new \Exception('No active AI provider available.');
}
return $this->sendToProvider($active_provider, $prompt);
} catch (\Exception $e) {
Log::error('AI Provider Error', [
'error' => $e->getMessage(),
'prompt' => $prompt
]);
return [
'success' => false,
'error' => $e->getMessage()
];
}
}
/**
* 獲取當前活躍的 AI 提供者
*
* @return ApiProvider|null
*/
private function getActiveProvider(): ?ApiProvider
{
return ApiProvider::where('active', true)->first();
}
/**
* 向指定的 AI 提供者發送提示
*
* @param ApiProvider $provider
* @param string $prompt
* @return array
*/
private function sendToProvider(ApiProvider $provider, string $prompt): array
{
$response = Http::withHeaders([
'Authorization' => 'Bearer ' . $provider->api_key,
'Content-Type' => 'application/json',
])->post($provider->endpoint, [
'prompt' => $prompt,
'max_tokens' => 1000,
]);
if (!$response->successful()) {
throw new \Exception('AI provider request failed: ' . $response->body());
}
return [
'success' => true,
'response' => $response->json('choices.0.text') ?? $response->json('response')
];
}
}