bhcto.com

content_round1.js

// Round 1 — Draft. One batch, 15 requests (custom_id = slug), prompt = the brief.
// Writes round1/<slug>.md. STOPS for user review before round 2.
//
//   node content_round1.js [--slug <slug>] [--limit N]

const fs = require("fs");
const path = require("path");
const { parseBriefs } = require("./lib/briefs");
const { probeModel, runRound, WEB_SEARCH } = require("./lib/batch");
const P = require("./lib/prompts");
const { cleanArticle } = require("./lib/clean");

const OUT = path.join(__dirname, "round1");

function arg(name) {
  const i = process.argv.indexOf(`--${name}`);
  return i >= 0 ? process.argv[i + 1] : null;
}

async function main() {
  fs.mkdirSync(OUT, { recursive: true });
  const { standingRules, briefs } = parseBriefs();
  let items = briefs;
  if (arg("slug")) items = briefs.filter((b) => b.slug === arg("slug"));
  else if (arg("limit")) items = briefs.slice(0, Number(arg("limit")));

  const model = await probeModel();
  console.log(`Round 1: drafting ${items.length} post(s) with ${model} (web search enabled)`);

  const sys1 = P.round1System(standingRules);
  const results = await runRound(model, items, (brief) => ({
    system: sys1,
    userContent: P.round1User(brief),
    max_tokens: 16000,
    tools: [WEB_SEARCH],
  }));

  let ok = 0;
  for (const b of items) {
    const r = results.get(b.slug);
    if (r && r.ok) {
      const article = cleanArticle(r.text);
      fs.writeFileSync(path.join(OUT, `${b.slug}.md`), article);
      console.log(`  ✓ ${b.slug} (${r.model}, ${article.split(/\s+/).length}w)`);
      ok++;
    } else {
      console.warn(`  ✗ ${b.slug} — ${r ? r.error || r.stop_reason : "no result"}`);
    }
  }
  console.log(`\nRound 1 done: ${ok}/${items.length} written to round1/. Review, then run content_round2.js.`);
}

main().catch((e) => {
  console.error("FATAL:", e.stack || e);
  process.exit(1);
});