@php // Hai nhà cung cấp đăng nhập bằng OAuth, render chung một khối để giao diện đồng nhất. $oauthProviders = [ [ 'key' => 'codex', 'title' => 'Kết nối OpenAI', 'account' => 'ChatGPT', 'empty' => 'Chưa kết nối tài khoản ChatGPT nào. Agent dùng provider codex sẽ không chạy được.', ], [ 'key' => 'claude_code', 'title' => 'Kết nối Claude Code', 'account' => 'Claude', 'empty' => 'Chưa kết nối tài khoản Claude nào. Agent dùng provider claude_code sẽ không chạy được.', ], ]; @endphp @extends('layouts.admin') @section('title', 'Quản lý AI Agent') @section('admin_shell_attributes') x-data="agentsApp()" x-init="init()" @keydown.escape.window="connectModal.open && closeConnectModal()" @endsection @section('content') @include('partials.admin-topbar', [ 'markImage' => asset('default/Logo.png'), 'markAlt' => 'Zaron', 'title' => 'AI Agent', 'subtitle' => 'Tạo prompt để bot đọc hội thoại Zalo và soạn phản hồi trong cài đặt hệ thống.', 'actions' => ' Mở Chat', ]) @include('settings.partials.nav-tabs')
{{-- Hai tab con: "Kết nối" quản lý tài khoản OpenAI/Claude, "Tùy chỉnh" quản lý agent. Tab đang mở lưu trên hash URL (#ket-noi / #tuy-chinh) để tải lại trang không bị nhảy tab. --}}
{{-- Tab "Kết nối": mỗi nhà cung cấp một panel, màn hình rộng thì nằm cạnh nhau. --}}
@foreach ($oauthProviders as $provider)

{{ $provider['title'] }}

{!! $provider['empty'] !!}
@endforeach
{{-- Tab "Tùy chỉnh": danh sách agent bên trái, form tạo/sửa bên phải. --}}

Cấu hình provider, model, chế độ phản hồi và prompt vận hành.

Thông tin chính

Model và provider

{{-- Provider đơn: một kết nối cố định, kết nối active đầu tiên, hoặc xoay vòng tất cả. --}} {{-- Kết hợp: provider nào được thử trước. --}}
{{-- Chưa có tài khoản nào của provider đang dùng: chỉ đường sang tab Kết nối. --}}
Chưa có tài khoản nào. Kết nối ngay
{{-- Thứ tự tài khoản sẽ thử ở chế độ xoay vòng / kết hợp. --}}
Thứ tự thử khi gặp lỗi
Báo lỗi
Mỗi lượt bắt đầu từ tài khoản lâu chưa dùng nhất nên token được dùng đều. Lỗi 401/403: đánh dấu hết hạn · Hết quota (429): tạm nghỉ tới lúc reset · Lỗi máy chủ/timeout: tạm nghỉ 1 phút. Tài khoản gạch mờ là đang tạm nghỉ.
{{-- OpenAI API key: nhập tên model tự do. --}}
{{-- Provider OAuth: chọn từ danh sách model của tài khoản. Kết hợp có 2 ô (ChatGPT + Claude). --}}
Chỉ áp dụng cho Claude.
Chỉ áp dụng cho ChatGPT. Model gpt-5.x không hỗ trợ "minimal".
Codex bỏ qua temperature. Danh sách model lấy trực tiếp từ tài khoản (cache 30 phút, bấm "Tải lại" để làm mới).

Prompt vận hành

{{-- Modal kết nối. Không dùng class .modal của Bootstrap: Alpine x-show gọi style.removeProperty('display') khi hiện, sẽ xoá mất display:block inline và để lại .modal{display:none} của Bootstrap => modal không bao giờ hiện. Dùng class riêng có sẵn display:flex nên x-show hoạt động đúng. --}}
{{-- Dải trạng thái: cửa sổ đăng nhập đã mở hay chưa. --}}
Đang tạo link đăng nhập... Đã mở cửa sổ đăng nhập — đồng ý xong hãy quay lại đây dán URL. Trình duyệt chặn popup — hãy mở URL ở Bước 1 thủ công.
HOẶC DÁN CALLBACK URL THỦ CÔNG
Bước 1: Mở URL này trên trình duyệt
Đăng nhập và bấm đồng ý. Trình duyệt sẽ nhảy sang và có thể báo lỗi không truy cập được — đó là bình thường.
Bước 2: Dán URL callback vào đây
Sau khi đồng ý, copy nguyên URL trên thanh địa chỉ (có chứa ?code=...), hoặc mã dạng code#state nếu trang hiển thị mã.
Tên gợi nhớ (tùy chọn)
@endsection @push('scripts') @endpush