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

๐Ÿšš ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ: Open WebUI 0.4์—์„œ 0.5๋กœ

Open WebUI 0.5 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์—…ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ๊ฐ€์ด๋“œ๋Š” ๋ฒ„์ „ 0.4์—์„œ 0.5๋กœ์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•ˆ๋‚ดํ•˜๊ณ  Functions๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ๋กœ๋“œ๋งต์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ „ํ™˜์„ ์ตœ๋Œ€ํ•œ ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค! ๐Ÿ˜Š


๐Ÿง ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?โ€‹

Open WebUI 0.5์—์„œ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ณ , ํ†ตํ•ฉ์ ์ด๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ „๋ฉด ๊ฐœํŽธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๊ทธ๋ฆผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ๊ธฐ์กด ์•„ํ‚คํ…์ฒ˜: ๐ŸŽฏ ์ด์ „์—๋Š” Open WebUI๊ฐ€ ์„œ๋ธŒ ์•ฑ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ, ๊ฐ ์•ฑ(์˜ˆ: ollama, openai)์€ ๋ณ„๋„์˜ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•ฑ ๊ด€๋ฆฌ ์‹œ ๋ถ„์‚ฐํ™”์™€ ์ถ”๊ฐ€ ๋ณต์žก์„ฑ์„ ์ดˆ๋ž˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ ์•„ํ‚คํ…์ฒ˜: ๐Ÿš€ 0.5 ๋ฒ„์ „์—์„œ๋Š” ๋‹จ์ผ FastAPI ์•ฑ๊ณผ ์—ฌ๋Ÿฌ ๋ผ์šฐํ„ฐ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋” ๋‚˜์€ ์กฐ์ง ๊ตฌ์„ฑ, ์ค‘์•™ํ™”๋œ ํ๋ฆ„, ์ค‘๋ณต ๊ฐ์†Œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ:โ€‹

๋ณ€๊ฒฝ ๋‚ด์šฉ ๊ฐœ์š”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ์•ฑ์ด ๋ผ์šฐํ„ฐ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

    • ์ด์ „: open_webui.apps
    • ํ˜„์žฌ: open_webui.routers
  2. ๋ฉ”์ธ ์•ฑ ๊ตฌ์กฐ ๊ฐ„์†Œํ™”.

    • ์ด์ „ open_webui.apps.webui๋Š” open_webui.main์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด, ํ”„๋กœ์ ํŠธ์˜ ์ค‘์•™ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋กœ ๋ณ€ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  3. ํ†ตํ•ฉ API ์—”๋“œํฌ์ธํŠธ

    • Open WebUI 0.5๋Š” ๋ชจ๋ธ๋ณ„ ๊ฐœ๋ณ„ ํ•จ์ˆ˜(ollama, openai)๋ฅผ ๋Œ€์ฒดํ•˜๋Š” chat_completion์ด๋ผ๋Š” ํ†ตํ•ฉ ํ•จ์ˆ˜๋ฅผ open_webui.main์— ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ผ๊ด€๋˜๊ณ  ๊ฐ„์†Œํ™”๋œ API ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฐœ๋ณ„ ํ•จ์ˆ˜์˜ ์ง์ ‘์ ์ธ ํ›„์†์ž‘์€ open_webui.utils.chat์˜ generate_chat_completion์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ ๊ตฌ๋ฌธ ๋ถ„์„(์˜ˆ: ํŒŒ์ผ, ๋„๊ตฌ, ๊ธฐํƒ€ ์‚ฌํ•ญ)์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๊ฐ„๋‹จํ•œ POST ์š”์ฒญ์„ ์„ ํ˜ธํ•œ๋‹ค๋ฉด ์ด ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๊ฐ€ ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ:โ€‹

# ๊ตฌ๋ฌธ ๋ถ„์„์ด ํฌํ•จ๋œ ์ „์ฒด API ํ๋ฆ„ (์ƒˆ ํ•จ์ˆ˜):
from open_webui.main import chat_completion

# ๊ฒฝ๋Ÿ‰ํ™”๋œ ์ง์ ‘ POST ์š”์ฒญ(์ง์ ‘์ ์ธ ํ›„์†์ž‘):
from open_webui.utils.chat import generate_chat_completion

์ž์‹ ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์„ธ์š”!

  1. ์—…๋ฐ์ดํŠธ๋œ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜.
    • ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ์ด์ œ ์ƒˆ๋กœ์šด ํ˜•์‹์„ ์ค€์ˆ˜ํ•˜๋ฉฐ, request ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
    • request ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์—์„œ __request__ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค:
class Pipe:
def __init__(self):
pass

async def pipe(
self,
body: dict,
__user__: dict,
__request__: Request, # ์ƒˆ๋กœ์šด ๋งค๊ฐœ๋ณ€์ˆ˜
) -> str:
# ์ด๊ณณ์— ํ•จ์ˆ˜ ์ž‘์„ฑ

๐Ÿ“Œ ์™œ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ํ–ˆ๋‚˜์š”?

  • ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•˜์—ฌ ํ™•๋Œ€ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด.
  • ํ†ตํ•ฉ๋œ API๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝํ—˜์„ ๊ฐ„์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด.
  • ์ค‘๋ณต ์š”์†Œ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด.

