๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ”— API ์—”๋“œํฌ์ธํŠธ

์ด ๊ฐ€์ด๋“œ๋Š” API ์—”๋“œํฌ์ธํŠธ์™€ ํšจ๊ณผ์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์šฐ๋ฆฌ์˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•œ ์›ํ™œํ•œ ํ†ตํ•ฉ ๋ฐ ์ž๋™ํ™”๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‹คํ—˜์ ์ธ ์„ค์ •์ด๋ฏ€๋กœ ํ–ฅํ›„ ์—…๋ฐ์ดํŠธ ๋ฐ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆโ€‹

API์— ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ›ก๏ธ. Bearer ํ† ํฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ API ์š”์ฒญ์„ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Open WebUI์˜ ์„ค์ • > ๊ณ„์ •์—์„œ API ํ‚ค๋ฅผ ํš๋“ํ•˜๊ฑฐ๋‚˜, ํ•„์š”์‹œ JSON Web Token(JWT)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” API ์—”๋“œํฌ์ธํŠธโ€‹

๐Ÿ“œ ๋ชจ๋“  ๋ชจ๋ธ ์กฐํšŒโ€‹

  • ์—”๋“œํฌ์ธํŠธ: GET /api/models

  • ์„ค๋ช…: Open WebUI๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€๋œ ๋ชจ๋“  ๋ชจ๋ธ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ:

    curl -H "Authorization: Bearer YOUR_API_KEY" http://localhost:3000/api/models

๐Ÿ’ฌ ์ฑ„ํŒ… ์™„๋ฃŒโ€‹

  • ์—”๋“œํฌ์ธํŠธ: POST /api/chat/completions

  • ์„ค๋ช…: Open WebUI ๋ชจ๋ธ, Ollama ๋ชจ๋ธ, OpenAI ๋ชจ๋ธ ๋ฐ Open WebUI ๊ธฐ๋Šฅ ๋ชจ๋ธ์— ๋Œ€ํ•ด OpenAI API์™€ ํ˜ธํ™˜๋˜๋Š” ์ฑ„ํŒ… ์™„๋ฃŒ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • Curl ์˜ˆ์‹œ:

    curl -X POST http://localhost:3000/api/chat/completions \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d {
    "model": "llama3.1",
    "messages": [
    {
    "role": "user",
    "content": "์™œ ํ•˜๋Š˜์€ ํŒŒ๋ž€์ƒ‰์ธ๊ฐ€์š”?"
    }
    ]
    }
  • Python ์˜ˆ์‹œ:

    import requests

    def chat_with_model(token):
    url = http://localhost:3000/api/chat/completions
    headers = {
    Authorization: fBearer {token},
    Content-Type: application/json
    }
    data = {
    "model": "granite3.1-dense:8b",
    "messages": [
    {
    "role": "user",
    "content": "์™œ ํ•˜๋Š˜์€ ํŒŒ๋ž€์ƒ‰์ธ๊ฐ€์š”?"
    }
    ]
    }
    response = requests.post(url, headers=headers, json=data)
    return response.json()

๐Ÿฆ™ Ollama API ํ”„๋ก์‹œ ์ง€์›โ€‹

Ollama ๋ชจ๋ธ๊ณผ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ ค๋ฉด(Open WebUI๋ฅผ ํ†ตํ•œ ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ ๋˜๋Š” Raw ํ”„๋กฌํ”„ํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ ํฌํ•จ), Open WebUI๋Š” ํ”„๋ก์‹œ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด Ollama API๋กœ์˜ ํˆฌ๋ช…ํ•œ ํŒจ์Šค์Šค๋ฃจ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” ์™„๋ฃŒ ์ƒ์„ฑ(์ŠคํŠธ๋ฆฌ๋ฐ)โ€‹

curl http://localhost:3000/ollama/api/generate -d {
"model": "llama3.2",
"prompt": "์™œ ํ•˜๋Š˜์€ ํŒŒ๋ž€์ƒ‰์ธ๊ฐ€์š”?"
}

๐Ÿ“ฆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ ๋ชฉ๋ก ์กฐํšŒโ€‹

curl http://localhost:3000/ollama/api/tags

๐Ÿง  ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑโ€‹

