> ## Documentation Index
> Fetch the complete documentation index at: https://docs.quinnsambal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Agent dashboard

<style>
  {`
    [class*="max-w-none"][class*="table"] {
      display: block !important;
      overflow-x: auto !important;
      max-width: 100% !important;
      width: 100% !important;
      flex-grow: 0 !important;
    }
    [class*="max-w-none"][class*="table"] > table {
      width: 100% !important;
      max-width: 100% !important;
      table-layout: fixed !important;
    }
    .mermaid {
      max-width: 100% !important;
      overflow-x: auto !important;
    }
    article svg[role="img"] {
      max-width: 100% !important;
      height: auto !important;
    }
    article img, .prose img {
      max-width: 100% !important;
      height: auto !important;
    }
    img[src*="LOGO"], img[src*="logo"] {
      max-width: 120px !important;
      max-height: 40px !important;
      width: auto !important;
      height: auto !important;
      object-fit: contain !important;
    }
    `}
</style>

***

title: "Agent Dashboard"
description: "Dashboard monitoring kesehatan semua AI agent — stats grid, failing agents alert, daily execution chart, dan recent runs."
----------------------------------------------------------------------------------------------------------------------------------------

# Agent Dashboard

<img src="https://mintcdn.com/quinnofspicy/e4f_upKhVWcjsUmM/docs/mintlify/screenshots/ai/agent-dashboard.png?fit=max&auto=format&n=e4f_upKhVWcjsUmM&q=85&s=8a105e686c0c6715555d1cc726c92ce1" alt="Agent Dashboard" width="1920" height="1080" data-path="docs/mintlify/screenshots/ai/agent-dashboard.png" />

Agent Dashboard memberikan pandangan menyeluruh tentang kesehatan dan performa semua AI agent dalam satu tampilan. Halaman ini dirancang untuk monitoring cepat — Anda bisa langsung melihat agen mana yang bermasalah tanpa harus membuka detail satu per satu.

## Arsitektur Dashboard

```mermaid theme={null}
graph TD
    A[AgentDashboard.jsx<br/>376 baris] --> B[Load Data]
    B --> B1[AIAgent.list]
    B --> B2[AIAgentRun.list]
    B --> B3[AIAgentSchedule.list]
    
    B1 --> C[Stats Grid — 4 Kartu]
    B2 --> C
    B3 --> C
    
    C --> D[Failing Agents Alert Panel]
    C --> E[Daily Execution BarChart]
    C --> F[Recent Runs List]
    
    D --> G{Klik Agent}
    G --> H[/AIAgentDetail]
    
    F --> I{Klik Run}
    I --> J[Run Detail + Output]
```

## Data Flow Pipeline

```mermaid theme={null}
flowchart LR
    subgraph "Data Sources"
        S1[(AIAgent)] --> Agg[Aggregation Engine]
        S2[(AIAgentRun)] --> Agg
        S3[(AIAgentSchedule)] --> Agg
    end

    subgraph "Computations"
        Agg --> C1[Total agents count]
        Agg --> C2[Active agents filter]
        Agg --> C3[Success rate calc]
        Agg --> C4[Failure rate grouping]
        Agg --> C5[Daily execution bucketing]
    end

    subgraph "Visualizations"
        C1 & C2 --> Stats[Stats Grid]
        C4 --> Alert[Failing Agents Panel]
        C5 --> Chart[Daily Execution Chart]
        S2 --> Runs[Recent Runs List]
    end
```

## Stats Grid — 4 Kartu

| Kartu | Sumber Data | Perhitungan |
| - | - | - |
| **Total Agen** | `AIAgent.list()` | Jumlah semua agen (aktif + nonaktif) |
| **Agen Aktif** | `AIAgent.list()` | Filter `is_active = true` |
| **Total Eksekusi** | `AIAgentRun.list()` | Count semua run |
| **Success Rate** | `AIAgentRun.list()` | `(success / total) × 100%` |

### Stats Computation Detail

```mermaid theme={null}
flowchart TD
    subgraph "Input Data"
        R1[AIAgentRun records]
    end

    subgraph "Aggregations"
        R1 --> A1[COUNT(*) → Total Runs]
        R1 --> A2[COUNT WHERE status='success' → Success Count]
        R1 --> A3[COUNT WHERE status='failed' → Failed Count]
        R1 --> A4[SUM cost_amount → Total Cost]
        R1 --> A5[COUNT DISTINCT agent_key → Unique Agents]
    end

    subgraph "Derived Metrics"
        A2 & A1 --> D1[Success Rate = success/total × 100%]
        A3 & A1 --> D2[Failure Rate = failed/total × 100%]
        A4 & A1 --> D3[Avg Cost per Run = total_cost/total_runs]
    end
```

