{"id":22188,"date":"2026-04-09T08:11:26","date_gmt":"2026-04-09T08:11:26","guid":{"rendered":"https:\/\/umang.pk\/2026\/04\/09\/%d8%af%d8%b1%d8%ac%db%81-%d8%a8%d9%86%d8%af%db%8c-%da%a9%db%92-%d9%85%d8%a7%da%88%d9%84-%d8%b1%d9%88%d9%b9%d9%86%da%af-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92\/"},"modified":"2026-04-09T08:11:26","modified_gmt":"2026-04-09T08:11:26","slug":"%d8%af%d8%b1%d8%ac%db%81-%d8%a8%d9%86%d8%af%db%8c-%da%a9%db%92-%d9%85%d8%a7%da%88%d9%84-%d8%b1%d9%88%d9%b9%d9%86%da%af-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/04\/09\/%d8%af%d8%b1%d8%ac%db%81-%d8%a8%d9%86%d8%af%db%8c-%da%a9%db%92-%d9%85%d8%a7%da%88%d9%84-%d8%b1%d9%88%d9%b9%d9%86%da%af-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92\/","title":{"rendered":"\u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u06d2 \u0645\u0627\u0688\u0644 \u0631\u0648\u0679\u0646\u06af \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0644\u0627\u06af\u062a \u0633\u06d2 \u0645\u0648\u062b\u0631 AI \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 AI \u0627\u06cc\u062c\u0646\u0679 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644\u0632 \u0627\u06cc\u06a9 \u06c1\u06cc \u063a\u0644\u0637\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u0639\u0646\u06cc\u060c \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u062f\u0633\u062a\u06cc\u0627\u0628 \u0645\u06c1\u0646\u06af\u06d2 \u062a\u0631\u06cc\u0646 \u0645\u0627\u0688\u0644 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0631\u06cc\u06a9\u0679\u0631 \u06af\u0646\u062a\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 GPT-4 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0633\u0648\u0646\u06cc\u0679 \u06a9\u06cc \u0645\u0648\u062c\u0648\u062f\u06af\u06cc \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0631\u06cc\u06af\u0648\u0644\u0631 \u0627\u06cc\u06a9\u0633\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u0627\u0632\u06af\u0631 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u063a\u0644\u0637\u06cc \u0627\u06d2 \u0622\u0626\u06cc \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633\u06d2 \u06a9\u0628 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0628\u0646\u062f \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0633 \u0637\u0631\u062d \u0627\u06cc\u06a9 \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u0627 \u0631\u0648\u0679\u0646\u06af \u0633\u0633\u0679\u0645 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062c\u0648 \u06a9\u0627\u0645 \u06a9\u0648 \u0633\u0633\u062a\u06d2 \u062a\u0631\u06cc\u0646 \u0645\u0627\u0688\u0644 \u06a9\u06cc \u0637\u0631\u0641 \u0644\u06d2 \u062c\u0627\u0626\u06d2 \u062c\u0648 \u0645\u0633\u0626\u0644\u06c1 \u06a9\u0648 \u062d\u0644 \u06a9\u0631 \u0633\u06a9\u06d2\u06d4 \u0627\u0633 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0644\u0627\u06af\u062a \u06a9\u0627 \u0648\u06a9\u0631 \u06a9\u06c1\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06c1\u0641\u062a\u06d2 \u06a9\u06d2 \u0622\u062e\u0631 \u0645\u06cc\u06ba \u062a\u06cc\u0646 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0646\u0641\u0627\u0630 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 DEV.to \u0645\u0636\u0645\u0648\u0646 \u067e\u0631 \u062a\u0628\u0635\u0631\u06d2 \u06a9\u06d2 \u062f\u06be\u0627\u06af\u06d2 \u0633\u06d2 \u0622\u06cc\u0627 \u06c1\u06d2 \u062c\u0633 \u0646\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0635\u0641\u062d\u0627\u062a \u067e\u0631 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc SEO \u0622\u0688\u0679 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc \u0644\u0627\u06af\u062a \u06a9\u0648 \\(0.006 \u0633\u06d2 \u0645\u0624\u062b\u0631 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \\)0 \u062a\u06a9 \u06a9\u0645 \u06a9\u0631 \u062f\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u0622\u067e \u06a9\u0627 \u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627 <code>cost_curve.py<\/code> \u0645\u0627\u0688\u06cc\u0648\u0644 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0627\u06cc\u062c\u0646\u0679 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u06cc\u06d2 \u062c\u0627\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-what-youll-build\">\u06a9\u06cc\u0627 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631\u0646\u0627 \u06c1\u06d2<\/h2>\n<p>\u062a\u06cc\u0646 \u062f\u0631\u062c\u06d2 \u06a9\u06cc \u0631\u0648\u0679\u0646\u06af \u06a9\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p>\u067e\u06c1\u0644\u06d2 \u0688\u06cc\u0679\u0631\u0645\u0646\u0633\u0679\u06a9 \u0627\u0632\u06af\u0631 \u0686\u06cc\u06a9 \u0686\u0644\u0627\u0626\u06cc\u06ba &#8211; \u06a9\u0648\u0626\u06cc API \u0644\u0627\u06af\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0645\u06cc\u06ba \u0648\u0627\u0642\u0639\u06cc \u0645\u0628\u06c1\u0645 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u0631\u0641 \u06a9\u0644\u0627\u0688 \u06c1\u0627\u0626\u06cc\u06a9\u0648 \u06a9\u06cc \u0637\u0631\u0641 \u0628\u0691\u06be\u062a\u0627 \u06c1\u0648\u06ba\u06d4 ~$0.0001 \u0641\u06cc \u06a9\u0627\u0644<\/p>\n<\/li>\n<li>\n<p>Claude Sonnet \u06a9\u06cc \u0637\u0631\u0641 \u0628\u0691\u06be\u06cc\u06ba \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u062c\u0628 \u0645\u0639\u0646\u0648\u06cc \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06d4 ~$0.006 \u0641\u06cc \u06a9\u0627\u0644<\/p>\n<\/li>\n<li>\n<p>\u0627\u06af\u0631 \u0627\u06cc\u06a9 \u067e\u0631\u062a \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u062e\u0648\u0628\u0635\u0648\u0631\u062a\u06cc \u0633\u06d2 \u0648\u0627\u067e\u0633 \u0622\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062f\u0631\u062c\u06d2 \u0633\u06d2 \u0642\u0637\u0639 \u0646\u0638\u0631 \u0627\u06cc\u06a9 \u0645\u0633\u062a\u0642\u0644 \u0646\u062a\u06cc\u062c\u06c1 \u06a9\u0627 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0645\u06a9\u0645\u0644 \u0646\u0641\u0627\u0630 dannwaneri\/seo-agent \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u06d2\u060c \u062c\u0648 \u0627\u06cc\u06a9 \u06a9\u06be\u0644\u0627 \u0628\u0646\u06cc\u0627\u062f\u06cc SEO \u0622\u0688\u0679 \u0627\u06cc\u062c\u0646\u0679 \u06c1\u06d2\u06d4 Cost Curve \u0645\u0627\u0688\u06cc\u0648\u0644 \u0627\u06cc\u06a9 \u067e\u0631\u06cc\u0645\u06cc\u0645 \u0631\u0648\u0679\u0646\u06af \u0679\u0627\u0626\u0631 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0627\u0635\u0648\u0644 \u0645\u062e\u0644\u0648\u0637 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u06a9\u06d2 \u06a9\u0627\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u062a\u0645\u0627\u0645 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u067e\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h2>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<ol>\n<li>\n<p>\u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0644\u0627\u0688 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1<\/p>\n<\/li>\n<li>\n<p>\u0644\u0627\u06af\u062a \u0648\u06a9\u0631 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644<\/p>\n<\/li>\n<li>\n<p>\u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a<\/p>\n<\/li>\n<li>\n<p>\u067e\u0631\u062a 1: \u0688\u06cc\u0679\u0631\u0645\u0646\u0633\u0679\u06a9 \u0627\u0632\u06af\u0631<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0626\u0631 2: \u0645\u0628\u06c1\u0645 \u0645\u0642\u062f\u0645\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0644\u0627\u0688 \u06c1\u0627\u0626\u06cc\u06a9\u0648<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0626\u0631 3: \u0633\u06cc\u0645\u0646\u0679\u06a9 \u062c\u062c\u0645\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0644\u0627\u0688 \u06a9\u06d2 \u0633\u0648\u0646\u06cc\u0679<\/p>\n<\/li>\n<li>\n<p>\u0631\u0627\u0624\u0679\u0631: audit_url()<\/p>\n<\/li>\n<li>\n<p>\u062e\u0648\u0628\u0635\u0648\u0631\u062a \u0645\u062a\u0628\u0627\u062f\u0644<\/p>\n<\/li>\n<li>\n<p>\u0644\u0627\u06af\u062a \u0648\u06a9\u0631 \u0679\u06cc\u0633\u0679\u0646\u06af<\/p>\n<\/li>\n<li>\n<p>\u0627\u0633 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<h2 id=\"heading-the-problem-with-calling-claude-on-everything\">\u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0644\u0627\u0688 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1<\/h2>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648\u0688 \u0627\u0633 \u0637\u0631\u062d \u0644\u06af\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-python\">def audit_url(snapshot: dict) -> dict:\n    response = client.messages.create(\n        model=\"claude-sonnet-4-20250514\",\n        messages=[{\"role\": \"user\", \"content\": build_prompt(snapshot)}]\n    )\n    return parse_response(response)\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0641\u06c1\u0631\u0633\u062a \u0645\u06cc\u06ba \u06c1\u0631 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0648\u0646\u06cc\u0679 \u06a9\u0648 \u0628\u06be\u06cc \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0639\u0646\u0648\u0627\u0646 142 \u062d\u0631\u0648\u0641 \u0644\u0645\u0628\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0648\u0626\u06cc \u0645\u0627\u0688\u0644 \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u062a\u0648 \u0627\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 URL \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u062c\u0648\u0627\u0628 \u06cc\u0642\u06cc\u0646\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0641\u06cc\u0644 \u06c1\u06d2\u06d4<\/p>\n<p>Claude Sonnet 4 \u06a9\u06cc \u0642\u06cc\u0645\u062a 3 \u0641\u06cc \u0645\u0644\u06cc\u0646 \u0627\u0646 \u067e\u0679 \u0679\u0648\u06a9\u0646 \u0627\u0648\u0631 15 \u0641\u06cc \u0645\u0644\u06cc\u0646 \u0622\u0624\u0679 \u067e\u0679 \u0679\u0648\u06a9\u0646 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0635\u0641\u062d\u06c1 \u06a9\u0627 \u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 500 \u0627\u0646 \u067e\u0679 \u0679\u0648\u06a9\u0646\u0632 \u06a9\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \\(0.0015 \u0641\u06cc \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u0635\u0631\u0641 \u0622\u0624\u0679 \u067e\u0679 \u0679\u0648\u06a9\u0646 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0646 \u067e\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06d2\u06d4 20 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u06a9\u06d2 \u06c1\u0641\u062a\u06c1 \u0648\u0627\u0631 \u0622\u0688\u0679 \u0645\u06cc\u06ba\u060c \u06a9\u0644 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \\)0.12 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0645\u06c1\u0646\u06af\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062a\u0627\u06c1\u0645\u060c \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0635\u0641\u062d\u0627\u062a \u0645\u06cc\u06ba \u0645\u06a9\u06cc\u0646\u06cc\u06a9\u0644 SEO \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062c\u06cc\u0633\u06d2 \u06af\u0645\u0634\u062f\u06c1 \u062a\u0641\u0635\u06cc\u0644\u060c 60 \u062d\u0631\u0648\u0641 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0639\u0646\u0648\u0627\u0646\u0627\u062a\u060c \u0627\u0648\u0631 \u06a9\u0648\u0626\u06cc \u06a9\u06cc\u0646\u0646\u06cc\u06a9\u0644 \u0679\u06cc\u06af\u0632 \u0646\u06c1\u06cc\u06ba\u06d4 \u06a9\u0631\u062f\u0627\u0631 \u06a9\u06cc \u06af\u0646\u062a\u06cc \u06cc\u06c1 \u0633\u0628 \u06a9\u0686\u06be \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u06a9\u0633\u06cc \u0645\u0627\u0688\u0644 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u0627\u06af\u062a \u06a9\u06d2 \u0645\u0646\u062d\u0646\u06cc \u062e\u0637\u0648\u0637 \u0627\u0633 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u0631\u0648\u0679\u0646\u06af \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062d\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0633 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u06a9\u06c1 \u06a9\u0627\u0645 \u06a9\u06cc \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u060c \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633 \u06a9\u06d2 \u06a9\u06c1 \u0645\u0627\u0688\u0644 \u06a9\u0633 \u0642\u0627\u0628\u0644 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-the-cost-curve-explained\">\u0644\u0627\u06af\u062a \u0648\u06a9\u0631 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644<\/h2>\n<p>\u0644\u0627\u06af\u062a \u06a9\u06d2 \u0645\u0646\u062d\u0646\u06cc \u062e\u0637\u0648\u0637 \u0645\u06cc\u06ba \u062a\u06cc\u0646 \u062f\u0631\u062c\u06d2\u060c \u062a\u06cc\u0646 \u0679\u0648\u0644\u0632\u060c \u0627\u0648\u0631 \u062a\u06cc\u0646 \u0642\u06cc\u0645\u062a \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u0679\u0627\u0626\u0631 1 &#8211; \u0688\u06cc\u0679\u0631\u0645\u0646\u0633\u0679\u06a9 \u0627\u0632\u06af\u0631\u06d4 \u0644\u0627\u06af\u062a: $0\u06d4<\/strong> \u0639\u0646\u0648\u0627\u0646 \u06a9\u06cc \u0644\u0645\u0628\u0627\u0626\u06cc\u060c \u062a\u0641\u0635\u06cc\u0644 \u06a9\u06cc \u0644\u0645\u0628\u0627\u0626\u06cc\u060c H1 \u0634\u0645\u0627\u0631\u060c \u0627\u0648\u0631 \u0631\u0633\u0645\u06cc \u0648\u062c\u0648\u062f \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0633\u0679\u0631\u0646\u06af \u0622\u067e\u0631\u06cc\u0634\u0646 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0639\u0646\u0648\u0627\u0646 \u06a9\u06cc \u0644\u0645\u0628\u0627\u0626\u06cc 60 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u06d2 \u062a\u0648 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0633\u06cc \u0645\u0627\u0688\u0644 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0679\u0627\u0626\u0631 2 &#8211; \u06a9\u0644\u0627\u0688 \u06c1\u0627\u0626\u06cc\u06a9\u0648\u06d4 \u0644\u0627\u06af\u062a: ~$0.0001 \u0641\u06cc \u06a9\u0627\u0644\u06d4<\/strong> \u0627\u06cc\u06a9 \u0639\u0646\u0648\u0627\u0646 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 4 \u062d\u0631\u0648\u0641 \u0637\u0648\u06cc\u0644 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u062a\u0641\u0635\u06cc\u0644 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0635\u0631\u0641 30 \u062d\u0631\u0648\u0641 \u06a9\u06cc \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633\u0679\u06cc\u0679\u0633 \u06a9\u0648\u0688 \u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 \u06c1\u06d2\u06d4 \u0627\u0633 \u0646\u06d2 \u0645\u06a9\u06cc\u0646\u06cc\u06a9\u0644 \u0622\u0688\u0679 \u067e\u0627\u0633 \u06a9\u06cc\u0627\u060c \u0644\u06cc\u06a9\u0646 \u06a9\u0686\u06be \u06af\u0691\u0628\u0691 \u06c1\u06d2\u06d4 \u06c1\u0627\u0626\u06cc\u06a9\u0648 \u062a\u06cc\u0632 \u0627\u0648\u0631 \u0633\u0633\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0645\u0634\u06a9\u0648\u06a9 \u06a9\u06cc\u0633\u0632 \u06a9\u0648 \u0628\u0691\u06be\u0627\u0646\u0627 \u062c\u06be\u0648\u0679\u06d2 \u0645\u062b\u0628\u062a \u06a9\u0648 \u0688\u06cc\u0628\u06af \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0648\u0642\u062a \u0633\u06d2 \u06a9\u0645 \u062e\u0631\u0686 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0679\u0627\u0626\u0631 3 &#8211; \u06a9\u0644\u0627\u0688 \u06a9\u06d2 \u0633\u0648\u0646\u06cc\u0679\u06d4 \u0644\u0627\u06af\u062a: ~$0.006 \u0641\u06cc \u06a9\u0627\u0644\u06d4<\/strong> \u0635\u0641\u062d\u0627\u062a \u06c1\u0627\u0626\u06cc\u06a9\u0648 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0645\u0639\u0646\u0648\u06cc \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 &quot;\u06cc\u06c1 \u0639\u0646\u0648\u0627\u0646 \u0644\u0645\u0628\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0646\u06cc\u0648\u06cc\u06af\u06cc\u0634\u0646 \u0644\u06cc\u0628\u0644 \u06a9\u06cc \u0637\u0631\u062d \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4&#8221; &quot;\u06cc\u06c1 \u062a\u0641\u0635\u06cc\u0644 \u0639\u0646\u0648\u0627\u0646 \u06a9\u06cc \u0646\u0642\u0644 \u06c1\u06d2\u06d4&#8221; \u0633\u0648\u0646\u06cc\u0679 \u0648\u0627\u0642\u0639\u06cc \u0645\u0634\u06a9\u0644 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u06cc\u0633\u06c1 \u06a9\u0645\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0641\u06c1\u0631\u0633\u062a \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u0631 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0631\u0648\u0679\u0646\u06af \u06a9\u06d2 \u0641\u06cc\u0635\u0644\u06d2 API \u06a9\u0627\u0644\u0632 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u0633\u06d2 \u0642\u0637\u0639 \u0646\u0638\u0631 \u06a9\u06c1 \u06a9\u0633 \u062f\u0631\u062c\u06d2 \u0646\u06d2 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u06cc \u06c1\u06d2\u060c \u0646\u062a\u06cc\u062c\u06c1 \u062e\u06cc\u0632 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0627\u06cc\u06a9 \u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-project-setup\">\u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a<\/h2>\n<pre><code class=\"language-bash\">mkdir cost-curve-demo && cd cost-curve-demo\npip install anthropic\n<\/code><\/pre>\n<p>\u0627\u067e\u0646\u06cc API \u06a9\u0644\u06cc\u062f \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\"># macOS\/Linux\nexport ANTHROPIC_API_KEY=\"sk-ant-...\"\n\n# Windows PowerShell\n$env:ANTHROPIC_API_KEY = \"sk-ant-...\"\n<\/code><\/pre>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>cost_curve.py<\/code> &#8211; \u0622\u067e \u0627\u0633 \u0645\u0627\u0688\u06cc\u0648\u0644 \u06a9\u0648 \u0645\u0631\u062d\u0644\u06c1 \u0648\u0627\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<h2 id=\"heading-tier-1-deterministic-python\">\u067e\u0631\u062a 1: \u0688\u06cc\u0679\u0631\u0645\u0646\u0633\u0679\u06a9 \u0627\u0632\u06af\u0631<\/h2>\n<p>\u0679\u0627\u0626\u0631 1 \u062a\u0645\u0627\u0645 URLs \u067e\u0631 \u067e\u06c1\u0644\u06d2 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u0635\u0631\u0641 Python \u0633\u0679\u0631\u0646\u06af \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0686\u0627\u0631 \u0641\u06cc\u0644\u0688\u0632 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4 \u06a9\u0648\u0626\u06cc API \u06a9\u0627\u0644 \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u062a\u0627\u062e\u06cc\u0631 \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u0642\u06cc\u0645\u062a \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">import json\nimport logging\nimport os\nimport re\nfrom datetime import datetime, timezone\n\nimport anthropic\n\nlogger = logging.getLogger(__name__)\n\nREDIRECT_CODES = {301, 302, 307, 308}\n\n# Fields that trigger Tier 2 escalation\n# Title or description present but suspiciously short\nAMBIGUOUS_TITLE_MAX = 10   # chars \u2014 present but too short to be real\nAMBIGUOUS_DESC_MAX = 50    # chars \u2014 present but too short to be useful\n\n\ndef _now_iso() -> str:\n    return datetime.now(timezone.utc).isoformat()\n\n\ndef _build_result(snapshot: dict, method: str) -> dict:\n    \"\"\"Base result skeleton \u2014 same schema regardless of tier.\"\"\"\n    return {\n        \"url\": snapshot.get(\"final_url\", \"\"),\n        \"final_url\": snapshot.get(\"final_url\", \"\"),\n        \"status_code\": snapshot.get(\"status_code\"),\n        \"title\": {\"value\": None, \"length\": 0, \"status\": \"PASS\"},\n        \"description\": {\"value\": None, \"length\": 0, \"status\": \"PASS\"},\n        \"h1\": {\"count\": 0, \"value\": None, \"status\": \"PASS\"},\n        \"canonical\": {\"value\": None, \"status\": \"PASS\"},\n        \"flags\": [],\n        \"human_review\": False,\n        \"audited_at\": _now_iso(),\n        \"method\": method,\n        \"needs_tier3\": False,\n    }\n\n\ndef tier1_check(snapshot: dict) -> dict:\n    \"\"\"\n    Pure Python SEO checks. Zero API calls.\n\n    Returns a result dict with method=\"deterministic\".\n    Sets needs_tier3=False always \u2014 Tier 1 never escalates to Tier 3 directly.\n    Escalation to Tier 2 is decided by the router, not here.\n    \"\"\"\n    result = _build_result(snapshot, \"deterministic\")\n\n    title = snapshot.get(\"title\") or \"\"\n    description = snapshot.get(\"meta_description\") or \"\"\n    h1s = snapshot.get(\"h1s\") or []\n    canonical = snapshot.get(\"canonical\") or \"\"\n\n    # Title check\n    result[\"title\"][\"value\"] = title or None\n    result[\"title\"][\"length\"] = len(title)\n    if not title or len(title) > 60:\n        result[\"title\"][\"status\"] = \"FAIL\"\n        msg = \"Title is missing\" if not title else f\"Title is {len(title)} characters (max 60)\"\n        result[\"flags\"].append(msg)\n\n    # Description check\n    result[\"description\"][\"value\"] = description or None\n    result[\"description\"][\"length\"] = len(description)\n    if not description or len(description) > 160:\n        result[\"description\"][\"status\"] = \"FAIL\"\n        msg = \"Meta description is missing\" if not description else f\"Meta description is {len(description)} characters (max 160)\"\n        result[\"flags\"].append(msg)\n\n    # H1 check\n    result[\"h1\"][\"count\"] = len(h1s)\n    result[\"h1\"][\"value\"] = h1s[0] if h1s else None\n    if len(h1s) == 0:\n        result[\"h1\"][\"status\"] = \"FAIL\"\n        result[\"flags\"].append(\"H1 tag is missing\")\n    elif len(h1s) > 1:\n        result[\"h1\"][\"status\"] = \"FAIL\"\n        result[\"flags\"].append(f\"Multiple H1 tags found ({len(h1s)})\")\n\n    # Canonical check\n    result[\"canonical\"][\"value\"] = canonical or None\n    if not canonical:\n        result[\"canonical\"][\"status\"] = \"FAIL\"\n        result[\"flags\"].append(\"Canonical tag is missing\")\n\n    return result\n<\/code><\/pre>\n<p>\u06a9\u0644\u06cc\u062f\u06cc \u0688\u06cc\u0632\u0627\u0626\u0646 \u0641\u06cc\u0635\u0644\u06d2: <code>tier1_check()<\/code> \u0622\u067e \u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u06a9\u06c1 \u0628\u0691\u06be\u0646\u0627 \u06c1\u06d2 \u06cc\u0627 \u0646\u06c1\u06cc\u06ba\u06d4 \u0628\u0633 \u0686\u06cc\u06a9 \u0686\u0644\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0648\u0627\u067e\u0633 \u06a9\u0631\u06cc\u06ba\u06d4 \u0631\u0627\u0624\u0679\u0631 \u0646\u062a\u0627\u0626\u062c \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u0627\u0636\u0627\u0641\u06c1 \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-tier-2-claude-haiku-for-ambiguous-cases\">\u0679\u0627\u0626\u0631 2: \u0645\u0628\u06c1\u0645 \u0645\u0642\u062f\u0645\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0644\u0627\u0688 \u06c1\u0627\u0626\u06cc\u06a9\u0648<\/h2>\n<p>\u0679\u0627\u0626\u0631 2 \u06a9\u0648 \u0627\u0633 \u0648\u0642\u062a \u0645\u062a\u062d\u0631\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0679\u0627\u0626\u0631 1 \u06a9\u0648 \u06a9\u0633\u06cc \u0645\u06cc\u06a9\u0627\u0646\u06cc\u06a9\u0644 \u0645\u0633\u0626\u0644\u06c1 \u06a9\u0627 \u067e\u062a\u06c1 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u062f\u0648 \u0628\u0627\u0631 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0686\u0627\u0631 \u062d\u0631\u0641\u06cc \u0639\u0646\u0648\u0627\u0646 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u063a\u0644\u0637 \u06c1\u06d2\u06d4 \u06cc\u06c1 30 \u062d\u0631\u0648\u0641 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644 \u06c1\u06d2 \u062c\u0648 \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062f\u0631\u0633\u062a \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0628\u06cc\u06a9\u0627\u0631 \u06c1\u06d2\u06d4 \u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0634\u0646 \u06a9\u06cc \u062d\u0627\u0644\u062a \u062c\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646\u0633\u0627\u0646\u06cc \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0648\u0636\u0627\u062d\u062a \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0627\u0626\u06cc\u06a9\u0648 \u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u0645\u0646\u0627\u0633\u0628 \u0646\u0645\u0648\u0646\u06c1 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u06cc\u0632\u060c \u0633\u0633\u062a\u0627 \u06c1\u06d2 (\\(1 \u0627\u0646 \u067e\u0679\/\\)5 \u0622\u0624\u0679 \u067e\u0679 \u0641\u06cc \u0645\u0644\u06cc\u0646 \u0679\u0648\u06a9\u0646\u0632) \u0627\u0648\u0631 \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u06cc \u0633\u0637\u062d \u06a9\u06d2 \u062a\u0639\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u06c1\u06d2\u06d4 \u067e\u0631\u0627\u0645\u067e\u0679 \u0627\u06cc\u06a9 \u062a\u0646\u06af \u0633\u0648\u0627\u0644 \u067e\u0648\u0686\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06cc\u0627 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0633\u0627\u0646\u06cc\u0679 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0645\u0628\u06c1\u0645 \u06c1\u06d2\u061f<\/p>\n<pre><code class=\"language-python\">def tier2_check(snapshot: dict) -> dict:\n    \"\"\"\n    Claude Haiku call for ambiguous cases.\n\n    Returns result with method=\"haiku\".\n    Sets needs_tier3=True if Haiku determines the case needs semantic judgment.\n    Falls back to Tier 1 result on API error.\n    \"\"\"\n    api_key = os.environ.get(\"ANTHROPIC_API_KEY\")\n    if not api_key:\n        raise OSError(\"ANTHROPIC_API_KEY is not set.\")\n\n    client = anthropic.Anthropic(api_key=api_key)\n\n    title = snapshot.get(\"title\") or \"\"\n    description = snapshot.get(\"meta_description\") or \"\"\n    status_code = snapshot.get(\"status_code\")\n\n    prompt = f\"\"\"You are an SEO auditor doing a quick triage check.\n\nPage data:\n- Title: {repr(title)} ({len(title)} chars)\n- Meta description: {repr(description)} ({len(description)} chars)\n- Status code: {status_code}\n\nAnswer these two questions with only \"yes\" or \"no\":\n1. Does this page need semantic judgment beyond simple length\/presence checks? \n   (e.g. title is present but clearly wrong, description is present but meaningless)\n2. Is the status code a redirect that needs investigation?\n\nRespond in this exact JSON format and nothing else:\n{{\"needs_tier3\": true_or_false, \"reason\": \"one sentence explanation\"}}\"\"\"\n\n    try:\n        response = client.messages.create(\n            model=\"claude-haiku-4-5-20251001\",\n            max_tokens=150,\n            messages=[{\"role\": \"user\", \"content\": prompt}],\n        )\n        raw = response.content[0].text.strip()\n        # Strip markdown fences if present\n        if raw.startswith(\"```\"):\n            lines = raw.splitlines()\n            raw = \"\\n\".join(lines[1:-1] if lines[-1].strip() == \"```\" else lines[1:])\n        parsed = json.loads(raw)\n\n        result = _build_result(snapshot, \"haiku\")\n        # Copy Tier 1 field checks \u2014 Haiku doesn't redo those\n        t1 = tier1_check(snapshot)\n        result[\"title\"] = t1[\"title\"]\n        result[\"description\"] = t1[\"description\"]\n        result[\"h1\"] = t1[\"h1\"]\n        result[\"canonical\"] = t1[\"canonical\"]\n        result[\"flags\"] = t1[\"flags\"]\n        result[\"needs_tier3\"] = parsed.get(\"needs_tier3\", False)\n        if result[\"needs_tier3\"]:\n            result[\"flags\"].append(f\"Escalated to Tier 3: {parsed.get('reason', '')}\")\n\n        return result\n\n    except Exception as exc:\n        logger.warning(\"[tier2] Haiku API error: %s \u2014 falling back to Tier 1 result\", exc)\n        fallback = tier1_check(snapshot)\n        fallback[\"method\"] = \"haiku-fallback\"\n        return fallback\n<\/code><\/pre>\n<p>\u0641\u0627\u0644 \u0628\u06cc\u06a9 \u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06c1\u0627\u0626\u06cc\u06a9\u0648 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2 (\u0634\u0631\u062d \u06a9\u06cc \u062d\u062f\u060c \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u06a9\u06cc \u062e\u0631\u0627\u0628\u06cc\u060c \u063a\u0644\u0637 \u062c\u0648\u0627\u0628)\u060c \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0631\u06cc\u0634 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0679\u0627\u0626\u0631 1 \u06a9\u0627 \u0646\u062a\u06cc\u062c\u06c1 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0634\u06a9\u0631 \u06af\u0632\u0627\u0631\u06cc \u062c\u0627\u0631\u06cc \u06c1\u06d2\u06d4 URL \u0627\u0633 \u0637\u0631\u062d \u0646\u0638\u0631 \u0622\u0626\u06d2 \u06af\u0627: <code>method=\"haiku-fallback\"<\/code> \u062a\u0627\u06a9\u06c1 \u0622\u067e \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0631 \u0633\u06a9\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-tier-3-claude-sonnet-for-semantic-judgment\">\u0679\u0627\u0626\u0631 3: \u0633\u06cc\u0645\u0646\u0679\u06a9 \u062c\u062c\u0645\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0644\u0627\u0688 \u06a9\u06d2 \u0633\u0648\u0646\u06cc\u0679<\/h2>\n<p>\u0679\u0627\u0626\u0631 3 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0645\u06a9\u0645\u0644 \u0646\u06a9\u0627\u0644\u0646\u06d2 \u06a9\u0627 \u0627\u0634\u0627\u0631\u06c1 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u06c1\u06cc \u06a9\u0627\u0644 \u06c1\u06d2 \u062c\u0648 \u0633\u0627\u062f\u06c1 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u06d2 \u06af\u06cc\u06d4 \u0641\u0631\u0642 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 URLs \u06a9\u0627 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u062d\u0635\u06c1 \u0627\u0633 \u067e\u0631\u062a \u062a\u06a9 \u067e\u06c1\u0646\u0686\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">def tier3_check(snapshot: dict) -> dict:\n    \"\"\"\n    Claude Sonnet call for semantic judgment.\n\n    Returns result with method=\"sonnet\".\n    This is the full extraction prompt \u2014 same as calling the model directly.\n    \"\"\"\n    api_key = os.environ.get(\"ANTHROPIC_API_KEY\")\n    if not api_key:\n        raise OSError(\"ANTHROPIC_API_KEY is not set.\")\n\n    client = anthropic.Anthropic(api_key=api_key)\n\n    prompt = f\"\"\"You are an SEO auditor. Analyze this page snapshot and return ONLY a JSON object.\nNo prose. No explanation. No markdown fences. Raw JSON only.\n\nPage data:\n- URL: {snapshot.get('final_url')}\n- Status code: {snapshot.get('status_code')}\n- Title: {snapshot.get('title')}\n- Meta description: {snapshot.get('meta_description')}\n- H1 tags: {snapshot.get('h1s')}\n- Canonical: {snapshot.get('canonical')}\n\nReturn this exact schema:\n{{\n  \"url\": \"string\",\n  \"final_url\": \"string\",\n  \"status_code\": number,\n  \"title\": {{\"value\": \"string or null\", \"length\": number, \"status\": \"PASS or FAIL\"}},\n  \"description\": {{\"value\": \"string or null\", \"length\": number, \"status\": \"PASS or FAIL\"}},\n  \"h1\": {{\"count\": number, \"value\": \"string or null\", \"status\": \"PASS or FAIL\"}},\n  \"canonical\": {{\"value\": \"string or null\", \"status\": \"PASS or FAIL\"}},\n  \"flags\": [\"array of strings describing specific issues\"],\n  \"human_review\": false,\n  \"audited_at\": \"ISO timestamp\"\n}}\n\nPASS\/FAIL rules:\n- title: FAIL if null or length > 60 characters, or if present but clearly not a real title\n- description: FAIL if null or length > 160 characters, or if present but meaningless\n- h1: FAIL if count is 0 or count > 1\n- canonical: FAIL if null\n- audited_at: use current UTC time\"\"\"\n\n    try:\n        response = client.messages.create(\n            model=\"claude-sonnet-4-20250514\",\n            max_tokens=1000,\n            messages=[{\"role\": \"user\", \"content\": prompt}],\n        )\n        raw = response.content[0].text.strip()\n        if raw.startswith(\"```\"):\n            lines = raw.splitlines()\n            raw = \"\\n\".join(lines[1:-1] if lines[-1].strip() == \"```\" else lines[1:])\n\n        result = json.loads(raw)\n        result[\"method\"] = \"sonnet\"\n        result[\"needs_tier3\"] = False\n        return result\n\n    except Exception as exc:\n        logger.warning(\"[tier3] Sonnet API error: %s \u2014 falling back to Tier 1 result\", exc)\n        fallback = tier1_check(snapshot)\n        fallback[\"method\"] = \"sonnet-fallback\"\n        return fallback\n<\/code><\/pre>\n<p>\u0679\u0627\u0626\u0631 3 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u067e\u0631\u0627\u0645\u067e\u0679 \u06a9\u0627 \u0627\u0636\u0627\u0641\u06c1 \u0646\u0648\u0679 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u0679\u0627\u0626\u0631 1 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>\"or if present but clearly not a real title\"<\/code> \u0627\u0648\u0631 <code>\"or if present but meaningless\"<\/code>. \u06cc\u06c1 \u06c1\u0627\u0626\u06cc\u06a9\u0648 \u06a9\u0627 \u0627\u06cc\u06a9 \u0645\u0639\u0646\u0648\u06cc \u0641\u06cc\u0635\u0644\u06c1 \u06c1\u06d2 \u062c\u0633\u06d2 \u0636\u0631\u0648\u0631\u06cc \u0633\u0645\u062c\u06be\u0627 \u06af\u06cc\u0627\u06d4 \u0679\u0627\u0626\u0631 3 \u0627\u0633 \u067e\u0631 \u0627\u06cc\u06a9\u0634\u0646 \u0644\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-the-router-auditurl\">\u0631\u0627\u0624\u0679\u0631: audit_url()<\/h2>\n<p>\u0631\u0648\u0679\u0631 \u0627\u06cc\u06a9 \u0639\u0648\u0627\u0645\u06cc \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06c1\u06d2\u06d4 \u0628\u0627\u0642\u06cc \u0633\u0628 \u06a9\u0686\u06be \u0646\u0641\u0627\u0630 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">def audit_url(snapshot: dict, tiered: bool = False) -> dict:\n    \"\"\"\n    Route a page snapshot through the appropriate audit tier.\n\n    Args:\n        snapshot: Page data from browser.py \u2014 must contain final_url,\n                  status_code, title, meta_description, h1s, canonical.\n        tiered: If False, delegates directly to Tier 3 (Sonnet).\n                If True, routes through the cost curve.\n\n    Returns:\n        Audit result dict with method field indicating which tier ran.\n    \"\"\"\n    if not tiered:\n        # Non-tiered mode: call Sonnet directly, same as v1 behavior\n        return tier3_check(snapshot)\n\n    # Tier 1: always runs first\n    t1_result = tier1_check(snapshot)\n\n    # Check if escalation to Tier 2 is warranted\n    title = snapshot.get(\"title\") or \"\"\n    description = snapshot.get(\"meta_description\") or \"\"\n    status_code = snapshot.get(\"status_code\")\n\n    needs_tier2 = (\n        # Title present but suspiciously short\n        (title and len(title) < AMBIGUOUS_TITLE_MAX) or\n        # Description present but suspiciously short\n        (description and len(description) < AMBIGUOUS_DESC_MAX) or\n        # Redirect status \u2014 may need explanation\n        (status_code in REDIRECT_CODES)\n    )\n\n    if not needs_tier2:\n        # Tier 1 result is definitive \u2014 return without any API call\n        return t1_result\n\n    # Tier 2: Haiku triage\n    t2_result = tier2_check(snapshot)\n\n    if not t2_result.get(\"needs_tier3\", False):\n        # Haiku determined no semantic judgment needed\n        return t2_result\n\n    # Tier 3: Sonnet for semantic judgment\n    return tier3_check(snapshot)\n<\/code><\/pre>\n<p>\u0631\u0627\u0624\u0679\u0631 \u0645\u0646\u0637\u0642 \u0648\u0627\u0636\u062d \u0627\u0648\u0631 \u067e\u0691\u06be\u0646\u06d2 \u0645\u06cc\u06ba \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u06c1\u0631 \u0641\u06cc\u0635\u0644\u06c1 \u0646\u0642\u0637\u06c1 \u0627\u06cc\u06a9 \u0646\u0627\u0645\u0632\u062f \u0634\u0631\u0637 \u06c1\u06d2\u06d4 \u062c\u0628 <code>tiered=False<\/code>\u0637\u0631\u0632 \u0639\u0645\u0644 v1 \u06a9\u06d2 \u0633\u0627\u062f\u06c1 \u0646\u0641\u0627\u0630 \u0633\u06d2 \u0645\u0645\u0627\u062b\u0644 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u067e\u0633\u0645\u0627\u0646\u062f\u06c1 \u0645\u0637\u0627\u0628\u0642\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0645\u0648\u062c\u0648\u062f\u06c1 \u0622\u0688\u0679 \u0645\u06cc\u06ba \u062e\u0644\u0644 \u0688\u0627\u0644\u06d2 \u0628\u063a\u06cc\u0631 \u0644\u0627\u06af\u062a \u06a9\u06d2 \u0645\u0646\u062d\u0646\u06cc \u062e\u0637\u0648\u0637 \u06a9\u0648 \u0628\u062a\u062f\u0631\u06cc\u062c \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-graceful-fallback\">\u062e\u0648\u0628\u0635\u0648\u0631\u062a \u0645\u062a\u0628\u0627\u062f\u0644<\/h2>\n<p>\u0645\u062a\u0628\u0627\u062f\u0644 \u067e\u06cc\u0679\u0631\u0646 \u0679\u0627\u0626\u0631 2 \u0627\u0648\u0631 \u0679\u0627\u0626\u0631 3 \u062f\u0648\u0646\u0648\u06ba \u0645\u06cc\u06ba \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0628\u062a\u0627\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-python\"># Pattern used in both tier2_check() and tier3_check()\nexcept Exception as exc:\n    logger.warning(\"[tierN] API error: %s \u2014 falling back to Tier 1 result\", exc)\n    fallback = tier1_check(snapshot)\n    fallback[\"method\"] = \"tierN-fallback\"\n    return fallback\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0641\u0646\u06a9\u0634\u0646 \u062a\u06cc\u0646 \u0686\u06cc\u0632\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2:<\/p>\n<ol>\n<li>\n<p>\u0628\u0639\u062f \u0645\u06cc\u06ba \u0688\u06cc\u0628\u06af\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0648 \u0644\u0627\u06af \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u06a9 \u062f\u0631\u0633\u062a \u0646\u062a\u06cc\u062c\u06c1 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0679\u0627\u0626\u0631 1 \u06a9\u06d2 \u062a\u0639\u06cc\u0646 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06c1\u0645\u06cc\u0634\u06c1 \u0627\u0633 \u0633\u06d2 \u0642\u0637\u0639 \u0646\u0638\u0631 \u0686\u0644\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u067e\u0646\u06d2 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0645\u062a\u0628\u0627\u062f\u0644 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0679\u06cc\u06af \u06a9\u0631\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u0622\u067e \u0627\u0646\u06c1\u06cc\u06ba \u0627\u067e\u0646\u06cc \u0631\u067e\u0648\u0631\u0679\u0633 \u0645\u06cc\u06ba \u0641\u0644\u0679\u0631 \u06a9\u0631 \u0633\u06a9\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>API \u06a9\u06cc \u062e\u0631\u0627\u0628\u06cc \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06a9\u0631\u06cc\u0634 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0627\u06cc\u062c\u0646\u0679 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0648\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u062c\u0648 \u062e\u0648\u0628\u0635\u0648\u0631\u062a\u06cc \u0633\u06d2 \u062a\u0646\u0632\u0644\u06cc \u0627\u0648\u0631 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<h2 id=\"heading-testing-the-cost-curve\">\u0644\u0627\u06af\u062a \u0648\u06a9\u0631 \u0679\u06cc\u0633\u0679\u0646\u06af<\/h2>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>test_cost_curve.py<\/code> \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 API \u06a9\u0627\u0644 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0631\u0648\u0679\u0646\u06af \u06a9\u06d2 \u0631\u0648\u06cc\u06d2 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2:<\/p>\n<pre><code class=\"language-python\">import json\nfrom unittest import mock\n\nfrom cost_curve import audit_url, tier1_check\n\n\ndef make_snapshot(title=\"Normal Title Under 60 Chars\",\n                  description=\"A normal meta description that is under 160 characters and describes the page content well.\",\n                  h1s=[\"Single H1\"],\n                  canonical=\"https:\/\/example.com\/page\",\n                  status_code=200,\n                  final_url=\"https:\/\/example.com\/page\"):\n    return {\n        \"title\": title,\n        \"meta_description\": description,\n        \"h1s\": h1s,\n        \"canonical\": canonical,\n        \"status_code\": status_code,\n        \"final_url\": final_url,\n    }\n\n\ndef test_clean_page_returns_tier1_no_api_calls():\n    \"\"\"Clean page: all checks pass deterministically \u2014 no API call.\"\"\"\n    snapshot = make_snapshot()\n    with mock.patch(\"anthropic.Anthropic\") as mock_client:\n        result = audit_url(snapshot, tiered=True)\n        assert result[\"method\"] == \"deterministic\"\n        mock_client.assert_not_called()\n    print(\"PASS: clean page \u2192 Tier 1, zero API calls\")\n\n\ndef test_long_title_returns_tier1_fail_no_api_call():\n    \"\"\"Title >60 chars: FAIL from Tier 1, no API call.\"\"\"\n    snapshot = make_snapshot(title=\"A\" * 70)\n    with mock.patch(\"anthropic.Anthropic\") as mock_client:\n        result = audit_url(snapshot, tiered=True)\n        assert result[\"method\"] == \"deterministic\"\n        assert result[\"title\"][\"status\"] == \"FAIL\"\n        mock_client.assert_not_called()\n    print(\"PASS: title >60 \u2192 Tier 1 FAIL, zero API calls\")\n\n\ndef test_suspiciously_short_title_escalates_to_tier2():\n    \"\"\"Title present but 4 chars: escalates to Tier 2.\"\"\"\n    snapshot = make_snapshot(title=\"SEO\")  # 3 chars \u2014 under AMBIGUOUS_TITLE_MAX\n    mock_response = mock.MagicMock()\n    mock_response.content = [mock.MagicMock(\n        text=\"{\"needs_tier3\": false, \"reason\": \"title is short but not ambiguous\"}\"\n    )]\n    with mock.patch(\"anthropic.Anthropic\") as mock_client:\n        mock_client.return_value.messages.create.return_value = mock_response\n        result = audit_url(snapshot, tiered=True)\n        assert result[\"method\"] == \"haiku\"\n        assert mock_client.return_value.messages.create.call_count == 1\n    print(\"PASS: short title \u2192 Tier 2 (Haiku called once)\")\n\n\ndef test_tiered_false_calls_sonnet_directly():\n    \"\"\"tiered=False: Sonnet called regardless of snapshot content.\"\"\"\n    snapshot = make_snapshot()  # clean page, would be Tier 1 in tiered mode\n    mock_response = mock.MagicMock()\n    mock_response.content = [mock.MagicMock(text=json.dumps({\n        \"url\": \"https:\/\/example.com\/page\",\n        \"final_url\": \"https:\/\/example.com\/page\",\n        \"status_code\": 200,\n        \"title\": {\"value\": \"Normal Title Under 60 Chars\", \"length\": 27, \"status\": \"PASS\"},\n        \"description\": {\"value\": \"desc\", \"length\": 4, \"status\": \"PASS\"},\n        \"h1\": {\"count\": 1, \"value\": \"Single H1\", \"status\": \"PASS\"},\n        \"canonical\": {\"value\": \"https:\/\/example.com\/page\", \"status\": \"PASS\"},\n        \"flags\": [],\n        \"human_review\": False,\n        \"audited_at\": \"2026-04-01T00:00:00+00:00\",\n    }))]\n    with mock.patch(\"anthropic.Anthropic\") as mock_client:\n        mock_client.return_value.messages.create.return_value = mock_response\n        result = audit_url(snapshot, tiered=False)\n        assert result[\"method\"] == \"sonnet\"\n        assert mock_client.return_value.messages.create.call_count == 1\n    print(\"PASS: tiered=False \u2192 Sonnet called directly\")\n\n\ndef test_haiku_api_failure_falls_back_to_tier1():\n    \"\"\"Haiku failure: falls back to Tier 1 result, no crash.\"\"\"\n    snapshot = make_snapshot(title=\"SEO\")  # triggers Tier 2\n    with mock.patch(\"anthropic.Anthropic\") as mock_client:\n        mock_client.return_value.messages.create.side_effect = Exception(\"rate limit\")\n        result = audit_url(snapshot, tiered=True)\n        assert result[\"method\"] == \"haiku-fallback\"\n    print(\"PASS: Haiku failure \u2192 fallback to Tier 1, no crash\")\n\n\nif __name__ == \"__main__\":\n    test_clean_page_returns_tier1_no_api_calls()\n    test_long_title_returns_tier1_fail_no_api_call()\n    test_suspiciously_short_title_escalates_to_tier2()\n    test_tiered_false_calls_sonnet_directly()\n    test_haiku_api_failure_falls_back_to_tier1()\n    print(\"\\nAll tests passed.\")\n<\/code><\/pre>\n<p>\u0686\u0644\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-bash\">python test_cost_curve.py\n<\/code><\/pre>\n<p>\u0645\u062a\u0648\u0642\u0639 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631:<\/p>\n<pre><code class=\"language-plaintext\">PASS: clean page \u2192 Tier 1, zero API calls\nPASS: title >60 \u2192 Tier 1 FAIL, zero API calls\nPASS: short title \u2192 Tier 2 (Haiku called once)\nPASS: tiered=False \u2192 Sonnet called directly\nPASS: Haiku failure \u2192 fallback to Tier 1, no crash\n<\/code><\/pre>\n<h2 id=\"heading-applying-this-pattern-to-your-agent\">\u0627\u0633 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0644\u0627\u06af\u062a \u06a9\u0627 \u0648\u06a9\u0631 SEO \u062a\u06a9 \u0645\u062d\u062f\u0648\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0645\u062e\u0644\u0648\u0637 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0627\u06cc\u062c\u0646\u0679 \u0627\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0635\u0648\u0644: \u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u06a9\u0633 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u060c \u0622\u067e \u06a9\u0648 \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0636\u0631\u0648\u0631\u062a \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u06a9\u0627\u0645\u0648\u06ba \u06a9\u06cc \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u06a9\u0633\u0679\u0645\u0631 \u0633\u067e\u0648\u0631\u0679 \u0631\u0627\u0628\u0637\u06c1:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0679\u0627\u0626\u0631 1: \u0645\u0637\u0644\u0648\u0628\u06c1 \u0627\u0644\u0641\u0627\u0638 \u0645\u0639\u0644\u0648\u0645 \u0627\u06a9\u062b\u0631 \u067e\u0648\u0686\u06be\u06d2 \u06af\u0626\u06d2 \u0633\u0648\u0627\u0644\u0627\u062a \u06a9\u06d2 \u0639\u0646\u0648\u0627\u0646\u0627\u062a \u0633\u06d2 \u0645\u0645\u0627\u062b\u0644 \u06c1\u06cc\u06ba - \u06a9\u0648\u0626\u06cc \u0645\u0627\u0688\u0644 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u067e\u0631\u062a 2: \u0645\u0628\u06c1\u0645 \u0633\u0648\u0627\u0644\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0631\u0627\u062f\u06d2 \u06a9\u06cc \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0627\u0626\u06cc\u06a9\u0648\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0626\u0631 3: \u067e\u06cc\u0686\u06cc\u062f\u06c1 \u0634\u06a9\u0627\u06cc\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0648\u0646\u06cc\u0679 \u062c\u0646 \u0645\u06cc\u06ba \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u06a9\u0648\u0688 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0646\u06d2 \u0648\u0627\u0644\u0627:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0679\u0627\u0626\u0631 1: \u0644\u0646\u0679 \u06a9\u06d2 \u0642\u0648\u0627\u0639\u062f\u060c \u0646\u062d\u0648 \u06a9\u06cc \u062c\u0627\u0646\u0686 - \u06a9\u0648\u0626\u06cc \u0645\u0627\u0688\u0644 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0626\u0631 2: \u0639\u0627\u0645 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0627\u0626\u06cc\u06a9\u0648<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0626\u0631 3: \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631\u0644 \u0631\u06cc\u0648\u06cc\u0648 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0648\u0646\u06cc\u0679<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0645\u0648\u0627\u062f \u0645\u0627\u0688\u0631\u06cc\u0634\u0646 \u0627\u06cc\u062c\u0646\u0679:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0679\u0627\u0626\u0631 1: \u0628\u0644\u0627\u06a9 \u0644\u0633\u0679 \u0645\u06cc\u0686 - \u06a9\u0648\u0626\u06cc \u0645\u0627\u0688\u0644 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0626\u0631 2: \u0628\u0627\u0631\u0688\u0631 \u0644\u0627\u0626\u0646 \u06a9\u06cc\u0633\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0627\u0626\u06cc\u06a9\u0633<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0626\u0631 3: \u062d\u0627\u0644\u0627\u062a \u06a9\u06d2 \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0648\u0646\u06cc\u0679<\/p>\n<\/li>\n<\/ul>\n<p>\u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u062a\u06cc\u0646\u0648\u06ba \u0635\u0648\u0631\u062a\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06a9\u0633\u0627\u06ba \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>audit_url()<\/code> \u0631\u0627\u0624\u0679\u0631 \u06c1\u06d2\u06d4 <code>route_task()<\/code>. \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u06cc \u062e\u0635\u0648\u0635\u06cc\u062a \u0627\u0634\u0627\u0631\u06d2 \u0627\u0648\u0631 \u0627\u0636\u0627\u0641\u06d2 \u06a9\u06d2 \u062d\u0627\u0644\u0627\u062a \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0641\u0627\u0644 \u0628\u06cc\u06a9 \u0645\u0646\u0637\u0642 \u0648\u06c1\u06cc \u0631\u06c1\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648\u0688 \u0644\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u067e\u0648\u0686\u06be\u0646\u0627 \u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u0633\u0648\u0627\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0646 \u067e\u0679 \u06a9\u0627 \u06a9\u062a\u0646\u0627 \u062d\u0635\u06c1 \u0645\u06cc\u06a9\u0627\u0646\u06a9\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062d\u0644 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u06c1 \u062d\u0635\u06c1 \u0679\u0627\u0626\u0631 1 \u0645\u06cc\u06ba \u062c\u0627\u0626\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0628\u0627\u0642\u06cc \u06a9\u0648 \u0628\u0691\u06be\u0627 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0644\u0627\u06af\u062a \u06a9\u0627 \u0648\u06a9\u0631 \u0628\u0627\u0642\u06cc \u0633\u0628 \u06a9\u0686\u06be \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-wrapping-up\">\u062e\u062a\u0645<\/h2>\n<p>\u0627\u0633 \u0645\u0627\u0688\u06cc\u0648\u0644 \u06a9\u0648 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 SEO \u0622\u0688\u0679 \u0627\u06cc\u062c\u0646\u0679 \u0633\u0645\u06cc\u062a \u0645\u06a9\u0645\u0644 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f\u060c dannwaneri\/seo-agent \u067e\u0631 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>core\/<\/code> \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc MIT \u0644\u0627\u0626\u0633\u0646\u0633 \u06cc\u0627\u0641\u062a\u06c1 \u06c1\u06d2\u06d4 \u067e\u0631\u062a\u0648\u06ba \u0648\u0627\u0644\u06cc \u0631\u0648\u0679\u0646\u06af \u06c1\u06d2\u06d4 <code>premium\/cost_curve.py<\/code>.<\/p>\n<p><em>\u06cc\u06c1 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be\u06cc \u062d\u0635\u06c1 \u06c1\u06d2 \u062c\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2:<\/em> \u0645\u06cc\u06ba SEO \u0622\u0688\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u06cc \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 0.006\\)0 \u0627\u062f\u0627 \u06a9\u0631 \u0631\u06c1\u0627 \u062a\u06be\u0627 \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u0645\u062c\u06be\u06d2 \u0627\u062d\u0633\u0627\u0633 \u06c1\u0648\u0627 \u06a9\u06c1 \u0645\u062c\u06be\u06d2 \u0627\u0633 \u06a9\u06cc \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\\)0 <em>DEV.to \u0644\u0627\u06af\u062a \u06a9\u06d2 \u0648\u06a9\u0631 \u06a9\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/em><\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 AI \u0627\u06cc\u062c\u0646\u0679 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644\u0632 \u0627\u06cc\u06a9 \u06c1\u06cc \u063a\u0644\u0637\u06cc \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u0639\u0646\u06cc\u060c \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u062f\u0633\u062a\u06cc\u0627\u0628 \u0645\u06c1\u0646\u06af\u06d2 \u062a\u0631\u06cc\u0646 \u0645\u0627\u0688\u0644 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0631\u06cc\u06a9\u0679\u0631 \u06af\u0646\u062a\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 GPT-4 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0633\u0648\u0646\u06cc\u0679 \u06a9\u06cc \u0645\u0648\u062c\u0648\u062f\u06af\u06cc \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0631\u06cc\u06af\u0648\u0644\u0631 \u0627\u06cc\u06a9\u0633\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u0627\u0632\u06af\u0631 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u063a\u0644\u0637\u06cc \u0627\u06d2 \u0622\u0626\u06cc \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-22188","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/22188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=22188"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/22188\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=22188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=22188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=22188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}