OpenAI 모델은 Responses API로 부르되 서버에 상태를 안 남긴다
| 결정일 | 상태 | 원본 |
|---|---|---|
| 2026-08-03 | active | heymoa-ai/docs/decisions/2026-08-03-responses-api-without-server-state.md |
APP-353에서 bedrock/*가 아닌 모델을 ChatOpenAI(use_responses_api=True, output_version="responses/v1", store=False)로 부르기로 했다. bedrock/*는
ChatLiteLLM(Chat Completions) 그대로다.
왜
도구를 붙인 채로 최신 모델을 쓰려면 Responses API여야 한다. Chat Completions에서
함수 도구는 추론 강도가 none일 때만 안전한데, 오케스트레이터도 provider도 도구를 붙이고
강도를 낮음 이상으로 쓴다.
store를 안 적으면 서버가 저장한 것으로 취급한다. 그러면 다음 왕복 입력에 서버
item id가 실리는데, 우리 이력은 checkpoint에 영구히 남는다. 그 item이 만료된 뒤 대화를
이어가면 매 턴 400이고 사용자가 복구할 수 없다.
output_version을 안 적으면 배포 환경마다 응답 content 모양이 갈린다. 기본값이
환경변수를 읽는다. 응답 content가 블록 목록으로 오므로 이력 크기와 화면 텍스트는
agent/text.py의 text_of를 거쳐 센다.
되돌리는 조건
| 신호 | 무엇을 한다 |
|---|---|
채팅 cache_hit_ratio 중앙값이 0.5 아래이거나 cache_write_ratio가 0.25를 넘는다 | models.build()의 OpenAI 분기를 지우고 ChatLiteLLM으로 되돌린다 |
usage_metadata에 input_token_details가 안 실린다 | 되돌린다. 지표가 사라지면 성패를 아무도 못 본다 |
LLM_BASE_URL 환경에서 /v1/responses가 404다 | 분기 기준을 모델 이름이 아니라 api_base 유무로 바꾼다 |
| 스레드가 400을 내기 시작한다 | store=False가 안 먹은 것이다. 이력에서 reasoning 블록을 걷어내는 후속을 판다 |
두 비율은 Langfuse score로 본다. 조회 방법은
APP-319의 findings의 「조회 명령」과 같다.
같이 봐야 하는 것
경위와 대안 검토는 APP-353 spec에 있다.