## Failing Agents Alert

Panel peringatan yang menampilkan agen dengan kegagalan berulang:

```mermaid theme={null}
flowchart LR
    A[AIAgentRun] --> B{Group by agent_key}
    B --> C{Hitung failure rate}
    C --> |Rate > threshold| D[Tampilkan di Alert Panel]
    C --> |Rate normal| E[Tidak ditampilkan]
    D --> F[Agent Name +<br/>Failure Count +<br/>Last Error]
```

Alert panel membantu mengidentifikasi agen yang perlu diperbaiki atau dimatikan sebelum menyebabkan masalah lebih lanjut.

### Alert Threshold Configuration

| Threshold | Failure Count | Severity | Action |
| - | - | - | - |
| **Warning** | 3-5 failures | Orange | Investigate agent configuration |
| **Critical** | 6-10 failures | Red | Disable agent, check system prompt |
| **Emergency** | >10 failures | Flashing Red | Immediate intervention required |

### Alert Resolution Flow

```mermaid theme={null}
stateDiagram-v2
    [*] --> Healthy: Agent running normally
    Healthy --> Warning: 3+ failures detected
    Warning --> Critical: 6+ failures detected
    Critical --> Emergency: 10+ failures detected
    
    Warning --> Investigating: User clicks alert
    Investigating --> Fixed: Config updated
    Investigating --> Disabled: Agent deactivated
    
    Fixed --> Healthy: Success rate restored
    Disabled --> [*]: Agent removed from rotation
    
    Emergency --> AutoDisabled: System auto-disables
    AutoDisabled --> Investigating: Admin reviews
```

## Daily Execution Chart

Grafik batang (Recharts `BarChart`) yang menampilkan jumlah eksekusi per hari:

| Aspek | Detail |
| - | - |
| **Tipe** | BarChart vertikal |
| **Sumbu X** | Tanggal (hari) |
| **Sumbu Y** | Jumlah eksekusi |
| **Data Source** | `AIAgentRun.list()` — group by date |
| **Filter** | Periode waktu (7 hari, 30 hari, custom) |

### Chart Data Pipeline

```mermaid theme={null}
flowchart LR
    A[AIAgentRun records] --> B[Filter by date range]
    B --> C[GROUP BY DATE created_at]
    C --> D[COUNT per day]
    D --> E[Sort by date ASC]
    E --> F[Recharts BarChart]
    
    F --> G[Tooltip on hover]
    F --> H[Click bar → filter runs]
```

## Recent Runs List

Daftar eksekusi terbaru dengan informasi:

| Kolom | Detail |
| - | - |
| **Agent** | Nama agen yang dijalankan |
| **User** | User yang menjalankan |
| **Status** | `success` (hijau) / `failed` (merah) |
| **Waktu** | Timestamp eksekusi |
| **Biaya** | `cost_amount` dalam Rupiah |
| **Metode** | `balance` / `credit` / `free` |

### Run Status Distribution

```mermaid theme={null}
pie title Run Status Distribution
    "Success" : 85
    "Failed" : 12
    "Timeout" : 3
```

## Entities Used

| Entity | Role | Key Fields |
| - | - | - |
| **AIAgent** | Agent definitions | `agent_key`, `name`, `is_active`, `category` |
| **AIAgentRun** | Execution records | `agent_key`, `status`, `cost_amount`, `created_at` |
| **AIAgentSchedule** | Schedule configs | `trigger_type`, `last_triggered_at`, `notification_channel` |
| **AIAgentTemplate** | Template definitions | `system_prompt`, `price_per_run`, `model` |

## Cara Akses

Dari sidebar, klik menu **AI & Analitik** > **Agent Dashboard**.

## Flow Penggunaan

