cb3fa143fb
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7.9 KiB
7.9 KiB
AP-A Token-Tracking Fundament – Zusammenfassung
Dieses Dokument fasst alle Klassen, Methoden und Dateien zusammen, die im Zuge von AP-A (Token- und Kosten-Tracking-Fundament der V3.3-Spezifikation, #74) neu erstellt oder substanziell erweitert wurden.
Schema-Migration
pdf-umbenenner-adapter-out/src/main/resources/db/migration/V2__token_tracking.sql- Sechs neue Spalten in
processing_attempt:input_tokens,output_tokens,cache_creation_input_tokens,cache_read_input_tokens,price_input_per_token_nano_usd,price_output_per_token_nano_usd. - Neue Tabelle
model_pricemit Composite Primary Key(provider, model_name), NOT-NULL-Preisen, Currency-CHECK auf'USD',updated_at-Spalte. - Zwei zusätzliche Indizes auf
processing_attempt:idx_processing_attempt_started_at_provider_fp_model,idx_processing_attempt_run_id_provider_model. - Default-Preise für gpt-4o-mini, gpt-4o, gpt-4.1*, gpt-5*, claude-haiku-4-5,
claude-sonnet-4-6 und claude-opus-4-7 (
ON CONFLICT DO NOTHING).
- Sechs neue Spalten in
Application-Modul
DTOs (application/dto)
AiUsageMetadata– Token-Verbrauchsmetadaten mitempty(),hasAnyTokenData(),hasCacheTokens().ModelPriceEntry– Schreib-/Validierungs-DTO mit Wertgrenzen-Validierung im Konstruktor.ModelPriceView– Lese-/Anzeige-DTO mit nullableupdatedAtundinvalidUpdatedAt-Flag.ModelPriceKey– Composite-Key für Löschungen.ModelPriceChangeSet– atomarer Block aus Upserts und Deletions, defensive Listen-Kopie.
Cost-Komponenten (application/cost)
CostResult– interpretierte Kosten-Anzeige mit Status-Flags.CostCalculator–formatRow(...)undcalculateAttempt(...)(echt implementiert),formatTotal(...)als Stub für AP-B.
Ports (application/port/out)
ModelPriceRepository–findAll,findByProviderAndModelName,upsert,delete,saveAllChanges.AiInvocationSuccess(erweitert) – neues FeldusageMetadata.
Use Cases (application/usecase)
DefaultManageModelPricesUseCase– CRUD-Fassade mit ChangeSet-Konflikt- validierung (vier Regeln) und Provider-Whitelist beim Upsert.ModelPriceValidationException– deutsche Validierungsfehler-Exception.
Application-Service-Anpassungen
AiNamingService(erweitert) – reichtAiUsageMetadataaus demAiInvocationSuccessals Token-Felder in denAiAttemptContextweiter.DocumentProcessingCoordinator(erweitert) –- neuer optionaler Konstruktor mit
ModelPriceRepositoryundheadlessMode-Flag. loadPriceSnapshot(modelName)lädt Snapshot-Preis pro Versuch; Lookup- Fehler liefern leeren Snapshot ohne Attempt-Verlust.buildAttempt(...)befüllt jetzt Token- und Preis-Snapshot-Felder imProcessingAttempt.
- neuer optionaler Konstruktor mit
Domain-Anpassungen
AiAttemptContext(erweitert) – vier nullable Token-Felder (inputTokens,outputTokens,cacheCreationInputTokens,cacheReadInputTokens); Backward-compatible Convenience-Konstruktor.ProcessingAttempt(erweitert) – sechs nullable Token-/Preis-Snapshot- Felder; Convenience-Konstruktor undwithoutAiFields(...)ohne Verhaltens- änderung.
Adapter-Out-Modul
SqliteConnectionFactory(neu) – zentrale Connection-Factory; setztPRAGMA journal_mode=WALundPRAGMA busy_timeout=5000. Foreign-Key-Pragma wird bewusst nicht implizit gesetzt (Verhalten der bisherigenDriverManager.getConnection-Stellen erhalten).SqliteUnitOfWorkAdapter,SqliteProcessingAttemptRepositoryAdapter,SqliteHistoryQueryAdapter,SqliteDocumentRecordRepositoryAdapter(jeweils geändert) – nutzen die neue Factory.SqliteProcessingAttemptRepositoryAdapter.save()(erweitert) – INSERT um sechs neue Spalten erweitert, neue HilfsmethodesetNullableLong(...).SqliteHistoryQueryAdapter.mapToProcessingAttempt(...)(erweitert) – liest die sechs neuen Spalten viareadNullableLong(...).SqliteSchemaInitializationAdapter(geändert) – erwartete Spalten/Indizes bleiben am V1-Zielschema; Doc-Klarstellung, dass V2 additiv auf der Baseline arbeitet.SqliteModelPriceRepositoryAdapter(neu) –findAll,findByProviderAndModelName,upsert,delete,saveAllChanges(UPSERT viaON CONFLICT(provider, model_name) DO UPDATE, transaktionaler Batch). Lese-Mapping behandeltDateTimeParseExceptionalsinvalidUpdatedAt.ModelPriceRepositoryException(neu) – technischer JDBC-Fehler.
KI-Adapter
AnthropicClaudeHttpAdapter(geändert) – neue MethodeextractTokenUsageFromResponse(JSONObject)fürusage.input_tokens,usage.output_tokens,usage.cache_creation_input_tokens,usage.cache_read_input_tokensmit Validierung (negativ, > 10 Mio., nicht-numerisch → NULL + WARN).OpenAiHttpAdapter(geändert) – analoge Methode mit Mappingprompt_tokens → input_tokens,completion_tokens → output_tokens; Cache-Felder bleiben null.
GUI-Modul
Neuer Tab "Modell-Preise"
adapter-in-gui/modelprices/GuiModelPriceManagementPort(neu) – Bridge-Port für GUI-Zugriff auf Modell-Preise.adapter-in-gui/modelprices/GuiModelPricesTab(neu) – TableView mit editierbaren Preisspalten (In/1M USD,Out/1M USD), Lösch-Button mit Bestätigungsdialog, Add-Dialog mit Provider-Auswahl, Speichern-Aktion überModelPriceChangeSet. Konvertierung Nano-USD ↔$/1M Tokensmit HALF-UP-Rundung; unbekannte Provider werden read-only mit Tooltip angezeigt;updatedAt = nullals "ungueltig".
Anbindung im Workspace
GuiConfigurationEditorWorkspace(geändert) – sechster Tab "Modell- Preise" wird angelegt; neue MethodewarnIfActiveModelHasNoPriceEntry()zeigt vor dem Speichern eine deutsche Warnung an, wenn das aktuell ausgewählte Modell keinen Preis-Eintrag besitzt.GuiStartupContext(geändert) – neues optionales FeldmodelPriceManagementPortmit Backward-Kompatibilität.BootstrapRunner(geändert) – neue MethodebuildGuiModelPriceManagementPort()und Helfer für die Verdrahtung; Coordinator wird mitModelPriceRepositoryundheadlessMode-Flag versorgt.
History-Tab
GuiHistoryTab(geändert) – drei zusätzliche Spalten in der Versuchstabelle: Input-Tokens, Output-Tokens, Kosten. Cache-only-Versuche zeigen "nur Cache-Tokens, keine Standardkosten"; fehlender Preis-Snapshot führt zu "Preis fehlt"; Mikrobeträge als "< $0.0001"; Cache-Beteiligung ergänzt Suffix "(ohne Cache-Anteil)".
Summary-Banner
BatchRunSummaryBanner(geändert) – aus einzeiliger HBox wurde eine vierzeilige VBox: Status-Zeile, Token-Zeile, Kosten-Zeile, optionale Cache-only-Zeile. Neue Record-KlasseBatchRunTokenSummarymitempty()-Default; bestehendeupdate(Map)-Aufrufer bleiben funktionsfähig.
Testanpassungen
pdf-umbenenner-application/.../service/AiNamingServiceTestundpdf-umbenenner-bootstrap/.../e2e/StubAiInvocationPort– alteAiInvocationSuccess-Konstruktoraufrufe umAiUsageMetadata.empty()ergänzt.SqliteSchemaInitializationAdapterTest.fall1_leereDb_processingAttemptHatAlleErwartetenSpaltenprüft jetzt zusätzlich die sechs Token-/Preis-Spalten.GuiAdapterSmokeTest.editorWorkspace_startStateShowsEmptyHeaderDefaultsAndOneTaberwartet jetzt sechs Tabs inkl. "Modell-Preise".
Build und Verifizierung
mvn clean verifyläuft auf dem Reactorpdf-umbenenner-parentdurch (Tests grün auf allen Modulen).- Commit
08ec021aufmaingepusht.
Bewusst ausgesparte Bereiche (für AP-B / AP-C)
CostCalculator.formatTotal(...)ist ein Stub und wirftUnsupportedOperationException.TokenStatisticsReadModelPort,QueryCostAnalysisFullUseCase,QueryCostAnalysisHeaderOnlyUseCase,QueryRunSummaryUseCase,SqliteTokenStatisticsReadModelAdaptersind nicht enthalten.- Summary-Banner zeigt aktuell
0/0Tokens und$0.0000Kosten, da das Read-Model erst in AP-B verdrahtet wird. - CLI-Befehle für Modell-Preise (#99) und Modell-Combobox-Filter (#98) sind AP-C.