---
title: "🔁 260527-수요일_E7-AI브리프 OpenAI 라인 전환"
notion_id: "36d229620868813bbf44f1b4e97f9ace"
notion_url: "https://app.notion.com/p/36d229620868813bbf44f1b4e97f9ace"
category: "workreport"
parent: "Claude Code 작업보고"
updated: "2026-05-27"
priority: "Medium"
purpose: "AI 브리프 기본 백엔드를 Claude Sonnet 4 → OpenAI gpt-5.4-mini로 전환, Claude는 fallback 유지 (CF Workers 프록시 어댑터)"
---

## 📌 요약

- 달록 AI 브리프 기본 백엔드를 **Claude Sonnet 4 → OpenAI gpt-5.4-mini-2026-03-17** 로 전환.
- Claude Sonnet 4는 폐기하지 않고 **fallback 백엔드**로 유지(즉시 롤백 가능).
- CF Workers 프록시(`dallog-brief-proxy`)에 provider 어댑터를 도입해 응답을 기존 Anthropic Messages 형식으로 정규화 → 클라이언트 파서(`extractProseBody`·`parseVisualBrief`) 무손상.
- Codex 적대적 검수 1회 수행 후 3건(공개 Worker Origin 게이트·OpenAI 토큰 파라미터 호환·빈 응답 fallback) 반영.
- `npm run build` 통과. 커밋 `e81fe3d` → `origin/main` push 완료.

## 결정 배경

- 기획서: `docs/260527_ai_brief_claude_to_gpt_plan.md` ([01.260518_CF Workers AI 브리프 프록시 구축](#/doc/workreport-01) 후속).
- 사용자 결정 — 비용보다 **속도·최신 DB 요약 역량·UI 적합성·품질** 우선. 비용은 마지막.
- A/B 운영 여력 부족 → 기획 단계에서 모델 확정 후 즉시 전환.
- 신규 모델: OpenAI `/v1/models` 조회로 `gpt-5.4-mini` / `gpt-5.4-mini-2026-03-17` 확인. **안정성 우선**으로 날짜 고정 모델 채택.

## 환경변수 확정값

- `OPENAI_API_KEY` — Cloudflare Workers Secret (등록 완료, 개인 키 → 외부 배포 전 사업자 계정 키로 교체 예정).
- `ANTHROPIC_API_KEY` — Cloudflare Workers Secret (기존 유지, fallback).
- `DEFAULT_BRIEF_PROVIDER=openai`
- `FALLBACK_BRIEF_PROVIDER=anthropic`
- `DEFAULT_BRIEF_MODEL=gpt-5.4-mini-2026-03-17`
- `FALLBACK_BRIEF_MODEL=claude-sonnet-4-20250514`
- 키 원문은 코드·문서·로그 어디에도 기록하지 않음. payload 는 현재 로그인 user_id 기준 데이터만 포함.

## 수정 파일 (6개)

| 파일 | 변경 요지 |
|---|---|
| `workers/brief-proxy/index.js` | OpenAI / Anthropic 어댑터 + provider/모델 결정 + fallback + 응답 Anthropic 형식 정규화 + Origin 게이트 |
| `wrangler.toml` | `[vars]` 블록에 4개 변수 추가, 시크릿 가이드 주석 |
| `.env.example` | Worker 측 환경변수 메모(키 원문 없음) |
| `src/lib/briefApi.ts` | `provider: 'auto'` 호출로 전환, model 필드 제거 |
| `src/lib/claude.ts` | 동일 (함수명 `callClaude`는 호환성 유지) |
| `src/pages/CoachNotes.tsx` | UI 문구 `"Claude 브리프 생성 중..."` → `"AI 분석 및 보고 생성중..."`, model 필드 제거 |

## 아키텍처

```javascript
React Client (dallog.pages.dev)
    ↓ POST { provider: 'auto', system?, messages, max_tokens }
CF Workers (dallog-brief-proxy.ccy4848.workers.dev)
    ├─ DEFAULT_BRIEF_PROVIDER 기준 1차 호출 (OpenAI Chat Completions)
    │       ↓
    │   응답 → Anthropic Messages 형식으로 정규화
    │   { content: [{ type:'text', text }], usage:{ input_tokens, output_tokens } }
    │
    └─ 1차 실패 / 빈 본문 → FALLBACK_BRIEF_PROVIDER 자동 시도 (Anthropic Messages)
```

- 클라이언트는 모델명을 보내지 않음 → 모델 변경·계정 키 교체 시 코드 수정 불필요(Worker env 만 변경).
- 응답 메타는 응답 헤더 `x-brief-provider` / `x-brief-model` / `x-brief-fallback` 로 노출 (디버깅용).

## Codex 적대적 검수 반영 (verdict: needs-attention)

1. **[high] 공개 Worker 가 유료 모델 API 무단 소비 가능**
	- 기존: CORS 헤더만 정규화 → 비-브라우저 클라이언트가 [workers.dev](http://workers.dev) URL 로 직접 POST 가능.
	- 반영: `ALLOWED_ORIGINS` 미일치 POST 는 403 거절(방어선 1단계).
	- 본격 사용자 인증·rate limit 는 별도 작업 범위로 분리(v0.9 충족기준 §5 작업 2 보안 트랙).
2. **[high] OpenAI 페이로드에 `max_tokens` + `max_completion_tokens` 동시 전송 위험**
	- 신형 OpenAI 모델은 `max_completion_tokens` 만 허용 → 동시 전송 시 400 위험.
	- 반영: `max_completion_tokens` 만 전송.
3. **[medium] OpenAI 빈 본문이 ok로 처리되어 fallback 차단**
	- 콘텐츠 필터링·refusal·길이 0 → 200 응답으로 통과 → Anthropic fallback 트리거 안 됨.
	- 반영: 빈 본문은 실패로 분류 → Anthropic fallback 자동 시도.

## 빌드·커밋

- `npm run build` 통과 (Codex 반영 전후 모두).
- 커밋: `e81fe3d feat(brief): migrate AI brief provider to OpenAI with Claude fallback`
- push: `origin/main` 완료 (사용자 터미널에서 직접 수행).

## 회귀 / 호환성 체크

- `extractProseBody` / `parseVisualBrief` — Worker 응답이 Anthropic Messages 형식으로 정규화되므로 영향 없음.
- 기존 `briefApi.ts` / `claude.ts` 함수 시그니처 동일 — 호출자(`CoachNotes.tsx` 외 다른 사용처) 변경 불필요.
- Anthropic fallback 경로 100% 유지 — OpenAI Worker secret 미설정 시 자동으로 Anthropic 사용.

## 미수행 / 후속

- 로컬 dev 서버 + Worker 동시 구동 E2E 1회 검증 — 사용자 환경에서 `wrangler secret put OPENAI_API_KEY` 등록 후 수행 권장.
- 외부 사용자 배포 전 OPENAI_API_KEY 를 사업자 계정 키로 교체(코드 수정 불필요, Worker secret 만 갱신).
- Worker rate limit / 사용자 인증 — v0.9 충족기준 §5 작업 2 보안 트랙에서 통합 처리.

## 참조

- 기획서: `docs/260527_ai_brief_claude_to_gpt_plan.md`
- 이전 인프라 보고: [01.260518_CF Workers AI 브리프 프록시 구축](#/doc/workreport-01)
- 체크리스트 항목: E-7 (E파트 AI브리프)
- 커밋: `e81fe3d`

---

*2026-05-27 (수) · Claude Opus 4.7 (1M context)*
