Freek Van der Herten published the account on 8 October 2026. Spatie has run its own customer support for two decades and is now building There There, a helpdesk shaped around that experience. The service is in private beta, with early access applications available at there-there.app.

agent-call.php
<?php
$agent = new ThereThereAgent(
    workspace: $workspace,
    user: $user,
    contextTicket: $agentChat->contextTicket,
    conversationHistory: $agentChat->getConversationHistoryExcludingLatest(),
);

There There uses AI to speed up support work. A human reviews the ticket, decides what should happen, and confirms the action. The model can retrieve relevant history, draft a reply, add tags, or close a duplicate ticket. The complete AI layer is built on the new Laravel AI SDK, whose repository is available at github.com/laravel/ai.

The integration starts with an agent class called `ThereThereAgent`. It defines the model, system instructions, available tools, and conversation history to replay. The class uses the `#[Temperature(0.3)]` and `#[MaxSteps(10)]` attributes. The `model()` method reads the model name from `config('ai-pricing.default.name')`. Its `instructions()` method renders a Blade view with the workspace, user, and optional context ticket. The `tools()` method returns an iterable, so the available tools can depend on context.

Tools are AI-facing adapters with typed JSON schemas. `ChangeTicketStatusTool` accepts a ticket subject, title, or ULID, the contact email, and a new status. Valid values are `open`, `closed`, and `spam`. The handler checks the value with `TicketStatus::tryFrom`, searches for the ticket with `findTicket`, and calls `ChangeTicketStatusAction` when a match exists. It sends an error string for an invalid status or missing ticket. A successful response contains `result: success`, the ticket display title, and the status label.

Business logic stays in the existing domain action. The tool only connects the model to that application code. An action creates `ThereThereAgent` with the workspace, user, context ticket, and conversation history excluding the latest message. `streamingService->stream()` then converts the SDK response into events for the frontend. Van der Herten finds the agent and tool abstractions easy to work with. Blade-backed prompts make the system prompt simple to edit, and typed schemas keep the model from mangling its arguments. He adds that the team has only scratched the surface of what the SDK can do.