OneTwoApps App Ratings & ReviewsAI analysis

Optional · AI analysis, AI questions, AI crash analysis · step by step

The numbers show that something is wrong. The AI tells you what.

This page explains everything about the AI in the script: why it pays off, what speaks against it, how to create an account with a provider, what goes into the configuration, how to test, how to run the full analysis and open the report. Plus the features, the flow, which data leaves your computer and which models you can use. The AI works in three tools, each with its own model: analysis of reviews and figures, AI questions in the report and, new, the AI crash analysis for crashes from Apple and Android. Everything is set up in the browser-based setup.

5providers to choose from
1provider active, your key
0names, addresses, credentials
offuntil you switch it on

Why AI?

Nobody reads hundreds of reviews every morning.

The report counts stars, crashes and downloads. It tells you that an app is slipping. What really bothers users is in the text, and a language model reads that in seconds, for you, with evidence.

1From text to statement

“Since the update the login hangs” appears in twelve reviews with three different wordings. The AI condenses that into one sentence, with quotes that appear verbatim in the reviews.

2The mood behind the stars

Three stars can mean “quite okay” or “I’m switching next week”. The AI distinguishes enthusiastic, satisfied, wish, annoyed and resigned, and counts how many threaten to leave.

3What to do next

At most five actions per app, with responsibility (development, support, provider, store, product), expected effect and the share of negative reviews they concern. The share is calculated by the program, not by the AI.

Pros and cons

What you gain, and what you accept in return.

The AI is deliberately optional. Without an enabled provider everything runs exactly as before, without a single request.

For
  • Time. The summary per app, the actions and the wishes are in the report in the morning, without anyone reading the reviews.
  • Early warning. Annoyed users with three stars stand out before they turn into one star.
  • Evidence instead of gut feeling. Every quote is checked against the original text; if it does not match verbatim, it is dropped.
  • Asking instead of searching. “Which apps mention the bonus programme?” Answer with quotes, referring to exactly the filters set at the top of the report.
  • Cheap. Only new or changed reviews are sent. 90 reviews cost a few cents with the default model.
  • Your provider, your contract. You choose one of five providers and pay there directly. Or you choose none and run a local model (Ollama, LM Studio and others) on your own computer. The script itself has no server.
Against
  • Data leaves the computer. Title, text, stars, date, version, language, country and app name go to a provider in the USA. Check its API terms first (no use for training).
  • It costs, per request. A monthly token limit is a hard brake, but the invoice comes from the provider.
  • Suggestions, not measurements. Sentiment, assessment and actions are statements of a language model. That is why they carry the “KI” mark and name provider, model and date.
  • One more account. You need an API account with credit and a key as an environment variable.
  • Questions only locally. The input field in the report exists only while the small question service runs on your computer. A report on the company server shows saved answers only.
  • No substitute for reading. With few reviews per app, looking at the texts is faster and more accurate than any summary.

With "sendReviewText": false only stars, date, version, language and country go to the provider. Sentiment, quotes and reply drafts are then dropped, the rest stays.

Step 1 · Account with the provider

One API account, one key. With one of five. Or none at all, locally with Ollama or LM Studio.

All five cloud providers work the same way: create an account, add a payment method or credit, generate an API key and copy it once. The key is shown only once. A normal chat subscription is not enough, it must be API access. The sixth card needs none of that: Ollama runs on your computer, without an account and without a key (setup below).

OpenAIname: openai
  1. Account at platform.openai.com
  2. Add credit (prepaid)
  3. “API keys” → create new key
  4. Copy the key, close the window
Environment variableOPENAI_API_KEY
Anthropic Claudename: anthropic
  1. Account at console.anthropic.com
  2. Add credit
  3. “API Keys” → “Create Key”
  4. Copy the key, close the window
Environment variableANTHROPIC_API_KEY
Google Gemininame: gemini
  1. Google account, then aistudio.google.com
  2. “Get API key” → create key
  3. Enable billing in Google Cloud
  4. Copy the key
Environment variableGEMINI_API_KEY
Perplexityname: perplexity
  1. Account at perplexity.ai
  2. Settings → “API” → credit
  3. Create key
  4. Copy the key
