{"openapi":"3.1.0","info":{"title":"AI Aggregator","version":"0.1.0"},"paths":{"/v1/health":{"get":{"tags":["health"],"summary":"Health","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health V1 Health Get"}}}}}}},"/v1/health/db":{"get":{"tags":["health"],"summary":"Health Db","operationId":"health_db_v1_health_db_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Db V1 Health Db Get"}}}}}}},"/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh","operationId":"refresh_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/oauth/google":{"post":{"tags":["auth"],"summary":"Oauth Google Login","description":"Логин через Google. Принимает id_token, который фронт получил после\nOAuth-flow с Google. Бэк валидирует подпись через JWKS, находит/создаёт\nюзера, выдаёт нашу пару токенов.","operationId":"oauth_google_login_v1_auth_oauth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/oauth/yandex":{"post":{"tags":["auth"],"summary":"Oauth Yandex Login","description":"Логин через Яндекс ID. Принимает access_token (фронт получает его\nчерез PKCE-flow). Бэк делает запрос к login.yandex.ru/info, получает\nemail и id, находит/создаёт юзера, выдаёт нашу пару токенов.","operationId":"oauth_yandex_login_v1_auth_oauth_yandex_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthAccessTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_v1_auth_logout_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/v1/auth/verify-email":{"post":{"tags":["auth"],"summary":"Verify Email","operationId":"verify_email_v1_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","operationId":"resend_verification_v1_auth_resend_verification_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Resend Verification V1 Auth Resend Verification Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","operationId":"forgot_password_v1_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Forgot Password V1 Auth Forgot Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","operationId":"reset_password_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Reset Password V1 Auth Reset Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"tags":["me"],"summary":"Get Me","operationId":"get_me_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["me"],"summary":"Delete Me","description":"Soft-delete: аккаунт деактивируется, все сессии отзываются.\n\nРеактивация — только админом (не в этой итерации). Hard-delete (с зачисткой\nданных) добавим, когда появится требование по GDPR/152-ФЗ.","operationId":"delete_me_v1_me_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["me"],"summary":"Update Me","operationId":"update_me_v1_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMe"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/change-password":{"post":{"tags":["me"],"summary":"Change Password","operationId":"change_password_v1_me_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/gallery":{"get":{"tags":["me"],"summary":"Get Gallery","description":"«Моя галерея»: все картинки и видео юзера из диалогов, новейшие сверху,\nkeyset-пагинация (`cursor`). `kind` фильтрует image|video. 400 — битый курсор.","operationId":"get_gallery_v1_me_gallery_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":24,"title":"Limit"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["image","video"],"type":"string"},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleryPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations":{"post":{"tags":["conversations"],"summary":"Create Conversation","description":"Новый тред, закреплённый за моделью/шаблоном (catalog_slug). 404 — нет записи.","operationId":"create_conversation_v1_me_conversations_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["conversations"],"summary":"List Conversations","operationId":"list_conversations_v1_me_conversations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}":{"get":{"tags":["conversations"],"summary":"Get Conversation","operationId":"get_conversation_v1_me_conversations__conversation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["conversations"],"summary":"Rename Conversation","operationId":"rename_conversation_v1_me_conversations__conversation_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationRenameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}/messages":{"get":{"tags":["conversations"],"summary":"Get Messages","description":"Keyset-страница ленты (подгрузка вверх): последние сообщения старше `before`.","operationId":"get_messages_v1_me_conversations__conversation_id__messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessagePageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["conversations"],"summary":"Send Message","description":"Текстовый ход диалога: списывает token_cost, шлёт окно контекста модели,\nсохраняет сообщения. 402 — мало токенов; 502 — провайдер упал (резерв возвращён);\n400 — у треда не текстовая модель (image/video — следующий шаг).","operationId":"send_message_v1_me_conversations__conversation_id__messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationSendRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}/messages/{message_id}/media/{idx}":{"get":{"tags":["conversations"],"summary":"Get Message Media","description":"Файл медиа сообщения (картинка/видео) под JWT. Проверка владения беседой.","operationId":"get_message_media_v1_me_conversations__conversation_id__messages__message_id__media__idx__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}/messages/{message_id}/poll":{"post":{"tags":["conversations"],"summary":"Poll Message","description":"Опрос статуса async-видео сообщения: pending→done/failed (settle/release токенов).","operationId":"poll_message_v1_me_conversations__conversation_id__messages__message_id__poll_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/conversations/{conversation_id}/archive":{"post":{"tags":["conversations"],"summary":"Archive Conversation","operationId":"archive_conversation_v1_me_conversations__conversation_id__archive_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/media/{message_id}/{idx}":{"get":{"tags":["media"],"summary":"Get Signed Media","description":"Файл медиа по подписи. 404 — подпись неверна/протухла или файла нет\n(404, а не 403 — не раскрываем существование чужих ресурсов).","operationId":"get_signed_media_v1_media__message_id___idx__get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Message Id"}},{"name":"idx","in":"path","required":true,"schema":{"type":"integer","title":"Idx"}},{"name":"exp","in":"query","required":true,"schema":{"type":"integer","title":"Exp"}},{"name":"sig","in":"query","required":true,"schema":{"type":"string","title":"Sig"}},{"name":"variant","in":"query","required":false,"schema":{"type":"string","default":"full","title":"Variant"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/api-keys":{"get":{"tags":["api-keys"],"summary":"List Api Keys","operationId":"list_api_keys_v1_me_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Response List Api Keys V1 Me Api Keys Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["api-keys"],"summary":"Create Api Key","operationId":"create_api_key_v1_me_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/api-keys/{key_id}":{"patch":{"tags":["api-keys"],"summary":"Rename Api Key","operationId":"rename_api_key_v1_me_api_keys__key_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-keys"],"summary":"Delete Api Key","operationId":"delete_api_key_v1_me_api_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/wallets":{"get":{"tags":["wallets"],"summary":"List Wallets","operationId":"list_wallets_v1_me_wallets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WalletResponse"},"type":"array","title":"Response List Wallets V1 Me Wallets Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/wallets/{currency}":{"get":{"tags":["wallets"],"summary":"Get Wallet","operationId":"get_wallet_v1_me_wallets__currency__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"currency","in":"path","required":true,"schema":{"type":"string","title":"Currency"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/transactions":{"get":{"tags":["wallets"],"summary":"List Transactions","operationId":"list_transactions_v1_me_transactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/topup":{"post":{"tags":["billing"],"summary":"Topup","operationId":"topup_v1_billing_topup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/generations":{"post":{"tags":["generations"],"summary":"Create Generation","description":"Зарезервировать токены, выполнить задачу реальной моделью, финализировать.\n\nРезерв (hold) → execute → settle (успех) / release (сбой). 404 — задачи нет;\n402 — не хватает токенов; 502 — генерация упала (резерв возвращён). Повтор с\nтем же Idempotency-Key идемпотентен: успех → повтор-ответ без списания, сбой →\nснова 502 (без повторного исполнения).","operationId":"create_generation_v1_me_generations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/chat":{"post":{"tags":["generations"],"summary":"Chat Turn","description":"Один ход диалога: списываем токены за задачу chat, шлём историю модели,\nвозвращаем ответ. 402 — недостаточно токенов; 502 — провайдер упал (резерв возвращён).","operationId":"chat_turn_v1_me_chat_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatTurnRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatTurnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/video-generations":{"post":{"tags":["generations"],"summary":"Create Video Generation","description":"Зарезервировать токены и засабмитить видео-задачу. 202 + job (processing).\nОпрос — GET /v1/me/video-generations/{id}. 404 — задачи нет; 402 — мало токенов;\n400 — задача не видео; 502 — сабмит упал (резерв возвращён).","operationId":"create_video_generation_v1_me_video_generations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/video-generations/{job_id}":{"get":{"tags":["generations"],"summary":"Get Video Generation","description":"Опрос задания: при готовности — settle резерва (completed) либо release (failed).","operationId":"get_video_generation_v1_me_video_generations__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/video-generations/{job_id}/download":{"get":{"tags":["generations"],"summary":"Ui Video Download","description":"Отдать MP4 (409 если не COMPLETED).","operationId":"ui_video_download_v1_me_video_generations__job_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/subscriptions":{"get":{"tags":["subscriptions"],"summary":"Current Subscription","operationId":"current_subscription_v1_me_subscriptions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionResponse"},{"type":"null"}],"title":"Response Current Subscription V1 Me Subscriptions Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["subscriptions"],"summary":"Subscribe","description":"409 — уже есть активная; 404 — нет тарифа; 402 — мало ₽.","operationId":"subscribe_v1_me_subscriptions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/subscriptions/cancel":{"post":{"tags":["subscriptions"],"summary":"Cancel Subscription","description":"Отменить автопродление (404 если активной нет). Токены остаются.","operationId":"cancel_subscription_v1_me_subscriptions_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/subscriptions/resume":{"post":{"tags":["subscriptions"],"summary":"Resume Subscription","description":"Снова включить автопродление (404 если активной нет).","operationId":"resume_subscription_v1_me_subscriptions_resume_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/tokens/purchase":{"post":{"tags":["tokens"],"summary":"Purchase Tokens","description":"Купить токены: списать ₽ по тарифной цене, начислить токены.\n400 — объём вне лимитов; 402 — мало ₽. Повтор по ключу не задвоит.","operationId":"purchase_tokens_v1_me_tokens_purchase_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPurchaseRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPurchaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/notifications":{"get":{"tags":["notifications"],"summary":"List My Notifications","description":"Уведомления для текущего юзера, с пометкой is_read и общим unread-counter.","operationId":"list_my_notifications_v1_me_notifications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/notifications/{notification_id}/read":{"post":{"tags":["notifications"],"summary":"Mark One Read","operationId":"mark_one_read_v1_me_notifications__notification_id__read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Notification Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/notifications/mark-all-read":{"post":{"tags":["notifications"],"summary":"Mark All Read","operationId":"mark_all_read_v1_me_notifications_mark_all_read_post","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/notifications":{"get":{"tags":["admin"],"summary":"List All Notifications","operationId":"list_all_notifications_v1_admin_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationAdminItem"},"type":"array","title":"Response List All Notifications V1 Admin Notifications Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["admin"],"summary":"Create Notification","description":"Создать broadcast — увидят все юзеры тенанта.\n\nReason: повышение цен, новые модели, тех-работы, важные изменения.","operationId":"create_notification_v1_admin_notifications_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationAdminItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/notifications/{notification_id}":{"delete":{"tags":["admin"],"summary":"Delete Notification","operationId":"delete_notification_v1_admin_notifications__notification_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Notification Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/chat/completions":{"post":{"tags":["chat"],"summary":"Chat Completions","operationId":"chat_completions_v1_chat_completions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/images/generations":{"post":{"tags":["images"],"summary":"Images Generations","operationId":"images_generations_v1_images_generations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageGenerationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageGenerationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/video/generations":{"post":{"tags":["video"],"summary":"Create Video Generation","operationId":"create_video_generation_v1_video_generations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/video/generations/{job_id}":{"get":{"tags":["video"],"summary":"Get Video Generation","operationId":"get_video_generation_v1_video_generations__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/video/generations/{job_id}/download":{"get":{"tags":["video"],"summary":"Video Download","operationId":"video_download_v1_video_generations__job_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/models":{"get":{"tags":["models"],"summary":"List Models","operationId":"list_models_v1_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/pricing":{"get":{"tags":["pricing"],"summary":"Get Pricing","operationId":"get_pricing_v1_me_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/public/pricing":{"get":{"tags":["public"],"summary":"Public Pricing","description":"То же что /v1/me/pricing, но без JWT — для публичных страниц\n(/pricing и /models). PII не возвращает.","operationId":"public_pricing_v1_public_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}}}}},"/v1/public/ui-tasks":{"get":{"tags":["public"],"summary":"Public Ui Tasks","description":"Каталог UI-задач с фикс-ценой в токенах — для витрины (без JWT).\nВнутренние поля (model_ref, preset_prompt, params) не отдаём.","operationId":"public_ui_tasks_v1_public_ui_tasks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UiTaskListResponse"}}}}}}},"/v1/public/catalog":{"get":{"tags":["public"],"summary":"Public Catalog","description":"Единый каталог моделей+шаблонов для витрины/пикера (без JWT).\n\nОпциональные фильтры kind (model|template) и capability. Внутренние поля\n(preset_prompt, params) не отдаём.","operationId":"public_catalog_v1_public_catalog_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"capability","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/{slug}":{"get":{"tags":["public"],"summary":"Public Catalog Entry","description":"Деталь записи каталога по slug — наполнение страницы /chat/{slug}\n(пустое состояние, скрины 41/42) и SEO. Для шаблонов — со списком сэмплов.","operationId":"public_catalog_entry_v1_public_catalog__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/catalog/{slug}/price":{"post":{"tags":["public"],"summary":"Public Catalog Price","description":"Итоговая цена генерации в токенах для записи + выбранных контролов.\nДля pipeline — сумма шагов (с переменной ценой по форматам/длительности/качеству);\nдля legacy — count×token_cost или плоско. Фронт показывает её в окне ввода.","operationId":"public_catalog_price_v1_public_catalog__slug__price_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Catalog Price V1 Public Catalog  Slug  Price Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/subscription-plans":{"get":{"tags":["public"],"summary":"Public Subscription Plans","description":"Каталог тарифов (без JWT) — для витрины подписок.","operationId":"public_subscription_plans_v1_public_subscription_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPlanListResponse"}}}}}}},"/v1/public/token-pricing":{"get":{"tags":["public"],"summary":"Public Token Pricing","description":"Предрасчёт цены докупки для калькулятора (без JWT). Цена за токен падает с объёмом.","operationId":"public_token_pricing_v1_public_token_pricing_get","parameters":[{"name":"tokens","in":"query","required":true,"schema":{"type":"integer","title":"Tokens"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPriceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreateRequest"},"ApiKeyCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_active":{"type":"boolean","title":"Is Active"},"total_spent_rub":{"type":"string","title":"Total Spent Rub","default":"0.00000000"},"key":{"type":"string","title":"Key"}},"type":"object","required":["id","name","key_prefix","last_used_at","created_at","is_active","key"],"title":"ApiKeyCreatedResponse","description":"Создан ключ — plaintext показывается один раз."},"ApiKeyResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_active":{"type":"boolean","title":"Is Active"},"total_spent_rub":{"type":"string","title":"Total Spent Rub","default":"0.00000000"}},"type":"object","required":["id","name","key_prefix","last_used_at","created_at","is_active"],"title":"ApiKeyResponse","description":"Без plaintext — для list/get/patch."},"ApiKeyUpdateRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyUpdateRequest"},"CatalogDetailResponse":{"properties":{"kind":{"type":"string","title":"Kind"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"token_cost":{"type":"integer","title":"Token Cost"},"capability":{"type":"string","title":"Capability"},"accepts_image":{"type":"boolean","title":"Accepts Image","default":false},"requires_image":{"type":"boolean","title":"Requires Image","default":false},"model_ref":{"type":"string","title":"Model Ref"},"base_model_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Model Ref"},"seo_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"og_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image"},"controls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Controls","default":[]},"samples":{"items":{"$ref":"#/components/schemas/TemplateSamplePublic"},"type":"array","title":"Samples","default":[]}},"type":"object","required":["kind","slug","title","description","token_cost","capability","model_ref"],"title":"CatalogDetailResponse","description":"Деталь записи для страницы /chat/{slug} (пустое состояние) и SEO.\nСэмплы наследуются от CatalogEntryPublic."},"CatalogEntryPublic":{"properties":{"kind":{"type":"string","title":"Kind"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"token_cost":{"type":"integer","title":"Token Cost"},"capability":{"type":"string","title":"Capability"},"accepts_image":{"type":"boolean","title":"Accepts Image","default":false},"requires_image":{"type":"boolean","title":"Requires Image","default":false},"model_ref":{"type":"string","title":"Model Ref"},"base_model_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Model Ref"},"seo_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Title"},"seo_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seo Description"},"og_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image"},"controls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Controls","default":[]},"samples":{"items":{"$ref":"#/components/schemas/TemplateSamplePublic"},"type":"array","title":"Samples","default":[]}},"type":"object","required":["kind","slug","title","description","token_cost","capability","model_ref"],"title":"CatalogEntryPublic","description":"Запись каталога (kind=model|template) — публичный вид для витрины/пикера."},"CatalogListResponse":{"properties":{"tokens_currency":{"type":"string","title":"Tokens Currency","default":"TOKEN"},"entries":{"items":{"$ref":"#/components/schemas/CatalogEntryPublic"},"type":"array","title":"Entries"}},"type":"object","required":["entries"],"title":"CatalogListResponse"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","maxLength":256,"minLength":1,"title":"Current Password"},"new_password":{"type":"string","maxLength":256,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"ChatCompletionRequest":{"properties":{"model":{"type":"string","title":"Model"},"messages":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","title":"Messages"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"},"max_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens"},"top_p":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Top P"},"stream":{"type":"boolean","title":"Stream","default":false},"stream_options":{"anyOf":[{"$ref":"#/components/schemas/StreamOptions"},{"type":"null"}]},"stop":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stop"},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}},"additionalProperties":true,"type":"object","required":["model","messages"],"title":"ChatCompletionRequest","description":"Запрос от юзера к POST /v1/chat/completions.\n\nМинимум обязательных полей — model и messages. Остальное опционально и\nпрокидывается в upstream через `extra=\"allow\"`."},"ChatCompletionResponse":{"properties":{"id":{"type":"string","title":"Id"},"object":{"type":"string","const":"chat.completion","title":"Object","default":"chat.completion"},"created":{"type":"integer","title":"Created"},"model":{"type":"string","title":"Model"},"choices":{"items":{"$ref":"#/components/schemas/Choice"},"type":"array","title":"Choices"},"usage":{"$ref":"#/components/schemas/Usage"}},"additionalProperties":true,"type":"object","required":["id","created","model","choices","usage"],"title":"ChatCompletionResponse","description":"Ответ от провайдера в non-streaming режиме."},"ChatMessage":{"properties":{"role":{"type":"string","enum":["system","user","assistant","tool","developer"],"title":"Role"},"content":{"anyOf":[{"type":"string"},{"items":{"$ref":"#/components/schemas/ContentPart"},"type":"array"},{"type":"null"}],"title":"Content"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"additionalProperties":true,"type":"object","required":["role"],"title":"ChatMessage"},"ChatTurnMessage":{"properties":{"role":{"type":"string","enum":["user","assistant"],"title":"Role"},"content":{"type":"string","maxLength":8000,"minLength":1,"title":"Content"}},"type":"object","required":["role","content"],"title":"ChatTurnMessage"},"ChatTurnRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/ChatTurnMessage"},"type":"array","maxItems":40,"minItems":1,"title":"Messages"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"image":{"anyOf":[{"type":"string","maxLength":15000000},{"type":"null"}],"title":"Image"}},"type":"object","required":["messages"],"title":"ChatTurnRequest"},"ChatTurnResponse":{"properties":{"reply":{"type":"string","title":"Reply"},"charged_tokens":{"type":"integer","title":"Charged Tokens"},"balance_after":{"type":"integer","title":"Balance After"}},"type":"object","required":["reply","charged_tokens","balance_after"],"title":"ChatTurnResponse"},"Choice":{"properties":{"index":{"type":"integer","title":"Index"},"message":{"anyOf":[{"$ref":"#/components/schemas/ChatMessage"},{"type":"null"}]},"finish_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finish Reason"}},"additionalProperties":true,"type":"object","required":["index"],"title":"Choice"},"ContentPart":{"properties":{"type":{"type":"string","title":"Type"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"image_url":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Image Url"}},"additionalProperties":true,"type":"object","required":["type"],"title":"ContentPart","description":"Часть multimodal-сообщения — текст, картинка, аудио и т.д."},"ConversationCreateRequest":{"properties":{"catalog_slug":{"type":"string","maxLength":80,"minLength":1,"title":"Catalog Slug"}},"type":"object","required":["catalog_slug"],"title":"ConversationCreateRequest"},"ConversationListResponse":{"properties":{"conversations":{"items":{"$ref":"#/components/schemas/ConversationResponse"},"type":"array","title":"Conversations"}},"type":"object","required":["conversations"],"title":"ConversationListResponse"},"ConversationRenameRequest":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"}},"type":"object","required":["title"],"title":"ConversationRenameRequest"},"ConversationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"catalog_slug":{"type":"string","title":"Catalog Slug"},"model_ref":{"type":"string","title":"Model Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"archived":{"type":"boolean","title":"Archived","default":false},"last_activity_at":{"type":"string","format":"date-time","title":"Last Activity At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","catalog_slug","model_ref","last_activity_at","created_at"],"title":"ConversationResponse"},"ConversationSendRequest":{"properties":{"text":{"type":"string","maxLength":8000,"title":"Text","default":""},"image":{"anyOf":[{"type":"string","maxLength":16000000},{"type":"null"}],"title":"Image"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"}},"type":"object","title":"ConversationSendRequest"},"ConversationTurnResponse":{"properties":{"user_message":{"$ref":"#/components/schemas/MessageResponse"},"assistant_message":{"$ref":"#/components/schemas/MessageResponse"},"charged_tokens":{"type":"integer","title":"Charged Tokens"},"balance_after":{"type":"integer","title":"Balance After"}},"type":"object","required":["user_message","assistant_message","charged_tokens","balance_after"],"title":"ConversationTurnResponse","description":"Результат текстового хода: сохранённые сообщения юзера и ассистента + биллинг."},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"GalleryItem":{"properties":{"message_id":{"type":"string","format":"uuid","title":"Message Id"},"idx":{"type":"integer","title":"Idx"},"kind":{"type":"string","title":"Kind"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"conversation_id":{"type":"string","format":"uuid","title":"Conversation Id"},"catalog_slug":{"type":"string","title":"Catalog Slug"},"conversation_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Title"},"model_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Url"},"mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime"},"job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Job Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"}},"type":"object","required":["message_id","idx","kind","created_at","conversation_id","catalog_slug"],"title":"GalleryItem","description":"Один элемент галереи — картинка или готовое/идущее видео из ассистентского\nсообщения. `message_id`+`idx` — координата части в сообщении (как в подписи\nмедиа). Контекст диалога — чтобы открыть исходный тред."},"GalleryPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GalleryItem"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["items"],"title":"GalleryPage","description":"Keyset-страница галереи + курсор на более старые элементы."},"GenerateRequest":{"properties":{"task":{"type":"string","title":"Task","description":"ключ задачи из каталога ui_tasks (chat/image/...)"},"prompt":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Prompt"},"image":{"anyOf":[{"type":"string","maxLength":15000000},{"type":"null"}],"title":"Image"}},"type":"object","required":["task"],"title":"GenerateRequest"},"GenerateResponse":{"properties":{"task":{"type":"string","title":"Task"},"title":{"type":"string","title":"Title"},"charged_tokens":{"type":"integer","title":"Charged Tokens"},"balance_after":{"type":"integer","title":"Balance After"},"status":{"type":"string","title":"Status"},"result":{"$ref":"#/components/schemas/GenerationResult"}},"type":"object","required":["task","title","charged_tokens","balance_after","status","result"],"title":"GenerateResponse"},"GenerationResult":{"properties":{"kind":{"type":"string","title":"Kind"},"note":{"type":"string","title":"Note"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Images"},"sample_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Url"}},"type":"object","required":["kind","note"],"title":"GenerationResult","description":"Результат генерации. text/images — реальный вывод модели (Р.5b);\nsample_url — заглушка для ещё не подключённого видео."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImageData":{"properties":{"b64_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"B64 Json"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"revised_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revised Prompt"}},"additionalProperties":true,"type":"object","title":"ImageData","description":"Одна сгенерированная картинка."},"ImageGenerationRequest":{"properties":{"model":{"type":"string","title":"Model"},"prompt":{"type":"string","title":"Prompt"},"n":{"type":"integer","title":"N","default":1},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size"},"quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality"},"response_format":{"type":"string","enum":["b64_json","url"],"title":"Response Format","default":"b64_json"},"image":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImageInput"},"type":"array"},{"type":"null"}],"title":"Image"},"mask":{"anyOf":[{"$ref":"#/components/schemas/ImageInput"},{"type":"null"}]},"reference_images":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImageInput"},"type":"array"},{"type":"null"}],"title":"Reference Images"}},"additionalProperties":true,"type":"object","required":["model","prompt"],"title":"ImageGenerationRequest","description":"Запрос на генерацию картинки в OpenAI-формате.\n\n`image` непустой → image-edit режим (instruct-edit без маски).\nАдаптер сам решает в какой URL и как сериализовать (для Gemini —\ninline_data в :generateContent). Capability `image_input` обязательна\nдля моделей которые принимают image."},"ImageGenerationResponse":{"properties":{"created":{"type":"integer","title":"Created"},"data":{"items":{"$ref":"#/components/schemas/ImageData"},"type":"array","title":"Data"},"usage":{"anyOf":[{"$ref":"#/components/schemas/ImageUsage"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["data"],"title":"ImageGenerationResponse"},"ImageInput":{"properties":{"type":{"type":"string","enum":["url","base64"],"title":"Type"},"data":{"type":"string","minLength":1,"title":"Data"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type","description":"image/png, image/jpeg, image/webp"}},"additionalProperties":false,"type":"object","required":["type","data"],"title":"ImageInput","description":"Картинка, которую юзер передал во входе запроса.\n\nДва варианта `type`:\n  - `url`     — внешний URL, провайдер (или мы) скачаем по запросу.\n  - `base64`  — уже сырые байты в base64 (без data:image/...; префикса).\n\n`mime_type` обязателен для base64 (нужен Gemini для inline_data),\nдля url — опционально (можно определить из ответа)."},"ImageUsage":{"properties":{"total_tokens":{"type":"integer","title":"Total Tokens","default":0},"input_tokens":{"type":"integer","title":"Input Tokens","default":0},"output_tokens":{"type":"integer","title":"Output Tokens","default":0}},"additionalProperties":true,"type":"object","title":"ImageUsage","description":"Usage для image-моделей. gpt-image даёт полный breakdown,\ngemini — только total_tokens, imagen — все нули."},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":256,"minLength":1,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MessagePageResponse":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/MessageResponse"},"type":"array","title":"Messages"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["messages"],"title":"MessagePageResponse","description":"Keyset-страница ленты: сообщения в хронологии + курсор на более старые."},"MessageResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"role":{"type":"string","title":"Role"},"parts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Parts"},"token_cost":{"type":"integer","title":"Token Cost"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","role","parts","token_cost","created_at"],"title":"MessageResponse"},"ModelInfo":{"properties":{"id":{"type":"string","title":"Id"},"object":{"type":"string","const":"model","title":"Object","default":"model"},"created":{"type":"integer","title":"Created","default":0},"owned_by":{"type":"string","title":"Owned By"}},"additionalProperties":true,"type":"object","required":["id","owned_by"],"title":"ModelInfo","description":"Запись в `data: [...]` ответа GET /v1/models."},"ModelListResponse":{"properties":{"object":{"type":"string","const":"list","title":"Object","default":"list"},"data":{"items":{"$ref":"#/components/schemas/ModelInfo"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"ModelListResponse"},"ModelPricing":{"properties":{"id":{"type":"string","title":"Id"},"input_per_million_rub":{"type":"string","title":"Input Per Million Rub"},"output_per_million_rub":{"type":"string","title":"Output Per Million Rub"},"per_image_rub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Per Image Rub"},"per_second_rub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Per Second Rub"},"tokens_per_image":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokens Per Image"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"}},"type":"object","required":["id","input_per_million_rub","output_per_million_rub","capabilities"],"title":"ModelPricing","description":"Цены одной модели в RUB (уже пересчитано из USD по нашему курсу).\n\nДля текстовых моделей релевантны input/output_per_million_rub.\nДля image-моделей с flat-fee — per_image_rub. Для image-моделей с\nvirtual usage (gemini-image) — tokens_per_image × output_per_million_rub.\nДля видео — per_second_rub."},"NotificationAdminItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"level":{"type":"string","enum":["info","success","warning","danger"],"title":"Level"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","title","body","level","created_at"],"title":"NotificationAdminItem","description":"Уведомление в админ-листинге (без is_read — у админа нет личного контекста)."},"NotificationCreateRequest":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"body":{"type":"string","maxLength":10000,"minLength":1,"title":"Body"},"level":{"type":"string","enum":["info","success","warning","danger"],"title":"Level","default":"info"},"link":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Link"}},"type":"object","required":["title","body"],"title":"NotificationCreateRequest","description":"Создание уведомления админом."},"NotificationListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":"array","title":"Data"},"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["data","unread_count"],"title":"NotificationListResponse"},"NotificationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"},"level":{"type":"string","enum":["info","success","warning","danger"],"title":"Level"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_read":{"type":"boolean","title":"Is Read"}},"type":"object","required":["id","title","body","level","created_at","is_read"],"title":"NotificationResponse","description":"Уведомление как видит юзер — с флагом is_read для него."},"OAuthAccessTokenRequest":{"properties":{"access_token":{"type":"string","minLength":10,"title":"Access Token"}},"type":"object","required":["access_token"],"title":"OAuthAccessTokenRequest","description":"access_token для провайдеров без OIDC (Яндекс, GitHub, VK)."},"OAuthLoginRequest":{"properties":{"id_token":{"type":"string","minLength":10,"title":"Id Token"}},"type":"object","required":["id_token"],"title":"OAuthLoginRequest","description":"id_token, полученный фронтом от OAuth-провайдера (Google и т.п.)."},"PricingResponse":{"properties":{"exchange_rate_usd_to_rub":{"type":"string","title":"Exchange Rate Usd To Rub"},"min_balance_rub":{"type":"string","title":"Min Balance Rub"},"default_currency":{"type":"string","title":"Default Currency"},"models":{"items":{"$ref":"#/components/schemas/ModelPricing"},"type":"array","title":"Models"}},"type":"object","required":["exchange_rate_usd_to_rub","min_balance_rub","default_currency","models"],"title":"PricingResponse"},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest"},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":256,"minLength":8,"title":"Password"}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"RegisterResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"}},"type":"object","required":["user_id"],"title":"RegisterResponse"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","maxLength":256,"minLength":8,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"StreamOptions":{"properties":{"include_usage":{"type":"boolean","title":"Include Usage","default":false}},"additionalProperties":true,"type":"object","title":"StreamOptions"},"SubscribeRequest":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"SubscribeRequest"},"SubscriptionPlanListResponse":{"properties":{"tokens_currency":{"type":"string","title":"Tokens Currency","default":"TOKEN"},"plans":{"items":{"$ref":"#/components/schemas/SubscriptionPlanResponse"},"type":"array","title":"Plans"}},"type":"object","required":["plans"],"title":"SubscriptionPlanListResponse"},"SubscriptionPlanResponse":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"price_rub":{"type":"string","title":"Price Rub"},"tokens":{"type":"integer","title":"Tokens"},"period":{"type":"string","title":"Period"},"sort_order":{"type":"integer","title":"Sort Order"}},"type":"object","required":["key","title","price_rub","tokens","period","sort_order"],"title":"SubscriptionPlanResponse","description":"Публичный вид тарифа (витрина)."},"SubscriptionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"plan_key":{"type":"string","title":"Plan Key"},"status":{"type":"string","title":"Status"},"price_rub":{"type":"string","title":"Price Rub"},"tokens_per_period":{"type":"integer","title":"Tokens Per Period"},"period":{"type":"string","title":"Period"},"current_period_start":{"type":"string","format":"date-time","title":"Current Period Start"},"current_period_end":{"type":"string","format":"date-time","title":"Current Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End"}},"type":"object","required":["id","plan_key","status","price_rub","tokens_per_period","period","current_period_start","current_period_end","cancel_at_period_end"],"title":"SubscriptionResponse"},"TemplateSamplePublic":{"properties":{"thumbnail_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Path"},"prompt_text":{"type":"string","title":"Prompt Text"}},"type":"object","required":["prompt_text"],"title":"TemplateSamplePublic","description":"Сэмпл шаблона: превью + готовый промпт (для модалки «Выбрать шаблон»)."},"TokenPair":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","const":"bearer","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["access_token","refresh_token","expires_in"],"title":"TokenPair"},"TokenPriceResponse":{"properties":{"tokens":{"type":"integer","title":"Tokens"},"price_per_token":{"type":"string","title":"Price Per Token"},"cost_rub":{"type":"string","title":"Cost Rub"}},"type":"object","required":["tokens","price_per_token","cost_rub"],"title":"TokenPriceResponse","description":"Предрасчёт цены для калькулятора докупки (публичный)."},"TokenPurchaseRequest":{"properties":{"tokens":{"type":"integer","title":"Tokens"}},"type":"object","required":["tokens"],"title":"TokenPurchaseRequest"},"TokenPurchaseResponse":{"properties":{"tokens_added":{"type":"integer","title":"Tokens Added"},"charged_rub":{"type":"string","title":"Charged Rub"},"token_balance":{"type":"integer","title":"Token Balance"},"rub_balance":{"type":"string","title":"Rub Balance"}},"type":"object","required":["tokens_added","charged_rub","token_balance","rub_balance"],"title":"TokenPurchaseResponse"},"TopupRequest":{"properties":{"amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount"},"currency":{"type":"string","maxLength":10,"minLength":3,"title":"Currency","default":"RUB"},"return_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Url"}},"type":"object","required":["amount"],"title":"TopupRequest"},"TopupResponse":{"properties":{"transaction_id":{"type":"string","format":"uuid","title":"Transaction Id"},"payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Url"},"status":{"type":"string","title":"Status"}},"type":"object","required":["transaction_id","payment_url","status"],"title":"TopupResponse"},"TransactionListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TransactionResponse"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["data","next_cursor"],"title":"TransactionListResponse"},"TransactionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"currency":{"type":"string","title":"Currency"},"type":{"type":"string","title":"Type"},"amount":{"type":"string","title":"Amount"},"balance_after":{"type":"string","title":"Balance After"},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","currency","type","amount","balance_after","status","description","idempotency_key","meta","created_at"],"title":"TransactionResponse"},"UiTaskListResponse":{"properties":{"tokens_currency":{"type":"string","title":"Tokens Currency","default":"TOKEN"},"tasks":{"items":{"$ref":"#/components/schemas/UiTaskResponse"},"type":"array","title":"Tasks"}},"type":"object","required":["tasks"],"title":"UiTaskListResponse"},"UiTaskResponse":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"token_cost":{"type":"integer","title":"Token Cost"},"capability":{"type":"string","title":"Capability"},"sort_order":{"type":"integer","title":"Sort Order"},"input_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Hint"},"accepts_image":{"type":"boolean","title":"Accepts Image","default":false},"model_ref":{"type":"string","title":"Model Ref"}},"type":"object","required":["key","title","description","token_cost","capability","sort_order","model_ref"],"title":"UiTaskResponse","description":"Публичный вид UI-задачи (витрина). preset_prompt и params не отдаём\n(детали исполнения); model_ref показываем — пользователю полезно знать модель."},"UpdateMeRequest":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"}},"type":"object","title":"UpdateMeRequest"},"Usage":{"properties":{"prompt_tokens":{"type":"integer","title":"Prompt Tokens"},"completion_tokens":{"type":"integer","title":"Completion Tokens"},"total_tokens":{"type":"integer","title":"Total Tokens"}},"additionalProperties":true,"type":"object","required":["prompt_tokens","completion_tokens","total_tokens"],"title":"Usage"},"UserMe":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"email_verified":{"type":"boolean","title":"Email Verified"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","role","email_verified","created_at"],"title":"UserMe"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest"},"VerifyEmailResponse":{"properties":{"verified":{"type":"boolean","title":"Verified"}},"type":"object","required":["verified"],"title":"VerifyEmailResponse"},"VideoGenerationRequest":{"properties":{"model":{"type":"string","title":"Model","description":"User-facing model id (например google/veo-3-fast)"},"prompt":{"type":"string","maxLength":5000,"minLength":1,"title":"Prompt"},"duration_seconds":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Duration Seconds","default":4},"first_frame":{"anyOf":[{"$ref":"#/components/schemas/ImageInput"},{"type":"null"}]},"last_frame":{"anyOf":[{"$ref":"#/components/schemas/ImageInput"},{"type":"null"}]},"reference_images":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImageInput"},"type":"array"},{"type":"null"}],"title":"Reference Images"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"например '16:9' или '9:16'"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution","description":"например '720p', '1080p'"},"generate_audio":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Generate Audio"},"seed":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Seed"},"parameters":{"additionalProperties":true,"type":"object","title":"Parameters"}},"additionalProperties":false,"type":"object","required":["model","prompt"],"title":"VideoGenerationRequest","description":"POST /v1/video/generations body.\n\n`first_frame`/`last_frame` — для image-to-video (Veo принимает image\nи lastFrame в instances[0]). `reference_images` зарезервировано под\nбудущие провайдеры (Pika/Ideogram) — Veo их пока не использует.\n\nОстальные provider-specific параметры (camera control и т.п.) можно\nпередать через `parameters` — мерджатся с явными полями в адаптере."},"VideoGenerationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"task":{"type":"string","title":"Task"},"status":{"type":"string","title":"Status"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["id","task","status"],"title":"VideoGenerationResponse","description":"Async-видео задание (Р.5b-video)."},"VideoJobResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"model":{"type":"string","title":"Model"},"prompt":{"type":"string","title":"Prompt"},"duration_seconds":{"type":"integer","title":"Duration Seconds"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"cost_rub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Rub"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"}},"additionalProperties":true,"type":"object","required":["id","model","prompt","duration_seconds","status","created_at","updated_at"],"title":"VideoJobResponse","description":"Ответ на любой запрос про конкретный job — POST или GET."},"WalletResponse":{"properties":{"currency":{"type":"string","title":"Currency"},"balance":{"type":"string","title":"Balance"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["currency","balance","updated_at"],"title":"WalletResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}