The Liyagent app for employees
Where the people in your organisation use their agents every day, at /workspace, on desktop and phone, installable as an app, with everything that needs them in one place.
- Know who lands in the app and who lands on the console
- Install the app on a computer or a phone
- Act on what your agents need from you in Needs you
- Turn on notifications, and set them up on the server
The Liyagent app is for the people in your organisation who use agents rather than run them. It is the workspace at /workspace: it lists the agents a person may talk to, keeps their chats, shows everything their agents are waiting on them for, and has nothing of the admin console in it. It works in any modern browser, and installs as an app on a computer or a phone.
It is not the native Liyagent mobile app, which signs in the same way and has its own notifications (Identity and roles).
Who lands where
After signing in, with a password or with single sign-on:
| The person holds | They land on |
|---|---|
Only the Viewer or Analyst role's permissions: the read permissions, agents.run, agents.chat and their own connections | The app, /workspace |
| Any other permission, for example an Operator, Administrator or Owner role | The admin console, / |
Someone who has a console permission can still open /workspace. Their header then shows an Admin console link back. A person without one sees no such link, and / takes them to the app.
The four places
On a wide screen the places are tabs in the header. On a phone they are a bar at the bottom of the screen.
| Place | What it shows |
|---|---|
| Home | A greeting, how many things need you, your agents with prompts to start from, and your recent chats |
| Agents | The agents you may talk to and the chat. On a phone, the list first; picking an agent opens its chat, and the arrow goes back to the list |
| Needs you | Everything your agents are waiting on you for, newest first. The tab shows how many |
| Chats | Your recent chats with every agent. Opening one picks the conversation up where it was left |
The address says where you are (/workspace?view=needs, ?view=chats, ?agent=<key>), so a link or the browser's back button takes you there.
Chatting with an agent
- Your agents: each agent you may chat with, with its picture, its name and one line on what it does. A search box narrows the list. Pipeline and oversight agents, which work on tickets rather than with people, are not listed.
- Past chats: your own chats with the selected agent, newest first. The × beside a chat deletes it, with its files, after a confirmation.
- The chat: Enter sends, Shift+Enter adds a line. Answers are shown with their formatting, tables and charts. Under each answer, Helpful and Not helpful send feedback, and Not helpful asks what was wrong.
- Attachments: the clip button, or dropping files on the chat, adds up to 5 files a message. Images up to 5 MB, documents up to 10 MB.
- Voice input: where the browser can turn speech into text, a microphone button sits beside the clip. While it listens, the button turns red and a line under the message box says Listening. What you said appears in the message box for you to read and send as if you had typed it. Liyagent receives only the text you send, never audio. Some browsers use their maker's speech service to turn speech into text; where the browser cannot, there is no button.
- Waiting runs and SAP changes you are asked about in a chat are shown as cards under it, and also in Needs you.
The AI notice
Before a person's first message, the app tells them that Liya is an AI assistant and not a person, that its answers can be wrong, and that it acts only with their own permissions. The message box opens once they choose I understand. A short reminder stays under the message box. This is the information Article 50 of the EU AI Act asks for when people interact with an AI system.
Needs you
Needs you lists everything waiting on you across your agents, newest first, with the agent that asked and what it wants. Each is settled where it is shown:
| What waits | Shown to | What you do |
|---|---|---|
| Approval: an action an agent was held on | People who may decide it now: agents.read and agents.approve, an access policy that lets them approve that agent, in the tenant they work in | Open What will be sent to read the action's arguments, then Approve or Reject (with an optional reason) |
| Answer: a run of yours waiting for something only you can give | The person who started the run | Fill in what it asks and choose Send answer (or Accept / Decline for a form a connected system sent) |
| Connection: a run of yours waiting for you to connect an account | The person who started the run | Connect, then I have connected |
| SAP · Confirm: an SAP change an agent proposed to you | The person it was proposed to | Confirm or Cancel |
An approval is left out while its agent's owners still have it to themselves, unless you are one of them, and, with four eyes on (TICKETIQ_APPROVAL_FOUR_EYES=true), when the agent asked for it on your own behalf. A run waiting for an approval is not yours to settle: it waits on an approver, and goes on by itself once the approval is decided.
Each action uses the same route, permission checks and audit as the console: approving here is the same agent.approval.approve row as approving in the Inbox. The list refreshes every 30 seconds while the app is open, and when you come back to it.
On an installed app, the number of things waiting also shows on the app's icon, where the operating system supports it.
Install the app
| On | How |
|---|---|
| Chrome or Edge on a computer, Chrome on Android | Home offers Install the Liyagent app. Choose Install, or use the browser's own Install app menu item. × hides the offer on that browser |
| Safari on an iPhone or iPad | Home says how: tap Share, then Add to Home Screen |
| Other browsers | Use the browser's Add to Home Screen or Install menu item, where it has one |
The installed app opens at /workspace in a window of its own, with the Liyagent icon. Settings (the gear in the header) says whether you are using the installed app.
The app starts fast because its stylesheets, scripts and icons are kept on the device by a service worker. Only those are kept: never a chat, an answer from an agent, an API response or anything that differs from one person to another. Pages are always fetched from the server first. With no network, the app shows a short You are offline screen with Try again, and nothing you type is sent until you are back online.
Notifications
With notifications on, the app tells you when an agent needs you, even when it is closed:
- Liya needs your approval: an approval you may decide was raised, or its owners did not respond in time and it is now open to you.
- Liya needs your answer or Liya needs a connection: one of your runs started waiting for you.
A notification names the agent and nothing else, for example "Helper is waiting for your approval." It never contains what the agent wants to do, its arguments, a ticket or your words, because notifications pass through Google, Mozilla, Microsoft or Apple and show on a lock screen. Opening it takes you to that item in Needs you. Notifications of one agent replace one another, and each expires with the thing it is about.
To turn them on, open Settings in the header and switch on Tell me when an agent needs me. Your browser asks for permission. Send a test notification checks it end to end. On an iPhone or iPad, install the app on the Home Screen first; Safari sends notifications only to installed apps.
- Notifications are per browser. Turn them on in each browser or phone you want them on.
- Signing out turns them off in that browser. They also stop when your session ends; the app turns them back on under your next session when you open it.
- If your browser blocks notifications for the site, allow them in the browser's site settings, then switch them on again.
- If your organisation has not set notifications up, Settings says so and has no switch.
Set up notifications on the server
Notifications use Web Push with VAPID keys. They are off until both keys are set:
- Generate a key pair on any machine with the app installed:
python -m ticketiq.webpush generate-keys. It prints the two settings. - Set
TICKETIQ_WEBPUSH_VAPID_PUBLIC_KEYandTICKETIQ_WEBPUSH_VAPID_PRIVATE_KEYin the deployment's environment. The private key can instead be a secret reference (secret://label) to a value in the secret store. Never commit either key. - Set
TICKETIQ_WEBPUSH_SUBJECTto a contact the push services can use,mailto:orhttps:. Without it, the instance's public address is used. - Let the server reach the browsers' push services (outbound HTTPS):
fcm.googleapis.com,updates.push.services.mozilla.com,*.notify.windows.comandweb.push.apple.com.TICKETIQ_WEBPUSH_ENDPOINT_HOSTSlists the push services a browser's subscription may name, and anything else is refused. - Restart. Settings in the app now shows the switch.
Changing the keys makes every existing subscription unusable: each browser is subscribed again under the new key the next time its person opens the app. Removing them turns notifications off and forgets every subscription.
Subscribing, unsubscribing and sending a test are audited as auth.webpush.subscribe, auth.webpush.unsubscribe and auth.webpush.test. Each send is agent.approval.web_push or agent.run.web_push, naming the people and how many browsers were told, never the content. A send a push service refuses is agent.web_push.failed.
Giving someone access
- Give the person a role that holds
agents.chat. The built-in Viewer and Analyst roles do. See Identity and roles. - Make sure no access policy forbids them to
invokethe agent. An agent a policy forbids them is not listed. See Access. - To decide approvals in Needs you, they also need
agents.readandagents.approve.
What is kept
A chat in the app is the same governed run as the agent's Playground: the same model binding, guardrails, budget and audit. Each chat is kept as a session of the agent, owned by the person, so they can reopen it. A person sees only their own chats. Administrators with the transcript content permission can review them on the agent's Transcripts tab.
A browser with notifications on is kept as its push service address and the keys the notification is encrypted to, with whose it is and the session it was turned on under. It is forgotten when the person turns notifications off or signs out, when the push service says it is gone, when the session ends, and when the account is deleted.
API
The app uses these routes. Chatting needs agents.chat or agents.operate:
| Route | What it does |
|---|---|
GET /api/agents/chat | The agents the caller may chat with |
GET /api/agents/{key}/chats | The caller's own chats with an agent |
GET /api/agents/{key}/chats/{session_id} | One of the caller's own chats, with its messages |
POST /api/agents/{key}/playground | Sends a message |
These are open to anyone signed in, and each answers only for the caller:
| Route | What it does |
|---|---|
GET /api/me/landing | Where the caller lands, and whether the admin console is theirs |
GET /api/me/needs | Everything waiting on the caller, newest first. Each kind is read only for a caller who holds the permission of the action that settles it |
GET /api/me/push | Whether the server sends notifications, its public key, and the caller's own subscribed browsers |
POST /api/me/push/subscriptions | Turns notifications on for a browser: its PushSubscription (endpoint, keys.p256dh, keys.auth) |
DELETE /api/me/push/subscriptions/{id} | Turns them off for one of the caller's browsers |
POST /api/me/push/test | Sends the caller's own browsers a test notification |
Approvals, waiting runs and SAP changes are settled with their own routes: POST /api/approvals/{id}/approve and /reject, POST /api/runs/{run_id}/resume, and POST /api/agents/{key}/playground/sap-confirmations/{id}.