Claude Fable 5 هو النموذج الأكثر قدرةً من Anthropic للعمل المستقل طويل الأمد. صدر في التاسع من يونيو 2026، وعاد إلى الخدمة الكاملة في الأول من يوليو 2026 بعد تعليق مؤقت بسبب قيود التصدير، ويتميز بنافذة سياق تبلغ مليون رمز، وما يصل إلى 128 ألف رمز في الإخراج لكل استجابة، والتفكير الموسّع المدمج. مع انتقال نظام التسعير إلى نموذج الاستخدام اعتباراً من 7 يوليو 2026، بات الوقت مثالياً لبناء تطبيقات حقيقية بهذا النموذج.
في هذا الدرس ستبني أداة CLI بـTypeScript تُجري مراجعة شاملة للكود لأي مجلد مشروع. يقرأ الوكيل الملفات عبر أدوات مخصصة، ويستخدم التفكير الموسّع للتحليل الأمني والمعماري، ويوظّف التخزين المؤقت للموجّهات لخفض تكاليف واجهة برمجة التطبيقات بنسبة 90%. هذا هو نمط "تفويض المهمة كاملة" الذي صُمم Fable 5 من أجله.
المتطلبات الأساسية
- Node.js 20 أو أحدث — تحقق بـ
node --version - إلمام بـ TypeScript و
async/await - مفتاح Anthropic API — أنشئه في console.anthropic.com
- محرر كود (يُنصح بـ VS Code)
لا حاجة لأي معدات GPU. كل الاستدلال يجري على API المستضافة من Anthropic.
ما ستبنيه
في نهاية هذا الدرس ستمتلك أمر CLI:
npx tsx review-agent.ts ./my-projectيُطلق هذا الأمر وكيل Fable 5 الذي يستكشف قاعدة الكود تلقائياً باستخدام أدوات نظام الملفات، ويطبّق التفكير الموسّع للكشف عن الثغرات الأمنية، ويبثّ تقريراً منظماً يحتوي على أقسام الأخطاء الحرجة والعالية والمتوسطة الأولوية والتوصيات.
فهم Claude Fable 5
نظرة سريعة على النموذج قبل كتابة أي كود.
ما الذي يميز Fable 5 عن Sonnet 5؟
| الخاصية | Claude Sonnet 5 | Claude Fable 5 |
|---|---|---|
| نافذة السياق | 200 ألف رمز | مليون رمز |
| الإخراج الأقصى | 64 ألف رمز | 128 ألف رمز |
| الاستخدام الأمثل | استجابات سريعة وتكرارية | مهام مستقلة متعددة الخطوات |
| سعر الإدخال | 3 دولار / مليون رمز | 10 دولار / مليون رمز |
| سعر الإخراج | 15 دولار / مليون رمز | 50 دولار / مليون رمز |
| الإدخال المؤقت (Cached) | 0.30 دولار / مليون رمز | 1 دولار / مليون رمز |
استخدم Sonnet 5 للميزات التفاعلية. استخدم Fable 5 حين تحتاج وكيلاً يخطط عبر خطوات متعددة، ويراجع عمله بنفسه، وينتج نتيجة متماسكة عبر عشرات استدعاءات الأدوات.
الخطوة الأولى: إعداد المشروع
mkdir fable5-reviewer && cd fable5-reviewer
npm init -y
npm install @anthropic-ai/sdk dotenv
npm install -D typescript tsx @types/nodeأنشئ ملف tsconfig.json:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "./dist",
"strict": true,
"esModuleInterop": true
}
}أنشئ ملف .env:
ANTHROPIC_API_KEY=sk-ant-...
لا تُدرج هذا الملف في مستودعك — أضفه فوراً إلى .gitignore.
الخطوة الثانية: التحقق من البث مع Fable 5
الاستدعاءات غير المتزامنة (non-streaming) لـFable 5 قد تستغرق أكثر من 60 ثانية للموجّهات المعقدة. استخدم البث دائماً. إليك اختباراً بسيطاً:
// stream-test.ts
import Anthropic from '@anthropic-ai/sdk';
import 'dotenv/config';
const client = new Anthropic();
async function main(): Promise<void> {
const stream = client.messages.stream({
model: 'claude-fable-5',
max_tokens: 512,
messages: [
{
role: 'user',
content: 'اذكر 5 أشياء يجب فحصها في مراجعة أمان TypeScript. كن مختصراً.',
},
],
});
for await (const chunk of stream) {
if (
chunk.type === 'content_block_delta' &&
chunk.delta.type === 'text_delta'
) {
process.stdout.write(chunk.delta.text);
}
}
const final = await stream.finalMessage();
console.log(
`\n\nالرموز: ${final.usage.input_tokens} إدخال / ${final.usage.output_tokens} إخراج`
);
}
main();شغّله:
npx tsx stream-test.tsستظهر القائمة رمزاً تلو الآخر. إن ظهرت رسالة model_not_available، تحقق من تفعيل الوصول في حسابك على console.anthropic.com.
الخطوة الثالثة: تعريف أدوات نظام الملفات
الأدوات هي طريقة Fable 5 لقراءة مشروعك. سنعرّف ثلاثة: list_directory وread_file وsearch_pattern.
// tools.ts
import { readFileSync, readdirSync, statSync } from 'fs';
import { join, extname } from 'path';
import type Anthropic from '@anthropic-ai/sdk';
const ALLOWED_EXTENSIONS = new Set([
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
'.json', '.md', '.yaml', '.yml', '.toml', '.env.example',
]);
export const toolDefinitions: Anthropic.Tool[] = [
{
name: 'list_directory',
description: 'استعرض الملفات والمجلدات في مسار معين.',
input_schema: {
type: 'object' as const,
properties: {
path: { type: 'string', description: 'مسار المجلد' },
recursive: { type: 'boolean', description: 'الاستعراض التكراري' },
},
required: ['path'],
},
},
{
name: 'read_file',
description: 'اقرأ محتوى نصي لملف مصدر.',
input_schema: {
type: 'object' as const,
properties: {
path: { type: 'string', description: 'مسار الملف' },
},
required: ['path'],
},
},
{
name: 'search_pattern',
description: 'ابحث عن نمط regex في جميع ملفات المصدر داخل مجلد. يُرجع الأسطر المتطابقة مع مسار الملف ورقم السطر.',
input_schema: {
type: 'object' as const,
properties: {
pattern: { type: 'string', description: 'نمط regex للبحث' },
directory: { type: 'string', description: 'المجلد الجذر للبحث' },
maxResults: {
type: 'number',
description: 'الحد الأقصى للنتائج (الافتراضي 50)',
},
},
required: ['pattern', 'directory'],
},
},
];
function walkDir(dir: string, recursive: boolean): string[] {
const results: string[] = [];
for (const name of readdirSync(dir)) {
if (name.startsWith('.') || name === 'node_modules' || name === 'dist') continue;
const full = join(dir, name);
const stat = statSync(full);
if (stat.isDirectory()) {
results.push(`${full}/`);
if (recursive) results.push(...walkDir(full, true));
} else {
results.push(full);
}
}
return results;
}
function grepFiles(pattern: string, dir: string, maxResults: number): string[] {
const regex = new RegExp(pattern, 'gi');
const matches: string[] = [];
const files = walkDir(dir, true).filter(
(f) => !f.endsWith('/') && ALLOWED_EXTENSIONS.has(extname(f))
);
for (const file of files) {
if (matches.length >= maxResults) break;
try {
const lines = readFileSync(file, 'utf-8').split('\n');
for (let i = 0; i < lines.length; i++) {
if (regex.test(lines[i])) {
matches.push(`${file}:${i + 1}: ${lines[i].trim()}`);
if (matches.length >= maxResults) break;
}
}
} catch {
// تجاهل الملفات غير القابلة للقراءة
}
}
return matches;
}
export function executeTool(
name: string,
input: Record<string, unknown>
): string {
try {
if (name === 'list_directory') {
const path = input.path as string;
const recursive = (input.recursive as boolean) ?? false;
const entries = walkDir(path, recursive);
return entries.slice(0, 300).join('\n') || '(مجلد فارغ)';
}
if (name === 'read_file') {
const path = input.path as string;
if (!ALLOWED_EXTENSIONS.has(extname(path))) {
return `تم التجاهل: الامتداد ${extname(path)} غير مسموح به.`;
}
const content = readFileSync(path, 'utf-8');
return content.length > 50_000
? content.slice(0, 50_000) + '\n\n[تم اقتطاع الملف — أكثر من 50000 حرف]'
: content;
}
if (name === 'search_pattern') {
const pattern = input.pattern as string;
const directory = input.directory as string;
const maxResults = (input.maxResults as number) ?? 50;
const hits = grepFiles(pattern, directory, maxResults);
return hits.length > 0 ? hits.join('\n') : 'لم يُعثر على تطابقات.';
}
return `أداة غير معروفة: ${name}`;
} catch (err) {
return `خطأ في الأداة: ${(err as Error).message}`;
}
}يحمي الحد الأقصى البالغ 50 ألف حرف للملف ميزانية السياق. حتى مع نافذة سياق Fable 5 البالغة مليون رمز، قد يستهلك ملف ضخم واحد آلاف الرموز دون داعٍ.
الخطوة الرابعة: حلقة الوكيل الأساسية
تُشغّل الحلقة Fable 5 حتى يُعيد إجابة نهائية. في كل دورة: استدعِ API، نفّذ أي أدوات مطلوبة، أرسل النتائج، كرّر.
// agent-loop.ts
import Anthropic from '@anthropic-ai/sdk';
import { toolDefinitions, executeTool } from './tools.js';
const client = new Anthropic();
const SYSTEM = `أنت مهندس برمجيات أول تُجري مراجعة كود شاملة ومنهجية.
سير العمل:
1. استدعِ list_directory على جذر المشروع (recursive: true) لفهم البنية.
2. اقرأ ملفات الإعداد الرئيسية أولاً: package.json، tsconfig.json، .eslintrc.
3. اقرأ كل ملف مصدر رئيسي بالتسلسل.
4. استخدم search_pattern للبحث عن المشاكل الأمنية الشائعة: eval، dangerouslySetInnerHTML، بناء SQL بالنصوص، الأسرار المضمّنة.
5. بعد قراءة جميع الملفات ذات الصلة، اكتب تقريراً منظماً.
صيغة التقرير:
## مشاكل حرجة
## أولوية عالية
## أولوية متوسطة
## توصيات`;
export async function runReviewAgent(projectPath: string): Promise<void> {
const messages: Anthropic.MessageParam[] = [
{
role: 'user',
content: `أجرِ مراجعة شاملة للكود في المسار: ${projectPath}
راجع كل شيء — الأمان، الصحة، جودة TypeScript، معالجة الأخطاء، والبنية المعمارية. ابدأ باستكشاف بنية المشروع.`,
},
];
let iteration = 0;
const maxIterations = 40;
console.log(`\nمراجعة كود Fable 5 — ${projectPath}\n${'─'.repeat(60)}\n`);
while (iteration < maxIterations) {
iteration++;
const response = await client.messages.create({
model: 'claude-fable-5',
max_tokens: 8192,
system: SYSTEM,
tools: toolDefinitions,
messages,
});
messages.push({ role: 'assistant', content: response.content });
const toolResults: Anthropic.ToolResultBlockParam[] = [];
for (const block of response.content) {
if (block.type === 'text' && block.text) {
process.stdout.write(block.text);
} else if (block.type === 'tool_use') {
const input = block.input as Record<string, unknown>;
console.log(`\n [${block.name}] ${JSON.stringify(input).slice(0, 80)}`);
const result = executeTool(block.name, input);
toolResults.push({
type: 'tool_result',
tool_use_id: block.id,
content: result,
});
}
}
if (toolResults.length > 0) {
messages.push({ role: 'user', content: toolResults });
continue;
}
if (response.stop_reason === 'end_turn') {
console.log(`\n${'─'.repeat(60)}\nاكتمل — ${iteration} دورة`);
break;
}
console.warn(`\nstopped: ${response.stop_reason}`);
break;
}
if (iteration >= maxIterations) {
console.warn('بلغت الحد الأقصى للدورات — قد تكون المراجعة غير مكتملة.');
}
}يُكمل Fable 5 عادةً مراجعة مشروع TypeScript متوسط الحجم في 8 إلى 18 دورة. الحد الأقصى البالغ 40 دورة هو شبكة أمان للمستودعات الكبيرة جداً.
الخطوة الخامسة: التفكير الموسّع للتحليل الأمني العميق
يتيح التفكير الموسّع لـFable 5 التفكير بشكل خاص قبل كتابة استجابته النهائية. لتحليل الأمن هذا مهم جداً: تتطلب سلاسل الثغرات استدلالاً أعمق من مجرد مطابقة الأنماط السطحية. فعّله بمعامل thinking:
// deep-review.ts
import Anthropic from '@anthropic-ai/sdk';
import { toolDefinitions, executeTool } from './tools.js';
const client = new Anthropic();
export async function runDeepSecurityAudit(projectPath: string): Promise<void> {
const messages: Anthropic.MessageParam[] = [
{
role: 'user',
content: `أجرِ تدقيقاً أمنياً عميقاً للمشروع في: ${projectPath}
ركّز على:
- ثغرات الحقن (SQL، الأوامر، اجتياز المسار)
- عيوب المصادقة والتفويض
- كشف البيانات الحساسة والأسرار في الكود
- التبعيات الضعيفة في package.json
افحص جميع ملفات المصدر بعناية، ثم قدّم تقرير أمني مفصلاً.`,
},
];
let iteration = 0;
while (iteration < 30) {
iteration++;
const response = await client.messages.create({
model: 'claude-fable-5',
max_tokens: 16000,
tools: toolDefinitions,
messages,
thinking: {
type: 'enabled',
budget_tokens: 8000,
},
});
messages.push({ role: 'assistant', content: response.content });
const toolResults: Anthropic.ToolResultBlockParam[] = [];
for (const block of response.content) {
if (block.type === 'thinking') {
console.log(`\n [تفكير — ${block.thinking.length} حرف]`);
} else if (block.type === 'text' && block.text) {
process.stdout.write(block.text);
} else if (block.type === 'tool_use') {
console.log(`\n [${block.name}]`);
const result = executeTool(
block.name,
block.input as Record<string, unknown>
);
toolResults.push({
type: 'tool_result',
tool_use_id: block.id,
content: result,
});
}
}
if (toolResults.length > 0) {
messages.push({ role: 'user', content: toolResults });
continue;
}
if (response.stop_reason === 'end_turn') break;
}
}قيمة budget_tokens البالغة 8000 هي نقطة بداية جيدة. للتدقيقات الأمنية، القيم بين 4000 و16000 عملية. رموز التفكير تُحسب بأسعار الإدخال لا الإخراج.
الخطوة السادسة: التخزين المؤقت للموجّهات — توفير 90% من التكاليف
بسعر 10 دولارات لكل مليون رمز إدخال، قد تتراكم تكاليف جولة وكيل مكوّنة من 40 دورة على مشروع كبير. يخزّن التخزين المؤقت للموجّهات الكتل الثابتة على خوادم Anthropic لمدة 5 دقائق، ويفوترها بـ1 دولار فقط لكل مليون رمز — خصم 90%.
// cached-agent.ts
import Anthropic from '@anthropic-ai/sdk';
import { readFileSync } from 'fs';
import { toolDefinitions, executeTool } from './tools.js';
const client = new Anthropic();
export async function runCachedReview(projectPath: string): Promise<void> {
let packageJson = '(لا يوجد package.json)';
try {
packageJson = readFileSync(`${projectPath}/package.json`, 'utf-8');
} catch { /* غير موجود */ }
const systemContent: Anthropic.TextBlockParam[] = [
{
type: 'text',
text: `أنت مراجع أمان وجودة كود.\n\nملف package.json للمشروع:\n\`\`\`json\n${packageJson}\n\`\`\`\n\nارجع إليه عند تحليل التبعيات.`,
cache_control: { type: 'ephemeral' }, // تخزين هذه الكتلة الكبيرة مؤقتاً لمدة 5 دقائق
},
{
type: 'text',
text: 'استخدم الأدوات المتاحة لقراءة ملفات المصدر. صنّف المشاكل حسب الخطورة.',
},
];
const messages: Anthropic.MessageParam[] = [
{
role: 'user',
content: `راجع جميع ملفات TypeScript في ${projectPath} للكشف عن مشاكل الأمان وجودة الكود.`,
},
];
let iteration = 0;
let cachedTokensSaved = 0;
while (iteration < 30) {
iteration++;
const response = await client.messages.create({
model: 'claude-fable-5',
max_tokens: 8192,
system: systemContent,
tools: toolDefinitions,
messages,
});
const usage = response.usage as Anthropic.Usage & {
cache_read_input_tokens?: number;
};
if (usage.cache_read_input_tokens) {
cachedTokensSaved += usage.cache_read_input_tokens;
}
messages.push({ role: 'assistant', content: response.content });
const toolResults: Anthropic.ToolResultBlockParam[] = [];
for (const block of response.content) {
if (block.type === 'text') process.stdout.write(block.text);
else if (block.type === 'tool_use') {
const result = executeTool(
block.name,
block.input as Record<string, unknown>
);
toolResults.push({
type: 'tool_result',
tool_use_id: block.id,
content: result,
});
}
}
if (toolResults.length > 0) {
messages.push({ role: 'user', content: toolResults });
continue;
}
if (response.stop_reason === 'end_turn') {
const savedUsd = ((cachedTokensSaved * 9) / 10 / 1_000_000) * 10;
console.log(
`\n\nوفّر التخزين المؤقت ~${savedUsd.toFixed(4)} دولار (${cachedTokensSaved.toLocaleString()} رمز بخصم 90%)`
);
break;
}
}
}الخطوة السابعة: نقطة دخول CLI
اربط كل شيء في ملف واحد قابل للتشغيل:
// review-agent.ts
import 'dotenv/config';
import { runCachedReview } from './cached-agent.js';
const projectPath = process.argv[2];
if (!projectPath) {
console.error('الاستخدام: npx tsx review-agent.ts <المسار>');
process.exit(1);
}
console.log('مراجع كود Claude Fable 5');
console.log(`المسار : ${projectPath}`);
console.log('النموذج : claude-fable-5');
console.log('السياق : مليون رمز | الإخراج الأقصى: 128 ألف رمز\n');
runCachedReview(projectPath).catch((err) => {
console.error('\nخطأ في الوكيل:', err.message);
process.exit(1);
});شغّل المراجعة:
npx tsx review-agent.ts ./srcسيستكشف Fable 5 بنية المجلد، ويقرأ الملفات واحداً تلو الآخر، ويبحث عن الأنماط الأمنية، ويكتب التقرير النهائي — عادةً في غضون 2 إلى 5 دقائق لمشروع TypeScript متوسط الحجم.
استكشاف الأخطاء وإصلاحها
انتهاء مهلة البث — استخدم دائماً client.messages.stream() عند تفعيل التفكير الموسّع. ستنتهي مهلة الاستدعاءات غير المتزامنة مع قيم budget_tokens الكبيرة قبل انتهاء النموذج من العمل.
model_not_available — استُعيد وصول Fable 5 في 1 يوليو 2026 بعد تعليق قيود التصدير في يونيو. إن استمر الخطأ، تحقق من مستوى حسابك في console.anthropic.com — يتطلب Fable 5 مفتاح API مفعّلاً بنظام الاستخدام.
Context length exceeded — مع مليون رمز نادر الحدوث، لكن المستودعات الكبيرة جداً مع ملفات lock والكود المُولَّد قد تصل إليه. أضف .lock و.snap و.d.ts إلى قائمة الامتدادات المحظورة في tools.ts.
تكلفة مرتفعة في الجولة الأولى — الجولة الأولى لا تستفيد من التخزين المؤقت (لا يوجد شيء مخزّن بعد). تنخفض التكاليف بنسبة تصل إلى 90% من الجولة الثانية فصاعداً.
الخطوات التالية
- أضف أداة كتابة الملفات — اسمح للوكيل بحفظ التقرير كـ
code-review.mdفي جذر المشروع - تكامل GitHub Actions — شغّل الوكيل تلقائياً على كل طلب سحب (pull request)
- وكلاء فرعيون متخصصون — استخدم Beta Managed Agents API لتشغيل محللي أمان وأداء وأسلوب بالتوازي يرفعون تقاريرهم لـFable 5
الخلاصة
يغيّر Claude Fable 5 ما يمكن لوكيل TypeScript واحد إنجازه في جلسة غير منقطعة. نافذة السياق البالغة مليون رمز تُلغي التحايل المعقّد على السياق الذي يجعل الوكلاء طويلة الأمد هشّة. التفكير الموسّع يجلب استدلالاً دقيقاً متعدد الخطوات للتحليل الأمني. والتخزين المؤقت يحوّل ما كان يمكن أن يكون عملية مكلفة إلى شيء اقتصادي بما يكفي للتشغيل على كل طلب سحب.
أنماط البناء الصحيحة هنا — البث أولاً، تحديد عدد الدورات، تخزين الكتل الثابتة مؤقتاً — هي الأساس الصحيح لأي سير عمل مدعوم بـFable 5.