Finish customer segregation, docker setup

This commit is contained in:
Phil Szalay 2025-02-13 10:29:33 +01:00
parent 641cf04a6e
commit 903226a7bf
11 changed files with 76 additions and 26 deletions

12
backend/beyond_the_loop/dev.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/bash
# Set the Python path to include the backend directory
export PYTHONPATH="/Users/philszalay/Documents/code/beyond-the-loop/backend:$PYTHONPATH"
PORT="${PORT:-8080}"
# Start the LiteLLM container in the background
cd /Users/philszalay/Documents/code/beyond-the-loop && docker-compose up -d litellm
# Start the uvicorn server
cd /Users/philszalay/Documents/code/beyond-the-loop/backend && uvicorn open_webui.main:app --port $PORT --host 0.0.0.0 --forwarded-allow-ips '*' --reload

View File

@ -7,6 +7,9 @@ from sqlalchemy import String, Column, Text
from open_webui.internal.db import get_db, Base
# Constants
NO_COMPANY = "NO_COMPANY"
####################
# Company DB Schema
####################

View File

@ -19,6 +19,7 @@ from open_webui.models.auths import (
UserResponse,
)
from beyond_the_loop.models.users import Users
from beyond_the_loop.models.companies import NO_COMPANY
from open_webui.constants import ERROR_MESSAGES, WEBHOOK_MESSAGES
from open_webui.env import (
@ -258,7 +259,7 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
)
user = Auths.insert_new_auth(
email=mail, password=str(uuid.uuid4()), name=cn, company_id="NO_COMPANY", role=role
email=mail, password=str(uuid.uuid4()), name=cn, company_id=NO_COMPANY, role=role
)
if not user:
@ -451,7 +452,7 @@ async def signup(request: Request, response: Response, form_data: SignupForm):
form_data.email.lower(),
hashed,
form_data.name,
"NO_COMPANY",
NO_COMPANY,
form_data.profile_image_url,
role,
)
@ -550,7 +551,7 @@ async def signout(request: Request, response: Response):
@router.post("/add", response_model=SigninResponse)
async def add_user(form_data: AddUserForm, user=Depends(get_admin_user)):
async def add_user(form_data: AddUserForm, admin_user: Users = Depends(get_admin_user)):
if not validate_email_format(form_data.email.lower()):
raise HTTPException(
status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.INVALID_EMAIL_FORMAT
@ -561,25 +562,26 @@ async def add_user(form_data: AddUserForm, user=Depends(get_admin_user)):
try:
hashed = get_password_hash(form_data.password)
user = Auths.insert_new_auth(
new_user = Auths.insert_new_auth(
form_data.email.lower(),
hashed,
form_data.name,
form_data.company_id,
admin_user.company_id,
form_data.profile_image_url,
form_data.role,
)
if user:
token = create_token(data={"id": user.id})
if new_user:
token = create_token(data={"id": new_user.id})
return {
"token": token,
"token_type": "Bearer",
"id": user.id,
"email": user.email,
"name": user.name,
"role": user.role,
"profile_image_url": user.profile_image_url,
"id": new_user.id,
"email": new_user.email,
"name": new_user.name,
"role": new_user.role,
"company_id": new_user.company_id,
"profile_image_url": new_user.profile_image_url,
}
else:
raise HTTPException(500, detail=ERROR_MESSAGES.CREATE_USER_ERROR)

View File

@ -1,2 +0,0 @@
PORT="${PORT:-8080}"
uvicorn open_webui.main:app --port $PORT --host 0.0.0.0 --forwarded-allow-ips '*' --reload

View File

@ -57,7 +57,6 @@ from open_webui.routers import (
retrieval,
pipelines,
tasks,
auths,
channels,
chats,
folders,
@ -85,7 +84,8 @@ from open_webui.internal.db import Session
from open_webui.models.functions import Functions
from beyond_the_loop.models.models import Models
from beyond_the_loop.models.users import UserModel, Users
from beyond_the_loop.models.users import Users
from beyond_the_loop.routers import auths
from open_webui.config import (
# Ollama

View File

@ -92,7 +92,6 @@ class SignupForm(BaseModel):
class AddUserForm(SignupForm):
role: Optional[str] = "pending",
company_id: str
class AuthsTable:

View File

@ -1,5 +1,6 @@
from test.util.abstract_integration_test import AbstractPostgresTest
from test.util.mock_user import mock_webui_user
from beyond_the_loop.models.companies import NO_COMPANY
class TestAuths(AbstractPostgresTest):
@ -32,7 +33,7 @@ class TestAuths(AbstractPostgresTest):
email="john.doe@openwebui.com",
password=get_password_hash("old_password"),
name="John Doe",
company_id="1",
company_id=NO_COMPANY,
profile_image_url="/user.png",
role="user",
)
@ -54,7 +55,7 @@ class TestAuths(AbstractPostgresTest):
email="john.doe@openwebui.com",
password=get_password_hash("old_password"),
name="John Doe",
company_id="1",
company_id=NO_COMPANY,
profile_image_url="/user.png",
role="user",
)
@ -82,7 +83,7 @@ class TestAuths(AbstractPostgresTest):
email="john.doe@openwebui.com",
password=get_password_hash("password"),
name="John Doe",
company_id="1",
company_id=NO_COMPANY,
profile_image_url="/user.png",
role="user",
)
@ -145,7 +146,7 @@ class TestAuths(AbstractPostgresTest):
email="john.doe@openwebui.com",
password="password",
name="John Doe",
company_id="1",
company_id=NO_COMPANY,
profile_image_url="/user.png",
role="admin",
)
@ -163,7 +164,7 @@ class TestAuths(AbstractPostgresTest):
email="john.doe@openwebui.com",
password="password",
name="John Doe",
company_id="1",
company_id=NO_COMPANY,
profile_image_url="/user.png",
role="admin",
)
@ -179,7 +180,7 @@ class TestAuths(AbstractPostgresTest):
email="john.doe@openwebui.com",
password="password",
name="John Doe",
company_id="1",
company_id=NO_COMPANY,
profile_image_url="/user.png",
role="admin",
)
@ -196,7 +197,7 @@ class TestAuths(AbstractPostgresTest):
email="john.doe@openwebui.com",
password="password",
name="John Doe",
company_id="1",
company_id=NO_COMPANY,
profile_image_url="/user.png",
role="admin",
)

