99 lines
3.0 KiB
PHP
Executable File
99 lines
3.0 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\AiModel;
|
|
use App\Models\AiProvider;
|
|
use App\Models\PromptProject;
|
|
use App\Services\Ai\AiServiceFactory;
|
|
use App\Services\AiAgentService;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\View\View;
|
|
|
|
class AiAgentController extends Controller
|
|
{
|
|
public function __construct(
|
|
private readonly AiAgentService $aiAgentService
|
|
) {}
|
|
|
|
public function index(): View
|
|
{
|
|
$user = auth()->user();
|
|
|
|
$projectsQuery = PromptProject::with(['provider', 'model'])->latest();
|
|
|
|
if (!$user || $user->role !== 'superadmin') {
|
|
$projectsQuery->where('user_id', $user->id);
|
|
}
|
|
|
|
$projects = $projectsQuery->get();
|
|
|
|
$providers = AiProvider::where('is_active', true)
|
|
->orderBy('name')
|
|
->get();
|
|
|
|
$defaultProviderId = 1;
|
|
$defaultModelId = 11;
|
|
|
|
return view('ai-agent.index', compact('projects', 'providers', 'defaultProviderId', 'defaultModelId'));
|
|
}
|
|
|
|
public function execute(Request $request): RedirectResponse
|
|
{
|
|
$request->validate([
|
|
'project_id' => 'nullable|exists:prompt_projects,id',
|
|
'prompt_text' => 'required|string',
|
|
'provider_id' => 'required|exists:ai_providers,id',
|
|
'model_id' => 'required|exists:ai_models,id',
|
|
'temperature' => 'nullable|numeric|min:0|max:1',
|
|
'max_tokens' => 'nullable|integer|min:1|max:128000',
|
|
]);
|
|
|
|
$provider = AiProvider::where('id', $request->provider_id)
|
|
->where('is_active', true)
|
|
->firstOrFail();
|
|
|
|
$model = AiModel::where('id', $request->model_id)
|
|
->where('provider_id', $provider->id)
|
|
->where('is_active', true)
|
|
->firstOrFail();
|
|
|
|
$result = $this->aiAgentService->execute(
|
|
prompt: $request->prompt_text,
|
|
provider: $provider,
|
|
model: $model,
|
|
temperature: (float) ($request->temperature ?? 0.7),
|
|
maxTokens: (int) ($request->max_tokens ?? 1024),
|
|
);
|
|
|
|
return redirect()->route('ai-agent.index')
|
|
->with('success', 'Execução concluída com sucesso.')
|
|
->with('agent_result', $result)
|
|
->withInput([
|
|
'project_id' => $request->project_id,
|
|
'prompt_text' => $request->prompt_text,
|
|
'provider_id' => $request->provider_id,
|
|
'model_id' => $request->model_id,
|
|
'temperature' => $request->temperature,
|
|
'max_tokens' => $request->max_tokens,
|
|
]);
|
|
}
|
|
|
|
public function getModels(Request $request)
|
|
{
|
|
$request->validate([
|
|
'provider_id' => 'required|exists:ai_providers,id',
|
|
]);
|
|
|
|
$models = AiModel::where('provider_id', $request->provider_id)
|
|
->where('is_active', true)
|
|
->orderBy('name')
|
|
->get(['id', 'name', 'slug']);
|
|
|
|
return response()->json($models);
|
|
}
|
|
}
|