Environment variablePERPLEXITY_API_KEY
xAI Grokname: xai
  1. Account at console.x.ai
  2. Add a payment method
  3. “API Keys” → create key
  4. Copy the key
Environment variableXAI_API_KEY
Local modelname: local
  1. For example, install Ollama from ollama.com
  2. ollama pull llama3.1:8b
  3. No account, no key, no cost
  4. Setup: Local instead of cloud
Environment variablenone

Read before switching on: the provider’s API terms of use, especially whether inputs may be used for training. For the API access of the five providers this is usually excluded, unlike the free chat interfaces. The report’s privacy policy (section 4a) names recipients, fields and legal basis. The key never goes into a file of the script, only into the environment variable (next step).

Step 2 · Enter it in the configuration

One block in config.json, one line in the shell.

The ai block is ready in config/config.example.json. You copy it, set enabled to true for one provider and store the key as an environment variable. That is all. With local there is no key at all; the matching settings are in the section Local instead of cloud.

1

Copy the block

Insert the ai block from the example file into config/config.json and set "enabled": true for the provider you want. If several are enabled, the first in the list counts. You can keep the model (default) or change it.

"ai": {
  "providers": [
    { "name": "anthropic",
      "enabled": true,
      "model": "claude-sonnet-5-5",
      "apiKeyEnvironmentVariable":
        "ANTHROPIC_API_KEY" },
    { "name": "openai", "enabled": false, … }
  ],
  "language": "en",
  "monthlyTokenLimit": 2000000,
  "sendReviewText": true,
  "features": { "summary": true, "sentiment": true,
    "themes": true, "versions": true,
    "comparison": true, "replyDrafts": true,
    "measures": true, "questions": false }
}
2

Key as environment variable

The script reads the variable’s name from apiKeyEnvironmentVariable. Put the key into your shell configuration, on the Mac usually ~/.zshrc, then open a new terminal. For the daily run via scheduler the variable goes into its environment (see BETRIEB.md).

# ~/.zshrc
export ANTHROPIC_API_KEY="sk-ant-…"

# check without showing the value
test -n "$ANTHROPIC_API_KEY" && echo set

If the key accidentally ends up in config.json, the script rejects it. In logs, error messages and the report it is removed automatically.

3

The most important switches

All in the ai block, all optional:

language        de or en: language of the AI texts
model           per provider, see models below
monthlyTokenLimit  hard brake per month
sendReviewText  false: numbers only, no texts
features.*      switch off single features
questions       free-text questions, off by default
maxReviewsPerRequest 60 per batch
requestTimeoutSeconds 180
servicePort     8765 for the question service

Free-text questions are off by default because every question costs a request. For the “AI questions” tab in the report set "questions": true.

Step 3 · Testing

First check what would be sent. Then send.

Three commands, from harmless to real. The first two cost nothing and send nothing.

1

Is the provider active?

Shows the active provider with model, the month’s usage and the estimated cost. No network access. If it says “no provider active”, enabled or the environment variable is missing.

./ratings.sh ai-usage
2

Dry run at no cost

Shows per app how many reviews would be sent and in how many batches. Nothing goes out. So you see before the first real run what it covers.

./ratings.sh analyze --dry-run
3

Practise with test data

Debug mode creates invented apps and reviews in separate folders. The menu asks whether the AI should analyse the test data. That sends invented texts but costs real requests. Ideal for the first run without touching real data.

./debugmenu.sh
1  create test data
3  report in the browser

Step 4 · The full analysis

One command. Or none, because it runs with the fetch.

As soon as a provider is active, the AI runs automatically with ./ratings.sh all and in the menu “Fetch everything”. Menu line and header show it. To start it on its own:

1

Analyse

Reads the stored reviews, sends only new or changed ones, writes the results as ai-analysis.json per app into data/ and rebuilds the report. At the end there is the cost table per app.

./ratings.sh analyze
2

Check topic suggestions

The AI suggests new topics and missing search words for known topics. The tool counts how many more reviews a word would match. Both go into config/themen.json only when you confirm them.

./ratings.sh ai-themes
./ratings.sh ai-themes --accept 2
./ratings.sh ai-themes --accept-term 1 3
3

Questions from the command line

A question to the stored reviews, narrowed by app, period and stars. Needs "questions": true. Saved questions are listed by ai-questions.

