DecisionCore menyediakan REST API standard dan pelayan MCP. Mana-mana sistem yang boleh membuat permintaan HTTP POST boleh berintegrasi. Panduan ini merangkumi pengesahan, kedua-dua titik akhir API, contoh Python dan curl, serta corak integrasi MCP.
Dapatkan kunci API percuma, hantar POST ujian, sahkan respons. Saluran penuh selesai dalam beberapa saat.
# Register at /portal and copy your API key. # Keys are prefixed with "dc-". export DC_API_KEY="dc-your-key-here"
curl -s -X POST https://decisioncore.emas.ai/explain \ -H "Authorization: Bearer $DC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "decision": "Loan application rejected", "subject_description": "Applicant DSR 62%, policy ceiling 60%", "sector": "financial", "tenant_id": "my-org" }'
{
"audit_id": "ADMT-EXP-8a2f1c3d",
"decision": "Loan application rejected",
"explanation": "The loan application was rejected because the applicant's
Debt Service Ratio (DSR) of 62% exceeds the institution's affordability
limit of 60% (Credit Policy §3.1). The applicant may ask for a
human review of this automated decision...",
"regulations_cited": [
"Credit Policy §3.1 — Affordability limit (DSR)",
"Credit Policy §5 — Human review on request"
],
"reasoning_chain": "THOUGHT: DSR 62% exceeds the 60% limit. Matched Credit Policy §3.1...",
"report_url": "/explain/report/ADMT-EXP-8a2f1c3d",
"results_used": 1,
"results_remaining": 2
}
Semua permintaan API memerlukan token Bearer dalam pengepala Authorization. Token dikeluarkan semasa pendaftaran dan tidak tamat tempoh — tukar token daripada papan pemuka.
Authorization: Bearer dc-your-api-key-here
| Awalan kunci | Skop | Potongan |
|---|---|---|
| dc- | Akses API penuh — /explain, /explain/report | 1 keputusan bagi setiap panggilan /explain |
Menjana rekod penjelasan JSON. Memulangkan teks penjelasan, petikan peraturan, rantaian penaakulan DeepSeek R1 dan URL bagi laporan PDF. Menolak 1 keputusan (RM5 pada pelan Starter).
| Medan | Jenis | Wajib | Perihalan |
|---|---|---|---|
| decision | string | Ya | Hasil keputusan yang hendak dijelaskan. Contohnya "Pinjaman ditolak", "Permohonan disenarai pendek", "Percubaan akademik". |
| subject_description | string | Ya | Konteks tentang subjek dan faktor yang mendorong keputusan. Contohnya "DSR 62%, had institusi 60%". Maksimum 2,000 aksara. |
| sector | string | Tidak | Petunjuk untuk pemilihan korpus peraturan. Salah satu daripada: financial, hr, academic. Lalai kepada korpus umum. |
| tenant_id | string | Tidak | Pengecam organisasi anda — menentukan skop log audit. Lalai kepada slug akaun anda. |
| language | string | Tidak | Bahasa output bagi teks penjelasan. en (lalai) atau ms (Bahasa Malaysia). |
{
"audit_id": "ADMT-EXP-{uuid}", // unique record ID
"decision": "string", // echoed from request
"explanation": "string", // plain-language explanation
"regulations_cited": ["string", ...], // matched provisions
"reasoning_chain": "string", // DeepSeek R1 thought trace
"report_url": "/explain/report/{id}", // PDF download URL
"results_used": 1,
"results_remaining": integer
}
Menjana dan memulangkan laporan penjelasan PDF A4 rasmi. Badan permintaan sama seperti /explain. Memulangkan application/pdf. TIDAK menolak keputusan tambahan — PDF sudah termasuk dalam kos panggilan /explain.
curl -s -X POST https://decisioncore.emas.ai/explain/report \ -H "Authorization: Bearer $DC_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "decision": "Loan application rejected", "subject_description": "Applicant DSR 62%, policy ceiling 60%", "sector": "financial", "tenant_id": "my-org" }' \ --output dc-explanation.pdf
Anda juga boleh mendapatkan semula PDF yang dijana sebelum ini mengikut ID Audit menggunakan URL yang dikembalikan dalam respons /explain :
curl -s https://decisioncore.emas.ai/explain/report/ADMT-EXP-8a2f1c3d \
-H "Authorization: Bearer $DC_API_KEY" \
--output ADMT-EXP-8a2f1c3d.pdf
Menggunakan pustaka requests yang standard. Serasi dengan mana-mana persekitaran Python 3.8+.
import requests import os DC_API_KEY = os.environ["DC_API_KEY"] BASE_URL = "https://decisioncore.emas.ai" HEADERS = { "Authorization": f"Bearer {DC_API_KEY}", "Content-Type": "application/json", } def explain(decision: str, subject_description: str, sector: str = "financial", tenant_id: str = "my-org") -> dict: r = requests.post( f"{BASE_URL}/explain", json={ "decision": decision, "subject_description": subject_description, "sector": sector, "tenant_id": tenant_id, }, headers=HEADERS, timeout=60, ) r.raise_for_status() return r.json() def download_report(audit_id: str, output_path: str) -> None: r = requests.get( f"{BASE_URL}/explain/report/{audit_id}", headers=HEADERS, timeout=60, ) r.raise_for_status() with open(output_path, "wb") as f: f.write(r.content) # Example: loan rejection result = explain( decision="Loan application rejected", subject_description="DSR 62%, institution limit 60%", sector="financial", ) print(f"Audit ID: {result['audit_id']}") print(f"Explanation: {result['explanation'][:200]}...") print(f"Regulations: {result['regulations_cited']}") # Download the formal PDF download_report(result["audit_id"], "dc-explanation.pdf") print("PDF saved to dc-explanation.pdf")
Menggunakan API fetch asli (Node 18+). Tiada pakej tambahan diperlukan.
const fs = require('fs'); const DC_API_KEY = process.env.DC_API_KEY; const BASE_URL = 'https://decisioncore.emas.ai'; async function explain(decision, subjectDescription, sector = 'financial') { const res = await fetch(`${BASE_URL}/explain`, { method: 'POST', headers: { 'Authorization': `Bearer ${DC_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ decision, subject_description: subjectDescription, sector }), }); if (!res.ok) throw new Error(`API error ${res.status}: ${await res.text()}`); return res.json(); } async function downloadReport(auditId, outputPath) { const res = await fetch(`${BASE_URL}/explain/report/${auditId}`, { headers: { 'Authorization': `Bearer ${DC_API_KEY}` }, }); if (!res.ok) throw new Error(`Report error ${res.status}`); const buffer = Buffer.from(await res.arrayBuffer()); fs.writeFileSync(outputPath, buffer); } // Example usage explain('Candidate rejected', 'ATS score 58/100, threshold 65', 'hr') .then(async result => { console.log('Audit ID:', result.audit_id); console.log('Regulations:', result.regulations_cited); await downloadReport(result.audit_id, 'dc-explanation.pdf'); console.log('PDF saved.'); }) .catch(console.error);
DecisionCore disediakan sebagai pelayan MCP — boleh dipanggil secara asli daripada Claude dan mana-mana klien yang serasi dengan MCP. Tiga alat tersedia: request_explanation, check_consent, log_decision.
{
"mcpServers": {
"decisioncore": {
"command": "/path/to/venv/bin/python3",
"args": ["/path/to/decisioncore/mcp_server.py"],
"env": {
"DC_API_KEY": "dc-your-key-here",
"DC_BASE_URL": "https://decisioncore.emas.ai"
}
}
}
}
| Alat MCP | Input | Perihalan |
|---|---|---|
| request_explanation | decision, subject_description, sector | Menjana rekod penjelasan JSON dan memulangkan teks penjelasan + ID Audit. Menolak 1 keputusan. |
| check_consent | user_id, purpose_id, tenant_id | Memulangkan status persetujuan semasa bagi gabungan pengguna + tujuan tertentu. |
| log_decision | decision, subject_id, outcome, tenant_id | Menulis rekod keputusan ke Log Audit Berdaulat tanpa menjana penjelasan. |
Mengapa tidak meminta LLM sahaja menjelaskan keputusan itu?
| Perkara | Memanggil LLM secara terus | DecisionCore |
|---|---|---|
| Kedaulatan data | Data subjek anda dihantar ke awan AI luar | Inferens beroperasi pada pelayan TechnoNet sendiri di Kuala Lumpur, atau di premis dengan Enterprise |
| Jejak audit | Tiada rekod; penjanaan semula menghasilkan jawapan yang berbeza | ID Audit dan cap jari rekod bagi setiap penjelasan — boleh disahkan |
| Format peraturan | Teks bebas — tiada petikan atau notis hak untuk disemak oleh juruaudit atau pengawal selia | Output berstruktur: petikan peraturan, nombor seksyen, notis hak |
| Konsistensi | Tidak deterministik — input yang sama, output berbeza setiap kali | Rantaian penaakulan deterministik — input yang sama menghasilkan rekod berstruktur yang sama |
| Laporan PDF | Anda perlu membinanya sendiri | PDF A4 rasmi disertakan — ID Audit, cap masa, hak subjek, petikan peraturan |
| Kesediaan tadbir urus AI | Anda mentafsir peraturan sendiri | Korpus telah dipetakan kepada prinsip AIGE, PDPA, FSA, Akta Kerja dan peraturan akademik; Rang Undang-undang Tadbir Urus AI yang dicadangkan dipantau sepanjang perkembangannya |
{
"audit_id": "ADMT-EXP-8a2f1c3d",
"decision": "Loan application rejected",
"explanation": "The application was declined because the applicant's Debt Service Ratio (DSR) of 62% exceeds the institution's affordability limit of 60% (Credit Policy §3.1). At this ratio, more than 60% of monthly income would go to debt repayments. The applicant may ask for a human review of this automated decision.",
"regulations_cited": [
"Credit Policy §3.1 — Affordability limit (DSR)",
"Credit Policy §5 — Human review on request",
"AIGE principles — Transparency"
],
"reasoning_chain": "THOUGHT: DSR is 62%. The institution's limit is 60%. Exceeded by 2 percentage points. Credit Policy §3.1 applies. CONCLUSION: reject — affordability limit exceeded.",
"report_url": "/explain/report/ADMT-EXP-8a2f1c3d",
"results_used": 1,
"results_remaining": 9
}
| Status | Maksud | Penyelesaian |
|---|---|---|
| 400 | Bad Request — medan wajib tiada atau input tidak sah | Pastikan decision dan subject_description wujud dan tidak kosong. |
| 401 | Unauthorised — kunci API tiada atau tidak sah | Sertakan pengepala Authorization: Bearer dc-… . Sahkan kunci dalam papan pemuka. |
| 402 | Payment Required — baki keputusan sifar | Tambah nilai di /portal. Tiada perubahan pelan diperlukan. |
| 422 | Unprocessable Entity — kegagalan pengesahan input | Semak jenis medan. sector mesti salah satu daripada: financial, hr, academic. |
| 429 | Too Many Requests — had kadar dilampaui | Had kadar: 60 permintaan/minit bagi setiap kunci API. Tambahkan tundaan eksponen. |
| 500 | Internal Server Error — kegagalan saluran penaakulan | Cuba semula sekali. Jika berterusan, hubungi [email protected] dengan menyertakan badan permintaan. |
| 503 | Service Unavailable — pelayan inferens sedang dimulakan | Permulaan sejuk pertama boleh mengambil masa 30–60 saat. Cuba semula selepas 10 saat. |