دليل Claude Agent SDK: أمثلة بلغتي Python وTypeScript

ثبّت Claude Agent SDK، ونفّذ أول استعلام لك بلغتي Python وTypeScript، ثم أضف أدوات مخصصة ووكلاء فرعيين وhooks وحدودًا للإنفاق وجلسات قابلة للاستئناف. كل مثال مُراجَع على التوثيق الحالي وجاهز للصقه في مشروعك.

دليل Claude Agent SDK: أمثلة بلغتي Python وTypeScript
Cristian Da Conceicao
مؤسس Picasso IA

يتيح لك Claude Agent SDK تشغيل حلقة الوكيل نفسها التي تعمل بها Claude Code، من داخل برنامجك الخاص بلغة Python أو TypeScript. ترسل أمرًا نصيًا واحدًا، فيقرأ Claude الملفات، ويشغّل الأوامر، ويعدّل الشيفرة، ويستدعي دوالك الخاصة حتى ينتهي العمل، ويبثّ إليك كل خطوة أثناء تنفيذها. يبني هذا الدليل SDK طبقة فوق أخرى: أول استعلام بكل لغة، ثم الأدوات المخصصة، والوكلاء الفرعيون، وhooks، وحدود الإنفاق، والجلسات القابلة للاستئناف. كل مقتطف يتبع التوثيق الحالي، لذا يمكنك نسخه وضبط متغير بيئة واحد وتشغيله.

ماذا يفعل Agent SDK

الوكيل برنامج يقرر خطوته التالية بنفسه. يقرأ الطلب، ويختار أداة، وينظر في النتيجة، ويواصل حتى ينتهي العمل. يمنحك Agent SDK هذه الحلقة جاهزة: الأدوات المدمجة نفسها، ونظام الأذونات، وإدارة السياق، وhooks التي تعمل داخل Claude Code، مقدَّمة كمكتبة للغتي Python وTypeScript.

الفرق العملي عن استدعاء API مباشرةً هو من يكتب الحلقة. مع Client SDK ترسل رسالة، وتتحقق مما إذا طلب Claude أداة، ثم تشغّلها، وترسل النتيجة إليه، وتكرر ذلك. أما مع Agent SDK فتستدعي query() مرة واحدة، وتمرّ على الرسائل التي تُبث إليك بينما يعمل Claude.

تتبع كل دورة في هذه الحلقة الإيقاع نفسه. يتلقى Claude المطالبة وتعريفات الأدوات، ثم يقرر إن كان سيجيب أو يستدعي أداة. يشغّل SDK الأداة ويعيد النتيجة إليه، وتتكرر الدورة حتى لا يبقى لدى Claude ما يفعله أو يوقفه حدّ ما. تصل كل خطوة إلى شيفرتك على هيئة رسالة، ولهذا تبدو الأمثلة أدناه كمعالجة لتدفق بيانات لا كطلب وردّ واحد. وهذا يعني أنك تستطيع عرض التقدم للمستخدم، أو تسجيل كل استدعاء أداة، أو الإيقاف المبكر.

SDK أم Client SDK أم CLI

تبدو الخيارات الأربعة متشابهة، لذلك يرتّبها هذا الجدول بحسب من يشغّل الوكيل.

الهدفاستخدمما تحصل عليه
تضمين وكيل داخل تطبيق Python أو TypeScript الخاص بكAgent SDKحلقة وكيل Claude Code كمكتبة، مع أدوات مدمجة وأذونات وجلسات وhooks
العمل تفاعليًا من الطرفيةClaude Code CLIواجهة طرفية مصممة للاستخدام اليومي والمهام الفردية
استدعاء Claude API من شيفرتكClient SDKوصول مباشر إلى الـAPI حيث تكتب حلقة الأدوات بنفسك
أن تستضيف Anthropic الوكيلManaged Agentsحزام تشغيل مستضاف يدير الحلقة داخل بيئة معزولة مُدارة

💡 نصيحة: لتشغيل الحلقة نفسها من لغة أخرى، شغّل CLI كعملية فرعية مع العلامة -p و--output-format json.

ما الذي تحتاجه أولًا

يجب توفر ثلاثة أشياء قبل كتابة أول سطر شيفرة:

  • Python 3.10+ أو Node.js 18+
  • حساب Anthropic مع مفتاح API من Claude Console
  • مجلد شيفرة يعمل عليه الوكيل، لأنه يستطيع افتراضيًا قراءة الملفات في مجلد العمل الخاص به ومجلداته الفرعية