```mermaid theme={null}
flowchart TD
    A[Buka Agent Dashboard] --> B[Review 4 Stats Cards]
    B --> C{Ada failing agents?}
    C -->|Ya| D[Klik alert → Investigasi]
    C -->|Tidak| E[Review Daily Chart]
    D --> F[Perbaiki konfigurasi]
    E --> G[Scroll ke Recent Runs]
    F --> G
    G --> H{Perlu detail run?}
    H -->|Ya| I[Klik run → Lihat output]
    H -->|Tidak| J[Dashboard monitoring selesai]
    I --> J
```

## Monitoring Best Practices

| Praktik | Frekuensi | Metrik Target |
| - | - | - |
| Review success rate | Harian | > 90% |
| Cek failing agents | Harian | 0 critical alerts |
| Analisis tren eksekusi | Mingguan | Stabil atau growing |
| Evaluasi biaya | Bulanan | Within budget |
| Audit agen tidak terpakai | Bulanan | Remove unused agents |

## Tips

* Jadwalkan review dashboard mingguan untuk menjaga kualitas agen
* Segera investigasi agen yang success rate-nya turun di bawah 80%
* Bandingkan performa sebelum dan sesudah perubahan konfigurasi
* Matikan agen yang tidak lagi diperlukan untuk menghemat kredit
* Gunakan data daily execution untuk merencanakan kapasitas kredit bulanan

***

## Diagram Relasi Entitas Agent Dashboard

```mermaid theme={null}
erDiagram
    AIAgent ||--o{ AIAgentRun : "menjalankan"
    AIAgent ||--o{ AIAgentSchedule : "dijadwalkan"
    AIAgent }o--o| AIAgentTemplate : "berasal dari"
    AIAgent }o--|| Company : "dimiliki oleh"
    AIAgentRun }o--|| AIAgentModel : "menggunakan model"
    AIAgentRun }o--|| Company : "atas nama"
    AIAgentSchedule }o--|| Company : "dalam scope"
    AIAgentSettings ||--|| Company : "konfigurasi global"

    AIAgent {
        string agent_key PK "Kunci unik agen (auto-generated slug)"
        string company_id FK "ID perusahaan pemilik"
        string created_by "Email pembuat agen"
        string name "Nama AI Agent"
        string tagline "Deskripsi singkat satu baris"
        string description "Penjelasan lengkap fungsi agen (maks 2000 karakter)"
        enum category "Kategori: business, content, writing, social, other"
        string icon "Nama icon lucide-react"
        string color "Warna tema agen"
        string system_prompt "Instruksi sistem utama untuk LLM (maks 4000 karakter)"
        array input_fields "Field input dinamis untuk agen"
        string model "Model LLM default"
        boolean use_internet "Gunakan konteks internet"
        enum status "Status: active, paused, inactive"
        string source_template_key FK "Link ke template asal (nullable)"
        number run_count "Total eksekusi agen"
        number total_cost_amount "Total biaya Rupiah semua run"
        number total_cost_credit "Total kredit yang dipakai"
        datetime created_date "Tanggal dibuat"
        datetime updated_date "Tanggal diperbarui terakhir"
    }

    AIAgentRun {
        string id PK "ID unik run (auto-generated)"
        string user_id FK "ID user yang menjalankan"
        string user_email "Email user yang menjalankan"
        string company_id FK "ID perusahaan aktif"
        string company_name "Nama perusahaan saat run"
        string agent_key FK "Kunci agen yang dijalankan"
        string agent_name "Nama agen saat run"
        string model_used "Model AI yang dipakai"
        string model_name "Nama tampilan model"
        object input_data "Input yang diberikan user"
        string output "Hasil dari AI Agent (maks 100000 karakter)"
        number cost_amount "Biaya Rupiah yang dipotong"
        number cost_credit "Kredit yang dipotong"
        enum payment_method "Metode bayar: balance, credit, free"
        enum status "Status: success, failed"
        datetime created_date "Tanggal eksekusi"
    }

    AIAgentSchedule {
        string id PK "ID unik jadwal (auto-generated)"
        string agent_id FK "Referensi ke AIAgent (agent_key)"
        string company_id FK "ID perusahaan"
        enum trigger_type "Jenis trigger: schedule_daily, schedule_weekly, schedule_monthly, event_low_stock, event_invoice_overdue, event_new_transaction, event_task_due, event_custom"
        object trigger_config "Konfigurasi trigger (jam, menit, hari, threshold)"
        boolean is_active "Apakah jadwal aktif"
        datetime last_triggered_at "Waktu terakhir trigger fired"
        number trigger_count "Jumlah trigger sudah fired"
        enum notification_channel "Channel notifikasi: in_app, whatsapp, email, all"
        string created_by "Email pembuat jadwal"
        datetime created_date "Tanggal dibuat"
    }

    AIAgentTemplate {
        string agent_key PK "Kunci unik template"
        string name "Nama AI Agent"
        string tagline "Deskripsi singkat satu baris"
        string description "Penjelasan lengkap fungsi (maks 2000 karakter)"
        enum category "Kategori: business, content, writing, social, other"
        string icon "Nama icon lucide-react"
        string color "Warna tema template"
        number price_per_run "Biaya per penggunaan dalam Rupiah"
        number credit_cost "Biaya alternatif dalam kredit AI"
        array features "Daftar fitur utama"
        array use_cases "Daftar kasus penggunaan"
        array input_fields "Field input yang diminta dari user"
        string system_prompt "Instruksi sistem untuk LLM (maks 4000 karakter)"
        string model "Model LLM yang dipakai"
        boolean use_internet "Gunakan konteks internet"
        enum status "Status: active, coming_soon, inactive"
        number order "Urutan tampilan"
    }

    AIAgentModel {
        string model_key PK "Kunci model untuk InvokeLLM"
        string name "Nama tampilan model"
        string description "Penjelasan kualitas/kecepatan (maks 500 karakter)"
        number price_multiplier "Pengali biaya (biaya akhir = harga dasar x multiplier)"
        enum tier "Tingkatan: standard, advanced, premium"
        boolean supports_internet "Model mendukung konteks internet"
        boolean is_active "Model aktif digunakan"
        number order "Urutan tampilan"
    }

    AIAgentSettings {
        string setting_key PK "Kunci pengaturan (selalu 'global')"
        string description "Catatan pengaturan AI Agent (maks 1000 karakter)"
        number credit_to_rupiah_rate "Nilai 1 kredit dalam Rupiah (default: 10)"
        number base_price_per_run "Harga dasar default per run dalam Rupiah (default: 1000)"
        boolean allow_credit_payment "Izinkan pembayaran dengan kredit"
        boolean allow_balance_payment "Izinkan pembayaran dengan saldo Rupiah"
    }
```

