أُطلق Claude Sonnet 5 في 30 يونيو 2026 باعتباره أقوى نماذج Sonnet على الإطلاق لأعباء العمل الوكيلة. إذ يسجّل 63.2% على معايير البرمجة الوكيلة — ارتفاعاً من 58.1% للنموذج Sonnet 4.6 — ليقترب من Opus 4.8 الذي يحقق 69.2%، لكن بتكلفة أقل بكثير. حتى 31 أغسطس 2026، يبلغ التسعير التمهيدي 2 دولار لكل مليون رمز مدخل و10 دولارات لكل مليون رمز مخرج، مما يجعل هذه اللحظة مثالية لترحيل خطوط أنابيب الوكيل التي كانت تعمل سابقاً على Opus.
يرشدك هذا الدليل عبر المكدّس الكامل: إعداد المشروع، وإتمام المحادثات الأساسية، والبث، واستدعاء الأدوات، وحلقة وكيل جاهزة للإنتاج. يستخدم كل شيء حزمة Anthropic TypeScript SDK الرسمية ويعمل مقابل واجهة برمجة التطبيقات المستضافة — لا حاجة لأي وحدة معالجة رسومات.
المتطلبات الأساسية
قبل البدء، تأكد من توفر ما يلي:
- Node.js 20+ (
node --version) - إلمام أساسي بـ TypeScript و
async/await - حساب Anthropic بمفتاح API من console.anthropic.com
- محرر أكواد — يُنصح بـ VS Code
لا تحتاج إلى أي أجهزة GPU. جميع الطلبات تذهب إلى واجهة برمجة Anthropic المستضافة.
ما ستبنيه
بنهاية هذا الدليل ستمتلك:
- عميل Anthropic مكتوب بأنواع بيانات ومضبوطاً لـ
claude-sonnet-5. - دالة إتمام محادثة مع معالجة أخطاء مناسبة.
- غلاف بث يطبع الرموز فور وصولها.
- طبقة استدعاء الأدوات مع تطبيقات أدوات نظام الملفات.
- حلقة وكيل كاملة تكرر حتى يُشير النموذج إلى الانتهاء.
- متتبع استخدام يحسب التكلفة وفق التسعير التمهيدي.
المشروع النهائي نحو 200 سطر من TypeScript — صغير بما يكفي للفهم الكامل، وكبير بما يكفي ليكون قالباً حقيقياً.
فهم Claude Sonnet 5
نظرة سريعة على النموذج قبل كتابة أي كود.
ما الذي تغيّر منذ Sonnet 4.6
يقدّم Sonnet 5 محلل رموز جديداً. لمعظم النصوص الإنجليزية، تبلغ نسبة التوسع 1.0 تقريباً، لكن للمحتوى الكثيف بالأكواد أو متعدد اللغات قد تصل إلى 1.35 — مما يعني أن الطلب ذاته يستخدم ما يصل إلى 35% رموزاً أكثر من Sonnet 4.6. لا يؤثر هذا على الجودة؛ بل يعكس إعادة تدريب المحلل لمفردات أشمل. التداعي العملي: احرص دائماً على قياس عدد الرموز مقابل واجهة البرمجة الحية بدلاً من الاعتماد على تقديرات Sonnet 4.6.
شُدّدت إعدادات السلامة أيضاً. انخفضت معدلات التزلف والهلوسة، وأصبحت الضمانات الإلكترونية مفعّلة افتراضياً. ستلاحظ أن Sonnet 5 يرفض الطلبات الحدّية برفضاً أكثر حسماً — وهذا مقصود ومتسق عبر جميع عملاء API.
التسعير خلال نافذة التمهيد
| المستوى | المدخلات | المخرجات |
|---|---|---|
| التمهيدي (حتى 2026-08-31) | 2 دولار / مليون رمز | 10 دولار / مليون رمز |
| القياسي (من 2026-09-01) | 3 دولار / مليون رمز | 15 دولار / مليون رمز |
يكلّف Opus 4.8 ما يعادل 5-7 أضعاف تقريباً لكل رمز. إن كانت لديك خطوط أنابيب وكيل على Opus، فالنافذة التمهيدية فرصة ممتازة لتقييم الترحيل إلى Sonnet 5.
معرّف النموذج
المعرّف في API هو claude-sonnet-5. على Amazon Bedrock يكون ملف استدلال عبر المناطق هو us.anthropic.claude-sonnet-5-20260630-v1:0 — تحقق من وحدة تحكم Bedrock لتوافر منطقتك. في Claude Code، النموذج متاح بالفعل كنموذج افتراضي لمستويي Free وPro اعتباراً من 1 يوليو 2026.
الخطوة 1: إعداد المشروع
أنشئ مشروع TypeScript جديداً وثبّت حزمة Anthropic SDK.
mkdir sonnet5-agent && cd sonnet5-agent
npm init -y
npm install @anthropic-ai/sdk
npm install -D typescript tsx @types/node
npx tsc --init --target ES2022 --module NodeNext --moduleResolution NodeNext --strictأنشئ ملف .env لمفتاح API:
echo "ANTHROPIC_API_KEY=sk-ant-..." > .envأضف سكريبت تطوير إلى package.json:
{
"scripts": {
"dev": "tsx --env-file=.env src/index.ts",
"test": "node --test --import tsx/esm --env-file=.env src/agent.test.ts"
}
}هيكل المجلد النهائي:
sonnet5-agent/
├── src/
│ ├── client.ts
│ ├── tools.ts
│ ├── agent.ts
│ ├── agent.test.ts
│ └── index.ts
├── .env
├── package.json
└── tsconfig.json
الخطوة 2: العميل المكتوب بالأنواع وأول إتمام
أنشئ src/client.ts مع سينغلتون عميل مشترك وغلاف محادثة بسيط:
import Anthropic from "@anthropic-ai/sdk";
export const MODEL = "claude-sonnet-5";
export const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});
export async function chat(prompt: string): Promise<string> {
const message = await client.messages.create({
model: MODEL,
max_tokens: 1024,
messages: [{ role: "user", content: prompt }],
});
const block = message.content[0];
if (block.type !== "text") throw new Error("Unexpected content type");
return block.text;
}اختبره فوراً في src/index.ts:
import { chat } from "./client.js";
const answer = await chat("What is 2 + 2? Reply with just the number.");
console.log(answer); // 4شغّله:
npm run devالذهاب والعودة لطلب قصير يستغرق عادةً أقل من 800 مللي ثانية على واجهة البرمجة المستضافة.
الخطوة 3: البث المباشر للردود
للمخرجات الطويلة — توليد الأكواد، الشروحات التفصيلية، مسودات التوثيق — يتيح لك البث عرض الرموز فور وصولها بدلاً من انتظار الرد الكامل. يُحسّن هذا زمن الاستجابة المُدرَك بشكل ملحوظ.
أنشئ src/stream.ts:
import { client, MODEL } from "./client.js";
export async function streamChat(
prompt: string,
onText?: (chunk: string) => void
): Promise<string> {
let full = "";
const stream = client.messages.stream({
model: MODEL,
max_tokens: 4096,
messages: [{ role: "user", content: prompt }],
});
stream.on("text", (text) => {
full += text;
if (onText) onText(text);
else process.stdout.write(text);
});
await stream.finalMessage();
process.stdout.write("\n");
return full;
}يتعامل مساعد .stream() في Anthropic SDK مع أحداث text_delta تلقائياً. يتيح لك رد الاتصال الاختياري onText توجيه الرموز أينما تحتاجها — WebSocket، تحديث حالة React، أو ملف سجل.
الخطوة 4: استدعاء الأدوات
استدعاء الأدوات هو المكان الذي تتجلى فيه تحسينات Sonnet 5 الوكيلة. تعرّف مخطط JSON لكل دالة، تمرر مصفوفة tools إلى واجهة البرمجة، وتترك النموذج يقرر متى وأي أداة يستدعي. النموذج لا يستدعي كودك مباشرة أبداً — بل يُعيد كتلة tool_use منظمة، وأنت تنفّذ الطلب، ثم تُعيد النتيجة.
أنشئ src/tools.ts:
import Anthropic from "@anthropic-ai/sdk";
import * as fs from "node:fs";
import * as path from "node:path";
export const TOOLS: Anthropic.Tool[] = [
{
name: "read_file",
description: "Read the text content of a local file.",
input_schema: {
type: "object",
properties: {
file_path: {
type: "string",
description: "Relative path to the file from the project root.",
},
},
required: ["file_path"],
},
},
{
name: "write_file",
description: "Write or overwrite a local file with the given text content.",
input_schema: {
type: "object",
properties: {
file_path: {
type: "string",
description: "Relative path for the output file.",
},
content: {
type: "string",
description: "Full text content to write.",
},
},
required: ["file_path", "content"],
},
},
{
name: "list_directory",
description: "List the files and subdirectories inside a directory.",
input_schema: {
type: "object",
properties: {
dir_path: {
type: "string",
description: "Relative path of the directory to list.",
},
},
required: ["dir_path"],
},
},
];
type ToolInput = Record<string, string>;
export function executeTool(name: string, input: ToolInput): string {
switch (name) {
case "read_file": {
const absPath = path.resolve(input.file_path);
if (!fs.existsSync(absPath)) return `File not found: ${input.file_path}`;
return fs.readFileSync(absPath, "utf-8");
}
case "write_file": {
const absPath = path.resolve(input.file_path);
fs.mkdirSync(path.dirname(absPath), { recursive: true });
fs.writeFileSync(absPath, input.content, "utf-8");
return `Wrote ${input.content.length} characters to ${input.file_path}`;
}
case "list_directory": {
const absPath = path.resolve(input.dir_path);
if (!fs.existsSync(absPath))
return `Directory not found: ${input.dir_path}`;
return fs.readdirSync(absPath).join("\n");
}
default:
return `Unknown tool: ${name}`;
}
}تغطي هذه الأدوات الثلاث العناصر الأساسية للوكيل: الاكتشاف، القراءة، والكتابة. يمكنك توسيع النمط ذاته باستدعاء HTTP، استعلامات قاعدة البيانات، أو أي واجهة برمجة خارجية.
الخطوة 5: حلقة الوكيل
حلقة الوكيل هي قلب أي نظام ذكاء اصطناعي متعدد الخطوات. ترسل مهمة إلى Sonnet 5، تعالج استدعاءات الأدوات عندما يطلبها النموذج، وتستمر في التكرار حتى يكون stop_reason هو "end_turn".
أنشئ src/agent.ts:
import Anthropic from "@anthropic-ai/sdk";
import { client, MODEL } from "./client.js";
import { TOOLS, executeTool } from "./tools.js";
export interface AgentResult {
output: string;
inputTokens: number;
outputTokens: number;
iterations: number;
}
export async function runAgent(
task: string,
maxIterations = 15
): Promise<AgentResult> {
const messages: Anthropic.MessageParam[] = [
{ role: "user", content: task },
];
let totalInput = 0;
let totalOutput = 0;
let iteration = 0;
while (iteration < maxIterations) {
iteration++;
const response = await client.messages.create({
model: MODEL,
max_tokens: 4096,
tools: TOOLS,
messages,
});
totalInput += response.usage.input_tokens;
totalOutput += response.usage.output_tokens;
// أضف دور المساعد دائماً إلى السجل
messages.push({ role: "assistant", content: response.content });
if (response.stop_reason === "end_turn") {
const finalText = response.content
.filter((b): b is Anthropic.TextBlock => b.type === "text")
.map((b) => b.text)
.join("\n");
return {
output: finalText,
inputTokens: totalInput,
outputTokens: totalOutput,
iterations: iteration,
};
}
if (response.stop_reason === "tool_use") {
const toolResults: Anthropic.ToolResultBlockParam[] = response.content
.filter((b): b is Anthropic.ToolUseBlock => b.type === "tool_use")
.map((b) => ({
type: "tool_result" as const,
tool_use_id: b.id,
content: executeTool(b.name, b.input as Record<string, string>),
}));
messages.push({ role: "user", content: toolResults });
continue;
}
break;
}
return {
output: "Agent reached the iteration limit without completing the task.",
inputTokens: totalInput,
outputTokens: totalOutput,
iterations: iteration,
};
}قرارات تصميمية جديرة بالملاحظة:
- أضف دور المساعد دائماً. تتطلب واجهة Anthropic API أن تكون كل رسالة
assistantتحتوي على كتلtool_useفي السجل قبل إرسال نتائج الأدوات. - توقف صريح عند أسباب توقف غير متوقعة. إذا كان
stop_reasonهو"max_tokens"، ستدور الحلقة بصمت. يسمحbreakللمستدعي برؤية النتيجة الجزئية. - حارس
maxIterations. صمام أمان ضد الوكلاء المنفلتين. يكفي 15 تكراراً لمعظم المهام العملية.
الخطوة 6: تتبع الاستخدام والتكلفة
أضف حساب التكلفة إلى src/agent.ts:
// التسعير التمهيدي ساري حتى 2026-08-31
const INTRO_INPUT_PER_TOKEN = 2 / 1_000_000;
const INTRO_OUTPUT_PER_TOKEN = 10 / 1_000_000;
export function calculateCost(inputTokens: number, outputTokens: number): number {
return (
inputTokens * INTRO_INPUT_PER_TOKEN +
outputTokens * INTRO_OUTPUT_PER_TOKEN
);
}اربط كل شيء في src/index.ts:
import { runAgent, calculateCost } from "./agent.js";
const result = await runAgent(
"List the files in the src directory, read client.ts, and summarize " +
"what it does in two sentences."
);
console.log("\n=== Agent Output ===");
console.log(result.output);
console.log("\n=== Usage ===");
console.log(`Iterations : ${result.iterations}`);
console.log(`Input tokens: ${result.inputTokens.toLocaleString()}`);
console.log(`Output tokens: ${result.outputTokens.toLocaleString()}`);
console.log(
`Estimated cost: $${calculateCost(result.inputTokens, result.outputTokens).toFixed(6)}`
);شغّل الوكيل الكامل:
npm run devسيستدعي Sonnet 5 أداة list_directory، ثم read_file، ثم يُعيد ملخصاً في جملتين. التكلفة لمثل هذه المهمة الصغيرة أقل من $0.001 عادةً — ضمن ميزانية معقولة جداً لخطوط الأنابيب الآلية التي تُشغّل مئات المهام يومياً.
الخطوة 7: الاختبار
اكتب اختباراً متكاملاً بسيطاً باستخدام مشغّل الاختبار المدمج في Node:
// src/agent.test.ts
import { test } from "node:test";
import assert from "node:assert";
import { chat } from "./client.js";
import { executeTool } from "./tools.js";
test("chat returns a string response", async () => {
const response = await chat("Say the exact string 'test-ok' and nothing else.");
assert.ok(
response.includes("test-ok"),
`Expected 'test-ok' in response, got: ${response}`
);
});
test("executeTool list_directory returns file names", () => {
const result = executeTool("list_directory", { dir_path: "src" });
assert.ok(result.includes("client.ts"), `Unexpected listing: ${result}`);
});
test("executeTool returns error for missing path", () => {
const result = executeTool("read_file", { file_path: "nonexistent.ts" });
assert.ok(result.startsWith("File not found"), `Unexpected: ${result}`);
});شغّل:
npm testاختبار المحادثة يُجري طلباً حياً إلى API، لذا يكلّف بضعة مايكرو-دولارات ويستغرق أقل من ثانية. احتفظ به في CI على جدول زمني منخفض التكرار بدلاً من تشغيله مع كل commit.
استكشاف الأخطاء وإصلاحها
AuthenticationError: 401 — مفتاح API مفقود أو غير صالح. تحقق من وجود ANTHROPIC_API_KEY في .env ومن تمرير --env-file=.env إلى tsx.
Error: Unexpected content type — تتوقع دالة chat() كتلة text كعنصر أول من المحتوى. إذا أثار الطلب ردّاً باستخدام الأدوات، انتقل إلى runAgent() بدلاً من ذلك.
الوكيل يصل إلى حد التكرار — وصف المهمة مفتوح النهاية على الأرجح. أضف معايير نجاح واضحة: "افعل X، ثم Y، ثم رد بـ 'done' عند الانتهاء."
عدد رموز أعلى من المتوقع — يمكن لمحلل رموز Sonnet 5 التوسع بنسبة تصل إلى 1.35 في المحتوى الكثيف بالأكواد مقارنةً بـ Sonnet 4.6. سجّل response.usage في كل دورة لتحديد التكرارات الثقيلة.
stop_reason: "max_tokens" — زد max_tokens في طلب messages.create. يدعم Sonnet 5 ما يصل إلى 200 ألف رمز مدخل؛ يتحكم max_tokens في ميزانية المخرجات لكل دورة، وليس في السياق الإجمالي.
الخطوات التالية
- أضف موجّهاً للنظام لمنح الوكيل دوراً ثابتاً أو تنسيق مخرجات أو قيوداً.
- طبّق أدوات إضافية — استدعاء HTTP، استعلامات قاعدة البيانات، تنفيذ Shell — باتباع نمط مخطط المدخلات ذاته.
- استمر بسجل المحادثة عبر الجلسات بتخزين مصفوفة
messagesفي ملف JSON أو قاعدة بيانات. - الانتقال من Opus 4.8 بتبديل معرّف النموذج. شغّل كليهما على مجموعة مهام نموذجية وقارن المخرجات قبل الالتزام بالانتقال.
- استكشف المعالجة الدفعية عبر
client.beta.messages.batches.create()لأعباء العمل الكبيرة حيث الكمون غير حرج — يوفر وضع الدُفعة ما يصل إلى 50% تخفيضاً في التكلفة. - اتصل بخوادم MCP عبر عميل MCP التجريبي في Anthropic SDK لمنح وكيلك وصولاً إلى أي أداة Model Context Protocol دون كتابة مخططات أدوات مخصصة.
الخلاصة
يرفع Claude Sonnet 5 سقف البرمجة الوكيلة لمستوى Sonnet دون تكلفة Opus. تشكّل الأنماط المتناولة هنا — عميل مكتوب بالأنواع، بث، استدعاء أدوات، وحلقة وكيل صريحة — جوهر معظم أنظمة الذكاء الاصطناعي في البيئات الإنتاجية. تجعل نافذة التسعير التمهيدي حتى نهاية أغسطس 2026 هذا التوقيت مثالياً للبناء والقياس والتحسين قبل سريان الأسعار القياسية. كل ما في هذا الدليل يتوسّع بسلاسة من نموذج أولي محلي إلى دالة serverless أو عامل يعمل في الخلفية.