تحمل الحزمتان ملف Claude Code الثنائي المُصرَّف، لذا يكفي التثبيت العادي. وهناك حالتان تكسران ذلك: عودة pip إلى حزمة المصدر (وأشهر حالاتها Windows على ARM64)، وتثبيت npm يتخطى التبعيات الاختيارية. في الحالتين ثبّت Claude Code بشكل أصلي وسيجده SDK.

لقطة مقرّبة ليدَي مطوّر وهما تكتبان على مكتب في ضوء نافذة ناعم

التثبيت والمصادقة

تثبيت الحزمة

في Python، أنشئ بيئة افتراضية وثبّت الحزمة:

python3 -m venv .venv
source .venv/bin/activate
pip install claude-agent-sdk

على Windows PowerShell يكون سطر التفعيل .venv\Scripts\Activate.ps1. أما في TypeScript فأنشئ مشروعًا وأضف الحزمة مع tsx:

npm init -y
npm pkg set type=module
npm install @anthropic-ai/claude-agent-sdk
npm install --save-dev tsx

يتيح ضبط "type": "module" استخدام await على المستوى الأعلى في سكربتك، ويشغّل tsx ملفات TypeScript دون خطوة بناء.

ضبط بيانات الاعتماد

يقرأ SDK بيانات اعتمادك من متغير بيئة في الصدفة التي تشغّل الوكيل:

export ANTHROPIC_API_KEY=your-api-key
$env:ANTHROPIC_API_KEY = "your-api-key"

لا يحمّل SDK ملفات .env بنفسه. إذا كنت تحفظ بيانات الاعتماد في أحد هذه الملفات، فحمّله أولًا باستخدام python-dotenv أو حزمة dotenv. تعمل مزودات السحابة أيضًا: اضبط CLAUDE_CODE_USE_BEDROCK=1 لخدمة Amazon Bedrock، أو CLAUDE_CODE_USE_VERTEX=1 لـGoogle Cloud، أو CLAUDE_CODE_USE_FOUNDRY=1 لـMicrosoft Foundry، ثم اضبط بيانات اعتماد ذلك المزود.

💡 ملاحظة بشأن السياسة: ما لم توافق Anthropic على ذلك مسبقًا، قد لا تقدم المنتجات الخارجية المبنية على SDK تسجيل الدخول عبر claude.ai أو حدود معدل الاستخدام الخاصة به. استخدم بيانات اعتماد API لأي شيء تنشره.

مطوّر يعمل على مكتب واقف في مكتب علوي (لوفت) مشرق

أول وكيل لك بلغتين

أنشئ ملفًا اسمه utils.py يحتوي على خطأين متعمدين: قائمة فارغة تُسقط حساب المتوسط، ومستخدم مفقود يُسقط البحث عن الاسم:

def calculate_average(numbers):
    total = 0
    for num in numbers:
        total += num
    return total / len(numbers)


def get_user_name(user):
    return user["name"].upper()

الوكيل أدناه للقراءة فقط. يستطيع فحص الملف، لكن ليس لديه إذن لتغيير أي شيء.

نسخة Python

import asyncio
from claude_agent_sdk import (
    query,
    ClaudeAgentOptions,
    AssistantMessage,
    ResultMessage,
    TextBlock,
)


async def main():
    options = ClaudeAgentOptions(
        system_prompt="You review Python code and report crash risks in plain language.",
        allowed_tools=["Read", "Glob", "Grep"],
        max_turns=8,
    )

    async for message in query(
        prompt="Look at utils.py and list every input that would crash it.",
        options=options,
    ):
        if isinstance(message, AssistantMessage):
            for block in message.content:
                if isinstance(block, TextBlock):
                    print(block.text)
        elif isinstance(message, ResultMessage):
            print(f"Finished: {message.subtype}, cost: ${message.total_cost_usd}")


asyncio.run(main())

إليك ما يفعله كل جزء:

  • query() يُرجع مكرِّرًا غير متزامن (async iterator)، لذا تمرّ عليه بـasync for بينما يفكر Claude ويستدعي الأدوات ويقرأ النتائج
  • allowed_tools يوافق مسبقًا على Read وGlob وGrep، وهي ثلاث أدوات تستطيع فحص الملفات دون تعديلها
  • كتل AssistantMessage تحمل نص Claude واستدعاءات أدواته، لذا فالتصفية حسب TextBlock تعطيك مخرجات مقروءة
  • تصل ResultMessage في الأخير، ومعها subtype وtotal_cost_usd وnum_turns وsession_id

