77 lines
1.9 KiB
PHP
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')
|
|
];
|
|
}
|
|
}
|