نسخة بيتا من أدوات Claude المدمجة: ما الذي سيتم إطلاقه فعلياً (2026)
٢٨ سبتمبر ٢٠٢٦

تتيح لك نسخة البيتا inline-tools-2026-09-15 من Claude تسليم النموذج أداة جديدة تماماً في منتصف المحادثة — بالاسم الكامل، والوصف، و JSON Schema — دون المساس بمصفوفة tools أو الدفع لإعادة بناء ذاكرة التخزين المؤقت للمطالبة (prompt cache). تم الإعلان عن هذه الميزة في 22 سبتمبر 2026، في نفس إدخال ملاحظات الإصدار الخاص بـ Claude Opus 5.5.1 وهناك نسخة بيتا ثانية، compact-2026-09-04، تم توثيقها قبل ثمانية أيام، تتيح لـ API ضغط محادثة طويلة عند الطلب.
ملخص: إضافة أداة بالطريقة القديمة تؤدي إلى إبطال بادئة التخزين المؤقت (cached prefix)، لأن tools تقع قبل كل شيء آخر فيها — وهي تكلفة قدرها أحد المطورين بنسبة 13.5% من إنفاقهم على Claude عبر 506 من جلسات Claude Code الخاصة بهم.2 تعالج نسخة البيتا للأدوات المضمنة (inline tools) هذه المشكلة عن طريق نقل تعريف الأداة إلى messages. لقد قرأت المخطط (schema) من الوثائق، ثم تحققت منه مقابل مصدر SDK الفعلي بدلاً من نصوص سجل التغييرات، ووجدت الجزء المثير للاهتمام: ترويسة البيتا مؤرخة في 2026-09-15، ولكن لم يكن لدى أي من SDK الرسمية نوع لتعريف الأداة عن طريق القيمة (by-value) حتى 22 سبتمبر. تبين أن هذه الفجوة تحديداً لم تكلف شيئاً أثناء التشغيل في أي من اللغتين — حيث يرسل العميل القديم الكتلة تماماً كما هي مكتوبة. أما نسخة بيتا الضغط (compaction) المجاورة فهي المكان الذي يسبب فيه SDK القديم مشكلة حقيقية، وفقط في Python، حيث يرفض العميل القديم المعلمة (parameter) تماماً مع TypeError بدلاً من تمريرها.
ما ستتعلمه
- شكل الطلب لإضافة أداة في منتصف المحادثة دون إبطال التخزين المؤقت، والقاعدة الموثقة التي تحافظ على سلامة التخزين المؤقت
- لماذا يعتبر الجمع بين
tool_addition/tool_definitionقدرة مختلفة تماماً عن إضافة/إزالة الأدوات عن طريق المرجع (by-reference) التي تم الإعلان عنها في يوليو - كيف يقوم ضغط
compact-2026-09-04ونسخة بيتا inline-tools بتسليم سجل الأدوات من خلال حقلtool_changes— وماذا يحدث إذا نسيت دمج ترويسات البيتا - إعداد خادم محاكاة محلي (mock-server) يوضح بالضبط ما يضعه SDK الرسمي على الشبكة، بدون مفتاح API وبدون وصول أي طلب إلى Anthropic
- الإصدار الدقيق الذي أصبحت فيه كل قدرة ذات نوع محدد (typed)، مقاساً من خلال البحث في مصدر SDK عبر الإصدارات بدلاً من الاعتماد على ملاحظات الإصدار
- لماذا لا يكلف SDK القديم شيئاً عند تعريف أداة مضمنة ولكنه يتسبب في تعطل استدعاء الضغط في Python تماماً، مقاساً في كلتا اللغتين
المشكلة: الأدوات تسبق التخزين المؤقت الخاص بك
هذا سلوك موثق وليس مجرد خلل. تنص وثائق التخزين المؤقت للمطالبات من Anthropic بوضوح على الترتيب: "يتم إنشاء بادئات التخزين المؤقت بالترتيب التالي: tools، ثم system، ثم messages."3 وتوضح الصفحة نفسها النتيجة في جدول يوضح ما الذي يبطل ماذا: "تعديل تعريفات الأدوات (الأسماء، الأوصاف، المعلمات) يبطل التخزين المؤقت بالكامل" — مستويات الأدوات والنظام والرسائل جميعها معاً.3
لذا، في حالة العميل (agent) الذي يعمل لفترة طويلة ويكتشف قدرات جديدة في منتصف الجلسة، فإن كل تغيير في قائمة الأدوات يؤدي إلى التخلص من البادئة المخزنة مؤقتًا (cached prefix) التي دفعت بالفعل مقابل كتابتها. هناك مشكلة في Claude Code تضع أرقامًا دقيقة لهذا الأمر؛ حيث نشر كاتب المشكلة مقتطفًا من سجل إحدى الجلسات يظهر كتابة ذاكرة مؤقتة بحجم 857,710 توكن في الساعة 07:47:37، تلاها في الساعة 07:48:49 — أي بعد دقيقة واحدة تقريبًا — إعادة كتابة كاملة أخرى بحجم 782,873 توكن، نتيجة لتغييرات في قائمة الأدوات وخوادم MCP التي تم تحميلها في منتصف الجلسة.2 وقام أحد المعلقين على نفس المشكلة بتحليل 506 من سجلات جلسات Claude Code المحلية الخاصة به (مجموعة بيانات بحجم 3.2 جيجابايت تقريبًا) وأبلغ عن 2,766 حالة لكسر الذاكرة المؤقتة (cache-bust) عبر 191 من تلك الجلسات، بمتوسط 81,000 توكن معاد فوترتها لكل حالة، وهو ما يمثل 13.5% من إجمالي الإنفاق على Claude في تلك المجموعة.2
هناك تحفظان على هذه الأرقام، بما أنها الأدلة الميدانية الوحيدة في المنشور. فهي تصف قوائم الأدوات وMCP الداخلية الخاصة بـ Claude Code، ولم أجد ما يؤكد أن Claude Code يستخدم أيًا من النسخ التجريبية (beta) المذكورة هنا. كما أن تحليل الـ 506 جلسات تم على جهاز مطور واحد، وتم الإبلاغ عنه ذاتيًا في تعليق على المشكلة — وليس قياسًا من المورد أو تدقيقًا شاملاً على مستوى جميع المستخدمين. ولكن ما يثبته هذا هو أن نمط الفشل هذا حقيقي، ومتكرر، ومكلف لدرجة أن شخصًا ما كلف نفسه عناء قياسه كميًا.
ما الجديد فعليًا هنا (وما ليس جديدًا)
أطلقت Anthropic نسخة محدودة من هذا الإصلاح قبل شهرين. وينص إدخال ملاحظات الإصدار بتاريخ 24 يوليو 2026 على ما يلي: "تغييرات الأدوات في منتصف المحادثة أصبحت الآن في المرحلة التجريبية على Claude Fable 5 وClaude Mythos 5 وClaude Opus 4.8 وClaude Opus 5: أضف أو قم بإزالة الأدوات بين أدوار المحادثة مع الحفاظ على ذاكرة التخزين المؤقت للمطالبة (prompt cache). قم بتضمين ترويسة البيتا mid-conversation-tool-changes-2026-07-01 في طلباتك."4 لذا، فإن تغييرات الأدوات التي تحافظ على الذاكرة المؤقتة ليست جديدة في سبتمبر، وكذلك كتلة tool_addition. ما قدمه تحديث يوليو كان الإضافة عن طريق المرجع (by reference): الإشارة إلى أداة تم التصريح عنها بالفعل في tools، أو حذف إحداها.
أما إضافة سبتمبر فهي تعريف الأداة عن طريق القيمة (by value) — الاسم الكامل، والوصف، والمخطط (schema)، بشكل مضمن (inline)، لأداة لم يسبق للنموذج أن رأى تعريفها في أي مكان. تغطي inline-tools-2026-09-15 كليهما، لذا فهي تحل محل ترويسة يوليو بدلاً من أن تكون بجانبها.5 الشكل الذي تحدده الوثائق هو:
{
"role": "system",
"content": [
{
"type": "tool_addition",
"tool": {
"type": "tool_definition",
"definition": {
"name": "db_query",
"description": "Run a read-only SQL query against the analytics database.",
"input_schema": {
"type": "object",
"properties": { "sql": { "type": "string" } },
"required": ["sql"]
}
}
}
}
]
}
يمكن إضافة خوادم MCP بنفس الطريقة، ولكن هذا قسم منفصل في الوثائق وله متطلباته الخاصة: "لإضافة خادم موصل MCP في منتصف المحادثة، أرسل ترويسة البيتا mcp-client-2026-09-15 جنبًا إلى جنب مع inline-tools-2026-09-15."5 ترويستان، وليس واحدة. ثم يسجل الرد قائمة الأدوات التي تم جلبها لكل خادم في كتلة mcp_tool_listing، والتي تقوم بتثبيت تلك القائمة عند إرسالها مرة أخرى.1
الفائدة من التخزين المؤقت هي الهدف الأساسي، والوثائق واضحة تمامًا بشأن الآلية: "مصفوفة tools نفسها لا تتغير أبدًا، لذا تظل البادئة المخزنة مؤقتًا سليمة."5 ولأن التعريف يصل كرسالة ملحقة بدلاً من تعديل في tools، تظل البادئة السابقة متطابقة تمامًا من حيث البايتات، وتكون الرسالة الجديدة فقط هي المدخل الحديث.
هناك استثناء واحد موثق، ومن السهل الوقوع فيه: "احتفظ بأداة واحدة على الأقل غير مؤجلة في tools. المحادثة التي لا تحتوي مصفوفة tools الخاصة بها على أي أداة غير مؤجلة يتم قبولها، ولكن أول أداة يتم تعريفها بالقيمة تغير بداية المطالبة (prompt) التي يتم عرضها، مما يتسبب في فقدان كامل للتخزين المؤقت (cache miss) في ذلك الطلب."5 صرّح بما تعرفه مسبقاً؛ واستخدم التعريفات المضمنة (inline definitions) لما لا تعرفه.
بعض القيود الأخرى من نفس الصفحة، لأنها تفشل بشكل صارخ فقط بعد الإطلاق:5
- بعض أنواع الأدوات — ومن بينها أداة استخدام الكمبيوتر (computer-use tool) — لا يمكن تعريفها في رسالة خلال الفترة التجريبية (beta) و"تعيد خطأ 400 يوضح ذلك"؛ قم بالتصريح عن هذه الأدوات في
toolsوأضفها عن طريق المرجع (reference). - يتم وضع
cache_controlإما على كتلة المحتوى أو داخل التعريف، وليس كليهما أبداً، ولا يمكن للتعريف المؤجل أن يحمل واحداً على الإطلاق. - هناك أربعة قيود تعيد خطأ 400 مع تعيين
error.details.error_codeإلىavailable_tools_limit_exceeded: وجود أكثر من 10,000 أداة مؤجلة متاحة بعد أي رسالة؛ أو أكثر من 10,000 أداة معرفة بعد أول رسالة من المستخدم؛ أو تعريفات مرسلة بعد أول رسالة من المستخدم يتجاوز مجموعها 4 ميجابايت (4,194,304 بايت)؛ أو نص أداة معروض أكبر من 4 ميجابايت. - الأدوات المعرفة بالقيمة هي جزء من الرسالة ولا يتم حفظها في جانب الخادم، لذا يجب أن تظل في مصفوفة
messagesفي كل طلب لاحق في المحادثة.
عندما يلتقي الضغط (compaction) والأدوات المضمنة (inline tools)
تتيح لك النسخة التجريبية الثانية من سبتمبر، compact-2026-09-04، ضغط المحادثة عند الطلب: أرسل معامل compaction على المستوى الأعلى، وستحصل على كتلة compaction موقعة تحتوي على ملخص، وقم بإعادة تشغيل هذه الكتلة بدلاً من الرسائل التي تلخصها.67 وثق سجل تغييرات Anthropic ذلك في 14 سبتمبر — بعد عشرة أيام من التاريخ المطبوع في اسم الترويسة نفسه — وأضافت كلتا حزمتي SDK الرسميتين دعماً نمطياً في اليوم التالي، 15 سبتمبر.689
الجزء الذي من السهل إغفاله: إذا تمت إضافة أداة أو إزالتها ضمن نطاق الأدوار التي قمت بضغطها للتو، فإن هذا التغيير لا يختفي ببساطة في الملخص. الوثائق صريحة في هذا الشأن، والسلوك يعتمد على ترويسات النسخة التجريبية التي كانت موجودة في طلب الضغط نفسه، وليس فقط في الأدوار السابقة:10
تنتقل تغييرات الأدوات داخل تلك الأدوار بشكل مستقل عندما يحمل طلب الضغط أيضاً
inline-tools-2026-09-15: تسجل الكتلة المعادة تأثيرها الصافي في حقلtool_changesالخاص بها، لذا أرسل الكتلة مرة أخرى دون تعديل. إذا كانت الكتلة لا تحتوي على حقلtool_changes، فأعد ذكر تغييرات الأدوات تلك بنفس الطريقة.
بمعنى آخر: إذا قمت بضغط محادثة أضافت db_query في منتصف الجلسة ولكنك نسيت إضافة inline-tools-2026-09-15 في ذلك الاستدعاء تحديداً، فإن الكتلة المعادة لن تحمل حقل tool_changes — وتصبح أنت الآن مسؤولاً عن ملاحظة أن db_query يجب أن تعود إلى النطاق، وعن إعادة ذكرها. أما إذا أدرجت الترويسة، فإن الكتلة تنقل التأثير الصافي للأمام، ليتم تداولها دون تعديل تماماً مثل توقيعها.
هناك تفاعلان آخران يستحقان المعرفة إذا قمت بدمج إصدارات البيتا، وكلاهما مقتبس من نفس الصفحة:10 "يمكن لطلب لاحق استخدام system مختلف، أو tools مختلفة، أو نموذج مختلف عن طلب الضغط (compaction request)، ومع ذلك يظل الـ API يقبل الكتلة (block). مثل هذا التغيير قد يبطل التفكير في الأدوار المحفوظة، ولكن ليس له أي تأثير آخر." وأيضاً: "رسالة النظام التي توضع بين الكتلة والأدوار المحفوظة تكسر تسلسل تفكيرها." لذا، أعد صياغة التعليمات الثابتة بعد أول دور جديد للمستخدم بدلاً من حشرها أمام الأدوار التي احتفظت بها.
التقاط تنسيق النقل (wire format) بدون مفتاح API
نفس المنهجية المستخدمة في منشور tool_choice الخاص بـ Claude Opus 5.5 على هذا الموقع: توجيه الـ SDK الحقيقي إلى خادم HTTP محلي بدلاً من api.anthropic.com، وقراءة ما يرسله فعلياً. لا يوجد شيء هنا يصل إلى Anthropic.
// mock-server.mjs — stands in for the Claude API, and writes each body to disk
// so two SDK versions can be compared byte-for-byte.
import http from "node:http";
import fs from "node:fs";
let n = 0;
const server = http.createServer((req, res) => {
let body = "";
req.on("data", (c) => (body += c));
req.on("end", () => {
fs.writeFileSync(`captured-${++n}.json`, body);
console.log("anthropic-beta:", req.headers["anthropic-beta"], "| path:", req.url);
const parsed = JSON.parse(body || "{}");
const reply = parsed.compaction
? {
id: "msg_mock_c", type: "message", role: "assistant", model: parsed.model,
content: [{
type: "compaction",
content: "Summary: db_query was added mid-conversation.",
signature: "mock-signature",
tool_changes: [{
type: "tool_addition",
tool: { type: "tool_definition", definition: { name: "db_query", description: "…",
input_schema: { type: "object", properties: {} } } },
}],
}],
stop_reason: "compaction", stop_sequence: null,
usage: { input_tokens: 0, output_tokens: 0,
iterations: [{ type: "compaction", input_tokens: 144, output_tokens: 276 }] },
}
: {
id: "msg_mock_t", type: "message", role: "assistant", model: parsed.model,
content: [{ type: "text", text: "(mock reply)" }],
stop_reason: "end_turn", stop_sequence: null,
usage: { input_tokens: 1, output_tokens: 1 },
};
res.writeHead(200, { "content-type": "application/json" });
res.end(JSON.stringify(reply));
});
});
server.listen(8792, () => console.log("capture server on :8792"));
عند التوجيه إلى ذلك الخادم باستخدام @anthropic-ai/sdk 0.128.0 — وهو إصدار npm الحالي وقت كتابة هذا المقال — يتم تسلسل استدعاء tool_addition/tool_definition تماماً كما تصف الوثائق: تذهب رسالة دور الـ system إلى messages دون تغيير، وتظل مصفوفة الـ tools الموجودة مسبقاً دون تعديل، ويذهب الطلب إلى /v1/messages?beta=true مع anthropic-beta: inline-tools-2026-09-15.
إرسال كلا إصداري البيتا في طلب واحد — betas: ["compact-2026-09-04", "inline-tools-2026-09-15"] — ينتج عنه ترويسة (header) واحدة تقرأ compact-2026-09-04,inline-tools-2026-09-15: مفصولة بفاصلة، بدون مسافات، وهو السلوك الذي كُتب لإصلاح خطأ في الإصدار السابق مباشرة (0.127.0، "دمج قيم anthropic-beta المتعددة بفاصلة وبدون مسافة") لضمان تحقيقه.8
هناك نتيجة سلبية واحدة تستحق التسجيل، لأنها تصحح الطريقة البديهية لاختبار هذا الأمر. يقوم محلل الاستجابة (response parser) بإظهار حقل tool_changes الوهمي — حيث تُقرأ قيمة result.content[0].tool_changes[0].tool.type كـ tool_definition. لكن هذا لا يثبت شيئاً بشأن دعم الأنواع (typed support): لقد قمت بتشغيل نفس الفحص عبر @anthropic-ai/sdk 0.105.0، والذي لا يحتوي على نوع tool_changes في أي مكان فيه، وقرأت نفس القيمة المتداخلة. تقوم هذه العملاء (clients) بتمرير حقول الاستجابة غير المعروفة مباشرة، لذا فإن فحص الخصائص في وقت التشغيل (runtime property check) لا يمكنه التمييز بين "الـ SDK ينمذج هذا الحقل" وبين "الـ SDK يتجاهله". الدليل الوحيد الذي يحسم فعلياً دعم الأنواع هو الكود المصدري نفسه، وهو ما سنتناوله في القسم التالي.
متى يمكن للـ SDK أن يبني هذا لك فعلياً؟
عبارة "إضافة دعم" في ملاحظات الإصدار قد تعني أي شيء، بدءاً من نوع مُنشأ بالكامل وصولاً إلى مجرد قبول سلسلة نصية (string). لذا قمت بتحميل كل إصدار ذي صلة من كلا الـ SDKs الرسميين، واستخرجت الملفات، وبحثت باستخدام grep عن أسماء الأنواع المُنشأة — مع وجود عنصر تحكم إيجابي في كل عملية تشغيل (رمز يجب أن يكون موجوداً، مثل BetaMessage) حتى لا يتم الخلط بين النتيجة الفارغة وبين الغياب الفعلي.
النتيجة أكثر تفصيلاً مما توحي به سجلات التغيير. أنواع الضغط (Compaction types) ليست جديدة على الإطلاق: أقدم إصدار فحصته، TypeScript 0.105.0 بتاريخ 18-06-2026، كان يحتوي بالفعل على BetaCompactionBlock غير موقع وتكوين ضغط تلقائي مع pause_after_compaction. ما لم يكن يمتلكه هو أي طريقة لـ طلب الضغط — لا يوجد بارامتر compaction على المستوى الأعلى، ولا تكوين {type:'summarize'}. لقد وصلت كل قطعة بشكل منفصل:
| التاريخ | TypeScript | Python | ما تم تحويله إلى typed |
|---|---|---|---|
| أقدم نسخة تم فحصها | 0.105.0 (06-18) | 1.4.0 (09-04) | BetaCompactionBlock غير موقع + إعدادات autocompact — ولكن بدون بارامتر compaction عند الطلب |
| 2026-07-24 | 0.115.0 | — | بلوكات tool_addition/tool_removal عن طريق المرجع (By-reference)، في اليوم الذي تم فيه الإعلان عن نسخة beta لشهر يوليو4 |
| 2026-09-14 | — | — | توثيق compact-2026-09-04 بشكل علني6 |
| 2026-09-15 | 0.126.0 | 1.6.0 | بارامتر compaction?: BetaCompactionConfig على المستوى الأعلى، و signature على بلوك الـ compaction، وسلسلة header الخاصة بـ compact-2026-09-04 |
| 2026-09-18 | 0.127.0 | 1.7.0 | لا توجد إضافات جديدة هنا؛ حصل TypeScript على إصلاح comma-join الخاص بـ beta-header8 |
| 2026-09-22 | 0.128.0 | 1.8.0 | tool_definition عن طريق القيمة (By-value)، وسلسلة header الخاصة بـ inline-tools-2026-09-15، و tool_changes على بلوك الـ compaction |
الصف الأخير هو الأهم إذا كنت تقوم ببناء الـ handshake الموصوف أعلاه. tool_changes — الحقل الذي يحمل تاريخ الأدوات عبر حدود الـ compaction — أصبح typed في نفس الإصدار الذي ظهر فيه tool definition عن طريق القيمة الذي يشير إليه، في كلتا اللغتين، في 22 سبتمبر. قبل ذلك، كان نوع بلوك الـ compaction يحتوي على signature ولكن بدون أي tool_changes على الإطلاق.
يصف كلا سجلي التغييرات (changelogs) عمل 15 سبتمبر بكلمات متطابقة — "إضافة بارامتر compaction وبلوكات compaction موقعة (beta)" — وهو أمر منطقي، بما أن كلا الـ SDKs يتم توليدهما آلياً بدلاً من كتابتهما يدوياً (كل منهما يرسل headers طلبات X-Stainless-*).89 ملاحظة حول نطاق البحث الأثري: لقد فحصت TypeScript الإصدارات 0.105.0، 0.115.0، 0.120.0، 0.124.0، 0.125.0، 0.126.0، 0.127.0 و 0.128.0، و Python من 1.4.0 حتى 1.8.0 (كل إصدار في هذا النطاق). tool_definition وسلسلة inline-tools-2026-09-15 غائبان عن كل هذه الإصدارات قبل 22 سبتمبر وموجودان في كلا الـ SDKs بدءاً من ذلك التاريخ. لم أفحص إصدارات TypeScript السبعة بين 0.116.0 و 0.123.0 باستثناء 0.120.0.
الفجوة في الـ SDK القديم لم تكن متطابقة في كلتا اللغتين
لا يعني أي من ذلك أن الميزة لم تكن تعمل قبل 22 سبتمبر، وهنا تختلف البيئتان بطريقة لا تذكرها أي ملاحظات إصدار. قمت بتوجيه @anthropic-ai/sdk 0.105.0 — الذي لا يحتوي على أي إشارة إلى tool_addition أو inline-tools أو tool_definition في أي مكان في أنواعه — إلى نفس السيرفر الوهمي (mock server) وأرسلت كائن الطلب المطابق الذي أرسله الـ SDK الحالي للتو. وصل كلا الجسدين (bodies) بحجم 717 بايت وكانا متطابقين تماماً بايت مقابل بايت. كما قام العميل القديم بتمرير compaction: {type: "summarize"} على المستوى الأعلى دون تغيير، على الرغم من عدم وجود نوع (type) له.
يتصرف Python بشكل مختلف، لأن طرق الإنشاء (create methods) فيه تأخذ وسائط كلمات مفتاحية (keyword arguments) صريحة بدلاً من كائن خيارات. المخرجات الحقيقية من الاختبارين ضد anthropic 1.5.0:
Python SDK version: 1.5.0
--- TEST 1: inline tool_addition / tool_definition on OLD Python SDK ---
RESULT: SUCCEEDED at runtime, id = msg_mock_t
--- TEST 2: top-level compaction={'type':'summarize'} on OLD Python SDK ---
RESULT: TypeError -> Messages.create() got an unexpected keyword argument 'compaction'
إعادة تشغيل الاختبار 2 على anthropic 1.6.0 — الإصدار الذي أضاف البارامتر — تنجح، مما يحدد الحد عند هذا الإصدار بدلاً من تركه استنتاجياً من سجل التغييرات.
لذا فإن القاعدة العملية هي لكل لغة ولكل موقع. محتوى الرسالة عبارة عن dict أو كائن بسيط يقوم كلا الـ SDKs، في الإصدارات التي اختبرتها، بتسلسله كما هو مكتوب — وهذا هو السبب في أن tool_addition مبني يدويًا مع tool_definition كامل قد عمل على كلا العميلين القديمين. أما المعلمة top-level الجديدة فهي مختلفة: JavaScript ينشرها في جسم الطلب بغض النظر عن أي شيء، بينما يرفضها Python عند نقطة الاستدعاء حتى الإصدار الذي يضيف الكلمة المفتاحية. أي خدمة Python تريد ضغطًا (compaction) عند الطلب كانت بحاجة إلى anthropic ≥ 1.6.0 لإجراء الاستدعاء من الأساس — وليس مجرد لدعم المحرر.
قائمة التحقق العملية
- احتفظ بأداة واحدة على الأقل غير مؤجلة (non-deferred) مُعلنة مسبقًا. إذا كانت
toolsستبدأ فارغة بخلاف ذلك، فإن أول إضافة بالقيمة (by-value) ستكلف فقدانًا كاملاً لذاكرة التخزين المؤقت (cache miss) على أي حال.5 - إضافة خادم MCP في منتصف المحادثة تتطلب ترويسين (headers)،
mcp-client-2026-09-15جنبًا إلى جنب معinline-tools-2026-09-15، ويجب إرسال كتلةmcp_tool_listingمرة أخرى لتثبيت القائمة.15 - ضع
cache_controlفي مكان واحد فقط — إما في الكتلة أو في التعريف، وليس كليهما أبدًا — وتذكر أن التعريف المؤجل لا يمكنه حمل واحدة.5 - إذا قمت بضغط محادثة تغيرت أدواتها في منتصف المدى، فقم بتضمين
inline-tools-2026-09-15في طلب الضغط نفسه، وليس فقط في الأدوار السابقة، وإلا فإن الكتلة المرتجعة لن تحمل حقلtool_changesعلى الإطلاق.10 - أعد صياغة تعليمات النظام الثابتة بعد أول دور مستخدم جديد يلي عملية الضغط، وليس أبدًا في رسالة نظام بين كتلة الضغط والأدوار التي احتفظت بها.10
- ثبّت الإصدارات بناءً على ما تحتاجه فعليًا.
anthropic(Python) ≥ 1.6.0 هو متطلب تشغيل صارم لتمريرcompactionمن الأساس؛ أما ≥ 1.8.0 و@anthropic-ai/sdk≥ 0.128.0 فهي التي تمنحك أنواعًا (types) حقيقية لـtool_definitionبالقيمة ولـtool_changes.
ما لا يثبته هذا
لم يتم استخدام أي مفتاح API في أي مكان في هذا المنشور ولم يصل أي طلب إلى Anthropic. أشكال الطلب والاستجابة، والحدود وقواعد التخزين المؤقت مقتبسة من الوثائق الرسمية، التي تم جلبها في 2026-09-28؛1356710 ما قمت بقياسه هو ما تضعه إصدارات SDK هذه على الشبكة مقابل خادم أتحكم فيه، والأنواع الموجودة في كل إصدار منشور. لم أرَ استجابة API حية، لذا لم أؤكد أن API الحقيقي يعيد حقل tool_changes في الممارسة العملية، بل فقط أن الوثائق تحدد ذلك وأن الـ SDKs الحالية تعرّفه كنوع — كانت حمولة tool_changes الخاصة بي عبارة عن fixture كتبته بنفسي.
أرقام تكلفة التخزين المؤقت (cache-cost) هي قياسات ذاتية أبلغ عنها أحد المطورين لـ Claude Code، وليست لـ Messages API، ولم يتم إعادة إنتاجها بشكل مستقل. تغطي عملية البحث في الإصدارات (version archaeology) اثنين من الـ SDKs الرسمية بالإصدارات المذكورة أعلاه؛ لم أتحقق من LangChain، أو Vercel AI SDK، أو أي بوابة (gateway) لدعم الأدوات المضمنة (inline-tools) أو الضغط (compaction)، ولم أختبر ما إذا كانت تلك الأدوات تمرر أو ترفض معاملاً غير معروف على المستوى الأعلى (top-level parameter) بالطريقة التي يفعلها هذان العميلان.
الخلاصة
التاريخ الموجود في ترويسة البيتا يخبرك متى قامت Anthropic بإجراء تغيير الـ API، وليس متى يمكنك البناء عليه، ولا ماذا يحدث إذا لم تفعل ذلك. تم توثيق compact-2026-09-04 بعد عشرة أيام من تاريخ ختمه، وتم تحديد أنواعه (typed) في اليوم التالي لذلك. أما inline-tools-2026-09-15 فقد انتظر أسبوعاً حتى تم الإعلان عنه وعن أول مساعد أنواعه، واللذان وصلا معاً في 22 سبتمبر مع Claude Opus 5.5.
الاستنتاج الأكثر فائدة هو التكلفة الفعلية لاستخدام SDK قديم، لأن الإجابة ليست واحدة. داخل messages، لا توجد تكلفة: حيث أرسلت العملاء القدامى في كلتا اللغتين تعريف الأداة بالقيمة (by-value) بشكل صحيح بايت ببايت، سواء كانت هناك أنواع أم لا. أما على المستوى الأعلى، فالتكلفة تشمل كل شيء: فعميل Python نفسه الذي قام بتمرير كتلة tool_addition بسعادة، رفض قبول وسيط compaction على الإطلاق. إذا كنت تتبنى أي من إصدارات البيتا، فتحقق من أي من هذين الشكلين يمثل تغييرك قبل أن تقرر ما إذا كان ملف القفل (lockfile) الخاص بك مهماً.
لمعرفة كيف يبدو عدم التطابق في قائمة أدوات MCP من جانب العميل في جلسة نشطة، راجع AI SDK tool drift detection against a real MCP server. وبالنسبة لجانب إدارة السياق عبر الجلسات — الذاكرة التي تستمر لما بعد محادثة واحدة بدلاً من عملية ضغط (compaction) واحدة — راجع Claude Memory Tool + Context Editing.
Footnotes
-
Anthropic, Claude Platform release notes — the September 22, 2026 entry announcing Claude Opus 5.5 and inline tool definitions, including the
mcp_tool_listingpinning behaviour. https://platform.claude.com/docs/en/release-notes/overview (fetched 2026-09-28) ↩ ↩2 ↩3 ↩4 ↩5 -
anthropics/claude-code issue #92033, "Mid-conversation tool/MCP list changes silently invalidate prompt cache, causing repeated full-price rewrites within minutes" — the 857,710/782,873-token rewrite pair is from the issue author's own transcript excerpt; the 506-session, ~3.2 GB corpus analysis (2,766 events across 191 sessions, ~81,000 tokens each, 13.5% of spend in that corpus) is from commenter u2giants' own local logs. The issue's open/closed state was not legible in the page as fetched, so no status is claimed here. https://github.com/anthropics/claude-code/issues/92033 (fetched 2026-09-28) ↩ ↩2 ↩3
-
Anthropic, "Prompt caching" — the
tools→system→messagesprefix order and the cache-invalidation table quoted here. https://platform.claude.com/docs/en/build-with-claude/prompt-caching (fetched 2026-09-28) ↩ ↩2 ↩3 -
Anthropic, Claude Platform release notes — the July 24, 2026 entry announcing
mid-conversation-tool-changes-2026-07-01, quoted in full. https://platform.claude.com/docs/en/release-notes/overview (fetched 2026-09-28) ↩ ↩2 ↩3 -
Anthropic, "Mid-conversation system messages and tool changes" — the
tool_addition/tool_definitionshape, the cache-preservation rule and its non-deferred-tool exception, the two-header MCP requirement, the computer-use restriction, and theavailable_tools_limit_exceededlimits. https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages (fetched 2026-09-28) ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 -
Anthropic, Claude Platform release notes — the September 14, 2026 entry documenting on-demand compaction under
compact-2026-09-04. https://platform.claude.com/docs/en/release-notes/overview (fetched 2026-09-28) ↩ ↩2 ↩3 ↩4 -
Anthropic, "Compaction on demand" — the
compactionrequest parameter, the signed compaction block, and per-iteration usage billing. https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand (fetched 2026-09-28) ↩ ↩2 -
anthropics/anthropic-sdk-typescript CHANGELOG and tagged releases 0.115.0 through 0.128.0; version timestamps from the npm registry (
npm view @anthropic-ai/sdk time). Type presence verified by extracting each published tarball. https://github.com/anthropics/anthropic-sdk-typescript/blob/main/CHANGELOG.md (fetched 2026-09-28) ↩ ↩2 ↩3 ↩4 ↩5 -
anthropic (Python) release history on PyPI, versions 1.4.0 through 1.8.0, cross-checked against the anthropics/anthropic-sdk-python v1.6.0 release notes. Type presence verified by extracting each published wheel. https://pypi.org/pypi/anthropic/json, https://github.com/anthropics/anthropic-sdk-python/releases/tag/v1.6.0 (fetched 2026-09-28) ↩ ↩2 ↩3
-
Anthropic, "Compaction: thinking blocks and tool changes" — the
tool_changesfield and its dependency oninline-tools-2026-09-15, plus the system/tools/model swap and system-message placement rules, all quoted verbatim. https://platform.claude.com/docs/en/build-with-claude/compaction-thinking-blocks (fetched 2026-09-28) ↩ ↩2 ↩3 ↩4 ↩5 ↩6