## Tabel Skema Entitas

### AIAgent — Definisi Agen AI

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `agent_key` | string | Ya | — | Kunci unik agen (auto-generated slug dari nama) |
| `company_id` | string | Ya | — | ID perusahaan (scope company-level) |
| `created_by` | string | Ya | — | Email user yang membuat agen |
| `name` | string | Ya | — | Nama AI Agent |
| `tagline` | string | Tidak | — | Deskripsi singkat satu baris |
| `description` | string | Tidak | — | Penjelasan lengkap fungsi agen (maks 2000 karakter) |
| `category` | enum | Tidak | `"other"` | Kategori agen: `business`, `content`, `writing`, `social`, `other` |
| `icon` | string | Tidak | `"Sparkles"` | Nama icon lucide-react |
| `color` | string | Tidak | `"#4F46E5"` | Warna tema agen |
| `system_prompt` | string | Ya | — | Instruksi sistem utama untuk LLM (maks 4000 karakter) |
| `input_fields` | array | Tidak | — | Field input dinamis untuk agen (objek: key, label, type, placeholder, required) |
| `model` | string | Tidak | `"automatic"` | Model LLM default |
| `use_internet` | boolean | Tidak | `false` | Gunakan konteks internet |
| `status` | enum | Tidak | `"active"` | Status agen: `active` (jalan otomatis), `paused` (tidak otomatis tapi bisa manual), `inactive` (nonaktif) |
| `source_template_key` | string | Tidak | — | Link ke AIAgentTemplate asal jika dibuat dari template (nullable) |
| `run_count` | number | Tidak | `0` | Total eksekusi agen |
| `total_cost_amount` | number | Tidak | `0` | Total biaya Rupiah semua run |
| `total_cost_credit` | number | Tidak | `0` | Total kredit yang dipakai semua run |
| `created_date` | datetime | Tidak | — | Tanggal dibuat |
| `updated_date` | datetime | Tidak | — | Tanggal diperbarui terakhir |