curl -X POST http://localhost:3000/ollama/api/embed -d {
"model": "llama3.2",
"input": ["Open WebUI๋Š” ์ •๋ง ๋›ฐ์–ด๋‚˜์š”!", "์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•ด๋ด…์‹œ๋‹ค."]
}

์ด๋Š” ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค, ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ ๋˜๋Š” Open WebUI ๋’ค์—์„œ Ollama ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋งž์ถคํ˜• ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•  ๋•Œ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

๐Ÿงฉ ๊ฒ€์ƒ‰ ์ฆ๊ฐ• ์ƒ์„ฑ(RAG)โ€‹

๊ฒ€์ƒ‰ ์ฆ๊ฐ• ์ƒ์„ฑ(RAG) ๊ธฐ๋Šฅ์€ ์™ธ๋ถ€ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์‘๋‹ต์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—๋Š” ํŒŒ์ผ ๋ฐ ์ง€์‹ ์ปฌ๋ ‰์…˜์„ API๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๊ณ  ์ด๋ฅผ ์ฑ„ํŒ… ์™„๋ฃŒ ์‹œ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์—…๋กœ๋“œโ€‹

RAG ์‘๋‹ต์— ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ์ž๋™์œผ๋กœ ์ถ”์ถœ๋˜์–ด ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  • ์—”๋“œํฌ์ธํŠธ: POST /api/v1/files/

  • Curl ์˜ˆ์‹œ:

    curl -X POST -H "Authorization: Bearer YOUR_API_KEY" -H "Accept: application/json" \
    -F "file=@/path/to/your/file" http://localhost:3000/api/v1/files/
  • Python ์˜ˆ์‹œ:

    import requests

    def upload_file(token, file_path):
    url = http://localhost:3000/api/v1/files/
    headers = {
    Authorization: fBearer {token},
    Accept: application/json
    }
    files = {file: open(file_path, rb)}
    response = requests.post(url, headers=headers, files=files)
    return response.json()

ํŒŒ์ผ์„ ์ง€์‹ ์ปฌ๋ ‰์…˜์— ์ถ”๊ฐ€โ€‹

์—…๋กœ๋“œํ•œ ํ›„ ํŒŒ์ผ์„ ์ง€์‹ ์ปฌ๋ ‰์…˜์— ๊ทธ๋ฃนํ™”ํ•˜๊ฑฐ๋‚˜ ์ฑ„ํŒ…์—์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์—”๋“œํฌ์ธํŠธ: POST /api/v1/knowledge/{id}/file/add

  • Curl ์˜ˆ์‹œ:

    curl -X POST http://localhost:3000/api/v1/knowledge/{knowledge_id}/file/add \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d {"file_id": "your-file-id-here"}
  • Python ์˜ˆ์‹œ:

    import requests

    def add_file_to_knowledge(token, knowledge_id, file_id):
    url = fhttp://localhost:3000/api/v1/knowledge/{knowledge_id}/file/add
    headers = {
    Authorization: fBearer {token},
    Content-Type: application/json
    }
    data = {file_id: file_id}
    response = requests.post(url, headers=headers, json=data)
    return response.json()

์ฑ„ํŒ… ์™„๋ฃŒ์—์„œ ํŒŒ์ผ ๋ฐ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉโ€‹

RAG ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ’๋ถ€ํ•œ ์‘๋‹ต์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ฐœ๋ณ„ ํŒŒ์ผ ๋˜๋Š” ์ „์ฒด ์ปฌ๋ ‰์…˜์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฑ„ํŒ… ์™„๋ฃŒ์—์„œ ๊ฐœ๋ณ„ ํŒŒ์ผ ์‚ฌ์šฉโ€‹

์ด ๋ฐฉ๋ฒ•์€ ํŠน์ • ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฑ„ํŒ… ๋ชจ๋ธ์˜ ์‘๋‹ต์„ ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์—”๋“œํฌ์ธํŠธ: POST /api/chat/completions

  • Curl ์˜ˆ์ œ:

    curl -X POST http://localhost:3000/api/chat/completions \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d {
    "model": "gpt-4-turbo",
    "messages": [
    {"role": "user", "content": "์ด ๋ฌธ์„œ์˜ ๊ฐœ๋…์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”."}
    ],
    "files": [
    {"type": "file", "id": "your-file-id-here"}
    ]
    }
  • Python ์˜ˆ์ œ:

    import requests

    def chat_with_file(token, model, query, file_id):
    url = http://localhost:3000/api/chat/completions
    headers = {
    Authorization: fBearer {token},
    Content-Type: application/json
    }
    payload = {
    model: model,
    messages: [{role: user, content: query}],
    files: [{type: file, id: file_id}]
    }
    response = requests.post(url, headers=headers, json=payload)
    return response.json()
