تخطَّ إلى المحتوى

واجهة البرمجة (API) ونقاط التوسعة

واجهة HTTP/SSE لواجهة كاظمة على الويب، وعقد أحداث الأحداث المُرسلة من الخادم (SSE)، والأماكن المحدّدة لتوسعة الإطار (الأدوات، المُزوّدون، المُحوّلات، المهارات، MCP).


1. واجهة واجهة البرمجة (API)

Section titled “1. واجهة واجهة البرمجة (API)”

تُحمَّل جميع نقاط النهاية بواسطة KazmaAppBuilder في kazma-ui/kazma_ui/app.py:615-709. المُوجّهات:

المُوجّهالبادئة/النطاقالمصدر
health_router/health/*health.py
chat_routerمسارات الصفحات (/chat, …)chat.py
settings_router/settingssettings.py
skills_routerالمهاراتمسارات skills
mcp_routerMCPمسارات mcp
agents_routerالوكلاءمسارات agents
providers_router/api/providersمسارات providers
sse_router/api/chat/*sse_chat.py
telemetry_routerالقياس عن بُعدمسارات telemetry
dashboard_router/api/dashboard/*dashboard.py
models_routerالنماذجمسارات models
workspace_routerمساحة العملمسارات workspace
swarm_router/api/swarm/*swarm_panel/
monitor_routerالمراقبةمسارات monitor
metrics_routerالمقاييسمسارات metrics

بالإضافة إلى مسارات مباشرة في routes_direct.py وخطّاف ويب (webhook) مشروط لـ Telegram عند /api/webhooks/telegram (app.py:365).


2. نقاط النهاية الرئيسية (مُتحقَّق منها)

Section titled “2. نقاط النهاية الرئيسية (مُتحقَّق منها)”
الطريقةالمسارالغرض
POST/api/chat/streamقناة الدردشة الأساسية. المتن {message, session_id, model}. يُرجِع text/event-stream. (sse_chat.py:353)
GET/api/chat/sessionsسرد الجلسات. (السطر 547)
DELETE/api/chat/sessions/{session_id}حذف الجلسة. (السطر 555)
GET/api/chat/sessions/{session_id}/messagesسجلّ الجلسة. (السطر 561)

القديم: يُرجِع GET /ws/chat الخطأ 410 Gone (chat.py:4). لا تستخدمه.

الطريقةالمسارالغرض
GET/api/provider/activeالمُزوّد/النموذج النشط. (السطر 583)
GET/api/providersسرد المُزوّدين. (السطر 601)
POST/api/provider/switchتبديل المُزوّد/النموذج النشط. (السطر 607)

2.3 موافقة الموافقة البشرية في الحلقة (HITL)

Section titled “2.3 موافقة الموافقة البشرية في الحلقة (HITL)”
الطريقةالمسارالغرض
GET/api/pending-approvalsموافقات HITL المعلّقة. (hitl_approval.py:146)
POST/api/approve/{thread_id}الموافقة على/رفض أداة متوقّفة مؤقتًا. المتن `{action: “approve"
الطريقةالمسارالغرض
GET/api/dashboard/statusنظرة عامة على لوحة المعلومات. (dashboard.py:177)
GET/api/sessionsقائمة الجلسات. (السطر 221)
POST/api/sessions/clear-allمسح الجلسات. (السطر 330)
الطريقةالمسارالغرض
GET/api/swarm/statusحالة السرب.
GET/POST/DELETE/api/swarm/workers[/{name}]عمليات CRUD للعاملين.
POST/api/swarm/dispatchإرسال مهمة (جميع الأنماط عبر type).
GET/api/swarm/tasks[/{id}]قائمة/تفاصيل المهام.
POST/api/swarm/tasks/{id}/approveالموافقة على نقطة تفتيش pipeline. (routes_tasks.py:612)
POST/api/swarm/tasks/{id}/rejectرفض نقطة تفتيش pipeline. (السطر 657)
GET/api/swarm/workers/{name}/metricsمقاييس العامل.
GET/api/swarm/circuit-breakersحالات قواطع الدائرة.
الطريقةالمسارالغرض
GET/health/liveالتحقق من الحياة. (health.py:94)
GET/health/readyالتحقق من الجاهزية. (السطر 104)
GET/health/detailsصحة تفصيلية. (السطر 148)
GET/api/gateway/statusحالة المُحوّل/البوابة.

يُرجِع POST /api/chat/stream تدفّقًا من الأحداث المُرسلة من الخادم (SSE). لكل حدث سطر event: مُحدَّد النوع وحمولة data: بصيغة JSON (sse_chat.py:8-13).

event:المعنىحقول الحمولة الرئيسية
tokenجزء بثّ من النموذج اللغوي الكبير (LLM).content
tool_callأداة تبدأ التنفيذ.tool, args
tool_resultأداة انتهى تنفيذها.tool, result, is_error
approval_requiredتوقيف HITL ظهر — يجب على الواجهة الأمامية استدعاء POST /api/approve/{thread_id}. (السطر 199-207)thread_id, tool, args
doneاكتمال الدور.tokens, cost_usd, duration_ms
errorخطأ قاتل.message

3.1 مثال من جهة العميل (JavaScript)

Section titled “3.1 مثال من جهة العميل (JavaScript)”
// chat.js uses KS.sse('/api/chat/stream', {...}); the raw shape is:
const resp = await fetch('/api/chat/stream', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: 'Hello', session_id: sess, model: 'gpt-4o-mini' }),
});
const reader = resp.body.getReader();
const decoder = new TextDecoder();
let buffer = '';
while (true) {
const { value, done } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
// SSE events are separated by blank lines
let idx;
while ((idx = buffer.indexOf('\n\n')) !== -1) {
const block = buffer.slice(0, idx);
buffer = buffer.slice(idx + 2);
const eventType = (block.match(/^event: (.+)$/m) || [])[1];
const data = JSON.parse(((block.match(/^data: (.+)$/m) || [])[1]) || '{}');
handleEvent(eventType, data);
}
}
function handleEvent(type, data) {
switch (type) {
case 'token': appendToken(data.content); break;
case 'tool_call': showToolCall(data.tool, data.args); break;
case 'tool_result': showToolResult(data.tool, data.result); break;
case 'approval_required': promptApproval(data.thread_id, data.tool); break;
case 'done': finishTurn(data.tokens, data.cost_usd); break;
case 'error': showError(data.message); break;
}
}

3.2 إعطاء الموافقة عبر واجهة البرمجة (API) (Python)

Section titled “3.2 إعطاء الموافقة عبر واجهة البرمجة (API) (Python)”
import httpx
resp = httpx.post(
"http://127.0.0.1:8000/api/approve/<thread_id>",
headers={"X-Kazma-Secret": KAZMA_SECRET}, # required if KAZMA_SECRET is set
json={"action": "approve", "reason": "looks safe"},
)
print(resp.status_code, resp.json())

سجّل دالة لدى ToolRegistry:

from kazma_core.agent.tool_registry import register_tool
@register_tool(
name="weather_lookup",
description="Look up current weather for a city.",
danger=False, # True → triggers HITL
)
async def weather_lookup(city: str) -> str:
...
return f"Weather in {city}: sunny, 25C"

سجّلها أثناء بدء التشغيل (أو عبر نقطة دخول مهارة). يعرضها المشرف على النموذج اللغوي تلقائيًا.

المُزوّدون هم إدخالات ConfigStore تحت providers.list. الإعدادات المسبقة العشر المُدمجة موجودة في kazma_core/providers.py:13-84. لإضافة نقطة نهاية مخصّصة متوافقة مع OpenAI:

from kazma_core.config_store import get_config_store
from kazma_core.model_registry import get_model_registry
store = get_config_store()
reg = get_model_registry()
# Option A: use the 'custom' preset shape
reg.upsert_provider(
name="my-endpoint",
display_name="My Inference Server",
base_url="https://infer.example.com/v1",
api_key="sk-...",
enabled=True,
)
# Option B: switch active provider/model
reg.set_active_provider("my-endpoint")
reg.set_active_model("my-model-id")

أي نقطة نهاية متوافقة مع OpenAI تعمل (vLLM، Together، Groq، Fireworks، …). بالنسبة لأنظمة المصادقة غير التابعة لـ OpenAI، انتبه إلى أن LLMProvider.chat() يُرسِل دائمًا Authorization: Bearer — وجّه الطلب عبر وكيل (proxy) متوافق مع OpenAI إذا كان المصدر المنبع يتطلّب ترويسة مختلفة.

أنشئ فئة فرعية من BaseAdapter (kazma-gateway/kazma_gateway/gateway.py:239)، نفّذ receive/send، أنتج IncomingMessage، وسجّله. بالنسبة لـ HITL للسرب على المنصّة الجديدة، أنشئ أيضًا فئة فرعية من BusAdapter (kazma_core/swarm/bus.py:66) وأوصِلها في كتلة المفرد (singleton) للناقل (bus) في app.py.

انظر المهارات وMCP والأدوات ← إضافة مهارة مخصّصة. وقّعها باستخدام kazma hub sign.

انظر المهارات وMCP والأدوات ← ضبط خادم MCP. تُكتشَف الأدوات وقت التشغيل وتُصنَّف عبر classify_mcp_tool.

Terminal window
kazma swarm worker add researcher --model deepseek-chat --provider deepseek --type in_process --role researcher

أو عبر واجهة البرمجة (API):

import httpx
httpx.post("http://127.0.0.1:8000/api/swarm/workers", json={
"name": "researcher",
"model": "deepseek-chat",
"provider": "deepseek",
"worker_type": "in_process",
"roles": ["researcher"],
})

4.7 استغلال مُحوّل الذاكرة رباعي الطبقات (متقدّم)

Section titled “4.7 استغلال مُحوّل الذاكرة رباعي الطبقات (متقدّم)”

يُستخدَم UnifiedMemoryAdapter (swarm/memory/adapter.py) فقط بواسطة self_improvement.py وphonebook.py. لاستخدامه في مكان آخر:

from kazma_core.swarm.memory.adapter import get_adapter
adapter = get_adapter()
results = await adapter.query("your query", top_k=5) # RRF-blended across 4 layers

ملاحظة: هذا ليس موصولًا بوكيل الدردشة افتراضيًا — انظر الذاكرة وRAG.


5. نقاط نهاية القياس عن بُعد والمراقبة

Section titled “5. نقاط نهاية القياس عن بُعد والمراقبة”
  • /api/telemetry/* (telemetry_router) — القياس عن بُعد أثناء التشغيل.
  • /api/dashboard/status — نظرة عامة للوحة المعلومات.
  • مقاييس السرب عند /api/swarm/workers/{name}/metrics.

نقطة نهاية Prometheus /metrics غير موجودة. حزم OTel مُعلَنة لكن تتبّع كاظمة هو مُصدِر سبان (span) داخلي المنشأ. انظر البنية ← المراقبة.


  • نقطة نهاية دردشة WebSocket ميتة (410 Gone). يجب على جميع مستهلكي واجهة البرمجة (API) استخدام SSE.
  • حدث approval_required الخاص بـ SSE هو الطريقة المعيارية لواجهات الواجهة الأمامية لإظهار توقفات HITL؛ اقرنها بـ POST /api/approve/{thread_id}.
  • إعمال ملكية /api/approve (403 بين المستخدمين المختلفين) يعني أن رموز الموافقة تكون لكل مستخدم — لا يمكن للمسؤول الموافقة على مهمة مستخدم آخر دون تطابق حقول الهوية.
  • مُحوّل الذاكرة رباعي الطبقات هو نقطة توسعة وليس افتراضيًا — استدعاء get_adapter() من كود مخصّص مدعوم، لكن لا تفترض أن وكيل الدردشة يستخدمه بالفعل.