본문으로 건너뛰기

LLM 호출

OpenAI 호환 서버와 Ollama 에 채팅·임베딩을 보낸다. 흘려 받기(SSE·NDJSON), 토큰 사용량, 그리고 「모델이 없다」와 「서버가 죽었다」를 가르는 오류 분류. 주소는 소비 앱이 명시한다

npm install @duolabs-deux/unit-llm-client

직접 넣어 보기

 

가짜 어댑터만 씁니다. 실제 서버로 나가지 않습니다.

환경변수

이름설명
LLM_BASE_URL필수OpenAI 호환은 /v1 까지, Ollama 는 /api 앞까지. 기본값이 없다(설정을 빠뜨린 배포가 엉뚱한 곳으로 보내지 않게)
LLM_API_KEY선택OpenAI 호환 서버의 키. 키가 필요 없는 서버면 비운다

어댑터

id종류설명
openai-compat실제chat completions · embeddings. 스트림은 SSE, 끝에 usage 를 받는다. 채팅 재시도 0회, 임베딩 1회
ollama실제/api/chat · /api/embed. think · num_ctx · keep_alive 를 직접 준다. 스트림은 NDJSON
fake가짜키·서버 없이 결정적으로 답한다. 메시지의 [quota]·[down]·[long]·[cut] 같은 표시로 실패를 재현한다

실패와 소비 앱이 할 일

종류언제할 일
invalid-input모델이 서버에 없을 때(upstreamCode …/model-not-found)모델 이름을 고치거나 서버에 모델을 받는다. 서버 장애로 보고하지 않는다
invalid-input입력이 모델의 문맥을 넘었을 때(…/context-length), 공급자가 내용을 이유로 거절했을 때(400/content-filter)입력을 줄이거나 나눈다. 다시 보내도 같다
invalid-input주소·모델·메시지가 비었거나 형식이 틀렸을 때(밖으로 나가지 않는다)호출하는 코드를 고친다
auth키가 없거나 틀렸을 때, 계정의 결제 한도가 바닥났을 때(429/insufficient-quota)운영자에게 알린다. 기다려도 풀리지 않는다
quota호출 한도에 걸렸을 때. retryAfterMs 가 있으면 그만큼 뒤에기다렸다 다시 보내거나 다른 모델로 넘긴다
timeout제때 답하지 않거나 흘려 받다 멈췄을 때, 호출자가 취소했을 때입력을 줄이거나 나중에 다시. 생성은 이미 과금됐을 수 있다
upstream-down서버에 닿지 못하거나 5xx, 흘려 받다 끊겼을 때서버 상태를 확인한다. 그때까지 받은 글은 delta 로 이미 왔다
unexpected응답 모양이 명세와 다를 때(임베딩 수가 보낸 글 수와 다름 등)서버 버전과 명세를 확인한다

한도

  • 도구 호출(function calling)·이미지 입력은 다루지 않는다(0.1)
  • Ollama 는 문맥을 넘는 입력을 오류 없이 앞에서 자른다. 긴 입력이면 contextWindow 를 준다
  • 사용량은 공급자가 준 값이다. 주지 않으면 null 이다(0 으로 꾸미지 않는다)

명세