โœ… ๋‹จ๊ณ„๋ณ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œโ€‹

ํ”„๋กœ์ ํŠธ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์•„๋ž˜ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.


๐Ÿ”„ 1. apps์—์„œ routers๋กœ ์ „ํ™˜ํ•˜๊ธฐโ€‹

๋ชจ๋“  ์•ฑ์€ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๊ณ  open_webui.routers ํ•˜์œ„๋กœ ์žฌ๋ฐฐ์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ž„ํฌํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์ž„ํฌํŠธ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ:

์ด์ „ ๊ฒฝ๋กœ์ƒˆ ๊ฒฝ๋กœ
open_webui.apps.ollamaopen_webui.routers.ollama
open_webui.apps.openaiopen_webui.routers.openai
open_webui.apps.audioopen_webui.routers.audio
open_webui.apps.retrievalopen_webui.routers.retrieval
open_webui.apps.webuiopen_webui.main

๐Ÿ“œ ์ค‘์š”ํ•œ ์˜ˆ์‹œโ€‹

๋ฉ”์ธ ์•ฑ(webui)์˜ ํŠน๋ณ„ ์ผ€์ด์Šค๋ฅผ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ๊ทœ์น™์„ ์ฐธ๊ณ ํ•˜์„ธ์š”:

  • webui์— ์žˆ์—ˆ๋‚˜์š”? ์ด์ œ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋˜๋Š” open_webui.main์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ:
    • ์ด์ „ (0.4):
      from open_webui.apps.webui.models import SomeModel 
    • ์ดํ›„ (0.5):
      from open_webui.models import SomeModel 

์ผ๋ฐ˜์ ์œผ๋กœ open_webui.apps๋ฅผ open_webui.routers๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”โ€”๋‹จ, webui๋Š” ์ด์ œ open_webui.main์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!


๐Ÿ‘ฉโ€๐Ÿ’ป 2. ์ž„ํฌํŠธ ๋ฌธ ์—…๋ฐ์ดํŠธํ•˜๊ธฐโ€‹

์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค:

์ด์ „:โ€‹

from open_webui.apps.ollama import main as ollama
from open_webui.apps.openai import main as openai

์ดํ›„:โ€‹

# ๋ณ„๋„ ๋ผ์šฐํ„ฐ ์ž„ํฌํŠธ
from open_webui.routers.ollama import generate_chat_completion
from open_webui.routers.openai import generate_chat_completion

# ๋˜๋Š” ํ†ตํ•ฉ ์—”๋“œํฌ์ธํŠธ ์‚ฌ์šฉ
from open_webui.main import chat_completion

๐Ÿ’ก ๊ฟ€ํŒ: ๊ฐ„๋‹จํ•จ๊ณผ ๋ฏธ๋ž˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ํ†ตํ•ฉ ์—”๋“œํฌ์ธํŠธ(chat_completion)๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

๐Ÿ“ ์ถ”๊ฐ€ ์ฐธ๊ณ : main.chat_completion๊ณผ utils.chat.generate_chat_completion ์ค‘์—์„œ ์„ ํƒํ•˜๊ธฐโ€‹

์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค์Œ ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. open_webui.main.chat_completion:

    • /api/chat/completions๋กœ POST ์š”์ฒญ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.
    • ํŒŒ์ผ, ๋„๊ตฌ ๋ฐ ๊ธฐํƒ€ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ „์ฒด API ํ๋ฆ„์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  2. open_webui.utils.chat.generate_chat_completion:

    • ์ถ”๊ฐ€์ ์ธ ํŒŒ์‹ฑ์ด๋‚˜ ์ž‘์—… ์—†์ด ์ง์ ‘ POST ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด์ „ main.generate_chat_completions, ollama.generate_chat_completion, ๋ฐ openai.generate_chat_completion ํ•จ์ˆ˜์˜ ์ง์ ‘ ํ›„์† ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
    • ๊ฐ„์†Œํ™”๋˜๊ณ  ๊ฐ€๋ฒผ์šด ์‹œ๋‚˜๋ฆฌ์˜ค์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ:โ€‹

# ํŒŒ์‹ฑ์„ ํฌํ•จํ•œ ์ „์ฒด API ํ๋ฆ„์— ์‚ฌ์šฉ:
from open_webui.main import chat_completion

# ๊ฐ„์†Œํ™”๋œ ์ง์ ‘ POST ์š”์ฒญ์— ์‚ฌ์šฉ:
from open_webui.utils.chat import generate_chat_completion

๐Ÿ“‹ 3. ์—…๋ฐ์ดํŠธ๋œ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ์ ์‘ํ•˜๊ธฐโ€‹

ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์— ๋” ์ž˜ ๋งž๋„๋ก ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ๋Œ€์ฒด๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ๊ฒฝ๋Ÿ‰ํ™”๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ open_webui.utils.chat์˜ generate_chat_completion์œผ๋กœ ์‹œ์ž‘ํ•˜์„ธ์š”. ์ „์ฒด API ํ๋ฆ„์˜ ๊ฒฝ์šฐ open_webui.main์˜ ์ƒˆ ํ†ตํ•ฉ ํ•จ์ˆ˜ chat_completion์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ณ€๊ฒฝ:โ€‹

