
    (<i                     <   U d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
Z
 	 ddlmZ ddlmZmZ ddlmZ  ej(                  e      Z edd	
      ZddddddddddddddddddddddddddddddddgZe	eeef      ed<    G d de      Z G d de      Zdedeedf   fd Zej=                  d!      deeef   fd"       Zej=                  d#      deeef   fd$       Z ejC                  d%      d&edefd'       Z"y# e$ rZ ed      edZ[ww xY w)(uo  OpenAI 호환 API 서버 — FastAPI 기반.

엔드포인트:
  POST /v1/chat/completions  — OpenAI Chat Completions 형식
  GET  /v1/models            — 사용 가능 모델 목록
  GET  /health               — 서버 상태

실행:
  uvicorn services.openai_compat_server:app --port 8080

의존성: fastapi, uvicorn, pydantic (미설치 시 ImportError)
    N)AnyAsyncGeneratorDictListOptional)FastAPI)JSONResponseStreamingResponse)	BaseModelub   fastapi, pydantic이 필요합니다. pip install fastapi uvicorn pydantic 으로 설치하세요.zOpenAI Compatible APIz1.0.0)titleversionzgpt-4omodelopenai)idobjectowned_byzgpt-4o-minizclaude-sonnet-4-6	anthropiczclaude-opus-4-6zclaude-haiku-4-5zgemini-2.5-progooglezgemini-2.5-flashzdeepseek-chatdeepseek_SUPPORTED_MODELSc                   n    e Zd ZU eed<   eeeef      ed<   dZe	e
   ed<   dZe	e   ed<   dZe	e   ed<   y)ChatCompletionRequestr   messagesNtemperature
max_tokensFstream)__name__
__module____qualname__str__annotations__r   r   r   r   r   floatr   intr   bool     N/home/jay/workspace/.worktrees/task-2057-dev2/services/openai_compat_server.pyr   r   2   sD    J4S>""#'K%' $J$"FHTN"r&   r   c                   n    e Zd ZU eed<   eed<   eed<   eed<   eeeef      ed<   dZ	e
eeef      ed<   y)ChatCompletionResponser   r   createdr   choicesNusage)r   r   r   r    r!   r#   r   r   r   r,   r   r%   r&   r'   r)   r)   :   s@    GKLJ$sCx.!!&*E8DcN#*r&   r)   reqreturnc           	     x  K   dt        j                         j                  dd  }t        t	        j                               }dD ]8  }|d|| j
                  dd|ddd	gd
}dt        j                  |       d : |d|| j
                  di dd	gd
}dt        j                  |       d d yw)up   Server-Sent Events 형식 청크 스트리밍.
    TODO: stub — 실제 LLM 스트리밍 호출로 교체.
    	chatcmpl-N   )Thisz isz az stubz	 response.zchat.completion.chunkr   	assistantrolecontent)indexdeltafinish_reason)r   r   r*   r   r+   zdata: z

stopzdata: [DONE]

)uuiduuid4hexr#   timer   jsondumps)r-   ridr*   tokenchunkfinals         r'   _stream_responserF   H   s      djjl&&s+,
-C$))+GA /!8WYY"#{u.U*.0 1
 tzz%()../ 4"vFGE
 4::e$%T
**
s   B8B:z/healthc                     K   ddiS w)u   서버 상태 확인.statusokr%   r%   r&   r'   healthrJ   e   s      ds   z
/v1/modelsc                     K   dt         dS w)u6   사용 가능한 모델 목록 반환 (OpenAI 형식).list)r   data)r   r%   r&   r'   list_modelsrN   k   s      &788s   
z/v1/chat/completionsrequestc                 R  K   | j                   rt        t        |       dddd      S t        dt	        j
                         j                  dd  d	t        t        j                               | j                  d
dddddgd
d
d
d      }t        |j                               S w)u   OpenAI Chat Completions 호환 엔드포인트.

    stream=True  → SSE(Server-Sent Events) 스트리밍 응답
    stream=False → 단일 JSON 응답 (기본)

    TODO: stub — 실제 LLM 호출로 교체.
    ztext/event-streamzno-cacheno)zCache-ControlzX-Accel-Buffering)
media_typeheadersr0   Nr1   zchat.completionr   r4   z8This is a stub response. TODO: connect real LLM backend.r5   r;   )r8   messager:   )prompt_tokenscompletion_tokenstotal_tokens)r   r   r*   r   r+   r,   )r7   )r   r
   rF   r)   r<   r=   r>   r#   r?   r   r	   
model_dump)rO   resps     r'   chat_completionsrZ   q   s      ~~ W%*&0tL
 	
 "tzz|'',-. DIIK mm#U $
  !"1MD  122s   B%B')#__doc__r@   loggingr?   r<   typingr   r   r   r   r   fastapir   fastapi.responsesr	   r
   pydanticr   ImportError_err	getLoggerr   loggerappr   r    r!   r   r)   rF   getrJ   rN   postrZ   r%   r&   r'   <module>rh      s       < <A" 
		8	$+W= 'xH'xH'{K'{K'{K'xH'xH'zJ	+ 4S#X' 	"#I #+Y + 5 .d:S : d38n  
 94S> 9 9
 
 !3$9 3c 3 "3u  
	G s   D D	DD