./ratings.sh ask "Which apps mention
  the bonus programme?" --app bkk-herkulis
./ratings.sh ai-questions
./ratings.sh analyzeanalysis, rebuild report
./ratings.sh analyze --dry-runshow, send nothing
./ratings.sh ai-usageprovider, tokens, cost
./ratings.sh ai-modelsmodels and prices
./ratings.sh ai-themestopic suggestions
./ratings.sh ask "…"free-text question
./ratings.sh ai-questionssaved questions
./ratings.sh ai-reportreport with question service
./ratings.sh ai-servequestion service alone

Step 5 · Open the report

Two ways to the report. Only one can ask questions.

The report is a single HTML file and makes no network requests. The only exception is one you start yourself: a small question service on your computer that passes questions from the report to the provider.

A

Report as always

Creates reports/index.html and opens it in the browser. All AI results are in it: summaries, actions, sentiment, wishes, saved answers. Only the input field for new questions is missing.

./ratings.sh report
Menu: main menu 3 · short menu 2
B

Report with question service

Starts the service on 127.0.0.1, creates the report and opens it in one step. The “AI questions” tab gets an input field and the button “Choose a question …” with twenty prepared questions. Runs until you press Ctrl+C.

You change the standard questions yourself: they are in config/fragen.json, each question once in German (de) and English (en). Change, add or delete, done; the next report shows the new list. The file contains no secrets and may be versioned.

./ratings.sh ai-report
Menu: main menu 4 · short menu 3
!

What the service may do

Only your computer, only while the terminal is open, only a report created during the run. A random token per start, 4 KB per request, one question at a time, the same monthly limit as always. The report on the company server has no service and shows saved answers only.

data/ai-service.json  token, 0600,
                     deleted on exit

Which features

Two own tabs. Everything else sits where the question is.

Eleven features, each with its place in the report and the switch in ai.features. Everything except the crash analysis follows the filter: customer, app, platform, period.

Summary per appOverview · traffic light

Three sentences: praise, criticism, what changed recently. Plus main praise, main criticism, assessment (product, update or provider problem) and verbatim quotes. features.summary

What we should doOverview · monthly report

At most five actions per app with responsibility, expected effect and the share of negative reviews they concern. features.measures

Sentiment per reviewReviews

Enthusiastic, satisfied, wish, annoyed, resigned, plus urgency. The sentiment strip above the table sets the filter. features.sentiment

Topics according to the AITopics and words

Freely assigned keywords per review with count and negative share, plus suggestions for config/themen.json that are adopted only after confirmation. features.themes

Most requested featuresTopics and words

The wishes from the reviews counted, with a trend against the 90 days before. features.sentiment

Effect check per updateWhat an update changed

Which complaints are new since a release and which have disappeared; which occur only in the latest version. features.versions

Apps comparedDownloads and store

Per customer or across all: share of annoyed users, main praise, main criticism, assessment as columns. features.comparison

ChurnKey figures per app

Share of reviews in which users threaten to switch or delete, per app. features.sentiment

Reply draftsSupport replies

For open one- and two-star reviews a suggestion to copy. Nothing is ever sent. features.replyDrafts

Questions to the dataAI questions tab

Free-text questions to the filtered reviews, answer with confidence and quotes. Twenty prepared questions from config/fragen.json, freely editable there. The tab appears only while the question service runs. features.questions

AI crash analysisAI crash reports tab

Create requests from Apple or Android crash reports, submit one or several at once. Result: cause with confidence and verbatim evidence, location in the code, technical fix, steps to verify, as a ticket for Jira or mail. Known crashes are recognised and not sent again. More below and on its own page. features.crashReports

Every AI statement carries the “KI” mark and names provider, model and date. All numbers in the report, including shares and counts next to AI texts, are calculated by the program from the data. The AI never delivers a number.

New · AI crash analysis · Apple and Android

A crash report in, a ticket with cause and fix out. With evidence or not at all.

On the “AI crash reports” tab you create requests from crashes: platform, title and report are required; a note (iOS version, feature, architecture), the app and the project folder are optional. The AI is meant to find the bug, not to guess. That is why the tool computes all facts itself, and every statement of the AI must appear verbatim in the material. All the details, with privacy, settings and the prompts verbatim: AI crash analysis.

