DeepSeek Harness: Python SDK: الواجهة البرمجية
آخر تحديث: 2026-08-31
واجهة الويب وسطر الأوامر رائعان للتفاعل البشري، لكن عندما تحتاج لدمج Agent في خطوط أتمتة أو سير عمل CI/CD أو تطبيقات مخصصة، Python SDK هو نقطة دخولك — بضعة أسطر كود لبدء جلسة Agent والحصول على استجابات منظمة.
📋 المتطلبات المسبقة: إكمال 06-tools.md، إلمام بنظام الأدوات؛ معرفة أساسية بـ Python
1. ما ستتعلمه
- تثبيت Python SDK وتهيئته
- إنشاء الجلسات وإرسال الرسائل
- الحصول على استجابات Agent ونتائج استدعاءات الأدوات
- معالجة المخرجات المتدفقة
- اعتراض استدعاءات الأدوات وتخصيصها
- معالجة الأخطاء وإدارة المهلة
2. التثبيت والتهيئة
(1) تثبيت SDK
pip install deepseek-dsh
التحقق من التثبيت:
import dsh
print(dsh.__version__)
# 0.x.x
(2) المتطلبات المسبقة
يتطلب Python SDK تشغيل خادم DSH:
# تشغيل خادم DSH أولاً (وضع Headless)
npx @deepseek-ai/dsh headless --port 3080
أو تحديد منفذ مخصص:
npx @deepseek-ai/dsh headless --port 8080
(3) تهيئة العميل
▶ مثال 1: إنشاء عميل SDK
from dsh import DSHClient
client = DSHClient(
base_url="http://127.0.0.1:3080",
api_key="your-api-key" # اختياري، إذا كان DSH يملك مصادقة مُعدة
)
▶ مثال 2: التهيئة باستخدام متغيرات البيئة
import os
from dsh import DSHClient
client = DSHClient.from_env()
# يقرأ متغيرات البيئة DSH_BASE_URL وDSH_API_KEY
3. إنشاء جلسة
(1) إنشاء جلسة جديدة
▶ مثال 3: إنشاء جلسة
session = client.create_session(
workspace="/home/alice/my-project",
model="deepseek-chat",
mode="standard"
)
print(f"معرف الجلسة: {session.id}")
print(f"مساحة العمل: {session.workspace}")
print(f"النموذج: {session.model}")
(2) إعداد الجلسة
session = client.create_session(
workspace="/home/alice/my-project",
model="deepseek-chat",
mode="ptc",
sandbox="permissive",
settings={
"temperature": 0.7,
"max_tokens": 4096
}
)
(3) استعادة جلسة موجودة
▶ مثال 4: الاستعادة بمعرف الجلسة
session = client.get_session("sess_abc123")
print(f"جلسة مستعادة: {session.id}")
print(f"الرسائل: {len(session.messages)}")
4. إرسال الرسائل والحصول على الاستجابات
(1) إرسال رسالة أساسية
▶ مثال 5: إرسال رسالة والحصول على استجابة كاملة
response = session.send("ساعدني في التحقق من package.json الخاص بالمشروع")
print(response.content)
# يُظهر package.json الخاص بالمشروع...
print(f"الأدوات المستخدمة: {len(response.tool_calls)}")
for tool in response.tool_calls:
print(f" - {tool.name}: {tool.status}")
(2) بنية الاستجابة
class AgentResponse:
content: str # رد Agent النصي
tool_calls: list[ToolCall] # سجلات استدعاءات الأدوات
model: str # النموذج المستخدم
tokens_used: int # الرموز المستهلكة
duration_ms: int # وقت الاستجابة
class ToolCall:
name: str # اسم الأداة
params: dict # معاملات الاستدعاء
status: str # حالة التنفيذ
result: Any # نتيجة التنفيذ
duration_ms: int # وقت التنفيذ
(3) محادثات متعددة الأدوار مع السياق
▶ مثال 6: محادثة متعددة الأدوار
# الدور الأول
resp1 = session.send("اعرض محتويات src/app.ts")
print(resp1.content)
# الدور الثاني (السياق تلقائي)
resp2 = session.send("أضف وسيط معالجة أخطاء لهذا الملف")
print(resp2.content)
# الدور الثالث
resp3 = session.send("شغّل الاختبارات للتأكد من عدم وجود أخطاء")
print(resp3.content)
5. استدعاءات الأدوات
(1) استدعاءات الأدوات التلقائية
في وضع Standard، يقرر Agent متى يستدعي الأدوات تلقائيًا:
response = session.send("أنشئ src/utils/helpers.ts، اكتب دالة debounce")
for tool in response.tool_calls:
print(f"الأداة: {tool.name}")
print(f"المعاملات: {tool.params}")
print(f"النتيجة: {tool.result}")
(2) معالجة موافقة الأدوات
عندما تتطلب عملية Agent موافقة، يوفر SDK آلية استدعاء عكسي:
▶ مثال 7: استدعاء عكسي للموافقة
def on_approval(tool_name: str, params: dict) -> bool:
print(f"موافقة مطلوبة: {tool_name}")
print(f"المعاملات: {params}")
# سماح تلقائي للعمليات الآمنة
if tool_name == "file_edit" and params.get("action") == "read":
return True
# العمليات الأخرى تتطلب تأكيدًا يدويًا
confirm = input(f"هل تسمح بـ {tool_name}؟ (y/n): ")
return confirm.lower() == "y"
session = client.create_session(
workspace="/home/alice/project",
approval_callback=on_approval
)
(3) تعطيل أدوات محددة
session = client.create_session(
workspace="/home/alice/project",
disabled_tools=["shell", "sandbox"]
)
(4) معالجة نتائج استدعاء الأدوات
▶ مثال 8: معالجة مفصلة لنتائج الأدوات
response = session.send("حلل تغطية الاختبار في المشروع")
for tool in response.tool_calls:
if tool.name == "shell":
output = tool.result.get("stdout", "")
if "Coverage" in output:
print(f"تغطية الاختبار: {output}")
elif tool.name == "search":
files = tool.result.get("files", [])
print(f"وُجد {len(files)} ملف اختبار")
elif tool.name == "file_edit":
action = tool.params.get("action")
path = tool.params.get("path")
print(f"ملف {action}: {path}")
6. معالجة المخرجات المتدفقة
(1) تفعيل المخرجات المتدفقة
للاستجابات الطويلة، استخدم المخرجات المتدفقة للحصول على النتائج في الوقت الفعلي:
▶ مثال 9: مخرجات متدفقة
for chunk in session.send_stream("اشرح تصميم بنية هذا المشروع بالتفصيل"):
if chunk.type == "content":
print(chunk.text, end="", flush=True)
elif chunk.type == "tool_call":
print(f"\n[أداة: {chunk.tool_name}]")
elif chunk.type == "tool_result":
print(f"[تم استلام نتيجة الأداة]")
(2) أنواع أحداث المخرجات المتدفقة
| نوع الحدث | الوصف | حقول البيانات |
|---|---|---|
content |
جزء محتوى نصي | text |
tool_call |
بدء استدعاء أداة | tool_name، params |
tool_result |
نتيجة تنفيذ أداة | tool_name، result |
approval |
طلب موافقة | tool_name، params |
done |
اكتمال الاستجابة | tokens_used، duration_ms |
error |
حدث خطأ | code، message |
(3) دمج التدفق مع الموافقة
▶ مثال 10: معالجة الموافقة في المخرجات المتدفقة
def auto_approve(tool_name: str, params: dict) -> bool:
safe_actions = ["read", "search"]
if params.get("action") in safe_actions:
return True
return False
for chunk in session.send_stream(
"أعد هيكلة جميع المتحكمات، أضف معالجة الأخطاء",
approval_callback=auto_approve
):
if chunk.type == "content":
print(chunk.text, end="")
elif chunk.type == "approval":
print(f"\n[موافقة تلقائية: {chunk.tool_name}]")
7. ميزات متقدمة
(1) تكامل وضع Headless
حالة استخدام SDK الأكثر شيوعًا هي الاقتران بوضع Headless لتنفيذ Agent غير مراقب:
▶ مثال 11: سير عمل Headless كامل
from dsh import DSHClient
client = DSHClient(base_url="http://127.0.0.1:3080")
def auto_approve(tool_name: str, params: dict) -> bool:
safe_tools = ["search", "file_edit", "plan"]
if tool_name in safe_tools:
action = params.get("action", "")
if action in ["read", "create"]:
return True
return False
session = client.create_session(
workspace="/home/alice/project",
model="deepseek-coder",
mode="ptc",
approval_callback=auto_approve
)
response = session.send(
"أضف وسيط التحقق من المدخلات لجميع المسارات، مع التأكد من أن معاملات الطلب تتطابق مع الأنواع المتوقعة"
)
print(f"الخطة: {response.content}")
print(f"الأدوات المستخدمة: {len(response.tool_calls)}")
print(f"الرموز: {response.tokens_used}")
(2) جلسات متزامنة
▶ مثال 12: جلسات متعددة متوازية
import concurrent.futures
def process_file(filepath: str):
client = DSHClient(base_url="http://127.0.0.1:3080")
session = client.create_session(workspace="/home/alice/project")
response = session.send(f"أضف اختبارات وحدة لـ {filepath}")
return {"file": filepath, "tests_added": len(response.tool_calls)}
files = [
"src/utils/format.ts",
"src/utils/validate.ts",
"src/routes/users.ts"
]
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
results = list(executor.map(process_file, files))
for r in results:
print(f"{r['file']}: {r['tests_added']} استدعاءات أدوات")
(3) معالجة الأخطاء
▶ مثال 13: معالجة الأخطاء
from dsh import DSHClient, DSHTimeoutError, DSHConnectionError
client = DSHClient(base_url="http://127.0.0.1:3080")
try:
session = client.create_session(workspace="/home/alice/project")
response = session.send("ساعدني في إصلاح جميع أخطاء TypeScript", timeout=300)
except DSHTimeoutError:
print("انتهت مهلة استجابة Agent. يرجى تبسيط المهمة أو زيادة المهلة")
except DSHConnectionError:
print("لا يمكن الاتصال بخادم DSH. يرجى التحقق من تشغيله")
except Exception as e:
print(f"خطأ غير معروف: {e}")
8. مقارنة SDK بواجهة الويب/سطر الأوامر
| البُعد | واجهة الويب | سطر الأوامر | Python SDK |
|---|---|---|---|
| طريقة التفاعل | متصفح | طرفية | كود |
| مناسب لـ | الجميع | المطورين | مهندسي الأتمتة |
| آلية الموافقة | نافذة منبثقة تفاعلية | تأكيد سطر الأوامر | دالة استدعاء عكسي |
| المخرجات المتدفقة | عرض في الوقت الفعلي | مخرجات طرفية | تدفق أحداث |
| التزامن | جلسة واحدة | جلسة واحدة | جلسات متعددة |
| قدرة الدمج | منخفضة | متوسطة | عالية |
| منحنى التعلم | الأدنى | منخفض | متوسط |
❓ أسئلة شائعة
client = DSHClient(base_url="...", debug=True). جميع طلبات واستجابات HTTP ستُطبع في الطرفية.📖 ملخص
- Python SDK يُثبت عبر
pip install deepseek-dsh - SDK يتطلب تشغيل خادم DSH (وضع Headless)
- إنشاء جلسة → إرسال رسالة → الحصول على استجابة هو التدفق الأساسي من ثلاث خطوات
- موافقة الأدوات تُعالج عبر دوال الاستدعاء العكسي
- المخرجات المتدفقة
send_stream()مناسبة للاستجابات الطويلة - يدعم جلسات متزامنة ومعالجة الأخطاء والتحكم بالمهلة
- SDK مناسب للدمج الآلي؛ الاستخدام اليومي يوصى بواجهة الويب
📝 تمارين
1. ⭐ أساسي: ثبّت Python SDK، شغّل DSH في وضع Headless، أنشئ جلسة باستخدام SDK وأرسل رسالة "مرحبًا"، اطبع محتوى رد Agent.
2. ⭐⭐ متوسط: اكتب نص Python يستخدم SDK لجعل Agent يقرأ README.md الخاص بالمشروع ويُولد تقرير ملخص، ويحفظه في project-summary.txt.
3. ⭐⭐⭐ تحدٍ: اكتب نص معالجة دفعية يستخدم جلسات متزامنة لجعل 3 Agents تحلل جودة الكود في أدلة مشروع مختلفة في وقت واحد، وتُنتج تقرير جودة كود موحد.