النماذج

Qwen: Qwen3.7 Plus

Markdown · JSON

Qwen: Qwen3.7 Plus

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

عن النموذج

يغطي هذا الوصف قدرات النموذج. وترد أدناه المدخلات والمخرجات والخيارات المتاحة في Ailoot للطريقة المحددة.

Qwen3.7 Plus نموذج ضمن سلسلة Qwen3.7 من Alibaba. يقبل النصوص والصور ويعيد نصًا، جامعًا قدرات السلسلة اللغوية والإدخال البصري. يسرد الملف المنشور نافذة سياق من 1,000,000 رمز وما يصل إلى 131,072 رمز إكمال، مع ضوابط للاستدلال والأدوات والمخرجات المنظَّمة.

اجمع السؤال وأدلته

لسؤال مستند، قدّم المادة المناسبة وحدّد المقاطع أو الأقسام التي يجب أن تقارنها الإجابة. ولمهمة بصرية، قدّم صورة مقروءة وسمِّ الجسم أو النص أو حالة الواجهة المراد فحصها. يمكن للقطة شاشة دعم سؤال عن خطأ أو تخطيط، وتكون النتيجة شرحًا نصيًا أو نتائج مستخرجة.

سمِّ المصادر المتعددة لتظل الملاحظات مرتبطة بالمادة الصحيحة. يمكن للمقارنة طلب نتيجة لكل معيار مع معرّف مصدرها. ويمكن لموجز استخراج تعريف الحقول المعادة وكيفية إظهار المعلومات المفقودة. أبقِ الأدلة الأصلية متاحة عند مراجعة إجابات ملتبسة.

الاستدلال والأدوات وبنية النتيجة

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

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

استخدم السياق المتاح بقصد

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

مهمة عملية

مهمة عملية

مثال تقني باللغة الإنجليزية

Extract milestones with source references

Extract a milestone table from these labeled notes. Design D: prototype review on 12 July, owner Eva. Engineering E: implementation starts after prototype approval; finish date not committed. Support S: help draft due 15 July, owner Leo. Return milestone, owner, date or dependency and source label. Use 'not stated' rather than filling missing ownership or dates.

النتيجة المتوقعة

A source-linked milestone table with explicit dates, dependencies and missing-value markers.

التحقق من النتيجة

Engineering's uncommitted finish date and absent owner remain marked as not stated.
Ailoot · رسائل Anthropic POST /v1/messages qwen3.7-plus

qwen3.7-plus

Alibaba /qwen3.7-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص · الصور
النتائج
النص

متاح في Ailoot · المدخلات والطرائق

