Harness gegen stillen Verlust gehaertet (#547-#551)
Fuenf Befunde mit einem gemeinsamen Fehlermodus: Keiner erzeugt eine Fehlermeldung. Der Lauf wird fertig, das Ergebnis sieht plausibel aus, und nur die Qualitaet ist schlechter. #547 Der Begleittext zum Werkzeugaufruf ging verloren. AssistantWithToolCalls baute eine neue Nachricht aus nur den Aufrufen; der Text, den das Modell daneben geschrieben hatte, fiel weg. Damit verlor das Modell zwischen zwei Schritten seinen eigenen Plan, und im Audit stand, dass ein Werkzeug lief, nicht warum. #548 finish_reason wurde nirgends gelesen. Eine an der Ausgabegrenze abgeschnittene Antwort galt als fertiges Ergebnis. Das trifft besonders Laeufe im Hintergrund, wo niemand zusieht. Neuer Status Truncated: Das Teilergebnis geht weiter, aber gekennzeichnet. #549 reasoning_details wurde verworfen. Bei Werkzeugnutzung muss der Denkverlauf unveraendert zurueck, sonst beginnt ein Thinking-Modell jedes Mal von vorn. Wird jetzt als rohes JSON durchgereicht - ohne Auslegung, weil Reihenfolge und Signatur daran haengen. #550 Die Anfrage verlangt jetzt einen Anbieter, der alle mitgeschickten Parameter beherrscht. Ohne das durfte ein Anbieter cache_control, reasoning oder sogar tools stillschweigend uebergehen - der Lauf lieferte dann eine gewoehnliche Textantwort, wo ein Werkzeugaufruf hingehoert haette. Dazu usage.include: der abgerechnete Betrag schlaegt die Eigenrechnung, die als Rueckfallebene bleibt. Denktiefe je Agent einstellbar, Vorgabe off. #551 Werkzeuge eines Zuges laufen gleichzeitig, sofern sie sich dafuer freigeben. Die Vorgabe von IsParallelSafe ist false, weil die falsche Antwort hier nicht auffaellt: Zwei schreibende Aufrufe auf derselben Datei scheitern nicht zuverlaessig, sondern gelegentlich. Freigegeben ist bisher nur WebFetch - es liest ausschliesslich. Die Reihenfolge der Ergebnisse folgt den Aufrufen, nicht der Fertigstellung; daran haengen die tool_call_id-Zuordnung und der Cache-Praefix. 27 neue Tests, 887 gesamt, keine Regression. Build ohne Warnungen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -21,6 +21,15 @@ public sealed record AgentRunResult(
|
||||
/// in <see cref="PromptTokens"/> enthalten, kosten aber nur einen Bruchteil.
|
||||
/// </summary>
|
||||
public int CachedTokens { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Der vom Gateway gemeldete Betrag über alle Schritte (#550), falls geliefert.
|
||||
///
|
||||
/// <para>Er ist der Eigenrechnung vorzuziehen, weil er das abbildet, was tatsächlich
|
||||
/// abgerechnet wurde — einschließlich dessen, was eine Preisliste nicht kennt:
|
||||
/// Cache-Schreibaufschläge, abweichende Preise je Anbieter, Rabatte.</para>
|
||||
/// </summary>
|
||||
public decimal? ReportedCostUsd { get; init; }
|
||||
}
|
||||
|
||||
public enum AgentRunStatus
|
||||
@@ -47,5 +56,16 @@ public enum AgentRunStatus
|
||||
/// Andersherum ginge die Zahl der offenen Läufe nie auf null, weil ständig neue
|
||||
/// dazukämen — die Instanz käme nie zum Ende.</para>
|
||||
/// </summary>
|
||||
ShuttingDown
|
||||
ShuttingDown,
|
||||
|
||||
/// <summary>
|
||||
/// Das Modell stieß an die Ausgabegrenze, bevor es fertig war (#548).
|
||||
///
|
||||
/// <para>Der Lauf ist damit nicht gescheitert — es liegt ein Teilergebnis vor, und
|
||||
/// das steht in <see cref="AgentRunResult.FinalMessage"/>. Er ist aber auch nicht
|
||||
/// <see cref="Completed"/>: Was dort steht, ist ein abgeschnittener Gedanke, kein
|
||||
/// Schluss. Der Unterschied muss sichtbar sein, weil ein geplanter Lauf im
|
||||
/// Hintergrund sonst ein halbes Ergebnis weiterreicht, als wäre es ein ganzes.</para>
|
||||
/// </summary>
|
||||
Truncated
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user