Curation v2 step 2: Claude Opus 5 editor, the Brief, per-provider budgets
- AnthropicBackend (Messages API, cached system block, output_config.effort,
server-side fallbacks, refusal surfaced as an error); Llms { bulk, editor }
with editor_or_bulk(); PriceTable-based UsageMeter per provider.
- [anthropic], [editorial], deepseek.max_concurrent_requests and
curation.max_article_count config; startup logs resolved providers.
- Budget day is the UTC date of started_at, preloaded from
runs.provider_costs_json; finish_run writes provider_costs_json and
config_json. Stage A batches run concurrently with per-batch budget checks.
- Editor prompt with one-line "why" per pick; no minimum lineup size;
--max-articles is a ceiling; top-up branch deleted; why stored on picks and
issue_articles.why and rendered in chapters and In this issue.
- Summaries on the editor client (3k-token input, concurrency 4, bulk then
excerpt fallback); "The Brief" replaces From the Editor; section intros gone.
- Colophon carries per-provider costs and models.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1rCLQeKBgnBo3oTgHuTMe
This commit is contained in:
@@ -7,6 +7,9 @@
|
||||
<p class="byline">{{ line }}</p>
|
||||
{% endif %}
|
||||
<p class="meta">{{ meta_line }}</p>
|
||||
{% if let Some(text) = why %}
|
||||
<p class="why"><em>Why it's here: {{ text }}</em></p>
|
||||
{% endif %}
|
||||
{% if let Some(line) = social_line %}
|
||||
<p class="social">{{ line }}</p>
|
||||
{% endif %}
|
||||
|
||||
@@ -9,12 +9,17 @@
|
||||
</p>
|
||||
<p class="fact-line"><strong>Issue:</strong> No. {{ issue_number }} · {{ display_date }}</p>
|
||||
<p class="fact-line"><strong>Generated:</strong> {{ generated_at }}</p>
|
||||
<p class="fact-line"><strong>Curation model:</strong> {{ model }}</p>
|
||||
<p class="fact-line"><strong>Bulk model:</strong> {{ bulk_model }}</p>
|
||||
<p class="fact-line"><strong>Editor model:</strong> {{ editor_model }}</p>
|
||||
<p class="fact-line"><strong>Summaries model:</strong> {{ summaries_model }}</p>
|
||||
<p class="fact-line"><strong>Entries considered:</strong> {{ entries_fetched }} from {{ feeds_seen }} feeds</p>
|
||||
<p class="fact-line"><strong>Candidates scored:</strong> {{ candidates }}</p>
|
||||
<p class="fact-line"><strong>Articles selected:</strong> {{ article_count }} across {{ section_count }} sections</p>
|
||||
<p class="fact-line"><strong>Words:</strong> {{ total_words }} · {{ reading_line }}</p>
|
||||
<p class="fact-line"><strong>Token cost:</strong> {{ cost_usd }}</p>
|
||||
{% for line in provider_costs %}
|
||||
<p class="fact-line"><strong>{{ line.provider }} cost:</strong> {{ line.cost }}</p>
|
||||
{% endfor %}
|
||||
<p class="fact-line"><strong>Total token cost:</strong> {{ cost_usd }}</p>
|
||||
<p class="fact-line"><strong>Generator:</strong> {{ generator_version }}</p>
|
||||
<p class="attribution">
|
||||
Article text belongs to its authors and publications; excerpts and links are
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<h1 class="masthead">The Daily EPUB</h1>
|
||||
<p class="dateline">{{ display_date }} · No. {{ issue_number }}</p>
|
||||
<hr class="rule"/>
|
||||
<h2 class="kicker">From the Editor</h2>
|
||||
<h2 class="kicker">The Brief</h2>
|
||||
<div class="editorial">
|
||||
{{ body_html|safe }}
|
||||
</div>
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
<p class="index-meta">{{ entry.source }} · {{ entry.reading_minutes }} min read</p>
|
||||
{% if !entry.summary.is_empty() %}
|
||||
<p class="index-summary">{{ entry.summary }}</p>
|
||||
{% endif %}
|
||||
{% if let Some(text) = entry.why %}
|
||||
<p class="index-why"><em>Why it's here: {{ text }}</em></p>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
|
||||
@@ -3,7 +3,4 @@
|
||||
{% block content %}
|
||||
<h1 class="section-title">{{ name }}</h1>
|
||||
<hr class="rule"/>
|
||||
{% if let Some(text) = intro %}
|
||||
<p class="section-intro">{{ text }}</p>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
@@ -190,3 +190,5 @@ p.comment-line {
|
||||
.fact-line {
|
||||
margin: 0 0 0.35em 0;
|
||||
}
|
||||
|
||||
.why, .index-why { font-size: 0.9em; font-style: italic; }
|
||||
|
||||
@@ -296,3 +296,5 @@ blockquote.comment blockquote.comment {
|
||||
.fact-line {
|
||||
margin: 0 0 0.35em 0;
|
||||
}
|
||||
|
||||
.why, .index-why { font-size: 0.9em; font-style: italic; }
|
||||
|
||||
Reference in New Issue
Block a user