1 · EnterCreate a request

Paste the report from Xcode, App Store Connect or the Play Console. It is stored locally in data/crash-reports.json. Up to here nothing leaves the computer.

2 · Read without AIFacts and error number

The parser reads exception type, signal, versions, the top frames and which of them belong to the app, detects missing symbolication and obfuscation, and builds the fingerprint: the crash’s error number.

3 · CompareKnown already?

If the error number is in data/crash-history.json, the request becomes a duplicate, takes over the old analysis and is never sent again.

4 · PreviewSee first, then send

“Analyse” first shows exactly the text that leaves, what was replaced, which source files go along and the estimated tokens. Only the confirmation sends.

5 · AnalysisEvidence only

Requests run one after another. Every AI quote is checked against report, note, code and reviews; invented ones are dropped, without evidence the confidence drops.

6 · Second opinionReview pass

A second call checks the analysis against the same material. It may strike statements and lower the confidence, never raise it. Can be switched off, costs about double.

7 · ResultTicket

Error number, environment, cause with confidence, evidence, location, fix, steps to verify, open questions and what could not be checked. To the clipboard, printed or as PDF.

This leaves the computer, after confirmation
  • the report, after user names in paths, app container IDs, device and incident identifiers (Incident Identifier, CrashReporter Key, serial number, IMEI, Android ID), e-mail, IP and MAC addresses, long identifiers and phone numbers have been replaced by placeholders
  • the note, redacted the same way, and the parser’s facts
  • only with a project folder in the request: the source files the stack trace names, cut to the lines around the crash
  • up to ten reviews of the assigned app with crash keywords, as context
Never
  • the folder path, device identifiers, user names
  • files outside the request’s project folder, files without a code suffix
  • a crash whose error number has already been analysed
  • anything without your confirmation in the preview
StatusColour stripe per row

open, analysed, Analysed/PD (personal data had to be replaced, which should not happen in a crash report), error, duplicate.

HonestWhere it does not help

With unsymbolicated Apple reports or obfuscated Android traces nobody can determine the cause seriously. The report says so beforehand instead of letting the AI guess.

LimitPatterns, not understanding

Redaction recognises patterns. A name somebody types freely into the note is not recognised. Hence the preview: read, then send.

Source codeCompany property

If you do not want code in the cloud, leave the folder list empty or use the local model for crash reports. Then everything stays on the computer.

Three tools, three models

Quality depends on the model. A cheap one is enough for reviews, take the best one for crashes.

Per provider you choose three models, in the setup in the browser (./ratings.sh admin, step AI). Nobody can change the model in the report; both tabs show which one applies. After saving, the setup reminds you to restart the question service.

1 · Analysis of reviews and figuresFetch, overview, reviews

Many reviews in batches, every day. A cheap, fast model is usually enough. providers[].model

2 · AI questionsAI questions tab

Single questions to the filtered reviews. A stronger model pays off, the volume is small. Empty means: same as the analysis. providers[].questionsModel

3 · AI crash analysisAI crash reports tab

Reading stack traces and code correctly is the hardest task. Choose the best available model here. Empty means: same as the analysis. providers[].crashModel

How it works

Five stations, one direction. Only text comes back, and it is checked.

This is how an analysis runs, from the stored data to the “KI” mark in the report.

1 · DATAdata/ on your computerReviews from Apple and Google,without names. Unchanged. 2 · SELECTIONOnly new ones, in batchesNew or changed reviews,60 per batch, character budget. 3 · REQUESTTo one provider, HTTPSKey only in the header. Numberinstead of ID. JSON back, 180 s. 4 · CHECKQuotes and values checkedWhat is not in the reviewis dropped. Texts shortened. 5 · REPORT“KI” markProvider, model,date. Numbersfrom the data.
a request on its waycheck before saving
FetchNothing changes

The daily fetch from Apple and Google runs as before. The AI only reads what is already stored.

MemoryEvery review once

What has been analysed stays in ai-analysis.json. An app’s summary is only rebuilt when new reviews arrive.

BudgetTwo brakes

A character budget per request so no model context bursts, and a token limit per month that stops hard.

Way backThe AI triggers nothing

