qwen-max
Qwen-Max — ko‘p tilli suhbat, mantiqiy fikrlash, dasturlash va kontent yaratish uchun matn modeli. U ko‘rsatmalarga batafsil rioya qilishni JSONga yo‘naltirilgan chiqish va javob uslubini boshqarish bilan birlashtiradi.
- Ailoot Ultra · OpenAI Chat
POST /v1/chat/completionsqwen-max-latest - Ailoot Ultra · Anthropic Messages
POST /v1/messagesqwen-max-latest
Model haqida
Bu tavsif model imkoniyatlarini yoritadi. Ailoot da tanlangan usul uchun mavjud kirish, chiqish va parametrlar quyida keltirilgan.
Qwen-Max — Qwen oilasiga mansub yirik matn modeli bo‘lib, tilni tushunish, mantiqiy fikrlash va katta hajmdagi yozma natijani birlashtiradigan vazifalar uchun mo‘ljallangan. Ishlab chiqaruvchi xitoycha va inglizcha dasturlash, ko‘p tilli ishlar, ijodiy yozish va rolli suhbatni alohida ta’kidlaydi. Model so‘ralgan javob uslubiga rioya qilgan holda aniqroq va batafsilroq javoblar yaratishga mo‘ljallangan.
Model nomi muntazam yangilanib boradi. Ishlab chiqaruvchi hozir qwen-max modelini funksional jihatdan qwen-max-2025-01-25 nusxasiga teng deb tavsiflaydi. Yangilanib boradigan nom va sanasi belgilangan nusxa turli maqsadlarga xizmat qiladi: biri liniya rivojlanishini kuzatadi, ikkinchisi esa muayyan nashrni bildiradi. Takroriy vazifalarni taqqoslaganda yoki yordamchi konfiguratsiyasini izchil saqlaganda bu farqni saqlang.
Model imkoniyatlari
Qwen-Max matn qabul qiladi va matn yaratadi. U suhbat, manba parchalari, dasturiy talab yoki mavjud kod fragmenti bilan ishlashi mumkin. Natija tushuntirish, qayta yozilgan hujjat, dasturiy yechim yoki ajratib olingan maydonlar to‘plami bo‘lishi kerak bo‘lganda undan foydalaning. Skanerlangan sahifa yoki ekran tasviri kerakli ma’lumotni matn shaklida taqdim etadigan alohida bosqichni talab qiladi; bu model uchun hujjatlashtirilgan kirish tasvir emas.
Ishlab chiqaruvchi JSON formatiga rioya qilishni alohida qayd etadi. Amaliy ma’lumot ajratish vazifasida mavzu, manbada ochiq aytilgan shartlar va hal etilmagan savol kabi maydonlarni belgilash mumkin. Manba parchasini va kerakli maydon nomlarini taqdim eting, yetishmayotgan ma’lumot qanday ifodalanishini ayting. Bu suhbat javobini ilova tekshira va qayta ishlay oladigan ma’lumotga aylantiradi. JSON so‘rovi va oddiy matnli tushuntirish so‘rovi chiqishga qo‘yiladigan turli talablar bo‘lib, alohida bayon qilinishi kerak.
Hujjatlashtirilgan interfeyslar funksiyalarni chaqirish, tuzilmali chiqish, javob prefiksini davom ettirish, kontekstni keshlash va paketli inferensiyani ham o‘z ichiga oladi. Funksiya chaqiruvlari va veb-qidiruv har bir yetkazib beruvchi konfiguratsiyasida bir xil tarzda ochilmaydi. Ularni modelni o‘rab turgan interfeys imkoniyatlari sifatida ko‘ring: ilova vositalarni taqdim etadi, tanlangan amallarni bajaradi va ularning natijalarini qaytaradi. Keshlash va paketli qayta ishlash ish qanday yuborilishi va qayta ishlatilishiga tegishli, yangi kontent turini anglatmaydi.
Kontekst chegaralari
E’lon qilingan spetsifikatsiyada 32,768 tokenli kontekst oynasi, kirish uchun eng ko‘pi 30,720 token va chiqish uchun eng ko‘pi 8,192 token ko‘rsatilgan. Manba materiali, suhbat va so‘ralgan javobni tegishli chegaralar ichida saqlang. Chiqish chegarasi ixcham javob bilan uzun hujjat orasida tanlash uchun foydali; uni har bir javob shu uzunlikdan foydalanadi degan kafolat deb tushunmaslik kerak.
Hujjat vazifasida asosiy manba bo‘limlarini ixtiyoriy misollardan oldin joylashtiring va yakuniy natija nimalarni o‘z ichiga olishi kerakligini ayting. Masalan, mahsulot tavsifi va mijoz savollarini bering, so‘ng taqdim etilgan shartlarni saqlaydigan, mijoz tilidan foydalanadigan va javobsiz savollarni tasdiqlangan ma’lumotdan ajratadigan javob so‘rang. Natija mijozga yuboriladigan javob hamda ilovaning keyingi bosqichi uchun kichik JSON yozuvi bo‘lishi mumkin.
Dasturlash uchun funksiyaning maqsadi, qabul qilinadigan kirish, kutiladigan chiqish va mosligi saqlanishi kerak bo‘lgan mavjud fragmentni bering. Dasturiy yechimni, qarorlar tushuntirishini hamda oddiy kirish va chegaraviy holatni qamrab oladigan misollarni so‘rang. Bu modelning hujjatlashtirilgan dasturlash va fikrlash yo‘nalishidan foydalanadi, ammo repozitoriy, kompilyator yoki ishlayotgan ilovaga kirish bor deb faraz qilmaydi.
Ijodiy yozish yoki rolli muloqot uchun auditoriya, ohang va tahrirdan keyin ham saqlanishi kerak bo‘lgan faktlarni belgilang. Rol suhbatni tartibga solishi mumkin, model nima deyishi kerakligini esa manba materiali belgilaydi. Noaniq qayta yozishni so‘rash o‘rniga turli o‘quvchilar uchun muqobil kirishlar yoki tushuntirishlar so‘rang; shunda har bir variantning kuzatish mumkin bo‘lgan maqsadi bo‘ladi.
Muhim chegaralar
Qwen-Max — matndan matnga ishlaydigan liniya, vizual yoki nutq yaratadigan nashr emas. Ishlab chiqaruvchi ushbu kartada nozik sozlashni qo‘llab-quvvatlanadigan interfeys imkoniyati sifatida ko‘rsatmaydi. Vositalar bilan ishlash ulangan interfeysga bog‘liq, yangilanib boradigan nom esa doimiy nusxani mahkamlab qo‘ymaydi. Bu farqlar to‘g‘ri nashrni tanlash va haqiqatan kerak bo‘lgan natijaga mos kirishni tayyorlashga yordam beradi.
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions qwen-max-latest
qwen-max-latestBoshlash
Qwen-Max — ko‘p tilli suhbat, mantiqiy fikrlash, dasturlash va kontent yaratish uchun matn modeli. U ko‘rsatmalarga batafsil rioya qilishni JSONga yo‘naltirilgan chiqish va javob uslubini boshqarish bilan birlashtiradi.
- Qabul qilinadigan kirish ma’lumotlari
- Matn
- Natijalar
- Matn
Ailoot da mavjud · kirish ma’lumotlari va usullar
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions
- Kirish
text- Chiqish
text- Chiqish formati
- json yoki SSE
| Maydon | Tur | Talab | Qiymatlar va cheklovlar | Standart |
|---|---|---|---|---|
Maydonmodel | Turstring | TalabMajburiy | Qiymatlar va cheklovlar qwen-max-latest | Standart— |
Maydonmessages | Turmessage[] | TalabMajburiy | Qiymatlar va cheklovlar Elementlarning eng kam soni: 1 | Standart— |
Maydonmessages[].role | Turstring | TalabMajburiy | Qiymatlar va cheklovlar Modelga bogʻliq | Standart— |
Maydonmessages[].content | Turstring | TalabIxtiyoriy | Qiymatlar va cheklovlar Quyidagi holatda qo‘llanadi: Matnli suhbat | Standart— |
Maydonstream | Turboolean | TalabIxtiyoriy | Qiymatlar va cheklovlar | Standartfalse |
Kirish materiallari birikmalari
Matn · UTF8 matni
messages[].content
Usul parametrlari va hayot sikli
| Parametr | Parametr talablari |
|---|---|
Parametrcontent_type | Parametr talablariapplication/json |
Parametrrequired | Parametr talablarimodel, messages |
Parametrmaterial_types | Parametr talablaritext |
Parametrmessages | Parametr talablarirole/content tuzilishidagi xabarlar massivi |
Parametrfile_material | Parametr talablariHaqiqiy UTF-8 hujjati aynan matn sifatida kiritiladi; fayl IDsi faraz qilinmaydi |
Parametroptional_controls | Parametr talablaristream |
Parametrcontrol_scope | Parametr talablariMatnli suhbat; stream mantiqiy qiymat bo‘lib, standart holatda false. |
Parametroutput_modalities | Parametr talablaritext |
Parametrhosted_operations | Parametr talablarifalse |
Parametrmultimodal_input_binding | Parametr talablarinull |
Usul taxalluslari: /chat/completions
Hayot sikli: synchronous_or_streamed
Aniq model IDsini messages bilan yuboring.
Kontekst uzunligi chiqishning yuqori chegarasi emas.
Matn fayli aynan matnni taqdim etishi mumkin; tasvir, audio va fayl obyekti kirishlari aniq bog‘lashni talab qiladi.
Tariflar
Tarif ma’lumotlari so‘rov imkoniyatlarini qo‘shmaydi. Qo‘llab-quvvatlanadigan parametrlar tanlangan usulda ko‘rsatilgan.
- Tezkor rejim
- Ko‘rsatilmagan Tezkor rejim tanlanganda
- Flex rejimi
- Ko‘rsatilmagan flex rejimi tanlanganda
- Maksimal fikrlash darajasi
- Ko‘rsatilmagan Maksimal fikrlash darajasi uchun standart (default) tuzatish qo‘llanganda
Ailoot tariflari
Sozlamalar bo‘yicha narxlar
| Sozlama | Tariflar jadvali | To‘lov |
|---|---|---|
| SozlamaTokenlar uchun bazaviy tariflar | Tariflar jadvaliAsosiy tarif | To‘lov Kirish · Kirish tokenlari $0.000686 / 1K token Chiqish · Chiqish tokenlari $0.002744 / 1K token Kirish · Keshdan o‘qish $0 / 1K token Kirish · Keshga yozish $0 / 1K token Kirish · Keshga yozish, 1 soat — / 1K token |
Ailoot so‘rovdan oldin taxminiy summani band qiladi. Natijadan keyin o‘lchangan sarf asosidagi yakuniy to‘lovni yechadi. Oqimli javob bo‘yicha yakuniy hisob-kitob yakuniy sarf yozuviga asoslanadi. Summani band qilish va to‘lovni hisoblash tartibi →
So‘rov namunalari
Ailoot Ultra · OpenAI Chat
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-max-latest","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="qwen-max-latest", 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"))
Natijalarni olish va saqlash
Ailoot Ultra · OpenAI Chat
json yoki SSE
Barcha tayyor natijalarni saqlash
Qaytarilgan har bir to‘liq javob, fayl va kontent qismini saqlang.
Har bir javob variantini va uning kontenti, vosita chaqiruvlari hamda fikrlash ma’lumotlarini saqlang. SSEda o‘zgarish qismlarini variant va vosita indeksi bo‘yicha yig‘ing, yakuniy tugash sababi va sarf ma’lumotlarini saqlang.
Asl javobni tekshirish kerak bo‘lsa
So‘rov va javob IDlari hamda sarlavhalarini saqlang. Matn vazifasini olish uchun umumiy URL taqdim etilmagan.
Javob maydonlari
| Maydon | Tur |
|---|---|
Maydonchoices[].index | Turinteger |
Maydonchoices[].message.content | Turstring|null |
Maydonchoices[].message.tool_calls | Turtool_call[] |
Maydonchoices[].message.reasoning_content | Turstring |
Maydonchoices[].message.reasoning_details | Turobject|array |
Maydonchoices[].finish_reason | Turstring|null |
Maydonusage | Turobject |
Xatolar va keyingi qadamlar
| Javob | Shart | Keyingi qadam |
|---|---|---|
Javob400 · invalid_request_error | ShartMajburiy maydonlar, material ifodasi yoki parametr qiymati noto‘g‘ri | Keyingi qadamYangi yaratish so‘rovidan oldin ko‘rsatilgan maydonlarni tuzating. |
Taxalluslar
Model taxalluslari
Ailoot Ultra qwen-max-latest
Usul yo‘llari taxalluslari
/chat/completions
Chaqirish uchun tegishli ID lar
Ailoot Ultra · Anthropic Messages POST /v1/messages qwen-max-latest
qwen-max-latestBoshlash
Qwen-Max — ko‘p tilli suhbat, mantiqiy fikrlash, dasturlash va kontent yaratish uchun matn modeli. U ko‘rsatmalarga batafsil rioya qilishni JSONga yo‘naltirilgan chiqish va javob uslubini boshqarish bilan birlashtiradi.
- Qabul qilinadigan kirish ma’lumotlari
- Matn
- Natijalar
- json · sse
Ailoot da mavjud · kirish ma’lumotlari va usullar
Ailoot Ultra · Anthropic Messages POST /v1/messages
- Kirish
text- Chiqish
json,sse- Chiqish formati
- JSON yoki SSE
| Maydon | Tur | Talab | Qiymatlar va cheklovlar | Standart |
|---|---|---|---|---|
Maydonmodel | Turstring | TalabMajburiy | Qiymatlar va cheklovlar qwen-max-latest | Standart— |
Maydonmessages | Turmessage[] | TalabMajburiy | Qiymatlar va cheklovlar | Standart— |
Maydonmessages[].role | Turstring | TalabMajburiy | Qiymatlar va cheklovlar user, assistant | Standart— |
Maydonmessages[].content | Turstring | TalabMajburiy | Qiymatlar va cheklovlar | Standart— |
Maydonmax_tokens | Turinteger | TalabMajburiy | Qiymatlar va cheklovlar | Standart— |
Maydonstream | Turboolean | TalabIxtiyoriy | Qiymatlar va cheklovlar | Standartfalse |
Kirish materiallari birikmalari
Matn · UTF-8 matni
messages[].content satri
Usul parametrlari va hayot sikli
| Parametr | Parametr talablari |
|---|---|
Parametrcontent_type | Parametr talablariapplication/json |
Parametrrequired | Parametr talablarimodel, messages, max_tokens |
Parametroptional_controls | Parametr talablaristream |
Parametrmaterial_types | Parametr talablaritext |
Parametrtext_file_material | Parametr talablariHaqiqiy UTF-8 hujjatini o‘qing va uning matnini ko‘rsatilgan kirish yoki xabar kontenti satriga joylashtiring. |
Hayot sikli: synchronous_or_streamed
Tariflar
Tarif ma’lumotlari so‘rov imkoniyatlarini qo‘shmaydi. Qo‘llab-quvvatlanadigan parametrlar tanlangan usulda ko‘rsatilgan.
- Tezkor rejim
- Ko‘rsatilmagan Tezkor rejim tanlanganda
- Flex rejimi
- Ko‘rsatilmagan flex rejimi tanlanganda
- Maksimal fikrlash darajasi
- Ko‘rsatilmagan Maksimal fikrlash darajasi uchun standart (default) tuzatish qo‘llanganda
Ailoot tariflari
Sozlamalar bo‘yicha narxlar
| Sozlama | Tariflar jadvali | To‘lov |
|---|---|---|
| SozlamaTokenlar uchun bazaviy tariflar | Tariflar jadvaliAsosiy tarif | To‘lov Kirish · Kirish tokenlari $0.000686 / 1K token Chiqish · Chiqish tokenlari $0.002744 / 1K token Kirish · Keshdan o‘qish $0 / 1K token Kirish · Keshga yozish $0 / 1K token Kirish · Keshga yozish, 1 soat — / 1K token |
Ailoot so‘rovdan oldin taxminiy summani band qiladi. Natijadan keyin o‘lchangan sarf asosidagi yakuniy to‘lovni yechadi. Oqimli javob bo‘yicha yakuniy hisob-kitob yakuniy sarf yozuviga asoslanadi. Summani band qilish va to‘lovni hisoblash tartibi →
So‘rov namunalari
Ailoot Ultra · Anthropic Messages
{
"model": "qwen-max-latest",
"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-max-latest', '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-max-latest', '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))
Natijalarni olish va saqlash
Ailoot Ultra · Anthropic Messages
JSON yoki SSE
Barcha tayyor natijalarni saqlash
Qaytarilgan har bir to‘liq javob, fayl va kontent qismini saqlang.
Barcha kontent bloklari, fikrlash imzolari va haqiqiy vosita ishlatish IDlarini saqlang. SSE bloklarining barcha o‘zgarish qismlarini yig‘ing; birinchi matn bloki to‘liq chiqish emas.
Asl javobni tekshirish kerak bo‘lsa
So‘rov va javob IDlari hamda sarlavhalarini saqlang. Matn vazifasini olish uchun umumiy URL taqdim etilmagan.
Javob maydonlari
| Maydon | Tur |
|---|---|
Maydonid | Turstring |
Maydonmodel | Turstring |
Maydoncontent[] | Turtext|thinking|tool_use|other content block |
Maydonstop_reason | Turstring|null |
Maydonusage | Turobject |
Xatolar va keyingi qadamlar
| Javob | Shart | Keyingi qadam |
|---|---|---|
Javob400 · invalid_request_error | ShartMajburiy maydonlar, material ifodasi yoki parametr qiymati noto‘g‘ri | Keyingi qadamYangi yaratish so‘rovidan oldin ko‘rsatilgan maydonlarni tuzating. |
Taxalluslar
Model taxalluslari
Ailoot Ultra qwen-max-latest
Usul yo‘llari taxalluslari
/chat/completions
Chaqirish uchun tegishli ID lar
FAQ · qwen-max
- Qanday kirish ma’lumotlari va natijalar mavjud?
POST /v1/chat/completions·qwen-max-latest:text→textPOST /v1/messages·qwen-max-latest:text→json,sse- So‘rov qaysi maydonlardan foydalanadi?
POST /v1/chat/completions·qwen-max-latest:model,messages,streamPOST /v1/messages·qwen-max-latest:model,messages,max_tokens,stream- Qanday cheklovlar amal qiladi?
POST /v1/chat/completions·qwen-max-latest:messages.min_items:1