Task API
Buka di CMSTask API memungkinkan sistem Anda sendiri menjalankan agent sebagai pelaksana satu tugas. Server Anda mengirim satu input lewat REST dengan API key, agent mengerjakan tugasnya, dan hasil lengkapnya kembali di response HTTP. Tidak ada streaming, tidak ada percakapan, dan tidak ada tindak lanjut: setiap panggilan adalah tugas baru yang berdiri sendiri.
Gunakan API ini jika sebuah sistem membutuhkan penilaian, knowledge, dan tool agent Anda untuk satu pekerjaan dalam satu waktu, misalnya:
- Mengklasifikasikan tiket atau email. Helpdesk Anda mengirim setiap tiket baru dan menerima kategori, prioritas, dan ringkasan dalam bentuk JSON yang bisa langsung disimpan.
- Mengambil data dari dokumen. Back office Anda mengirim invoice atau laporan sebagai lampiran dan menerima field yang dibutuhkan.
- Menulis draf. CRM Anda mengirim data pelanggan dan menerima email tindak lanjut dalam Markdown, ditulis dengan pengetahuan agent tentang produk Anda.
Agent bekerja dengan instruksi utama, knowledge, dan tool miliknya, jadi apa yang Anda atur untuk chat juga dipakai di sini. Selain itu, Task API punya pengaturannya sendiri: instruksi tugas yang ditambahkan ke setiap panggilan, dan format hasil yang harus dipenuhi (Markdown, teks biasa, JSON, atau JSON yang sesuai dengan schema Anda).
Dalam contoh Mengajari Agent Anda, Atlas menyimpan SOP Kirana Group. Tim fasilitas Kirana mencatat tiket perawatan di sistemnya sendiri. Setiap tiket baru dikirim ke Task API milik Atlas, yang mengembalikan kategori, prioritas, dan ringkasan satu kalimat berdasarkan SOP perawatan Kirana, sehingga tiket langsung sampai ke tim yang tepat.
Sebelum memulai
- Hanya untuk service agent. Task API tersedia untuk service agent. Personal agent tidak bisa menyalakannya. Lihat Personal Agent vs Service Agent jika Anda belum yakin jenis agent Anda.
- Siapa yang bisa menyalakannya. Contributor agent serta Owner dan Admin organisasi.
- Mati secara default. Setiap agent dimulai dengan API ini dalam keadaan mati. Tidak ada yang bisa memanggilnya sampai seseorang menyalakannya dan membuat key.
- Panggil dari server. Key memberi akses penuh untuk menjalankan tugas di agent. Simpan di back-end Anda dan jangan pernah memanggil API dari halaman browser atau aplikasi mobile.
Cara agent bekerja dalam sebuah tugas
Dalam sebuah tugas, agent bekerja dalam mode tugas:
- Agent mengerjakan tugas dalam satu kali jalan dan hanya mengembalikan hasilnya.
- Agent tidak menyapa, tidak mengajukan pertanyaan lanjutan, dan tidak menawarkan bantuan lain.
- Agent tidak menampilkan widget interaktif atau canvas.
- Jika informasi yang dibutuhkan kurang, agent menyebutkan di hasilnya apa yang kurang, alih-alih menanyakannya.
Instruksi utama, knowledge, dan tool agent dipakai sesuai konfigurasinya, kecuali Anda mematikannya di pengaturan. Setiap tugas adalah percakapannya sendiri: agent tidak mengingat tugas sebelumnya.
Menyalakan API dan membuat key
Di CMS, buka Channels โ Task API di sidebar agent Anda. Halaman ini punya tiga tab: Access, Settings, dan Test.
- Di tab Access, nyalakan API. Halaman ini menampilkan endpoint untuk agent ini beserta contoh kode.
- Agent punya dua slot key, Primary dan Secondary. Di salah satunya, buat key dan pilih Expiry: 7, 14, 30, 90, 180, atau 365 hari, atau tidak pernah. Setelah tanggal itu key berhenti bekerja.
- Buat key lalu segera salin. Key lengkap (diawali
qta_) hanya ditampilkan satu kali. Setelah itu halaman hanya menampilkan karakter terakhirnya dan tanggal kedaluwarsanya. - Simpan key di tempat penyimpanan rahasia server Anda (misalnya vault atau environment variable di server yang memanggil API).
Mengganti atau mencabut key
- Key hilang? Key tidak bisa dilihat lagi. Buat key baru di slot yang sama; key lama berhenti bekerja.
- Revoke (cabut) key untuk menghentikannya, misalnya jika key mungkin bocor atau sebuah sistem sudah tidak dipakai. Key yang sudah dicabut tidak bisa dinyalakan lagi.
- Matikan API untuk menghentikan semua key agent sekaligus.
Mencabut key atau mematikan API berlaku dalam hitungan detik.
Merotasi key tanpa downtime
Dua slot ini ada supaya Anda bisa mengganti key tanpa mengganggu sistem Anda:
- Sistem Anda memakai key Primary.
- Buat key di slot Secondary.
- Pindahkan sistem Anda ke key Secondary, lalu pastikan tugasnya berhasil.
- Revoke key Primary.
Rotasi berikutnya, lakukan hal yang sama ke arah sebaliknya.
Pengaturan tugas
Tab Settings mengatur cara agent menangani tugas. Pengaturan ini berlaku untuk setiap panggilan dengan key agent ini.
| Pengaturan | Fungsinya |
|---|---|
| Additional prompt | Instruksi tugas yang ditambahkan ke setiap panggilan, maksimal 20.000 karakter. Jika bertentangan dengan instruksi agent lainnya, additional prompt yang diikuti. Tulis di sini apa tugasnya (misalnya "Klasifikasikan tiket perawatan berikut"); input di request adalah data yang dikerjakan. |
| Response format | Bentuk hasil: Markdown (default), Plain text, JSON, atau JSON schema. Lihat Format response. |
| Include personality | Menambahkan kepribadian agent ke instruksinya. Mati secara default, karena tugas biasanya butuh hasil yang lugas. |
| Include interaction style | Menambahkan gaya interaksi agent. Mati secara default. |
| Include mission | Menambahkan misi agent. Menyala secara default. |
| Use knowledge | Mengizinkan agent mencari di knowledge-nya selama tugas. Menyala secara default. |
| Use tools | Mengizinkan agent memakai tool-nya: plugin, MCP server, custom API, web search, dan skill. Menyala secara default. |
| Keep tasks for | Berapa lama percakapan tugas disimpan: 7, 30 (default), atau 90 hari. Setelah itu percakapan dihapus. |
Pengaturan ini berlaku untuk task baru beberapa detik setelah disimpan, tanpa perlu publish. Lain halnya dengan agent itu sendiri (behavior, knowledge, dan tools): panggilan ke Task API memakai agent yang sudah di-publish, jadi perubahan pada agent baru berlaku setelah Anda klik Publish (lihat Preview dan Publish Perubahan).
Format response
| Format | Yang Anda terima |
|---|---|
| Markdown | Teks dengan format Markdown di output. |
| Plain text | Teks tanpa Markdown di output. |
| JSON | Satu objek JSON. output berisi objek itu sebagai teks dan result berisi hasil parse-nya. |
| JSON schema | Satu objek JSON yang harus sesuai dengan schema yang Anda isi. Jawaban divalidasi; jika tidak sesuai, Qlar meminta agent memperbaikinya satu kali. Jika masih tidak sesuai, panggilan gagal dengan 422 output_invalid. output berisi objek itu sebagai teks dan result berisi hasil parse-nya. |
Schema harus punya "type": "object" di root dan maksimal 20.000 karakter. Keyword yang didukung:
type:string,number,integer,boolean,object,array,null, atau daftar dari tipe-tipe iniproperties,required,additionalProperties(trueataufalse),itemsenumminimumdanmaximum,minLengthdanmaxLength,minItemsdanmaxItemstitledandescription(pakai untuk menjelaskan field kepada agent)
Tips: untuk hasil paling ketat, cantumkan setiap property di required dan atur "additionalProperties": false. Belum yakin cara menulis schema? Pakai Generate from example di CMS untuk membuatnya dari contoh JSON yang Anda inginkan.
Schema untuk contoh tiket Kirana:
{
"type": "object",
"properties": {
"category": {
"type": "string",
"enum": ["maintenance", "cleaning", "security", "it", "other"],
"description": "The team that should handle the ticket."
},
"priority": {
"type": "string",
"enum": ["low", "medium", "high"],
"description": "high = safety risk or work stopped; low = cosmetic."
},
"summary": {
"type": "string",
"maxLength": 200,
"description": "One sentence describing the problem."
}
},
"required": ["category", "priority", "summary"],
"additionalProperties": false
}
Menguji tugas di CMS
Tab Test menjalankan tugas dari CMS tanpa key. Tab ini memakai pengaturan sebagaimana adanya di form, bahkan sebelum Anda menyimpannya, pada draf agent. Isi input lalu jalankan untuk melihat:
- output dan, untuk format JSON, hasil parse-nya,
- apakah hasilnya lolos validasi,
- tool yang dipanggil agent,
- apakah perbaikan dibutuhkan.
Pakai tab ini untuk menyempurnakan additional prompt dan schema sebelum menghubungkan sistem Anda.
Request
POST https://api.qlar.ai/dialog/api/task-api/v1/agents/{agentId}/tasks
X-Api-Key: qta_...
Content-Type: application/json
Endpoint dengan agent ID Anda sudah terisi ditampilkan siap disalin di tab Access.
Body:
{
"input": "Ticket: the AC in room 3 has been leaking since yesterday.",
"permissions": ["MANAGER"],
"timezone": "Asia/Jakarta"
}
| Field | Wajib | Keterangan |
|---|---|---|
input | Ya | Data yang dikerjakan tugas, maksimal 100.000 karakter. |
permissions | Tidak | Kode permission orang yang menjadi tujuan tugas, berupa array string. Maksimal 50 kode, masing-masing maksimal 100 karakter. Lihat Permission. |
attachments | Tidak | Maksimal 5 file untuk dibaca agent. Lihat Lampiran. |
timezone | Tidak | Nama zona waktu IANA, misalnya Asia/Jakarta. Dipakai untuk tanggal dan waktu dalam tugas. Default: UTC. |
Seluruh body request maksimal 1 MB.
Lampiran
Setiap lampiran adalah objek dengan type dan url:
{
"input": "Extract the invoice number, the date, and the total amount.",
"attachments": [
{ "type": "image", "url": "https://example.com/photo.jpg" },
{ "type": "document", "url": "https://example.com/report.pdf", "fileName": "report.pdf" }
]
}
| Field | Wajib | Keterangan |
|---|---|---|
type | Ya | image atau document. |
url | Ya | Alamat https tempat Qlar bisa mengunduh file. Harus bisa diakses publik: alamat privat atau internal dan redirect ditolak. |
fileName | Tidak | Nama file, ditampilkan kepada agent. |
- Maksimal 5 lampiran per tugas.
- Gambar maksimal 10 MB, dokumen maksimal 20 MB.
- Jenis file sama dengan unggahan di chat, misalnya gambar JPG, PNG, dan WebP, serta dokumen PDF, DOCX, XLSX, TXT, dan MD.
Jika file tidak bisa diunduh atau dipakai, panggilan gagal dengan 400 attachment_invalid.
Response
{
"taskId": "6f1c...",
"status": "completed",
"format": "json_schema",
"output": "{\"category\":\"maintenance\",\"priority\":\"high\"}",
"result": { "category": "maintenance", "priority": "high" },
"durationMs": 6120
}
| Field | Keterangan |
|---|---|
taskId | ID tugas. Setiap tugas disimpan sebagai percakapan, jadi Anda bisa menemukannya di riwayat percakapan agent untuk audit, sampai dihapus setelah periode Keep tasks for. |
status | completed. |
format | Format response yang dipakai tugas, misalnya json_schema. |
output | Hasil dalam bentuk teks. |
result | Hasil yang sudah di-parse sebagai objek JSON. Hanya untuk format JSON dan JSON schema. |
durationMs | Lama pengerjaan tugas, dalam milidetik. |
Timeout
Sebuah tugas bisa memakan waktu, terutama jika agent mencari di knowledge, memanggil tool, atau membaca lampiran. Qlar menunggu sampai 180 detik agar tugas selesai; setelah itu panggilan gagal dengan 504 run_timeout. Atur timeout HTTP client Anda minimal 200 detik, supaya client tidak menyerah sebelum Qlar menjawab.
Contoh kode
Setiap contoh mengirim satu tugas, menunggu sampai 200 detik, lalu mencetak hasilnya. Ganti YOUR_AGENT_ID dengan ID agent Anda, dan ambil key dari tempat penyimpanan rahasia Anda sebagai pengganti qta_your_key.
// Node.js 18 or later (built-in fetch)
const url = "https://api.qlar.ai/dialog/api/task-api/v1/agents/YOUR_AGENT_ID/tasks";
const apiKey = process.env.QLAR_TASK_KEY ?? "qta_your_key";
const response = await fetch(url, {
method: "POST",
headers: {
"X-Api-Key": apiKey,
"Content-Type": "application/json",
},
body: JSON.stringify({
input: "Ticket: the AC in room 3 has been leaking since yesterday.",
permissions: ["MANAGER"],
}),
signal: AbortSignal.timeout(200_000), // at least 200 seconds
});
const data = await response.json();
if (!response.ok) {
console.error(`Task failed (${response.status}): ${data.code} - ${data.message}`);
process.exit(1);
}
console.log("Output:", data.output);
if (data.result) {
console.log("Category:", data.result.category);
}
using System.Text;
using System.Text.Json;
var url = "https://api.qlar.ai/dialog/api/task-api/v1/agents/YOUR_AGENT_ID/tasks";
var apiKey = Environment.GetEnvironmentVariable("QLAR_TASK_KEY") ?? "qta_your_key";
using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(200) }; // at least 200 seconds
http.DefaultRequestHeaders.Add("X-Api-Key", apiKey);
var body = """
{
"input": "Ticket: the AC in room 3 has been leaking since yesterday.",
"permissions": ["MANAGER"]
}
""";
var response = await http.PostAsync(url, new StringContent(body, Encoding.UTF8, "application/json"));
using var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
var root = doc.RootElement;
if (!response.IsSuccessStatusCode)
{
Console.Error.WriteLine(
$"Task failed ({(int)response.StatusCode}): {root.GetProperty("code")} - {root.GetProperty("message")}");
return;
}
Console.WriteLine($"Output: {root.GetProperty("output").GetString()}");
if (root.TryGetProperty("result", out var result) && result.ValueKind == JsonValueKind.Object)
{
Console.WriteLine($"Category: {result.GetProperty("category").GetString()}");
}
import os
import sys
import requests
url = "https://api.qlar.ai/dialog/api/task-api/v1/agents/YOUR_AGENT_ID/tasks"
api_key = os.environ.get("QLAR_TASK_KEY", "qta_your_key")
response = requests.post(
url,
headers={"X-Api-Key": api_key},
json={
"input": "Ticket: the AC in room 3 has been leaking since yesterday.",
"permissions": ["MANAGER"],
},
timeout=200, # at least 200 seconds
)
data = response.json()
if not response.ok:
print(f"Task failed ({response.status_code}): {data.get('code')} - {data.get('message')}", file=sys.stderr)
sys.exit(1)
print("Output:", data["output"])
if data.get("result"):
print("Category:", data["result"]["category"])
// Java 11 or later (java.net.http). Text blocks need Java 15 or later.
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class QlarTask {
public static void main(String[] args) throws Exception {
String url = "https://api.qlar.ai/dialog/api/task-api/v1/agents/YOUR_AGENT_ID/tasks";
String apiKey = System.getenv().getOrDefault("QLAR_TASK_KEY", "qta_your_key");
String body = """
{
"input": "Ticket: the AC in room 3 has been leaking since yesterday.",
"permissions": ["MANAGER"]
}
""";
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest request = HttpRequest.newBuilder(URI.create(url))
.timeout(Duration.ofSeconds(200)) // at least 200 seconds
.header("X-Api-Key", apiKey)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() / 100 != 2) {
// The body is {"code": "...", "message": "..."}; parse it with your JSON library.
System.err.println("Task failed (" + response.statusCode() + "): " + response.body());
System.exit(1);
}
// The body holds taskId, output and, for the JSON formats, result.
// Parse it with your JSON library (for example Jackson or Gson).
System.out.println(response.body());
}
}
Dengan format JSON schema dan schema di atas, tiket Kirana menghasilkan:
{
"taskId": "6f1c...",
"status": "completed",
"format": "json_schema",
"output": "{\"category\":\"maintenance\",\"priority\":\"high\",\"summary\":\"The AC in room 3 has been leaking since yesterday.\"}",
"result": {
"category": "maintenance",
"priority": "high",
"summary": "The AC in room 3 has been leaking since yesterday."
},
"durationMs": 6120
}
Permission
Kode permission bekerja sama seperti di percakapan agent: knowledge tanpa kode bisa dipakai di setiap tugas, dan knowledge dengan kode hanya dipakai jika tugas membawa salah satu kode tersebut. Kode ini juga diteruskan ke tool custom API milik agent, sehingga API Anda sendiri bisa memeriksanya. Lihat Permission Knowledge.
Pemanggil bertanggung jawab atas kode yang dikirimnya. Qlar tidak tahu siapa orang di balik sebuah tugas: Qlar memercayai kode yang dikirim pemegang key. Siapa pun yang memegang key bisa mengirim kode apa saja, termasuk kode untuk knowledge rahasia. Server Anda yang harus menentukan kode yang dibawa setiap tugas, misalnya dengan memetakan role atau grup di sistem Anda ke kode permission. Jangan pernah meneruskan kode dari browser pengguna apa adanya.
Biaya
Task API dikenai biaya seperti chat:
- Pemakaian AI (token) setiap tugas dibebankan ke kredit organisasi Anda, sama seperti jawaban chat dari agent yang sama. Tool seperti web search dikenai biaya seperti biasa.
- Jika agent berjalan dengan model AI milik organisasi Anda, pemakaian itu tidak memakai kredit Qlar, sama seperti chat. Lihat AI Models.
- Proses perbaikan untuk format JSON schema juga memakai token.
- Tugas yang dijalankan dari tab Test dikenai biaya seperti chat di Preview.
Jika kredit organisasi habis, panggilan gagal dengan 402 credit_exhausted. Lihat Cara Kerja Kredit.
Batas request
Task API belum punya batas request. Batas ini akan segera hadir; sampai saat itu, jaga agar jumlah tugas yang Anda kirim bersamaan tetap wajar.
Error
Error memakai kode status HTTP dan body JSON berisi code yang bisa dibaca mesin dan message yang bisa dibaca manusia. Jika tugas sudah sempat dimulai, body juga berisi taskId.
{
"code": "invalid_request",
"message": "input is required."
}
Bangun logika Anda berdasarkan code. Isi message bisa berubah dan ditujukan untuk manusia.
| Status HTTP | code | Arti |
|---|---|---|
| 400 | invalid_request | Body tidak valid, misalnya input tidak ada atau terlalu panjang, atau kode permission atau lampiran terlalu banyak. |
| 400 | attachment_invalid | Sebuah lampiran tidak bisa diunduh atau dipakai: bukan https, tidak bisa diakses publik, terlalu besar, atau jenis filenya tidak didukung. |
| 401 | unauthorized | Key tidak dikirim, salah, kedaluwarsa, atau sudah dicabut, API dimatikan, atau agent bukan service agent. Semua kasus ini sengaja mendapat jawaban yang sama. |
| 402 | credit_exhausted | Kredit organisasi habis. Isi ulang, lalu coba lagi. |
| 403 | agent_limit_reached | Agent sudah menghabiskan batas pemakaian bulanan yang ditetapkan admin organisasi untuknya. |
| 403 | own_model_required | Organisasi hanya mengizinkan model AI miliknya sendiri, dan agent belum punya model sendiri. Lihat Hanya Memakai Model Sendiri. |
| 413 | Body request lebih besar dari 1 MB. | |
| 422 | output_invalid | Jawaban tidak sesuai dengan format JSON, bahkan setelah satu kali perbaikan otomatis. Body juga berisi output (jawaban mentah) dan errors (bagian yang tidak sesuai). |
| 504 | run_timeout | Tugas tidak selesai dalam 180 detik. Body berisi taskId. |
Praktik keamanan terbaik
- Simpan key di server. Panggil API hanya dari kode back-end. Jangan pernah menaruh key di halaman browser, aplikasi mobile, aplikasi desktop yang Anda distribusikan, atau repository publik: siapa pun yang bisa membaca kodenya bisa memakai key tersebut.
- Tentukan permission di server Anda. Kirim hanya kode yang menjadi hak orang yang menjadi tujuan tugas.
- Simpan key sebagai rahasia. Pakai vault atau secret variable di platform Anda, bukan file konfigurasi yang masuk ke source control. Jangan mencetak key di log.
- Pasang expiry dan rotasi key memakai dua slot, seperti dijelaskan di Merotasi key tanpa downtime.
- Segera cabut jika bocor. Jika sebuah key mungkin terekspos, cabut di tab Access dan buat key baru.
- Perlakukan input dan lampiran sebagai data. Apa pun yang Anda taruh di
inputatau lampiran akan dibaca agent. Taruh instruksi di Additional prompt, bukan di teks yang berasal dari luar organisasi Anda. - Matikan API jika tidak dipakai lagi.
Troubleshooting
| Gejala | Yang perlu diperiksa |
|---|---|
Setiap panggilan mengembalikan 401 unauthorized | Pastikan API menyala, key adalah nilai lengkap yang diawali qta_, dikirim di header X-Api-Key, belum kedaluwarsa atau dicabut (atau digantikan key baru di slot yang sama), dan agent ID di URL sesuai dengan agent pemilik key. Agent juga harus tetap berupa service agent. |
| Perubahan tidak berpengaruh | Pengaturan Task API berlaku beberapa detik setelah disimpan. Perubahan pada agent itu sendiri (behavior, knowledge, tools) baru berlaku setelah Anda klik Publish. Tab Test menjalankan agent draf dengan form apa adanya, jadi hasilnya bisa berbeda dari panggilan live sampai Anda menyimpan dan publish. |
422 output_invalid | Schema mungkin sulit dipenuhi, atau additional prompt meminta sesuatu yang tidak diizinkan schema. Baca errors di response, coba input yang sama di tab Test, lalu sederhanakan schema atau perjelas instruksinya. |
504 run_timeout | Tugas berjalan lebih dari 180 detik. Perpendek input, kurangi lampiran, atau matikan tool yang tidak dibutuhkan tugas. |
| Client menyerah sebelum jawaban datang | Naikkan timeout HTTP client Anda menjadi minimal 200 detik. |
400 attachment_invalid | Pastikan URL memakai https, bisa dibuka dari internet publik tanpa login atau redirect, serta file berada dalam batas ukuran dan jenisnya didukung. |
| Hasil berisi pertanyaan atau menyebut informasi kurang | Dalam mode tugas, agent tidak bisa bertanya balik. Masukkan detail yang kurang ke input, atau jelaskan di Additional prompt apa yang harus dilakukan jika ada yang kurang. |
| Agent tidak memakai knowledge rahasia | Tugas tidak membawa kode permission knowledge tersebut. Kirim kodenya di permissions. |
Halaman Terkait
- Permission Knowledge: kode permission yang dibawa tugas.
- Preview dan Publish Perubahan: memberlakukan perubahan pengaturan.
- API Pencarian Knowledge: menerima chunk knowledge agent yang cocok, bukan hasil jadi.
- Mengizinkan Agent Lain Memanggil Agent Anda: mengizinkan agent lain berbicara dengan agent Anda.
- Cara Kerja Kredit
- Referensi per field: Task API