### AIAgentRun — Catatan Eksekusi Agen

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `user_id` | string | Ya | — | ID user yang menjalankan |
| `user_email` | string | Tidak | — | Email user yang menjalankan |
| `company_id` | string | Tidak | — | ID perusahaan aktif (null untuk personal) |
| `company_name` | string | Tidak | — | Nama perusahaan saat agen dijalankan |
| `agent_key` | string | Ya | — | Kunci agen yang dijalankan |
| `agent_name` | string | Tidak | — | Nama agen saat run |
| `model_used` | string | Tidak | — | Model AI yang dipakai pada run ini |
| `model_name` | string | Tidak | — | Nama tampilan model yang dipakai |
| `input_data` | object | Tidak | — | Input yang diberikan user |
| `output` | string | Tidak | — | Hasil dari AI Agent (maks 100000 karakter) |
| `cost_amount` | number | Tidak | `0` | Biaya Rupiah yang dipotong |
| `cost_credit` | number | Tidak | `0` | Kredit yang dipotong |
| `payment_method` | enum | Tidak | `"balance"` | Metode pembayaran: `balance`, `credit`, `free` |
| `status` | enum | Tidak | `"success"` | Status eksekusi: `success`, `failed` |

### AIAgentSchedule — Jadwal & Trigger Agen

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `agent_id` | string | Ya | — | Referensi ke AIAgent (agent\_key) |
| `company_id` | string | Ya | — | ID perusahaan |
| `trigger_type` | enum | Ya | — | Jenis trigger: `schedule_daily`, `schedule_weekly`, `schedule_monthly`, `event_low_stock`, `event_invoice_overdue`, `event_new_transaction`, `event_task_due`, `event_custom` |
| `trigger_config` | object | Tidak | — | Konfigurasi trigger. Schedule: `{hour, minute, day_of_week?, day_of_month?}`. Event: `{threshold?, product_category?, days_before?}` |
| `is_active` | boolean | Tidak | `true` | Apakah schedule/trigger aktif |
| `last_triggered_at` | datetime | Tidak | — | Waktu terakhir trigger fired |
| `trigger_count` | number | Tidak | `0` | Berapa kali trigger sudah fired |
| `notification_channel` | enum | Tidak | `"in_app"` | Channel notifikasi hasil agen: `in_app`, `whatsapp`, `email`, `all` |
| `created_by` | string | Ya | — | Email user yang membuat schedule |
| `created_date` | datetime | Tidak | — | Tanggal dibuat |

### AIAgentTemplate — Template Agen AI

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `agent_key` | string | Ya | — | Kunci unik template (contoh: `business_analysis`) |
| `name` | string | Ya | — | Nama AI Agent |
| `tagline` | string | Tidak | — | Deskripsi singkat satu baris |
| `description` | string | Tidak | — | Penjelasan lengkap fungsi agen (maks 2000 karakter) |
| `category` | enum | Tidak | `"other"` | Kategori: `business`, `content`, `writing`, `social`, `other` |
| `icon` | string | Tidak | `"Sparkles"` | Nama icon lucide-react |
| `color` | string | Tidak | `"#3b82f6"` | Warna tema template |
| `price_per_run` | number | Tidak | `5000` | Biaya per penggunaan dalam Rupiah |
| `credit_cost` | number | Tidak | `1` | Biaya alternatif dalam kredit AI bila saldo tidak cukup |
| `features` | array\[string] | Tidak | — | Daftar fitur utama |
| `use_cases` | array\[string] | Tidak | — | Daftar kasus penggunaan |
| `input_fields` | array\[object] | Tidak | — | Field input yang diminta dari user (key, label, type, placeholder, required) |
| `system_prompt` | string | Tidak | — | Instruksi sistem untuk LLM (maks 4000 karakter) |
| `model` | string | Tidak | `"automatic"` | Model LLM yang dipakai |
| `use_internet` | boolean | Tidak | `false` | Gunakan konteks internet |
| `status` | enum | Tidak | `"active"` | Status: `active`, `coming_soon`, `inactive` |
| `order` | number | Tidak | `0` | Urutan tampilan |

