Messages

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

دانا رابط Anthropic را روی بک‌اند OpenAI-compatible خودش سرو می‌کند. یعنی کدی که با anthropic SDK نوشته‌اید، فقط با عوض کردن base_url و کلید کار می‌کند.

مدل این رابط امروز homa است. کاربرد هما و محدودیت‌هایش در هما آمده است.

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 برعکس است و /v1 می‌خواهد.

نمونه کامل

curl https://api.dana.expert/v1/messages \
  -H "Authorization: Bearer $DANA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "homa",
    "max_tokens": 256,
    "system": "دستیار فارسی‌زبان هستید.",
    "messages": [{"role": "user", "content": "سلام دانا!"}]
  }'
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="homa",
    max_tokens=256,
    system="دستیار فارسی‌زبان هستید.",
    messages=[{"role": "user", "content": "سلام دانا!"}],
)
print(message.content[0].text)
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: "homa",
  max_tokens: 256,
  system: "دستیار فارسی‌زبان هستید.",
  messages: [{ role: "user", content: "سلام دانا!" }],
});
console.log(message.content[0].text);

پارامترها

پارامترنوعاجباریتوضیح
modelstringبلهشناسهٔ مدل: homa
messagesarrayبلهآرایه پیام‌های مکالمه
max_tokensintegerبلهسقف توکن خروجی
systemstring یا arrayخیرپیام system
streambooleanخیرپاسخ به شکل SSE؛ پیش‌فرض false
temperaturenumberخیرتنوع خروجی
top_pnumberخیرnucleus sampling
stop_sequencesarrayخیرتوالی‌هایی که تولید را متوقف می‌کنند
toolsarrayخیرتعریف ابزارها با input_schema
tool_choiceobjectخیرauto یا any یا یک ابزار مشخص

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

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

ساختار پاسخ

{
  "id": "msg_abc123",
  "type": "message",
  "role": "assistant",
  "model": "homa",
  "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 این کار را خودش می‌کند.

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

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

پاسخ:

{"input_tokens": 18}

این عدد فقط ورودی را می‌شمارد و یک برآورد است. شرح کاملش در قیمت و توکن آمده است.

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