جهاز لابتوب على طاولة مقهى من الرخام، مُصوَّر من زاوية منخفضة

نسخة TypeScript

احفظ هذا الملف باسم agent.ts وشغّله بالأمر npx tsx agent.ts:

import { query } from "@anthropic-ai/claude-agent-sdk";

for await (const message of query({
  prompt: "Look at utils.py and list every input that would crash it.",
  options: {
    systemPrompt: "You review Python code and report crash risks in plain language.",
    allowedTools: ["Read", "Glob", "Grep"],
    maxTurns: 8
  }
})) {
  if (message.type === "assistant" && message.message?.content) {
    for (const block of message.message.content) {
      if ("text" in block) console.log(block.text);
    }
  } else if (message.type === "result") {
    console.log(`Finished: ${message.subtype}, cost: $${message.total_cost_usd}`);
  }
}

شغّل أيًا من السكربتين، ويفترض أن ترى Claude يقرأ utils.py، ويصف الخطأين (القسمة على صفر في القائمة الفارغة وTypeError للمستخدم المفقود)، وينتهي بسطر مثل Finished: success. إذا ظهر خطأ مصادقة مثل Not logged in، فمعنى ذلك أن متغير البيئة غير موجود في الصدفة التي شغّلت السكربت، وهذا أكثر الأخطاء شيوعًا في التشغيل الأول.

المنطق واحد في اللغتين، لكن أسماء الخيارات تختلف في حالة الأحرف. احتفظ بهذا الجدول قريبًا منك، فهو يفسّر معظم لحظات "لماذا لا يعمل هذا" عند نقل الشيفرة بين الحزمتين.

الإعدادPythonTypeScript
الأدوات الموافَق عليها مسبقًاallowed_toolsallowedTools
وضع الأذوناتpermission_modepermissionMode
حد عدد الدوراتmax_turnsmaxTurns
حد الإنفاقmax_budget_usdmaxBudgetUsd
خوادم الأدوات المخصصةmcp_serversmcpServers
استئناف جلسةresumeresume
الوكلاء الفرعيونagentsagents

قوائم الأدوات هي وسيلتك لرفع مستوى الاستقلالية أو خفضه:

الأدواتما يستطيع الوكيل فعله
Read، Glob، Grepفحص الشيفرة دون تغيير أي شيء
Read، Edit، Globفحص الشيفرة وتعديلها
Read، Edit، Bash، Glob، Grepالتشغيل من البداية للنهاية، بما في ذلك أوامر الصدفة

منظر من الأعلى لمكتب خشبي عليه جهاز لابتوب ودفتر مرسوم عليه مخططات بخط اليد

💡 سلوكان عليك توقعهما: يرفع query() من نوع الاستدعاء الواحد استثناءً بعد أن يُرجع نتيجة خطأ، مثل بلوغ حد الدورات، لذا لُفّ الحلقة داخل try/except أو try/catch عندما يجب أن يستمر السكربت في العمل. كما أن SDK يقرأ افتراضيًا مجلد .claude/ في مشروعك وملف ~/.claude/، كما تفعل CLI، فتنطبق عليك الإعدادات والمهارات وhooks المعرّفة هناك أيضًا.

بناء أدوات مخصصة

تتولى الأدوات المدمجة الملفات والصدفة. أما منطقك الخاص، كالبحث في قاعدة بيانات أو استدعاء واجهة داخلية، فيُوضع في أداة مخصصة: دالة تُغلَّف في خادم MCP داخل العملية نفسها، يعمل داخل تطبيقك ولا يعمل كعملية منفصلة.

للأداة أربعة أجزاء: اسم، ووصف يقرؤه Claude ليقرر متى يستدعيها، ومخطط إدخال، ومعالج (handler) غير متزامن يُرجع مصفوفة content. اكتب الوصف كما تكتب توجيهات لزميل جديد.

تسجّل الخادم عبر mcp_servers (mcpServers في TypeScript). يصبح الاسم الذي تعطيه للخادم في ذلك القاموس جزءًا من الاسم الكامل للأداة، وفق النمط mcp__{server}__{tool}. ضع هذا الاسم الكامل في قائمة الأدوات المسموح بها، فينفذ الاستدعاء دون مطالبة بالإذن.

