端點
Kaleidr 平台 API 的每個公開端點都有獨立的說明章節。
- 基礎 URL:
https://api.kaleidr.com/inference-api/b2b/v1 - 憑證:
Authorization: Bearer …或X-Api-Key: …。後端使用伺服器金鑰(kld_sk_live_…),瀏覽器使用工作階段權杖(kld_sess_live_…)。可公開金鑰只能用於工作階段交換。參見身份驗證與權限範圍。 - 要求主體: JSON、UTF-8。每個
POST請求都需發送Content-Type: application/json。要求主體大小不得超過 2 MiB,/design/*端點為 5 MiB;超出限制將返回 413request_too_large。 - 錯誤: 返回 4xx 或 5xx 狀態及 JSON 回應體,詳見錯誤。有一個端點通過 200 返回失敗,參見路線規劃。
以下範例使用儲存在環境變數中的伺服器金鑰:
export KALEIDR_KEY="kld_sk_live_…"
摘要
| 端點 | 用途 | 權限範圍 | 計費 |
|---|---|---|---|
POST /sdk/sessions | 將可公開金鑰交換為工作階段 | 產品所需權限範圍 | tile 消耗一次地圖載入;其他情況免費 |
POST /sdk/share-sessions | 將已發佈地圖 ID 交換為聊天工作階段 | 無 | 免費 |
POST /chat/control/stream | 提問並串流返回回答、地點、操作和路線 | ai | 按使用的 Token 消耗 AI 積分 |
POST /chat/control/route | 為已知座標之間規劃路線 | ai | 免費 |
GET /retrieval/geocode/forward | 將輸入文本轉換為地點與地址 | ai | 固定額度 AI 積分 |
POST /spot | 查詢某點的地點、地址、所屬區域及可選內容 | ai | 固定額度 AI 積分 |
POST /spot/overview/stream | 串流生成 /spot 所返回物件的簡短介紹 | ai | 按使用的 Token 消耗 AI 積分 |
GET /retrieval/poi/enrich | 已棄用,請使用 /spot。獲取地點詳情和照片 | ai | 固定額度 AI 積分 |
POST /chat/summary/stream | 已棄用,請使用 /spot/overview/stream。串流返回地點或建築簡介 | ai | 按使用的 Token 消耗 AI 積分 |
POST /chat/button/stream | 串流回答關於某個地點的單獨問題 | ai | 按使用的 Token 消耗 AI 積分 |
POST /design/analyze | 根據資料表推薦地圖設計 | design | 固定額度 AI 積分 |
POST /design/apply-direct | 根據資料表和選定樣式創建地圖圖層 | design | 免費 |
GET /design/styles, /design/samples, /design/themes | 設計資源目錄 | design | 免費 |
有關計費、預留額度和限制的運作方式,請參閱配額與速率限制。
所有執行階段端點都可能傳回所有執行階段端點共用的錯誤所列錯誤。以下各節僅列出端點特有的錯誤。
POST /sdk/sessions
將可公開金鑰交換為短期有效的工作階段權杖,權杖綁定發起請求的來源和指定產品。SDK 會為每次使用金鑰的掛載操作自動執行此流程;僅在自行開發瀏覽器客戶端時才需要直接調用。
**驗證:**可公開金鑰。要求:Origin 要求標頭(瀏覽器會自動加入)。**費用:**當 product 為 tile 時計一次地圖載入;其他情況免費。
| 欄位 | 類型 | 必填 | 說明 |
|---|---|---|---|
product | 字串 | 是 | chat、editor、viewer 或 tile。 |
curl -s https://api.kaleidr.com/inference-api/b2b/v1/sdk/sessions \
-H "X-Api-Key: kld_pk_live_…" \
-H "Origin: https://www.example.com" \
-H "Content-Type: application/json" \
-d '{"product":"chat"}'
{
"session_token": "kld_sess_live_eyJhbGciOi…",
"expires_in": 900,
"product": "chat",
"basemap_style_id": null
}
basemap_style_id 是組織的預設底圖;未設定時為 null。
| 狀態碼 | 錯誤碼 | 觸發條件 |
|---|---|---|
| 401 | Invalid or missing API key | 金鑰未知、已撤銷或已過期。 |
| 403 | publishable_key_required | 提供的是伺服器金鑰或舊版金鑰。 |
| 403 | origin_required | 缺少 Origin 要求標頭。 |
| 403 | origin_not_allowed | 請求來源不在金鑰允許的來源列表中。 |
| 403 | product_not_allowed | 金鑰允許的產品不包含 product。 |
| 403 | tier_capability_not_allowed | 當前方案不包含產品或相應權限範圍。 |
| 403 | insufficient_scope | 創建金鑰時未賦予所需權限範圍。 |
| 422 | 參數校驗 | 未提供 product,或不是四個允許值之一。 |
| 429 | rate_limited | 該金鑰的工作階段交換請求過多。Retry-After: 5。 |
| 429 | map_load_quota_exceeded | 僅適用於 tile:地圖載入配額已耗盡。 |
| 404 | sessions_disabled | 平台已禁用工作階段服務。請聯繫支持團隊。 |
| 503 | sessions_not_configured | 平台故障。請重試;若問題持續,請聯繫支持團隊。 |
有效期限、更新規則和檢查順序,請參閱驗證與權限範圍:工作階段交換。
POST /sdk/share-sessions
將已發佈地圖的 ID 交換為聊天工作階段,讓訪客無需在網頁中提供金鑰即可聊天。地圖在 Studio 中的 Kaleidr AI 圖塊必須開啓所請求的功能。
**驗證:**無。要求:Origin 要求標頭。**費用:**無;該工作階段的聊天呼叫費用由地圖擁有者的組織支付。
| 欄位 | 類型 | 必填 | 說明 |
|---|---|---|---|
share_id | 字串 | 是 | 長度為 1 至 128 個字符,只能包含字母、數值、_ 和 -。 |
feature | 字串 | 否 | control_tower(預設值),即地圖的 Ask Kaleidr 面板;或 popups,即其彈出視窗中的 AI 聊天。每個功能僅在其開關開啓時授予。 |
curl -s https://api.kaleidr.com/inference-api/b2b/v1/sdk/share-sessions \
-H "Origin: https://www.example.com" \
-H "Content-Type: application/json" \
-d '{"share_id":"your-map-id","feature":"control_tower"}'
{ "session_token": "kld_sess_live_eyJhbGciOi…", "expires_in": 300, "product": "chat" }
| 狀態碼 | 錯誤碼 | 觸發條件 |
|---|---|---|
| 403 | origin_required | 缺少 Origin 要求標頭。 |
| 404 | not_found | 未找到具有該 ID 的已發佈地圖或分享鏈接,或分享鏈接的地圖已取消發佈。 |
| 403 | chat_disabled | 地圖的 Kaleidr AI 未開啓所請求的功能。 |
| 403 | origin_not_allowed | 網頁不在地圖允許的域名列表中。 |
| 403 | owner_has_no_organization | 地圖所有者沒有可用於計費的組織。 |
| 403 | tier_capability_not_allowed | 所有者方案不包含聊天功能。 |
| 422 | 參數校驗 | share_id 缺失或包含不允許的字符,或 feature 不是上述任一值。 |
| 429 | rate_limited | 此地圖或該地址發起的工作階段交換過多。Retry-After: 5。 |
| 404 | sessions_disabled | 平台已禁用工作階段服務。 |
| 503 | share_grant_unavailable、sessions_not_configured | 平台故障,請重試。 |
POST /chat/control/stream
接收問題並以串流方式返回回答,包括逐步生成的文字、所提及地點及其座標、地圖操作與路線。這是 Kaleidr Chat 背後的端點。
**驗證:**伺服器金鑰、工作階段權杖或舊版金鑰。權限範圍:ai.
**費用:**AI 點數,依答案使用的權杖數量計費。 回應:text/event-stream,詳見 SSE 串流協定。
| 欄位 | 類型 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
messages | { role, content } 陣列 | 否 | [] | 截至當前的對話,按時間從早到晚排列,以使用者的新消息結尾。role 為 user 或 assistant。其他角色(包括 system)以及 content 為空的消息均被忽略。 回答最後一條 user 消息。大小限制見下文。 |
session_id | 字串 | 否 | 自動生成 | 對話標識符,1 至 128 個字符,可使用字母、數值、_、.、: 和 -。請提供穩定 ID,並在後續輪次重復使用。省略時伺服器會為本次請求生成 ID,並通過 phase 和 start 事件返回。 |
location | 物件 { lat, lng } | 否 | 無 | 使用者正在查看的位置,即地圖中心點,用於理解“這附近”等提問。 |
map_zoom | 數值 | 否 | 無 | 地圖縮放級別。 |
lang | 字串 | 否 | "en" | 回答語言,使用 BCP 47 標記,例如 fr 或 pt-BR,最多 35 個字符。 |
layout | 字串 | 否 | 無 | 對話所在的 viewer 版面:嵌入的 viewer 顯示其導覽版面時為 "guide";否則請省略。最多 16 個字符。 |
app_snapshot | 物件 | 否 | 無 | 接受該欄位,但不需要;請省略。 |
auto_actions | 布林值 | 否 | 無 | 接受該欄位,但不需要;請省略。 |
未知欄位會被接受但忽略。要求主體中沒有提供系統指令、角色設定、工具或自定義上下文的欄位;請求僅包含對話、位置和語言。
伺服器不會為您儲存對話紀錄。每次呼叫時,請使用相同的 session_id,並在 messages 中傳送先前的對話輪次。
session_id 僅用於你的組織。對話的短期上下文按組織隔離,所以其他組織即使使用相同的 ID,也無法查看或修改你的對話。在自己的組織內部,請為每位最終使用者的每段對話分配獨立 ID。
請求限制
超出任一限制的要求會在產生答案前以 422 拒絕,且不計費。回應本文為 {"detail": "<code>"}。
| 限制 | 數值 | 錯誤碼 |
|---|---|---|
messages 中的消息數量 | 400 | too_many_messages |
單條消息 content 的長度 | 64,000 個字符 | message_too_long |
所有 content 的總長度 | 200,000 個字符 | conversation_too_long |
session_id | 1 至 128 個字符:字母、數值、_、.、:、- | invalid_session_id |
lang | 35 個字符 | lang_too_long |
layout | 16 個字符 | invalid_layout |
所有消息都計入這些限制,包括會被忽略的消息。長對話通常會先觸及總長度上限,而不是消息數量上限。僅發送最新且必要的輪次,並移除較早內容:參見讀取資料流。
curl -N https://api.kaleidr.com/inference-api/b2b/v1/chat/control/stream \
-H "Authorization: Bearer $KALEIDR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{
"session_id": "trip-42",
"messages": [{"role": "user", "content": "Where is the Louvre, and what is next to it?"}],
"location": {"lat": 48.8566, "lng": 2.3522},
"map_zoom": 12,
"lang": "en"
}'
-N 會關閉 curl 的輸出緩衝,讓資料框架在抵達時立即列印。以下為包含範例值的精簡回應:
event: phase
data: {"type": "phase", "phase": "thinking", "session_id": "trip-42"}
: keep-alive
event: start
data: {"type": "start", "session_id": "trip-42", "purpose": "control"}
data: {"text": "The [[Louvre Museum]] is on the right bank of the Seine"}
event: place
data: {"name": "Louvre Museum", "coordinates": {"lat": 48.8606, "lng": 2.3376}, "category": "museum"}
data: {"text": ", with the [[Tuileries Garden]] directly to its west."}
event: place
data: {"name": "Tuileries Garden", "coordinates": {"lat": 48.8635, "lng": 2.3275}, "category": "park"}
event: early_actions
data: {"type": "early_actions", "actions": [{"type": "map.fitBounds", "payload": {"coordinates": [[2.3376, 48.8606], [2.3275, 48.8635]], "padding": 50, "maxZoom": 15, "duration": 1000}}], "places_count": 2, "is_partial": true}
event: end
data: {"type": "end", "full_text": "The [[Louvre Museum]] is on the right bank of the Seine, with the [[Tuileries Garden]] directly to its west.", "places": [{"name": "Louvre Museum", "coordinates": {"lat": 48.8606, "lng": 2.3376}, "category": "museum"}, {"name": "Tuileries Garden", "coordinates": {"lat": 48.8635, "lng": 2.3275}, "category": "park"}], "actions": [], "question_type": "…", "response_time": 6.4, "total_tokens": 3120}
event: quota
data: {"type": "quota", "product": "b2b", "meter": "b2b.tokens", "tier": "pro", "used": 184223, "limit": 5000000, "reset_at": "2026-11-01T04:00:00+00:00", "period": "month"}
| 狀態碼 | 錯誤碼 | 觸發條件 |
|---|---|---|
| 413 | request_too_large | 要求主體超過 2 MiB。 |
| 422 | 參數校驗 | 要求主體不是有效 JSON,或欄位類型錯誤。 |
| 422 | too_many_messages、message_too_long、conversation_too_long、invalid_session_id、lang_too_long、invalid_layout | 請求超出大小限制。 |
| 429 | quota_exceeded | AI 積分池或此金鑰的月度上限不足以支付請求。 |
示例中的 quota 事件是伺服器金鑰收到的版本。使用工作階段權杖讀取資料流時,該事件包含的信息較少,詳見quota 事件。
串流開始後,失敗會以 error 事件傳送,而不是 HTTP 狀態碼。實作用戶端時請參閱讀取串流。
POST /chat/control/route
使用已知座標規劃兩點間的路線。不提問,也不產生文字。
**驗證:**伺服器金鑰、工作階段權杖或舊版金鑰。權限範圍:ai.
**費用:**無。但仍須有足夠的 AI 點數餘額才能接受呼叫。
| 欄位 | 類型 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
places | 物件陣列 | 是,至少兩個 | [] | 每個物件為 { lat, lng, name? },並且數值類型的 lat 和 lng 必須直接位於物件頂層。也可以用 label 代替 name。lat 和 lng 座標無效或不是數值的項目會被靜默跳過。 |
profile | 字串 | 否 | "driving" | driving、walking、cycling 或 transit。其他值都按 driving 規劃。 |
raw_query | 字串 | 否 | "Show directions" | 使用者輸入的原始文字(如果有)。 |
第一個地點為起點,最後一個地點為目的地。
聊天流的 place 事件將座標嵌套在 { "coordinates": { "lat": …, "lng": … } } 中,但此端點要求 lat 和 lng 直接位於物件 頂層。原樣傳入聊天流的地點會得到 error 回應,因為其中沒有可用的頂層座標。
curl -s https://api.kaleidr.com/inference-api/b2b/v1/chat/control/route \
-H "Authorization: Bearer $KALEIDR_KEY" \
-H "Content-Type: application/json" \
-d '{
"places": [
{"name": "Louvre Museum", "lat": 48.8606, "lng": 2.3376},
{"name": "Tuileries Garden", "lat": 48.8635, "lng": 2.3275}
],
"profile": "walking"
}'
成功回應為包含 action 的 200(數值僅供示意):
{
"action": {
"type": "map.showRoute",
"payload": {
"id": "control-directions",
"label": "Directions",
"profile": "walking",
"coordinates": [[2.3376, 48.8606], [2.3352, 48.8619], [2.3275, 48.8635]],
"distance_m": 870,
"duration_s": 640,
"turn_by_turn": [{ "text": "Walk west on Rue de Rivoli." }],
"attribution": {
"text": "© OpenStreetMap contributors",
"url": "https://www.openstreetmap.org/copyright",
"license": "https://opendatacommons.org/licenses/odbl/"
}
}
},
"route": { "…": "the full planning result the action was built from" }
}
繪制 action.payload.coordinates,它是一組 [lng, lat] 座標對。distance_m 單位為米,duration_s 單位為秒。顯示路線時必須展示 attribution.text,並連結至 attribution.url。
當 profile: "transit" 時,payload.transit 表示一次無需換乘的行程:步行、乘坐一趟交通工具、再步行。此時頂層結果中沒有 attribution;運營商來源信息位於 payload.transit.attribution,應隨行程一起顯示。
此端點以 HTTP 200 回報失敗
**無法規劃路線並非 4xx 錯誤。**回應為 200,包含 error 字串而不包含 action:
{ "error": "Route planning failed." }
當規劃器無法連接這些地點或因其他原因規劃失敗時,就會出現這種回應。如果有效座標的地點少於兩個,返回文字為 At least two resolved places are required to build a route.。這段文字可直接顯示給使用者,因此應判斷是否存在 error 欄位,不要依賴錯誤文案。若沒有直達公交行程,也會以相同方式返回失敗,並額外提供 reason、covered 和 available 三個欄位。
請依回應本文而非狀態碼進行判斷:
const res = await fetch(`${API}/chat/control/route`, { method: 'POST', headers, body });
if (!res.ok) throw new Error(`route request refused: ${res.status}`); // 401, 403, 422, 429
const data = await res.json();
if (data.error) {
showMessage(data.error); // a 200 that is a failure
} else {
drawLine(data.action.payload.coordinates);
}
驗證、權限範圍、資料驗證、配額及速率限制失敗,仍以一般的 401、403、422 和 429 回應傳回。
GET /retrieval/geocode/forward
將輸入文字轉換為相符的地點和街道地址。適用於搜尋框或出發地/目的地欄位。
**驗證:**伺服器金鑰、工作階段權杖或舊版金鑰。權限範圍:ai.
**費用:**AI 點數,每次呼叫收取固定費用。即使 results 為空也會計費。
| 參數 | 類型 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
q | 字串 | 是 | 1 至 200 個字符:地點名稱、帶門牌號碼的街道地址,或輸入的 lat,lng。 | |
near_lat | 數值 | 否 | −90 至 90。附近的匹配項排名更高;必須和 near_lng 一起使用。 | |
near_lng | 數值 | 否 | −180 至 180。必須和 near_lat 一起使用。 | |
limit | 整數 | 否 | 5 | 1 至 20。 |
mode | 字串 | 否 | 出行方式(driving、walking、cycling、transit)。短距離行程會提高附近結果的排名。 |
curl -s -G https://api.kaleidr.com/inference-api/b2b/v1/retrieval/geocode/forward \
-H "Authorization: Bearer $KALEIDR_KEY" \
--data-urlencode "q=20 W 34th St, New York" \
--data-urlencode "limit=3"
{
"query": "20 W 34th St, New York",
"results": [
{
"lat": 40.7484,
"lng": -73.9857,
"display_name": "20 W 34th St, New York, NY 10001",
"type": "address",
"source": "…",
"id": "…",
"confidence": "exact",
"attribution": {
"dataset": "us/ny/city_of_new_york",
"license": "…",
"attribution": "Address data from the NYC Department of City Planning."
}
}
],
"attribution": {
"text": "Overture Maps Foundation, overturemaps.org",
"licenses": [
"https://cdla.dev/permissive-2-0/",
"https://www.apache.org/licenses/LICENSE-2.0",
"https://opensource.foursquare.com/places-notice-txt/",
"https://docs.overturemaps.org/attribution/"
],
"sources": [
{
"dataset": "us/ny/city_of_new_york",
"license": "…",
"attribution": "Address data from the NYC Department of City Planning."
}
]
}
}
所有結果均包含 lat、lng、display_name、type 與 source。其他欄位僅在適用時出現:
| 結果欄位 | 含義 |
|---|---|
id | 街道地址對應的 Kaleidr 門牌標識符。資料更新後仍保持不變,可保存並比較。 |
confidence | 輸入文字與結果的匹配方式(見下表)。輸入 lat,lng 時不提供。 |
approximate、method、matched_numbers、within_m、score | 僅適用於下述估算地址。 |
attribution | 此結果來源資料集的條款:dataset、license,以及適用時的 license_url、attribution(需要顯示的署名)和 use_restriction。 |
confidence | 結果含義 |
|---|---|
exact | 輸入的門牌號碼、街道和地點均完全一致。 |
fuzzy | 同樣匹配,但輸入的街道名稱存在拼寫錯誤。 |
name_exact | 地點名稱與輸入文字完全一致。 |
locality | 輸入文字指定的城鎮、地區或街廓。 |
interpolated、nearest | 資料集中缺失門牌號碼時生成的估算位置。 |
partial | 街道完整名稱以輸入內容開頭。 |
name_partial | 地點名稱與輸入內容部分相同。 |
ambiguous | 未指定所屬地點,也沒有附近參考點的地址:存在多個可能結果。 |
估算地址。 如果資料中不存在輸入的門牌號碼,系統會將其放在對應街道上:同側兩個已知門牌號碼之間、最近的已知門牌號碼處,或該號碼所屬街廓範圍內。估算結果帶有 approximate: true,以及以下欄位:
| 欄位 | 含義 |
|---|---|
method | "interpolated"(位於兩個已知門牌號碼之間)、"nearest"(靠近一個已知號碼)或 "range"(沿街廓放置)。 |
matched_numbers | 用於估算位置的已知門牌號碼。 |
within_m | 已知門牌號碼間距離或街廓長度(米):當沿街編號有序時,估算誤差的上限。"nearest" 情況下省略。 |
score | 0 到 1 的置信度;低分時應將結果視為街道級位置,而非精確門牌位置。 |
完全相符的結果不會包含這些欄位。
來源署名。 將頂層 attribution 隨結果一起傳遞。其 text 是需要展示的署名文字,licenses 列出必須隨資料提供的許可條款。如果結果包含街道地址,attribution.sources 會列出使用的地址資料集。使用這些結果時必須遵守其 use_restriction:
| 資料集 | 需要顯示的署名 | 使用限制 |
|---|---|---|
au/countrywide (G-NAF) | G-NAF © Geoscape Australia,經澳大利亞聯邦授權,依據 Open Geo-coded National Address File (G-NAF) End User Licence Agreement 使用。 | 不得用於生成郵寄地址或郵寄地址匯編,除非每個地址均經 G-NAF 以外的來源驗證可接收郵件;使用行為必須符合 Australian Privacy Principles。 |
ca/countrywide (Statistics Canada) | 改編自 Statistics Canada, National Address Register, 2025-07-29。此舉並不代表加拿大統計局認可本產品。 | 不得用於識別任何個人、企業或組織,也不得暗示其認可。 |
us/ny/city_of_new_york | 地址資料來源:NYC Department of City Planning。 | 無。 |
us/ma/statewide (MassGIS) | MassGIS (Bureau of Geographic Information), Commonwealth of Massachusetts EOTSS | 無(公共領域)。 |
無匹配和內部失敗的回應相同。 查詢不到結果時,返回 200 和 "results": []。內部查詢失敗時也可能返回同樣內容,但此時不計費。因此應將空陣列視為“沒有可展示內容”,而不是錯誤。
| 狀態碼 | 錯誤碼 | 觸發條件 |
|---|---|---|
| 422 | 參數校驗 | q 缺失、為空或超過 200 個字符;limit 或座標超出範圍。 |
| 429 | quota_exceeded | AI 積分池不足以支付請求。 |
POST /spot
說明指定座標點有甚麼:使用者點擊的地點、最近的街道地址,以及包含該點的行政區域。每項資料均附帶必須顯示的來源署名。根據請求,還可以返回地點介紹和照片。
**驗證:**伺服器金鑰、工作階段權杖或舊版金鑰。權限範圍:ai.
**費用:**AI 點數,每次呼叫依 want 中要求的最昂貴項目收取固定費用,即使沒有查到結果也要收費。content 或 photos 在本次呼叫需要取得內容時依 /retrieval/poi/enrich 的費率計費;否則 address 依 /retrieval/geocode/forward 的費率計費。先前請求已取得的內容不收費,因此這類呼叫若同時要求 address,依地理編碼費用計費。僅要求 entities、regions、boundaries 或 tenants 的呼叫免費。預設 want 包含 address,因此省略 want 會產生地理編碼費用。
| 欄位 | 類型 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
lat | 數值 | 是 | −90 至 90。目標點。 | |
lng | 數值 | 是 | −180 至 180。 | |
zoom | 數值 | 否 | 0 至 24。地圖縮放級別。 | |
hint | 物件 | 否 | 使用者點擊的物件(見下文)。 | |
want | 字串陣列 | 否 | ["entities", "address", "regions"] | 要返回的資料部分(見下文)。 |
lang | 字串 | 否 | "en" | content 使用的語言,不超過 16 個字符。 |
座標點決定範圍;提示信息只能用於選擇。 提示信息從位於該點的物件中選擇結果,絕不會改變目標位置:距離 lat、lng 超過 75 米的地點不會被返回,無論提示信息如何描述。
hint 欄位 | 說明 |
|---|---|
id | Kaleidr 為地點指定的 ID:poi: 參照中冒號後面的部分。 |
name | 地點名稱,與地圖標籤上顯示的名稱相同。最多 200 個字元。系統會將此名稱與指定位置的地點進行完全比對,並用來指定 content 對應的地點。如果 region_level 是 county、state 或 country,也會從該位置所屬、相同層級的區域中選取名稱相符的區域,比對時不區分大小寫,也忽略重音符號(對於州或國家,也包含距離該位置不超過 5 km 的區域)。若名稱不符合任何區域,就不會有任何變更。 |
category | 地點類別。最多 100 個字元。用於 content。 |
region_level | 指定 boundaries 時,只傳回此層級(city、county、state 或 country)區域的邊界輪廓;未指定時,則傳回所有區域的邊界輪廓。指定 name 時,regions 和 boundaries 中此層級的區域都由名稱選定。 |
layer, wiki_title, ta_location_id, yelp_business_id, data_source | 系統接受這些欄位,但它們僅供 Kaleidr 自家應用程式使用;請省略。 |
want 值 | 新增內容 |
|---|---|
entities | 使用者點選的地點,前提是 hint 指定了該位置上的某個地點。 |
address | 最近的街道地址。 |
regions | 包含該位置的城市與郡(僅限美國)、州及國家。如果該位置位於離岸不超過 5 km 的海域,則傳回最近的州與國家。 |
boundaries | regions,每個區域都附有邊界輪廓(指定 hint.region_level 時僅包含一個層級)。 |
content | 地點的描述內容:摘要、照片和連結。需要地點名稱,來源可以是點選的地點或 hint.name。 |
photos | 只傳回地點的照片。費用與 content 相同。 |
tenants | 依距離由近到遠傳回該位置附近有名稱的地點,也就是建築物內的商家。你的應用程式應只保留位於所顯示建築物輪廓範圍內的地點。 |
curl -s https://api.kaleidr.com/inference-api/b2b/v1/spot \
-H "Authorization: Bearer $KALEIDR_KEY" \
-H "Content-Type: application/json" \
-d '{
"lat": 40.7484,
"lng": -73.9857,
"zoom": 17,
"hint": {"name": "Empire State Building", "category": "landmark"},
"want": ["entities", "address", "regions"]
}'
含範例值的精簡回應:
{
"spot": { "lat": 40.7484, "lng": -73.9857, "zoom": 17 },
"entities": [
{
"ref": "poi:3f1c2a9e-…",
"kind": "poi",
"role": "clicked",
"name": { "value": "Empire State Building", "license": "CDLA-Permissive-2.0", "attr": "a1" },
"at": { "lat": 40.74844, "lng": -73.98566 },
"facts": {
"category": { "value": "landmark_and_historical_building", "license": "CDLA-Permissive-2.0", "attr": "a1" },
"website": { "value": "https://www.esbnyc.com", "license": "CDLA-Permissive-2.0", "attr": "a1" }
}
}
],
"address": {
"ref": "address:ka1…",
"line": { "value": "20 W 34th St, New York, NY 10001", "license": "CDLA-Permissive-2.0", "attr": "a2" },
"at": { "lat": 40.7484, "lng": -73.9857 }
},
"regions": [
{
"ref": "region:tiger:3651000",
"kind": "region",
"level": "city",
"name": { "value": "New York", "license": "LicenseRef-Public-Domain", "attr": "a3" },
"label": { "lat": 40.6976, "lng": -73.9795 }
},
{
"ref": "region:tiger:36",
"kind": "region",
"level": "state",
"name": { "value": "New York", "license": "LicenseRef-Public-Domain", "attr": "a3" },
"label": { "lat": 42.7559, "lng": -75.8099 }
}
],
"attributions": {
"a1": { "text": "© Overture Maps Foundation", "license": "CDLA-Permissive-2.0" },
"a2": { "text": "Address data from the NYC Department of City Planning.", "license": "CDLA-Permissive-2.0" },
"a3": { "text": "U.S. Census Bureau, TIGER/Line", "license": "LicenseRef-Public-Domain" }
},
"withheld": ["building_facts"]
}
| 欄位 | 含義 |
|---|---|
spot | 發送的座標點:{ lat, lng, zoom }。 |
entities | 使用者點擊的地點;若請求了租戶資料,還包含建築內商家,否則為空陣列。每項包含 ref、kind(點擊的地點為 "poi"、建築內商家為 "tenant")、role("clicked" 或 "inside")、name、at(地點自己的座標 { lat, lng })和 facts(category,以及在已知時點擊地點的 website)。商家的 ref 是 poi: 引用,因此也能生成其介紹流。忽略未知 kind 類型的實體。 |
address | 最近的街道地址,或 null:{ ref, line, at }。 |
regions | 包含該點的行政區域,從最小區域開始。每項包含 ref、kind("region")、level(city、county、state 或 country)、name 和 label(用於放置區域名稱的點 { lat, lng },或 null)。當 want: ["boundaries"] 時,還包含 geometry,即 GeoJSON 格式的區域輪廓。 |
content | 當 want 包含 content 或 photos、地點名稱已知且內容允許返回時才提供。對應 /retrieval/poi/enrich 的物件(欄位),或僅請求 photos 時的 { photos, source, cached },並增加 license 和 attr。無法檢索內容時可能為 null。 |
attributions | 此回應的來源署名:{ text, license },使用各資料項的 attr 作為鍵。 |
withheld | 按內容類型列出因許可限制而沒有返回的資料;未省略任何內容時為空陣列。 |
ref 用於在 /spot/overview/stream 中指定物件:poi:<id> 表示地點、address:<id> 表示地址、region:<source>:<id> 表示行政區域(<source> 為 tiger、nuts 或 ne)。Kaleidr 自家應用還使用 building:<id>,但 API 不會返回此類引用。應將引用視為不透明字串。
顯示每個值的來源標示
每個資料集值都是 { value, license, attr } 物件,分別表示資料值、許可協議以及指向 attributions 的鍵。無論在哪裡展示資料,都必須同時提供 attributions[attr].text,可置於旁邊或在可存取的來源信息區中。同一回應可能包含多個資料來源,因此只對整個回應顯示單一署名並不夠。存儲或轉發資料時,務必保留相應的 license 和來源署名。
content 也通過其自身的 attr 進行來源署名。標記為 live_only: true 的值只能向當前使用者顯示,不得存儲或轉發。
各授權條款的要求請參閱資料授權。
API 不會回傳的內容
Kaleidr 自家應用程式在同一地點顯示的資訊比 API 更多,因為部分資料的授權不允許在其他網站使用:
- 受 ODbL 約束的 OpenStreetMap 派生資料: 建築事實信息(樓層數、高度、類別)。建築介紹同樣無法通過 API 提供。
- 第三方提供商的結果: 地理編碼服務的地址查詢,以及 Yelp 和 Tripadvisor 的評分、評論和照片。
withheld 用於區分“此處沒有已知資料”和“此資料無法通過 API 提供”。它只列出資料類別,不包含具體值:當點位於建築內時可能出現 building_facts;當地點僅有的內容不能通過 API 返回時可能出現 content。其他項目也以相同方式標識回應中被省略的部分。
POST /spot 的錯誤:
| 狀態碼 | 錯誤碼 | 觸發條件 |
|---|---|---|
| 413 | request_too_large | 要求主體超過 2 MiB。 |
| 422 | 參數校驗 | 缺少 lat 或 lng,或座標超出範圍;zoom 不在 0 至 24 範圍內;want 包含未知值;欄位過長或格式有誤。 |
| 429 | quota_exceeded | AI 積分池不足以支付請求。 |
無法查詢的部分會以空值(null 或 [])傳回,但仍會計費。
POST /spot/overview/stream
以串流方式傳回 /spot 所回應物件的簡短文字介紹,該物件由 ref 指定。
**驗證:**伺服器金鑰、工作階段權杖或舊版金鑰。權限範圍:ai.
**費用:**AI 點數,依使用的權杖數量計費。每次要求都會重新產生介紹。
回應:text/event-stream,通常先傳送一個包含地點完整名稱(如 "Springfield, Ohio, United States of America")的 place 框架,然後是地點摘要資料框架;請參閱摘要與按鈕串流。
| 欄位 | 類型 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
ref | 字串 | 是 | /spot 回應中的 ref,最長 128 個字符,或 place:(見下文)。 | |
lat、lng | 數值 | 是 | 此前發送給 /spot 的座標點。 | |
lang | 字串 | 否 | "en" | 介紹文字的語言,不超過 16 個字符。 |
hint | 物件 | 僅 place: 需要 | { name, category? }:要描述的名稱。 |
ref | 介紹物件 |
|---|---|
poi:<id> | 地點。 |
region:<source>:<id> | 行政區域。 |
place: | Kaleidr 沒有記錄的具名物件,例如 /spot 未返回實體的地點。請在 hint.name 中提供名稱。 |
address:<id>、building:<id> | 無法通過 API 提供:資料流會返回 error 事件。參見API 不返回的內容。 |
系統會在 lat、lng 位置重新查找物件,因此不會直接將請求中的描述視為事實。距離指定點超過 75 米的 poi: 引用、不包含該點的 region: 引用,以及沒有 hint.name 的 place:,也都會收到 error 事件。
curl -N https://api.kaleidr.com/inference-api/b2b/v1/spot/overview/stream \
-H "Authorization: Bearer $KALEIDR_KEY" \
-H "Content-Type: application/json" \
-d '{"ref": "poi:3f1c2a9e-…", "lat": 40.7484, "lng": -73.9857, "lang": "en"}'
無法描述的參照會傳回此資料框架,而非摘要。它包含 ref,不包含 partial_text:
event: error
data: {"type": "error", "message": "Nothing to describe here.", "ref": "address:ka1…"}
| 狀態碼 | 錯誤碼 | 觸發條件 |
|---|---|---|
| 413 | request_too_large | 要求主體超過 2 MiB。 |
| 422 | 參數校驗 | ref 格式不符合上述任一形式,缺少 lat 或 lng 或座標超出範圍,或 lang 超過 16 個字符。 |
| 429 | quota_exceeded | AI 積分池不足以支付請求。 |
從已淘汰端點遷移
GET /retrieval/poi/enrich 和 POST /chat/summary/stream 已棄用。這兩個端點在 2027-01-15 前仍按原方式回應,此日期之後可能隨時移除。其回應 頭會標明棄用信息;Deprecation 將棄用日期 2026-10-16 表示為 Unix 時間戳:
Deprecation: @1792108800
Sunset: Fri, 15 Jan 2027 00:00:00 GMT
Link: </inference-api/b2b/v1/spot>; rel="successor-version"
/chat/summary/stream 的 Link 回應標頭指向 /inference-api/b2b/v1/spot/overview/stream。記錄 Sunset 回應標頭,以辨識仍在使用的舊呼叫。
從 GET /retrieval/poi/enrich 移轉至 POST /spot:
| 原方式 | 新方式 |
|---|---|
lat、lon(查詢參數) | lat、lng(要求主體)。注意欄位名變化。 |
name、category | hint.name、hint.category |
lang | lang,最長 16 個字符 |
| 完整查詢 | want: ["content"] |
photos_only=true | want: ["photos"] |
radius、dataSource、ta_location_id、regionLevel | 省略。 |
| 回應體 | content:原物件,另增加 live_only |
attribution | content.attribution |
費用相同或更低:/spot 不對先前請求已取得的內容收費。查詢依 want 中最昂貴的項目計費,因此當本次呼叫需要取得內容時,將 entities、address 或 regions 加入 want,即可在同一次呼叫中免費取得這些內容。
從 POST /chat/summary/stream 移轉至 POST /spot/overview/stream:
| 原方式 | 新方式 |
|---|---|
地點:location、building_properties.name、.category | 使用座標點和 hint: { name, category } 調用 /spot,然後以相同的 lat 和 lng 對 entities 中地點的 ref 獲取介紹流。若 entities 為空,則發送 ref: "place:" 和相同的 hint。 |
building_properties.pid | ref: "poi:<id>" |
lang | lang,最長 16 個字符 |
max_tokens | 省略。 |
建築:type: "building" 及其欄位 | 沒有替代端點。建築介紹無法通過 API 提供。 |
| 資料幀 | 地點簡介的資料幀,前面新增一個說明地點名稱的 place 幀。 |
GET /retrieval/poi/enrich
此端點已棄用,可能在 2027-01-15 之後移除。請改用 POST /spot,並設置 want: ["content"]。參見棄用端點遷移指南。
傳回單一地點的說明內容:標題、摘要、照片和連結。
**驗證:**伺服器金鑰、工作階段權杖或舊版金鑰。權限範圍:ai.
**費用:**AI 點數,每次呼叫收取固定費用。無論是否找到內容都會計費。
| 參數 | 類型 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
lat | 數值 | 是 | 地點緯度。 | |
lon | 數值 | 是 | 地點經度。注意欄位名是 lon,不是 lng。 | |
name | 字串 | 否 | 地點名稱。建議提供,單獨使用座標點往往找不到結果。 | |
category | 字串 | 否 | place 事件中給出的地點類別。 | |
radius | 整數 | 否 | 250 | 點位周圍的搜索半徑,單位為米。 |
lang | 字串 | 否 | "en" | 內容的語言。 |
photos_only | 布林值 | 否 | false | 僅返回照 片(回應體更小,見下文)。 |
dataSource、ta_location_id、regionLevel | 字串 | 否 | 接受這些提示信息,但它們供 Kaleidr 自家應用使用;請省略。 |
curl -s -G https://api.kaleidr.com/inference-api/b2b/v1/retrieval/poi/enrich \
-H "Authorization: Bearer $KALEIDR_KEY" \
--data-urlencode "lat=48.8606" \
--data-urlencode "lon=2.3376" \
--data-urlencode "name=Louvre Museum" \
--data-urlencode "category=museum"
{
"source": "wikipedia",
"found": true,
"title": "Louvre",
"photos": ["https://upload.wikimedia.org/…/Louvre_Museum.jpg"],
"summary": "The Louvre is a national art museum in Paris, France…",
"rating": null,
"phone": null,
"hours": null,
"reviews": [],
"url": "https://en.wikipedia.org/wiki/Louvre",
"attribution": ["Wikipedia"]
}
| 欄位 | 類型 | 含義 |
|---|---|---|
source | 字串 | 內容來源。"omitted" 表示該地點有內容,但不能通過 API 返回(見下文)。 |
found | 布林值 | 未找到內容時為 false,其餘欄位為空。 |
title | 字串 | 來源中的地點標題。 |
summary | 字串或 null | 簡短介紹。 |
photos | URL 陣列 | 可能為空。 |
url | 字串或 null | 來源頁面連結。 |
attribution | 字串陣列 | 需要署名的來源,如 ["Wikipedia"]。展示內容時須同時顯示。 |
rating、phone、hours、reviews | 可能為 null 或空值。API 不返回授權供應商的評分和評論。 | |
unverified | 布林值 | 可選。地點匹配不確定時為 true。 |
當 photos_only=true 時,回應為 { "photos": […], "source": "…", "cached": false }。
被保留、不返回的內容。 部分內容僅獲許可用於 Kaleidr 自家應用。如果某地點只有此類內容,API 會返回 200、"source": "omitted"、"found": false,且不提供具體內容。請求仍會計費。參見資料許可。
| 狀態碼 | 錯誤碼 | 觸發條件 |
|---|---|---|
| 422 | 參數校驗 | 缺少 lat 或 lon,或其值不是數值。 |
| 429 | quota_exceeded | AI 積分池不足以支付請求。 |
| 500 | An internal error occurred. Please try again. | 查詢失敗,但仍會計費。 |
POST /chat/summary/stream
此端點已棄用,可能在 2027-01-15 之後移除。請改用 POST /spot/overview/stream。建築簡介沒有替代端點。參見棄用端點遷移指南。
以串流方式產生單一地點或建築物的簡短文字摘要,供 Kaleidr Chat 的地點卡片使用。
**驗證:**伺服器金鑰、工作階段權杖或舊版金鑰。權限範圍:ai.
**費用:**AI 點數,依使用的權杖數量計費。每次要求都會重新產生摘要。
回應:text/event-stream。請參閱摘要與按鈕串流。
要求本文中的 type 決定摘要類型。
建築物("type": "building"):
| 欄位 | 類型 | 必填 | 說明 |
|---|---|---|---|
type | 字串 | 是 | "building"。 |
address | 字串 | 是 | 建築完整地址,最多 500 個字符。 |
lat、lng | 數值 | 否 | 建築座標。 |
building_levels | 整數 | 否 | 樓層數(如已知)。 |
building_height_m | 數值 | 否 | 建築高度(米,如已知)。 |
tenant_names | 字串陣列 | 否 | 建築內商家名稱,最多 100 個,每個不超過 200 個字符。 |
poi_count | 整數 | 否 | 建築內地點數量。 |
lang | 字串 | 否 | 預設值為 "en",最多 35 個字符。 |
curl -N https://api.kaleidr.com/inference-api/b2b/v1/chat/summary/stream \
-H "Authorization: Bearer $KALEIDR_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "building", "address": "20 W 34th St, New York, NY 10001", "lat": 40.7484, "lng": -73.9857}'
event: start
data: {"type": "start", "address": "20 W 34th St, New York, NY 10001"}
data: {"text": "A landmark office tower in Midtown Manhattan"}
event: end
data: {"type": "end", "full_text": "A landmark office tower in Midtown Manhattan…", "parsed": {"…": "…"}, "total_tokens": 910}
event: quota
data: {"type": "quota", "product": "b2b", "meter": "b2b.tokens", "tier": "pro", "used": 185133, "limit": 5000000, "reset_at": "2026-11-01T04:00:00+00:00", "period": "month"}
地點請求(未提供 type,或其值為 "poi"):要求主體可以包含 location(物件 { lat, lng })、building_properties(物件)、lang 和 max_tokens(整數)。此形式專為 Kaleidr 自有面板設計,具體欄位含義尚未成為正式公開協議。如果從自有代碼中查詢地點,建議使用 /chat/control/stream。
| 地點欄位 | 限制 |
|---|---|
building_properties.name、.type、.category、.poi_type | 每個最多 200 個字符 |
building_properties.pid | 128 個字符 |
building_properties.event 中的各文本欄位 | 4,000 個字符 |
lang | 35 個字符 |
max_tokens | 超過端點預設值時會降至預設值,不能要求生成更長的簡介。 |
這兩種請求形式只讀取這裡列出的欄位。 要求主體中的其他欄位會被忽略。如果某欄位超過長度限制,系統會在生成介紹之前返回 422 field_too_long。
| 狀態碼 | 錯誤碼 | 觸發條件 |
|---|---|---|
| 413 | request_too_large | 要求主體超過 2 MiB。 |
| 422 | field_too_long | 某欄位超長,或 tenant_names 包含超過 100 個項目。回應體為 {"detail": "field_too_long"}。 |
| 500 | Summary stream error | 無法讀取要求主體,或建築請求沒有 address。此端點對其他格式不正確的要求主體也返回 500,而不是 422。 |
| 429 | quota_exceeded | AI 積分池不足以支付請求。 |
POST /chat/button/stream
串流回答關於某個地點的單個問題,例如“營業時間是甚麼?”。它用於 Kaleidr Chat 地點卡片中的提問按鈕。此端點不保留對話歷史,每次調用都是獨立的。
**驗證:**伺服器金鑰、工作階段權杖或舊版金鑰。權限範圍:ai.
**費用:**AI 點數,依使用的權杖數量計費。
回應:text/event-stream。請參閱摘要與按鈕串流。
| 欄位 | 類型 | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
query | 字串 | 是 | 具體問題,最多 4,000 個字符。 | |
place_name | 字串 | 否 | 被詢問的地點名稱,最多 200 個字符。 | |
place_type | 字串 | 否 | 地點類別,最多 200 個字符。 | |
address | 字串 | 否 | 地點地址,最多 500 個字符。 | |
location | 物件 { lat, lng } | 否 | 地點座標。 | |
lang | 字串 | 否 | "en" | 回答語言,最多 35 個字符。 |
description | 字串 | 否 | 已知的地點說明,最多 4,000 個字符。 | |
website | 字串 | 否 | 地點網站(如已知),最多 2,048 個字符。 | |
stores_preview | { name } 物件陣列 | 否 | 已知位於該地點的商家,最多 50 個,每項的 name 最多 200 個字符。其他成員會被忽略。 | |
button_id、session_id、place_id | 字串 | 否 | 用於關聯請求的自定義標識符,每個最長 128 個字符。 |
本表未列出的欄位會被忽略。長度超限的欄位會在產生答案之前,以 422 field_too_long 拒絕。
curl -N https://api.kaleidr.com/inference-api/b2b/v1/chat/button/stream \
-H "Authorization: Bearer $KALEIDR_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "What is this place known for?",
"place_name": "Louvre Museum",
"place_type": "museum",
"location": {"lat": 48.8606, "lng": 2.3376}
}'
event: start
data: {"type": "start", "query_type": "…"}
data: {"text": "The Louvre is best known for"}
event: end
data: {"type": "end", "full_text": "The Louvre is best known for…", "reply": "The Louvre is best known for…", "query_type": "…", "first_token_ms": 820, "total_ms": 3900, "total_tokens": 640}
| 狀態碼 | 錯誤碼 | 觸發條件 |
|---|---|---|
| 413 | request_too_large | 要求主體超過 2 MiB。 |
| 422 | field_too_long | 某欄位超長,或 stores_preview 超過 50 項。回應體為 {"detail": "field_too_long"}。 |
| 500 | Button chat stream error | 無法讀取要求主體或沒有 query。此端點對其他格式不正確的要求主體也返回 500,而不是 422。 |
| 429 | quota_exceeded | AI 積分池不足以支付請求。 |
POST /design/analyze
檢查表格的欄位與樣本,並建議適當的地圖呈現方式。
嵌入式 Editor 不會呼叫設計端點。這些端點是供您自己的工具使用的 REST 介面。
**驗證:**伺服器金鑰、工作階段權杖或舊 版金鑰。權限範圍:design.
**費用:**AI 點數,每次成功呼叫收取固定費用。失敗的呼叫不收費。
| 欄位 | 類型 | 必填 | 說明 |
|---|---|---|---|
columns | 字串陣列 | 是 | 1 至 256 個列名,不能重復。 |
sampleRows | 物件陣列 | 否 | 最多 1,000 行,每行使用列名作為物件鍵。 |
datasetName | 字串 | 否 | 最多 512 個字符。 |
rowCount | 整數 | 否 | 整個資料表的行數,不小於 0。 |
userGoal | 字串 | 否 | 最多 1,000 個字符:地圖需要展示甚麼。 |
supportedStyles | 字串陣列 | 否 | 可選的樣式 ID,由小寫字母單詞和連字符組成。 |
欄位名稱使用 camelCase。未知欄位會被忽略。
curl -s https://api.kaleidr.com/inference-api/b2b/v1/design/analyze \
-H "Authorization: Bearer $KALEIDR_KEY" \
-H "Content-Type: application/json" \
-d '{
"datasetName": "stores.csv",
"columns": ["name", "lat", "lng", "revenue"],
"sampleRows": [
{"name": "Downtown", "lat": 40.7128, "lng": -74.0060, "revenue": 120000},
{"name": "Uptown", "lat": 40.7831, "lng": -73.9712, "revenue": 86000}
],
"rowCount": 240,
"userGoal": "Show which stores earn the most"
}'
{
"datasetProfile": { "…": "what was detected in each column" },
"designPlan": { "…": "the recommended style, theme and reasoning" },
"issues": [],
"recommendation": { "…": "…" },
"suggestedConfig": { "…": "…" },
"explanation": "…"
}
請讀取 designPlan;它可能為 null。recommendation