agentjido/req_llm

Composable Elixir library for LLM interactions built on Req and Finch

ReqLLM이란 무엇인가요?

ReqLLM은 단일하고 일관된 API를 통해 많은 대규모 언어 모델(LLM) 제공업체(OpenAI, Anthropic, Azure, Google Gemini 등)와 통신할 수 있게 해주는 오픈 소스 Elixir 라이브러리입니다. 인기 있는 Req HTTP 클라이언트와 Finch 스트리밍 라이브러리를 기반으로 구축되어, 각 제공업체의 특이한 사항들을 처리하므로 어떤 모델을 사용하든 동일한 Elixir 코드를 작성할 수 있습니다.


왜 중요한가요?

  • 제공업체에 독립적 – 21개 이상의 제공업체로부터 온 1,200개 이상의 모델이 라이브러리의 모델 카탈로그에 등록되어 있습니다. "anthropic:claude-haiku-4-5"와 같은 문자열로 모델을 선택하면 라이브러리가 해당 제공업체에 맞는 HTTP 형태로 요청을 변환합니다.
  • 통합된 고수준 헬퍼generate_text/3, stream_text/3, generate_object/4와 같은 함수는 Vercel AI SDK 스타일을 모방하여, 동일한 호출 시그니처로 일반 텍스트, 구조화된 JSON 또는 이미지까지 생성할 수 있습니다.
  • 스트리밍 지원 – Finch를 통해 제공업체 전반에서 실시간 토큰 스트리밍이 작동하며, 사용량 메타데이터를 수집하면서 토큰을 생성하는 StreamResponse를 제공합니다.
  • 구조화된 출력 및 도구 호출 – 기대하는 결과의 형태(객체, 배열, JSON 스키마 등)를 설명할 수 있으며, 라이브러리가 제공업체의 응답을 검증하여 함수 호출 워크플로우를 더 쉽게 만들어줍니다.
  • 비용 및 사용량 추적 – 모든 응답에는 토큰 수와 최선의 USD 비용 추정치가 포함되며, OpenTelemetry 또는 기타 관측 스택에 연결할 수 있는 텔레메트리 이벤트도 제공됩니다.

핵심 개념 (빠른 요약)

개념 설명 일반적인 용도
Model spec 제공업체와 모델 ID를 식별하는 문자열, 튜플 또는 %LLMDB.Model{} (예: "openai:gpt-4o"). 호출할 모델 선택.
Context ReqLLM.Context.*로 구축된 시스템/사용자/어시스턴트 메시지 목록. 멀티턴 대화 기록 제공.
Output descriptor 기대하는 형태(텍스트, 객체, 배열, JSON 스키마 등)를 선언하는 ReqLLM.Output 구조체. 모델에 구조화된 데이터 반환 요청.
Response structs ReqLLM.Response, ReqLLM.StreamResponse, ReqLLM.Usage. 생성된 텍스트, 이미지, 임베딩, 사용량 및 비용 확인.
Provider transports 내부적으로 Req가 HTTP 요청을 구축하고, Finch가 스트리밍을 처리합니다. Req 또는 Finch를 직접 호출할 필요가 없습니다.
Key management ReqLLM.Keys가 환경 변수, .env 파일 또는 인메모리 저장소에서 API 키를 가져옵니다. 인증 정보를 코드에서 분리합니다.

시작하기 (최단 경로)

# Igniter를 통해 라이브러리 추가 (권장)
mix igniter.install req_llm
# 코드 내에서
model = "anthropic:claude-haiku-4-5"

# 단순 원샷 텍스트 생성
text = ReqLLM.generate_text!(model, "Hello world")
# => "Hello! How can I assist you today?"

# 구조화된 객체 생성
schema = [name: [type: :string, required: true], age: [type: :pos_integer]]
person = ReqLLM.generate_object!(model, "Generate a person", schema)
# => %{name: "John Doe", age: 30}

스트리밍의 경우:

{:ok, resp} = ReqLLM.stream_text(model, "Write a short story")
ReqLLM.StreamResponse.tokens(resp) |> Stream.each(&IO.write/1) |> Stream.run()

더 자세히 살펴볼 가치가 있는 주요 기능

  • 제공업체별 옵션 – 예: provider_options: [web_search: %{max_uses: 5}]는 Anthropic의 웹 검색 도구를 활성화합니다.
  • 임베딩 생성 – 제공업체가 지원하는 경우 Embedding.generate/3가 단일 또는 배치 임베딩을 반환합니다.
  • OpenAI 실시간 세션 – 최신 실시간 모델을 위한 저수준 WebSocket API (ReqLLM.OpenAI.Realtime).
  • Telemetry – 내장된 Telemetry 이벤트 ([:req_llm, :request, …], [:req_llm, :token_usage]) 및 전체 트레이싱을 위한 선택적 OpenTelemetry 연결.
  • 확장 가능한 모델 레지스트리 – 전체 스펙 맵을 전달하고 ReqLLM.model!/1로 정규화함으로써 카탈로그에 아직 없는 모델을 호출할 수 있습니다.

누가 사용해야 하나요?

  • Elixir 개발자 – 챗봇, 에이전트 또는 모든 GenAI 기반 서비스를 구축하며, 수십 개의 제공업체 SDK를 다루는 대신 단일하고 관용적인 클라이언트를 원하는 개발자.
  • – 기본적으로 비용 가시성 및 구조화된 출력 검증이 필요한 팀.
  • Ops / 관측 담당자 – 청구 대시보드용으로 준비된 Telemetry 훅을 원하는 담당자.

더 배우기


요약 (TL;DR)

ReqLLM은 단일 Elixir API를 통해 수백 개의 LLM 모델(텍스트, 임베딩, 이미지, 음성, OCR 등)을 호출할 수 있게 해주며, 스트리밍, 구조화된 출력, 비용 추적 및 Telemetry가 내장되어 있습니다. 각 제공업체의 특이성을 추상화하여 프롬프트와 필요한 데이터에 집중할 수 있게 합니다.

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트