- 서비스명:
philosopher-server - 프레임워크:
FastAPI - API 버전 Prefix:
/api/v1 - 문서 기준일:
2026-04-15
- 콘텐츠 타입:
application/json - 인증:
/api/v1하위 대부분 엔드포인트는Authorization: Bearer <Supabase Access Token>필요 - JWT 검증: Supabase JWKS 기반 서명 검증,
RS256/ES256알고리즘 허용 - 공통 응답 포맷: 현재는 엔드포인트별 단순 JSON 응답 사용
- 사용자 격리: 프로젝트/대화/메시지는 토큰의
sub(user id) 기준으로 분리 저장
성공 응답:
{
"status": "ok"
}성공 응답:
{
"status": "ok"
}현재 로그인한 사용자 정보를 반환합니다.
성공 응답:
{
"id": "b6450d8d-1748-4364-8a1a-6e6ce6d8ce64",
"email": "user@example.com",
"role": "authenticated"
}사용자 프로젝트를 생성합니다.
요청:
{
"name": "윤리학 프로젝트",
"description": "도덕 철학 대화",
"instruction": "항상 핵심 요약 3줄을 마지막에 추가"
}주요 오류 응답:
409: 동일 사용자에게 같은 이름의 프로젝트가 이미 존재함 (Project name already exists)
현재 사용자 프로젝트 목록을 반환합니다.
- 기본 프로젝트(
is_default=true)는 내부 개념으로만 사용되며 목록에 노출되지 않습니다. - 목록 정렬:
updated_at내림차순,created_at내림차순
프로젝트 설정을 수정합니다.
요청(필드 중 최소 1개 필요):
{
"name": "윤리학 프로젝트 v2",
"instruction": "답변 전에 반례를 먼저 검토해"
}주요 오류 응답:
409: 동일 사용자에게 같은 이름의 프로젝트가 이미 존재함 (Project name already exists)
일반 채팅용 대화를 생성합니다.
- 서버는 사용자별 기본 프로젝트(숨김)를 내부적으로 생성/재사용하며, 사용자는 기본 프로젝트를 직접 볼 필요가 없습니다.
title을 생략하면null로 저장되며, 첫 메시지 전송 시 사용자 첫 메시지 기반으로 자동 제목이 설정됩니다.
요청:
{
"philosopher": "plato",
"title": "일반 채팅"
}philosopher허용값:socrates,nietzsche,hannah_arendt,plato,aristotle,rene_descartes,immanuel_kant,confucius,simone_de_beauvoir
특정 프로젝트에 철학자 대화를 생성합니다.
요청:
{
"philosopher": "plato",
"title": "정의란 무엇인가"
}philosopher허용값:socrates,nietzsche,hannah_arendt,plato,aristotle,rene_descartes,immanuel_kant,confucius,simone_de_beauvoirtitle을 생략하면null로 저장되며, 첫 메시지 전송 시 사용자 첫 메시지 기반으로 자동 제목이 설정됩니다.
프로젝트 단위 대화 목록을 조회합니다.
대화의 소속 프로젝트를 변경합니다(프로젝트 이동).
project_id가null이면 사용자 기본 프로젝트(숨김)로 이동합니다.
요청:
{
"project_id": "target-project-id"
}사용자 메시지를 저장하고, 선택된 철학자 페르소나로 AI 응답을 생성해 함께 저장합니다.
- 대화 제목이 비어 있는 경우, 첫 메시지 전송 시 해당 메시지 내용 기반으로 제목이 자동 설정됩니다.
- 자동 제목은 공백 정규화 후 최대 80자로 저장됩니다.
요청:
{
"content": "정의는 배울 수 있는가?"
}성공 응답:
{
"user_message": {
"id": "...",
"role": "user",
"content": "정의는 배울 수 있는가?",
"created_at": "2026-04-13T14:21:00.000000Z"
},
"assistant_message": {
"id": "...",
"role": "assistant",
"content": "...",
"created_at": "2026-04-13T14:21:01.000000Z"
}
}주요 오류 응답:
404: 다른 사용자 소유 대화 또는 존재하지 않는 대화 (Conversation not found)503:OPENAI_API_KEY누락 (OPENAI_API_KEY is not configured)502: OpenAI 호출 실패/빈 응답
대화 메시지 히스토리를 시간순으로 조회합니다.
대화 1개를 삭제합니다.
- 본인 소유 대화만 삭제할 수 있습니다.
- 삭제 성공 시
204 No Content를 반환합니다. - 대화에 속한 메시지는 함께 삭제됩니다.
주요 오류 응답:
404: 다른 사용자 소유 대화 또는 존재하지 않는 대화 (Conversation not found)
프로젝트 1개를 삭제합니다.
- 본인 소유 일반 프로젝트만 삭제할 수 있습니다.
- 기본 프로젝트(
is_default=true)는 삭제 대상이 아닙니다. - 삭제 성공 시
204 No Content를 반환합니다. - 프로젝트에 속한 대화와 메시지는 모두 함께 삭제됩니다.
주요 오류 응답:
404: 다른 사용자 소유 프로젝트 또는 존재하지 않는 프로젝트 (Project not found)
철학자 고정 voice 매핑 기반으로 서버에서 Neural TTS를 생성하고, audio/mpeg 바이너리를 직접 반환합니다.
요청:
{
"philosopher_id": "plato",
"text": "정의는 가르칠 수 있는가?"
}philosopher_id허용값:socrates,nietzsche,hannah_arendt,plato,aristotle,rene_descartes,immanuel_kant,confucius,simone_de_beauvoir
성공 응답:
200 OKContent-Type: audio/mpeg- 응답 본문: MP3 바이너리
요청 정책:
- 텍스트 길이 제한: 최대
2,000자 - 텍스트 전처리: 마크다운/특수기호 최소 정리
- 내부 분할 처리: 긴 텍스트는 provider 요청 단위로 분할
- timeout/retry: provider 호출당
8초 timeout, 실패 시1회 retry - rate limit: 사용자 기준 분당 요청 제한 적용
오류 응답(JSON):
400TTS_INVALID_REQUEST: 잘못된 요청 바디400TTS_INVALID_TEXT: 전처리 후 텍스트가 비어 있음400TTS_TEXT_TOO_LONG: 최대 길이 초과401TTS_UNAUTHORIZED: 사용자 클레임 불량429TTS_RATE_LIMITED: 요청 과다502TTS_PROVIDER_ERROR|TTS_PROVIDER_UNAVAILABLE: provider 오류503TTS_NOT_CONFIGURED:OPENAI_API_KEY미설정504TTS_PROVIDER_TIMEOUT: provider timeout
DATABASE_URL: 미설정 시sqlite:///./.local/philosopher.db사용OPENAI_API_KEY: 철학자 AI 응답 생성에 필요TTS_OPENAI_MODEL: TTS 모델 (기본gpt-4o-mini-tts)TTS_TIMEOUT_SECONDS: provider timeout 초 (기본8)TTS_RETRY_COUNT: provider 재시도 횟수 (기본1)TTS_MAX_CHARS: 요청 텍스트 최대 길이 (기본2000)TTS_CHUNK_CHARS: provider 분할 호출 기준 길이 (기본500)TTS_RATE_LIMIT_PER_MINUTE: 사용자별 분당 요청 제한 (기본20)- 모델은 서버에서
gpt-4o-mini로 고정
- OpenAI API:
POST /v1/responses - 모델:
gpt-4o-mini(환경변수로 변경 불가) - 철학자 시스템 프롬프트는 서버에서 고정 관리:
socratesnietzschehannah_arendtplatoaristotlerene_descartesimmanuel_kantconfuciussimone_de_beauvoir
- 프로젝트에
instruction이 설정된 경우, 철학자 시스템 프롬프트 뒤에 결합되어 대화 생성에 반영됩니다.
- Swagger UI:
GET /docs - ReDoc:
GET /redoc - OpenAPI JSON:
GET /openapi.json
- 현재 버전:
v1 - 하위 호환성을 깨는 변경은 신규 버전 Prefix(예:
/api/v2)로 분리합니다.
2026-04-13: 헬스체크/인증 API 추가2026-04-13: 프로젝트/철학자 대화/메시지 저장 API 추가2026-04-13: OpenAI 모델gpt-4o-mini고정 정책 반영2026-04-14: 프로젝트 이동/설정 수정 API 추가2026-04-14: 일반 채팅용 기본 프로젝트(숨김) 개념 도입2026-04-14: 프로젝트 지침(instruction) AI 반영2026-04-14: 프로젝트 삭제/대화 삭제 API 추가2026-04-14: 사용자별 프로젝트 이름 중복 방지(409) 추가2026-04-14: 제목 없는 대화의 첫 메시지 전송 시 자동 제목 설정 추가2026-04-15: 기존 3인(socrates,nietzsche,hannah_arendt) 유지 + 신규 6인 추가로 총 9인 지원