Article
CommunityJev Guides & Articles
Exploring Jev for AI-Driven Mobile QA
Give Jev a screen snapshot and a task, and it chooses the next action for agent-driven mobile QA. Ships as a CLI you can point at a real app.
- Format
- Article
- Reading time
- 3 min
- Published by
- Community
- Author
- Callstack
- Last verified
- Sep 2026
Works forJev for Classification
Used inJev for Software & DevTools
Highlights
- agent-device reads accessibility snapshots like '@e2 [text]' and '@e4 [button]', turning each control into a described action for Jev.
- State is { task, screen, previousScreen, previousAction }; Jev answers a Choice over action descriptions and the runner presses the ref.
- Jev can also choose pass, fail, or incomplete to end the run, judging from the current and previous screens and the previous action.
- The recorded demo run took 14 seconds and cost $0.0023 in model inference.
- Ships as a CLI (npm run qa -- --app ... --platform ios) and Jev reads text only, not screenshots or video.
Quickstart
ts
import { TypeSafeClient, choice } from '@typesafe-ai/sdk';
const jev = new TypeSafeClient();
const options = Object.fromEntries(
actions.map(action => [action.id, action.description])
);
const { answers } = await jev.systemOne({
model: 'jev-latest',
state: { task: prompt, screen: snapshot, previousScreen, previousAction },
questions: {
nextAction: choice('Choose the next action for the task.', options),
},
});
const actionId = answers.nextAction.choice;Watch out
Jev does not read screenshots or video, so the approach depends on the app exposing usable accessibility information and the runner must execute each chosen action itself.
Questions about this entry
Short answers drawn from the linked project or page.
Text and structured data only; it does not read screenshots or video, so the whole approach depends on the app exposing usable accessibility information. agent-device reads that accessibility listing with references such as @e4 [button] "Add to cart", which is what turns each control into an action.
It chooses from actions you build from the current listing: buttons and switches become press actions, editable fields become fill actions, and controls known to be hidden, disabled or blocked are left out. Jev generates no strings, so for a fill action the text is already in the action description and the runner types it into the referenced field.
One recorded run took 14 seconds and cost $0.0023 in model inference. That is a single demo figure, not a benchmark, and the headline 193.6x faster and 444.6x cheaper numbers it quotes are TypeSafe's own workflow evaluations against the LLM configurations they tested.
It can end the run. Alongside UI actions, Jev can choose pass, fail or incomplete, judging from the current screen, the previous screen and the previous action. State is task, screen, previous screen and previous action, and the runner executes whatever gets chosen.
agent-device renders the listing as referenced elements, for example @e2 [text] "Canvas backpack", @e3 [text] "Cart: 0 items", @e4 [button] "Add to cart" and @e7 [button] "View cart". The sample turns each snapshot into action records: a button becomes { id: a10, kind: press, ref: @e4, target: Add to cart, description: Press button "Add to cart" at @e4 }, and an editable field becomes a fill record carrying the text in both the action and its description. Controls known to be hidden, disabled or blocked are left out.
The runner does. agent-device supplies the app state and carries out whatever gets chosen; Jev only picks. TypeSafe evaluates the questions in parallel and returns structured values with probabilities for the available choices, and Jev does not generate a written explanation or a sequence of tool calls. The surrounding application supplies the actions and controls the loop, so if Jev chooses Add to cart, the runner presses @e4 and nothing else is decided by the model.
It ships as a CLI and is invoked through the package script: npm run qa -- --app ... --platform ios. The demo run recorded in the post took 14 seconds and cost $0.0023 in model inference. The whole approach depends on the app exposing usable accessibility information, since Jev accepts text and structured data and reads neither screenshots nor video.
Reactions & coverage
Posts, threads, and videos about this entry from around the web.
X: Website to App turns any URL into a native app
X: End-to-end tests run by agents
From the Jev guides
Original write-ups on what this entry is for.
From the Jev AI model community
Posts from builders shipping with Jev right now.