---
title: Messages
description: رابط سازگار با Anthropic دانا برای ارسال پیام، tool calling و شمارش توکن
---

دانا رابط Anthropic را روی موتور OpenAI-compatible خودش سرو می‌کند. یعنی anthropic SDK و ابزارهایی مثل Claude Code بدون تغییر کد کار می‌کنند.

```
POST https://api.dana.expert/v1/messages
POST https://api.dana.expert/v1/messages/count_tokens
```

مهم‌ترین نکته تنظیمات: مقدار `base_url` را روی `https://api.dana.expert` بگذارید، **بدون** `/v1`. خود SDK مسیر `/v1/messages` را اضافه می‌کند. رابط [Chat Completions](/docs/chat-completions) برعکس است و `/v1` می‌خواهد.

## نمونه کامل

**curl:**

```bash
curl https://api.dana.expert/v1/messages \
  -H "Authorization: Bearer $DANA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "dana-1-fast",
    "max_tokens": 256,
    "system": "دستیار فارسی‌زبان هستید.",
    "messages": [{"role": "user", "content": "سلام دانا!"}]
  }'
```

**Python (anthropic SDK):**

```python
import os

import anthropic

client = anthropic.Anthropic(
    api_key=os.environ["DANA_API_KEY"],
    base_url="https://api.dana.expert",
)

message = client.messages.create(
    model="dana-1-fast",
    max_tokens=256,
    system="دستیار فارسی‌زبان هستید.",
    messages=[{"role": "user", "content": "سلام دانا!"}],
)
print(message.content[0].text)
```

**Node.js (anthropic SDK):**

```js
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({
  apiKey: process.env.DANA_API_KEY,
  baseURL: "https://api.dana.expert",
});

const message = await client.messages.create({
  model: "dana-1-fast",
  max_tokens: 256,
  system: "دستیار فارسی‌زبان هستید.",
  messages: [{ role: "user", content: "سلام دانا!" }],
});
console.log(message.content[0].text);
```

## پارامترها

| پارامتر | نوع | اجباری | توضیح |
|---|---|---|---|
| `model` | string | بله | شناسه مدل، مثل `dana-1` یا `dana-1-fast` |
| `messages` | array | بله | آرایه پیام‌های مکالمه |
| `max_tokens` | integer | بله | سقف توکن خروجی |
| `system` | string یا array | خیر | پیام system |
| `stream` | boolean | خیر | پاسخ به شکل SSE؛ پیش‌فرض `false` |
| `temperature` | number | خیر | تنوع خروجی |
| `top_p` | number | خیر | nucleus sampling |
| `stop_sequences` | array | خیر | توالی‌هایی که تولید را متوقف می‌کنند |
| `tools` | array | خیر | تعریف ابزارها با `input_schema` |
| `tool_choice` | object | خیر | `auto` یا `any` یا یک ابزار مشخص |

برخلاف رابط OpenAI، اینجا `max_tokens` اجباری است. همین یک قلم، رایج‌ترین علت `400` روی این مسیر است.

از میان پارامترهای نمونه‌برداری، فقط `temperature` و `top_p` به موتور می‌رسند. مقدار `top_k` پذیرفته می‌شود ولی اثری ندارد، چون معادلی در سمت موتور برایش وجود ندارد.

## ساختار پاسخ

```json
{
  "id": "msg_abc123",
  "type": "message",
  "role": "assistant",
  "model": "dana-1-fast",
  "content": [{"type": "text", "text": "سلام! چطور می‌توانم کمکتان کنم؟"}],
  "stop_reason": "end_turn",
  "usage": {"input_tokens": 18, "output_tokens": 14}
}
```

فیلد `content` همیشه آرایه است، حتی برای یک پاسخ متنی ساده.

## Streaming

با `"stream": true` جریان رویدادهای Anthropic را می‌گیرید، به همان ترتیب همیشگی:

| رویداد | چه وقت |
|---|---|
| `message_start` | آغاز پاسخ، همراه با شناسه و توکن ورودی |
| `content_block_delta` | هر تکه متن یا هر تکه از آرگومان‌های ابزار |
| `message_delta` | پایان تولید، همراه با `stop_reason` و توکن خروجی |
| `message_stop` | بسته شدن جریان |

روی tool calling، آرگومان‌های ابزار به شکل `input_json_delta` تکه‌تکه می‌آیند و باید کنار هم چسبانده شوند. anthropic SDK این کار را خودش می‌کند.

## شمارش توکن پیش از ارسال

```bash
curl https://api.dana.expert/v1/messages/count_tokens \
  -H "Authorization: Bearer $DANA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "dana-1",
    "system": "دستیار فارسی‌زبان هستید.",
    "messages": [{"role": "user", "content": "سلام دانا!"}]
  }'
```

پاسخ:

```json
{"input_tokens": 18}
```

این عدد فقط ورودی را می‌شمارد و یک برآورد است. شرح کاملش در [قیمت و توکن](/docs/pricing-and-tokens) آمده است.

## صفحه‌های مرتبط

- [شروع سریع](/docs/quickstart) - نخستین درخواست موفق
- [احراز هویت](/docs/authentication) - هدر `x-api-key` هم پذیرفته می‌شود
- [خطاها](/docs/errors) - پاکت خطای Anthropic و همه کدها
- [محدودیت‌ها](/docs/rate-limits) - سقف نرخ درخواست
