YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
GLM-4.6V-Flash API — Kaggle CPU (متوافق مع OpenAI)
نموذج GLM-4.6V-Flash (9B VLM، كمية Q4_K_S، رؤية عبر mmproj-F16) يعمل على Kaggle CPU-only عبر llama.cpp، خلف بروكسي جسر متوافق مع OpenAI، ومنشور عبر Cloudflare Tunnel باسم نطاق دائم.
- Base URL:
https://glm46v.kenven.bond/v1 - Model ID:
glm-4.6v-flash(وكذلك:glm-4.6v-flash:thinking) - API Key (حقيقي مُصادق عليه):
sk-glm46v-2026-xK9mPqR3vT7wL5nB8cD2fH4j— الطلبات بدون مفتاح صحيح ترجع 401. (المفتاح القديمsk-glm46v-flash-cpuيظل مقبولًا كاحتياط.) - Endpoints:
POST /v1/chat/completions(streaming + tools + images + thinking)،GET /v1/models،POST /v1/completions،GET /health - Repository (source of truth):
Kenvenx/glm-4.6v-flash-kaggle-cpu— يحتويruntime.json(حالة حية)،test_results.jsonl، السجلات، والمقاييس. - Notebook:
lordtv/glm46v-cpu-final6على Kaggle (يعمل تلقائيًا بالكامل عند Run All، ومعه نظام إنعاش ذاتي). - النفق: Cloudflare Tunnel v2 باسم
glm46v-kaggle-cpu-v2(id345c1c71-1b97-48fd-98c7-aca9db1ecd58) — النفق القديم f1eec3dc حُذف نهائيًا مع CNAME محدّث إلى النفق الجديد. العنوان العام ثابت:https://glm46v.kenven.bond.
الإصلاحات الجذرية (final6، 2026-09-30)
- إزالة
--cache-reuse 256: كان يجبر llama على prompt eval توكن-توكن (~220-430ms/توكن) → برومبت 2100 توكن ينتظر 7 دقائق قبل أول توكن. أُزيل نهائيًا. - إصلاح SSE keepalive: المهلة القديمة تلغي قراءة httpx وتسمّمها → عميل يستلم 200 فارغ بينما النموذج يولّد فعلاً (سر "Connection successful (empty)"). استُبدل بقارئ upstream في task منفصل + queue + keepalive كل 15s.
- CONTEXT SAFETY VALVE: Freebuff يرسل برومبتات ضخمة (~55K tokens > سياق 16K) → عاصفة 400. البروكسي الآن يقص أقدم الأدوار (يحفظ system) ويحدّ max_tokens ليبقى ضمن السياق. برومبت 48K حرف + tools = 31.9s بدل فشل كامل.
- اختيار سياق صحيح: CTX_STEPS=[16384,8192,4096] وubatch 1024/batch 2048 (كان يختار 4096 رغم توفر 26GB).
- جلسات زومبي: حذف النوتبوك لا يقتل جلسته؛ عدة جلسات على نفس النفق = توزيع حمل Cloudflare يرسل نصف الطلبات لزومبي → ردود فارغة ~15s. النفق v2 الجديد حل هذا جذريًا.
ملاحظة: الردود الصينية
النموذج أحيانًا يفكر أو يرد بالصينية إذا لم يوجد system prompt (سلوك معروف في GLM-4.6V بدون توجيه).
الحل الرسمي (Unsloth/Z.ai): أضف "messages":[{"role":"system","content":"Respond in English and reason in English"}, ...] — أو بالعربية إن أردت ردًا عربيًا. بدون system prompt قد يظهر reasoning صيني (مُختبر: thinking_on كان بالصينية، ومع system prompt يلتزم الإنجليزية).
التحكم بـ Thinking
أضف "enable_thinking": true أو false في جسم الطلب (مستوى أعلى):
false: إجابة مباشرة (أول توكن ~1.4–2 ثانية) بدون أي reasoning.true: سترى التفكير فيdelta.reasoning_contentأثناء البث ثمreasoning_contentفي الرسالة النهائية.- أيضًا مدعوم:
"reasoning_effort": "none"، و"chat_template_kwargs": {"enable_thinking": ...}.
أمثلة curl
نص إنجليزي (بدون تفكير):
curl -s https://glm46v.kenven.bond/v1/chat/completions \
-H "Authorization: Bearer sk-glm46v-2026-xK9mPqR3vT7wL5nB8cD2fH4j" -H "Content-Type: application/json" \
-d '{"model":"glm-4.6v-flash","enable_thinking":false,"max_tokens":300,
"messages":[{"role":"user","content":"Explain photosynthesis in two sentences."}]}'
نص عربي:
curl -s https://glm46v.kenven.bond/v1/chat/completions \
-H "Authorization: Bearer sk-glm46v-2026-xK9mPqR3vT7wL5nB8cD2fH4j" -H "Content-Type: application/json" \
-d '{"model":"glm-4.6v-flash","enable_thinking":false,"max_tokens":300,
"messages":[{"role":"user","content":"اكتب جملتين عن أهمية قراءة الكتب."}]}'
صورة (base64 أو رابط URL — البروكسي يجلب الروابط ويحولها):
curl -s https://glm46v.kenven.bond/v1/chat/completions \
-H "Authorization: Bearer sk-glm46v-2026-xK9mPqR3vT7wL5nB8cD2fH4j" -H "Content-Type: application/json" \
-d '{"model":"glm-4.6v-flash","max_tokens":400,
"messages":[{"role":"user","content":[
{"type":"image_url","image_url":{"url":"https://example.com/photo.jpg"}},
{"type":"text","text":"What is in this image?"}]}]}'
تفكير مفعّل (streaming يُظهر reasoning_content تدريجيًا):
curl -sN https://glm46v.kenven.bond/v1/chat/completions \
-H "Authorization: Bearer sk-glm46v-2026-xK9mPqR3vT7wL5nB8cD2fH4j" -H "Content-Type: application/json" \
-d '{"model":"glm-4.6v-flash","enable_thinking":true,"stream":true,"max_tokens":1000,
"messages":[{"role":"user","content":"If a train travels 60km in 45 minutes, what is its speed in km/h?"}]}'
استدعاء أداة (streaming مُستحسن — مع tools قد يظل القالب يفكر داخليًا و524 يهدد الطلبات غير المتدفقة الطويلة):
curl -sN https://glm46v.kenven.bond/v1/chat/completions \
-H "Authorization: Bearer sk-glm46v-2026-xK9mPqR3vT7wL5nB8cD2fH4j" -H "Content-Type: application/json" \
-d '{"model":"glm-4.6v-flash","enable_thinking":false,"stream":true,"max_tokens":400,
"tools":[{"type":"function","function":{"name":"get_weather","description":"Get current weather for a city",
"parameters":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}}],
"messages":[{"role":"user","content":"What is the weather in Paris right now? Use the tool."}]}'
مثال Python (openai SDK)
from openai import OpenAI
client = OpenAI(base_url="https://glm46v.kenven.bond/v1", api_key="sk-glm46v-2026-xK9mPqR3vT7wL5nB8cD2fH4j")
stream = client.chat.completions.create(
model="glm-4.6v-flash", stream=True, max_tokens=800,
extra_body={"enable_thinking": True},
messages=[{"role": "user", "content": "Solve: 15% of 240 = ?"}],
)
for chunk in stream:
d = chunk.choices[0].delta
if getattr(d, "reasoning_content", None):
print("[think]", d.reasoning_content, end="")
if d.content:
print(d.content, end="")
إعدادات Freebuff
| الحقل | القيمة |
|---|---|
| Base URL | https://glm46v.kenven.bond/v1 |
| API Key | sk-glm46v-2026-xK9mPqR3vT7wL5nB8cD2fH4j |
| Model | glm-4.6v-flash |
| Vision | مفعّل فعليًا (image_url في content array) |
| Thinking | عبر extra_body={"enable_thinking": true/false} — مرن، الافتراضي حسب قالب النموذج |
| Streaming | مدعوم (SSE مع keepalive) |
| Tool calls | مدعوم (OpenAI format) |
الأداء المقاس (Kaggle CPU، 4 logical cores / ~26GB متاح — final6، 8/8 PASS، 2026-09-30)
| المؤشر | النتيجة (final6) |
|---|---|
| توليد النص EN | 27.7s (2.41 tok/s) |
| توليد النص AR | 68.0s (1.22 tok/s) |
| أول توكن (بدون تفكير) | 2.9s (streaming: 1.2s) |
| معالجة صورة + إجابة VQA | 15.5s (وصف دقيق) |
| تفكير كامل + إجابة (ON) | 418.6s (أول توكن 184.8s — تفكير طويل طبيعي) |
| إجابة بلا تفكير (OFF) | 87.4s (صفر reasoning) |
| Streaming | 27.3s (58 chunks) |
| Tool calls | 14.0s (get_weather {"city":"Paris"}) |
| برومبت ضخم 48K حرف + tools | 31.9s (كان فشلًا كاملًا قبل الإصلاح) |
ملاحظة: الطلبات الدافئة (warm) تعمل في ~2.4s. أول طلب على جلسة جديدة يستغرق ~146s (تحميل النموذج من /kaggle/tmp) — طبيعي.
التحسينات: thinking OFF افتراضيًا للطلبات العادية (توفير 1-3 دقائق تفكير خفي)، وتصغير الصور تلقائيًا إلى 896px قبل معالجة الرؤية (أسرع 40-75%). للتحكم: "enable_thinking": true عند الحاجة.
الاستئناف التلقائي بعد انقطاع الجلسة
- العنوان العام ثابت دائمًا:
https://glm46v.kenven.bond(نفق Cloudflare باسم النطاق + CNAME). - عند انقطاع جلسة Kaggle، أعد تشغيل النوتبوك
lordtv/glm46v-cpu-final6(Run All) — كل شيء تلقائي: cloudflared يتصل بنفس النفق، llama.cpp والنموذج مخزنان في/kaggle/tmp(يُعاد بناؤهما فقط إذا نُظفت)، والبروكسي + المراقب الذاتي + حلقة المزامنة تعمل فورًا. runtime.jsonعلى HF يحدَّث كل دقيقتين: تاريخ آخر تشغيل، صحة llama، مقاييس — يستخدمه أي عميل للتحقق أن الخدمة حية قبل إرسال الطلبات.- حدود Kaggle المجانية: ~12 ساعة/جلسة، 30 ساعة/أسبوع.
- نظام الإنشاء الذاتي: النوتبوك يشتمل على watchdog (C11) يفحص نفسه كل دقيقتين ويعيد تشغيل llama-server/البروكسي إذا ماتا، وإذا كانت الجلسة كلها ميتة يعيد نشر جلسة جديدة باسم جديد تلقائيًا (من seed محفوظ في C12) ويستهدفها حتى ترجع الخدمة عبر نفس العنوان الدائم. يعمل حتى بدون تدخل بشري.
- ملاحظة تشغيلية: حذف النوتبوك من Kaggle لا يقتل جلسته الجارية (zombie session تبقى موصولة بالنفق)؛ إذا شعرت بردود فارغة ~15 ثانية متقطعة، انتظر موت الجلسة القديمة (أو أوقفها من Kaggle → Sessions) ثم أعد Run All.
الأمان والمعمارية
- llm-server على 127.0.0.1:8080، البروكسي على 0.0.0.0:5000، النفق يعبر Cloudflare (TLS).
- supervisor يعيد تشغيل llama-server تلقائيًا عند الانهيار ويخفض السياق عند ضغط الذاكرة.
- keepalive يعيد تشغيل البروكسي إذا مات، ويراقب كل 5 دقائق.
- المعايرات الموصى بها من Z.ai: temp=0.8, top_p=0.6, top_k=2, repeat_penalty=1.1.