Geliştiriciler
REST API
Bir Harmona asistanını kendi backend'inizden çağırın: asistan API anahtarı oluşturun, yanıtları server-sent events ile akışla alın, geçmişi ve hataları yönetin.
Her asistan HTTPS üzerinden yanıt verebilir. Bir API anahtarı tek bir asistana aittir; bu yüzden isteklerde asistanın adı geçmez. Kendi son kullanıcılarınızı kendi kimliklerinizle tanımlarsınız ve her birinin çağrılar arasında korunan bir konuşması olur. API erişimi Individual, Business ve Enterprise planlarına dahildir.
API erişimini açın ve anahtar oluşturun
- 1Asistanı Stüdyo → Asistanlar altında açın ve Çıktı Kanalları bölümünü açın.
- 2API Erişimi anahtarını açın.
- 3API Anahtarları altında Anahtar Oluştur seçeneğini seçin ve anahtara bir ad verin, örneğin "Production".
- 4Anahtarı kopyalayın. Anahtar hapi_ ile başlar ve yalnızca bir kez gösterilir.
Anahtarları yalnızca organizasyon yöneticileri oluşturabilir. Uygulamada oluşturulan anahtarların süresi dolmaz. Her ortam ya da uygulama için ayrı bir anahtar kullanın; böylece birini diğerlerine dokunmadan iptal edebilirsiniz.
Dikkat
Kimlik doğrulama ve temel URL
Anahtarı her istekte bearer token olarak gönderin. Harmona Cloud'da temel URL https://api.harmona.ai adresidir; özel bulut ya da kurum içi kurulumlarda kendi dağıtımınızın API adresini kullanın. Tüm uç noktalar /b2c/v1 altındadır.
Authorization: Bearer hapi_your_keyTehlike
Uç noktalar
POST/b2c/v1/chat
Bir tur gönderir ve asistanın yanıtını akışla döndürür.
GET/b2c/v1/chat/rooms
Bir son kullanıcının konuşmalarını en yeniden başlayarak listeler.
GET/b2c/v1/chat/messages
Bir konuşmanın geçmişini döndürür.
GET/b2c/v1/chat/handoff
Bir konuşmayı bir kişiye devretmek için düz metin olarak döndürür.
GET/b2c/v1/widget-config
Harmona'da yapılandırılan Web SDK ayarlarını döndürür.
Mesaj gönderin
| Alan | Zorunlu | Açıklama |
|---|---|---|
| external_user_id | Evet | Son kullanıcı için sizin kimliğiniz, en fazla 255 karakter. Aynı değer her zaman aynı kullanıcının konuşmalarına döner. |
| messages | Evet | Tur; role (user ya da assistant) ve content alanlarını içeren nesnelerden oluşan bir liste. Son mesaj kullanıcıdan gelmelidir. Daha önce gösterdiğiniz bir karşılama mesajını, assistant mesajı olarak bunun önüne koyabilirsiniz. |
| room_id | Hayır | Belirli bir konuşmayı sürdürür. Verilmezse kullanıcının en son etkin konuşması sürer; ilk çağrı bu konuşmayı oluşturur. |
| room_name | Hayır | Konuşma oluşturulurken ona verilecek ad. |
curl -N https://api.harmona.ai/b2c/v1/chat \
-H "Authorization: Bearer hapi_your_key" \
-H "Content-Type: application/json" \
-d '{
"external_user_id": "customer-4821",
"messages": [{ "role": "user", "content": "Where is my order?" }]
}'Akışı okuma
Yanıt bir text/event-stream akışıdır. Her çerçeve, data: ile başlayıp JSON ile devam eden bir satırdır ve akış data: [DONE] ile biter. Çerçeveler asistan çalıştırma olaylarıdır. Göstereceğiniz yanıt, on_chain_stream adlı olaylarda, data.chunk içinde gelir:
- type: printable, yanıt metnini content içinde taşır. is_thinking değeri true olan parçaları atlayın.
- type: tool, yapılandırılmış bir sonucu artifact içinde, artifact.type ve artifact.data ile taşır; örneğin ürün kartları ya da önerilen sonraki sorular.
- Diğer tüm olayları yok sayabilirsiniz.
Bir yanıt, her olay kısaltılmış hâliyle şöyle görünür:
data: {"event": "on_chain_stream", "data": {"chunk": {"type": "printable", "content": "Your order left "}}, ...}
data: {"event": "on_chain_stream", "data": {"chunk": {"type": "printable", "content": "our warehouse today."}}, ...}
data: [DONE]Asistan yanıtın ortasında hata verirse akış önce printable metin olarak kısa bir özür gönderir, ardından data.error ve data.error_code içeren bir error olayı, sonra da [DONE] gelir. Model sağlayıcısı yoğunsa kod rate_limit_exceeded olur (kısa süre sonra yeniden deneyin), aksi hâlde internal_error olur.
Node.js 18 ve sonrası için en küçük bir okuyucu:
const res = await fetch("https://api.harmona.ai/b2c/v1/chat", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HARMONA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
external_user_id: "customer-4821",
messages: [{ role: "user", content: "Where is my order?" }],
}),
});
if (!res.ok) throw new Error(`Harmona ${res.status}: ${await res.text()}`);
const decoder = new TextDecoder();
let buffer = "";
for await (const bytes of res.body) {
buffer += decoder.decode(bytes, { stream: true });
const frames = buffer.split("\n\n");
buffer = frames.pop();
for (const frame of frames) {
const payload = frame.replace(/^data: /, "");
if (payload === "[DONE]") continue;
const evt = JSON.parse(payload);
const chunk = evt.data?.chunk;
if (evt.event === "on_chain_stream" && chunk?.type === "printable" && !chunk.is_thinking) {
process.stdout.write(chunk.content);
}
if (evt.event === "error") console.error(evt.data.error_code);
}
}Konuşmalar ve geçmiş
- GET /chat/rooms?external_user_id=… her konuşmanın room_id, room_name, created_at ve updated_at değerlerini döndürür.
- GET /chat/messages?external_user_id=… geçmişi döndürür. Belirli bir konuşma için room_id, sayfalama için limit (1–200, varsayılan 50) ve offset ekleyin.
- GET /chat/handoff?external_user_id=… agent_name ve messages döndürür; messages, role (human ya da ai) ve content alanlarından oluşan düz bir listedir. Araç adımları dahil edilmez; bu yüzden listeyi doğrudan bir destek temsilcisine iletebilirsiniz.
Hatalar
Hata yanıtları, detail mesajı içeren JSON'dır. Çoğu bir error_code da taşır. Mesaja göre değil, koda göre dallanın: mesaj İngilizcedir ve değişebilir.
{
"detail": "…",
"error_code": "usage_limit_exceeded"
}| Durum | error_code | Anlamı |
|---|---|---|
| 400 | validation_error | Gövde geçersiz; örneğin son mesaj kullanıcıdan gelmiyor. |
| 401 | yok | Anahtar eksik, yanlış, süresi dolmuş ya da silinmiş veya asistanın API erişimi kapalı. |
| 402 | usage_limit_exceeded | Çalışma alanı kredilerini bitirdi ya da kullanım eşiğine ulaştı. |
| 402 | subscription_past_due | Bir kart ödemesi başarısız oldu ve hâlâ açık. 1., 3. ve 7. günlerde otomatik olarak yeniden denenir. |
| 402 | subscription_inactive | Abonelik askıya alındı ya da iptal edildi. |
| 402 | trial_expired | Çalışma alanının ücretsiz denemesi sona erdi. |
| 404 | room_not_found | room_id mevcut değil ya da başka bir asistana ait. |
| 409 | yok | Asistan şu anda sohbet edemiyor. Modelini ve talimatlarını kontrol edin. |
| 503 | yok | Geçici bir sorun. Yeniden deneyin. |
402 hatalarını ele alma
Güncellendi 2026-09-24