View File

@ -14,6 +14,7 @@ from starlette.responses import RedirectResponse
from open_webui.models.auths import Auths
from beyond_the_loop.models.users import Users
from beyond_the_loop.models.companies import NO_COMPANY
from open_webui.models.groups import Groups, GroupModel, GroupUpdateForm
from open_webui.config import (
DEFAULT_USER_ROLE,
@ -292,7 +293,7 @@ class OAuthManager:
str(uuid.uuid4())
), # Random password, not used
name=name,
company_id="NO_COMPANY",
company_id=NO_COMPANY,
profile_image_url=picture_url,
role=role,
oauth_sub=provider_sub,

View File

@ -4,6 +4,9 @@ services:
litellm:
container_name: litellm
image: ghcr.io/berriai/litellm:main-stable
environment:
- "AZURE_OPENAI_API_BASE_URL=${AZURE_OPENAI_API_BASE_URL}"
- "AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY}"
restart: unless-stopped
ports:
- "4000:4000"
@ -22,16 +25,18 @@ services:
image: ghcr.io/open-webui/open-webui:${WEBUI_DOCKER_TAG-main}
container_name: open-webui
volumes:
- open-webui:/app/backend/data
- ./backend/data:/app/backend/data
depends_on:
- litellm
ports:
- "8080:8080" # Open Web UI port
environment:
- "OPENAI_API_BASE_URL=http://litellm:4000/v1" # Point Open Web UI to LiteLLM
- "DATABASE_URL=sqlite:////app/backend/data/database.sqlite"
extra_hosts:
- host.docker.internal:host-gateway
restart: unless-stopped
volumes:
open-webui: {}
litellm: {}

29
litellm-config.yaml Normal file
View File

@ -0,0 +1,29 @@
litellm_settings:
debug: true
verbose: true
load_env_variables: true
model_list:
- model_name: "GPT 4o"
litellm_params:
model: "azure/gpt-4o"
api_base: os.environ/AZURE_OPENAI_API_BASE_URL
api_key: os.environ/AZURE_OPENAI_API_KEY
model_info:
description: "OpenAI's most advanced model, ideal for complex tasks."
arena_elo: 1287
knowledge_cutoff: "October 2023"
context_window: 128000
- model_name: "GPT 3.5 Turbo"
litellm_params:
model: "azure/gpt-35-turbo"
api_base: os.environ/AZURE_OPENAI_API_BASE_URL
api_key: os.environ/AZURE_OPENAI_API_KEY
model_info:
description: "OpenAI's cheaper model for less complex tasks."
arena_elo: 1116
knowledge_cutoff: "September 2021"
context_window: 16000
general_settings: {}

0
main.py Normal file
View File