251126 openai api 를 빌트인한 fastapi 보일러플레이트 생성하는 cli 를 제공해줘. 아주 좋습니다. “FastAPI +…
요약
OpenAI API가 내장된 FastAPI 프로젝트를 빠르게 생성할 수 있는 CLI 스캐폴더 스크립트를 소개합니다. 이 스크립트는 프로젝트 폴더 구조, 의존성 파일(requirements.txt), 환경 설정(.env.example), 그리고 기본 API 라우팅을 포함한 보일러플레이트를 자동으로 구성해 줍니다.
핵심 포인트
- FastAPI와 OpenAI API를 결합한 프로젝트 초기 설정 자동화
- Python 스크립트를 이용한 CLI 기반의 프로젝트 스캐폴딩 제공
- requirements.txt, .gitignore, .env.example 등 필수 설정 파일 자동 생성
- Pydantic Settings와 python-dotenv를 활용한 환경 변수 관리 구조 포함
251126
openai api 를 빌트인한 fastapi 보일러플레이트 생성하는 cli 를 제공해줘.
아주 좋습니다. “FastAPI + OpenAI 내장 보일러플레이트”를 만들어주는 간단한 CLI 스캐폴더를 하나 만들어보겠습니다.
아래 스크립트를 그대로 파일로 저장해 두고 실행하면 됩니다.
- CLI 스크립트: fastapi_openai_cli.py
이 파일 하나로 새 프로젝트 폴더를 만들어주는 구조입니다.
#!/usr/bin/env python
"""
FastAPI + OpenAI boilerplate 생성 CLI
사용법:
python fastapi_openai_cli.py new my-fastapi-openai-app
"""
import argparse
from pathlib import Path
import textwrap
import sys
PROJECT_FILES = {
"requirements.txt": """
fastapi
uvicorn[standard]
openai>=1.0.0
pydantic-settings
python-dotenv
""",
".gitignore": """
__pycache__/
*.py[cod]
.env
.venv
venv
.DS_Store
.pytest_cache
""",
"
http://
README.md
": """
# FastAPI + OpenAI Boilerplate
이 프로젝트는 FastAPI 기반으로 OpenAI API를 래핑한 기본 보일러플레이트입니다.
## 빠른 시작
```bash
python -m venv .venv
source .venv/bin/activate # Windows: .venv\\Scripts\\activate
pip install -r requirements.txt
cp .env.example .env # .env 직접 작성
uvicorn app.main:app --reload
```
### 테스트
```bash
curl -X POST http://127.0.0.1:8000/api/v1/chat \\
-H "Content-Type: application/json" \\
-d '{"message": "안녕"}'
```
""",
".env.example": """
# OpenAI 설정
OPENAI_API_KEY=your_openai_api_key_here
# 커스텀 프록시나 다른 호스트를 쓸 경우만 설정
# OPENAI_BASE_URL=
https://
api.openai.com/v1
""",
"app/__init__.py": """
# app 패키지
""",
"app/main.py": """
from fastapi import FastAPI
from app.api.v1.routes import router as api_router
app = FastAPI(
title="FastAPI + OpenAI Boilerplate",
version="0.1.0",
)
app.include_router(api_router, prefix="/api/v1")
@app
.get("/health")
async def health():
return {"status": "ok"}
""",
"app/api/__init__.py": """
# app.api 패키지
""",
"app/api/v1/__init__.py": """
# app.api.v1 패키지
""",
"app/api/v1/routes.py": """
from fastapi import APIRouter
from app.api.v1 import openai_chat
router = APIRouter()
router.include_router(openai_chat.router, prefix="/chat", tags=["chat"])
""",
"app/api/v1/openai_chat.py": """
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from typing import Optional
from app.core.openai_client import get_openai_client
from openai import OpenAI
class ChatRequest(BaseModel):
message: str
system_prompt: Optional[str] = "You are a helpful assistant."
class ChatResponse(BaseModel):
reply: str
router = APIRouter()
@router
.post("", response_model=ChatResponse)
async def chat(
body: ChatRequest,
client: OpenAI = Depends(get_openai_client),
) -> ChatResponse:
try:
completion =
http://
client.chat
.completions.create(
model="gpt-4.1-mini",
messages=[
{"role": "system", "content": body.system_prompt},
{"role": "user", "content": body.message},
],
)
except Exception as e:
# 실제 운영에서는 로깅 후 에러 메시지를 정제해서 전달하는 것이 좋습니다.
raise HTTPException(status_code=500, detail=str(e))
message = completion.choices[0].message
reply = message.content if isinstance(message.content, str) else message.content[0].text
return ChatResponse(reply=reply)
""",
"app/core/__init__.py": """
# app.core 패키지
""",
"app/core/config.py": """
from pydantic_settings import BaseSettings, SettingsConfigDict
from functools import lru_cache
from typing import Optional
class Settings(BaseSettings):
OPENAI_API_KEY: str
OPENAI_BASE_URL: Optional[str] = None
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
extra="ignore",
)
@lru_cache
def get_settings() -> Settings:
return Settings()
""",
"app/core/openai_client.py": """
from functools import lru_cache
from openai import OpenAI
from app.core.config import get_settings
@lru_cache
def _client() -> OpenAI:
settings = get_settings()
kwargs = {}
if settings.OPENAI_BASE_URL:
kwargs["base_url"] = settings.OPENAI_BASE_URL
return OpenAI(
api_key=settings.OPENAI_API_KEY,
**kwargs,
)
def get_openai_client() -> OpenAI:
return _client()
""",
}
def write_file(base_path: Path, relative_path: str, content: str) -> None:
target = base_path / relative_path
target.parent.mkdir(parents=True, exist_ok=True)
normalized = textwrap.dedent(content).lstrip("\n")
target.write_text(normalized, encoding="utf-8")
def create_project(project_name: str) -> None:
base_path = Path(project_name).resolve()
if base_path.exists() and any(base_path.iterdir()):
print(f"[ERROR] 디렉터리가 이미 존재하고 비어있지 않습니다: {base_path}")
sys.exit(1)
base_path.mkdir(parents=True, exist_ok=True)
for rel_path, content in PROJECT_FILES.items():
write_file(base_path, rel_path, content)
print(f"\n
프로젝트가 생성되었습니다: {base_path}")
print("\n다음 명령으로 시작할 수 있습니다:\n")
print(f" cd {project_name}")
print(" python -m venv .venv")
print(" # Windows:")
print(" # .venv\Scripts\activate")
print(" # macOS/Linux:")
print(" # source .venv/bin/activate")
print(" pip install -r requirements.txt")
print(" cp .env.example .env # .env 내용 수정")
print(" uvicorn app.main:app --reload")
def main() -> None:
parser = argparse.ArgumentParser(
description="FastAPI + OpenAI boilerplate 생성 CLI",
)
subparsers = parser.add_subparsers(dest="command")
new_cmd = subparsers.add_parser("new", help="새 FastAPI+OpenAI 프로젝트 생성")
new_cmd.add_argument("name", help="프로젝트 디렉터리 이름")
args = parser.parse_args()
if args.command == "new":
create_project(
http://
args.name
)
else:
parser.print_help()
if name == "main":
main()
- 사용 방법
위 코드를 fastapi_openai_cli.py 로 저장합니다.
원하는 위치에서 실행합니다.
python fastapi_openai_cli.py new my-fastapi-openai-app
생성된 프로젝트로 이동해서 실행합니다.
cd my-fastapi-openai-app
python -m venv .venv
Windows
.venv\Scripts\activate
macOS / Linux
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # 여기서 OPENAI_API_KEY 채워 넣기
uvicorn app.main:app --reload
3. OpenAI 연동 엔드포인트
생성된 보일러플레이트에는 이미 이 엔드포인트가 들어가 있습니다.
URL: POST /api/v1/chat
Body 예시:
{
"message": "오늘 서울 날씨 어때?",
"system_prompt": "You are a helpful assistant for Korean users."
}
응답 예시:
{
"reply": "서울의 날씨는 ..."
}
4. 다음 확장 포인트
스트리밍 응답(서버 센트 이벤트) 엔드포인트 추가
여러 모델 선택 지원 (model을 body로 받도록 수정)
프로젝트 생성 옵션화 (--with-docker, --with-poetry 등)
원하시면 “스트리밍 버전”, “복수 서비스용 구조(LLM 서비스 분리)” 버전도 같이 넣는 확장 CLI도 설계해 드리겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 X 새 AI 모델의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기