Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //примера за СЕО оптимизация на 50 странции примерно
- import Anthropic from "@anthropic-ai/sdk";
- const client = new Anthropic();
- const MODEL = "claude-opus-4-8";
- const MAX_ITERS = 4;
- const RUBRIC = `
- - title: 50–60 знака, съдържа ключовата дума, уникален
- - meta_description: 120–158 знака, съдържа ключовата дума + подкана
- - h1: един, съдържа ключовата дума
- - slug: кратък, с ключовата дума, без стоп-думи
- `;
- // Хелпер : Claude връща масив от блокове като в този пример Ели вадим само текста
- function firstText(message) {
- return message.content.find((b) => b.type === "text")?.text ?? "";
- }
- // BUILD (и FIX): тука специално м усе подава issuee и преписва по тях
- async function build(page, rubric, issues = null) {
- const fix = issues
- ? `\n\nПоправи тези проблеми от предишния опит:\n- ${issues.join("\n- ")}`
- : "";
- const msg = await client.messages.create({
- model: MODEL,
- max_tokens: 1500,
- system: "Ти си SEO специалист. Спазвай стриктно рубриката.",
- messages: [{
- role: "user",
- content: `РУБРИКА:\n${rubric}\n\nСтраница: ${page.url}\nКлючова дума: ${page.keyword}\nСъдържание:\n${page.content}${fix}`,
- }],
- output_config: { format: { type: "json_schema", schema: {
- type: "object",
- properties: {
- title: { type: "string" }, meta_description: { type: "string" },
- h1: { type: "string" }, slug: { type: "string" },
- },
- required: ["title", "meta_description", "h1", "slug"],
- additionalProperties: false,
- }}},
- });
- return JSON.parse(firstText(msg));
- }
- // REVIEW / GRADE: оценява срещу рубриката. Чисто оценяване коеот връща pass според issue
- async function review(assets, page, rubric) {
- const msg = await client.messages.create({
- model: MODEL,
- max_tokens: 1000,
- system: "Ти си строг SEO рецензент. Провери всеки ред от рубриката. pass=true само ако ВСИЧКО е изпълнено; иначе изброй конкретните проблеми.",
- messages: [{
- role: "user",
- content: `РУБРИКА:\n${rubric}\n\nКлючова дума: ${page.keyword}\nАктиви:\n${JSON.stringify(assets)}`,
- }],
- output_config: { format: { type: "json_schema", schema: {
- type: "object",
- properties: {
- pass: { type: "boolean" },
- issues: { type: "array", items: { type: "string" } },
- },
- required: ["pass", "issues"],
- additionalProperties: false,
- }}},
- });
- return JSON.parse(firstText(msg));
- }
- // build ⇆ review, докато pass=true. С две думи това е цикалът
- async function optimizePage(page, rubric) {
- let issues = null;
- for (let i = 1; i <= MAX_ITERS; i++) {
- const assets = await build(page, rubric, issues); // build / fix
- const verdict = await review(assets, page, rubric); // grade
- if (verdict.pass) return { ok: true, iters: i, assets }; // спира на pass
- issues = verdict.issues; // тука връщаме грешките и следващият build ги поправя
- }
- return { ok: false, iters: MAX_ITERS };
- }
- // мАСИВА със страници
- const pages = [
- { url: "/kursove/finansirane-za-startap", keyword: "финансиране за стартъп", content: "..." },
- ];
- for (const page of pages) {
- const r = await optimizePage(page, RUBRIC);
- console.log(`${page.url} — ${r.ok ? "OK" : "НЕ мина"} (${r.iters} итерации)`);
- }
Advertisement
Add Comment
Please, Sign In to add comment