Drafts are never sent, topic suggestions wait for your confirmation, data is never deleted or overwritten.

LogTraceable

Every run is in data/logs/collect.log, without keys. All prompts are in KI-PROMPTS.md verbatim.

Which data is used

One line per review. And for questions exactly what the filter shows.

This is what a review looks like when it leaves the computer. A running number instead of the store ID, no name, no metric.

[n=1, sterne=1, datum=2026-10-19, version=4.2, sprache=de, land=DE, antwort=nein] | titel: Login | text: Since the update the app hangs at login … Per request in addition: the app’s name and store, the answer language, the task. For free-text questions also app and store per line.
This leaves your computer, per review
  • Title and text (dropped with sendReviewText: false)
  • Stars and date (day only)
  • App version, language, country, if present
  • whether a developer reply exists (yes/no, never its text)
  • Name of the app and store
Never
  • User names, addresses, phone numbers, e-mail addresses. They are not stored in the first place.
  • Review IDs: the mapping runs via the running number
  • Credentials, keys, raw data from the stores
  • Store metrics, crash data, customer names
  • Data to the maker of this script: there is no server

And for questions: the filter decides the selection

Customerall or one→Appone or several→PlatformApple, Google→Period30 days, 90 days …→Stars, topic, searchadvanced filter→Sentimentaccording to the AI→Selectionlatest up to 300 reviews

A question in the report refers to exactly the reviews the filter at the top currently shows. The report hands the selection to the question service (apps, period, stars, the IDs of the filtered reviews and the filter chips as description). The service uses it to select the reviews locally; sent are the latest up to maxReviewsPerQuestion (300) within the character budget. The IDs and the description stay on the computer. With several apps selected, the answer refers to their overall state. The answer states how many reviews were read, how reliable it is (reliable, indication, unclear) and backs it with quotes; a question without a verbatim source counts as “unclear”.

Models and prices · as of 2026-10-24

A cheap model is enough for this task. An expensive one rarely does it better.

The AI sorts, summarises and quotes. The program checks every quote and every value. So what matters is not the strongest model but one that reliably delivers clean JSON and costs little. Prices in US dollars per million tokens, input and output, from ./ratings.sh ai-models.

OpenAIgpt-6-luna0.10 / 0.50 $
Google Geminigemini-3.8-flash0.75 / 3.75 $
Anthropicclaude-sonnet-5-52.00 / 10.00 $
Perplexityopenai/gpt-5.6-terra2.00 / 12.00 $
xAIgrok-4.72.00 / 6.00 $
Local (Ollama etc.)llama3.1:8b0 / 0 $

Bars: input price of the default model, relative to the most expensive. For scale: the full analysis of 90 reviews costs a few cents with gpt-6-luna; with a top model at 10 / 50 $ about a hundred times that, without the summaries getting noticeably better.

ProviderModelInputOutputClassFor this project
OpenAIgpt-6-luna0.10 $0.50 $cheap, default; reasoning modelRecommended to start. Cheapest model; the internal thinking tokens count as output but stay small for batches of 60 reviews.
OpenAIgpt-6.1-sol2.00 $10.00 $mid-rangeGood, but twenty times the price of Luna. Only if Luna is noticeably off with your reviews.
OpenAIgpt-6-astra10.00 $50.00 $top model, expensiveNot needed. Oversized for sorting and summarising.
OpenAIgpt-5.6-terra2.00 $12.00 $previous mid-rangePossible, but no reason: Luna is newer and cheaper.
OpenAIgpt-5.6-luna0.20 $1.20 $previous, cheapFine as a fallback if gpt-6-luna is ever unavailable.
Anthropicclaude-sonnet-5-52.00 $10.00 $mid-range, defaultGood middle. Reliable with JSON and German texts, clean quotes. Noticeably more expensive than the cheap models.
Anthropicclaude-haiku-5-50.10 $0.50 $cheap, fastRecommended to start. Same price as Luna, up to 100k tokens per request, which is plenty with the script’s character budget.
Anthropicclaude-opus-5-54.00 $20.00 $strong, pricierNot needed. An advantage only with very long, convoluted reviews.
Anthropicclaude-fable-5-110.00 $50.00 $top model, expensiveNot needed. A hundred times the price of Haiku for the same task.
Google Geminigemini-3.8-flash0.75 $3.75 $default; introductory price until 2026-12-31Good middle. Fast, large context. Re-check the price after 2026-12-31.
Google Geminigemini-3.5-flash-lite0.30 $2.50 $cheap, simplerFine for sentiment and topics; a bit thinner than Flash for summaries.
Google Geminigemini-3.1-pro2.00 $12.00 $strong, pricierNot needed for this task.
Perplexityopenai/gpt-5.6-terra2.00 $12.00 $default; OpenAI model via PerplexityPossible, no advantage: Perplexity passes the request on to OpenAI, its strength (web search) is not used. Only if you already have an account there.
Perplexityanthropic/claude-sonnet-5-52.00 $10.00 $Anthropic model via PerplexityAs above: the same model as directly at Anthropic, one more provider in between.
Perplexityperplexity/sonar0.25 $2.50 $own model, cheapCheap, but less proven for strict JSON. Check first with --dry-run and test data.
xAIgrok-4.72.00 $6.00 $only public API model, defaultFine, mid-range price. No cheap variant, so less attractive to start with.
Local (Ollama etc.)llama3.1:8b and others0 $0 $runs on your computerFree and without a recipient. Slower and weaker at summaries than the cloud models; model choice and setup in the section Local instead of cloud.

