커스텀 미들웨어 추가하기

커스텀 미들웨어 추가하기

LangSmith에 에이전트를 배포할 때 서버에 커스텀 미들웨어를 추가해서 핵심 서버 로직을 수정하지 않고도 요청 메트릭 기록, 헤더 주입/확인, 보안 정책 적용 같은 관심사를 처리할 수 있어요. 이는 커스텀 라우트 추가와 같은 방식으로 작동해요. 자체 Starlette 앱(FastAPI, FastHTML 및 기타 호환 앱 포함)을 제공하기만 하면 돼요.

미들웨어를 추가하면 커스텀 엔드포인트든 내장 LangSmith API든 배포 전반에 걸쳐 요청과 응답을 전역적으로 가로채고 수정할 수 있어요.

아래는 FastAPI를 사용한 예시예요.

"Python 전용" 현재 커스텀 미들웨어는 langgraph-api>=0.0.26을 사용하는 Python 배포에서만 지원해요.

출처: 문서

본문

앱 만들기

기존 LangSmith 애플리케이션에서 시작해서 webapp.py 파일에 다음 미들웨어 코드를 추가하세요. 처음부터 시작한다면 CLI를 사용해 템플릿에서 새 앱을 만들 수 있어요.

langgraph new --template=new-langgraph-project-python my_new_project

LangGraph 프로젝트가 있으면 다음 앱 코드를 추가하세요:

# ./src/agent/webapp.py
from fastapi import FastAPI, Request
from starlette.middleware.base import BaseHTTPMiddleware

app = FastAPI()

class CustomHeaderMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next):
        response = await call_next(request)
        response.headers['X-Custom-Header'] = 'Hello from middleware!'
        return response

# Add the middleware to the app
app.add_middleware(CustomHeaderMiddleware)

langgraph.json 구성하기

langgraph.json 구성 파일에 다음을 추가하세요. 경로가 위에서 만든 webapp.py 파일을 가리키도록 하세요.

{
  "dependencies": ["."],
  "graphs": {
    "agent": "./src/agent/graph.py:graph"
  },
  "env": ".env",
  "http": {
    "app": "./src/agent/webapp.py:app"
  }
  // Other configuration options like auth, store, etc.
}

미들웨어 순서 커스터마이즈하기

기본적으로 커스텀 미들웨어는 인증 로직보다 먼저 실행돼요. 커스텀 미들웨어를 인증 이후에 실행하려면 http 구성에서 middleware_orderauth_first로 설정하세요. (이 커스터마이즈는 API 서버 v0.4.35 이상부터 지원돼요.)

{
  "dependencies": ["."],
  "graphs": {
    "agent": "./src/agent/graph.py:graph"
  },
  "env": ".env",
  "http": {
    "app": "./src/agent/webapp.py:app",
    "middleware_order": "auth_first"
  },
  "auth": {
    "path": "./auth.py:my_auth"
  }
}

서버 시작

서버를 로컬에서 테스트하세요:

langgraph dev --no-browser

이제 서버에 대한 모든 요청은 응답에 커스텀 헤더 X-Custom-Header를 포함할 거예요.

배포

이 앱을 그대로 클라우드나 셀프 호스팅 플랫폼에 배포할 수 있어요.

다음 단계

이제 배포에 커스텀 미들웨어를 추가했으니, 유사한 기법을 사용해 커스텀 라우트를 추가하거나 커스텀 수명 주기 이벤트를 정의해서 서버 동작을 더 커스터마이즈할 수 있어요.

더 알아보기 (Learn more)