### AIAgentModel — Daftar Model AI

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `model_key` | string | Ya | — | Kunci model untuk InvokeLLM (contoh: `automatic`, `gpt_5_mini`, `claude_sonnet_4_6`) |
| `name` | string | Ya | — | Nama tampilan model (contoh: `Standar (Cepat & Hemat)`) |
| `description` | string | Tidak | — | Penjelasan singkat kualitas/kecepatan model (maks 500 karakter) |
| `price_multiplier` | number | Tidak | `1` | Pengali biaya. Biaya akhir = harga dasar agen x multiplier |
| `tier` | enum | Tidak | `"standard"` | Tingkatan kualitas model: `standard`, `advanced`, `premium` |
| `supports_internet` | boolean | Tidak | `false` | Model mendukung konteks internet |
| `is_active` | boolean | Tidak | `true` | Model aktif digunakan |
| `order` | number | Tidak | `0` | Urutan tampilan |

### AIAgentSettings — Pengaturan Global AI Agent

| Field | Tipe | Wajib | Default | Deskripsi |
| - | - | - | - | - |
| `setting_key` | string | Ya | `"global"` | Kunci pengaturan (selalu `global` untuk pengaturan utama) |
| `description` | string | Tidak | — | Catatan pengaturan AI Agent (maks 1000 karakter) |
| `credit_to_rupiah_rate` | number | Tidak | `10` | Nilai 1 kredit dalam Rupiah (misal: 10 berarti 1 kredit = Rp10) |
| `base_price_per_run` | number | Tidak | `1000` | Harga dasar default per penggunaan dalam Rupiah bila agen tidak set harga sendiri |
| `allow_credit_payment` | boolean | Tidak | `true` | Izinkan user membayar dengan kredit |
| `allow_balance_payment` | boolean | Tidak | `true` | Izinkan user membayar dengan saldo Rupiah |

## Siklus Hidup Monitoring Agen

```mermaid theme={null}
stateDiagram-v2
    [*] --> Idle: Agen dibuat dan didaftarkan
    Idle --> Active: Agen diaktifkan (status = active)
    Active --> Running: Trigger dijalankan (manual/schedule/event)
    Running --> Processing: LLM menerima input dan memproses
    Processing --> Success: Output berhasil dihasilkan
    Processing --> Failed: Terjadi error atau timeout
    Success --> Active: Kembali siap, run_count bertambah
    Failed --> Active: Kembali siap, failure counter bertambah
    Active --> Paused: Agen dijeda oleh admin
    Paused --> Active: Agen diaktifkan kembali
    Active --> Inactive: Agen dinonaktifkan
    Paused --> Inactive: Agen dinonaktifkan
    Inactive --> Active: Agen diaktifkan ulang
    Inactive --> [*]: Agen dihapus permanen

    state Running {
        [*] --> InputReceived
        InputReceived --> ModelSelection
        ModelSelection --> LLMInvocation
        LLMInvocation --> OutputValidation
        OutputValidation --> CostCalculation
        CostCalculation --> [*]
    }
```

## Diagram Urutan — Pemuatan Data Dashboard

```mermaid theme={null}
sequenceDiagram
    participant U as User
    participant D as AgentDashboard.jsx
    participant API as Backend API
    participant DB as Database
    participant AGG as Aggregation Engine

    U->>D: Buka halaman Agent Dashboard
    D->>API: GET /api/ai/agents?company_id={id}
    API->>DB: SELECT * FROM ai_agents WHERE company_id = ?
    DB-->>API: Daftar agen (AIAgent[])
    API-->>D: Response: agents[]

    D->>API: GET /api/ai/agent-runs?company_id={id}&limit=50
    API->>DB: SELECT * FROM ai_agent_runs WHERE company_id = ? ORDER BY created_date DESC
    DB-->>API: Daftar run (AIAgentRun[])
    API-->>D: Response: runs[]

    D->>API: GET /api/ai/agent-schedules?company_id={id}
    API->>DB: SELECT * FROM ai_agent_schedules WHERE company_id = ?
    DB-->>API: Daftar jadwal (AIAgentSchedule[])
    API-->>D: Response: schedules[]

    D->>AGG: Hitung statistik dari agents[] dan runs[]
    AGG->>AGG: total_agents = agents.length
    AGG->>AGG: active_agents = agents.filter(a => a.status === 'active')
    AGG->>AGG: total_executions = runs.length
    AGG->>AGG: success_rate = (success_runs / total_runs) * 100

    AGG-->>D: Stats computed

    D->>AGG: Hitung failing agents
    AGG->>AGG: GROUP BY agent_key WHERE status='failed'
    AGG->>AGG: Filter failure_count >= threshold
    AGG-->>D: Failing agents list

    D->>AGG: Hitung daily execution data
    AGG->>AGG: GROUP BY DATE(created_date)
    AGG->>AGG: COUNT per day, sort ASC
    AGG-->>D: Daily execution buckets

    D->>D: Render Stats Grid + Alert Panel + Chart + Recent Runs
    D-->>U: Dashboard ditampilkan
```

