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:
1 parent
381530dbfe
commit
a58f279eaa
7 files changed
+16
-6
No files matched your search
@@ -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; }
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in new issue
Block a user