يضع إعلان Kimi K2.6 من Moonshot AI هذا المنتج كأحدث ما توصلت إليه التكنولوجيا مفتوحة المصدر في مجال البرمجة، والتنفيذ طويل المدى، وأسراب الوكلاء. واجهة برمجة التطبيقات (API) التي تدعمه متوافقة مع OpenAI، ومستضافة على https://api.moonshot.ai/v1، وموثقة على المنصة. إذا كان لديك OpenAI SDK مثبتًا، يمكنك إرسال طلبات حقيقية في حوالي خمس دقائق.
يشرح هذا الدليل المصادقة، وطلبك الأول، والتدفق (streaming)، واستدعاء الأدوات (tool calling)، وإدخال الرؤية والفيديو (vision and video input)، ووضع التفكير (thinking mode)، وكيفية تشغيل Agent Swarm بـ 300 وكيل فرعي، ويوضح كيفية اختبار كل نقطة نهاية باستخدام Apidog قبل كتابة كود التكامل.
باختصار: واجهة برمجة تطبيقات Kimi K2.6 في 60 ثانية
- عنوان URL الأساسي (Base URL):
https://api.moonshot.ai/v1 - نقطة النهاية (Endpoint):
POST /chat/completions - معرفات النماذج (Model IDs):
kimi-k2.6،kimi-k2.6-thinking - المصادقة (Auth):
Authorization: Bearer $KIMI_API_KEY - التنسيق (Format): مخطط إكمال محادثة OpenAI (الرسائل، الأدوات، التدفق، إلخ)
- السياق (Context): 262,144 رمز إدخال، حتى 98,304 رمز إخراج للتفكير
- الافتراضيات (Defaults): درجة حرارة 1.0، top-p 1.0 (وفقًا للتوجيهات الرسمية من Moonshot)
أدنى حد من Curl:
curl https://api.moonshot.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $KIMI_API_KEY" \
-d '{
"model": "kimi-k2.6",
"messages": [{"role": "user", "content": "Write a Python function that reverses a string."}]
}'
هذا كل ما في الأمر. يملأ بقية هذا الدليل التفاصيل، بما في ذلك Agent Swarm وحدود التنفيذ البالغة 4,000 خطوة التي تدعمها Moonshot.

