Skip to main content
앱의 서버 로직은 모두 app/api/ 아래의 Next.js API 라우트에 있습니다. 프런트엔드는 이 라우트를 통해 모델 제공업체를 호출하고, 서버는 키 주입, API 주소 선택, 요청 매개변수 조정을 담당합니다.
이 라우트는 앱 내부 API로 주로 프런트엔드에서 사용하며, 매개변수는 버전에 따라 바뀔 수 있습니다. 다른 프로그램에서 호출하려면 저장소의 소스 코드를 기준으로 하세요.

공통 규칙

요청 헤더

공통 매개변수

모델 관련 라우트는 모두 다음 매개변수를 받습니다.
요청 본문에 apiUrl을 포함할 수 없습니다. 서버는 400을 반환하고 「客户端不再支持自定义 API URL,请在服务器环境变量中配置上游端点。」라는 메시지를 표시합니다(한국어 화면에서는 「사용자 지정 API URL은 서버 환경 변수에서 설정해 주세요.」). API 주소는 DEEPSEEK_API_URL 또는 GEMINI_API_URL로만 설정할 수 있습니다.

접속 인증

CODE를 설정하면 /api/auth와 /api/umami/script를 제외한 모든 라우트는 요청에 유효한 ja_session Cookie가 있어야 하며, 없으면 다음을 반환합니다.

오류 형식

오류가 발생하면 라우트는 해당 HTTP 상태 코드와 통일된 형식의 오류를 반환합니다.
  • message는 항상 간체 중국어 원문이며 X-App-Locale의 영향을 받지 않습니다. 프런트엔드가 알려진 오류를 화면 언어로 번역해 표시합니다.
  • 모델 제공업체가 반환한 원본 오류 메시지는 그대로 전달되며, 프런트엔드가 번역하지 않습니다.
  • 모델 제공업체의 응답이 60초를 넘으면 스트리밍이 아닌 요청은 504와 「上游接口请求超时,请稍后重试。」를 반환합니다.

스트리밍 응답

스트리밍 출력을 켜면 라우트는 상위 API의 OpenAI 호환 Server-Sent Events 스트림을 그대로 전달하며, Content-Type은 text/event-stream입니다. 끄면 상위 API의 전체 JSON 응답을 반환합니다. 스트리밍 출력에서 90초 동안 새 데이터가 없으면 서버는 스트림에 오류 이벤트를 보낸 뒤 연결을 종료합니다.

라우트 목록

POST /api/analyze

모델은 {"tokens": [{"word", "pos", "furigana"}]} 형태의 구조화된 JSON을 반환합니다.

POST /api/translate

번역 언어는 X-App-Locale에 따라 결정되며, 원문의 단락과 줄바꿈 구조를 유지합니다.

POST /api/word-detail

단어 상세 설명은 chineseTranslation, dictionaryForm, explanation, conjugation, example, exampleTranslation, pos, furigana 필드를 반환합니다. 어구 상세 설명은 category와 breakdown을 추가로 반환합니다.

POST /api/image-to-text

POST /api/chat

서버는 메시지 목록 앞에 일본어 학습 도우미용 시스템 프롬프트를 추가합니다.

POST /api/tts

성공하면 Base64로 인코딩된 오디오를 반환합니다.

GET /api/daily-sentence

그날(일본 시간)의 오늘의 문장을 반환하며 date, text, tokens와 네 가지 언어의 translation을 포함합니다. 응답의 Cache-Control은 일본 시간 자정까지 유효합니다. 서버에 사용 가능한 키가 없거나 생성에 실패하면 503을 반환하고, 프런트엔드는 내장된 예비 문장을 사용합니다.

/api/auth

  • GET: { "requiresAuth": boolean, "authenticated": boolean }을 반환합니다.
  • POST: 요청 본문은 { "password": "..." }입니다. 비밀번호가 맞으면 { "success": true }를 반환하고 세션 Cookie를 기록하며, 틀리면 401을 반환합니다.