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 으로 꾸미지 않는다)