ما يمكنك فعلاً فعله باستخدام واجهة برمجة التطبيقات هذه
من إعلان Kimi K2.6، تطلق واجهة برمجة التطبيقات (API) كل هذا في مرحلة الإنتاج:
- وكلاء البرمجة (Coding agents) الذين يعملون لأكثر من 12 ساعة في مهمة واحدة (راجع عرض Qwen3.5-0.8B Mac inference التجريبي: أكثر من 4,000 استدعاء أداة، وزادت الإنتاجية من 15 إلى 193 رمزًا/ثانية).
- إدارة البنية التحتية الذاتية (Autonomous infrastructure management) على مدار جلسات متعددة الأيام مع استجابة تلقائية للحوادث.
- الموثوقية طويلة المدى (Long-horizon reliability) عبر Rust وGo وPython وZig.
- أسراب الوكلاء (Agent swarms) تصل إلى 300 وكيل فرعي تنفذ أكثر من 4,000 خطوة منسقة.
- التطوير القائم على التصميم (Design-driven development) الذي ينشئ تطبيقات كاملة المكدس مع المصادقة وقواعد البيانات والمعاملات من طلب واحد.
- خطوط أنابيب استخدام أدوات الرؤية + بايثون (Vision + Python tool use pipelines) (MathVision مع بايثون: 93.2%).
إذا كنت تقوم ببناء أدوات في نفس الفئة مثل استخدام الكمبيوتر مع كود كلود، بناء كود كلود الخاص بك، أو Cursor Composer 2، فإن واجهة برمجة تطبيقات K2.6 هي بديل مباشر على طبقة النموذج.
الخطوة 1: الحصول على مفتاح API
- انتقل إلى platform.moonshot.ai (أو platform.kimi.ai) وقم بالتسجيل. يعمل التسجيل عبر البريد الإلكتروني أو Google OAuth.
- تحقق من حسابك. قد يحتاج المستخدمون الدوليون إلى التحقق عبر الرسائل القصيرة.
- أضف الفوترة. عادةً ما تمنح Moonshot الحسابات الجديدة رصيدًا مجانيًا صغيرًا.
- افتح مفاتيح API (API Keys) في لوحة التحكم وانقر على إنشاء مفتاح (Create Key).
- انسخ المفتاح فورًا (يظهر مرة واحدة فقط).
- قم بتصديره:
export KIMI_API_KEY="sk-..."
أضفه إلى .zshrc أو .bashrc أو مدير الأسرار للإنتاج. لا تقم أبدًا بتثبيته في الكود.
هل تريد تجنب الدفع أثناء التطوير؟ يغطي كيفية استخدام Kimi K2.6 مجانًا Cloudflare Workers AI، والأوزان المستضافة ذاتيًا، وبرامج الرصيد المجاني.
الخطوة 2: اختر حزمة تطوير البرامج (SDK) الخاصة بك
واجهة برمجة التطبيقات متوافقة مع OpenAI، لذا تعمل حزم SDK الرسمية لـ OpenAI بعد تغيير عنوان URL الأساسي.
| الخيار | التثبيت | الأفضل لـ |
|---|---|---|
| curl | مدمج | الاختبارات السريعة، CI |
| OpenAI بايثون | pip install openai |
خدمات بايثون |
| OpenAI Node | npm install openai |
تطبيقات JS/TS |
بايثون
import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("KIMI_API_KEY"),
base_url="https://api.moonshot.ai/v1",
)
response = client.chat.completions.create(
model="kimi-k2.6",
messages=[{"role": "user", "content": "What is the capital of France?"}],
)
print(response.choices[0].message.content)
Node.js
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.KIMI_API_KEY,
baseURL: "https://api.moonshot.ai/v1",
});
const response = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [{ role: "user", content: "What is the capital of France?" }],
});
console.log(response.choices[0].message.content);
Curl
curl https://api.moonshot.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $KIMI_API_KEY" \
-d '{
"model": "kimi-k2.6",
"messages": [{"role": "user", "content": "What is the capital of France?"}]
}'
جميع الثلاثة تُرجع نفس شكل الاستجابة.
الخطوة 3: فهم نص الطلب
نفس الحقول مثل إكمال محادثة OpenAI:
{
"model": "kimi-k2.6",
"messages": [
{ "role": "system", "content": "You are a helpful assistant." },
{ "role": "user", "content": "Your prompt here." }
],
"temperature": 1.0,
"top_p": 1.0,
"max_tokens": 8192,
"stream": false,
"tools": [],
"tool_choice": "auto",
"thinking": { "type": "disabled" }
}
ملاحظتان خاصتان بـ Moonshot:
- القيم الافتراضية عالية. المدونة الرسمية توصي بدرجة حرارة 1.0 وtop-p 1.0 كقيم افتراضية مضبوطة. لا تنقل عادات درجة الحرارة 0.2 من سير عمل برمجة OpenAI.
- يُبدل
thinkingتتبع الاستدلال علىkimi-k2.6-thinking.{"type": "disabled"}يمنعه للحصول على إجابات سريعة.
الخطوة 4: التدفق (Streaming)
التدفق هو الخيار الافتراضي الصحيح لأي واجهة مستخدم أو إنشاء طويل. يمكن أن يصل الحد الأقصى للإخراج لمهام التفكير إلى 98,304 رموز؛ لا تريد الانتظار حتى يتم الحصول عليها كلها مرة واحدة.
بايثون
stream = client.chat.completions.create(
model="kimi-k2.6",
messages=[{"role": "user", "content": "Write a 500-word essay on MoE models."}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
Node.js
const stream = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [{ role: "user", content: "Write a 500-word essay on MoE models." }],
stream: true,
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}
يعمل التدفق أيضًا مع استدعاءات الأدوات؛ تصل الوسائط كفروق JSON تقوم بدمجها.
الخطوة 5: استدعاء الأدوات (Tool calling)
تفيد Moonshot عن نتيجة Toolathlon بنسبة 50.0% ونجاح استدعاء الأداة بنسبة 96.60% في اختبار الشركاء. التنسيق هو مخطط استدعاء الدالة القياسي لـ OpenAI، لذا تنطبق سير عمل اختبار API الحالي لمهندسي ضمان الجودة.
تعريف الأدوات
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather in a location.",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "City name"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["location"]
}
}
}
]
المكالمة الأولى (النموذج يقرر)
import json
messages = [{"role": "user", "content": "What's the weather in Tokyo?"}]
resp = client.chat.completions.create(
model="kimi-k2.6",
messages=messages,
tools=tools,
tool_choice="auto",
)
msg = resp.choices[0].message
messages.append(msg)
if msg.tool_calls:
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = fetch_weather(args["location"], args.get("unit", "celsius"))
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result),
})
المكالمة الثانية (الإجابة النهائية)
final = client.chat.completions.create(
model="kimi-k2.6",
messages=messages,
tools=tools,
)
print(final.choices[0].message.content)
يتميز K2.6 بقوته في سلاسل الأدوات متعددة الخطوات، وهذا ما يجعل وكلاء البرمجة طويلة الأمد مثل Kimi Code ممكنة. لمقارنة الأطر، يغطي سير عمل كود كلود نفس الحلقة باستخدام واجهة خلفية مختلفة.
الخطوة 6: إدخال الرؤية (Vision input)
يحصل K2.6 على 79.4% في MMMU-Pro و96.9% في V* (مع بايثون). تدخل الصور إلى رسالة المستخدم باستخدام تنسيق محتوى image_url الخاص بـ OpenAI:
response = client.chat.completions.create(
model="kimi-k2.6",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Describe this image in one sentence."},
{"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
]
}
],
)
للملفات المحلية، قم بترميزها base64:
import base64
with open("photo.jpg", "rb") as f:
b64 = base64.b64encode(f.read()).decode("utf-8")
image_url = f"data:image/jpeg;base64,{b64}"
لقراءة التعرف الضوئي على الحروف (OCR) أو الرسوم البيانية، ادمج تعليمات نصية واضحة مع الصورة. للمسائل الرياضية، قم بتضمين أداة مترجم بايثون؛ تم قياس درجة MathVision البالغة 93.2% مع تمكين الوصول إلى بايثون.
الخطوة 7: إدخال الفيديو (Video input)
مرر رابط فيديو URL أو تسلسل إطارات:
response = client.chat.completions.create(
model="kimi-k2.6",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Summarize what happens in this video."},
{"type": "video_url", "video_url": {"url": "https://example.com/clip.mp4"}}
]
}
],
)
مقاطع الفيديو القصيرة (أقل من 30 ثانية) تعمل في مكالمة واحدة. تستفيد مقاطع الفيديو الأطول من التدفق لأن الاستدلال إطارًا بإطار ينتج الكثير من الرموز.
الخطوة 8: وضع التفكير (Thinking mode)
ينتج kimi-k2.6-thinking تتبعًا مرئيًا للاستدلال (مماثل لنماذج OpenAI من نوع o1). تفيد Moonshot بنسبة 96.4% في AIME 2026 و90.5% في GPQA-Diamond مع تمكين وضع التفكير.
تفعيل التفكير (الوضع الافتراضي لنموذج التفكير):
response = client.chat.completions.create(
model="kimi-k2.6-thinking",
messages=[{"role": "user", "content": "Prove sqrt(2) is irrational."}],
)
إيقاف التفكير:
response = client.chat.completions.create(
model="kimi-k2.6-thinking",
messages=[{"role": "user", "content": "Quick: what's 17 * 23?"}],
extra_body={"thinking": {"type": "disabled"}},
)
يعود تتبع الاستدلال في حقل reasoning في الاستجابة. يمكنك إخفاؤه عن المستخدمين النهائيين وعرض الإجابة النهائية فقط، أو توجيهه إلى سجل تصحيح الأخطاء.
الخطوة 9: سرب الوكلاء (Agent Swarm)
سرب الوكلاء هو الميزة الأكثر قيمة للتعلم. من مدونة Kimi K2.6: ما يصل إلى 300 وكيل فرعي، أكثر من 4000 خطوة منسقة، 3 أضعاف سعة K2.5.
استدعائه عبر معلمة الوكيل الخاصة بالمنصة:
response = client.chat.completions.create(
model="kimi-k2.6",
messages=[{
"role": "user",
"content": "Build a 5-page marketing site for a coffee brand with responsive design and a newsletter signup."
}],
extra_body={
"agent": {
"type": "swarm",
"max_agents": 30,
"max_steps": 4000
}
},
)
تستغرق استدعاءات السرب دقائق أو ساعات. ثلاث نصائح عملية:
- استخدم التدفق (streaming). ستحتاج إلى رؤية التقدم وإيقاف التشغيلات الخاطئة مبكرًا.
- ضع حدًا لـ
max_agents. 300 هو الحد الأقصى؛ 10 إلى 30 أكثر قابلية للتنبؤ لمعظم المهام. - حدد ميزانية. يمكن لمهام السرب الطويلة أن تستهلك الرموز بسرعة؛ سجل
usageفي كل استجابة ووجهها إلى مقاييسك.
تصف مدونة Kimi تشغيلات تجريبية قامت بتعديل أكثر من 4000 سطر من الكود على مدار 13 ساعة. المعمارية هي التي تجعل ذلك ممكنًا؛ علامة واجهة برمجة التطبيقات (API) هي التي تقوم بتشغيلها فقط.
الخطوة 10: اختبر كل شيء باستخدام Apidog
يقدم كل قسم أعلاه شكل نص مختلفًا، أو متطلبات رأس، أو تنسيق استجابة. يحول Apidog حلقة التصحيح إلى سير عمل مرئي.