๊ตฌ๋ฒ„์ „์ง์ ‘ ํ›„์† ๋ชจ๋“ˆ (๋‰ด๋ฒ„์ „)ํ†ตํ•ฉ ์˜ต์…˜ (๋‰ด๋ฒ„์ „)
openai.generate_chat_completion(form_data: dict, user: UserModel)generate_chat_completion(request: Request, form_data: dict, user: UserModel)chat_completion(request: Request, form_data: dict, user: UserModel)
  • ์ง์ ‘ ํ›„์† ๋ชจ๋“ˆ (generate_chat_completion): ์ด์ „ ollama/openai ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ๋Ÿ‰ํ™”๋œ 1:1 ๋Œ€์ฒด ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
  • ํ†ตํ•ฉ ์˜ต์…˜ (chat_completion): ํŒŒ์ผ ํŒŒ์‹ฑ ๋ฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ์ „์ฒด API ํ๋ฆ„์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์„ธ์š”.

์˜ˆ์ œ:โ€‹

๋‹ค์Œ์€ chat_completion์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค:

๐Ÿ› ๏ธ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๋ฆฌํŒฉํ† ๋ง ๋ฐฉ๋ฒ•โ€‹

์ƒ˜ํ”Œ ํ•จ์ˆ˜๋ฅผ ์ƒˆ ๊ตฌ์กฐ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค:

์ด์ „ (0.4 ๋ฒ„์ „):โ€‹

from pydantic import BaseModel
from open_webui.apps.ollama import generate_chat_completion

class User(BaseModel):
id: str
email: str
name: str
role: str

class Pipe:
def __init__(self):
pass

async def pipe(self, body: dict, __user__: dict) -> str:
# OpenAI ์—”๋“œํฌ์ธํŠธ ํ˜ธ์ถœ
user = User(**__user__)
body["model"] = "llama3.2:latest"
return await ollama.generate_chat_completion(body, user)

์ดํ›„ (0.5 ๋ฒ„์ „):โ€‹

from pydantic import BaseModel
from fastapi import Request

from open_webui.utils.chat import generate_chat_completion


class User(BaseModel):
id: str
email: str
name: str
role: str


class Pipe:
def __init__(self):
pass

async def pipe(
self,
body: dict,
__user__: dict,
__request__: Request,
) -> str:
# ์—…๋ฐ์ดํŠธ๋œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ํ•จ๊ป˜ ํ†ตํ•ฉ ์—”๋“œํฌ์ธํŠธ ์‚ฌ์šฉ
user = User(**__user__)
body["model"] = "llama3.2:latest"
return await generate_chat_completion(__request__, body, user)

์ค‘์š” ์ฐธ๊ณ  ์‚ฌํ•ญ:โ€‹

  • ์ƒˆ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์—์„œ Request ๊ฐ์ฒด (__request__)๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • __user__ ๋ฐ __event_emitter__์™€ ๊ฐ™์€ ๊ธฐํƒ€ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ณต์žกํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•ด ์œ ์—ฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒŸ 4. ๊ฐ„๋‹จํ•œ ์šฉ์–ด๋กœ ํ•ต์‹ฌ ๊ฐœ๋… ์š”์•ฝโ€‹

๋‹ค์Œ์€ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค:

  • Apps์—์„œ Routers๋กœ: open_webui.apps โžก๏ธ open_webui.routers๋กœ ๋ชจ๋“  ์ž„ํฌํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.
  • ํ†ตํ•ฉ ์—”๋“œํฌ์ธํŠธ: ollama์™€ openai๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋œ ๊ฒฝ์šฐ open_webui.main.chat_completion์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„์†Œํ™”ํ•˜์„ธ์š”.
  • ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ ์‘: ํ•จ์ˆ˜๊ฐ€ ํ•„์ˆ˜์ ์ธ request ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๐ŸŽ‰ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ์ด์ œ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค!โ€‹

Open WebUI 0.4์—์„œ 0.5๋กœ ์„ฑ๊ณต์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž„ํฌํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ , ํ†ตํ•ฉ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•จ์œผ๋กœ์จ ๋ฒ„์ „ 0.5์˜ ์ตœ์‹  ๊ธฐ๋Šฅ๊ณผ ๊ฐœ์„  ์‚ฌํ•ญ์„ ๋ชจ๋‘ ํ™œ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’ฌ ์งˆ๋ฌธ ๋˜๋Š” ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์œผ์‹ ๊ฐ€์š”? ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์ œ์•ˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ GitHub issue๋ฅผ ์—ด๊ฑฐ๋‚˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ํฌ๋Ÿผ์— ๋ฌธ์˜ํ•˜์„ธ์š”!

ํ–‰๋ณตํ•œ ์ฝ”๋”ฉ ๋˜์„ธ์š”! โœจ