{"openapi":"3.1.0","info":{"title":"LLM GATEWAY","description":"LLM 모델이 업로드된 문서를 분석하여 구조화된 JSON으로 변환하는 API 서비스입니다.","version":"0.1.0"},"paths":{"/metrics":{"get":{"summary":"Metrics","description":"Endpoint that serves Prometheus metrics.","operationId":"metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/schema_file_guide":{"get":{"tags":["Guide Book"],"summary":"schema 파일 작성 가이드북 HTML 보기","description":"📄 본 가이드북은 /general/extract/structured 엔드포인트에 첨부되는 schema_file 작성법을 설명합니다.

가이드북은 여기에서 확인하세요.","operationId":"schema_guide_schema_file_guide_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/general_guide":{"get":{"tags":["Guide Book"],"summary":"/general 가이드북 HTML 보기","description":"가이드북을 여기에서 확인하세요.","operationId":"general_guide_general_guide_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/extract_guide":{"get":{"tags":["Guide Book"],"summary":"/extract 가이드북 HTML 보기","description":"가이드북을 여기에서 확인하세요.","operationId":"extract_guide_extract_guide_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/info":{"get":{"tags":["Model Management"],"summary":"'/extract', '/general' 에서 사용 가능한 모델 목록 확인","description":"✅ 'inner(내부용)' 와 'outer(외부용)' 모델의 사용 가능한 목록을 확인합니다.
\n ✅ 'Try it out' → 'Execute' 순서로 클릭합니다.
","operationId":"get_model_info_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/default_prompt":{"get":{"tags":["Model Management"],"summary":"기본 프롬프트 파일 다운로드","operationId":"download_default_prompt_default_prompt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/structured_prompt":{"get":{"tags":["Model Management"],"summary":"구조화 프롬프트 파일 다운로드","operationId":"download_structured_prompt_structured_prompt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/structured_schema":{"get":{"tags":["Model Management"],"summary":"구조화 포맷 정의 파일 다운로드","operationId":"download_structured_schema_structured_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/general/inner":{"post":{"tags":["General"],"summary":"내부 LLM 기반 범용 추론 요청 (비동기)","description":"### **요약**\n내부망에 배포된 LLM(Ollama 기반)을 사용하여 문서 기반의 범용 추론을 비동기적으로 요청합니다. 이 엔드포인트는 파일(PDF, 이미지 등)에서 텍스트를 추출하고, 사용자가 제공한 프롬프트를 적용하여 결과를 생성합니다.\n\n### **작동 방식**\n1. **요청 접수**: `input_file`, `prompt_file` 등을 받아 고유한 `request_id`를 생성하고 즉시 반환합니다.\n2. **백그라운드 처리**:\n - `input_file`이 문서나 이미지일 경우, **OCR API**를 호출하여 텍스트를 추출합니다.\n - 추출된 텍스트와 `prompt_file`의 내용을 조합하여 최종 프롬프트를 구성합니다.\n - 내부 LLM(Ollama)에 추론을 요청합니다.\n - `schema_file`이 제공되면, LLM이 스키마에 맞는 JSON을 생성하도록 요청합니다.\n3. **상태 및 결과 확인**: 반환된 `request_id`를 사용하여 `GET /general/progress/{request_id}` 엔드포인트에서 작업 진행 상태와 최종 결과를 조회할 수 있습니다.\n\n### **입력 (multipart/form-data)**\n- `input_file` (**필수**): 추론의 기반이 될 문서 파일.\n - 지원 형식: `.pdf`, `.docx`, `.jpg`, `.png`, `.jpeg` 등.\n - 내부적으로 OCR을 통해 텍스트가 자동 추출됩니다.\n- `prompt_file` (**필수**): LLM에 전달할 명령어(프롬프트)가 포함된 `.txt` 파일.\n- `schema_file` (선택): 결과물의 구조를 정의하는 `.json` 스키마 파일. 제공 시, 출력은 이 스키마를 따르는 JSON 형식으로 강제됩니다.\n- `model` (선택): 사용할 내부 LLM 모델 이름. (기본값: `gemma3:27b`)\n\n### **출력 (application/json)**\n- **초기 응답**:\n ```json\n {\n \"message\": \"작업이 백그라운드에서 실행 중입니다.\",\n \"request_id\": \"고유한 요청 ID\",\n \"status_check_url\": \"/general/progress/고유한 요청 ID\"\n }\n ```\n- **최종 결과**: `GET /general/progress/{request_id}`를 통해 확인 가능.","operationId":"general_endpoint_general_inner_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_general_endpoint_general_inner_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/general/outer":{"post":{"tags":["General"],"summary":"외부 LLM 기반 범용 추론 요청 (비동기)","description":"### **요약**\n외부 상용 LLM(예: GPT, Gemini, Claude)을 사용하여 문서 기반의 범용 추론을 비동기적으로 요청합니다. 기능과 작동 방식은 내부 LLM용 엔드포인트와 동일하나, 외부 API를 호출하는 점이 다릅니다.\n\n### **작동 방식**\n1. **요청 접수**: `input_file`, `prompt_file` 등을 받아 고유한 `request_id`를 생성하고 즉시 반환합니다.\n2. **백그라운드 처리**:\n - `input_file`에서 **OCR API**를 통해 텍스트를 추출합니다.\n - 추출된 텍스트와 `prompt_file`의 내용을 조합하여 최종 프롬프트를 구성합니다.\n - 외부 LLM API(OpenAI, Google, Anthropic 등)에 추론을 요청합니다.\n - `schema_file`이 제공되면, LLM이 스키마에 맞는 JSON을 생성하도록 요청합니다.\n3. **상태 및 결과 확인**: 반환된 `request_id`를 사용하여 `GET /general/progress/{request_id}` 엔드포인트에서 작업 진행 상태와 최종 결과를 조회할 수 있습니다.\n\n### **입력 (multipart/form-data)**\n- `input_file` (**필수**): 추론의 기반이 될 문서 파일.\n - 지원 형식: `.pdf`, `.docx`, `.jpg`, `.png`, `.jpeg` 등.\n- `prompt_file` (**필수**): LLM에 전달할 프롬프트가 포함된 `.txt` 파일.\n- `schema_file` (선택): 결과물의 구조를 정의하는 `.json` 스키마 파일.\n- `model` (선택): 사용할 외부 LLM 모델 이름. (기본값: `gemini-2.5-flash`)\n\n### **출력 (application/json)**\n- **초기 응답**:\n ```json\n {\n \"message\": \"작업이 백그라운드에서 실행 중입니다.\",\n \"request_id\": \"고유한 요청 ID\",\n \"status_check_url\": \"/general/progress/고유한 요청 ID\"\n }\n ```\n- **최종 결과**: `GET /general/progress/{request_id}`를 통해 확인 가능.","operationId":"general_endpoint_general_outer_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_general_endpoint_general_outer_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/general/progress/{request_id}":{"get":{"tags":["General"],"summary":"범용 추론 작업 상태 및 결과 조회","description":"### **요약**\n`POST /general/inner` 또는 `POST /general/outer` 요청 시 반환된 `request_id`를 사용하여, 해당 작업의 진행 상태와 최종 결과를 조회합니다.\n\n### **작동 방식**\n- `request_id`를 기반으로 Redis에 저장된 작업 로그와 결과 데이터를 조회합니다.\n- 작업이 진행 중일 때는 현재까지의 로그를, 완료되었을 때는 로그와 함께 최종 결과(`final_result`)를 반환합니다.\n\n### **입력**\n- `request_id`: 조회할 작업의 고유 ID.\n\n### **출력 (application/json)**\n- **성공 시**:\n ```json\n {\n \"request_id\": \"요청 시 사용된 ID\",\n \"progress_logs\": [\n { \"timestamp\": \"...\", \"status\": \"OCR 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"입력 길이 검사 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"LLM 추론 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"LLM 추론 완료 및 후처리 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"후처리 완료 및 결과 반환\"\", \"details\": \"...\" }\n ],\n \"final_result\": {\n \"filename\": \"입력 파일\",\n \"processed\": \"LLM의 최종 응답 내용\"\n }\n }\n ```\n- **ID가 유효하지 않을 경우 (404 Not Found)**:\n ```json\n {\n \"message\": \"{request_id}에 대한 상태 로그가 없습니다.\"\n }\n ```","operationId":"get_pipeline_status_general_progress__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/extract/inner":{"post":{"tags":["Extraction"],"summary":"내부 LLM 기반 문서 정보 추출 (비동기)","description":"### **요약**\n내부망에 배포된 LLM(Ollama 기반)을 사용하여 문서(PDF, 이미지 등)에서 정보를 추출하고 응답을 생성합니다. 이 엔드포인트는 사전 정의된 기본 프롬프트를 사용하며, 비동기적으로 처리됩니다.\n\n### **작동 방식**\n1. **요청 접수**: `input_file`을 받아 고유 `request_id`를 생성하고 즉시 반환합니다.\n2. **백그라운드 처리**:\n - `input_file`에 대해 **OCR API**를 호출하여 텍스트를 추출합니다.\n - 시스템에 내장된 기본 프롬프트와 추출된 텍스트를 조합합니다. (`prompt_file`을 업로드하여 기본 프롬프트를 대체할 수 있습니다.)\n - 내부 LLM(Ollama)에 추론을 요청합니다.\n3. **상태 및 결과 확인**: `GET /extract/progress/{request_id}`로 작업 상태와 최종 결과를 조회합니다.\n\n### **입력 (multipart/form-data)**\n- `input_file` (**필수**): 정보 추출의 대상이 될 문서 파일.\n - 지원 형식: `.pdf`, `.docx`, `.jpg`, `.png`, `.jpeg` 등.\n- `prompt_file` (선택): 기본 프롬프트 대신 사용할 사용자 정의 `.txt` 프롬프트 파일.\n- `model` (선택): 사용할 내부 LLM 모델 이름. (기본값: `gemma3:27b`)\n\n### **출력 (application/json)**\n- **초기 응답**:\n ```json\n {\n \"message\": \"작업이 백그라운드에서 실행 중입니다.\",\n \"request_id\": \"고유한 요청 ID\",\n \"status_check_url\": \"/extract/progress/고유한 요청 ID\"\n }\n ```\n- **최종 결과**: `GET /extract/progress/{request_id}`를 통해 확인 가능.","operationId":"extract_endpoint_extract_inner_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_extract_endpoint_extract_inner_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/extract/outer":{"post":{"tags":["Extraction"],"summary":"외부 LLM 기반 문서 정보 추출 (비동기)","description":"### **요약**\n외부 상용 LLM(예: GPT, Gemini)을 사용하여 문서에서 정보를 추출하고 응답을 생성합니다. 내부 LLM 엔드포인트와 작동 방식은 동일하나, 외부 API를 호출합니다.\n\n### **작동 방식**\n1. **요청 접수**: `input_file`을 받아 `request_id`를 생성 후 즉시 반환합니다.\n2. **백그라운드 처리**:\n - `input_file`에서 **OCR API**를 통해 텍스트를 추출합니다.\n - 내장된 기본 프롬프트(또는 사용자 정의 `prompt_file`)와 텍스트를 조합합니다.\n - 외부 LLM API(OpenAI, Google 등)에 추론을 요청합니다.\n3. **상태 및 결과 확인**: `GET /extract/progress/{request_id}`로 작업 상태와 최종 결과를 조회합니다.\n\n### **입력 (multipart/form-data)**\n- `input_file` (**필수**): 정보 추출 대상 문서 파일.\n- `prompt_file` (선택): 기본 프롬프트 대신 사용할 `.txt` 파일.\n- `model` (선택): 사용할 외부 LLM 모델 이름. (기본값: `gemini-2.5-flash`)\n\n### **출력 (application/json)**\n- **초기 응답**:\n ```json\n {\n \"message\": \"작업이 백그라운드에서 실행 중입니다.\",\n \"request_id\": \"고유한 요청 ID\",\n \"status_check_url\": \"/extract/progress/고유한 요청 ID\"\n }\n ```\n- **최종 결과**: `GET /extract/progress/{request_id}`를 통해 확인 가능.","operationId":"extract_endpoint_extract_outer_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_extract_endpoint_extract_outer_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/extract/progress/{request_id}":{"get":{"tags":["Extraction"],"summary":"정보 추출 작업 상태 및 결과 조회","description":"### **요약**\n`POST /extract/*` 계열 엔드포인트 요청 시 반환된 `request_id`를 사용하여, 해당 정보 추출 작업의 진행 상태와 최종 결과를 조회합니다.\n\n### **작동 방식**\n- `request_id`를 기반으로 Redis에 저장된 작업 로그와 결과 데이터를 조회합니다.\n- 작업이 진행 중일 때는 현재까지의 로그를, 완료되었을 때는 로그와 함께 최종 결과(`final_result`)를 반환합니다.\n\n### **입력**\n- `request_id`: 조회할 작업의 고유 ID.\n\n### **출력 (application/json)**\n- **성공 시**:\n ```json\n {\n \"request_id\": \"요청 시 사용된 ID\",\n \"progress_logs\": [\n { \"timestamp\": \"...\", \"status\": \"OCR 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"입력 길이 검사 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"LLM 추론 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"LLM 추론 완료 및 후처리 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"후처리 완료 및 결과 반환\"\", \"details\": \"...\" } \n ],\n \"final_result\": {\n \"filename\": \"입력 파일\",\n \"processed\": \"LLM의 최종 응답 내용\"\n }\n }\n ```\n- **ID가 유효하지 않을 경우 (404 Not Found)**:\n ```json\n {\n \"message\": \"{request_id}에 대한 상태 로그가 없습니다.\"\n }\n ```","operationId":"get_pipeline_status_extract_progress__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dummy/extract/outer":{"post":{"tags":["Dummy"],"summary":"더미 응답 생성","description":"### **요약**\n실제 모델 추론이나 파일 업로드 없이, 지정된 모델의 응답 형식을 테스트하기 위한 더미(dummy) 결과를 생성합니다.\n\n### **작동 방식**\n- 요청 시, 시스템에 미리 저장된 더미 응답(`dummy_response.json`)을 즉시 반환합니다.\n- 실제 OCR, LLM 추론 등 어떠한 백그라운드 작업도 수행하지 않습니다.\n- 네트워크나 모델 성능에 관계없이 API 응답 구조를 빠르게 확인하는 용도로 사용됩니다.\n\n### **입력 (multipart/form-data)**\n- `model` (선택): 응답 형식의 기준이 될 모델 이름. (기본값: `dummy`)\n - 이 값은 실제 추론에 사용되지 않으며, 형식 테스트용으로만 기능합니다.\n\n### **출력 (application/json)**\n- **즉시 반환**:\n ```json\n {\n \"filename\": \"dummy_input.pdf\",\n \"dummy_model\": {\n \"ocr_model\": \"dummy\",\n \"llm_model\": \"dummy\",\n \"api_url\": \"dummy\"\n },\n \"time\": {\n \"duration_sec\": \"0.00\",\n \"started_at\": \"...\",\n \"ended_at\": \"...\"\n },\n \"fields\": {},\n \"parsed\": \"dummy\",\n \"generated\": \"dummy\",\n \"processed\": {\n \"dummy response\"\n }\n }\n ```","operationId":"extract_outer_dummy_extract_outer_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_extract_outer_dummy_extract_outer_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ocr":{"post":{"tags":["OCR"],"summary":"문서 OCR 요청 (비동기)","description":"### **요약**\n문서 파일(PDF, 이미지 등)을 받아 텍스트를 추출하는 OCR(광학 문자 인식) 작업을 비동기적으로 요청합니다.\n\n### **작동 방식**\n1. **요청 접수**: `file`을 받아 고유 `request_id`를 생성하고 즉시 반환합니다.\n2. **백그라운드 처리**:\n - 업로드된 파일을 내부 저장소(MinIO)에 저장합니다.\n - 별도의 OCR 서버에 텍스트 추출 작업을 요청합니다.\n3. **상태 및 결과 확인**: 반환된 `request_id`를 사용하여 `GET /ocr/progress/{request_id}`로 작업 상태를, `GET /ocr/result/{request_id}`로 최종 텍스트 결과를 조회할 수 있습니다.\n\n### **입력 (multipart/form-data)**\n- `file` (**필수**): 텍스트를 추출할 문서 파일.\n - 지원 형식: `.pdf`, `.jpg`, `.png`, `.jpeg` 등 OCR 서버가 지원하는 형식.\n\n### **출력 (application/json)**\n- **초기 응답**:\n ```json\n [\n {\n \"request_id\": \"고유한 요청 ID\",\n \"status\": \"작업 접수\",\n \"message\": \"아래 URL을 통해 작업 상태 및 결과를 확인하세요.\"\n }\n ]\n ```\n- **최종 결과**: `GET /ocr/result/{request_id}`를 통해 확인 가능.","operationId":"ocr_only_ocr_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ocr_only_ocr_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ocr/progress/{request_id}":{"get":{"tags":["OCR"],"summary":"OCR 작업 상태 조회","description":"### **요약**\n`POST /ocr` 요청 시 반환된 `request_id`를 사용하여 OCR 작업의 현재 진행 상태를 조회합니다.\n\n### **작동 방식**\n- `request_id`를 OCR 서버에 전달하여 해당 작업의 상태를 가져옵니다.\n- 상태는 보통 'PENDING', 'IN_PROGRESS', 'SUCCESS', 'FAILURE' 등으로 표시됩니다.\n\n### **입력**\n- `request_id`: 조회할 OCR 작업의 고유 ID.\n\n### **출력 (application/json)**\n- **성공 시**:\n ```json\n {\n \"request_id\": \"요청 시 사용된 ID\",\n \"progress_logs\": [\n { \"timestamp\": \"...\", \"status\": \"OCR 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"입력 길이 검사 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"LLM 추론 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"LLM 추론 완료 및 후처리 시작\", \"details\": \"...\" },\n { \"timestamp\": \"...\", \"status\": \"후처리 완료 및 결과 반환\"\", \"details\": \"...\" }\n ],\n \"final_result\": {\n \"filename\": \"입력 파일\",\n \"parsed\": \"OCR 결과 내용\"\n }\n }\n ```\n- **ID가 유효하지 않을 경우 (404 Not Found)**:\n ```json\n {\n \"detail\": \"Meeting ID {request_id} 작업 없음\"\n }\n ```","operationId":"get_pipeline_status_ocr_progress__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audio":{"post":{"tags":["STT Gateway"],"summary":"Proxy Audio","operationId":"proxy_audio_audio_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_proxy_audio_audio_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/progress/{request_id}":{"get":{"tags":["STT Gateway"],"summary":"Proxy Progress","operationId":"proxy_progress_progress__request_id__get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/summary":{"post":{"tags":["summary"],"summary":"Summarize","operationId":"summarize_summary_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ollama_summary":{"post":{"tags":["summary"],"summary":"Ollama Summary","operationId":"ollama_summary_ollama_summary_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/task_summary":{"post":{"tags":["summary"],"summary":"Task Summary","operationId":"task_summary_task_summary_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/task_summary/{task_id}":{"get":{"tags":["summary"],"summary":"Get Status","operationId":"get_status_task_summary__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health/API":{"get":{"summary":"Health Check","description":"애플리케이션 상태 확인","operationId":"health_check_health_API_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/Redis":{"get":{"summary":"Redis Health Check","operationId":"redis_health_check_health_Redis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/MinIO":{"get":{"summary":"Minio Health Check","operationId":"minio_health_check_health_MinIO_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_extract_endpoint_extract_inner_post":{"properties":{"input_file":{"type":"string","format":"binary","title":"Input File"},"prompt_file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Prompt File","description":"⚠️ prompt_file 업로드하지 않을 경우, **'Send empty value'** 체크박스를 반드시 해제해주세요."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","default":"gemma3:27b"}},"type":"object","required":["input_file"],"title":"Body_extract_endpoint_extract_inner_post"},"Body_extract_endpoint_extract_outer_post":{"properties":{"input_file":{"type":"string","format":"binary","title":"Input File"},"prompt_file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Prompt File","description":"⚠️ prompt_file 업로드하지 않을 경우, **'Send empty value'** 체크박스를 반드시 해제해주세요."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","default":"gemini-2.5-flash"}},"type":"object","required":["input_file"],"title":"Body_extract_endpoint_extract_outer_post"},"Body_extract_outer_dummy_extract_outer_post":{"properties":{"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"실제 추론 없이 포맷 테스트용으로 사용됩니다.","default":"dummy"}},"type":"object","title":"Body_extract_outer_dummy_extract_outer_post"},"Body_general_endpoint_general_inner_post":{"properties":{"input_file":{"type":"string","format":"binary","title":"Input File"},"prompt_file":{"type":"string","format":"binary","title":"Prompt File"},"schema_file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Schema File"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","default":"gemma3:27b"}},"type":"object","required":["input_file","prompt_file"],"title":"Body_general_endpoint_general_inner_post"},"Body_general_endpoint_general_outer_post":{"properties":{"input_file":{"type":"string","format":"binary","title":"Input File"},"prompt_file":{"type":"string","format":"binary","title":"Prompt File"},"schema_file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Schema File"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","default":"gemini-2.5-flash"}},"type":"object","required":["input_file","prompt_file"],"title":"Body_general_endpoint_general_outer_post"},"Body_ocr_only_ocr_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_ocr_only_ocr_post"},"Body_proxy_audio_audio_post":{"properties":{"audio_file":{"type":"string","format":"binary","title":"Audio File"}},"type":"object","required":["audio_file"],"title":"Body_proxy_audio_audio_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"SummaryRequest":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"SummaryRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}