All current models per provider · as of 2026-10-24

The table above contains only the models for which the script knows a list price. Here are all models the five providers offer via their APIs according to current price overviews, in US dollars per million tokens (input / output). Every model of a provider works in the script; a “no” in the column “In the script” only means the list price is missing, which you enter yourself with priceInputPerMillion and priceOutputPerMillion. Sources are third-party price overviews, not the providers’ pages; check there before deciding.

ProviderModelInputOutputIn the scriptAssessment
OpenAIgpt-6-astra10.0050.00yesTop model. Not needed.
OpenAIgpt-6.1-sol2.0010.00yesMid-range. Good, but pricey for this task.
OpenAIgpt-6-sol2.0010.00noPredecessor of 6.1 Sol, same price. No reason.
OpenAIgpt-6-luna0.100.50yesCheapest model. Recommended to start.
OpenAIgpt-5.6-sol––noPrevious generation; price not consistent across overviews.
OpenAIgpt-5.6-terra2.0012.00yesPrevious mid-range. Luna is newer and cheaper.
OpenAIgpt-5.6-luna0.201.20yesFallback if 6 Luna is unavailable.
OpenAIgpt-5.5-pro, gpt-5.4––noOlder generation, partly only in overviews. Not needed.
Anthropicclaude-fable-5-110.0050.00yesTop model for long autonomous agents. Not needed.
Anthropicclaude-opus-5-54.0020.00yesStrong, pricier. An advantage only with very long reviews.
Anthropicclaude-sonnet-5-52.0010.00yesGood middle, reliable JSON. Script default.
Anthropicclaude-haiku-5-50.100.50yesUp to 100k tokens per request; above that 0.50 / 2.50. Recommended to start.
Anthropicclaude-opus-5, claude-sonnet-55.00 / 2.0025.00 / 10.00noPredecessors, still available. No reason over 5.5.
Google Geminigemini-3.8-flash0.753.75yesIntroductory price until 2026-12-31, then double according to overviews. Good middle.
Google Geminigemini-3.7-flash, gemini-3.6-flash0.753.75noSame price as 3.8 Flash; 3.8 is newer.
Google Geminigemini-3.5-flash1.509.00noPrice inconsistent across overviews. No reason over 3.8.
Google Geminigemini-3.5-flash-lite0.302.50yesFine for sentiment and topics.
Google Geminigemini-3-flash0.503.00noOlder, cheap. Possible.
Google Geminigemini-3.1-pro2.0012.00yesUp to 200k tokens; more above. Not needed.
Perplexityopenai/…, anthropic/…, google/…, xai/…wie Anbieterwie AnbieterpartlyAgent API passes to the model provider without markup. In the script: openai/gpt-5.6-terra, anthropic/claude-sonnet-5-5.
Perplexityperplexity/sonar1.001.00yes (0.25 / 2.50)Plus a fee per request (5 to 12 $ per 1,000). The script still lists the old price; enter it yourself. Web search is not used.
Perplexitysonar-pro, sonar-reasoning-pro, sonar-deep-research3.00 / 2.00 / 2.0015.00 / 8.00 / 8.00noMeant for web search and research, no use here. Chat Completions interface sunset since 2026-09-27.
xAIgrok-4.72.006.00yesCurrent model; up to 200k tokens, above 4 / 12. Fine.
xAIgrok-4.6, grok-4.52.006.00noPredecessors, same price. No reason.
xAIgrok-4.3, grok-4.201.252.50noCheaper; possible, enter the price yourself.
xAIgrok-build-0.11.002.00noCheapest xAI model, meant for code. Check with test data first.
xAIgrok-4, grok-4-fast, grok-4.1-fast, grok-3––noRetired on 2026-05-15 according to overviews.