์ฑ„ํŒ… ์™„๋ฃŒ์—์„œ ์ง€์‹ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉโ€‹

์งˆ๋ฌธ์ด ๋ณด๋‹ค ๋„“์€ ์ปจํ…์ŠคํŠธ ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์„œ์—์„œ ํ˜œํƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‘๋‹ต์„ ๊ฐ•ํ™”ํ•˜๋ ค๋ฉด ์ง€์‹ ์ปฌ๋ ‰์…˜์„ ํ™œ์šฉํ•˜์„ธ์š”.

  • ์—”๋“œํฌ์ธํŠธ: POST /api/chat/completions

  • Curl ์˜ˆ์ œ:

    curl -X POST http://localhost:3000/api/chat/completions \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d {
    "model": "gpt-4-turbo",
    "messages": [
    {"role": "user", "content": "์ปฌ๋ ‰์…˜์—์„œ ๋‹ค๋ฃจ๋Š” ์—ญ์‚ฌ์  ๊ด€์ ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ด์ฃผ์„ธ์š”."}
    ],
    "files": [
    {"type": "collection", "id": "your-collection-id-here"}
    ]
    }
  • Python ์˜ˆ์ œ:

    import requests

    def chat_with_collection(token, model, query, collection_id):
    url = http://localhost:3000/api/chat/completions
    headers = {
    Authorization: fBearer {token},
    Content-Type: application/json
    }
    payload = {
    model: model,
    messages: [{role: user, content: query}],
    files: [{type: collection, id: collection_id}]
    }
    response = requests.post(url, headers=headers, json=payload)
    return response.json()

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๋ฐ ํ๋ ˆ์ด์…˜๋œ ์ง€์‹ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ์™ธ๋ถ€ ์ง€์‹์„ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด, Open WebUI API๋ฅผ ์‚ฌ์šฉํ•œ ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ปฌ๋ ‰์…˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์š”๊ตฌ์— ๋”ฐ๋ผ ํ†ตํ•ฉ์„ ๋งž์ถคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ†ตํ•ฉ์ ์ธ LLM ์ œ๊ณต์ž๋กœ์„œ์˜ Open WebUI ์‚ฌ์šฉ ์ด์ โ€‹

Open WebUI๋Š” ๊ฐœ๋ฐœ์ž์™€ ๊ธฐ์—… ๋ชจ๋‘์—๊ฒŒ ํ•„์ˆ˜ ๋„๊ตฌ๊ฐ€ ๋˜๋Š” ๋‹ค์–‘ํ•œ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • ํ†ตํ•ฉ ์ธํ„ฐํŽ˜์ด์Šค: ๋‹จ์ผ ํ†ตํ•ฉ ํ”Œ๋žซํผ์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ LLM๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์‰ฌ์šด ๊ตฌํ˜„: ํฌ๊ด„์ ์ธ ๋ฌธ์„œ ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›์„ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ํ†ตํ•ฉ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Swagger ๋ฌธ์„œ ๋งํฌโ€‹

important

์ด ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ Swagger ๋ฌธ์„œ๋ฅผ ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ENV ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ dev๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ • ์—†์ด๋Š” ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Open WebUI๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ API ๋ฌธ์„œ์— ์•ก์„ธ์Šคํ•˜์„ธ์š”:

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ฌธ์„œ ๊ฒฝ๋กœ
๋ฉ”์ธ/docs

์œ„ ์ง€์นจ์„ ๋”ฐ๋ฅด๋ฉด Open WebUI API๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ  ํ™œ์šฉ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด Discord ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋ฌธ์˜ํ•˜๊ฑฐ๋‚˜ FAQ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ฆ๊ฑฐ์šด ์ฝ”๋”ฉ ๋˜์„ธ์š”! ๐ŸŒŸ