43 KiB
AI 倧è · 对å çšåºè°çšæ¥å£è¯Žæ
æ¬ææ¡£äŸ å éš AI 倧è / èªåšåçšåº åšåç 莹çšãçšéã莊åãèµæºåœå± çé®é¢æ¶è°çš CloudCost å端䜿çšã
- èåŽïŒä»¥ åªè¯»ïŒGETïŒ äžºäž»ã
- ååº JSON 纊å®ïŒ
dateâYYYY-MM-DDå笊䞲datetimeâ æ¬å°æ¶éŽ ISO8601ïŒæ æ¶åºåçŒïŒäŸïŒ2026-04-18T18:01:19.142386ïŒ- éé¢ / çšéïŒéèŠïŒïŒ
- èåå / 仪衚çç±»æ¥å£ïŒ
/api/dashboard/*ã/api/service-accounts/{id}/costsã/api/service-accounts/daily-reportã/api/dashboard/overviewïŒâ JSON numberïŒfloatïŒ - åå§æç»ç±»æ¥å£ïŒ
/api/metering/*ã/api/billing/detailïŒâ JSON stringïŒå端ä¿ç Decimal 粟床ïŒïŒéfloat(...)/parseFloat(...)è§£æ
- èåå / 仪衚çç±»æ¥å£ïŒ
- 宿Žè·¯ç±æž åïŒè§ API.mdã
1. 讀è¯äœç³»æŠè¿°
äºç®¡å端已æ¥å ¥ Casdoor ç»äžè®€è¯ïŒææè¯·æ±ïŒé€å¿åçœååå€ïŒå¿ é¡»æºåžŠåæ³åæ®ã
1.1 äžç§è®€è¯æ¹åŒ
| æ¹åŒ | Header | éçšåºæ¯ | è§è²æ¥æº |
|---|---|---|---|
| Casdoor OAuth Cookie | æµè§åšèªåšæºåžŠ cc_access_token |
äººç±»çšæ·éè¿å端ç»åœ | Casdoor token äžç roles |
| Casdoor Bearer Token | Authorization: Bearer <token> |
å éšç³»ç»éŽè°çšïŒclient_credentialsïŒ | token roles é空æ¶çš tokenïŒäžºç©ºæ¶ fallback å° DB users.roles |
| API Key | X-API-Key: cck_xxx |
äžæ¹å¯¹æ¥ / ç»ç²åºŠæéæ§å¶ | DB users.rolesïŒowner çšæ·ïŒ |
AI 倧è / å
éšç³»ç»æšèäœ¿çšæ¹åŒ 2ïŒCasdoor Bearer TokenïŒïŒå 䞺ææå
éšç³»ç»å·²åš Casdoor 泚åäºåºçšïŒç»äžèµ° client_credentials æ¿ token å³å¯ã
1.2 å䞪è§è²
| è§è² | æéèåŽ |
|---|---|
cloud_admin |
å šéšåèœ + å šéæ°æ®ïŒè¶ 级è§è²ïŒèªåšæ»¡è¶³ä»»äœè§è²èŠæ±ïŒ |
cloud_ops |
dashboard + è§Šå忥 |
cloud_finance |
dashboard + 莊å管ç |
cloud_viewer |
dashboard åªè¯» |
è§è² â åç«¯é¡µé¢æ å°
ââââââââââââââââââââââââââââââââââââââââââââââ¬ââââââââââââââ¬ââââââââââââââââ¬ââââââââââââââââ¬ââââââââââââââââ â åç«¯é¡µé¢ â cloud_admin â cloud_ops â cloud_finance â cloud_viewer â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â 仪衚ç / (Dashboard) â â â â â â â â â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â ç»è®¡ /daily-report (æ¥æ¥/莊åæç») â â â â â â â â â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â 计é /metering â â â â â â â â â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â åèŠ /alerts â â â â â â â â â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â 莧æºç®¡ç /accounts (äºèŽŠå·ç®¡ç) â â å¯å¢å æ¹ â â åªèœçå衚 â â åªèœçå衚 â â åªèœçå衚 â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â äŸåºå管ç /suppliers â â å¯å¢å æ¹ â â â â â â â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒââââââââââââââââ€ â æš¡å管ç /azure-deploy â â â â â â â â â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â Azure æ¥å ¥ /azure-onboard â â â â â â â â â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â 项ç®è¯Šæ /projects/[id] â â å¯ç®¡ç â â åªè¯» â â åªè¯» â â åªè¯» â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â Header äžç 忥æé® â â â â â â â â â ââââââââââââââââââââââââââââââââââââââââââââââŒââââââââââââââŒââââââââââââââââŒââââââââââââââââŒâââââââââââââââ†â Header äžç 莊å管çïŒçæ/è°æŽ/确讀莊åïŒ â â â â â â â â â ââââââââââââââââââââââââââââââââââââââââââââââŽââââââââââââââŽââââââââââââââââŽââââââââââââââââŽââââââââââââââââ
åè§è²è¯Šç»è¯Žæ
cloud_admin â è¶ çº§ç®¡çå
èœçšææé¡µé¢çå šéšåèœïŒé¢å€è¿æïŒ
- çšæ·ç®¡çãæéåé ïŒ/api/admin/users/*ïŒ
- äºèŽŠå·å¢å æ¹ïŒ/api/cloud-accounts/ POST/PUT/DELETEïŒ
- æš¡ååŒå ³ïŒ/api/api-permissions/ïŒ
- API Key 管ç
- Azure éšçœ²å OAuth ææ
- æ°æ®èåŽïŒçå°å šéæ°æ®ïŒäžå cloud_account_grant éå¶
cloud_ops â è¿ç»Ž
- 仪衚çïŒâ å šéšçæ¿æ°æ®
- ç»è®¡/æ¥æ¥ïŒâ 莊åæç»æ¥çå富åº
- 忥æäœïŒâ è§Šåæ°æ®åæ¥ãæ¥ç忥æ¥å¿ïŒ/api/sync/*ïŒ
- åèŠïŒâ æ¥ç
- 计éïŒâ æ¥ç
- â äžèœç®¡çäºèŽŠå·/äŸåºå/Azure éšçœ²/莊å
- æ°æ®èåŽïŒä» é被ææçäºèŽŠå·ïŒéè¿ UserCloudAccountGrantïŒ
cloud_finance â 莢å¡
- 仪衚çïŒâ å šéšçæ¿æ°æ®
- ç»è®¡/æ¥æ¥ïŒâ 莊åæç»æ¥çå富åº
- 莊å管çïŒâ çæãè°æŽãç¡®è®€ãæ è®°å·²ä»ïŒ/api/bills/*ïŒ
- åèŠïŒâ æ¥ç
- 计éïŒâ æ¥ç
- â äžèœè§Šå忥ãäžèœç®¡çäºèŽŠå·/äŸåºå/Azure
- æ°æ®èåŽïŒä» é被ææçäºèŽŠå·
cloud_viewer â åªè¯»æ¥çè
- 仪衚çïŒâ åªè¯»
- ç»è®¡/æ¥æ¥ïŒâ åªè¯» + 富åº
- åèŠïŒâ åªè¯»
- 计éïŒâ åªè¯»
- â å ¶ä»ææç®¡çæäœéœäžå¯çš
- æ°æ®èåŽïŒä» é被ææçäºèŽŠå·
è§è²ç®¡çæ¹åŒïŒ
- äººç±»çšæ·ïŒåš Casdoor åå° â Roles â ç»çšæ·åé è§è²ïŒç»åœæ¶èªåšåžŠå ¥
- æºåšåºçšïŒclient_credentialsïŒïŒCasdoor token äžæºåžŠè§è²ïŒç®¡çåéè¿ SQL 讟眮 DB äžç
users.roles
1.3 æš¡ååŒå ³
æ¯äžªäžå¡è·¯ç±ç»å®äžäžªæš¡ååïŒåŠ dashboardãbillingïŒã管çåå¯éè¿ PATCH /api/api-permissions/<module> å
šå±å
³åææš¡åïŒå
³ååææèº«ä»œè°çšéœäŒ 403ãAI åºäŒé
é级ïŒäžèŠæ 403 åœæ
éã
1.4 æ°æ®å¯è§èåŽ
åäžäžª URLïŒäžå身仜è¿åçæ°åŒäžåïŒ
cloud_adminïŒæ é¢å€éå¶ïŒâ å šéæ°æ®- é admin â ä»
çå°
user_cloud_account_grants衚é被ææçäºèŽŠå·æ°æ® - Dashboard è忥å£åš SUM ä¹åå WHERE è¿æ»€ïŒçŸåæ¯/å¢é¿çåºäºè¿æ»€åæ°æ®éç®
- åŠææ²¡æå¯è§æ°æ®ïŒè¿å空æ°ç»æé¶åŒïŒäžæ¯ 403ïŒ
AI åçæ¶åºè¯Žæ"åœåè§è§å "çæ°æ®ïŒé¿å ææéè§è§è¯¯æ¥äžºå šéã
2. AI å€§èæ¥å ¥æå
2.1 è·å TokenïŒCasdoor client_credentialsïŒ
CASDOOR=https://casdoor.ashyglacier-8207efd2.eastasia.azurecontainerapps.io
TOKEN=$(curl -s -X POST "$CASDOOR/api/login/oauth/access_token" \
-d "grant_type=client_credentials&client_id=<äœ çAPP_CLIENT_ID>&client_secret=<äœ çAPP_CLIENT_SECRET>" \
| python -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
- token é»è®€æææ 24 å°æ¶ïŒè°çšæ¹åºçŒåå¹¶åšè¿æåå·æ°
- éŠæ¬¡äœ¿çšè¯¥ token è°çšäºç®¡ API æ¶ïŒå端äŒèªåšåš
users衚åå»ºäžæ¡è®°åœïŒcasdoor_sub=admin/<app_name>ïŒroles=[]ïŒ - 管çåéæå讟眮è§è²ïŒåŠåææéèŠè§è²çæ¥å£è¿å 403ïŒïŒ
UPDATE users SET roles='["cloud_admin"]'::jsonb WHERE casdoor_sub='admin/<app_name>';
2.2 è°çšæ¥å£
BASE=https://cloudcost-brank.yellowground-bf760827.southeastasia.azurecontainerapps.io
# 确讀身仜äžå¯è§èåŽ
curl -s -H "Authorization: Bearer $TOKEN" "$BASE/api/auth/me"
# åœæéŠé¡µ bundle
curl -s -H "Authorization: Bearer $TOKEN" "$BASE/api/dashboard/bundle?month=2026-04"
# æç»å页
curl -s -H "Authorization: Bearer $TOKEN" \
"$BASE/api/metering/detail?date_start=2026-04-01&date_end=2026-04-30&provider=aws&page=1&page_size=100"
2.3 /api/auth/me ååºè¯Žæ
{
"id": 4,
"username": "sales",
"email": "",
"display_name": "Sales App (M2M)",
"roles": ["cloud_admin"],
"visible_cloud_account_ids": null
}
visible_cloud_account_idsïŒ
nullâ å šéå¯è§ïŒcloud_admin身仜ïŒ[]â é¶å¯è§ïŒæªè¢«ææä»»äœäºèŽŠå·ïŒ[1, 2]â åªèœçå°è¿äºäºèŽŠå·çæ°æ®
2.4 é误ç
| HTTP ç¶æç | å«ä¹ | AI åºå¯¹ |
|---|---|---|
200 |
æå | æ£åžžè§£æ |
401 |
æªåžŠåæ®æ token è¿æ | å·æ° token åéè¯ |
403 missing required role |
è§è²äžè¶³ | 该æ¥å£å¯¹åœå身仜äžå¯çšïŒè·³è¿ |
403 Module 'x' is disabled |
æš¡å被管çåå ³å | äŒé é级ïŒäžæ¥æ é |
422 |
åæ°æ ¡éªå€±èŽ¥ | æ£æ¥ Query åæ°æ ŒåŒ |
503 |
æ°æ®åºäžå¯èŸŸ | çšåéè¯ |
3. æ¥å£å级
| çº§å« | å«ä¹ |
|---|---|
| P0 æšè | èŽ¹çšæ»è§ãè¶å¿ã计éèåã莊åæç»åé¡µãæ°æ®æ°é²åºŠ |
| P1 è¡¥å | 绎床æåïŒåç±»/åºå/é¡¹ç®æè¡ïŒãæå¡èŽŠå·äžäžæãæåºŠèŽŠåãåèŠéåŒæ§è¡æ |
| P2 å¯é | èµæºæž åãæ±çãåç±»åå žã富åºç±»æµåŒæ¥å£ïŒéåèœçïŒäžéåçŽæ¥å¡è¿æš¡åäžäžæïŒ |
| çŠæ¢ | ä»»äœ åæäœãåæ®è§£å¯ãåæ¥è§Šåãå é€ãAzure éšçœ²ã以åè¿å webhook/é®ç®± çææé çœ®çæ¥å£ |
4. P0 æšèæ¥å£ïŒå ¥å / åºåïŒ
4.1 GET /api/health
çšéïŒè¿éæ§æ¢æµïŒå¿åå¯è®¿é®ïŒã
åºåïŒ
{ "status": "ok" }
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
status |
string | æ»æ¯ "ok"ïŒä»
æ€äžå段ã倱莥æ¶äŒè¢« FastAPI 500 èŠçïŒäžè¿åæ€å¯¹è±¡ |
4.2 GET /api/sync/last
çšéïŒåçãæ°æ®åæ¥å°ä»ä¹æ¶åããæš¡åïŒsyncïŒè§è²ïŒcloud_opsïŒå« adminïŒã
åºåïŒç宿 ·äŸïŒïŒ
{ "last_sync": "2026-04-18T18:01:19.142386" }
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
last_sync |
string | null | æè¿äžæ¬¡ æå åæ¥ç»ææ¶éŽ ISO8601ïŒæ¬å°æ¶éŽïŒæ æ¶åºïŒã仿ªåæ¥è¿æ¶äžº null |
4.3 GET /api/dashboard/bundle
çšéïŒåæ¬¡è¯·æ±æ¿éŠé¡µçº§æ»è§ãæš¡åïŒdashboardïŒè§è²ïŒcloud_viewer / cloud_ops / cloud_financeïŒä»»äžå³å¯ïŒcloud_admin èªåšéè¿ïŒã
å ¥åïŒQueryïŒïŒ
| åæ° | ç±»å | å¿ å¡« | 诎æ |
|---|---|---|---|
month |
string | æ¯ | YYYY-MMïŒç»è®¡æ |
granularity |
string | åŠ | daily | weekly | monthlyïŒé»è®€ daily |
service_limit |
int | åŠ | 1â100ïŒé»è®€ 10 |
åºåïŒç宿 ·äŸïŒæªæïŒïŒ
{
"overview": {
"total_cost": 149785.098288,
"prev_month_cost": 938396.218412,
"mom_change_pct": -84.04,
"active_projects": 7
},
"trend": [
{ "date": "2026-04-01", "cost": 7399.860517,
"cost_by_provider": { "aws": 466.038035, "azure": 962.156064, "gcp": 5971.666418 } }
],
"by_provider": [
{ "provider": "gcp", "cost": 124735.119318, "percentage": 83.28 },
{ "provider": "azure", "cost": 18058.538325, "percentage": 12.06 }
],
"by_service": [
{ "product": "Vertex AI", "cost": 124410.727567, "percentage": 83.06 },
{ "product": "Virtual Machines", "cost": 6202.288351, "percentage": 4.14 }
]
}
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
overview.total_cost |
number | åœææ»è޹çšïŒUSDïŒå¯¹åœå身仜å¯è§èåŽæ±åïŒ |
overview.prev_month_cost |
number | äžæåå£åŸæ»èŽ¹çš |
overview.mom_change_pct |
number | ç¯æ¯åå %ïŒä¿ç䞀äœå°æ°ïŒå¯èœèŽåŒ |
overview.active_projects |
integer | status=active çæå¡èŽŠå·æ° |
trend[].date |
string | YYYY-MM-DD |
trend[].cost |
number | åœæ¥å š provider åè®¡èŽ¹çš |
trend[].cost_by_provider |
object | åœ¢åŠ { "aws":âŠ, "gcp":âŠ, "azure":⊠}ïŒåªå
å«åœæ¥ææ°æ®ç provider |
by_provider[] |
array | æ provider åœæçŽ¯è®¡ïŒcost + percentageïŒå total_cost çŸåæ¯ïŒä¿ç䞀äœå°æ°ïŒ |
by_service[] |
array | Top N æå¡ïŒproduct åæ ·å笊䞲ïŒïŒN ç± service_limit æ§å¶ |
4.4 GET /api/dashboard/overview
çšéïŒåªèŠæåºŠæ»è§å¡çæ°æ®ã
å
¥åïŒQueryïŒïŒmonthïŒå¿
å¡«ïŒYYYY-MMïŒã
åºåïŒç宿 ·äŸïŒïŒ
{
"total_cost": 149785.098288,
"prev_month_cost": 938396.218412,
"mom_change_pct": -84.04,
"active_projects": 7
}
åæ®µå §4.3 overviewã
4.5 GET /api/metering/summary
çšéïŒææ¡ä»¶æ±æ»çšé/莹çšãæš¡åïŒmeteringïŒè§è²ïŒä»»æç»åœå³å¯ã
å ¥åïŒQueryïŒïŒ
| åæ° | ç±»å | å¿ å¡« | 诎æ |
|---|---|---|---|
date_start |
string | åŠ | YYYY-MM-DD |
date_end |
string | åŠ | YYYY-MM-DD |
provider |
string | åŠ | aws / gcp / azure |
product |
string | åŠ | 产å/æå¡å |
account_id |
int | åŠ | æå¡èŽŠå· ID |
supply_source_id |
int | åŠ | èŽ§æº ID |
supplier_name |
string | åŠ | äŸåºååç§° |
data_source_id |
int | åŠ | æ°æ®æº ID |
åºåïŒç宿 ·äŸïŒæ³šæ total_cost / total_usage æ¯å笊䞲ïŒïŒ
{
"total_cost": "149785.098288",
"total_usage": "55555350118.525461",
"record_count": 62016,
"service_count": 43
}
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
total_cost |
stringïŒDecimalïŒ | çéèåŽå
ç莹çšå计ïŒUSDãè°çšæ¹èªè¡ float(...) |
total_usage |
stringïŒDecimalïŒ | çšéåè®¡ãæ³šæäžå product ç usage_unit äžåïŒçŽæ¥æ±åæä¹æé |
record_count |
integer | åœäžç billing_data è¡æ° |
service_count |
integer | äžå product å»éæ° |
4.6 GET /api/metering/daily
çšéïŒææ¥èå莹çšäžçšéãå
¥åå metering/summaryã
åºåïŒç宿 ·äŸïŒïŒ
[
{ "date": "2026-04-01", "usage_quantity": "2327753993.353517",
"cost": "7399.860517", "record_count": 2745 },
{ "date": "2026-04-02", "usage_quantity": "1300687882.204744",
"cost": "6175.577245", "record_count": 2974 }
]
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
date |
string | YYYY-MM-DD |
cost |
stringïŒDecimalïŒ | åœæ¥è޹çšå计 |
usage_quantity |
stringïŒDecimalïŒ | åœæ¥çšéå计ïŒè·š productïŒåäœäžå®ïŒ |
record_count |
integer | åœæ¥åœäžçæç»è¡æ° |
4.7 GET /api/metering/by-service
çšéïŒææå¡èåïŒTop N åæïŒãå
¥åå summaryïŒæ product è¿æ»€ïŒã
åºåïŒç宿 ·äŸïŒïŒ
[
{ "product": "Vertex AI", "usage_quantity": "55518458336.183727",
"usage_unit": "month", "cost": "124410.727567", "record_count": 58924 },
{ "product": "Cloud Text-to-Speech API", "usage_quantity": "18315835.000000",
"usage_unit": "count", "cost": "315.170942", "record_count": 101 }
]
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
product |
string | åæ ·æå¡åïŒå«ç©ºæ Œå€§å°åïŒååäœäžå usage_unit äŒåå«åºç°ïŒå端æ (product, unit) åç»ååšæ€åå¹¶ïŒè§ usage_unitïŒ |
cost |
stringïŒDecimalïŒ | 该æå¡çéèåŽå ç莹çšå计 |
usage_quantity |
stringïŒDecimalïŒ | çšéå计ïŒä»
åšè¯¥æå¡äœ¿çšåäž usage_unit æ¶å¯çŽæ¥é
读 |
usage_unit |
string | null | 该æå¡ççšéåäœïŒåŠæåå product æå€ç§åäœïŒå端åä»»äž |
record_count |
integer | è¡æ° |
4.8 GET /api/metering/detail
çšéïŒåå§æç»è¡å页ãå
¥ååš summary åºç¡äžå¢å pageïŒé»è®€ 1ïŒãpage_sizeïŒé»è®€ 50ïŒæå€§ 500ïŒã
åºåïŒç宿 ·äŸïŒïŒ
[
{
"id": 1819145,
"date": "2026-04-18",
"provider": "gcp",
"data_source_id": 3,
"project_id": "ysgemini-20260324",
"product": "Cloud Text-to-Speech API",
"usage_type": "Cloud TTS API text input token count for Gemini 2.5 Pro",
"region": "asia-southeast1",
"cost": "0.031815",
"usage_quantity": "31815.000000",
"usage_unit": "count",
"currency": "USD"
}
]
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
id |
integer | æç»äž»é®ïŒbilling_data.idïŒ |
date |
string | YYYY-MM-DD èŽŠåæ¥æ |
provider |
string | aws / gcp / azure |
data_source_id |
integer | æ°æ®æº FK |
project_id |
string | äºååäŸ§é¡¹ç® IDïŒGCP project / Azure subscription / AWS accountïŒïŒäžæ¯æ¬å° projects.id |
product |
string | null | æå¡å |
usage_type |
string | null | 计莹类å / SKU å |
region |
string | null | åºå |
cost |
stringïŒDecimalïŒ | 该æ¡èŽ¹çš USD |
usage_quantity |
stringïŒDecimalïŒ | çšé |
usage_unit |
string | null | çšéåäœ |
currency |
string | æ»æ¯ "USD" |
4.9 GET /api/metering/detail/count
çšéïŒäž detail åç鿡件äžçæ»æ¡æ°ã
åºåïŒ{ "total": 62016 }
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
total |
integer | è¡æ°ïŒå页计ç®çš |
4.10 GET /api/billing/detail
çšéïŒè®¡è޹æç»åè¡šãæš¡åïŒbillingïŒè§è²ïŒä»»æç»åœãæ°æ®æå¯è§æ°æ®æºè¿æ»€ã
å ¥åïŒQueryïŒïŒ
| åæ° | ç±»å | 诎æ |
|---|---|---|
date_start |
string | YYYY-MM-DD |
date_end |
string | YYYY-MM-DD |
provider |
string | å¯é |
project_id |
string | å¯é |
product |
string | å¯é |
page |
int | é»è®€ 1 |
page_size |
int | é»è®€ 50ïŒæå€§ 500 |
åºåïŒç宿 ·äŸïŒïŒ
[
{
"id": 1759843,
"date": "2026-04-18",
"provider": "azure",
"data_source_id": 2,
"project_id": "45d7a360-af09-40fc-9afc-56dc475245ec",
"project_name": "Xmindè¿è¥åŠä¹ äžçš2026",
"product": "API Management",
"usage_type": "Consumption Calls",
"region": "southeastasia",
"cost": "0.000000",
"usage_quantity": "0.083300",
"usage_unit": "10K",
"currency": "USD"
}
]
åæ®µå€§èŽå /metering/detailïŒé¢å€å段ïŒ
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
project_name |
string | null | äºåå䟧è¿åçé¡¹ç®æŸç€ºåïŒAWS æªå¿ æïŒGCP/Azure 倿°æïŒ |
cost / usage_quantity ä»äžº string (Decimal)ã
4.11 GET /api/billing/detail/count
çšéïŒäž billing/detail çžåçéäžçæ»è¡æ°ã
åºåïŒ{ "total": 62016 }
5. P1 è¡¥å æ¥å£
5.1 Dashboard 绎床æå
æš¡åïŒdashboardïŒè§è²ïŒcloud_viewer / cloud_ops / cloud_financeïŒå« adminïŒãæ°æ®æå¯è§æ°æ®æºè¿æ»€ãææ cost åæ®µå䞺 JSON numberïŒfloatïŒã
GET /api/dashboard/trend
å
¥åïŒstartãendïŒå YYYY-MMïŒïŒgranularityïŒdaily é»è®€ / weekly / monthlyïŒã
åºåïŒ[{ date, cost, cost_by_provider }]ïŒç»æå §4.3 trend[]ã
GET /api/dashboard/by-provider
å
¥åïŒmonthãåºåç宿 ·äŸïŒ
[
{ "provider": "gcp", "cost": 124735.119318, "percentage": 83.28 },
{ "provider": "azure", "cost": 18058.538325, "percentage": 12.06 }
]
| åæ®µ | 诎æ |
|---|---|
provider |
aws/gcp/azure |
cost |
åœæçŽ¯è®¡ USD |
percentage |
å åœææ»è޹çšçŸåæ¯ïŒäž€äœå°æ°ïŒ |
GET /api/dashboard/by-category
å
¥åïŒmonthãåºåç宿 ·äŸïŒ
[{ "category_id": 2, "name": "default", "original_cost": 24846.617897,
"markup_rate": 1.15, "final_cost": 28573.61058155 }]
| åæ®µ | 诎æ |
|---|---|
category_idãname |
莹çšåç±» |
original_cost |
åå§ææ¬ïŒæªå ä»·ïŒ |
markup_rate |
å ä»·çïŒ1.0 = äžå ä»·ïŒ |
final_cost |
= original_cost à markup_rate |
GET /api/dashboard/by-project
å
¥åïŒmonthïŒlimitïŒ1â100ïŒé»è®€ 10ïŒãåºåç宿 ·äŸïŒ
[
{ "project_id": "xianlong-2", "name": "xianlong-2",
"provider": "gcp", "cost": 58749.779907 }
]
| åæ®µ | 诎æ |
|---|---|
project_id |
äºååäŸ§é¡¹ç® IDïŒå笊䞲ïŒïŒå³ GCP project / Azure subscription / AWS accountãäžæ¯æ¬å° projects.id |
name |
莊åäžç项ç®åïŒäºååè¿åïŒ |
provider |
aws/gcp/azure |
cost |
åœæçŽ¯è®¡ USD |
GET /api/dashboard/by-service
å
¥åïŒmonthïŒproviderïŒå¯éïŒïŒlimitïŒ1â100ïŒãåºåç宿 ·äŸïŒ
[
{ "product": "Vertex AI", "cost": 124410.727567, "percentage": 83.06 },
{ "product": "Virtual Machines", "cost": 6202.288351, "percentage": 4.14 }
]
åæ®µå dashboard/by-providerïŒpercentage çžå¯¹åœæ totalïŒã
GET /api/dashboard/by-region
å
¥åïŒmonthãåºåç宿 ·äŸïŒ
[
{ "region": "asia-east1", "provider": "gcp", "cost": 38836.928387 },
{ "region": "asia-southeast1", "provider": "gcp", "cost": 9817.383452 }
]
GET /api/dashboard/top-growth
å
¥åïŒperiodïŒé»è®€ 7dïŒïŒlimitïŒ1â50ïŒãåºåç宿 ·äŸïŒ
[
{ "project_id": "lyww-01", "name": "lyww-01",
"current_cost": 3775.070699, "previous_cost": 5e-05,
"growth_pct": 7550141298.0 }
]
| åæ®µ | 诎æ |
|---|---|
project_id |
å€éšé¡¹ç® ID å笊䞲 |
current_cost / previous_cost |
æ¬åšæ / 对æ¯åšæçŽ¯è®¡ USD |
growth_pct |
å¢å¹
%ïŒprevious æ¥è¿ 0 æ¶å¯èœé垞倧 |
GET /api/dashboard/unassigned
å
¥åïŒmonthãåºåç宿 ·äŸïŒæªäžæ¬å° projects 衚å
³èäžçå€éšé¡¹ç®ïŒïŒ
[
{ "project_id": "xianlong-2", "name": "xianlong-2",
"provider": "gcp", "cost": 58749.779907, "status": null }
]
| åæ®µ | 诎æ |
|---|---|
project_id / name / provider |
å by-project |
cost |
åœæçŽ¯è®¡ USD |
status |
æ»æ¯ nullïŒprojects è¡šéæ²¡æå¯¹åºè¡ïŒïŒä¿çåæ®µä»¥äŸ¿æªæ¥æ©å± |
5.2 GET /api/service-accounts/
æš¡åïŒservice_accountsïŒè§è²ïŒä»»æç»åœïŒå衚æ¥çææè§è²å¯çšïŒãè·¯åŸéåžŠå°Ÿéšææ ã
å
¥åïŒQueryïŒïŒproviderãstatusãcustomer_codeïŒæå®¢æ·çŒå·åæ¥ïŒãpageãpage_sizeã
åºåïŒç宿 ·äŸïŒïŒ
[
{
"id": 7,
"name": "AWS-Main",
"supply_source_id": 2,
"supplier_name": "ç¥å·æ³°å²³",
"provider": "aws",
"external_project_id": "675139393309",
"status": "standby",
"order_method": null,
"customer_codes": [],
"created_at": "2026-04-08T10:19:32.565267"
}
]
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
id |
integer | æ¬å°æå¡èŽŠå·äž»é® |
name |
string | èŽŠå·æŸç€ºå |
supply_source_id / supplier_name |
integer / string | æå±èŽ§æº + äŸåºåå |
provider |
string | aws/gcp/azureïŒæ¥èª supply_sourceïŒ |
external_project_id |
string | äºåå䟧 IDïŒAWS account ID / GCP project / Azure subscriptionïŒ |
status |
string | active / standby / inactive |
order_method |
string | null | ä» Azure èŽŠå·ææä¹ïŒMCCL-EA / HK CSP çäžåæ¹åŒïŒ |
customer_codes |
string[] | éå®ç³»ç»äžåç客æ·çŒå·ïŒå€§ååœäžåïŒç©ºæ°ç» = æªåé |
created_at |
string | å建æ¶éŽ ISO8601 |
status 掟çè§åïŒå端 _recompute_statusïŒïŒ
inactiveïŒäººå·¥åçšïŒâ äžåšïŒæé«äŒå 级- åŠåïŒ
customer_codesé空 âactiveïŒäžºç©º âstandby - è§Šåæ¶æºïŒ
PUT /{id}垊customer_codesãPOST /{id}/activateãPOST /customer-assignments/syncå
5.3 GET /api/service-accounts/{account_id}
åºåïŒç宿 ·äŸïŒæªåïŒïŒ
{
"id": 7,
"name": "AWS-Main",
"supply_source_id": 2,
"supplier_id": 3,
"supplier_name": "ç¥å·æ³°å²³",
"provider": "aws",
"external_project_id": "675139393309",
"status": "standby",
"notes": null,
"order_method": null,
"customer_codes": [],
"secret_fields": ["aws_access_key_id", "aws_secret_access_key", "account_id"],
"created_at": "2026-04-08T10:19:32.565267",
"history": [
{ "id": 39, "action": "activated", "from_status": "standby", "to_status": "standby",
"operator": "xiaohei", "customer_code": null, "notes": null,
"created_at": "2026-04-18T19:21:38.081899" },
{ "id": 36, "action": "customer_unbound", "from_status": "active", "to_status": "active",
"operator": "sales", "customer_code": "SYNC_C1", "notes": "sales batch sync",
"created_at": "2026-04-18T19:10:00.000000" }
]
}
åè¡šåæ®µå §5.2ã诊æ é¢å€å段ïŒ
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
supplier_id |
integer | äŸåºå FK |
notes |
string | null | 莊å·å€æ³š |
secret_fields |
string[] | 莊å·åæ®å段åïŒäžå«åŒïŒïŒäŸåŠ aws_access_key_idãclient_secret |
history[] |
array | ç¶æåæŽ + 客æ·çŒå·åæŽåå²ïŒæ created_at DESC |
history[].action |
string | è§äžè¡š |
history[].from_status / to_status |
string | null | ä» ç¶æç±»äºä»¶é空 |
history[].operator |
string | null | è§Šåè
çšæ·åïŒéå®ç³»ç»åæ¥èµ° "sales-sync"/æºåšèŽŠå·å |
history[].customer_code |
string | null | ä»
customer_* äºä»¶é空 |
history[].notes |
string | null | é宿¹é忥äŒå "sales batch sync" |
action æäžŸïŒ
| åŒ | å«ä¹ |
|---|---|
created |
å建莊å·ïŒæ³šïŒèæ°æ®å¯èœè®°äžº assignedïŒ |
suspended |
人工åçš |
activated |
ä»åçš/å€çšæ¢å€ |
customer_bound |
ç»å®äžäžªå®¢æ·çŒå· |
customer_unbound |
è§£é€äžäžªå®¢æ·çŒå· |
customer_batch_synced |
é宿¹éåæ¥ïŒæ€äºä»¶åç¬è®°åœæ¶äœ¿çšïŒéåžžé䞪å bound/unboundïŒ |
5.4 GET /api/service-accounts/{account_id}/costs
è§è²ïŒä»»æç»åœïŒå·²æŸå®œïŒã
å
¥åïŒQueryïŒïŒstart_dateãend_dateïŒå¿
å¡«ïŒYYYY-MM-DDïŒã
åºåïŒç宿 ·äŸïŒæªåïŒïŒ
{
"total_cost": 6991.440645000001,
"total_usage": 5303.442484,
"services": [
{ "service": "Claude Opus 4.6 (Amazon Bedrock Edition)",
"cost": 5280.532382, "usage_quantity": 2690.11845, "usage_unit": "Units" },
{ "service": "Claude Sonnet 4.6 (Amazon Bedrock Edition)",
"cost": 1246.2185079999997, "usage_quantity": 1582.6575039999998, "usage_unit": "Units" }
],
"daily": [
{ "date": "2026-04-01", "cost": 45.23, "usage_quantity": 12.0 }
],
"daily_by_service": [
{ "date": "2026-04-01", "service": "AWS Cost Explorer",
"cost": 0.01, "usage_quantity": 1.0, "usage_unit": "Requests" }
]
}
æ¬æ¥å£ç cost/usage æ¯ JSON numberïŒfloatïŒïŒäž /metering/* äžåïŒã
| åæ®µ | 诎æ |
|---|---|
total_cost / total_usage |
æ¬èŽŠå·åš date åºéŽå çæ±æ» |
services[].service |
产ååïŒå¯¹åº billing_data.productïŒ |
services[].usage_unit |
该产åççšéåäœïŒè¯¥äº§åæå€äžªåäœæ¶ïŒå端åå ¶äž |
daily[] |
ææ¥èŽ¹çš+çšéå计 |
daily_by_service[] |
ææ¥ à æå¡æåïŒçšäºå å åŸïŒ |
5.5 GET /api/service-accounts/daily-report
è§è²ïŒä»»æç»åœïŒå端ãç»è®¡ã页è°çšïŒviewer/ops/finance éœå¯è®¿é®ïŒã
å
¥åïŒQueryïŒïŒstart_dateãend_dateïŒå¿
å¡«ïŒïŒproviderïŒå¯éïŒã
åºåïŒç宿 ·äŸïŒïŒ
[
{
"account_id": 88,
"account_name": "chuhai èªçš",
"provider": "azure",
"external_project_id": "09e4b3a6-8159-4f14-b108-e4a18ace9212",
"date": "2026-04-01",
"product": "Foundry Models",
"cost": 2.438673
}
]
æ¯è¡ = (莊å·, æ¥æ, 产å) èååç costïŒJSON numberïŒfloatïŒãæ dateâexternal_project_idâproduct æåºã
| åæ®µ | 诎æ |
|---|---|
account_id |
æ¬å° projects.id |
account_name |
èŽŠå·æŸç€ºåïŒæ¬å° projects.nameïŒ |
provider |
aws/gcp/azure |
external_project_id |
äºåå䟧 ID |
date / product |
èŽŠåæ¥æ + æå¡ |
cost |
USD |
æ³šïŒæ€æ¥å£ç"æ¯æ¡è®°åœæ (莊å·, æ¥æ, 产å) èå"ïŒäžå¡å«ä¹æ¯å端ãç»è®¡ã页ãç©çæåš
service_accountsè·¯ç±äžïŒäœå·²å端ç¹çº§æéåºåââåªè¯»ç«¯ç¹ïŒå衚 / 诊æ / costs / daily-reportïŒä»»æç»åœå¯çšïŒææç«¯ç¹ïŒå建/å é€/æå/æ¢å€/åæ®/æ¹é忥ïŒécloud_adminã
5.6 GET /api/projects/ äž GET /api/projects/{project_id}
æš¡åïŒprojectsïŒè§è²ïŒä»»æç»åœïŒè¯»ïŒïŒåé cloud_adminã
/api/projects æ¯èç Project CRUDïŒå端äžäœ¿çšãå /api/service-accounts æååäžäžª projects 衚ïŒäœè¿ååæ®µå亀äºè¯ä¹ç¥æå·®åŒãAI éåžžè° service-accounts/ å³å¯ïŒè¿ç»æ¥å£ä»
äŸåå²éæã
å衚å
¥åïŒstatusãproviderãpageãpage_sizeã
åºåïŒç宿 ·äŸïŒå对象ïŒïŒ
{
"id": 7,
"name": "AWS-Main",
"supply_source_id": 2,
"provider": "aws",
"supplier_name": "ç¥å·æ³°å²³",
"external_project_id": "675139393309",
"data_source_id": 1,
"category_id": 2,
"status": "standby",
"notes": null,
"created_at": "2026-04-08T10:19:32.565267",
"updated_at": "2026-04-18T18:53:30.265359"
}
| åæ®µ | 诎æ |
|---|---|
data_source_id |
FK â data_sourcesïŒå¯¹åº /api/data-sources/ æ¡ç®ïŒ |
category_id |
FK â categoriesïŒè޹çšåç±» markup_rateïŒïŒå¯äžº null |
updated_at |
æè¿äžæ¬¡ update æ¶éŽ |
| å ¶å®å段 | å §5.2 |
泚æïŒæ¬æ¥å£äžè¿å
customer_codesãorder_methodãhistoryãéèŠè¿äºçš/api/service-accounts/{id}ã
5.7 GET /api/bills/
æš¡åïŒbillsïŒè§è²ïŒcloud_financeïŒå« adminïŒã
å
¥åïŒQueryïŒïŒmonthïŒYYYY-MMïŒãstatusãpageãpage_sizeã
åºåïŒå®é
è°çšè¯¥èŽŠå·åœæäžºç©º []ïŒå°æªçæèŽŠåïŒãåæ®µè¡šïŒæ¥èªå端 schemaïŒïŒ
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
id |
integer | 莊å id |
month |
string | YYYY-MM |
category_id |
integer | 莹çšåç±» FK |
provider |
string | aws/gcp/azure |
original_cost |
string/number | åå§ææ¬ USD |
markup_rate |
string/number | å ä»·çïŒ1.0=äžå ä»·ïŒ |
final_cost |
string/number | å ä»·åéé¢ |
adjustment |
string/number | äººå·¥è°æŽé¢ïŒæ£èŽçå¯ïŒ |
status |
string | draft / confirmed / paid |
confirmed_at |
string | null | 确讀æ¶éŽ |
notes |
string | null | 倿³š |
created_at |
string | å建æ¶éŽ |
5.8 GET /api/bills/{bill_id}
ååŒ æåºŠèŽŠå诊æ ïŒåäžç»æïŒå对象ïŒã
5.9 GET /api/alerts/rule-status
æš¡åïŒalertsïŒè§è²ïŒä»»æç»åœã
å
¥åïŒQueryïŒïŒmonthïŒå¯éïŒYYYY-MMïŒé»è®€åœæïŒã
åºåïŒç©ºæ°ç» []ïŒè¯¥ç¯å¢åœåæªé
眮åèŠè§åïŒãåæ®µè¡šïŒ
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
rule_id |
integer | è§å ID |
rule_name |
string | è§åæŸç€ºå |
threshold_type |
string | monthly_budget / daily_budget / growth_rate / monthly_minimum_commitment ç |
threshold_value |
number | éåŒ |
actual |
number | åœåå®é åŒ |
pct |
number | actual / threshold_value à 100ïŒå¢é¿çç±»åäžºå·®é¢ %ïŒ |
triggered |
boolean | æ¯åŠè§Šå |
account_name |
string | å ³èçæå¡èŽŠå·åïŒå¯èœäžº nullïŒè¡šç€ºå šå±è§åïŒ |
provider |
string | aws/gcp/azure |
external_project_id |
string | äºåå䟧 ID |
5.10 GET /api/suppliers/supply-sources/all
æš¡åïŒsuppliersïŒè§è²ïŒcloud_adminïŒæŽäžª suppliers æš¡åéœæ¯ adminïŒã
å
¥åïŒsupplier_idïŒå¯éïŒè¿æ»€æäžªäŸåºåïŒã
åºåïŒç宿 ·äŸïŒïŒ
[
{ "id": 3, "supplier_id": 1, "supplier_name": "é¿è¹äœ³å",
"provider": "azure", "account_count": 3 },
{ "id": 5, "supplier_id": 2, "supplier_name": "å
éšæµè¯äžçš",
"provider": "gcp", "account_count": 1 }
]
| åæ®µ | 诎æ |
|---|---|
id |
èŽ§æº IDïŒsupply_sources.idïŒ |
supplier_id / supplier_name |
æå±äŸåºå |
provider |
该莧æºå¯¹åºçäº |
account_count |
该莧æºäžçæå¡èŽŠå·æ° |
5.11 GET /api/metering/products
çšéïŒäº§åå»éå衚ïŒäžæ/æ¶æ§ïŒã
å
¥åïŒproviderãaccount_idãsupply_source_idãsupplier_nameãdata_source_idã
åºåïŒç宿 ·äŸïŒæªåïŒïŒ
[
{ "product": "Amazon Simple Notification Service" },
{ "product": "Amazon Simple Queue Service" },
{ "product": "Vertex AI" }
]
ååæ®µ productïŒæé + æåºãçšäºå端 Metering 页çæå¡è¿æ»€äžæã
6. P2 å¯éæ¥å£
6.1 GET /api/categories/
è§è²ïŒcloud_adminïŒæŽäžª categories æš¡å admin-onlyïŒã
åºåïŒç宿 ·äŸïŒïŒ
[
{ "id": 1, "name": "????", "markup_rate": "1.0000",
"description": "test",
"created_at": "2026-04-08T03:43:02.546432",
"updated_at": "2026-04-08T03:43:02.546432" },
{ "id": 2, "name": "default", "markup_rate": "1.1500",
"description": "default channel",
"created_at": "2026-04-08T03:43:28.568331",
"updated_at": "2026-04-08T10:23:02.934844" }
]
| åæ®µ | ç±»å | 诎æ |
|---|---|---|
markup_rate |
stringïŒDecimalïŒ4 äœå°æ°ïŒ | å ä»·ç |
name |
string | åç±»åïŒå岿°æ®å¯èœå«å äœç¬Š |
6.2 GET /api/exchange-rates/
è§è²ïŒä»»æç»åœïŒè¯»ïŒãå
¥åïŒdateïŒå¯éïŒãfrom_currencyã
åºåïŒæ°ç»åœ¢åŠ [{ from_currency, to_currency, rate, date }]ïŒè¯¥ç¯å¢è¿å []ã
6.3 GET /api/data-sources/
è§è²ïŒcloud_adminã
åºåïŒç宿 ·äŸïŒïŒ
[
{
"id": 1,
"name": "AWS-675139393309",
"cloud_account_id": 1,
"category_id": 2,
"config": { "account_id": "675139393309" },
"last_sync_at": "2026-04-18T18:00:19.046951",
"sync_status": "success",
"is_active": true,
"created_at": "2026-04-08T03:48:09.812203"
}
]
| åæ®µ | 诎æ |
|---|---|
config |
ééåšé
眮 JSONBïŒAzure äŒæ subscription_id/collect_mode/cost_metricïŒAWS ä»
account_id |
last_sync_at / sync_status |
æè¿äžæ¬¡åæ¥æ¶éŽäžç»æ |
6.4 GET /api/resources/ + GET /api/resources/{id}
è§è²ïŒä»»æç»åœïŒè¯»ïŒãå
¥åïŒproviderãproject_idãresource_typeãpageãpage_sizeãæ°æ®æå¯è§æ°æ®æºè¿æ»€ã该ç¯å¢è¿å []ãåæ®µè¡šïŒèµæºæž
å schemaïŒïŒidãproviderãresource_typeãresource_idãnameãregionãproject_idãmonthly_costïŒnumberïŒæè¿äžäžªæäŒ°ç®ïŒãtagsã
6.5 GET /api/billing/export / /api/metering/export
CSV æµåŒäžèœœïŒå€§æµéïŒéåå·¥å
·èœçïŒäžå»ºè®®äœäžºæš¡åäžäžæãå
¥åå detailïŒååº Content-Type: text/csvã
7. éå®ç³»ç»äžçšæ¥å£ïŒå®¢æ·çŒå·äžåïŒ
é¢å"éå®ç³»ç»å¯¹æ¥"ïŒAI 倧èäžè°çšãæš¡åïŒ
service_accountsïŒè¿äž€æ¡æ¯åæäœïŒécloud_adminïŒservice_accountsåªè¯»ç«¯ç¹å·²æŸå®œå°ä»»æç»åœïŒäœåä»ç¶ admin-onlyïŒã建议éè¿ Casdoorclient_credentialsæ¿ tokenã
7.1 POST /api/service-accounts/customer-assignments/sync
çšéïŒéå®ç³»ç»æ"客æ·çŒå· â æå¡èŽŠå·"å ³èæ¹éäžåãå¹çã
å®äœé®ïŒ(supplier_name, provider, external_project_id)ãå¹é
äžå°çè®°åœè¿ unmatched è¿åïŒäžé»ææŽæ¹ã
å ¥åïŒBodyïŒïŒ
{
"mode": "patch",
"scope_customer_codes": ["C001", "C002"],
"assignments": [
{
"customer_code": "C001",
"supplier_name": "xxx äŸåºå",
"provider": "azure",
"external_project_id": "5550d5e0-56d3-46b2-8c08-bb9834d8b349"
}
]
}
mode=patchïŒåªå upsertïŒä»äžå é€ãæšèäœäžºé»è®€æš¡åŒãmode=fullïŒå¯¹scope_customer_codesè¿æ¹åå·®åïŒå€å å°æïŒãè¥è¯¥å段ç空ïŒå端åé䞺"æassignmentséåºç°ç客æ·çŒå·äœäžº scope"ââè¿ç§éåŒè¡äžºå»ºè®®æç¡®äŒ äžä»œãcustomer_codeèªåšupper().strip()åœäžåã
åºåïŒ
{
"inserted": 1,
"deleted": 0,
"unchanged": 0,
"unmatched": [
{
"customer_code": "C002",
"supplier_name": "bogus",
"provider": "azure",
"external_project_id": "does-not-exist",
"reason": "service account not found"
}
]
}
7.2 PUT /api/service-accounts/{account_id}ïŒä»
customer_codes åæ®µïŒ
çšéïŒå䞪æå¡èŽŠå·ç客æ·çŒå·å
šéèŠçïŒå secret_data åè¯ä¹ïŒundefined äžåšïŒ[] æž
空ïŒ[...] æ¿æ¢ïŒã
å ¥åïŒBodyïŒïŒ
{ "customer_codes": ["C001"] }
åºåïŒæŽäžª ServiceAccountDetailïŒè§ §5.3ïŒã
å¯äœçšïŒ
- æ°å¢/å é€äŒå
project_assignment_logsïŒaction=customer_bound/customer_unboundïŒåžŠ operatorã - æž
空æéŠæ¬¡ç»å®éœäŒè§Šå
_recompute_statusïŒèªåšæ status ä»activeâstandbyæåå忢ã
8. çŠæ¢å¯¹ AI åŒæŸçæ¥å£
ä»¥äžæ¥å£ äžåº å å ¥ AI å¯è°å·¥å ·å衚ïŒ
| ç±»å« | è·¯åŸ | åå |
|---|---|---|
| åæ®ææ | GET /api/service-accounts/{id}/credentials |
äŒè§£å¯äºèŽŠå·åæ® |
| åæäœ | ææ POST / PUT / PATCH / DELETE |
å«åæ¥è§Šåã莊åè°æŽãåèŠè§ååæŽãæå¡èŽŠå·åæŽç |
| 客æ·çŒå·åé ïŒéå®äžçšïŒ | POST /api/service-accounts/customer-assignments/syncãPUT /api/service-accounts/{id} 垊 customer_codes |
ä» éå®ç³»ç»èµ° Casdoor client_credentials äžåïŒAI äžåºå |
| åæ¥è§Šå | /api/sync/*ïŒé€ GET /lastïŒ |
é cloud_opsïŒè§Šååå°ä»»å¡ |
| Azure éšçœ² | /api/azure-deploy/* |
é cloud_adminïŒæ¶å ARM Token äžèµæºå建 |
| è·šç§æ·ææ | /api/azure-consent/* |
é cloud_adminïŒæ¹è®¢é
æææ |
| 讀è¯ç®¡ç | /api/admin/users/* · /api/api-keys/* · /api/api-permissions/* |
é cloud_adminïŒç®¡çåäžçš |
service_accounts æš¡åæ··åäºåªè¯»ååæ®æ¥å£ïŒåŠ AI éèŠ Â§5.2â5.5 çæ°æ®ïŒå·¥å
·æž
åäžåŸå
å« /credentialsã
9. 建议è°çšé¡ºåº
GET /api/healthâ è¿éæ§æ¢æµGET /api/auth/meâ 确讀身仜äžå¯è§èåŽGET /api/sync/lastâ æ°æ®æ°é²åºŠGET /api/dashboard/bundleæmetering/summaryâ æ»è§- é»å â
metering/detail+detail/countåé¡µïŒæbilling/detail - äžå¡äž»äœ â
service-accounts/æprojects/ - æ¯åŠè¶
æ¯ â
alerts/rule-status
10. åæš¡åæé鿥
| æš¡å | URL åçŒ | æéè§è² | æ°æ®èåŽè¿æ»€ |
|---|---|---|---|
dashboard |
/api/dashboard/* |
viewer / ops / financeïŒå« adminïŒ | æå¯è§æ°æ®æº |
billing |
/api/billing/* |
ä»»æç»åœ | æå¯è§æ°æ®æº |
metering |
/api/metering/* |
ä»»æç»åœ | æ¯æçéåæ° |
bills |
/api/bills/* |
cloud_financeïŒå« adminïŒ |
æ |
sync |
/api/sync/* |
cloud_opsïŒå« adminïŒ |
æ |
cloud_accounts |
/api/cloud-accounts/* |
读=ä»»æç»åœïŒå=cloud_admin |
æå¯è§äºèŽŠå· |
resources |
/api/resources/* |
ä»»æç»åœ | æå¯è§æ°æ®æº |
projects |
/api/projects/* |
读=ä»»æç»åœïŒå=cloud_admin |
æ |
alerts |
/api/alerts/* |
读=ä»»æç»åœïŒååèŠè§å=cloud_ops |
æ |
categories |
/api/categories/* |
cloud_adminïŒæŽäžªæš¡åïŒ |
æ |
suppliers |
/api/suppliers/* |
cloud_adminïŒæŽäžªæš¡åïŒ |
æ |
exchange_rates |
/api/exchange-rates/* |
读=ä»»æç»åœïŒå=cloud_admin / cloud_finance |
æ |
data_sources |
/api/data-sources/* |
cloud_adminïŒæŽäžªæš¡åïŒ |
æ |
service_accounts |
/api/service-accounts/* |
读=ä»»æç»åœïŒå=cloud_admin |
æ |
azure_deploy |
/api/azure-deploy/* |
cloud_admin |
æ |
azure_consent |
/api/azure-consent/* |
cloud_admin |
æ |
å¿åå¯è®¿é®ïŒäžéèŠä»»äœåæ®ïŒïŒ/api/healthã/api/auth/*ã/docsã/redocã/openapi.json
11. OpenAPI
è¿è¡æ¶éè¿ GET /openapi.json æ /docs è·åäžéšçœ²çæ¬äžèŽç SchemaïŒå¿åå¯è®¿é®ïŒãè¥æ¬æäž OpenAPI å²çªïŒä»¥ OpenAPI 䞺åã