أداة Python

import asyncio
from typing import Any
from claude_agent_sdk import (
    tool,
    create_sdk_mcp_server,
    query,
    ClaudeAgentOptions,
    ResultMessage,
)

ORDERS = {"A100": "shipped", "A101": "packing"}


@tool("get_order_status", "Look up the status of an order by its id", {"order_id": str})
async def get_order_status(args: dict[str, Any]) -> dict[str, Any]:
    status = ORDERS.get(args["order_id"])
    if status is None:
        return {
            "content": [{"type": "text", "text": f"No order {args['order_id']}"}],
            "is_error": True,
        }
    return {"content": [{"type": "text", "text": f"Order {args['order_id']}: {status}"}]}


shop_server = create_sdk_mcp_server(
    name="shop", version="1.0.0", tools=[get_order_status]
)


async def main():
    options = ClaudeAgentOptions(
        mcp_servers={"shop": shop_server},
        allowed_tools=["mcp__shop__get_order_status"],
    )
    async for message in query(prompt="Where is order A100?", options=options):
        if isinstance(message, ResultMessage) and message.subtype == "success":
            print(message.result)


asyncio.run(main())

أداة TypeScript

تصف TypeScript مدخلات الأداة باستخدام Zod، لذا شغّل npm install zod أولًا:

import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
import { z } from "zod";

const orders: Record<string, string> = { A100: "shipped", A101: "packing" };

const getOrderStatus = tool(
  "get_order_status",
  "Look up the status of an order by its id",
  { order_id: z.string().describe("Order id such as A100") },
  async (args) => {
    const status = orders[args.order_id];
    if (!status) {
      return {
        content: [{ type: "text", text: `No order ${args.order_id}` }],
        isError: true
      };
    }
    return { content: [{ type: "text", text: `Order ${args.order_id}: ${status}` }] };
  }
);

const shopServer = createSdkMcpServer({
  name: "shop",
  version: "1.0.0",
  tools: [getOrderStatus]
});

for await (const message of query({
  prompt: "Where is order A100?",
  options: {
    mcpServers: { shop: shopServer },
    allowedTools: ["mcp__shop__get_order_status"]
  }
})) {
  if (message.type === "result" && message.subtype === "success") {
    console.log(message.result);
  }
}

طاولة عمل لحرفي مرتّبة عليها أدوات يدوية بعناية

💡 نصيحة: في حالات الفشل المتوقعة، مثل رقم طلب غير معروف، أرجِع is_error: True (isError: true في TypeScript) مع رسالتك الخاصة. سيقرأ Claude الرسالة ويستطيع إعادة المحاولة أو الشرح، بدلًا من أن يتلقى نص استثناء مجردًا.

الوكلاء الفرعيون وhooks والحدود

وكيل واحد يعمل بداية جيدة. ثلاث ميزات تُبقي الوكيل الأكبر قابلًا للتنبؤ: الوكلاء الفرعيون يقسّمون العمل، وhooks تراقب كل استدعاء أداة، والحدود توقف الجلسة إذا خرجت عن السيطرة.

تفويض المهام إلى وكلاء فرعيين

الوكيل الفرعي نسخة منفصلة من الوكيل يُنشئها وكيلك الرئيسي لمهمة محددة. يبدأ كل وكيل فرعي بسياق جديد، لذا يستطيع مراجع أن يقرأ عشرات الملفات دون أن يثقل المحادثة الرئيسية، ولا يعود إلى الأصل إلا رسالته الأخيرة. تعرّفهم بخيار agents وتضيف Agent إلى الأدوات المسموح بها.

يحتاج كل تعريف إلى description (متى ينبغي على Claude أن يستخدمه) وprompt (سلوكه). تشمل الحقول الاختيارية tools لتقييد ما يستطيع الوصول إليه، وmodel الذي يقبل الأسماء المستعارة sonnet وopus وhaiku وfable وinherit، أو معرّف النموذج الكامل.

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition


async def main():
    options = ClaudeAgentOptions(
        allowed_tools=["Read", "Grep", "Glob", "Agent"],
        agents={
            "code-reviewer": AgentDefinition(
                description="Reviews code for security and maintainability problems.",
                prompt="You are a careful reviewer. Report concrete problems with file names.",
                tools=["Read", "Grep", "Glob"],
                model="sonnet",
            ),
            "test-runner": AgentDefinition(
                description="Runs the test suite and summarizes failures.",
                prompt="Run the tests, then list each failing test with its error.",
                tools=["Bash", "Read", "Grep"],
            ),
        },
    )
    async for message in query(
        prompt="Use the code-reviewer agent to check the auth module",
        options=options,
    ):
        if hasattr(message, "result"):
            print(message.result)


