feat(backend): 사내 LLM(FabriX) 게이트웨이 /api/ito + OpenCode FabriX 설정 렌더

- apps/gateway: OpenCode→FabriX 통과 중계. 헤더 3종 인증, x-llm-model-id 로 모델 선택, 401 시 Bearer/날것×클라이언트 헤더 재시도, 모델 허용 목록. ABAP_OPENCODE apps_ito 통째 복사 대신 200줄로
- opencode/opencode.fabrix.json.tmpl + render_opencode.py — .env AAF_* 로 렌더
- .env.example AAF 블록(기본 605 Gemma4, TOKEN_PREFIX=bearer). 파서가 줄 끝 # 주석을 값으로 읽던 것 수정
- tests/test_gateway.py 9개(MockTransport)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
lee-hyeon-cheol
2026-09-17 16:34:53 +09:00
co-authored by Claude Fable 5.1
parent 47d31dbe06
commit 435952f25c
14 changed files with 620 additions and 1 deletions
+18
View File
@@ -15,3 +15,21 @@ DB_SCHEMA=codeassist
# 프론트 origin (dev 는 Vite proxy 라 안 탐. Tauri 빌드용)
CORS_ORIGINS=http://localhost:15173,http://tauri.localhost,tauri://localhost
# ── 사내 LLM(FabriX) — 고객사 전용. 개발(OpenRouter)에선 전부 비워둠 ──
# OpenCode 는 opencode/opencode.json 을 FabriX 용으로 렌더해서(opencode/render_opencode.py) 이 서버의 /api/ito 로 붙음.
AAF_FABRIX_BASE_URL=
AAF_FABRIX_MODEL_ID=605
AAF_FABRIX_MODELS=605:Gemma4,339:GaussO Flash,581:GaussO Think
AAF_FABRIX_CLIENT_KEY=
AAF_FABRIX_OPENAPI_TOKEN=
AAF_FABRIX_USER_EMAIL=
# 게이트웨이마다 다를 수 있는 것 — 보통 비워둠(401 나면 자동으로 다른 형식도 시도함)
AAF_FABRIX_CLIENT_HEADER=
AAF_FABRIX_TOKEN_PREFIX=bearer
AAF_FABRIX_MAX_TOKENS=
AAF_RELAY_STREAM_USAGE=
# OpenCode → 이 서버 사이 잠금. 같은 PC 안이면 비워도 됨. 서버를 바깥에 열면 반드시 랜덤 문자열
AAF_GATEWAY_KEY=
# OpenCode 가 붙을 이 서버 포트 (render_opencode.py 가 씀)
BACKEND_PORT=8001