In short: to start, gpt-6-luna or claude-haiku-5-5 (0.10 / 0.50 $ each). If you want more care in summaries, take claude-sonnet-5-5 or gemini-3.8-flash. Top models are not worth it here because the program checks the answer anyway and calculates the numbers itself. Other models of the same provider work too; then only the list price is missing, which you enter yourself with priceInputPerMillion and priceOutputPerMillion. The assessment is based on price lists and model class, not on a comparison test with your reviews. Prices without guarantee; the provider’s invoice is what counts.

Local instead of cloud · Ollama, LM Studio and others

No account, no key, no recipient. The model runs on your computer.

With the provider local (default Ollama, other servers via url) everything stays in house: the reviews only go to 127.0.0.1, your own computer. It costs nothing but time and memory. What you should know: a laptop needs minutes instead of seconds per batch, and small models follow the strict JSON and the rule “verbatim quotes only” less reliably than the cloud models. The checks in the program catch that; the summaries then come out shorter.

1

Install Ollama and pull a model

Mac and Windows via the installer from ollama.com, Linux with one line. Ollama then runs in the background. You pull a model once, about 5 GB.

# Linux
curl -fsSL https://ollama.com/install.sh | sh

# pull a model (once), check
ollama pull llama3.1:8b
ollama list
2

Enlarge the context window

Ollama starts models with a small window (4096 tokens). A batch of reviews does not fit; the beginning would be cut off silently. Set it once, restart Ollama.

# Mac
launchctl setenv OLLAMA_CONTEXT_LENGTH 16384

# Linux: in the systemd unit
Environment=OLLAMA_CONTEXT_LENGTH=16384

# Windows: system environment variable
3

Enable the provider, shrink the batches

No key, no environment variable. For local models smaller batches and more time per request; url only if the server runs on another port (LM Studio: 1234, llama.cpp: 8080); label is a free display name, for example “LM Studio”. The former name ollama still works.

"ai": {
  "providers": [
    { "name": "local",
      "enabled": true,
      "model": "llama3.1:8b" }
  ],
  "maxReviewsPerRequest": 15,
  "maxCharsPerRequest": 24000,
  "summaryReviews": 40,
  "requestTimeoutSeconds": 600
}
ModelRAMClassFor this project
llama3.1:8bfrom 8 GBdefaultRecommended to start. Reliable JSON, decent German, runs on any current Mac or laptop.
gemma3:12bfrom 12 GBbetter GermanGood choice with 16 GB. More careful summaries, a bit slower.
qwen3:14bfrom 16 GBstrong, slowStrongest summaries among the small models. Takes long; fine for the nightly daily run.
mistral-small3.2from 16 GBgood middleBalanced between speed and care.
llama3.2:3bfrom 4 GBsmall, fastEnough for sentiment and topics; shorter texts, quotes more often unusable. For old or weak machines.

In short: Mac with Apple Silicon and 16 GB: gemma3:12b. Everything else: llama3.1:8b. Every model your local server offers (with Ollama every model fetched by ollama pull) works; its name goes into "model". The assessment is based on model class and experience with strict JSON, not on a comparison test with your reviews; the code has not yet been run against a live Ollama or LM Studio installation. Only addresses on your own computer (127.0.0.1, localhost) or https are allowed: a local server elsewhere in the company network works only encrypted, because the reviews would otherwise travel the network in the clear. The report’s privacy policy (section 4a) names no recipient for the local provider, because there is none.