asyncio.run(main())

تستخدم نسخة TypeScript كائنات بسيطة:

import { query } from "@anthropic-ai/claude-agent-sdk";

for await (const message of query({
  prompt: "Use the code-reviewer agent to check the auth module",
  options: {
    allowedTools: ["Read", "Grep", "Glob", "Agent"],
    agents: {
      "code-reviewer": {
        description: "Reviews code for security and maintainability problems.",
        prompt: "You are a careful reviewer. Report concrete problems with file names.",
        tools: ["Read", "Grep", "Glob"],
        model: "sonnet"
      }
    }
  }
})) {
  if ("result" in message) console.log(message.result);
}

تسمية الوكيل الفرعي في مطالبتك، كما في المثال أعلاه، تضمن أن يستخدمه Claude. وبدون ذلك يطابق Claude المهمة مع كل description، لذلك تعني الأوصاف الغامضة تفويضًا فائتًا.

💡 ملاحظة عن الإصدار: تظهر الأداة باسم Agent في كتل استخدام الأدوات. كانت الإصدارات الأقدم تسميها Task، وما زالت قائمة الأدوات في رسالة init تستخدم هذا الاسم، لذا طابِق الاسمين عندما تكتشف استدعاءات الوكلاء الفرعيين في تدفق الرسائل.

ثلاثة زملاء يتعاونون حول طاولة عليها لوح أبيض مغطى بملاحظات لاصقة

حظر الاستدعاءات الخطرة باستخدام hooks

الـhooks دوال استدعاء تعمل عند نقاط ثابتة في حلقة الوكيل. أكثرها فائدة PreToolUse، الذي يُطلق قبل تشغيل أداة ويستطيع رفضها. يصفّي matcher حسب اسم الأداة، مثل Bash أو Write|Edit. أرجِع {} للسماح بالاستدعاء.

يرفض هذا الـhook في Python أي أمر صدفة يحتوي على حذف متكرر:

import asyncio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, HookMatcher


async def block_destructive_bash(input_data, tool_use_id, context):
    command = input_data["tool_input"].get("command", "")
    if "rm -rf" in command:
        return {
            "hookSpecificOutput": {
                "hookEventName": input_data["hook_event_name"],
                "permissionDecision": "deny",
                "permissionDecisionReason": "Recursive deletes are blocked",
            }
        }
    return {}


async def main():
    options = ClaudeAgentOptions(
        allowed_tools=["Bash", "Read"],
        hooks={
            "PreToolUse": [HookMatcher(matcher="Bash", hooks=[block_destructive_bash])]
        },
    )

    async with ClaudeSDKClient(options=options) as client:
        await client.query("Clean up the build folder")
        async for message in client.receive_response():
            print(message)


asyncio.run(main())

والحماية نفسها في TypeScript:

import { query, HookCallback, PreToolUseHookInput } from "@anthropic-ai/claude-agent-sdk";

const blockDestructiveBash: HookCallback = async (input) => {
  const pre = input as PreToolUseHookInput;
  const toolInput = pre.tool_input as Record<string, unknown>;
  const command = String(toolInput?.command ?? "");

  if (command.includes("rm -rf")) {
    return {
      hookSpecificOutput: {
        hookEventName: pre.hook_event_name,
        permissionDecision: "deny",
        permissionDecisionReason: "Recursive deletes are blocked"
      }
    };
  }
  return {};
};

for await (const message of query({
  prompt: "Clean up the build folder",
  options: {
    allowedTools: ["Bash", "Read"],
    hooks: { PreToolUse: [{ matcher: "Bash", hooks: [blockDestructiveBash] }] }
  }
})) {
  if (message.type === "result") console.log(message.subtype);
}

عندما تتطابق عدة hooks، تعمل بالتوازي ويفوز الرد الأشد. يكفي deny واحد لحظر الاستدعاء مهما أرجعت الـhooks الأخرى، لذا اكتب كل hook ليعمل بمفرده.

قفل نحاسي ثقيل على بوابة خشبية متآكلة

تحديد الدورات والإنفاق

