{"openapi":"3.1.0","info":{"title":"AI Rent Gateway","version":"0.1.0"},"paths":{"/v1/v1/chat/completions":{"post":{"summary":"Chat Completions","operationId":"chat_completions_v1_v1_chat_completions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Chat Completions","operationId":"chat_completions_v1_v1_chat_completions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/chat/completions":{"post":{"summary":"Chat Completions","operationId":"chat_completions_chat_completions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Chat Completions","operationId":"chat_completions_chat_completions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/chat/completions":{"post":{"summary":"Chat Completions","operationId":"chat_completions_v1_chat_completions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"summary":"Chat Completions","operationId":"chat_completions_v1_chat_completions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/v1/models":{"get":{"summary":"List Models","operationId":"list_models_v1_v1_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/models":{"get":{"summary":"List Models","operationId":"list_models_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/models":{"get":{"summary":"List Models","operationId":"list_models_v1_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/captcha":{"get":{"tags":["auth"],"summary":"Get Captcha","operationId":"get_captcha_api_auth_captcha_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/admin/login":{"post":{"tags":["auth"],"summary":"Admin Login","operationId":"admin_login_api_auth_admin_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminLoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard":{"get":{"tags":["api"],"summary":"Dashboard","operationId":"dashboard_api_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/models":{"get":{"tags":["api"],"summary":"List User Models","description":"รายชื่อ models ที่เปิดให้ผู้เช่าใช้ (ใช้ user login token ผ่าน /api/models).","operationId":"list_user_models_api_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/keys":{"get":{"tags":["api"],"summary":"List Keys","operationId":"list_keys_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api"],"summary":"Create Key","operationId":"create_key_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/{key_id}":{"delete":{"tags":["api"],"summary":"Revoke Key","operationId":"revoke_key_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage":{"get":{"tags":["api"],"summary":"Usage","operationId":"usage_api_usage_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/daily":{"get":{"tags":["api"],"summary":"Usage Daily","description":"Aggregate tokens+cost per day. month=current (ทั้งเดือนนี้) / YYYY-MM (เดือนนั้นๆ) / last30 (เลื่อน 30 วันล่าสุด)","operationId":"usage_daily_api_usage_daily_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"month","in":"query","required":false,"schema":{"type":"string","default":"current","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/avatar":{"put":{"tags":["api"],"summary":"Set Avatar","operationId":"set_avatar_api_user_avatar_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarPresetIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/avatar/upload":{"post":{"tags":["api"],"summary":"Upload Avatar","operationId":"upload_avatar_api_user_avatar_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_avatar_api_user_avatar_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/avatar/{fname}":{"get":{"tags":["api"],"summary":"Get Avatar","operationId":"get_avatar_api_avatar__fname__get","parameters":[{"name":"fname","in":"path","required":true,"schema":{"type":"string","title":"Fname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plans":{"get":{"tags":["billing"],"summary":"List Plans","operationId":"list_plans_api_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/payments":{"get":{"tags":["billing"],"summary":"My Payments","operationId":"my_payments_api_payments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["billing"],"summary":"Create Payment","operationId":"create_payment_api_payments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/{pay_id}/slip":{"post":{"tags":["billing"],"summary":"Upload Slip","operationId":"upload_slip_api_payments__pay_id__slip_post","parameters":[{"name":"pay_id","in":"path","required":true,"schema":{"type":"integer","title":"Pay Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_slip_api_payments__pay_id__slip_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/{ref}/slip":{"get":{"tags":["billing"],"summary":"Get Slip","operationId":"get_slip_api_payments__ref__slip_get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/{pay_id}/review":{"post":{"tags":["billing"],"summary":"Review Payment","operationId":"review_payment_api_payments__pay_id__review_post","parameters":[{"name":"pay_id","in":"path","required":true,"schema":{"type":"integer","title":"Pay Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stats":{"get":{"tags":["admin"],"summary":"Stats","operationId":"stats_api_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/payments":{"get":{"tags":["admin"],"summary":"Admin Payments","operationId":"admin_payments_api_admin_payments_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/revenue":{"get":{"tags":["admin"],"summary":"Revenue","operationId":"revenue_api_admin_revenue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/margin":{"get":{"tags":["admin"],"summary":"Margin","description":"กำไรต่อ model: ขาย (cost_thb) - ต้นทุนจริง (provider_cost_thb) โดยรวม tokens.","operationId":"margin_api_admin_margin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/users":{"get":{"tags":["admin"],"summary":"Admin Users","operationId":"admin_users_api_admin_users_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create User","operationId":"admin_create_user_api_admin_users_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCreateUser"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}":{"put":{"tags":["admin"],"summary":"Admin Update User","operationId":"admin_update_user_api_admin_users__user_id__put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminToggleUser"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin"],"summary":"Admin User Detail","operationId":"admin_user_detail_api_admin_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/credit":{"post":{"tags":["admin"],"summary":"Admin Adjust Credit","operationId":"admin_adjust_credit_api_admin_users__user_id__credit_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditAdjust"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/usage/daily":{"get":{"tags":["admin"],"summary":"Admin User Usage Daily","description":"รวม tokens+cost ต่อวันของผู้ใช้คนนั้น (30 วัน) สำหรับกราฟใน admin.","operationId":"admin_user_usage_daily_api_admin_users__user_id__usage_daily_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/plan":{"put":{"tags":["admin"],"summary":"Admin Assign Plan","operationId":"admin_assign_plan_api_admin_users__user_id__plan_put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignPlanBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/password":{"put":{"tags":["admin"],"summary":"Admin Reset Password","operationId":"admin_reset_password_api_admin_users__user_id__password_put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/staff":{"get":{"tags":["admin"],"summary":"List Staff","operationId":"list_staff_api_admin_staff_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin"],"summary":"Create Staff","operationId":"create_staff_api_admin_staff_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/staff/{staff_id}":{"put":{"tags":["admin"],"summary":"Update Staff","operationId":"update_staff_api_admin_staff__staff_id__put","parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"integer","title":"Staff Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffToggle"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Staff","operationId":"delete_staff_api_admin_staff__staff_id__delete","parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"integer","title":"Staff Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/plans":{"post":{"tags":["admin"],"summary":"Create Plan","operationId":"create_plan_api_admin_plans_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/plans/{plan_id}":{"put":{"tags":["admin"],"summary":"Update Plan","operationId":"update_plan_api_admin_plans__plan_id__put","parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"integer","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/upstreams":{"get":{"tags":["admin"],"summary":"List Upstreams","operationId":"list_upstreams_api_admin_upstreams_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin"],"summary":"Create Upstream","operationId":"create_upstream_api_admin_upstreams_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpstreamIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/upstreams/{up_id}":{"put":{"tags":["admin"],"summary":"Update Upstream","operationId":"update_upstream_api_admin_upstreams__up_id__put","parameters":[{"name":"up_id","in":"path","required":true,"schema":{"type":"integer","title":"Up Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpstreamIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Upstream","operationId":"delete_upstream_api_admin_upstreams__up_id__delete","parameters":[{"name":"up_id","in":"path","required":true,"schema":{"type":"integer","title":"Up Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/upstreams/{up_id}/models":{"get":{"tags":["admin"],"summary":"Upstream Models","description":"Query a vLLM upstream's /v1/models to list what it actually serves.","operationId":"upstream_models_api_admin_upstreams__up_id__models_get","parameters":[{"name":"up_id","in":"path","required":true,"schema":{"type":"integer","title":"Up Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/models":{"get":{"tags":["admin"],"summary":"List Models","operationId":"list_models_api_admin_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin"],"summary":"Create Model","operationId":"create_model_api_admin_models_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/models/{m_id}":{"put":{"tags":["admin"],"summary":"Update Model","operationId":"update_model_api_admin_models__m_id__put","parameters":[{"name":"m_id","in":"path","required":true,"schema":{"type":"integer","title":"M Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Model","operationId":"delete_model_api_admin_models__m_id__delete","parameters":[{"name":"m_id","in":"path","required":true,"schema":{"type":"integer","title":"M Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/models/reorder":{"post":{"tags":["admin"],"summary":"Reorder Models","operationId":"reorder_models_api_admin_models_reorder_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/me":{"get":{"tags":["admin"],"summary":"Admin Me","operationId":"admin_me_api_admin_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/me/password":{"put":{"tags":["admin"],"summary":"Admin Change Password","operationId":"admin_change_password_api_admin_me_password_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminChangePassword"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/me/avatar":{"put":{"tags":["admin"],"summary":"Admin Change Avatar","operationId":"admin_change_avatar_api_admin_me_avatar_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAvatarIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/usage/daily":{"get":{"tags":["admin"],"summary":"Admin Usage Daily","description":"รวม tokens ต่อวัน แยกตาม model (ทั้งเดือน; month=current / YYYY-MM).","operationId":"admin_usage_daily_api_admin_usage_daily_get","parameters":[{"name":"month","in":"query","required":false,"schema":{"type":"string","default":"current","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/logs":{"get":{"tags":["admin"],"summary":"Admin Logs","description":"Dashboard log: stats (รวม/สำเร็จ/ล้ม) + รายการ log ล่าสุด.","operationId":"admin_logs_api_admin_logs_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/audit":{"get":{"tags":["admin"],"summary":"Admin Audit","description":"Audit log การกระทำของ admin/staff (ทุก action).","operationId":"admin_audit_api_admin_audit_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdminAvatarIn":{"properties":{"avatar":{"type":"string","title":"Avatar"}},"type":"object","required":["avatar"],"title":"AdminAvatarIn"},"AdminChangePassword":{"properties":{"old_password":{"type":"string","title":"Old Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["old_password","new_password"],"title":"AdminChangePassword"},"AdminCreateUser":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"name":{"type":"string","title":"Name","default":""}},"type":"object","required":["email","password"],"title":"AdminCreateUser"},"AdminLoginIn":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"AdminLoginIn"},"AdminToggleUser":{"properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Approved"},"rejected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rejected"},"topup_balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Topup Balance"}},"type":"object","title":"AdminToggleUser"},"AssignPlanBody":{"properties":{"plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Id"},"reset_month":{"type":"boolean","title":"Reset Month","default":false}},"type":"object","title":"AssignPlanBody"},"AvatarPresetIn":{"properties":{"avatar":{"type":"string","title":"Avatar"}},"type":"object","required":["avatar"],"title":"AvatarPresetIn"},"Body_upload_avatar_api_user_avatar_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_avatar_api_user_avatar_upload_post"},"Body_upload_slip_api_payments__pay_id__slip_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_slip_api_payments__pay_id__slip_post"},"CreditAdjust":{"properties":{"amount":{"type":"number","title":"Amount"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["amount"],"title":"CreditAdjust"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"KeyCreate":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name","default":"default"}},"type":"object","title":"KeyCreate"},"LoginIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginIn"},"ModelIn":{"properties":{"name":{"type":"string","title":"Name"},"upstream_model":{"type":"string","title":"Upstream Model"},"upstream_id":{"type":"integer","title":"Upstream Id"},"input_price_per_mtok":{"type":"number","title":"Input Price Per Mtok","default":8.0},"output_price_per_mtok":{"type":"number","title":"Output Price Per Mtok","default":24.0},"cache_read_price_per_mtok":{"type":"number","title":"Cache Read Price Per Mtok","default":2.0},"provider_input_per_mtok":{"type":"number","title":"Provider Input Per Mtok","default":0.0},"provider_output_per_mtok":{"type":"number","title":"Provider Output Per Mtok","default":0.0},"provider_cache_read_per_mtok":{"type":"number","title":"Provider Cache Read Per Mtok","default":0.0},"active":{"type":"boolean","title":"Active","default":true},"vision":{"type":"boolean","title":"Vision","default":false}},"type":"object","required":["name","upstream_model","upstream_id"],"title":"ModelIn"},"PayIn":{"properties":{"plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Id"},"amount":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Amount"}},"type":"object","title":"PayIn"},"PlanCreate":{"properties":{"name":{"type":"string","title":"Name"},"price_thb":{"type":"integer","title":"Price Thb"},"quota_tokens_per_month":{"type":"integer","title":"Quota Tokens Per Month"},"max_keys":{"type":"integer","title":"Max Keys","default":1},"key_rpm":{"type":"integer","title":"Key Rpm","default":60},"key_tpm":{"type":"integer","title":"Key Tpm","default":60000},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["name","price_thb","quota_tokens_per_month"],"title":"PlanCreate"},"PlanUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"price_thb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Thb"},"quota_tokens_per_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Tokens Per Month"},"max_keys":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Keys"},"key_rpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Key Rpm"},"key_tpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Key Tpm"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"PlanUpdate"},"RegisterIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","minLength":8,"title":"Password"},"name":{"type":"string","maxLength":120,"title":"Name","default":""},"captcha_id":{"type":"string","title":"Captcha Id","default":""},"captcha_answer":{"type":"string","title":"Captcha Answer","default":""},"website":{"type":"string","title":"Website","default":""}},"type":"object","required":["email","password"],"title":"RegisterIn"},"ReorderBody":{"properties":{"ids":{"items":{"type":"integer"},"type":"array","title":"Ids"}},"type":"object","required":["ids"],"title":"ReorderBody"},"ResetPasswordBody":{"properties":{"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["new_password"],"title":"ResetPasswordBody"},"ReviewIn":{"properties":{"approve":{"type":"boolean","title":"Approve"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["approve"],"title":"ReviewIn"},"StaffIn":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"name":{"type":"string","title":"Name","default":""},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"}},"type":"object","required":["username","password"],"title":"StaffIn"},"StaffToggle":{"properties":{"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permissions"}},"type":"object","title":"StaffToggle"},"UpstreamIn":{"properties":{"name":{"type":"string","title":"Name"},"base_url":{"type":"string","title":"Base Url"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["name","base_url"],"title":"UpstreamIn"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}