## Diagram Urutan — Pelacakan Performa Agen

```mermaid theme={null}
sequenceDiagram
    participant U as User
    participant D as AgentDashboard.jsx
    participant AGG as Aggregation Engine
    participant RUN as AIAgentRun Store
    participant AGENT as AIAgent Store

    U->>D: Klik pada agen di Alert Panel
    D->>RUN: Query runs WHERE agent_key = selected_agent
    RUN-->>D: runs[] untuk agen terpilih

    D->>AGG: Hitung metrik performa agen
    AGG->>AGG: total_runs = runs.length
    AGG->>AGG: success_count = COUNT(status='success')
    AGG->>AGG: failed_count = COUNT(status='failed')
    AGG->>AGG: success_rate = success_count / total_runs * 100
    AGG->>AGG: avg_cost = SUM(cost_amount) / total_runs
    AGG->>AGG: last_run = MAX(created_date)
    AGG->>AGG: model_distribution = GROUP BY model_used
    AGG-->>D: Performa metrics

    D->>AGENT: Ambil detail agen (agent_key)
    AGENT-->>D: AIAgent object (name, status, category, run_count)

    D->>AGG: Hitung tren 7 hari terakhir
    AGG->>AGG: Filter runs WHERE created_date >= now() - 7 days
    AGG->>AGG: GROUP BY DATE(created_date)
    AGG->>AGG: Hitung daily_success_rate per hari
    AGG-->>D: Trend data[]

    D->>D: Render agent performance detail
    D-->>U: Tampilkan performa agen (success rate, biaya, tren)

    alt Success Rate < 80%
        D->>D: Tampilkan warning badge
        D-->>U: Peringatan performa rendah
    else Success Rate < 50%
        D->>D: Tampilkan critical badge
        D-->>U: Peringatan kritis — agen perlu investigasi
    end
```

## Diagram Urutan — Eksekusi Agen dan Pencatatan Biaya

```mermaid theme={null}
sequenceDiagram
    participant U as User
    participant D as AgentDashboard.jsx
    participant API as Backend API
    participant LLM as LLM Service
    participant WALLET as Wallet/Saldo
    participant RUN as AIAgentRun
    participant AGENT as AIAgent

    U->>D: Klik "Jalankan" pada agen
    D->>API: POST /api/ai/agent-runs {agent_key, input_data}
    API->>AGENT: Ambil konfigurasi agen (system_prompt, model, price)
    AGENT-->>API: Agent config

    API->>API: Tentukan model & hitung biaya
    API->>WALLET: Cek saldo/kredit user
    WALLET-->>API: Saldo tersedia

    API->>LLM: Invoke LLM (model, system_prompt, input_data)
    LLM-->>API: Output hasil

    API->>API: Hitung cost_amount & cost_credit
    API->>WALLET: Potong saldo/kredit
    WALLET-->>API: Pembayaran berhasil

    API->>RUN: Simpan run record (status=success, cost, output)
    RUN-->>API: Run tersimpan

    API->>AGENT: Update run_count += 1, total_cost_amount += cost
    AGENT-->>API: Agen diperbarui

    API-->>D: Response: {run_id, output, cost}
    D-->>U: Tampilkan hasil eksekusi + biaya
```

## Tabel Referensi Enum

### Kategori Agen (`AIAgent.category` / `AIAgentTemplate.category`)

| Nilai | Deskripsi |
| - | - |
| `business` | Agen terkait analisis bisnis, laporan keuangan, dan operasional |
| `content` | Agen pembuat konten pemasaran, blog, dan media sosial |
| `writing` | Agen untuk penulisan dokumen, surat, dan naskah |
| `social` | Agen untuk manajemen media sosial dan interaksi sosial |
| `other` | Kategori umum untuk agen lainnya |

### Status Agen (`AIAgent.status`)

| Nilai | Deskripsi | Perilaku |
| - | - | - |
| `active` | Agen aktif dan berjalan | Bisa dijalankan otomatis (schedule/event) dan manual |
| `paused` | Agen dijeda sementara | Tidak bisa dijalankan otomatis, masih bisa dijalankan manual |
| `inactive` | Agen dinonaktifkan | Tidak bisa dijalankan sama sekali |