تضبط أوضاع الأذونات المستوى الافتراضي للثقة. اختر أحدها بـpermission_mode أو permissionMode:

الوضعالسلوك
defaultالسلوك المعياري، وتمر الأدوات غير الموافَق عليها عبر مسار الأذونات
acceptEditsتتم الموافقة على تعديلات الملفات تلقائيًا
planللتخطيط فقط: يبحث الوكيل دون أن يعدّل
dontAskيُرفض كل ما لم يُوافَق عليه مسبقًا
bypassPermissionsتُتخطى فحوصات الأذونات، فاستخدمه بحذر شديد
autoيراجع مصنّف نموذج كل إجراء

حدّان رقميان يحميان ميزانيتك. max_turns (maxTurns) يحدّ عدد دورات الوكيل، وmax_budget_usd (maxBudgetUsd) يحدّ الإنفاق المقدَّر. وعند بلوغهما ينتهي الاستعلام بنوعي النتيجة error_max_turns أو error_max_budget_usd. تُحتسب طلبات الوكلاء الفرعيين ضمن total_cost_usd نفسه، لذلك تبقى المطالبة التي تتفرع إلى عدة وكلاء فرعيين خاضعة للحد نفسه.

💡 نصيحة للمهام غير المراقَبة: اجمع dontAsk مع قائمة صريحة بالأدوات المسموح بها. يُرفض فورًا كل ما يقع خارج القائمة، بدلًا من انتظار إنسان لن يكون موجودًا.

تتكرر ثلاثة أخطاء في أول الوكلاء:

  • منح Bash مبكرًا. ابدأ بأدوات القراءة فقط، وأضف Edit أو Bash عندما تفرض المهمة ذلك.
  • أوصاف غامضة للوكلاء الفرعيين. يفوّض Claude بناءً على نص description، لذا يُتجاهل "وكيل مساعد"، بينما يُستخدم "يراجع الشيفرة بحثًا عن مشكلات أمنية".
  • عدم وضع حدود في التشغيل الأول. اضبط max_turns وmax_budget_usd قبل أن توجّه الوكيل إلى مستودع كبير.

الحفاظ على السياق عبر الجلسات

كل استدعاء لـquery() يبدأ جلسة جديدة. عندما ينبغي لمتابعة أن تتذكر ما قرأه الوكيل وقرره، تحتاج إلى طريقة لاستمرار الجلسة.

المحادثة متعددة الأدوار في Python

يتتبع ClaudeSDKClient الجلسة نيابةً عنك. كل client.query() يواصل المحادثة نفسها:

import asyncio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions


async def main():
    options = ClaudeAgentOptions(allowed_tools=["Read", "Edit", "Glob", "Grep"])

    async with ClaudeSDKClient(options=options) as client:
        await client.query("Inspect the auth module")
        async for message in client.receive_response():
            print(message)

        # Same session, so the agent remembers the first answer
        await client.query("Now refactor it to use JWT")
        async for message in client.receive_response():
            print(message)


asyncio.run(main())

الاستئناف في TypeScript

لا تملك TypeScript كائن عميل، لذا تلتقط session_id من رسالة النتيجة وتمرّره مجددًا عبر resume:

import { query } from "@anthropic-ai/claude-agent-sdk";

let sessionId: string | undefined;

for await (const message of query({
  prompt: "Inspect the auth module",
  options: { allowedTools: ["Read", "Glob", "Grep"] }
})) {
  if (message.type === "result") sessionId = message.session_id;
}

for await (const message of query({
  prompt: "Now propose a refactor based on what you found",
  options: { resume: sessionId, allowedTools: ["Read", "Glob", "Grep"] }
})) {
  if (message.type === "result" && message.subtype === "success") {
    console.log(message.result);
  }
}

يقبل Python الفكرة نفسها بصيغة resume=session_id. تدعم اللغتان أيضًا continue_conversation=True / continue: true لاستكمال أحدث جلسة في المجلد، وfork_session=True / forkSession: true لتفريع نسخة من السجل حتى تجرّب طريقة مختلفة دون أن تخسر الأصل.

هناك حدّان مهمان عمليًا. تخزّن الجلسات المحادثة، لا ملفاتك، لذلك إذا عدّل وكيل متفرع الشيفرة فسيغيّر الملفات الحقيقية. كما تُحفظ ملفات الجلسات على الجهاز الذي أنشأها، لذا يتطلب استئنافها على مضيف آخر مهايئ مخزن جلسات أو نسخة منقولة من السجل.

