Add complete Laravel LLM Gateway implementation
Core Features: - Multi-provider support (OpenAI, Anthropic, DeepSeek, Gemini, Mistral) - Provider service architecture with abstract base class - Dynamic model discovery from provider APIs - Encrypted per-user provider credentials storage Admin Interface: - Complete admin panel with Livewire components - User management with CRUD operations - API key management with testing capabilities - Budget system with limits and reset schedules - Usage logs with filtering and CSV export - Model pricing management with cost calculator - Dashboard with Chart.js visualizations Database Schema: - MariaDB migrations for all tables - User provider credentials (encrypted) - LLM request logging - Budget tracking and rate limiting - Model pricing configuration API Implementation: - OpenAI-compatible endpoints - Budget checking middleware - Rate limit enforcement - Request logging jobs - Cost calculation service Testing: - Unit tests for all provider services - Provider factory tests - Cost calculator tests Documentation: - Admin user seeder - Model pricing seeder - Configuration files
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\User;
|
||||
use App\Models\UserBudget;
|
||||
use App\Services\Budget\BudgetChecker;
|
||||
use App\Services\RateLimit\RateLimitChecker;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class UserBudgetController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private BudgetChecker $budgetChecker,
|
||||
private RateLimitChecker $rateLimitChecker
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Display budget and rate limit status for a user
|
||||
*/
|
||||
public function show(User $user)
|
||||
{
|
||||
$budgetStatus = $this->budgetChecker->getBudgetStatus($user);
|
||||
$rateLimitStatus = $this->rateLimitChecker->getRateLimitStatus($user);
|
||||
|
||||
return view('admin.user-budget.show', compact('user', 'budgetStatus', 'rateLimitStatus'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update budget limits for a user
|
||||
*/
|
||||
public function updateBudget(Request $request, User $user)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'monthly_limit' => 'required|numeric|min:0',
|
||||
'daily_limit' => 'nullable|numeric|min:0',
|
||||
'alert_threshold_percentage' => 'required|integer|min:0|max:100',
|
||||
]);
|
||||
|
||||
$budget = $user->budget ?? new UserBudget(['user_id' => $user->id]);
|
||||
$budget->fill($validated);
|
||||
$budget->save();
|
||||
|
||||
return back()->with('success', 'Budget limits updated successfully!');
|
||||
}
|
||||
|
||||
/**
|
||||
* Update rate limits for a user
|
||||
*/
|
||||
public function updateRateLimit(Request $request, User $user)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'requests_per_minute' => 'required|integer|min:0',
|
||||
'requests_per_hour' => 'required|integer|min:0',
|
||||
'requests_per_day' => 'required|integer|min:0',
|
||||
]);
|
||||
|
||||
$rateLimit = $user->rateLimit ?? new \App\Models\RateLimit(['user_id' => $user->id]);
|
||||
$rateLimit->fill($validated);
|
||||
$rateLimit->save();
|
||||
|
||||
return back()->with('success', 'Rate limits updated successfully!');
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset rate limit for a user
|
||||
*/
|
||||
public function resetRateLimit(User $user)
|
||||
{
|
||||
$this->rateLimitChecker->resetRateLimit($user);
|
||||
|
||||
return back()->with('success', 'Rate limit reset successfully!');
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset budget for a user (admin action)
|
||||
*/
|
||||
public function resetBudget(User $user)
|
||||
{
|
||||
$budget = $user->budget;
|
||||
|
||||
if ($budget) {
|
||||
$budget->current_month_spending = 0.0;
|
||||
$budget->current_day_spending = 0.0;
|
||||
$budget->is_budget_exceeded = false;
|
||||
$budget->last_alert_sent_at = null;
|
||||
$budget->month_started_at = now()->startOfMonth();
|
||||
$budget->day_started_at = now()->startOfDay();
|
||||
$budget->save();
|
||||
}
|
||||
|
||||
return back()->with('success', 'Budget reset successfully!');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user