إعداد Kimi K2.6 في Apidog
- قم بتنزيل Apidog وأنشئ مشروعًا.
- أنشئ بيئة
kimi-prodبمتغيرين:BASE_URL = https://api.moonshot.ai/v1وKIMI_API_KEY = sk-.... - طلب API جديد:
POST {{BASE_URL}}/chat/completions. - الرؤوس (Headers):
Authorization: Bearer {{KIMI_API_KEY}}،Content-Type: application/json. - الجسم (مثال التدفق):
{
"model": "kimi-k2.6",
"messages": [{ "role": "user", "content": "Hello, Kimi K2.6!" }],
"stream": true
}
- انقر على إرسال (Send). تتدفق الرموز إلى لوحة الاستجابة في الوقت الفعلي.
ما يضيفه Apidog
- التحقق من المخطط (Schema validation) مقابل مواصفات إكمال محادثة OpenAI، لذلك تظهر الحقول المفقودة على الفور.
- سجل الطلبات (Request history) حتى تتمكن من إعادة تشغيل الاستدعاء الدقيق الذي أنتج استجابة غريبة.
- تبديل البيئات (Environment switching) بين مفاتيح التطوير والتجهيز والإنتاج بنقرة واحدة.
- مشاركة الفريق (Team sharing) عبر تصدير المشروع؛ راجع اختبار API للفرق التي تضم 50+ مهندسًا.
- الخوادم الوهمية (Mock servers) عندما يكون لدى Moonshot حادث أو كنت غير متصل بالإنترنت.
- دعم تدفق SSE (SSE stream support) الذي يتعامل مع تنسيق تدفق Kimi بشكل نظيف (العديد من أدوات API لا تفعل ذلك).
للاختبار داخل المحرر، يتوفر Apidog أيضًا كـ ملحق VS Code. إذا كنت مقيدًا حاليًا بـ Postman، فإن كيفية إجراء اختبار API بدون Postman تشرح الانتقال.
معالجة الأخطاء التي لن تقاومك
تستخدم Moonshot رموز حالة HTTP القياسية:
- 400: طلب سيء. عادة ما يكون نصًا مشوهًا أو اسم نموذج خاطئ.
- 401: فشل المصادقة. المفتاح مفقود أو خاطئ أو منتهي الصلاحية.
- 429: تجاوز حد المعدل أو استنفاد الحصة.
- 500: خطأ في الخادم. أعد المحاولة مع تراجع أسي.
- 529: تحميل زائد. أعد المحاولة بعد بضع ثوانٍ.
برنامج تغليف إعادة المحاولة:
import time
from openai import OpenAI, RateLimitError, APIError
def call_kimi(messages, max_retries=5):
for attempt in range(max_retries):
try:
return client.chat.completions.create(
model="kimi-k2.6",
messages=messages,
)
except RateLimitError:
time.sleep(2 ** attempt)
except APIError as e:
if e.status_code >= 500 and attempt < max_retries - 1:
time.sleep(2 ** attempt)
else:
raise
raise RuntimeError("Kimi K2.6 failed after retries")
بالنسبة للانقطاعات في منتصف التدفق، تتبع الرموز المستلمة وأعد التشغيل بتعليمات "المتابعة من هنا" إذا انقطع الاتصال. يعني سقف الإخراج الاستدلالي البالغ 98,304 رمزًا أن التدفقات الطويلة طبيعية، وليست خطأً.
التحكم في التكلفة
تنشر Moonshot أسعارها على kimi.com/membership/pricing. ثلاث نصائح على مستوى الإنتاج للحفاظ على فواتير يمكن التنبؤ بها:
- تحديد `max_tokens` (الحد الأقصى للرموز). اضبطه على الحد الأدنى لحالة الاستخدام الخاصة بك. 2,048 رمزًا كافية لردود المحادثة.
- تخزين موجهات النظام مؤقتًا. يبدأ التخزين المؤقت للموجهات في Moonshot عند تكرار رسائل النظام؛ ضع التعليمات الثابتة أولاً.
- تسجيل `usage` (الاستخدام). تتضمن كل استجابة
prompt_tokensوcompletion_tokensوtotal_tokens. قم بتوجيهها إلى Prometheus أو أي مكدس مقاييس تستخدمه وقم بإعداد التنبيهات.
نمط الإنتاج: مُصلح مشكلات GitHub
إليك وكيل يقرأ مشكلة في GitHub، ويحدد الكود ذي الصلة، ويقترح إصلاحًا، ويشغل الاختبارات، وهو منظم حول حلقة استدعاء الأدوات في Kimi K2.6:
from openai import OpenAI
import os, json
client = OpenAI(
api_key=os.getenv("KIMI_API_KEY"),
base_url="https://api.moonshot.ai/v1",
)
tools = [
{"type": "function", "function": {
"name": "read_file",
"description": "Read a file in the repo.",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"]
}
}},
{"type": "function", "function": {
"name": "search_code",
"description": "Ripgrep the codebase for a pattern.",
"parameters": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"]
}
}},
{"type": "function", "function": {
"name": "run_tests",
"description": "Run the project test suite.",
"parameters": {"type": "object", "properties": {}}
}},
]
def tool_dispatch(name, args):
if name == "read_file":
with open(args["path"]) as f:
return f.read()
if name == "search_code":
return run_ripgrep(args["query"])
if name == "run_tests":
return run_pytest()
raise ValueError(f"Unknown tool: {name}")
messages = [
{"role": "system", "content": "You are a senior engineer. Fix the described bug."},
{"role": "user", "content": "Issue: login form submits twice on slow networks."}
]
while True:
resp = client.chat.completions.create(
model="kimi-k2.6",
messages=messages,
tools=tools,
)
msg = resp.choices[0].message
messages.append(msg)
if not msg.tool_calls:
print(msg.content)
break
for call in msg.tool_calls:
result = tool_dispatch(call.function.name, json.loads(call.function.arguments))
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result,
})
يتوسع هذا النمط ليصبح Agent Swarm عن طريق إضافة تكوين swarm في extra_body. كما يعمل بشكل جيد مع مكدس Hermes متعدد الوكلاء إذا كنت ترغب في نقاط تفتيش يتدخل فيها البشر.
الأسئلة الشائعة
هل أحتاج إلى حزمة تطوير برامج (SDK) خاصة بـ Moonshot؟لا. تعمل حزم SDK لـ OpenAI Python وNode بعد تغيير base_url.
هل واجهة برمجة التطبيقات (API) تخضع لقيود المعدل؟نعم. تتناسب الحدود مع مستواك وسجل استخدامك. تحقق من لوحة التحكم.
هل يعمل Kimi K2.6 مع LangChain، LlamaIndex، Vercel AI SDK؟نعم. يعمل أي إطار عمل يقبل عنوان URL أساسيًا متوافقًا مع OpenAI.
هل يدعم Kimi K2.6 وضع JSON؟نعم. مرر response_format: {"type": "json_object"} لإخراج JSON صالح، أو {"type": "json_schema", "json_schema": {...}} للمخططات الصارمة.
ما هو حجم نافذة السياق بالضبط؟262,144 رمز إدخال، بحد أقصى 98,304 رمز إخراج لمهام الاستدلال، وفقًا للمدونة الرسمية.
هل يمكنني ضبط Kimi K2.6 بدقة عبر واجهة برمجة التطبيقات (API)؟ليس بعد. في الوقت الحالي، يعني الضبط الدقيق تشغيل الأوزان المفتوحة على جهازك الخاص.
ما الفرق بين kimi-k2.6 و kimi-k2.6-thinking؟kimi-k2.6 هو نموذج الوكيل السريع. kimi-k2.6-thinking يكشف خطوات استدلاله وهو مضبوط للرياضيات والمنطق والتخطيط الصعب (AIME 2026: 96.4%، GPQA-Diamond: 90.5%).
هل هناك طبقة مجانية؟راجع دليل الوصول المجاني إلى Kimi K2.6 الخاص بنا لـ Cloudflare Workers AI، ومحادثة kimi.com، والخيارات المستضافة ذاتيًا.
ملخص
تندرج واجهة برمجة تطبيقات Kimi K2.6 في أي سلسلة أدوات متوافقة مع OpenAI بتغييرين: عنوان URL الأساسي ومفتاح API الخاص بك. من هناك، تحصل على نافذة سياق بحجم 262K، وسرب وكلاء (Agent Swarm) يضم 300 وكيل فرعي، واستدعاء أدوات مضبوطة بنجاح استدعاء 96.60%، وأوزان مفتوحة المصدر كحل احتياطي إذا كنت ترغب في الانتقال من واجهة برمجة التطبيقات المستضافة.
إذا كنت تقوم ببناء تكامل جديد، استخدم Apidog لإنشاء كل نقطة نهاية والتحقق منها أولاً. ستكتشف أخطاء المخطط، وأخطاء التدفق (streaming bugs)، ومشكلات المصادقة قبل أن تصل إلى قاعدة التعليمات البرمجية الخاصة بك. ثم انقل الطلبات العاملة إلى خدمة Python أو Node بثقة.
المراجع وقراءات إضافية
- الإعلان الرسمي: Kimi K2.6 — مدونة Moonshot AI
- البدء السريع لواجهة برمجة التطبيقات: platform.kimi.ai
- منصة واجهة برمجة التطبيقات: platform.moonshot.ai
- وكيل طرفية Kimi Code: kimi.com/code
- التسعير: kimi.com/membership/pricing
- الأوزان المفتوحة: huggingface.co/moonshotai/Kimi-K2.6
- أدلة Apidog ذات الصلة: ما هو Kimi K2.6، Kimi K2.6 مجانًا، Qwen 3.6 مجانًا على OpenRouter، واجهة برمجة تطبيقات Qwen3.5-Omni، Apidog داخل VS Code، اختبار API بدون Postman، اختبار API لـ 50+ مهندسًا، سير عمل كود كلود، Cursor Composer 2.