دفتر مفتوح بإشارة كتاب من شريط، وقلم حبر في طيّته

استخدام Claude Sonnet 5 على PicassoIA

يعمل Agent SDK على جهازك ببيانات اعتمادك الخاصة، لذلك لا يحل PicassoIA محله. ما يقدمه PicassoIA مفيد في مرحلة الصياغة. صياغة موجّه النظام، أو وصف الوكيل الفرعي، أو وصف الأداة، تحدد مدى جودة سلوك الوكيل، واختبار الصياغة في واجهة محادثة أسرع من إعادة تشغيل السكربت عشر مرات.

صِغ الأوامر قبل كتابة الشيفرة

صُمّم Claude Sonnet 5 لمهام البرمجة متعددة الخطوات واستخدام الأدوات، ما يجعله بديلًا مناسبًا لتجربة تعليمات الوكيل. اتبع هذه الخطوات:

  1. افتح صفحة Claude Sonnet 5 على PicassoIA.
  2. الصق تعليمات الوكيل المسودّة في حقل System Prompt.
  3. اكتب مهمة واقعية في Prompt، مثل محتوى utils.py مع عبارة "اسرد كل مدخل قد يُسقطه".
  4. اضبط effort. القيمة الافتراضية هي low، التي تُوقف التفكير لتحصل على أسرع رد وأرخصه. ارفعها إلى high أو max للأخطاء التي تمتد عبر عدة ملفات.
  5. اترك max_tokens على القيمة الافتراضية 8192، وهي كافية لشيفرة أو نص مفصّل في رد واحد.
  6. يمكنك اختياريًا إرفاق لقطة شاشة لخطأ عبر مدخل image، لأن النموذج يستطيع قراءتها.
  7. شغّل الطلب، وشدّد الصياغة حتى تطابق الإجابة ما تريده، ثم انسخ النص النهائي إلى system_prompt أو إلى prompt الخاص بالوكيل الفرعي.

💡 تذكّر: هذا يجرّب الصياغة فقط. أدوات الملفات وhooks وحلقة الوكيل ما زالت تأتي من SDK على جهازك.

اختر نموذج Claude المناسب

يعرض PicassoIA عدة نماذج من Claude، ولكل منها مهمة صياغة تناسبها:

النموذجالأنسب لـ
Claude Sonnet 5مهام البرمجة واستخدام الأدوات مع جهد قابل للتعديل
Claude Fable 5مهام البرمجة المعقدة
Claude Opus 4.7البرمجة وقراءة الصور والاستدلال في نموذج واحد
Claude 4.5 Haikuردود سريعة نصية وبرمجية

في SDK نفسه، يقبل حقل model الأسماء المستعارة الموصوفة سابقًا، لذا يمكنك تشغيل نموذج اقتصادي للوكلاء الفرعيين الروتينيين، ونموذج أقوى للخيط الرئيسي.

أنشئ صورك الخاصة مع PicassoIA

صار لديك الآن وكيل يعمل، إضافة إلى عادة اختبار كل جزء قبل نشره. العادة نفسها تحسّن توليد الصور، وPicassoIA مكان سريع للتدرب عليها.

افتح Seedream 4.5 أو GPT Image 2 واكتب أمرًا بالبنية نفسها المستخدمة في الصور داخل هذا المقال: الشخص وفعله، والمكان، واتجاه الضوء، والعدسة، وملمس سطح أو اثنين. سطر مثل "أيدٍ تكتب على مكتب خشبي، ضوء نافذة ناعم من اليمين، عدسة 85 مم، عمق ميدان ضحل، غبار مرئي على تفاصيل الخشب" يمنح النموذج مادة أكثر بكثير من "مبرمج يكتب".

جرّبه على الترويسة التالية للمدونة، أو صورة المنتج، أو لافتة التوثيق التي تحتاجها. غيّر تفصيلًا واحدًا في كل تشغيل، وقارن النتائج جنبًا إلى جنب، واحتفظ بالأمر الذي ينجح. وإذا أردت أن ترى ما هو متاح أيضًا، فتصفح كل النماذج على picassoia.com/en/all-models وابدأ أول توليد لك اليوم.

مطوّر يستند إلى الخلف على كرسيه بابتسامة مسترخية بجانب جهاز لابتوب مفتوح

شارك هذا المقال

اختر لغتك

مقالات ذات صلة