{"openapi":"3.1.0","info":{"title":"Ongo Document Search Server","version":"0.1.0"},"paths":{"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/feedback":{"post":{"summary":"Feedback","description":"Record what was actually chosen, or report a bug / give an opinion.\n\nAgents are welcome to send this directly (judge=\"agent\"): if the top-1 looked wrong\nand you'd have picked another candidate, say so — it is the single most useful signal\nfor improving ranking. Free-text `note` alone (kind=\"bug\"/\"comment\") is fine too.","operationId":"feedback_feedback_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/generate":{"post":{"summary":"Ui Generate","description":"Generate a game UI shell from one sentence (beta). Returns an assembled preview (base64 PNG)\n+ a placement spec. Uses the built-in transparent sample pool by default; with mine=true and an\nAPI key, matches sprites from your own indexed pack. No Unity required — works for everyone.","operationId":"ui_generate_ui_generate_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UIGenRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/download/indexer_speech.py":{"get":{"summary":"Download Speech Indexer","description":"Gyeongcheong indexing kit — STT + embedding run on your GPU; only transcript chunks\nand vectors are pushed. Original audio never leaves your machine.","operationId":"download_speech_indexer_download_indexer_speech_py_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/download/cheongmyeong_kit.zip":{"get":{"summary":"Download Audio Kit","description":"Cheongmyeong indexing kit — runs on the user's GPU; uploads vectors+previews, never originals.","operationId":"download_audio_kit_download_cheongmyeong_kit_zip_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/download/HwiyeongIndexer.cs":{"get":{"summary":"Download Hwiyeong Plugin","description":"Download the Hwiyeong Unity indexer+matcher — drop into Assets/Editor/ and you're done.\nScans particle prefabs, renders peak-frame thumbnails in edit mode, uploads, and searches.","operationId":"download_hwiyeong_plugin_download_HwiyeongIndexer_cs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/download/CheongmyeongMatchWindow.cs":{"get":{"summary":"Download Cheongmyeong Plugin","description":"Download the Cheongmyeong Unity editor extension — drop into Assets/Editor/ and you're done.\nSearch → audition in-editor → import the original file into your project → assign to AudioSource.","operationId":"download_cheongmyeong_plugin_download_CheongmyeongMatchWindow_cs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/download/HyeAnMatchWindow.cs":{"get":{"summary":"Download Unity Plugin","description":"Download the Unity editor extension — drop it into Assets/Editor/ and you're done.","operationId":"download_unity_plugin_download_HyeAnMatchWindow_cs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/signup":{"post":{"summary":"Signup","description":"Sign up with an email and get a free API key instantly. Existing emails receive a key hint instead.","operationId":"signup_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/match":{"post":{"summary":"Match","description":"Match a sentence to assets in your library. Returns 5 candidates, winner_index (AI pick) and match_quality (good|weak|none). Set rerank=false for instant embedding-only results.","operationId":"match_match_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/add":{"post":{"summary":"Index Add","description":"Register a batch of 256px thumbnails from your library. Indexing runs in the background.\nUploads are screened for prohibited content (explicit adult material); blocked images are never\nstored and appear as `blocked` in the /index/status job counters. Game art, fantasy and stylized\nviolence are fine.","operationId":"index_add_index_add_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/add_doc":{"post":{"summary":"Index Add Doc","description":"Index documents: the file is parsed server-side into located chunks (paragraph / table row /\npage), embedded, then the original bytes are discarded. Only text chunks + vectors are stored.","operationId":"index_add_doc_index_add_doc_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/add_speech":{"post":{"summary":"Index Add Speech","description":"Register transcript chunks with client-computed vectors (Gyeongcheong indexing kit).\nSTT and embedding run on YOUR machine — original audio never reaches the server; only\ntranscript text chunks + vectors are stored.","operationId":"index_add_speech_index_add_speech_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpeechAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/axis":{"post":{"summary":"Axis","description":"Audio only — sort candidates along an intensity axis between two poles\n(e.g. heavy ↔ light). Use this instead of absolute queries for any\n\"more X / less X\" request: absolute queries cannot hear diminishing\nmodifiers (measured AUC 43% = below random), while the contrast axis\nreaches 85–94%. Pass `query` to scope the pool first, then sort.","operationId":"axis_axis_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AxisRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/status":{"get":{"summary":"Index Status","description":"Indexing progress and counts for your library.","operationId":"index_status_index_status_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/list":{"get":{"summary":"Index List","description":"List your indexed assets — per-folder counts plus every path, with caption status.\nUseful to verify what made it into the index (and for incremental sync clients).","operationId":"index_list_index_list_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index":{"delete":{"summary":"Index Clear","description":"Delete your entire index (thumbnails and vectors).","operationId":"index_clear_index_delete","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/add_vectors":{"post":{"summary":"Index Add Vectors","description":"Register assets with client-computed 1152-dim vectors (for custom pipelines).\nContent screening applies: blocked items are listed in `blocked_paths` (partial batches still\nsucceed with 200); if every item is blocked the request fails with 422 `CONTENT_BLOCKED`.","operationId":"index_add_vectors_index_add_vectors_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VectorAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/add_audio":{"post":{"summary":"Index Add Audio","description":"Register audio clips with client-computed vectors + 10s ogg previews (Cheongmyeong indexer kit).","operationId":"index_add_audio_index_add_audio_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioVectorAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/diff":{"post":{"summary":"Index Diff","description":"Compare your folder's file list with the server index — then upload thumbnails only for new files.","operationId":"index_diff_index_diff_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncPaths"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/prune":{"post":{"summary":"Index Prune","description":"Remove assets no longer present in your folder. Index quota is freed; used caption credits are not refunded.","operationId":"index_prune_index_prune_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncPaths"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/remove":{"post":{"summary":"Index Remove","description":"Remove selected images (paths) and/or whole folders from your index.\nIndex quota is freed; used caption credits are not refunded (embedding/caption GPU already spent).","operationId":"index_remove_index_remove_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/remap":{"post":{"summary":"Index Remap","description":"Move your library without re-indexing: rewrite the path prefix of existing records.\n\nVectors, captions and thumbnails are kept as-is — no re-embedding, no caption charge.\nUse it after moving a folder (e.g. project folder → NAS / Google Drive).\nSend dry_run=true first to see how many records would change.","operationId":"index_remap_index_remap_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemapRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/account":{"get":{"summary":"Account","description":"Your plan, quotas and usage.","operationId":"account_account_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/caption/generate":{"post":{"summary":"Caption Generate","description":"Generate search captions for uncaptioned assets. Credits are deducted per completed caption only.\nOptional body {paths, folders}: caption only those (still uncaptioned). Empty body = all pending, upload order.","operationId":"caption_generate_caption_generate_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CaptionRequest"},{"type":"null"}],"title":"Req"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/caption/cancel":{"post":{"summary":"Caption Cancel","description":"Stop caption generation — clears your pending caption queue. Credits are only charged on\ncompletion, so cancelling never charges for un-generated captions. Re-run /caption/generate anytime.","operationId":"caption_cancel_caption_cancel_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/caption/mode":{"post":{"summary":"Caption Mode","description":"Set caption style for your account: \"game\" (default) or \"general\" — general drops game\nassumptions, better for real photos / non-game image libraries. Applies to captions generated\nfrom now on; existing captions are kept. Re-run /caption/generate to (re)caption with the new style.","operationId":"caption_mode_caption_mode_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptionModeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/status":{"get":{"summary":"Billing Status","description":"Whether card checkout is available.","operationId":"billing_status_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/checkout":{"post":{"summary":"Billing Checkout","description":"Create a card checkout session for a plan or caption pack. Returns the payment page URL.","operationId":"billing_checkout_billing_checkout_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/portal":{"get":{"summary":"Billing Portal","description":"구독 관리(해지·카드 변경) 포털 URL. LS가 호스팅 — 프로레이션·당월 환불 없음·세금을 처리한다.\n카드(LS) 구독 계정만 대상(수동 Studio·무료는 404). 링크는 서명·만료되므로 누를 때마다 새로 발급.","operationId":"billing_portal_billing_portal_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/review":{"post":{"summary":"Submit Review","description":"Submit a review. Your first review earns bonus caption credits. Reviews may be quoted publicly only if allow_public is true.","operationId":"submit_review_review_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/caption/balance":{"get":{"summary":"Caption Balance","description":"Caption credit balance and usage summary.","operationId":"caption_balance_caption_balance_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/caption/status":{"get":{"summary":"Caption Status","description":"Caption generation progress for your library.","operationId":"caption_status_caption_status_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AudioVectorAddRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AudioVectorItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AudioVectorAddRequest"},"AudioVectorItem":{"properties":{"path":{"type":"string","title":"Path"},"preview_b64":{"type":"string","title":"Preview B64"},"audio_vec":{"items":{"type":"number"},"type":"array","title":"Audio Vec"},"cap_vec":{"items":{"type":"number"},"type":"array","title":"Cap Vec"},"caption":{"type":"string","title":"Caption","default":""},"fname_vec":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Fname Vec"},"duration_sec":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Sec"}},"type":"object","required":["path","preview_b64","audio_vec","cap_vec"],"title":"AudioVectorItem"},"AxisRequest":{"properties":{"high":{"type":"string","title":"High"},"low":{"type":"string","title":"Low"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"pool":{"type":"integer","title":"Pool","default":50},"top_k":{"type":"integer","title":"Top K","default":20},"ids":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Ids"}},"type":"object","required":["high","low"],"title":"AxisRequest"},"CaptionModeRequest":{"properties":{"mode":{"type":"string","title":"Mode"}},"type":"object","required":["mode"],"title":"CaptionModeRequest"},"CaptionRequest":{"properties":{"paths":{"items":{"type":"string"},"type":"array","title":"Paths","default":[]},"folders":{"items":{"type":"string"},"type":"array","title":"Folders","default":[]}},"type":"object","title":"CaptionRequest"},"CheckoutRequest":{"properties":{"plan":{"type":"string","title":"Plan"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["plan"],"title":"CheckoutRequest"},"DocAddRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DocItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"DocAddRequest"},"DocItem":{"properties":{"path":{"type":"string","title":"Path"},"data_b64":{"type":"string","title":"Data B64"}},"type":"object","required":["path","data_b64"],"title":"DocItem"},"FeedbackRequest":{"properties":{"query":{"type":"string","title":"Query"},"candidates":{"items":{"type":"string"},"type":"array","title":"Candidates"},"ai_winner":{"type":"string","title":"Ai Winner","default":""},"user_choice":{"type":"string","title":"User Choice","default":""},"overridden":{"type":"boolean","title":"Overridden","default":false},"layout_rule_preset":{"type":"string","title":"Layout Rule Preset","default":""},"client":{"type":"string","title":"Client","default":"unknown"},"context":{"type":"string","title":"Context","default":"game-icon"},"match_id":{"type":"string","title":"Match Id","default":""},"judge":{"type":"string","title":"Judge","default":"human"},"note":{"type":"string","title":"Note","default":""},"kind":{"type":"string","title":"Kind","default":"pick"}},"type":"object","required":["query","candidates"],"title":"FeedbackRequest","description":"A user's confirmed selection for a match — sent by any client (Unity, web, or your own pipeline)."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IndexAddRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/IndexItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"IndexAddRequest"},"IndexItem":{"properties":{"path":{"type":"string","title":"Path"},"thumb_b64":{"type":"string","title":"Thumb B64"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"rel_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rel Path"}},"type":"object","required":["path","thumb_b64"],"title":"IndexItem"},"MatchRequest":{"properties":{"query":{"type":"string","title":"Query"},"top_k":{"type":"integer","title":"Top K","default":5},"context":{"type":"string","title":"Context","default":"game-icon"},"rerank":{"type":"boolean","title":"Rerank","default":true},"min_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Width"}},"type":"object","required":["query"],"title":"MatchRequest"},"RemapRequest":{"properties":{"from_prefix":{"type":"string","title":"From Prefix"},"to_prefix":{"type":"string","title":"To Prefix"},"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","required":["from_prefix","to_prefix"],"title":"RemapRequest"},"RemoveRequest":{"properties":{"paths":{"items":{"type":"string"},"type":"array","title":"Paths","default":[]},"folders":{"items":{"type":"string"},"type":"array","title":"Folders","default":[]}},"type":"object","title":"RemoveRequest"},"ReviewRequest":{"properties":{"rating":{"type":"integer","title":"Rating"},"text":{"type":"string","title":"Text"},"name":{"type":"string","title":"Name","default":""},"allow_public":{"type":"boolean","title":"Allow Public","default":false}},"type":"object","required":["rating","text"],"title":"ReviewRequest"},"SignupRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"SignupRequest"},"SpeechAddRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SpeechChunk"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"SpeechAddRequest"},"SpeechChunk":{"properties":{"path":{"type":"string","title":"Path"},"doc":{"type":"string","title":"Doc"},"loc":{"type":"string","title":"Loc"},"start_sec":{"type":"number","title":"Start Sec"},"text":{"type":"string","title":"Text"},"txt_vec":{"items":{"type":"number"},"type":"array","title":"Txt Vec"},"fname_vec":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Fname Vec"}},"type":"object","required":["path","doc","loc","start_sec","text","txt_vec"],"title":"SpeechChunk"},"SyncPaths":{"properties":{"paths":{"items":{"type":"string"},"type":"array","title":"Paths"}},"type":"object","required":["paths"],"title":"SyncPaths"},"UIGenRequest":{"properties":{"request":{"type":"string","title":"Request"},"mine":{"type":"boolean","title":"Mine","default":false}},"type":"object","required":["request"],"title":"UIGenRequest","description":"T1 UI 껍데기 생성 요청 (베타)."},"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"},"VectorAddRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/VectorItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"VectorAddRequest"},"VectorItem":{"properties":{"path":{"type":"string","title":"Path"},"thumb_b64":{"type":"string","title":"Thumb B64"},"img_vec":{"items":{"type":"number"},"type":"array","title":"Img Vec"},"txt_vec":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Txt Vec"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"rel_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rel Path"}},"type":"object","required":["path","thumb_b64","img_vec"],"title":"VectorItem"}}}}