mai-ds-r1
MAI-DS-R1 הוא מודל DeepSeek-R1 שעבר אימון המשך בידי Microsoft להסקה בטקסט, למתמטיקה, לקוד ולמחקר. הוא שומר על בסיס ההסקה של R1 תוך טיפול בפערי מענה ושיפור אופן הטיפול של המודל בנושאים רגישים.
- Ailoot Ultra · OpenAI Chat
POST /v1/chat/completionsMAI-DS-R1 - Ailoot Ultra · Anthropic Messages
POST /v1/messagesMAI-DS-R1
על המודל
התיאור הזה מציג את יכולות המודל. הקלט, הפלט והאפשרויות הזמינים ב-Ailoot מפורטים בהמשך לפי השיטה שנבחרה.
MAI-DS-R1 הוא מודל הסקה שצוות Microsoft AI אימן באימון המשך מ־DeepSeek-R1. מטרתו לשמר את חוזקות ההסקה של מודל הבסיס, תוך שיפור המענה בנושאים שקיבלו בעבר סירובים לא מועילים ועידון פרופיל הסיכון של המודל. Microsoft מתארת את המהדורה כמודל שלה שעבר אימון המשך, עם בסיס DeepSeek-R1 בעל 671 מיליארד פרמטרים וארכיטקטורת תערובת מומחים. זהו מודל ליצירת טקסט, ולא אחד ממודלי R1 המזוקקים הקטנים יותר.
כרטיס המודל מציג הבנת שפה ויצירתה, שאלות ידע כללי, פתרון בעיות רב־שלבי, יצירת קוד והבנתו ומשימות מדעיות או אקדמיות כשימושים ישירים. לכן בקשה שימושית יכולה להתחיל בתנאי מתמטי, בחידה לוגית, בקטע קוד או בהסבר טכני שיש לבחון. התוצאה היא טקסט: פתרון מוצע, קטע קוד, הסבר או טיוטה קוהרנטית. יש לציין בבקשה את אופי התוצאה כדי שההסקה תשרת מטרה מוגדרת.
לעוזר מתמטיקה, ספקו את התנאי המלא, ההגדרות, הכמויות הידועות והמסקנה שיש לבסס. משימה לדוגמה: ״בדוק את הפתרון המוצע הזה. זהה את המעבר הראשון ללא תמיכה, הסבר את ההנחה החסרה ותן תוצאה מתוקנת העומדת בתנאים המקוריים.״ לעוזר תכנות, ספקו את הפונקציה הרלוונטית, דוגמאות קלט והתנהגות צפויה; בקשו הסבר לפגם ושינוי שאפשר לבדוק באמצעות דוגמאות אלה. לכתיבת טיוטת מחקר, תנו את החומר להשוואה והבחינו בין אמירות מקור, פרשנויות ושאלות שעדיין זקוקות לראיות.
Microsoft מציגה את המודל גם כבסיס לכוונון עדין נוסף לתחומים מסוימים, לרבות הוראת מתמטיקה, עוזרי תכנות וכלי מחקר מדעי. זהו שימוש להתאמה בהמשך, הנפרד מהמודל הכללי המתואר כאן. אימון ההמשך משתמש בדוגמאות בטיחות ואי־ציות יחד עם דוגמאות רב־לשוניות המכסות נושאים שבהם דווחו הטיות. השינוי מכוון להתנהגות המענה; הוא אינו הופך את המודל למערכת ללא מגבלות ואינו מסיר את הצורך להעריך את תשובותיו.
היצרן מזהה מגבלות שימוש משמעותיות. אבחון קליני או החלטות טיפול, הכרעות משפטיות סופיות, שליטה אוטונומית במערכות קריטיות לבטיחות והחלטות פיננסיות או ביטחוניות בעלות השלכות כבדות נמצאים מחוץ לשימוש האמין המיועד בכרטיס המודל. נכון יותר למסגר את התפקיד המתועד כהסבר, כתיבת טיוטות ופתרון בעיות מובנה עם בדיקה מתאימה. Microsoft מציינת שהזיות עובדתיות, הטיות תרבותיות או דמוגרפיות ופגיעות להנחיות עוינות עשויות להישאר לאחר אימון ההמשך.
המהדורה חולקת את מועד חיתוך הידע של DeepSeek-R1 המקורי, ולכן גם תשובה בטוחה עשויה להחמיץ אירוע עדכני או עובדה מקצועית. אף שאימון ההמשך משתמש בנתונים רב־לשוניים, Microsoft מצפה שאנגלית וסינית יהיו השפות החזקות ביותר. העריכו את השפה ואת תחום התוכן הדרושים ליישום במקום להניח איכות שווה בכל שפה. הנחיות ארוכות או מסובכות מאוד עשויות להישאר מאתגרות; הפרידו בין חומר המקור, המשימה והקריטריון לתשובה מוצלחת.
כרטיס המודל ממליץ על הוראות תפקיד ומשימה ברורות, על אימות אנושי או אוטומטי לשימושים רגישים ועל ניטור או סינון תוכן כשהיישום זקוק להם. שמרו את עובדות המקור ואת הנחות הביניים זמינות לבדיקה ובקשו תשובה סופית שאפשר להשוות לבעיה המקורית. הכרטיס שנקרא אינו מפרסם תקרת הקשר או פלט מספרית נפרדת למהדורה זו, ולכן יש לברר מגבלות אלה ממפרט ביצוע מדויק במקום לשאול אותן ממהדורת DeepSeek אחרת. MAI-DS-R1 נשאר מודל נפרד שעבר אימון המשך עם מטרות ומגבלות מתועדות משלו.
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions MAI-DS-R1
MAI-DS-R1התחלה
MAI-DS-R1 הוא מודל DeepSeek-R1 שעבר אימון המשך בידי Microsoft להסקה בטקסט, למתמטיקה, לקוד ולמחקר. הוא שומר על בסיס ההסקה של R1 תוך טיפול בפערי מענה ושיפור אופן הטיפול של המודל בנושאים רגישים.
- סוגי קלט נתמכים
- טקסט
- תוצאות
- טקסט
זמין ב-Ailoot · קלט ושיטות
Ailoot Ultra · OpenAI Chat POST /v1/chat/completions
- סוגי קלט
text- סוגי פלט
text- פורמט פלט
- json או SSE
| שדה | סוג | דרישה | ערכים ומגבלות | ברירת מחדל |
|---|---|---|---|---|
שדהmodel | סוגstring | דרישהחובה | ערכים ומגבלות MAI-DS-R1 | ברירת מחדל— |
שדה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
- תעריף רגיל כאשר נבחר מצב flex
- מאמץ חשיבה מרבי
- תעריף רגיל כאשר מאמץ החשיבה המרבי משתמש בהתאמת ברירת המחדל (default)
תעריפי Ailoot
מחירים לפי תצורה
התאימו כל חיוב לתנאים המוצגים. השתמשו בתעריף אחד לכל קבוצה של תצורות חלופיות.
| תצורה | טבלת תעריפים | טוקנים בהקשר, יותר מ- | טוקנים בהקשר, עד וכולל | חיוב |
|---|---|---|---|---|
| תצורהתעריפי הבסיס לטוקנים | טבלת תעריפיםתעריף בסיס | טוקנים בהקשר, יותר מ-— | טוקנים בהקשר, עד וכוללללא גבול עליון | חיוב קלט · טוקני קלט $0.00132 / 1K טוקנים פלט · טוקני פלט $0.00506 / 1K טוקנים קלט · קריאה מהמטמון — / 1K טוקנים קלט · כתיבה למטמון — / 1K טוקנים קלט · כתיבה למטמון, 1 שעה — / 1K טוקנים |
| תצורהרמת אורך בקשה 1 | טבלת תעריפים— | טוקנים בהקשר, יותר מ-0 | טוקנים בהקשר, עד וכוללללא גבול עליון | חיוב קלט · טוקני קלט $0.00132 / 1K טוקנים פלט · טוקני פלט $0.00506 / 1K טוקנים קלט · קריאה מהמטמון — / 1K טוקנים קלט · כתיבה למטמון — / 1K טוקנים קלט · כתיבה למטמון, 1 שעה — / 1K טוקנים |
לפני הבקשה Ailoot משריינת סכום משוער. לאחר קבלת התוצאה היא מסדירה את החיוב הסופי לפי השימוש המדוד. הסדרת חיוב בהזרמה משתמשת ברשומת השימוש הסופית. איך פועלים שריון הסכום והסדרת החיוב →
דוגמאות לבקשות
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":"MAI-DS-R1","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="MAI-DS-R1", 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 Chat
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 Ultra MAI-DS-R1
כינויים לנתיבי שיטות
/chat/completions
מזהי מודלים קשורים IDs
Ailoot Ultra · Anthropic Messages POST /v1/messages MAI-DS-R1
MAI-DS-R1התחלה
MAI-DS-R1 הוא מודל DeepSeek-R1 שעבר אימון המשך בידי Microsoft להסקה בטקסט, למתמטיקה, לקוד ולמחקר. הוא שומר על בסיס ההסקה של R1 תוך טיפול בפערי מענה ושיפור אופן הטיפול של המודל בנושאים רגישים.
- סוגי קלט נתמכים
- טקסט
- תוצאות
- json · sse
זמין ב-Ailoot · קלט ושיטות
Ailoot Ultra · Anthropic Messages POST /v1/messages
- סוגי קלט
text- סוגי פלט
json,sse- פורמט פלט
- JSON או SSE
| שדה | סוג | דרישה | ערכים ומגבלות | ברירת מחדל |
|---|---|---|---|---|
שדהmodel | סוגstring | דרישהחובה | ערכים ומגבלות MAI-DS-R1 | ברירת מחדל— |
שדה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
- תעריף רגיל כאשר נבחר מצב flex
- מאמץ חשיבה מרבי
- תעריף רגיל כאשר מאמץ החשיבה המרבי משתמש בהתאמת ברירת המחדל (default)
תעריפי Ailoot
מחירים לפי תצורה
התאימו כל חיוב לתנאים המוצגים. השתמשו בתעריף אחד לכל קבוצה של תצורות חלופיות.
| תצורה | טבלת תעריפים | טוקנים בהקשר, יותר מ- | טוקנים בהקשר, עד וכולל | חיוב |
|---|---|---|---|---|
| תצורהתעריפי הבסיס לטוקנים | טבלת תעריפיםתעריף בסיס | טוקנים בהקשר, יותר מ-— | טוקנים בהקשר, עד וכוללללא גבול עליון | חיוב קלט · טוקני קלט $0.00132 / 1K טוקנים פלט · טוקני פלט $0.00506 / 1K טוקנים קלט · קריאה מהמטמון — / 1K טוקנים קלט · כתיבה למטמון — / 1K טוקנים קלט · כתיבה למטמון, 1 שעה — / 1K טוקנים |
| תצורהרמת אורך בקשה 1 | טבלת תעריפים— | טוקנים בהקשר, יותר מ-0 | טוקנים בהקשר, עד וכוללללא גבול עליון | חיוב קלט · טוקני קלט $0.00132 / 1K טוקנים פלט · טוקני פלט $0.00506 / 1K טוקנים קלט · קריאה מהמטמון — / 1K טוקנים קלט · כתיבה למטמון — / 1K טוקנים קלט · כתיבה למטמון, 1 שעה — / 1K טוקנים |
לפני הבקשה Ailoot משריינת סכום משוער. לאחר קבלת התוצאה היא מסדירה את החיוב הסופי לפי השימוש המדוד. הסדרת חיוב בהזרמה משתמשת ברשומת השימוש הסופית. איך פועלים שריון הסכום והסדרת החיוב →
דוגמאות לבקשות
Ailoot Ultra · Anthropic Messages
{
"model": "MAI-DS-R1",
"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': 'MAI-DS-R1', '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': 'MAI-DS-R1', '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 Messages
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 Ultra MAI-DS-R1
כינויים לנתיבי שיטות
/chat/completions
מזהי מודלים קשורים IDs
FAQ · mai-ds-r1
- אילו קלטים ותוצאות זמינים?
POST /v1/chat/completions·MAI-DS-R1:text→textPOST /v1/messages·MAI-DS-R1:text→json,sse- באילו שדות הבקשה משתמשת?
POST /v1/chat/completions·MAI-DS-R1:model,messages,streamPOST /v1/messages·MAI-DS-R1:model,messages,max_tokens,stream- אילו מגבלות חלות?
POST /v1/chat/completions·MAI-DS-R1:messages.min_items:1