feat: add app and database modules
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* ============================================================
|
||||
*
|
||||
* @project biiproject
|
||||
*
|
||||
* @author Andika Debi Putra
|
||||
*
|
||||
* @email andikadebiputra@gmail.com
|
||||
*
|
||||
* @website https://biiproject.com
|
||||
*
|
||||
* @copyright Copyright (c) 2026 Andika Debi Putra
|
||||
* @license Proprietary - All Rights Reserved
|
||||
*
|
||||
* @version 1.0.0
|
||||
*
|
||||
* @created 2026-05-01
|
||||
* ============================================================
|
||||
*
|
||||
* Unauthorized copying, modification, distribution, or use
|
||||
* of this file is strictly prohibited without prior written
|
||||
* permission from the author.
|
||||
* ============================================================
|
||||
*/
|
||||
|
||||
namespace App\Services\AI;
|
||||
|
||||
use App\Services\SystemConfig\SystemConfigService;
|
||||
|
||||
class AiService
|
||||
{
|
||||
protected $systemConfig;
|
||||
|
||||
protected $providers = [];
|
||||
|
||||
public function __construct(SystemConfigService $systemConfig)
|
||||
{
|
||||
$this->systemConfig = $systemConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a provider instance.
|
||||
*/
|
||||
public function provider(?string $identifier = null): AiProviderInterface
|
||||
{
|
||||
$identifier = $identifier ?: $this->systemConfig->get('ai_provider', 'gpt');
|
||||
|
||||
if (isset($this->providers[$identifier])) {
|
||||
return $this->providers[$identifier];
|
||||
}
|
||||
|
||||
$config = $this->getProviderConfig($identifier);
|
||||
|
||||
$instance = match ($identifier) {
|
||||
'gpt' => new GptProvider($config),
|
||||
'gemini' => new GeminiProvider($config),
|
||||
'claude' => new ClaudeProvider($config),
|
||||
'deepseek' => new OpenAiCompatibleProvider('deepseek', 'https://api.deepseek.com/chat/completions', $config),
|
||||
'grok' => new OpenAiCompatibleProvider('grok', 'https://api.x.ai/v1/chat/completions', $config),
|
||||
'mistral' => new OpenAiCompatibleProvider('mistral', 'https://api.mistral.ai/v1/chat/completions', $config),
|
||||
'openrouter' => new OpenAiCompatibleProvider('openrouter', 'https://openrouter.ai/api/v1/chat/completions', $config),
|
||||
'ollama' => new OllamaProvider($config),
|
||||
default => throw new \Exception("Unsupported AI provider: {$identifier}"),
|
||||
};
|
||||
|
||||
return $this->providers[$identifier] = $instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get configuration for a specific provider from system settings.
|
||||
*/
|
||||
protected function getProviderConfig(string $identifier): array
|
||||
{
|
||||
return [
|
||||
'key' => $this->systemConfig->get("ai_{$identifier}_key"),
|
||||
'base_url' => $this->systemConfig->get("ai_{$identifier}_base_url"),
|
||||
'default_model' => $this->systemConfig->get('ai_default_model'),
|
||||
'instruction' => $this->systemConfig->get('ai_system_instruction'),
|
||||
'temperature' => $this->systemConfig->get('ai_temperature', 0.7),
|
||||
'max_tokens' => $this->systemConfig->get('ai_max_tokens', 2000),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Static method to get supported models for each provider.
|
||||
*/
|
||||
public static function getSupportedModels(): array
|
||||
{
|
||||
return [
|
||||
'gpt' => [
|
||||
['id' => 'gpt-4o', 'name' => 'GPT-4o (Newest)'],
|
||||
['id' => 'gpt-4-turbo', 'name' => 'GPT-4 Turbo'],
|
||||
['id' => 'gpt-3.5-turbo', 'name' => 'GPT-3.5 Turbo'],
|
||||
],
|
||||
'gemini' => [
|
||||
['id' => 'gemini-1.5-pro', 'name' => 'Gemini 1.5 Pro'],
|
||||
['id' => 'gemini-1.5-flash', 'name' => 'Gemini 1.5 Flash'],
|
||||
['id' => 'gemini-1.0-pro', 'name' => 'Gemini 1.0 Pro'],
|
||||
],
|
||||
'claude' => [
|
||||
['id' => 'claude-3-5-sonnet-20240620', 'name' => 'Claude 3.5 Sonnet'],
|
||||
['id' => 'claude-3-opus-20240229', 'name' => 'Claude 3 Opus'],
|
||||
['id' => 'claude-3-sonnet-20240229', 'name' => 'Claude 3 Sonnet'],
|
||||
['id' => 'claude-3-haiku-20240307', 'name' => 'Claude 3 Haiku'],
|
||||
],
|
||||
'deepseek' => [
|
||||
['id' => 'deepseek-chat', 'name' => 'DeepSeek Chat'],
|
||||
['id' => 'deepseek-coder', 'name' => 'DeepSeek Coder'],
|
||||
],
|
||||
'grok' => [
|
||||
['id' => 'grok-1', 'name' => 'Grok-1'],
|
||||
],
|
||||
'mistral' => [
|
||||
['id' => 'mistral-large-latest', 'name' => 'Mistral Large'],
|
||||
['id' => 'mistral-medium-latest', 'name' => 'Mistral Medium'],
|
||||
['id' => 'mistral-small-latest', 'name' => 'Mistral Small'],
|
||||
],
|
||||
'openrouter' => [
|
||||
['id' => 'google/gemini-pro-1.5', 'name' => 'Gemini Pro 1.5'],
|
||||
['id' => 'anthropic/claude-3.5-sonnet', 'name' => 'Claude 3.5 Sonnet'],
|
||||
['id' => 'meta-llama/llama-3-70b-instruct', 'name' => 'Llama 3 70B'],
|
||||
],
|
||||
'ollama' => [
|
||||
['id' => 'llama3', 'name' => 'Llama 3'],
|
||||
['id' => 'mistral', 'name' => 'Mistral'],
|
||||
['id' => 'phi3', 'name' => 'Phi-3'],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user