Repository navigation
Optionaler KI-Tutor in Übungen: drei Hinweisstufen, Lösungsprüfung, Monatsdeckel (LRN-6) - #30
Open
hernstev97 wants to merge 2 commits into
Open
hernstev97 wants to merge 2 commits into
hernstev97 wants to merge 2 commits into
Conversation
…N-6) Optionaler Tutor unter den Hinweisen einer Übung. Ohne ANTHROPIC_API_KEY im Convex-Deployment, offline und im Offline-Lesemodus bleibt er unsichtbar. - convex/tutor.ts: Action mit requireOwner und offiziellem SDK, Budget- Reservierung des schlimmsten Falls vor jedem Aufruf, Verbuchung aus usage in tutorUsage (Mikro-Dollar je UTC-Monat), Status-Query für Panel und /daten - src/engine/tutor.ts: byte-stabile Prompt-Reihenfolge mit zwei Cache- Breakpoints, Lösungsprüfung mit den Normalisierern aus answers.ts, Preise und Konfiguration (TUTOR_MODEL, TUTOR_EFFORT, TUTOR_MONTHLY_BUDGET_USD) - KI-Regel für narrative (LRN-29) und combat; kein Tutor bei eigenen Texten - Tests nur gegen Fake-Provider: convex-test mit ersetztem fetch, Browser- Tests mit window.__tutorFake; kein echter API-Aufruf - Eval-Harness mit 30 Fällen (pnpm tutor:eval), Trockenlauf ohne Netz Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Panel bleibt während langer Tutor-Aufrufe sichtbar (Ausfallerkennung ignoriert sie) - Namen aus der Clerk-Sitzung werden vor dem Senden ersetzt - Lösungsprüfung: Optionsnummern, Zeilennummern bei Fehlersuche, Löschungen, Abdeckung über Codeblöcke, Aufgabentext und eigener Versuch gelten als bekannt - Budget: Monat vom Client, offene Reservierungen getrennt, alte Reservierungen verfallen nach 15 min, Zeitüberschreitung bucht die Reservierung, keine Retries - max_tokens 3000, SQL-Ergebnis als Rückmeldung, eigene Texte in Combat ohne Tutor Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bisher hilft eine Übung nur mit festen Hinweisen und „Lösung zeigen“. LRN-6 wünscht einen Tutor, der Lektion und Übung kennt, auf Klick gestufte Hilfe gibt und die Lösung nicht verrät. Dieser PR baut Schritt 2 aus dem Issue: Hinweisstufen 1–3, Lösungsprüfung, Monatsdeckel, kein gespeicherter Verlauf.
Ohne
ANTHROPIC_API_KEYim Convex-Deployment ändert sich nichts. Übungsseite und/datensehen aus wie vorher, und es geht keine Anfrage raus. Offline und im Offline-Lesemodus ist der Tutor ebenfalls ausgeblendet. Es gibt noch keinen Schlüssel: Alles ist nur gegen einen Fake-Provider getestet, ein echter API-Aufruf hat nie stattgefunden.Was der Tutor tut
src/engine/answers.tsund zählt nur den Teil, den du selbst schreiben musst. Bei einem Treffer fragt er einmal neu, beim zweiten zeigt die Seite den nächsten statischen Hinweis./daten.practicemitproseodertext) bekommen in beiden Kursen keinen Tutor, Übungen ohne Musterlösung nirgends.Screenshots mit dem Fake-Provider; die Antworten sind handgeschrieben, nicht von einem Modell:
Was du entscheiden musst
TUTOR_MODEL, Standardclaude-sonnet-5-5;TUTOR_EFFORT, Standardmedium): Das ist der Vorschlag aus LRN-6, bestätigt ist er nicht. Neu seit 07.10.2026 gibt es Claude Haiku 5.5 für 0,10 / 0,01 / 0,50 $ pro Million Tokens (Input / Cache-Read / Output). Das ist der Preis, den das Issue für GPT-6 Luna high nennt. Hält Haiku im Eval mit, entfällt Lunas einziger Vorteil. Haiku 5.5 ist alshaiku-mediumim Eval, Luna nicht (dafür bräuchte es einen OpenAI-Schlüssel und einen zweiten Provider).TUTOR_MONTHLY_BUDGET_USD, Standard 5): Bei angenommenen 500 Output-Tokens kostet die erste Frage zu einer Übung mit Sonnet etwa 2 ct, jede weitere zur selben Übung dank Cache etwa 0,6 ct. 5 $ reichen damit für etwa 200–400 Antworten. Wie viel das Denken dazugibt, zeigt erst der Eval. Mit dem API-Guthaben aus Claude Max (siehe Kommentar in LRN-6) könntest du höher gehen, ohne zu zahlen.pnpm exec convex env set ANTHROPIC_API_KEY …, erst in Entwicklung. Produktion habe ich nicht angefasst.TUTOR_PRIVATE_NAMES="Vorname,Nachname,E-Mail" pnpm tutor:eval --live --max-usd 2. Die Schätzung liegt bei etwa 1,40 $ für Sonnet low, Sonnet medium und Haiku medium. Bevor die nächste Anfrage das Limit überschreiten könnte, bricht er ab. Danach füllst du den Bewertungsbogentutor-eval/…/grading.mdaus.Was ich selbst entschieden habe
usage-Wert diese Buchung. So hält der Deckel auch, wenn zwei Tabs gleichzeitig fragen. Das SDK wiederholt nichts selbst (maxRetries: 0), weil ein zweiter Versuch doppelt kosten könnte. Eine Zeitüberschreitung (90 s) bleibt mit der Reservierung gebucht, liegengebliebene Reservierungen verfallen nach 15 Minuten. Als Monat zählt der UTC-Kalendermonat, wie bei den Console-Limits.max_tokenssteht auf 3.000 statt etwa 1.000, weil das Denken mitzählt.stop_reason: max_tokensgilt als Fehler, wie im Issue verlangt.python/nebenlaeufigkeithat als Text 40.852 Zeichen. Alle 2.273 Übungen des Inhalts passen in die Grenzen (Test intooling/tutor-eval.test.ts).refusal. Die Kosten eines anderen Modells ließen sich nicht sauber verbuchen. Eine Ablehnung zeigt eine Meldung, und die statischen Hinweise bleiben.claude-sonnet-5-5,claude-haiku-5-5; Preise von der Preisseite am 24.10.2026). Bei jedem anderen Wert bleibt der Tutor aus, und/datennennt den Grund. Issue (Stand 29.09.) und Review nennen 0,20 $ für Sonnets Cache-Read; die Preisseite nennt heute 0,10 $, das steht im Code.@anthropic-ai/sdk1.1.0. Das ist drei Tage alt. Für das neuere 1.3.0 hätte die Mindest-Release-Alter-Sperre von pnpm eine Ausnahme gebraucht.content/combat/area.yaml(„Jede Designentscheidung triffst du selbst“). Das Issue verlangte sie nicht.val name = "Steven"im Kotlin-Kurs oder Pfade wie/home/stevenin Automation. Der Tutor sieht dort „Jordan“ und/home/jordan. Das ist harmlos, kann aber so in einer Antwort auftauchen. Die Lösungsprüfung arbeitet auf demselben ersetzten Text und bleibt damit stimmig.`?.`), weil sie sich sonst nicht von normalem Text unterscheiden. Bei Fehlersuche, Reihenfolge und Auswahl erkennt sie auch Zeilennummern, Nachbarpaare und „Option 2“. Umschreibungen fängt sie nicht. Sie ist ein Schutz vor versehentlichem Verraten, so wie das Issue sie beschreibt.Was noch einen echten Schlüssel braucht
cache_read_input_tokens. Der Test simuliert den Cache, indem er prüft, dass der Prefix byte-gleich ist.Überschneidungen
src/app.ts,src/pages/exercise.ts,src/testing/local-app.ts,src/styles/exercise.css,docs/CONVEX.mdunde2e/convex/sync.spec.ts. Meine Änderungen hängen dort meist nur Code an. Inexercise.tsändert sich zusätzlich derreveal-Hook (gleiche Logik, danach wird das Panel aufgefrischt), inapp.tsdie Ausfallerkennung: Sie ignoriert laufende Tutor-Aufrufe, sonst würde ein 7-Sekunden-Aufruf als Verbindungsausfall gelten. Wer als Zweiter merged, rebased.area.yamlmit. Der Tutor kennt Bereichsregeln bisher nur für Erzählen und Combat und gibt dort sonst nur die allgemeine Regel mit. Wenn diese Kurse gemerged sind, sollten sie einen Eintrag inAREA_RULES(src/engine/tutor.ts) bekommen. Ich habe das nicht vorgezogen, weil die Kurse noch nicht aufmainsind.README.md. Mein Absatz steht weiter unten.Prüfungen
pnpm lint,pnpm typecheck,pnpm content:check,pnpm bear:check,pnpm build: grün. Das SDK landet nicht im Frontend-Bundle. Der Tutor-Code ist ein eigenes Chunk von 13 KB.pnpm test: 382 Tests grün. Neu sind 17 Convex-Tests mit Fake-Provider (Zugriff, ohne Schlüssel, Kosten, Cache, kein personenbezogenes Datum im Request, Lösungsprüfung mit zweitem Versuch, Budget auch parallel, Monatswechsel, Zeitüberschreitung, liegengebliebene Reservierung, Ablehnung, Abbruch, Provider-Fehler), 29 Engine-Tests und 7 Eval-Tests, darunter einer über alle Übungen des Inhalts.pnpm test:e2e: 67/67 grün, darunter 8 neue Tutor-Tests (ohne Schlüssel unsichtbar, drei Stufen, Rückfall auf statischen Hinweis, Budget 80 % und 100 %, offline, nach „Lösung zeigen“, eigene Texte,/daten). Der Viewport-Test „real content fits phone, tablet and desktop viewports“ lief lokal grün; in CI scheitert er auch aufmain(LRN-31), den habe ich nicht angefasst.pnpm test:pwa:e2e: 5/5 grün.tooling/ci/convex-e2e.shgegen ein wegwerfbares lokales Convex-Backend: 15/15 grün, darunter der neue Test „ohne Schlüssel meldet sich der Tutor als abwesend“. Die Funktionen samt SDK ließen sich dort deployen.pnpm tutor:eval(Trockenlauf): 30 Fälle gültig, alle Versuche laut Plattform-Prüfung falsch, Schätzung 1,39 $.max_tokenszu knapp und Kampf-Texte, die einen Tutor bekamen. Den Preisbefund habe ich nicht übernommen (siehe oben).Teil von LRN-6. Das Issue bleibt nach dem Merge offen: Eval mit echtem Modell, Bewertung von
explainundpractice(Schritt 3), Streaming und Fragen in der Lektion (Schritt 4).🤖 Generated with Claude Code