Ailoot · رسائل Anthropic POST /v1/messages
الإدخال
text, image
الإخراج
text
السياق
⁦991,808⁩ tokens
الحد الأقصى للإخراج
⁦131,072⁩ tokens
صيغة الإخراج
json أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen3.7-plus
القيمة الافتراضية—
الحقلmessagesالنوعmessage[]المتطلبمطلوبالقيم والحدود
الحد الأدنى للعناصر: ⁦1⁩
القيمة الافتراضية—
الحقلmessages[].roleالنوعstringالمتطلبمطلوبالقيم والحدود
user, assistant
القيمة الافتراضية—
الحقلmessages[].contentالنوعstring|content_block[]المتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلsystemالنوعstring|content_block[]المتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmax_tokensالنوعintegerالمتطلبمطلوبالقيم والحدود
الحد الأدنى: ⁦1⁩
نطاق تطبيق الحد: الحد الأقصى الدقيق للنموذج/البطاقة المختارة
القيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
الحقلtemperatureالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtop_pالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلstop_sequencesالنوعstring[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtoolsالنوعtool[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtools[].nameالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: أداة مقدّمة
القيمة الافتراضية—
الحقلtools[].descriptionالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtools[].input_schemaالنوعJSON_schemaالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtool_choiceالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلthinking.typeالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلthinking.budget_tokensالنوعintegerالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلoutput_config.effortالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلmetadataالنوعobjectالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلcache_controlالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
تركيبات مواد الإدخال

النص · نص UTF8

messages[].content أو كتلة type=text

نص + صورة

{type:image,source:{type:base64,media_type,data}} أو مصدر من النوع type=url

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةmaterial_typesالمواصفاتtext, image
المعلمةrequiredالمواصفاتmodel, messages, max_tokens
المعلمةoptional_controlsالمواصفاتnull
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةtext_file_materialالمواصفاتمحتوى UTF-8 الفعلي مُدرج كنص؛ وتحتاج معرّفات الملفات/URLs إلى دعم دقيق منفصل

دورة الحياة: exact retained published method

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

الباقات

تعرفات طرائق Ailoot

Ailoot رسائل AnthropicPOST /v1/messages
الإدخال
⁦‏0.0004 US$⁩ / 1K
الإخراج
⁦‏0.0016 US$⁩ / 1K
قراءة ذاكرة التخزين المؤقت
⁦‏0.00004 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت
⁦‏0.0005 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت، 5 دقائق
⁦‏0.0005 US$⁩ / 1K tokens

الأسعار بحسب طول الطلب · رسائل Anthropic

حجم الطلب بالرموزالإدخالالإخراجقراءة ذاكرة التخزين المؤقتالكتابة إلى ذاكرة التخزين المؤقتذاكرة التخزين المؤقت 5 دقائقذاكرة التخزين المؤقت 1 ساعة
حجم الطلب بالرموز(⁦0⁩; ⁦256,000⁩]الإدخال⁦‏0.0004 US$⁩الإخراج⁦‏0.0016 US$⁩قراءة ذاكرة التخزين المؤقت⁦‏0.00004 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0005 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0005 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —
حجم الطلب بالرموز(⁦256,000⁩; ∞)الإدخال⁦‏0.0012 US$⁩الإخراج⁦‏0.0048 US$⁩قراءة ذاكرة التخزين المؤقت⁦≈‏0.00012 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0015 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0015 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —

الأسعار بوحدة USD لكل 1K من الرموز. عند عدم تحديد تعرفة، تُستخدم التعرفة الأساسية لهذه الطريقة؛ وتشير «—» إلى عدم تحديد تعرفة أساسية.

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

تفاصيل التعرفة المرجعية

لا تغيّر جداول التعرفة المرجعية على مستوى النموذج اختيار الطريقة أو عروض الأسعار أو الرسوم. وتستخدم الرسوم الفعلية تعرفات طريقة Ailoot المحددة.

جداول التعرفة المرجعية للنموذج

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتOpenAI Chat · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

أمثلة للطلبات

Ailoot · رسائل Anthropic

مثال للنصالإدخال، صورةPython SDKNode.js SDKالبث باستخدام Python
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen3.7-plus", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen3.7-plus", "max_tokens": 1024, "messages": [{"role": "user", "content": [{"type": "text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["messages"][0]["content"].append({"type":"image","source":{"type":"base64","media_type":mime,"data":b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="qwen3.7-plus",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "qwen3.7-plus",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='qwen3.7-plus',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")

استلام النتائج وحفظها

Ailoot · رسائل Anthropic

json أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

احتفظ بكل كتل المحتوى وتوقيعات التفكير ومعرّفات استخدام الأدوات الفعلية. جمّع جميع تحديثات كتل SSE؛ فأول كتلة نصية ليست الإخراج الكامل.

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلidالنوعstring
الحقلmodelالنوعstring
الحقلcontent[]النوعtext|thinking|tool_use|other content block
الحقلstop_reasonالنوعstring|null
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

Ailoot · OpenAI Responses POST /v1/responses qwen3.7-plus

qwen3.7-plus

Alibaba /qwen3.7-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص · الصور
النتائج
النص

متاح في Ailoot · المدخلات والطرائق

Ailoot · OpenAI Responses POST /v1/responses
الإدخال
text, image
الإخراج
text
السياق
⁦991,808⁩ tokens
الحد الأقصى للإخراج
⁦131,072⁩ tokens
صيغة الإخراج
json أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen3.7-plus
القيمة الافتراضية—
الحقلinputالنوعstring|input_item[]المتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلinstructionsالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلinput[].typeالنوعstringالمتطلباختياريالقيم والحدود
message, reasoning, function_call, function_call_output
القيمة الافتراضية—
الحقلinput[].contentالنوعstring|content_part[]المتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلinput[].call_idالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: function_call_output؛ احتفظ بقيمة call_id الفعلية المُرجعة
القيمة الافتراضية—
الحقلinput[].outputالنوعstring|content_part[]المتطلباختياريالقيم والحدود
ينطبق عندما: function_call_output
القيمة الافتراضية—
الحقلmax_output_tokensالنوعintegerالمتطلباختياريالقيم والحدود
الحد الأدنى: ⁦1⁩
يعتمد على النموذج
القيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
الحقلtemperatureالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtop_pالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtoolsالنوعtool[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtool_choiceالنوعstring|objectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلparallel_tool_callsالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoning.effortالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoning.summaryالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtext.formatالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtext.verbosityالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلincludeالنوعstring[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلstoreالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلprevious_response_idالنوعstringالمتطلباختياريالقيم والحدود
متطلبات المعرّف ID: معرّف استجابة فعلي فقط من متابعة مدعومة
يعتمد على النموذج
القيمة الافتراضية—
الحقلservice_tierالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلprompt_cache_keyالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلprompt_cache_optionsالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
تركيبات مواد الإدخال

النص · نص UTF8

نص إدخال أو جزء input_text

نص + صورة

{type:input_image,image_url}

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةmaterial_typesالمواصفاتtext, image
المعلمةrequiredالمواصفاتmodel, input
المعلمةoptional_controlsالمواصفاتnull
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةtext_file_materialالمواصفاتمحتوى UTF-8 الفعلي مُدرج كنص؛ وتحتاج معرّفات الملفات/URLs إلى دعم دقيق منفصل

دورة الحياة: exact retained published method

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

الباقات

تعرفات طرائق Ailoot

Ailoot OpenAI ResponsesPOST /v1/responses
الإدخال
⁦‏0.0004 US$⁩ / 1K
الإخراج
⁦‏0.0016 US$⁩ / 1K
قراءة ذاكرة التخزين المؤقت
⁦‏0.00008 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت
⁦‏0.0004 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت، 5 دقائق
⁦‏0.0004 US$⁩ / 1K tokens
code_interpreter_call
⁦‏0.00 US$⁩ لكل استدعاء
image_search_call
⁦‏0.008 US$⁩ لكل استدعاء
web_extractor_call
⁦‏0.00 US$⁩ لكل استدعاء
web_search_call
⁦‏0.01 US$⁩ لكل استدعاء
web_search_image_call
⁦‏0.008 US$⁩ لكل استدعاء
أقصى عدد للاستدعاءات code_interpreter_call
⁦8⁩
أقصى عدد للاستدعاءات image_search_call
⁦8⁩
أقصى عدد للاستدعاءات web_extractor_call
⁦8⁩
أقصى عدد للاستدعاءات web_search_call
⁦8⁩
أقصى عدد للاستدعاءات web_search_image_call
⁦8⁩

الأسعار بحسب طول الطلب · OpenAI Responses

حجم الطلب بالرموزالإدخالالإخراجقراءة ذاكرة التخزين المؤقتالكتابة إلى ذاكرة التخزين المؤقتذاكرة التخزين المؤقت 5 دقائقذاكرة التخزين المؤقت 1 ساعة
حجم الطلب بالرموز(⁦0⁩; ⁦256,000⁩]الإدخال⁦‏0.0004 US$⁩الإخراج⁦‏0.0016 US$⁩قراءة ذاكرة التخزين المؤقت⁦‏0.00008 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0004 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0004 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —
حجم الطلب بالرموز(⁦256,000⁩; ∞)الإدخال⁦‏0.0012 US$⁩الإخراج⁦‏0.0048 US$⁩قراءة ذاكرة التخزين المؤقت⁦≈‏0.00024 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0012 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0012 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —

الأسعار بوحدة USD لكل 1K من الرموز. عند عدم تحديد تعرفة، تُستخدم التعرفة الأساسية لهذه الطريقة؛ وتشير «—» إلى عدم تحديد تعرفة أساسية.

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

تفاصيل التعرفة المرجعية

لا تغيّر جداول التعرفة المرجعية على مستوى النموذج اختيار الطريقة أو عروض الأسعار أو الرسوم. وتستخدم الرسوم الفعلية تعرفات طريقة Ailoot المحددة.

جداول التعرفة المرجعية للنموذج

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتOpenAI Chat · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

أمثلة للطلبات

Ailoot · OpenAI Responses

مثال للنصالإدخال، صورةPython SDKNode.js SDKالبث باستخدام Python
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen3.7-plus", "input": ""}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["input"]="Summarize this material and quote supporting source passages.\n\n"+text
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen3.7-plus", "input": [{"role": "user", "content": [{"type": "input_text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["input"][0]["content"].append({"type":"input_image","image_url":"data:"+mime+";base64,"+b64})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.responses.create(model="qwen3.7-plus", input="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "qwen3.7-plus", input: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
from openai import OpenAI
import os
from pathlib import Path
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
with client.responses.stream(model="qwen3.7-plus", input="Explain the difference between an observation and a hypothesis in three sentences.") as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_response()
    save_result(final.to_dict(mode="json"),"stream-result")

استلام النتائج وحفظها

Ailoot · OpenAI Responses

json أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

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

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلidالنوعstring
الحقلstatusالنوعstring
الحقلoutput[]النوعmessage|reasoning|function_call|other item
الحقلoutput[].content[]النوعcontent part
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

Ailoot · محادثة OpenAI POST /v1/chat/completions qwen3.7-plus

qwen3.7-plus

Alibaba /qwen3.7-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص · الصور
النتائج
النص

متاح في Ailoot · المدخلات والطرائق

Ailoot · محادثة OpenAI POST /v1/chat/completions
الإدخال
text, image
الإخراج
text
السياق
⁦991,808⁩ tokens
الحد الأقصى للإخراج
⁦131,072⁩ tokens
صيغة الإخراج
json أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen3.7-plus
القيمة الافتراضية—
الحقلmessagesالنوعmessage[]المتطلبمطلوبالقيم والحدود
الحد الأدنى للعناصر: ⁦1⁩
القيمة الافتراضية—
الحقلmessages[].roleالنوعstringالمتطلبمطلوبالقيم والحدود
أمثلة: system, user, assistant, tool, function
الشروط: تُمثَّل هذه الأدوار صراحةً بأنواع التوافق في الشيفرة المصدرية؛ وتظل مجموعة الأدوار الدقيقة خاصة بكل نموذج.
يعتمد على النموذج
القيمة الافتراضية—
الحقلmessages[].contentالنوعstring|content_part[]|nullالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].tool_callsالنوعtool_call[]المتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].tool_call_idالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: role=tool؛ استخدم المعرّف الفعلي المُرجع
القيمة الافتراضية—
الحقلmessages[].nameالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].reasoning_contentالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: أعِد تمرير الاستدلال الفعلي المُرجع حيث يستخدمه هذا النموذج
القيمة الافتراضية—
الحقلmessages[].reasoning_detailsالنوعobject|arrayالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلmax_tokensالنوعintegerالمتطلباختياريالقيم والحدود
الحد الأدنى: ⁦1⁩
يعتمد على النموذج
القيمة الافتراضية—
الحقلmax_completion_tokensالنوعintegerالمتطلباختياريالقيم والحدود
الحد الأدنى: ⁦1⁩
يعتمد على النموذج
القيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
الحقلstream_options.include_usageالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtemperatureالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtop_pالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلstopالنوعstring|string[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtoolsالنوعfunction_tool[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtools[].typeالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtools[].function.nameالنوعstringالمتطلبمطلوبالقيم والحدود
ينطبق عندما: أداة دالة مقدّمة
القيمة الافتراضية—
الحقلtools[].function.descriptionالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtools[].function.parametersالنوعJSON_schemaالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtool_choiceالنوعstring|objectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلparallel_tool_callsالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلresponse_formatالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoning_effortالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoningالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلservice_tierالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلinstructionsالنوعstringالمتطلباختياريالقيم والحدود
حقل للتوافق
القيمة الافتراضية—
الحقلfunctionsالنوعfunction[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلfunction_callالنوعstring|objectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلprompt_cache_optionsالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
تركيبات مواد الإدخال

النص · نص UTF8

messages[].content

نص + صورة

{type:image_url,image_url:{url,detail}}

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةmaterial_typesالمواصفاتtext, image
المعلمةrequiredالمواصفاتmodel, messages
المعلمةoptional_controlsالمواصفاتnull
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةtext_file_materialالمواصفاتمحتوى UTF-8 الفعلي مُدرج كنص؛ وتحتاج معرّفات الملفات/URLs إلى دعم دقيق منفصل

دورة الحياة: exact retained published method

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

الباقات

تعرفات طرائق Ailoot

Ailoot محادثة OpenAIPOST /v1/chat/completions
الإدخال
⁦‏0.0004 US$⁩ / 1K
الإخراج
⁦‏0.0016 US$⁩ / 1K
قراءة ذاكرة التخزين المؤقت
⁦‏0.00008 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت
⁦‏0.0004 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت، 5 دقائق
⁦‏0.0004 US$⁩ / 1K tokens

الأسعار بحسب طول الطلب · محادثة OpenAI

حجم الطلب بالرموزالإدخالالإخراجقراءة ذاكرة التخزين المؤقتالكتابة إلى ذاكرة التخزين المؤقتذاكرة التخزين المؤقت 5 دقائقذاكرة التخزين المؤقت 1 ساعة
حجم الطلب بالرموز(⁦0⁩; ⁦256,000⁩]الإدخال⁦‏0.0004 US$⁩الإخراج⁦‏0.0016 US$⁩قراءة ذاكرة التخزين المؤقت⁦‏0.00008 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0004 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0004 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —
حجم الطلب بالرموز(⁦256,000⁩; ∞)الإدخال⁦‏0.0012 US$⁩الإخراج⁦‏0.0048 US$⁩قراءة ذاكرة التخزين المؤقت⁦≈‏0.00024 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0012 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0012 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —

الأسعار بوحدة USD لكل 1K من الرموز. عند عدم تحديد تعرفة، تُستخدم التعرفة الأساسية لهذه الطريقة؛ وتشير «—» إلى عدم تحديد تعرفة أساسية.

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

تفاصيل التعرفة المرجعية

لا تغيّر جداول التعرفة المرجعية على مستوى النموذج اختيار الطريقة أو عروض الأسعار أو الرسوم. وتستخدم الرسوم الفعلية تعرفات طريقة Ailoot المحددة.

جداول التعرفة المرجعية للنموذج

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتOpenAI Chat · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

أمثلة للطلبات

Ailoot · محادثة OpenAI

مثال للنصالإدخال، صورةPython SDKNode.js SDKالبث باستخدام Python
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen3.7-plus", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen3.7-plus", "messages": [{"role": "user", "content": [{"type": "text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["messages"][0]["content"].append({"type":"image_url","image_url":{"url":"data:"+mime+";base64,"+b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
    model="qwen3.7-plus",
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "qwen3.7-plus",
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='qwen3.7-plus',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")

استلام النتائج وحفظها

Ailoot · محادثة OpenAI

json أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

احتفظ بكل اختيار ومحتواه واستدعاءات أدواته واستدلاله. في SSE، جمّع التحديثات بحسب فهرس الاختيار/الأداة، واحتفظ بسبب الإنهاء النهائي والاستخدام.

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلchoices[].indexالنوعinteger
الحقلchoices[].message.contentالنوعstring|null
الحقلchoices[].message.tool_callsالنوعtool_call[]
الحقلchoices[].message.reasoning_contentالنوعstring
الحقلchoices[].message.reasoning_detailsالنوعobject|array
الحقلchoices[].finish_reasonالنوعstring|null
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

Ailoot Ultra · محادثة OpenAI POST /v1/chat/completions qwen3.7-plus

qwen3.7-plus

Alibaba /qwen3.7-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen/qwen3.7-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص
النتائج
النص

متاح في Ailoot · المدخلات والطرائق

Ailoot Ultra · محادثة OpenAI POST /v1/chat/completions
الإدخال
text
الإخراج
text
صيغة الإخراج
json أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen3.7-plus
القيمة الافتراضية—
الحقلmessagesالنوعmessage[]المتطلبمطلوبالقيم والحدود
الحد الأدنى للعناصر: ⁦1⁩
القيمة الافتراضية—
الحقلmessages[].roleالنوعstringالمتطلبمطلوبالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلmessages[].contentالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: محادثة نصية
القيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
تركيبات مواد الإدخال

النص · نص UTF8

messages[].content

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةrequiredالمواصفاتmodel, messages
المعلمةmaterial_typesالمواصفاتtext
المعلمةmessagesالمواصفاتمصفوفة رسائل ببنية role/content
المعلمةfile_materialالمواصفاتمستند UTF-8 الفعلي مُدرج كنص حرفي؛ لا يُستنتَج معرّف ملف
المعلمةoptional_controlsالمواصفاتstream
المعلمةcontrol_scopeالمواصفاتمحادثة نصية؛ stream قيمة منطقية، وقيمتها الافتراضية false.
المعلمةoutput_modalitiesالمواصفاتtext
المعلمةhosted_operationsالمواصفاتfalse
المعلمةmultimodal_input_bindingالمواصفاتnull

الأسماء البديلة للطريقة: /chat/completions

دورة الحياة: synchronous_or_streamed

أرسل معرّف النموذج الدقيق مع messages.

طول السياق ليس حدًا أقصى للإخراج.

يمكن لملف نصي تقديم نص حرفي؛ وتحتاج مدخلات الصور/الصوت/كائنات الملفات إلى ربط دقيق.

الباقات

مراجع التسعير لا تضيف خيارات للطلب. المعلمات المدعومة مذكورة للطريقة المحددة.

الوضع السريع
التعرفة القياسية عند اختيار الوضع السريع
الوضع المرن
التعرفة القياسية عند اختيار وضع flex
أقصى جهد للاستدلال
التعرفة القياسية عندما يُطبَّق الضبط الافتراضي default مع أقصى جهد للاستدلال

تعرفات Ailoot

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتالتعرفات الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتالشريحة 1 لطول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتالشريحة 2 لطول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

أمثلة للطلبات

Ailoot Ultra · محادثة OpenAI

curlPython SDK
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model":"qwen3.7-plus","messages":[{"role":"user","content":"hello"}],"stream":false}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model="qwen3.7-plus", messages=[{"role":"user","content":"hello"}], stream=False)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))

استلام النتائج وحفظها

Ailoot Ultra · محادثة OpenAI

json أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

احتفظ بكل اختيار ومحتواه واستدعاءات أدواته واستدلاله. في SSE، جمّع التحديثات بحسب فهرس الاختيار/الأداة، واحتفظ بسبب الإنهاء النهائي والاستخدام.

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلchoices[].indexالنوعinteger
الحقلchoices[].message.contentالنوعstring|null
الحقلchoices[].message.tool_callsالنوعtool_call[]
الحقلchoices[].message.reasoning_contentالنوعstring
الحقلchoices[].message.reasoning_detailsالنوعobject|array
الحقلchoices[].finish_reasonالنوعstring|null
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

Ailoot Ultra · رسائل Anthropic POST /v1/messages qwen3.7-plus

qwen3.7-plus

Alibaba /qwen3.7-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen/qwen3.7-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص
النتائج
json · sse

متاح في Ailoot · المدخلات والطرائق

Ailoot Ultra · رسائل Anthropic POST /v1/messages
الإدخال
text
الإخراج
json, sse
صيغة الإخراج
JSON أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen3.7-plus
القيمة الافتراضية—
الحقلmessagesالنوعmessage[]المتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].roleالنوعstringالمتطلبمطلوبالقيم والحدود
user, assistant
القيمة الافتراضية—
الحقلmessages[].contentالنوعstringالمتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلmax_tokensالنوعintegerالمتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
تركيبات مواد الإدخال

النص · نص UTF-8

سلسلة نصية messages[].content

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةrequiredالمواصفاتmodel, messages, max_tokens
المعلمةoptional_controlsالمواصفاتstream
المعلمةmaterial_typesالمواصفاتtext
المعلمةtext_file_materialالمواصفاتاقرأ مستند UTF-8 الفعلي وضع نصه في الإدخال المحدد أو السلسلة النصية لمحتوى الرسالة.

دورة الحياة: synchronous_or_streamed

الباقات

مراجع التسعير لا تضيف خيارات للطلب. المعلمات المدعومة مذكورة للطريقة المحددة.

الوضع السريع
التعرفة القياسية عند اختيار الوضع السريع
الوضع المرن
التعرفة القياسية عند اختيار وضع flex
أقصى جهد للاستدلال
التعرفة القياسية عندما يُطبَّق الضبط الافتراضي default مع أقصى جهد للاستدلال

تعرفات Ailoot

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتالتعرفات الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتالشريحة 1 لطول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتالشريحة 2 لطول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

أمثلة للطلبات

Ailoot Ultra · رسائل Anthropic

جسم طلب JSON مكتمل بالحد الأدنىcurl · استخدم مستندك بترميز UTF-8Python · احفظ النتيجة كاملة
{
  "model": "qwen3.7-plus",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'qwen3.7-plus', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'qwen3.7-plus', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))

استلام النتائج وحفظها

Ailoot Ultra · رسائل Anthropic

JSON أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

احتفظ بكل كتل المحتوى وتوقيعات التفكير ومعرّفات استخدام الأدوات الفعلية. جمّع جميع تحديثات كتل SSE؛ فأول كتلة نصية ليست الإخراج الكامل.

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلidالنوعstring
الحقلmodelالنوعstring
الحقلcontent[]النوعtext|thinking|tool_use|other content block
الحقلstop_reasonالنوعstring|null
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

Ailoot · رسائل Anthropic POST /v1/messages qwen-plus

qwen-plus

Alibaba /qwen-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص · الصور
النتائج
النص

متاح في Ailoot · المدخلات والطرائق

Ailoot · رسائل Anthropic POST /v1/messages
الإدخال
text, image
الإخراج
text
السياق
⁦991,808⁩ tokens
الحد الأقصى للإخراج
⁦131,072⁩ tokens
صيغة الإخراج
json أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen-plus
القيمة الافتراضية—
الحقلmessagesالنوعmessage[]المتطلبمطلوبالقيم والحدود
الحد الأدنى للعناصر: ⁦1⁩
القيمة الافتراضية—
الحقلmessages[].roleالنوعstringالمتطلبمطلوبالقيم والحدود
user, assistant
القيمة الافتراضية—
الحقلmessages[].contentالنوعstring|content_block[]المتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلsystemالنوعstring|content_block[]المتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmax_tokensالنوعintegerالمتطلبمطلوبالقيم والحدود
الحد الأدنى: ⁦1⁩
نطاق تطبيق الحد: الحد الأقصى الدقيق للنموذج/البطاقة المختارة
القيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
الحقلtemperatureالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtop_pالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلstop_sequencesالنوعstring[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtoolsالنوعtool[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtools[].nameالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: أداة مقدّمة
القيمة الافتراضية—
الحقلtools[].descriptionالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtools[].input_schemaالنوعJSON_schemaالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtool_choiceالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلthinking.typeالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلthinking.budget_tokensالنوعintegerالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلoutput_config.effortالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلmetadataالنوعobjectالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلcache_controlالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
تركيبات مواد الإدخال

النص · نص UTF8

messages[].content أو كتلة type=text

نص + صورة

{type:image,source:{type:base64,media_type,data}} أو مصدر من النوع type=url

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةmaterial_typesالمواصفاتtext, image
المعلمةrequiredالمواصفاتmodel, messages, max_tokens
المعلمةoptional_controlsالمواصفاتnull
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةtext_file_materialالمواصفاتمحتوى UTF-8 الفعلي مُدرج كنص؛ وتحتاج معرّفات الملفات/URLs إلى دعم دقيق منفصل

دورة الحياة: exact retained published method

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

الباقات

تعرفات طرائق Ailoot

Ailoot رسائل AnthropicPOST /v1/messages
الإدخال
⁦‏0.0004 US$⁩ / 1K
الإخراج
⁦‏0.0016 US$⁩ / 1K
قراءة ذاكرة التخزين المؤقت
⁦‏0.00004 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت
⁦‏0.0005 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت، 5 دقائق
⁦‏0.0005 US$⁩ / 1K tokens

الأسعار بحسب طول الطلب · رسائل Anthropic

حجم الطلب بالرموزالإدخالالإخراجقراءة ذاكرة التخزين المؤقتالكتابة إلى ذاكرة التخزين المؤقتذاكرة التخزين المؤقت 5 دقائقذاكرة التخزين المؤقت 1 ساعة
حجم الطلب بالرموز(⁦0⁩; ⁦256,000⁩]الإدخال⁦‏0.0004 US$⁩الإخراج⁦‏0.0016 US$⁩قراءة ذاكرة التخزين المؤقت⁦‏0.00004 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0005 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0005 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —
حجم الطلب بالرموز(⁦256,000⁩; ∞)الإدخال⁦‏0.0012 US$⁩الإخراج⁦‏0.0048 US$⁩قراءة ذاكرة التخزين المؤقت⁦≈‏0.00012 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0015 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0015 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —

الأسعار بوحدة USD لكل 1K من الرموز. عند عدم تحديد تعرفة، تُستخدم التعرفة الأساسية لهذه الطريقة؛ وتشير «—» إلى عدم تحديد تعرفة أساسية.

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

تفاصيل التعرفة المرجعية

لا تغيّر جداول التعرفة المرجعية على مستوى النموذج اختيار الطريقة أو عروض الأسعار أو الرسوم. وتستخدم الرسوم الفعلية تعرفات طريقة Ailoot المحددة.

جداول التعرفة المرجعية للنموذج

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتOpenAI Chat · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

أمثلة للطلبات

Ailoot · رسائل Anthropic

مثال للنصالإدخال، صورةPython SDKNode.js SDKالبث باستخدام Python
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen-plus", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen-plus", "max_tokens": 1024, "messages": [{"role": "user", "content": [{"type": "text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["messages"][0]["content"].append({"type":"image","source":{"type":"base64","media_type":mime,"data":b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="qwen-plus",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "qwen-plus",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='qwen-plus',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")

استلام النتائج وحفظها

Ailoot · رسائل Anthropic

json أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

احتفظ بكل كتل المحتوى وتوقيعات التفكير ومعرّفات استخدام الأدوات الفعلية. جمّع جميع تحديثات كتل SSE؛ فأول كتلة نصية ليست الإخراج الكامل.

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلidالنوعstring
الحقلmodelالنوعstring
الحقلcontent[]النوعtext|thinking|tool_use|other content block
الحقلstop_reasonالنوعstring|null
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

Ailoot · OpenAI Responses POST /v1/responses qwen-plus

qwen-plus

Alibaba /qwen-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص · الصور
النتائج
النص

متاح في Ailoot · المدخلات والطرائق

Ailoot · OpenAI Responses POST /v1/responses
الإدخال
text, image
الإخراج
text
السياق
⁦991,808⁩ tokens
الحد الأقصى للإخراج
⁦131,072⁩ tokens
صيغة الإخراج
json أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen-plus
القيمة الافتراضية—
الحقلinputالنوعstring|input_item[]المتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلinstructionsالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلinput[].typeالنوعstringالمتطلباختياريالقيم والحدود
message, reasoning, function_call, function_call_output
القيمة الافتراضية—
الحقلinput[].contentالنوعstring|content_part[]المتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلinput[].call_idالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: function_call_output؛ احتفظ بقيمة call_id الفعلية المُرجعة
القيمة الافتراضية—
الحقلinput[].outputالنوعstring|content_part[]المتطلباختياريالقيم والحدود
ينطبق عندما: function_call_output
القيمة الافتراضية—
الحقلmax_output_tokensالنوعintegerالمتطلباختياريالقيم والحدود
الحد الأدنى: ⁦1⁩
يعتمد على النموذج
القيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
الحقلtemperatureالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtop_pالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtoolsالنوعtool[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtool_choiceالنوعstring|objectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلparallel_tool_callsالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoning.effortالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoning.summaryالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtext.formatالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtext.verbosityالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلincludeالنوعstring[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلstoreالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلprevious_response_idالنوعstringالمتطلباختياريالقيم والحدود
متطلبات المعرّف ID: معرّف استجابة فعلي فقط من متابعة مدعومة
يعتمد على النموذج
القيمة الافتراضية—
الحقلservice_tierالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلprompt_cache_keyالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلprompt_cache_optionsالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
تركيبات مواد الإدخال

النص · نص UTF8

نص إدخال أو جزء input_text

نص + صورة

{type:input_image,image_url}

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةmaterial_typesالمواصفاتtext, image
المعلمةrequiredالمواصفاتmodel, input
المعلمةoptional_controlsالمواصفاتnull
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةtext_file_materialالمواصفاتمحتوى UTF-8 الفعلي مُدرج كنص؛ وتحتاج معرّفات الملفات/URLs إلى دعم دقيق منفصل

دورة الحياة: exact retained published method

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

الباقات

تعرفات طرائق Ailoot

Ailoot OpenAI ResponsesPOST /v1/responses
الإدخال
⁦‏0.0004 US$⁩ / 1K
الإخراج
⁦‏0.0016 US$⁩ / 1K
قراءة ذاكرة التخزين المؤقت
⁦‏0.00008 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت
⁦‏0.0004 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت، 5 دقائق
⁦‏0.0004 US$⁩ / 1K tokens
code_interpreter_call
⁦‏0.00 US$⁩ لكل استدعاء
image_search_call
⁦‏0.008 US$⁩ لكل استدعاء
web_extractor_call
⁦‏0.00 US$⁩ لكل استدعاء
web_search_call
⁦‏0.01 US$⁩ لكل استدعاء
web_search_image_call
⁦‏0.008 US$⁩ لكل استدعاء
أقصى عدد للاستدعاءات code_interpreter_call
⁦8⁩
أقصى عدد للاستدعاءات image_search_call
⁦8⁩
أقصى عدد للاستدعاءات web_extractor_call
⁦8⁩
أقصى عدد للاستدعاءات web_search_call
⁦8⁩
أقصى عدد للاستدعاءات web_search_image_call
⁦8⁩

الأسعار بحسب طول الطلب · OpenAI Responses

حجم الطلب بالرموزالإدخالالإخراجقراءة ذاكرة التخزين المؤقتالكتابة إلى ذاكرة التخزين المؤقتذاكرة التخزين المؤقت 5 دقائقذاكرة التخزين المؤقت 1 ساعة
حجم الطلب بالرموز(⁦0⁩; ⁦256,000⁩]الإدخال⁦‏0.0004 US$⁩الإخراج⁦‏0.0016 US$⁩قراءة ذاكرة التخزين المؤقت⁦‏0.00008 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0004 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0004 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —
حجم الطلب بالرموز(⁦256,000⁩; ∞)الإدخال⁦‏0.0012 US$⁩الإخراج⁦‏0.0048 US$⁩قراءة ذاكرة التخزين المؤقت⁦≈‏0.00024 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0012 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0012 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —

الأسعار بوحدة USD لكل 1K من الرموز. عند عدم تحديد تعرفة، تُستخدم التعرفة الأساسية لهذه الطريقة؛ وتشير «—» إلى عدم تحديد تعرفة أساسية.

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

تفاصيل التعرفة المرجعية

لا تغيّر جداول التعرفة المرجعية على مستوى النموذج اختيار الطريقة أو عروض الأسعار أو الرسوم. وتستخدم الرسوم الفعلية تعرفات طريقة Ailoot المحددة.

جداول التعرفة المرجعية للنموذج

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتOpenAI Chat · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

أمثلة للطلبات

Ailoot · OpenAI Responses

مثال للنصالإدخال، صورةPython SDKNode.js SDKالبث باستخدام Python
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen-plus", "input": ""}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["input"]="Summarize this material and quote supporting source passages.\n\n"+text
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen-plus", "input": [{"role": "user", "content": [{"type": "input_text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["input"][0]["content"].append({"type":"input_image","image_url":"data:"+mime+";base64,"+b64})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/responses \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.responses.create(model="qwen-plus", input="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "qwen-plus", input: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
from openai import OpenAI
import os
from pathlib import Path
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
with client.responses.stream(model="qwen-plus", input="Explain the difference between an observation and a hypothesis in three sentences.") as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_response()
    save_result(final.to_dict(mode="json"),"stream-result")

استلام النتائج وحفظها

Ailoot · OpenAI Responses

json أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

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

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلidالنوعstring
الحقلstatusالنوعstring
الحقلoutput[]النوعmessage|reasoning|function_call|other item
الحقلoutput[].content[]النوعcontent part
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

Ailoot · محادثة OpenAI POST /v1/chat/completions qwen-plus

qwen-plus

Alibaba /qwen-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص · الصور
النتائج
النص

متاح في Ailoot · المدخلات والطرائق

Ailoot · محادثة OpenAI POST /v1/chat/completions
الإدخال
text, image
الإخراج
text
السياق
⁦991,808⁩ tokens
الحد الأقصى للإخراج
⁦131,072⁩ tokens
صيغة الإخراج
json أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen-plus
القيمة الافتراضية—
الحقلmessagesالنوعmessage[]المتطلبمطلوبالقيم والحدود
الحد الأدنى للعناصر: ⁦1⁩
القيمة الافتراضية—
الحقلmessages[].roleالنوعstringالمتطلبمطلوبالقيم والحدود
أمثلة: system, user, assistant, tool, function
الشروط: تُمثَّل هذه الأدوار صراحةً بأنواع التوافق في الشيفرة المصدرية؛ وتظل مجموعة الأدوار الدقيقة خاصة بكل نموذج.
يعتمد على النموذج
القيمة الافتراضية—
الحقلmessages[].contentالنوعstring|content_part[]|nullالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].tool_callsالنوعtool_call[]المتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].tool_call_idالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: role=tool؛ استخدم المعرّف الفعلي المُرجع
القيمة الافتراضية—
الحقلmessages[].nameالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].reasoning_contentالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: أعِد تمرير الاستدلال الفعلي المُرجع حيث يستخدمه هذا النموذج
القيمة الافتراضية—
الحقلmessages[].reasoning_detailsالنوعobject|arrayالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلmax_tokensالنوعintegerالمتطلباختياريالقيم والحدود
الحد الأدنى: ⁦1⁩
يعتمد على النموذج
القيمة الافتراضية—
الحقلmax_completion_tokensالنوعintegerالمتطلباختياريالقيم والحدود
الحد الأدنى: ⁦1⁩
يعتمد على النموذج
القيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
الحقلstream_options.include_usageالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtemperatureالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtop_pالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلstopالنوعstring|string[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtoolsالنوعfunction_tool[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtools[].typeالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtools[].function.nameالنوعstringالمتطلبمطلوبالقيم والحدود
ينطبق عندما: أداة دالة مقدّمة
القيمة الافتراضية—
الحقلtools[].function.descriptionالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtools[].function.parametersالنوعJSON_schemaالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtool_choiceالنوعstring|objectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلparallel_tool_callsالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلresponse_formatالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoning_effortالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoningالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلservice_tierالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلinstructionsالنوعstringالمتطلباختياريالقيم والحدود
حقل للتوافق
القيمة الافتراضية—
الحقلfunctionsالنوعfunction[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلfunction_callالنوعstring|objectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلprompt_cache_optionsالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
تركيبات مواد الإدخال

النص · نص UTF8

messages[].content

نص + صورة

{type:image_url,image_url:{url,detail}}

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةmaterial_typesالمواصفاتtext, image
المعلمةrequiredالمواصفاتmodel, messages
المعلمةoptional_controlsالمواصفاتnull
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةtext_file_materialالمواصفاتمحتوى UTF-8 الفعلي مُدرج كنص؛ وتحتاج معرّفات الملفات/URLs إلى دعم دقيق منفصل

دورة الحياة: exact retained published method

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

الباقات

تعرفات طرائق Ailoot

Ailoot محادثة OpenAIPOST /v1/chat/completions
الإدخال
⁦‏0.0004 US$⁩ / 1K
الإخراج
⁦‏0.0016 US$⁩ / 1K
قراءة ذاكرة التخزين المؤقت
⁦‏0.00008 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت
⁦‏0.0004 US$⁩ / 1K
الكتابة إلى ذاكرة التخزين المؤقت، 5 دقائق
⁦‏0.0004 US$⁩ / 1K tokens

الأسعار بحسب طول الطلب · محادثة OpenAI

حجم الطلب بالرموزالإدخالالإخراجقراءة ذاكرة التخزين المؤقتالكتابة إلى ذاكرة التخزين المؤقتذاكرة التخزين المؤقت 5 دقائقذاكرة التخزين المؤقت 1 ساعة
حجم الطلب بالرموز(⁦0⁩; ⁦256,000⁩]الإدخال⁦‏0.0004 US$⁩الإخراج⁦‏0.0016 US$⁩قراءة ذاكرة التخزين المؤقت⁦‏0.00008 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0004 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0004 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —
حجم الطلب بالرموز(⁦256,000⁩; ∞)الإدخال⁦‏0.0012 US$⁩الإخراج⁦‏0.0048 US$⁩قراءة ذاكرة التخزين المؤقت⁦≈‏0.00024 US$⁩الكتابة إلى ذاكرة التخزين المؤقت⁦‏0.0012 US$⁩ذاكرة التخزين المؤقت 5 دقائق⁦‏0.0012 US$⁩ذاكرة التخزين المؤقت 1 ساعةالأساسية: —

الأسعار بوحدة USD لكل 1K من الرموز. عند عدم تحديد تعرفة، تُستخدم التعرفة الأساسية لهذه الطريقة؛ وتشير «—» إلى عدم تحديد تعرفة أساسية.

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

تفاصيل التعرفة المرجعية

لا تغيّر جداول التعرفة المرجعية على مستوى النموذج اختيار الطريقة أو عروض الأسعار أو الرسوم. وتستخدم الرسوم الفعلية تعرفات طريقة Ailoot المحددة.

جداول التعرفة المرجعية للنموذج

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتOpenAI Chat · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتOpenAI Chat · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الأسعار الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 1 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتAnthropic Messages · الشريحة 2 حسب طول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

أمثلة للطلبات

Ailoot · محادثة OpenAI

مثال للنصالإدخال، صورةPython SDKNode.js SDKالبث باستخدام Python
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen-plus", "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen-plus", "messages": [{"role": "user", "content": [{"type": "text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["messages"][0]["content"].append({"type":"image_url","image_url":{"url":"data:"+mime+";base64,"+b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = OpenAI(base_url="https://api.ailoot.ai/v1", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
resp = client.chat.completions.create(
    model="qwen-plus",
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_dict(mode="json"))
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "qwen-plus",
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='qwen-plus',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")

استلام النتائج وحفظها

Ailoot · محادثة OpenAI

json أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

احتفظ بكل اختيار ومحتواه واستدعاءات أدواته واستدلاله. في SSE، جمّع التحديثات بحسب فهرس الاختيار/الأداة، واحتفظ بسبب الإنهاء النهائي والاستخدام.

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلchoices[].indexالنوعinteger
الحقلchoices[].message.contentالنوعstring|null
الحقلchoices[].message.tool_callsالنوعtool_call[]
الحقلchoices[].message.reasoning_contentالنوعstring
الحقلchoices[].message.reasoning_detailsالنوعobject|array
الحقلchoices[].finish_reasonالنوعstring|null
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

Ailoot Ultra · محادثة OpenAI POST /v1/chat/completions qwen/qwen3.7-plus

qwen/qwen3.7-plus

Alibaba /qwen/qwen3.7-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen/qwen3.7-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص
النتائج
النص

متاح في Ailoot · المدخلات والطرائق

Ailoot Ultra · محادثة OpenAI POST /v1/chat/completions
الإدخال
text
الإخراج
text
صيغة الإخراج
json أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen/qwen3.7-plus
القيمة الافتراضية—
الحقلmessagesالنوعmessage[]المتطلبمطلوبالقيم والحدود
الحد الأدنى للعناصر: ⁦1⁩
القيمة الافتراضية—
الحقلmessages[].roleالنوعstringالمتطلبمطلوبالقيم والحدود
أمثلة: system, user, assistant, tool, function
الشروط: تُمثَّل هذه الأدوار صراحةً بأنواع التوافق في الشيفرة المصدرية؛ وتظل مجموعة الأدوار الدقيقة خاصة بكل نموذج.
يعتمد على النموذج
القيمة الافتراضية—
الحقلmessages[].contentالنوعstring|content_part[]|nullالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].tool_callsالنوعtool_call[]المتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].tool_call_idالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: role=tool؛ استخدم المعرّف الفعلي المُرجع
القيمة الافتراضية—
الحقلmessages[].nameالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].reasoning_contentالنوعstringالمتطلباختياريالقيم والحدود
ينطبق عندما: أعِد تمرير الاستدلال الفعلي المُرجع حيث يستخدمه هذا النموذج
القيمة الافتراضية—
الحقلmessages[].reasoning_detailsالنوعobject|arrayالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلmax_tokensالنوعintegerالمتطلباختياريالقيم والحدود
الحد الأدنى: ⁦1⁩
يعتمد على النموذج
القيمة الافتراضية—
الحقلmax_completion_tokensالنوعintegerالمتطلباختياريالقيم والحدود
الحد الأدنى: ⁦1⁩
يعتمد على النموذج
القيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
الحقلstream_options.include_usageالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtemperatureالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtop_pالنوعnumberالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلstopالنوعstring|string[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtoolsالنوعfunction_tool[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلtools[].typeالنوعstringالمتطلباختياريالقيم والحدود
function
يعتمد على النموذج
القيمة الافتراضية—
الحقلtools[].function.nameالنوعstringالمتطلبمطلوبالقيم والحدود
ينطبق عندما: أداة دالة مقدّمة
القيمة الافتراضية—
الحقلtools[].function.descriptionالنوعstringالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtools[].function.parametersالنوعJSON_schemaالمتطلباختياريالقيم والحدودالقيمة الافتراضية—
الحقلtool_choiceالنوعstring|objectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلparallel_tool_callsالنوعbooleanالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلresponse_formatالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoning_effortالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلreasoningالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلservice_tierالنوعstringالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلinstructionsالنوعstringالمتطلباختياريالقيم والحدود
حقل للتوافق
القيمة الافتراضية—
الحقلfunctionsالنوعfunction[]المتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلfunction_callالنوعstring|objectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلprompt_cache_optionsالنوعobjectالمتطلباختياريالقيم والحدود
يعتمد على النموذج
القيمة الافتراضية—
الحقلmodalitiesالنوعstring[]المتطلباختياريالقيم والحدود
text
القيمة الافتراضية—
الحقلproviderالنوعobjectالمتطلباختياريالقيم والحدود
الشروط: يُرفَض provider.options في مسار Ultra النصي هذا
القيمة الافتراضية—
الحقلcache_control.ttlالنوعstringالمتطلباختياريالقيم والحدود
الشروط: تُرفَض 1h في المواضع الفعلية للتخزين المؤقت للموجّه
القيمة الافتراضية—
تركيبات مواد الإدخال

النص · نص UTF8

messages[].content

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةrequiredالمواصفاتmodel, messages
المعلمةmaterial_typesالمواصفاتtext
المعلمةmessagesالمواصفاتمصفوفة رسائل ببنية role/content
المعلمةfile_materialالمواصفاتمستند UTF-8 الفعلي مُدرج كنص حرفي؛ لا يُستنتَج معرّف ملف
المعلمةoptional_controlsالمواصفاتstream, temperature, top_p, stop, max_tokens, max_completion_tokens, reasoning, response_format, tools, tool_choice
المعلمةcontrol_scopeالمواصفاتخاص بالنموذج؛ أدوات الدوال التي يقدّمها المستخدم تختلف عن الأدوات المستضافة
المعلمةoutput_modalitiesالمواصفاتtext
المعلمةhosted_operationsالمواصفاتfalse
المعلمةmultimodal_input_bindingالمواصفاتnull

دورة الحياة: synchronous_or_streamed

أرسل معرّف النموذج الدقيق مع messages.

طول السياق ليس حدًا أقصى للإخراج.

يمكن لملف نصي تقديم نص حرفي؛ وتحتاج مدخلات الصور/الصوت/كائنات الملفات إلى ربط دقيق.

الباقات

مراجع التسعير لا تضيف خيارات للطلب. المعلمات المدعومة مذكورة للطريقة المحددة.

الوضع السريع
التعرفة القياسية عند اختيار الوضع السريع
الوضع المرن
التعرفة القياسية عند اختيار وضع flex
أقصى جهد للاستدلال
التعرفة القياسية عندما يُطبَّق الضبط الافتراضي default مع أقصى جهد للاستدلال

تعرفات Ailoot

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتالتعرفات الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتالشريحة 1 لطول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتالشريحة 2 لطول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

أمثلة للطلبات

Ailoot Ultra · محادثة OpenAI

curlPython SDKالبث باستخدام Python
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen/qwen3.7-plus", "messages": [{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}]}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model='qwen/qwen3.7-plus',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}])
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='qwen/qwen3.7-plus',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")

استلام النتائج وحفظها

Ailoot Ultra · محادثة OpenAI

json أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

احتفظ بكل اختيار ومحتواه واستدعاءات أدواته واستدلاله. في SSE، جمّع التحديثات بحسب فهرس الاختيار/الأداة، واحتفظ بسبب الإنهاء النهائي والاستخدام.

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلchoices[].indexالنوعinteger
الحقلchoices[].message.contentالنوعstring|null
الحقلchoices[].message.tool_callsالنوعtool_call[]
الحقلchoices[].message.reasoning_contentالنوعstring
الحقلchoices[].message.reasoning_detailsالنوعobject|array
الحقلchoices[].finish_reasonالنوعstring|null
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

Ailoot Ultra · رسائل Anthropic POST /v1/messages qwen/qwen3.7-plus

qwen/qwen3.7-plus

Alibaba /qwen/qwen3.7-plus
معرّف النموذج ID
  • qwen3.7-plus
  • qwen/qwen3.7-plus

البداية

Qwen3.7 Plus نموذج Qwen من Alibaba لمهام النص والصور بإجابات نصية. يجمع ملفه المنشور سياقًا من مليون رمز والاستدلال وأدوات الدوال وضوابط المخرجات المنظَّمة للمساعدين وتحليل المستندات أو المحتوى البصري.

المدخلات المقبولة
النص
النتائج
json · sse

متاح في Ailoot · المدخلات والطرائق

Ailoot Ultra · رسائل Anthropic POST /v1/messages
الإدخال
text
الإخراج
json, sse
صيغة الإخراج
JSON أو SSE
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلmodelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen/qwen3.7-plus
القيمة الافتراضية—
الحقلmessagesالنوعmessage[]المتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلmessages[].roleالنوعstringالمتطلبمطلوبالقيم والحدود
user, assistant
القيمة الافتراضية—
الحقلmessages[].contentالنوعstringالمتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلmax_tokensالنوعintegerالمتطلبمطلوبالقيم والحدودالقيمة الافتراضية—
الحقلstreamالنوعbooleanالمتطلباختياريالقيم والحدودالقيمة الافتراضيةfalse
تركيبات مواد الإدخال

النص · نص UTF-8

سلسلة نصية messages[].content

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةcontent_typeالمواصفاتapplication/json
المعلمةrequiredالمواصفاتmodel, messages, max_tokens
المعلمةoptional_controlsالمواصفاتstream
المعلمةmaterial_typesالمواصفاتtext
المعلمةtext_file_materialالمواصفاتاقرأ مستند UTF-8 الفعلي وضع نصه في الإدخال المحدد أو السلسلة النصية لمحتوى الرسالة.

دورة الحياة: synchronous_or_streamed

الباقات

مراجع التسعير لا تضيف خيارات للطلب. المعلمات المدعومة مذكورة للطريقة المحددة.

الوضع السريع
التعرفة القياسية عند اختيار الوضع السريع
الوضع المرن
التعرفة القياسية عند اختيار وضع flex
أقصى جهد للاستدلال
التعرفة القياسية عندما يُطبَّق الضبط الافتراضي default مع أقصى جهد للاستدلال

تعرفات Ailoot

الأسعار حسب الإعدادات

طابق كل رسم مع الشروط المعروضة. طبّق تعرفة واحدة لكل مجموعة من الإعدادات البديلة.

الإعداداتجدول التعرفةرموز السياق، أكثر منرموز السياق، حتى القيمة شاملةًالرسوم
الإعداداتالتعرفات الأساسية للرموزجدول التعرفةالتعرفة الأساسيةرموز السياق، أكثر من—رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتالشريحة 1 لطول الطلبجدول التعرفة—رموز السياق، أكثر من⁦0⁩رموز السياق، حتى القيمة شاملةً⁦256,000⁩الرسوم
الإدخال · رموز الإدخال $0.00064 / 1K من الرموز
الإخراج · رموز الإخراج $0.00256 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000128 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0008 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز
الإعداداتالشريحة 2 لطول الطلبجدول التعرفة—رموز السياق، أكثر من⁦256,000⁩رموز السياق، حتى القيمة شاملةًلا يوجد حد أقصىالرسوم
الإدخال · رموز الإدخال $0.00192 / 1K من الرموز
الإخراج · رموز الإخراج $0.00768 / 1K من الرموز
الإدخال · قراءة ذاكرة التخزين المؤقت $0.000384 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت $0.0024 / 1K من الرموز
الإدخال · الكتابة إلى ذاكرة التخزين المؤقت، 1 ساعة — / 1K من الرموز

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

أمثلة للطلبات

Ailoot Ultra · رسائل Anthropic

جسم طلب JSON مكتمل بالحد الأدنىcurl · استخدم مستندك بترميز UTF-8Python · احفظ النتيجة كاملة
{
  "model": "qwen/qwen3.7-plus",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'qwen/qwen3.7-plus', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'qwen/qwen3.7-plus', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))

استلام النتائج وحفظها

Ailoot Ultra · رسائل Anthropic

JSON أو SSE

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

احتفظ بكل كتل المحتوى وتوقيعات التفكير ومعرّفات استخدام الأدوات الفعلية. جمّع جميع تحديثات كتل SSE؛ فأول كتلة نصية ليست الإخراج الكامل.

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بمعرّفات الطلبات/الاستجابات والترويسات. لا يُقدَّم URL عام لاسترجاع مهمة نصية.

حقول الاستجابة
الحقلالنوع
الحقلidالنوعstring
الحقلmodelالنوعstring
الحقلcontent[]النوعtext|thinking|tool_use|other content block
الحقلstop_reasonالنوعstring|null
الحقلusageالنوعobject
الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦400⁩ · invalid_request_errorالشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحةالخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen3.7-plus, qwen-plus
Ailoot Ultra qwen3.7-plus, qwen/qwen3.7-plus

الأسماء البديلة لمسارات الطرائق

/chat/completions

معرّفات النماذج ذات الصلة IDs

qwen/qwen3.7-plus, qwen-plus, qwen3.7-plus, qwen3.7-plus

FAQ · Qwen: Qwen3.7 Plus
ما المدخلات والنتائج المتاحة؟

POST /v1/messages · qwen3.7-plus: text, image → text

POST /v1/responses · qwen3.7-plus: text, image → text

POST /v1/chat/completions · qwen3.7-plus: text, image → text

POST /v1/chat/completions · qwen3.7-plus: text → text

POST /v1/messages · qwen3.7-plus: text → json, sse

POST /v1/messages · qwen-plus: text, image → text

POST /v1/responses · qwen-plus: text, image → text

POST /v1/chat/completions · qwen-plus: text, image → text

POST /v1/chat/completions · qwen/qwen3.7-plus: text → text

POST /v1/messages · qwen/qwen3.7-plus: text → json, sse

ما الحقول التي يستخدمها الطلب؟

POST /v1/messages · qwen3.7-plus: model, messages, system, max_tokens, stream, metadata

POST /v1/responses · qwen3.7-plus: model, input, instructions, stream

POST /v1/chat/completions · qwen3.7-plus: model, messages, stream

POST /v1/chat/completions · qwen3.7-plus: model, messages, stream

POST /v1/messages · qwen3.7-plus: model, messages, max_tokens, stream

POST /v1/messages · qwen-plus: model, messages, system, max_tokens, stream, metadata

POST /v1/responses · qwen-plus: model, input, instructions, stream

POST /v1/chat/completions · qwen-plus: model, messages, stream

POST /v1/chat/completions · qwen/qwen3.7-plus: model, messages, stream, modalities, provider

POST /v1/messages · qwen/qwen3.7-plus: model, messages, max_tokens, stream

ما الحدود المطبقة؟

POST /v1/messages · qwen3.7-plus: ctx: 991808; max_out: 131072; messages.min_items: 1; max_tokens.minimum: 1

POST /v1/responses · qwen3.7-plus: ctx: 991808; max_out: 131072

POST /v1/chat/completions · qwen3.7-plus: ctx: 991808; max_out: 131072; messages.min_items: 1

POST /v1/chat/completions · qwen3.7-plus: messages.min_items: 1

POST /v1/messages · qwen-plus: ctx: 991808; max_out: 131072; messages.min_items: 1; max_tokens.minimum: 1

POST /v1/responses · qwen-plus: ctx: 991808; max_out: 131072

POST /v1/chat/completions · qwen-plus: ctx: 991808; max_out: 131072; messages.min_items: 1

POST /v1/chat/completions · qwen/qwen3.7-plus: messages.min_items: 1

المزيد من التفاصيل

اربط Ailoot بخدمة Claude Code أوOpenCode أوHermes أوتطبيقك.

الشركة ومحفظة مشاريعها

الشركة ومحفظة مشاريعها: ملايين العملاء؛ مبيعات بالمليارات شهريًا.

اشتر الرموز بخصم.

خصم اشتراك للعمل المنتظم. الرموز الترويجية حتى 50% على شراء الرموز.

الاشتراك
اختر خطة بخصم لطلباتك المنتظمة.
رمز خصم حتى 50%
أدخل الرمز عند الشراء. يعاد حساب السعر وفق العرض الساري.
المصروفات في السجل
يحفظ النموذج والرموز والمبلغ لكل طلب.

اختر اشتراكا · اعرض أسعار النماذج

اربط API بالمنتج الذي تبيعه.

SaaS والتطبيقات والبوتات وفق العرض واتفاقية ترخيص Ailoot. لإعادة البيع، اطلب ترخيص موزع.

تطبيق تجاري
أضف توليد النص والصور والفيديو والصوت إلى ميزات خدمتك المدفوعة.
ترخيص إعادة البيع
أرسل وصف المشروع وطريقة توفير الوصول. اطلب شروط استخدام وإعادة بيع مكتوبة.
المستندات على الموقع
العرض واتفاقية الترخيص وسياسة معالجة البيانات متاحة قبل الربط.

اطلب ترخيص إعادة بيع · العرض واتفاقية الترخيص