Features

AI chat

AI chat is the product surface for AppAssistant: a dedicated /ai page, a global FAB drawer, streaming replies, conversation pin/truncate/bulk delete, and short-lived file attachments. The whole /ai/* authenticated group requires can-use-ai.

Related

Agent & tool model: AI assistant model. Imports, sync, webhook: AI imports & sync. Env/provider keys: AI configuration. HTTP: AI API & webhooks.

Access

ItemDetail
Permissioncan-use-ai (PermissionEnum::CanUseAi)
Routesroutes/ai.php — middleware auth, verified, permission:can-use-ai
Page controllerApp\Http\Controllers\Ai\AiPageController
Frontend pageresources/js/pages/ai/index.tsx
FABresources/js/components/ai/ai-fab.tsx in app-sidebar-layout

AI page

RouteNameBehavior
GET /aiai.indexConversation list (25, pinned first) + optional selection
GET /ai/{conversation}ai.showSame page with selected conversation (UUID)
GET /ai/statusai.statusAiStatusController — cached local provider /models probe

Props include normalized messages (content, tools, attachments). Empty assistant tool turns get AiToolTurnSummary.

FAB

  • Exported as AiFab, mounted in the app sidebar layout.
  • Shown only when the user has can-use-ai.
  • Hidden on /ai routes.
  • Drawer: status, presets, attachments, SSE chat via streamAiChatPOST /ai/chat.

Ask AI

List pages (users, groups, files, collections, items, activity logs) expose Ask AI via AskAiButton (resources/js/components/ai/ask-ai-button.tsx):

BehaviorDetail
PermissionShown only when can-use-ai
Modesicon (row) or labeled (bulk toolbar)
ActionOpens the FAB composer with a seeded prompt (openAiWithPrompt in resources/js/lib/ai-open.ts)
SendNever auto-sends — the user reviews/edits and submits

Bulk selection can seed multi-entity prompts (see tests/Browser/AiContextBulkBrowserTest.php).

Conversations

Controller: App\Http\Controllers\Ai\AiConversationController.

Models use laravel/ai conversation tables (agent_conversations / agent_conversation_messages via config/ai.php).

ActionRouteBehavior
IndexGET /ai/conversationsList owned conversations
StorePOST /ai/conversationsCreate
ShowGET /ai/conversations/{conversation}Detail
DestroyDELETE /ai/conversations/{conversation}Delete one
PinPOST /ai/conversations/{conversation}/pinToggle pinned_at null ↔ now()
TruncatePOST /ai/conversations/{conversation}/truncateBody from_message_id (UUID); deletes that message and all later
Bulk destroyPOST /ai/conversations/bulk-destroyBody ids (1–100 UUIDs); must be owned; deletes messages + conversations

Chat streaming

ItemDetail
ControllerApp\Http\Controllers\Ai\AiChatController (invokable)
RoutePOST /ai/chat (ai.chat)
Throttlethrottle:30,1 (30 requests / minute)
AgentApp\Ai\Agents\AppAssistant
ResponseSSE text/event-stream, ends with [DONE]

Validated body:

FieldRules
messageRequired, max 20000
conversation_idOptional UUID
attachment_idsOptional, max 5 UUIDs

Optional daily cap: config('ai.daily_prompt_limit')AI_DAILY_PROMPT_LIMIT (0 = off), counted from Spatie activity log_name=ai, event=ai_prompt.

Events may include { type: 'conversation', conversation_id } and { type: 'error', … }. Logging goes through App\Ai\Support\AiActivityLogger.

Attachments

ItemDetail
ControllerApp\Http\Controllers\Ai\AiChatAttachmentController
RoutePOST /ai/attachments (ai.attachments.store)
Throttlethrottle:30,1
ModelApp\Models\AiChatAttachment

Allowed extensions: csv, txt, xlsx, pdf (MIME allowlist matches those families).

LimitValue
Max sizeMAX_BYTES = 5 * 1024 * 1024 (5 MiB)
TTLTTL_HOURS = 24
Disklocal

Cleanup: scheduled ai:cleanup-attachments daily (routes/console.php).

Presets

Presets are static frontend prompt templates, not backend entities.

ItemDetail
Definitionresources/js/lib/ai-action-presets.ts
TypesAiActionPreset, categories comuni | dati | file | admin | avanzate
ListAI_ACTION_PRESETS (~25 templates: CSV/Excel/URL import, dry-run, upsert, export, PDF→schema, files, roles/users/groups, audit, async import, scheduled sync, rollback, …)
FilterfilterAiActionPresets() — show when anyOf is empty or the user has any listed permission
UIresources/js/components/ai/ai-action-presets-drawer.tsx

Related suggested-action chips (tool results): resources/js/lib/ai-suggested-actions.ts.

Client helpers

HelperPath
Stream / chat APIresources/js/lib/ai-chat.ts
Componentsresources/js/components/ai/*

Source map

ConcernLocation
Pageapp/Http/Controllers/Ai/AiPageController.php
Chatapp/Http/Controllers/Ai/AiChatController.php
Conversationsapp/Http/Controllers/Ai/AiConversationController.php
Attachmentsapp/Http/Controllers/Ai/AiChatAttachmentController.php
Routesroutes/ai.php
UIresources/js/pages/ai/index.tsx, components/ai/ai-fab.tsx, ask-ai-button.tsx, lib/ai-open.ts
Previous
File manager