### Status Template (`AIAgentTemplate.status`)

| Nilai | Deskripsi |
| - | - |
| `active` | Template tersedia dan bisa digunakan |
| `coming_soon` | Template akan datang, belum bisa digunakan |
| `inactive` | Template dinonaktifkan |

### Status Eksekusi (`AIAgentRun.status`)

| Nilai | Deskripsi | Tampilan |
| - | - | - |
| `success` | Eksekusi berhasil selesai | Badge hijau |
| `failed` | Eksekusi gagal (error/timeout) | Badge merah |

### Metode Pembayaran (`AIAgentRun.payment_method`)

| Nilai | Deskripsi |
| - | - |
| `balance` | Dibayar dari saldo Rupiah perusahaan |
| `credit` | Dibayar dari kredit AI |
| `free` | Gratis (tidak ada pemotongan) |

### Jenis Trigger (`AIAgentSchedule.trigger_type`)

| Nilai | Kategori | Deskripsi |
| - | - | - |
| `schedule_daily` | Jadwal | Trigger setiap hari pada waktu tertentu |
| `schedule_weekly` | Jadwal | Trigger setiap minggu pada hari dan waktu tertentu |
| `schedule_monthly` | Jadwal | Trigger setiap bulan pada tanggal dan waktu tertentu |
| `event_low_stock` | Event | Trigger saat stok produk rendah |
| `event_invoice_overdue` | Event | Trigger saat ada faktur jatuh tempo |
| `event_new_transaction` | Event | Trigger saat ada transaksi baru |
| `event_task_due` | Event | Trigger saat ada tugas yang mendekati tenggat |
| `event_custom` | Event | Trigger event kustom yang dikonfigurasi sendiri |

### Channel Notifikasi (`AIAgentSchedule.notification_channel`)

| Nilai | Deskripsi |
| - | - |
| `in_app` | Notifikasi di dalam aplikasi |
| `whatsapp` | Notifikasi via WhatsApp |
| `email` | Notifikasi via email |
| `all` | Semua channel notifikasi |

### Tier Model (`AIAgentModel.tier`)

| Nilai | Deskripsi | Karakteristik |
| - | - | - |
| `standard` | Model standar | Cepat dan hemat, cocok untuk tugas sederhana |
| `advanced` | Model lanjutan | Keseimbangan antara kualitas dan kecepatan |
| `premium` | Model premium | Kualitas tertinggi, cocok untuk tugas kompleks |

## Tabel RBAC — Hak Akses Agent Dashboard

| Role | Lihat Dashboard | Lihat Semua Agen | Jalankan Agen | Kelola Jadwal | Kelola Pengaturan | Hapus Agen |
| - | :-: | :-: | :-: | :-: | :-: | :-: |
| **Super Admin** | Ya | Ya | Ya | Ya | Ya | Ya |
| **Admin Perusahaan** | Ya | Ya (perusahaan) | Ya | Ya | Ya | Ya |
| **Manajer** | Ya | Ya (perusahaan) | Ya | Ya | Tidak | Tidak |
| **Staff** | Ya | Ya (perusahaan) | Ya | Tidak | Tidak | Tidak |
| **Viewer** | Ya | Ya (perusahaan) | Tidak | Tidak | Tidak | Tidak |

### Catatan RBAC

* **Super Admin**: Akses penuh ke semua agen di seluruh perusahaan
* **Admin Perusahaan**: Akses penuh dalam scope perusahaan yang dikelola
* **Manajer**: Bisa menjalankan agen dan mengelola jadwal, tetapi tidak bisa mengubah pengaturan global atau menghapus agen
* **Staff**: Hanya bisa menjalankan agen yang diizinkan, tidak bisa mengelola jadwal
* **Viewer**: Hanya bisa melihat dashboard dan data agen, tidak bisa menjalankan atau mengubah apapun
* Semua role tunduk pada Row-Level Security (RLS) berdasarkan `company_id`

***

**Related Documentation**:

* [AI Agent Detail](/docs/ai/ai-agent-detail)
* [AI Agent History](/docs/ai/ai-agent-history)
* [AI Agents](/docs/ai/agents)
* [AI Overview](/docs/ai/overview)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.