Curl로 vLLM 쿼리 보내기
curl로 vllm gpt 에 쿼리 보내기
vLLM 기반 GPT 서버에 curl 명령어로 쿼리를 보내려면 다음과 같은 구조를 따릅니다. vLLM은 일반적으로 OpenAI 호환
API 엔드포인트를 제공합니다. 다음은 vLLM 서버가 OpenAI API처럼 작동할 경우를 가정한 예시입니다.
✅ 전제 조건
-
vLLM서버가 실행 중이며 OpenAI 호환 REST API 엔드포인트를 제공 -
모델이
chat유형으로 등록되어 있음 (chat/completionsendpoint 사용) -
토큰 인증이 설정되어 있다면
Authorization: Bearer YOUR_API_KEY헤더 필요
🧪 예시 curl 명령어
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "서울 날씨 어때?"}
],
"temperature": 0.7
}'
🧩 주요 요소 설명
-
http://localhost:8000/v1/chat/completions:- vLLM 서버의 엔드포인트 주소입니다. 실제 주소로 바꾸세요.
-
model:- vLLM에서 사용 중인 모델 이름. (예:
gpt-3.5-turbo,llama-3,mistral-7b, 등)
- vLLM에서 사용 중인 모델 이름. (예:
-
messages:- Chat 기반 입력 형식으로, 각 메시지의
role은system,user,assistant중 하나입니다.
- Chat 기반 입력 형식으로, 각 메시지의
-
temperature:- 응답의 무작위성 (창의성) 조절. 0은 결정적, 1에 가까울수록 창의적입니다.
🔐 인증이 필요한 경우 (API Key)
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{...}'
📦 completion API를 쓰는 경우 (prompt 기반)
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"prompt": "서울 날씨 어때?",
"max_tokens": 100,
"temperature": 0.7
}'
필요하다면 stream 옵션이나 stop, top_p, n 등의 고급 파라미터도 사용할 수 있습니다.
원하시는 API 구조에 맞춰 curl 명령어를 조정해드릴 수도 있습니다. vLLM 서버 설정을 공유해주시면 더 정확하게 도와드릴 수
있어요.
모델 조회하는 법 있어?
네, vLLM 서버에서 사용 가능한 모델 목록을 조회 하려면 일반적으로 OpenAI 호환 REST API의 /v1/models
엔드포인트를 사용할 수 있습니다. 아래에 단계별로 정리해드릴게요.
✅ 1. 모델 목록 조회 curl 명령어
curl http://localhost:8000/v1/models
포트 번호 (
8000)나 주소는vLLM서버 실행 환경에 따라 달라질 수 있으니 적절히 수정하세요.
🔎 2. 응답 예시 (JSON)
{
"object": "list",
"data": [
{
"id": "llama-3",
"object": "model",
"owned_by": "vllm"
},
{
"id": "mistral-7b",
"object": "model",
"owned_by": "vllm"
}
]
}
여기서 "id" 필드가 실제로 쿼리에 사용할 모델 이름입니다. 예를 들어:
"model": "llama-3"
🧩 3. 참고: vLLM 서버가 OpenAI 스타일 API를 따르지 않는 경우
일부 설정에서는 /v1/models 엔드포인트가 비활성화되어 있을 수 있습니다. 그런 경우에는:
-
vllm.entrypoints.openai.api_server실행 시 콘솔 로그에서model_name확인 -
vllm.engine.args.model로vllm서버 시작 시 전달된 모델 경로나 HuggingFace 모델명 직접 확인
예:
python -m vllm.entrypoints.openai.api_server \
--model mistralai/Mistral-7B-Instruct-v0.1 \
--host 0.0.0.0 --port 8000
위의 경우 모델 이름은 "mistralai/Mistral-7B-Instruct-v0.1" 입니다.
✅ 요약
| 목적 | 명령어 예시 |
|---|---|
| 모델 목록 조회 | curl http://localhost:8000/v1/models |
| 단일 모델 사용 | API 실행할 때 --model 옵션 확인 |
필요하면 vLLM 실행 로그를 기반으로 모델 이름 파싱하는 방법도 알려드릴 수 있어요. 서버 설정 알려주시면 구체적으로 도와드릴게요.
openweb ui 환경의 api 주소
Open WebUI (ex: Open Web UI 또는 oobabooga WebUI 같은 인터페이스)의 경우, 백엔드에 붙어 있는 LLM
서버에 따라 API 주소 가 달라질 수 있습니다. 그러나 일반적으로 다음과 같은 구조로 동작합니다.
✅ 1. 기본 API 주소 구조
기본적으로 Open WebUI는 내부적으로 vllm, text-generation-webui, 또는 llama.cpp 서버에
REST API 요청을 전달하는 프록시 역할 을 합니다.
기본 API 주소 예시:
http://localhost:8080/api/v1/chat/completions
또는
http://localhost:3000/api/v1/chat/completions
포트 번호는 Open WebUI를 실행한 구성에 따라 달라집니다.
✅ 2. 확인 방법
방법 1: Open WebUI 실행 시 로그 확인
Open WebUI를 실행하면 터미널에 다음과 같은 로그가 출력됩니다:
nginx
API listening at http://0.0.0.0:3000
Forwarding to: http://localhost:8000/v1
여기서:
-
사용자 요청 은
http://localhost:3000/api/v1/...로 보냅니다. -
실제 LLM 서버 는
http://localhost:8000/v1/...입니다. (예: vLLM)
방법 2: 브라우저에서 F12 > Network 탭 확인
Open WebUI 브라우저에서 채팅할 때 개발자도구를 열고 Network 탭에서 실제 API 요청이 보내지는 URL을 확인할 수
있습니다. 보통 다음과 같습니다:
http
POST http://localhost:3000/api/v1/chat/completions
✅ 3. 실제 curl 예시 (Open WebUI 프록시 사용 시)
curl http://localhost:3000/api/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "mistral-7b",
"messages": [
{"role": "user", "content": "안녕 GPT!"}
],
"temperature": 0.7
}'
✅ 요약
| 항목 | 예시 |
|---|---|
| WebUI 포트 | 3000, 8080, 또는 Docker에 따라 다름 |
| API 엔드포인트 예 | http://localhost:3000/api/v1/chat/completions |
| 백엔드 연결 대상 | 보통 vLLM, Ollama, text-generation-webui 등 |
필요하시면 Docker 환경 기준으로도 예시를 드릴 수 있습니다. 현재 사용 중인 WebUI 종류 (OpenWebUI,
Oobabooga, LM Studio, 등)나 백엔드 모델 서버(vllm, llama.cpp, 등)를 알려주시면 더 정확히
도와드릴 수 있어요.
model 보는법
Open WebUI 환경에서 사용 가능한 모델 목록을 확인하는 방법 은 사용 중인 백엔드(LM 서버: vLLM,
llama.cpp, Ollama, 등)에 따라 다릅니다. 아래는 대표적인 경우를 나눠서 step-by-step 으로 정리한
내용입니다.
✅ 1. Open WebUI에서 모델 확인하는 방법 (UI 기준)
📍 방법 A: Web UI 내부에서 확인
-
브라우저에서 Open WebUI에 접속
-
보통 좌측 사이드바 또는 설정(Settings) 메뉴에서
-
현재 로드된 모델 이름
-
선택 가능한 모델 목록
-
-
표시 위치 예:
- 메뉴:
Models,Select Model, 또는Settings > Model
- 메뉴:
✅ 2. API를 통해 모델 목록 확인 (curl 사용)
📍 전제
Open WebUI가 OpenAI 호환 백엔드를 프록시하고 있어야 합니다. (예: vLLM, text-generation-webui 등)
💡 API 엔드포인트 (OpenAI 스타일)
curl http://localhost:3000/api/v1/models
또는 백엔드 직접 호출:
curl http://localhost:8000/v1/models
✅ 응답 예시:
{
"object": "list",
"data": [
{"id": "mistral-7b", "object": "model"},
{"id": "llama-3-8b", "object": "model"}
]
}
✅ 3. 사용 중인 백엔드별 모델 확인법
| 백엔드 | 확인 방법 |
|---|---|
| vLLM | curl http://localhost:8000/v1/models |
| Ollama | ollama list 또는 curl http://localhost:11434/api/tags |
| text-generation-webui | WebUI에서 좌측 모델 목록 확인 or /api/v1/model |
| llama.cpp | 모델 수동 로딩이므로 CLI 로그에서 확인 |
🧪 예시 (Open WebUI → vLLM 연결 시)
curl http://localhost:3000/api/v1/models
📌 모델명으로 응답이 오면, 이후 요청에서 이렇게 사용:
curl http://localhost:3000/api/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "mistral-7b",
"messages": [{"role": "user", "content": "Hello!"}]
}'
✅ 요약
| 환경 | 모델 확인 방법 |
|---|---|
| Web UI | 브라우저 UI 내 모델 선택 메뉴 |
| curl API | /api/v1/models or /v1/models |
| 백엔드에 따라 다름 | vLLM: /v1/models, Ollama: ollama list 등 |
어떤 백엔드를 Open WebUI가 연결하고 있는지 알려주시면, 그에 맞는 정확한 명령어를 드릴 수 있어요. 필요하시면 Docker 기준도 설명드릴게요.
api key 같이 주는법
curl로 LLM 서버(Open WebUI 포함)에 API Key를 포함해서 요청하는 방법 은 매우 간단합니다. 보통 OpenAI
호환 API를 따르는 경우, Authorization 헤더에 키를 추가하면 됩니다.
✅ Step-by-step: API Key 포함하는 방법
🔐 1. API Key가 필요한 구조 예
API 서버가 Bearer 인증을 요구한다면 다음 형식입니다:
curl http://localhost:3000/api/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "mistral-7b",
"messages": [
{"role": "user", "content": "안녕 GPT!"}
]
}'
-
"Authorization: Bearer ..."→ OpenAI-style 인증 방식 -
"YOUR_API_KEY"는 발급받은 키로 교체
📌 2. 환경별 API Key 발급 위치
| 환경 | API Key 설정 위치 |
|---|---|
| Open WebUI | Settings > API Authentication (서버 관리자만 설정 가능) |
| vLLM | 기본적으로 인증 없음, 프록시 또는 Gateway에서 인증 설정 필요 |
| Ollama | 인증 필요 없음 (로컬 전용) |
| text-generation-webui | 인증 기능 없음 (커스텀 코드 필요) |
즉, Open WebUI가 자체적으로 API Key 인증을 요구하는 경우 ,
Bearer방식으로 보내야 하며, 백엔드가 직접 인증하지는 않는 경우가 많습니다.
🧪 예시: API Key로 LLM 호출 (Open WebUI 프록시 사용)
curl http://localhost:3000/api/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-1234abcd5678efgh" \
-d '{
"model": "llama-3",
"messages": [
{"role": "user", "content": "API 키가 잘 작동하고 있니?"}
]
}'
🔄 참고: Open WebUI에서 API Key 요구 설정 예
만약 Open WebUI를 운영 중이고, API Key 인증을 요구하도록 설정하려면 .env 또는 설정 파일에 아래와 같은 옵션이 들어
있을 수 있습니다:
env
WEBUI_AUTH=true
WEBUI_API_KEY=sk-1234abcd5678efgh
이 설정이 활성화된 경우에만 curl에서 API Key를 줘야 합니다.
✅ 요약
| 항목 | 내용 |
|---|---|
| 헤더 키 | "Authorization: Bearer YOUR_API_KEY" |
| 위치 | -H 옵션으로 curl에 포함 |
| 적용 대상 | Open WebUI + API 인증 활성화된 경우 |
| 백엔드 단 | 일반적으로 인증 없음 (vLLM, Ollama 등) |
🔧 원하시면 Open WebUI의 API Key 설정을 어떻게 켜고 관리하는지도 설명드릴 수 있어요. 운영 중인 환경이 있으면
알려주세요!
….net/api 가 base야
좋습니다! 말씀하신 대로 API의 Base URL 이 http://your-host.net/api 형식이라면, 아래와 같이 쿼리
요청을 보내고 API Key도 포함할 수 있습니다. 단계별로 설명드릴게요.
✅ 1. Base URL이 http://your-host.net/api인 경우 구조
OpenAI 호환 API 구조를 따르고 있다고 가정하면, 전체 엔드포인트는 다음과 같이 구성됩니다:
BASE_URL = http://your-host.net/api
└─────┬────┘ └── endpoint path: /v1/chat/completions, /v1/models 등
✅ 2. 모델 목록 확인 (curl)
curl http://your-host.net/api/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
✅ 3. chat/completions 요청 예시
curl http://your-host.net/api/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "llama-3",
"messages": [
{"role": "user", "content": "안녕, 오늘 기분 어때?"}
],
"temperature": 0.7
}'
✅ 4. 응답 예시 (정상 작동 시)
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1723450000,
"model": "llama-3",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "안녕하세요! 저는 잘 작동하고 있어요 😊"
},
"finish_reason": "stop"
}
]
}
✅ 요약
| 목적 | 예시 curl 명령 |
|---|---|
| 모델 목록 조회 | curl http://your-host.net/api/v1/models -H "Authorization: Bearer YOUR_API_KEY" |
| 채팅 요청 보내기 | curl http://your-host.net/api/v1/chat/completions ... |
| 인증 추가 방식 | -H "Authorization: Bearer YOUR_API_KEY" |
🛠️ 혹시 "401 Unauthorized" 또는 "invalid API key" 등의 오류가 나는 경우에는:
-
API 키가 정확한지
-
서버가 정말 OpenAI 호환인지
-
엔드포인트 경로에 오타가 없는지
이 세 가지를 다시 확인해 보셔야 합니다.
필요하면 오류 메시지 붙여서 말씀 주세요!
models에서는 있는거 같은데 model not found 뜨는데 뭘까
좋은 질문입니다. GET /v1/models에서는 모델이 보이는데, POST /v1/chat/completions에서 model
not found 에러가 발생하는 경우는 꽤 자주 있는 문제이며, 주로 다음과 같은 원인 때문입니다.
🧭 Step-by-Step 원인 분석 및 해결
✅ 1. models에서 보이는 id 를 정확히 사용하고 있는가?
GET /v1/models 응답 예시:
{
"data": [
{
"id": "mistral-7b-instruct",
"object": "model"
}
]
}
→ 여기에 나오는id 필드를 chat/completions의 "model"로 그대로 사용해야 합니다.
예:
"model": "mistral-7b-instruct" ✅ 정확
"model": "mistral" ❌ 에러 발생 가능
✅ 2. 모델이 chat 기반 모델 인지 확인하기
OpenAI 호환 API의 /v1/chat/completions는 chat 형식 메시지 (role:
user/assistant/system)를 지원하는 모델만 사용 가능합니다.
일부 모델은 prompt-only 모델 이어서
/v1/completions만 지원합니다.
🔍 확인 방법:
-
chat 모델이면 보통
instruct,chat,alpaca,vicuna등의 이름을 포함합니다. -
messages대신prompt를 쓰면 안 됩니다.
✅ 3. 서버 설정상 허용된 모델만 받도록 되어 있는 경우
특히 Open WebUI 또는 프록시 서버 (FastAPI, vLLM, LM Gateway 등)는 보안상 일부 모델만
허용하는 설정을 둘 수 있습니다.
예:
env
# 환경변수나 config.json
ALLOWED_MODELS=mistral-7b-instruct,llama-3
→ 이 경우 models 응답에는 보이지만, 실제 inference에는 제한될 수 있습니다.
✅ 4. 이름이 길거나 경로 포함된 경우
/v1/models에서 다음처럼 보일 수 있습니다:
"id": "TheBloke/Mistral-7B-Instruct-v0.1-GGUF"
→ 이 경우 이 전체 문자열 을 "model"로 넣어야 합니다.
예:
"model": "TheBloke/Mistral-7B-Instruct-v0.1-GGUF"
✅ 5. 올바른 백엔드인지 확인 (Ollama, vLLM, LM Studio 등 혼동)
Open WebUI가 어떤 백엔드로 프록시되고 있는지 명확히 알아야 합니다.
| 백엔드 | 특징 |
|---|---|
| vLLM | 모델 이름 설정 시 --model 파라미터로 고정됨 |
| Ollama | ollama list 로 확인 가능, 이름 그대로 사용해야 함 |
| text-generation-webui | UI에서 로드된 모델 외에는 작동 안 함 |
| LM Studio | 보통 "lmstudio" 같은 프록시 모델 ID 사용 |
🛠️ 해결 요약
| 점검 항목 | 조치 방법 |
|---|---|
model 이름 정확히 일치? |
/v1/models 응답에서 id 그대로 사용 |
| chat 모델 맞나? | 메시지 포맷이 messages, role 포함되어야 함 |
| 서버 설정에서 차단? | ALLOWED_MODELS, 정책 확인 |
| 경로 포함된 이름? | model: "TheBloke/.../gguf" 등 전체 경로 포함 |
| 프록시 백엔드 확인 | 어떤 백엔드가 API 처리 중인지 명확히 파악 필요 |
📌 필요하시면
-
/v1/models응답 JSON을 붙여 주시면 -
어떤 모델 이름을 넣었는지 보여주시면
제가 직접 비교해서 정확한 "model" 값으로 변환해 드릴 수 있어요. 원하시면 확인 도와드릴게요.
리눅스 망에서 하는데 한 서버에서는 응답이 잘 나오는데 다른 서버에서는 curl: (60) SSL certificate problem 발생해
좋습니다. curl: (60) SSL certificate problem 오류는 주로 서버의 SSL 인증서를 검증할 수 없을 때
발생 합니다. 이 문제는 특히 내부망(LAN) 리눅스 환경에서 자주 생깁니다. 원인을 단계별로 진단하고 해결 방법을 안내드릴게요.
✅ 1. 오류 메시지 요약
vbnet
curl: (60) SSL certificate problem: unable to get local issuer certificate
이 오류는 curl이 HTTPS 인증서 체인을 검증할 수 없다는 뜻입니다.
🧭 Step-by-Step 해결 방법
✅ [1단계] --insecure 옵션으로 우회 (테스트용)
먼저 빠르게 테스트하려면 --insecure 플래그를 사용해 인증서 검증을 끄세요.
curl --insecure https://your-host.net/api/v1/models
- 👉 이 방법은 보안상 안전하지 않기 때문에, 프로덕션에선 쓰지 말고 원인 해결용으로만 사용하세요.
✅ [2단계] 문제가 발생하지 않는 서버와 인증서 체인 비교
curl -v로 디버깅 로그를 비교해보세요:
curl -v https://your-host.net/api/v1/models
-
잘 되는 서버에서는
SSL certificate verify ok가 뜰 것이고, -
문제 있는 서버는
certificate verify failed로그가 뜰 것입니다.
✅ [3단계] ca-certificates 패키지 설치 확인
문제 있는 서버에서 CA 인증서가 빠져있을 수 있습니다.
Debian/Ubuntu :
sudo apt update
sudo apt install ca-certificates
sudo update-ca-certificates
RHEL/CentOS/Fedora :
sudo yum install ca-certificates
sudo update-ca-trust force-enable
sudo update-ca-trust extract
✅ [4단계] 인증서 수동 등록 (자체서명 인증서 등)
만약 사내망에서 자체 서명된 인증서(self-signed cert)를 쓴다면 수동으로 root CA를 등록해야 합니다.
예: /etc/ssl/certs/my-root-ca.crt로 저장하고 아래 명령 실행
Debian/Ubuntu:
sudo cp my-root-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
RHEL/CentOS:
sudo cp my-root-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
✅ [5단계] curl에 CA 직접 지정
curl --cacert /path/to/my-root-ca.crt https://your-host.net/api
인증서 신뢰 체인을 명시적으로 지정할 수 있습니다.
✅ 요약
| 문제 원인 | 해결 방법 |
|---|---|
| 인증서 검증 실패 | --insecure (테스트용) |
| 루트 CA 없음 | ca-certificates 패키지 설치 |
| 사설 인증서 | 수동 등록 또는 --cacert 지정 |
| 도메인 이름 mismatch | curl --resolve 또는 hosts 파일 수정으로 대응 |
💡 참고: 사내 인증서를 사용하는 경우 인증서 관리팀에 Root CA 인증서 제공 요청할 수도 있어요.
필요하시면 문제 있는 서버의 curl -v 로그를 붙여 주시면 더 정확히 진단해드릴 수 있습니다!
--insecure 하면 되네
좋습니다! --insecure 옵션으로 동작이 된다는 것은, 해당 서버에서 SSL 인증서 검증 단계에서만 문제 가 있다는 것을
확인한 셈입니다. 하지만 몇 가지 주의사항과 보완 방법을 덧붙이자면:
⚠️ --insecure의 의미와 주의사항
-
--insecure는curl이 서버 인증서를 신뢰하지 않고도 요청을 허용 하게 만드는 옵션입니다. -
이는 중간자 공격(MITM) 같은 보안 리스크에 노출될 수 있기 때문에 프로덕션/자동화 스크립트에서는 지양 하는 게 좋습니다.
🛠️ 더 나은 해결 방안 (권장)
✅ 1. Root CA 인증서를 시스템에 추가
내부망이나 자체 인증서를 사용하는 경우 다음 단계를 권장합니다:
예시:
sudo cp your-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
그 후 curl은 --insecure 없이도 동작합니다.
✅ 2. curl에 인증서 직접 지정 (스크립트에서 안전하게 사용)
curl --cacert /path/to/your-ca.crt https://your-host.net/api
스크립트에 --insecure 대신 --cacert를 사용하는 것이 더 안전합니다.
✅ 3. 서버 인증서가 Let's Encrypt 등 공개 CA 기반이라면
문제가 되는 서버가 최신 루트 인증서 목록을 반영하지 못하고 있을 수 있으므로:
sudo apt install --reinstall ca-certificates
또는
sudo update-ca-trust extract # RHEL 계열
을 통해 인증서 체인을 최신화할 수 있습니다.
✅ 요약
| 방법 | 설명 | 보안성 |
|---|---|---|
--insecure |
인증서 검증을 완전히 비활성화 | ❌ 위험 (테스트용) |
--cacert |
명시적으로 루트 인증서 지정 | ✅ 안전 |
| 시스템 CA 등록 | Root CA를 시스템 신뢰 목록에 등록 | ✅ 안전 |
필요하시면 your-ca.crt 만드는 방법이나, 기존 서버에서 인증서 추출해서 다른 서버에 복사하는 법도 알려드릴게요!
vscode 내의 webengine에서도 이런거 때문에 에러가 발생하는거 같은데 이거 끌 수 없어?
맞습니다. VS Code 내부의 Webview나 WebEngine이 사용하는 HTTP 요청에서도 SSL 인증서 검증 실패
가 발생할 수 있으며, 이는 curl의 (60) SSL certificate problem과 유사한 이유로 발생합니다. 특히 사내망,
자체 인증서, 프록시, MITM 방지 장비 등이 있을 경우 자주 발생하죠.
✅ 해결 전략 요약
| 목적 | 방법 | 가능 여부 |
|---|---|---|
| Webview의 SSL 검증 끄기 | 설정 불가 (보안상 제한) | ❌ 기본적으로 차단됨 |
| 전체 Electron/VS Code SSL 우회 | 환경변수 사용 | ✅ 제한적으로 가능 |
| CA 인증서 강제로 등록 | 시스템 또는 VS Code 신뢰 목록에 추가 | ✅ 권장 방식 |
🧭 Step-by-Step 해결법
✅ 1. VS Code에 SSL 검증 무시 환경변수 추가 (임시 우회)
Linux/macOS 에서 VS Code를 실행할 때:
NODE_TLS_REJECT_UNAUTHORIZED=0 code
또는 ~/.bashrc, ~/.zshrc에:
export NODE_TLS_REJECT_UNAUTHORIZED=0
주의 : 이는 Electron 기반 앱 전체에서 SSL 검증을 끄는 것이며, 보안상 위험하므로 임시 또는 로컬 테스트 용도로만 쓰세요.
✅ 2. Webview 내 요청이 프록시/인증서 문제일 경우 → 시스템에 Root CA 등록
위에서 curl 문제를 해결할 때처럼, VS Code에서 사용하는 시스템 SSL 인증서 스토어에 루트 인증서를 등록해야
WebEngine도 정상 동작합니다.
예:
sudo cp my-root-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
VS Code 재시작 후 다시 시도.
✅ 3. VS Code에 HTTPS 프록시/CA 설정 (기본 설정으로는 제한적)
// settings.json
{
"http.proxyStrictSSL": false
}
단, 이 설정은 VS Code 자체의 확장 설치, 업데이트 등에만 적용되고, Webview 안의 JS 코드 나
webengine내부 요청에는 영향 없음 일 수 있습니다.
✅ 4. WebView가 내부에서 fetch 또는 XMLHttpRequest를 쓴다면?
그럴 경우 해당 JS 코드에서 https.Agent({ rejectUnauthorized: false }) 같은 설정을 사용하지 않는 한
SSL 오류는 회피 불가능합니다.
→ 결국 CA 인증서를 올바르게 등록하는 게 유일한 안전한 해결책 입니다.
✅ 마무리 요약
| 해결법 | 권장 여부 | 설명 |
|---|---|---|
NODE_TLS_REJECT_UNAUTHORIZED=0 |
⚠️ 비권장 | 전체 SSL 검증 우회 (임시 테스트용만) |
| 시스템에 Root CA 등록 | ✅ 적극 권장 | curl, VS Code, WebEngine 모두에 적용 가능 |
http.proxyStrictSSL |
☑️ 제한적 | 일부 기능만 해당, Webview에는 영향 X |
🔧 원하시면 Webview에서 호출하는 실제 URL이나 오류 메시지를 알려주시면, 그 기반으로 더 정확하게 조치 방법을 안내해 드릴 수
있어요!
오 잘 된다. 근데 continue extension보면 chat이랑 자동완성이랑 url이 다른거 같더라?
맞습니다! Continue 확장(Extension)에서는 "Chat 기능"과 "코드 자동완성 (autocomplete)"
기능이 각각 다른 API 엔드포인트(URL) 를 사용하는 것이 일반적입니다. 이건 내부적으로 역할이 다르고 처리 방식도 다르기
때문입니다.
✅ 핵심 차이: Chat vs Autocomplete URL
| 기능 | 목적 | 보통 URL 예시 |
|---|---|---|
| Chat | 사용자가 질문 입력 후 전체 답변 | /v1/chat/completions |
| Autocomplete | 코드 중간에서 자동 완성 추천 | /v1/completions 또는 /v1/complete |
🧭 Step-by-Step 자세히 설명
✅ 1. Chat 기능 : chat/completions
-
사용하는 모델: Chat 기반 모델 (
gpt-3.5-turbo,llama2-chat,mistral-instruct등) - 메시지 포맷:
{ "model": "gpt-3.5-turbo", "messages": [ {"role": "user", "content": "이 함수 설명해줘"} ] } - URL:
http://your-server.net/api/v1/chat/completions
✅ 2. Autocomplete 기능 : completions 또는 complete
-
사용하는 모델: 일반 Language Model (prompt-only)
- 메시지 포맷:
{ "model": "code-llama", "prompt": "def fibonacci(n):", "max_tokens": 64 } - URL:
http://your-server.net/api/v1/completions
또는
```bash
http://localhost:11434/api/generate # (Ollama)
```
- 일부에서는
streaming에 특화된/v1/complete-stream,/v1/predict같은 것도 씁니다.
🧠 왜 URL이 다를까?
-
chat/completions는 역할 기반 메시지 처리 (role: system/user/assistant) -
completions는 단일 프롬프트 → 이어쓰기 결과만 반환
즉, 구조적으로 API 요구 사항이 다르기 때문에 Continue나 Copilot 같은 확장은 서로 다른 경로를 지정합니다.
✅ Continue 설정 예시
// continue.config.json 또는 Settings UI
{
"provider": {
"chat_url": "http://localhost:8000/v1/chat/completions",
"completion_url": "http://localhost:8000/v1/completions",
"api_key": "sk-..."
}
}
✅ 요약 정리
| 항목 | Chat | Autocomplete |
|---|---|---|
| Endpoint | /v1/chat/completions |
/v1/completions |
| 입력 형식 | messages[] + roles |
prompt |
| 모델 | -chat, -instruct |
일반 LM (code-llama, mistral, 등) |
| 사용 목적 | 질문-답변 | 짧은 이어쓰기 예측 (코드 추천 등) |
필요하시면 Continue의 설정 파일을 붙여주시면 거기에 맞춰 경로 설정이나 커스터마이징도 도와드릴 수 있어요!
이걸 curl로 지원하는지 안하는지 테스트하고 싶어
좋습니다! 어떤 LLM 서버(예: OpenWebUI, vLLM, Ollama 등)가 chat API 와 completion API 를 curl로 지원하는지 테스트하는 방법을 단계별로 안내드릴게요.
✅ 1. chat API (/v1/chat/completions) 지원 여부 테스트
curl -X POST http://your-server.net/api/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{ "role": "user", "content": "안녕!" }
]
}'
응답 예시:
-
정상:
choices[0].message.content포함된 JSON 반환 -
실패:
404,"model not found","unknown endpoint"등
✅ 2. completion API (/v1/completions) 지원 여부 테스트
curl -X POST http://your-server.net/api/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"prompt": "def hello_world():\n",
"max_tokens": 50,
"temperature": 0.7
}'
사용 중인 모델이 일반 언어 모델 (prompt-only)을 지원해야 합니다. 일부 chat 전용 모델은 여기서 작동안할 수 있습니다.
✅ 3. 자동완성 전용 테스트용 짧은 프롬프트 예
"prompt": "def sum(a, b):\n return"
→ 기대 응답: " a + b" 또는 " a - b" 등
✅ 4. curl 결과 해석 팁
| 결과 | 해석 |
|---|---|
200 OK + choices 있음 |
✅ 해당 endpoint 지원됨 |
404 Not Found |
❌ 지원 안됨 (엔드포인트 없음) |
model not found |
모델 이름이 잘못됐거나 해당 endpoint에서 비호환 |
400 Bad Request |
payload 구조가 틀렸거나 model 미지원 |
🔧 팁: 자동화 테스트 스크립트
echo "Testing chat/completions..."
curl -s -o /dev/null -w "%{http_code}\n" \
-X POST http://your-server.net/api/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "ping"}]
}'
echo "Testing completions..."
curl -s -o /dev/null -w "%{http_code}\n" \
-X POST http://your-server.net/api/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-3.5-turbo",
"prompt": "def add(a, b):\n return",
"max_tokens": 10
}'
✅ 결론 요약
| 테스트 | 요청 URL | 판단 기준 |
|---|---|---|
| Chat 지원 여부 | /v1/chat/completions |
messages[] 넣고 응답 확인 |
| Completion 지원 여부 | /v1/completions |
prompt 넣고 응답 확인 |
| 모델 미지원 vs API 미지원 구분 | 응답 메시지로 판단 (model not found, 404, 등) |
📦 테스트 결과 붙여주시면 어떤 API가 활성화되어 있는지 바로 분석해드릴게요!