# השלמות צ׳אט

> POST /v1/chat/completions בפורמט של OpenAI, עם סטרימינג, כלים, תמונות וחשיבה.


הבקשה והתשובה של Chat Completions של OpenAI, על מודלים של NotHoly. מספיק לכוון SDK של OpenAI לכתובת הבסיס, בלי לשנות שום דבר אחר.

```endpoint
POST https://api.notholy.com/v1/chat/completions
```

## בקשה

| שדה | סוג | חובה | הערות |
|---|---|---|---|
| `model` | string | כן | מזהה מודל, למשל `notholy-specter`. פרטים ב[מודלים](/he/getting-started/models) |
| `messages` | array | כן | התפקידים `system`, `developer` (מטופל כמו `system`), `user`, `assistant` או `tool`. התוכן הוא מחרוזת או רשימת חלקים מסוג `text` או `image_url` |
| `max_completion_tokens` / `max_tokens` | number | לא | מגבלת הפלט. אם שניהם מוגדרים, `max_completion_tokens` קובע. ברירת המחדל היא הפלט המקסימלי של המודל, וערך גדול יותר מחזיר `400` |
| `stream` | boolean | לא | הערך `true` מחזיר server-sent events. פרטים ב[סטרימינג](/he/guides/streaming) |
| `tools` | array | לא | כלי פונקציה בלבד. סוגי כלים אחרים מחזירים `400 unsupported_parameter` |
| `tool_choice` | string או object | לא | מועבר למודל כשהשדה `tools` מוגדר |
| `reasoning_effort` | string | לא | אחד מערכי `reasoning_efforts` של המודל. כל ערך אחר מחזיר `400`. פרטים ב[חשיבה](/he/guides/reasoning) |
| `response_format` | object | לא | מועבר למודל |
| `temperature`, `top_p`, `stop` | number, number, string או array | לא | מועברים למודל |
| `n` | number | לא | רק `1` |

שדות לא מוכרים לא נלקחים בחשבון. תמונות מתקבלות במודלים שהשדה `input_modalities` שלהם כולל `image`. בשאר המודלים הן מחזירות `400 unsupported_parameter`.

## תשובה בלי סטרימינג

```json
{
  "id": "chatcmpl-8Kp2c1Vx",
  "object": "chat.completion",
  "created": 1793836800,
  "model": "notholy-specter",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "An IDOR lets a user read or change another user's object by changing its ID…",
        "refusal": null,
        "reasoning_content": "…"
      },
      "finish_reason": "stop",
      "logprobs": null
    }
  ],
  "usage": {
    "prompt_tokens": 42,
    "completion_tokens": 118,
    "total_tokens": 160,
    "prompt_tokens_details": { "cached_tokens": 0 },
    "completion_tokens_details": { "reasoning_tokens": 64 }
  }
}
```

- השדה `reasoning_content` מופיע רק כשהמודל הפעיל חשיבה.
- כשיש קריאות לכלים, השדה `message.tool_calls` מכיל פריטים מהצורה `{id, type: "function", function: {name, arguments}}`, הערך של `finish_reason` הוא `tool_calls`, והשדה `content` הוא `null` כשאין טקסט.
- הערך של `finish_reason` הוא `stop`, `length`, `tool_calls` או `content_filter`.
- בסטרימינג, ה-chunk האחרון לפני `data: [DONE]` תמיד כולל `usage`, גם בלי לשלוח את `stream_options.include_usage`.

## דוגמה

```bash test
curl https://api.notholy.com/v1/chat/completions \
  -H "Authorization: Bearer $NOTHOLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "notholy-specter",
    "messages": [
      {"role": "system", "content": "You are reviewing code for an authorized assessment."},
      {"role": "user", "content": "What does a missing ownership check in GET /api/invoices/:id lead to?"}
    ]
  }'
```

```python test
import os
from openai import OpenAI

client = OpenAI(base_url="https://api.notholy.com/v1", api_key=os.environ["NOTHOLY_API_KEY"])

r = client.chat.completions.create(
    model="notholy-specter",
    messages=[{"role": "user", "content": "List three checks for an SSRF fix."}],
    max_tokens=400,
)
print(r.choices[0].message.content)
print(r.usage.prompt_tokens, r.usage.completion_tokens)
```

```js test
import OpenAI from 'openai';

const client = new OpenAI({ baseURL: 'https://api.notholy.com/v1', apiKey: process.env.NOTHOLY_API_KEY });

const r = await client.chat.completions.create({
  model: 'notholy-specter',
  messages: [{ role: 'user', content: 'List three checks for an SSRF fix.' }],
  max_tokens: 400,
});
console.log(r.choices[0].message.content);
```

## כותרות התשובה

| כותרת | משמעות |
|---|---|
| `x-request-id` | יש לצרף אותו לפנייה לתמיכה על בעיה |
| `x-notholy-concurrency-limit` | מספר הבקשות שאפשר להריץ במקביל |
| `x-notholy-concurrency-remaining` | מקומות פנויים בזמן שהבקשה הזו התחילה |
| `x-notholy-credits-remaining` | הקרדיטים הזמינים בדולרים בזמן שהבקשה הזו התחילה |

## שגיאות

`400` גוף או פרמטר לא תקינים · `401` מפתח חסר או לא תקין · `402` אין מספיק קרדיטים או תקציב מפתח · `403` המפתח לא מורשה להשתמש במודל הזה · `404` מודל לא מוכר · `429` מגבלת קצב או מקביליות (יש לכבד את `retry-after`) · `502`/`504` המודל נכשל או חרג מזמן ההמתנה · `503` המודל לא זמין. הטבלה המלאה: [שגיאות](/he/guides/errors).
