Add effort badge to chain summary

Snapshot the agent's effort onto the chain (like model) so it survives
reload, archive and shared chains, then show it in the chain-end meta line.

- ChainRecord.Effort + chains.effort column (TryAddColumn migration).
- CreateChain INSERT carries the value.
- ChatService snapshots agent.Effort at chain creation, but only for Claude
  models – OpenAI providers store '' so there is no misleading badge.
- Anthropic streaming + CLI done-events include effort for the live path.
- chat.js buildMetaBadges renders "Effort: <level>" after the model badge,
  only when a value is set.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
MelekiandClaude Opus 4.8 committed 2026-05-31 22:08:44 +02:00
1 parent 381530dbfe
commit a58f279eaa
7 files changed
+16 -6

No files matched your search

+1
View File
@@ -20,5 +20,6 @@ public class ChainRecord
public string ArchiveId { get; set; }
public string StreamErrorInfo { get; set; }
public bool PlanMode { get; set; }
public string Effort { get; set; }
public string CreatedAt { get; set; }
}
+3
View File
@@ -307,6 +307,7 @@ public partial class AnthropicService
chainId,
durationMs = sw.ElapsedMilliseconds,
stopReason,
effort,
viaCli = true
}, sseCt);
}
@@ -323,6 +324,7 @@ public partial class AnthropicService
chainId,
durationMs = sw.ElapsedMilliseconds,
stopReason = stoppedReason,
effort,
viaCli = true
}, CancellationToken.None);
}
@@ -352,6 +354,7 @@ public partial class AnthropicService
chainId,
durationMs = sw.ElapsedMilliseconds,
stopReason = "error",
effort,
viaCli = true
}, sseCt);
}
+6 -3
View File
@@ -302,7 +302,8 @@ public partial class AnthropicService
durationMs = sw.ElapsedMilliseconds,
stopReason = finalStopReason,
streamErrorInfo,
planMode
planMode,
effort
}, sseCt);
return;
}
@@ -346,7 +347,8 @@ public partial class AnthropicService
chainId,
durationMs = sw.ElapsedMilliseconds,
stopReason = "stopped",
planMode
planMode,
effort
}, CancellationToken.None);
}
catch (Exception) when (workCt.IsCancellationRequested || hardCt.IsCancellationRequested)
@@ -367,7 +369,8 @@ public partial class AnthropicService
chainId,
durationMs = sw.ElapsedMilliseconds,
stopReason = "stopped",
planMode
planMode,
effort
}, CancellationToken.None);
}
catch (OperationCanceledException)
+2 -1
View File
@@ -120,7 +120,8 @@ public class ChatService
SystemPrompt = systemPromptText,
ToolChoice = toolChoice,
ToolNames = toolNames,
PlanMode = planMode
PlanMode = planMode,
Effort = OpenAiService.IsOpenAiProvider(modelId) ? "" : agent.Effort
});
await _db.UpdateSessionTimestamp(sessionId);
+2 -2
View File
@@ -220,8 +220,8 @@ public partial class DatabaseService
using var conn = CreateConnection();
chain.CreatedAt = DateTime.UtcNow.ToString("o");
await conn.ExecuteAsync(@"
INSERT INTO chains (chain_id, session_id, archive_id, agent_id, model, system_prompt, tool_choice, tool_names, input_tokens, output_tokens, iterations, stop_reason, duration_ms, plan_mode, created_at)
VALUES (@ChainId, @SessionId, @ArchiveId, @AgentId, @Model, @SystemPrompt, @ToolChoice, @ToolNames, @InputTokens, @OutputTokens, @Iterations, @StopReason, @DurationMs, @PlanMode, @CreatedAt)
INSERT INTO chains (chain_id, session_id, archive_id, agent_id, model, system_prompt, tool_choice, tool_names, input_tokens, output_tokens, iterations, stop_reason, duration_ms, plan_mode, effort, created_at)
VALUES (@ChainId, @SessionId, @ArchiveId, @AgentId, @Model, @SystemPrompt, @ToolChoice, @ToolNames, @InputTokens, @OutputTokens, @Iterations, @StopReason, @DurationMs, @PlanMode, @Effort, @CreatedAt)
", chain);
}
+1
View File
@@ -197,6 +197,7 @@ public partial class DatabaseService
TryAddColumn(conn, "sessions", "unity_mcp_token", "TEXT");
TryAddColumn(conn, "messages", "tag", "TEXT");
TryAddColumn(conn, "agents", "effort", "TEXT NOT NULL DEFAULT ''");
TryAddColumn(conn, "chains", "effort", "TEXT NOT NULL DEFAULT ''");
// Migration: 1M-Suffix entfernen (Mai 2026). Seit März 2026 ist 1M-Context Default
// bei Opus 4.6/4.7/4.8 + Sonnet 4.6 – kein "[1m]"-Suffix mehr nötig.
+1
View File
@@ -4,6 +4,7 @@ function buildMetaBadges(d) {
const badges = [];
if (d.planMode) badges.push('📋 Plan-Modus');
badges.push(prettyModelName(d.model));
if (d.effort) badges.push('Effort: ' + d.effort);
badges.push('Tokens: ' + (d.inputTokens || 0) + ' / ' + (d.outputTokens || 0));
if (d.cacheCreationTokens > 0 || d.cacheReadTokens > 0) {
badges.push('Cache: ' + (d.cacheReadTokens || 0) + ' / ' + (d.cacheCreationTokens || 0));