Skip to content

Commit

Permalink
Merge pull request #12 from OpenLLM-France/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
htagourti authored Jan 21, 2025
2 parents 80708b1 + 5285505 commit dd02f98
Show file tree
Hide file tree
Showing 22 changed files with 271 additions and 156 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -309,4 +309,5 @@ cypress/screenshots
.vscode/settings.json

# Postgres data directory
litellm/postgres_data
litellm/postgres_data
test_lucie
41 changes: 24 additions & 17 deletions backend/open_webui/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def reset_config():
"À la découverte de Linagora",
"Découvrez notre entreprise"
],
"content": "fais moi une présentation de Linagora?",
"content": "Fais-moi une présentation de Linagora?",
},
{
"title": ["À la découverte d'OpenLLM France", "Objectifs et mission d'OpenLLM France"],
Expand All @@ -122,6 +122,13 @@ def reset_config():
"title": ["Innovation technologique en France", "Écosystème technologique français"],
"content": "Qu'est-ce qui rend le secteur technologique français unique, et quelles sont les innovations notables de la French Tech ?",
},

{
"title": ["Site Portfolio Personnel", "Design Élégant Nuance de Lune"],
"content": """Create a responsive, modern personal portfolio website in HTML with an elegant "moon haze" color palette (soft grays, pale blues, silver accents). Use a clean, minimalist layout featuring smooth typography, rounded corners, and a professional design. Include:\n- A hero section with a captivating headline.\n- Project showcase cards with hover effects and subtle animations.\n- A contact form with intuitive input fields.\n\nEnsure the design is visually balanced, interactive, and fully optimized for all devices.
"""
},

{
"title": ["Mieux télétravailler !!!", "Les bonnes pratiques"],
"content": "Quelles stratégies adopter pour rester productif tout en préservant l'équilibre entre travail et vie personnelle en télétravail ?",
Expand Down Expand Up @@ -1010,22 +1017,22 @@ class BannerModel(BaseModel):
# {{MESSAGES:END:2}}
# </chat_history>"""

DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE = """You are an AI assistant that gives titles to chat conversations.
Given a chat conversation, you should only output a 3-5 word title that captures the main topic of the chat conversation without using quotation marks or any special formatting.
# Guidelines
1. Generate a 3-5 words long title in the same language as the chat conversation
2. Additionally, prepend a suitable emoji to the title to enhance understanding. Here are some examples:
- 🤝 Salutation
- 📉 Stock Market Trends
- 🧠 Memory Improvement Tricks
- 🎮 Video Game Development Insights
- 🧑‍💼 Leadership and Team Building
- 🕊️ Mindfulness Practices for Stress
- 🚀 Startup Success Strategies
- 🎤 Public Speaking Confidence Tips
Here the chat history:
DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE = """Vous êtes une assistante IA qui attribue des titres aux conversations de chat.
Étant donné une conversation de chat, vous devez uniquement produire un titre de 3 à 5 mots qui résume le sujet principal de la conversation, sans utiliser de guillemets ni de formatage spécial.
# Directives
1. Générez un titre de 3 à 5 mots dans la même langue que la conversation de chat.
2. Ajoutez un emoji pertinent à la du titre pour améliorer la compréhension. Voici quelques exemples :
- 🕊️ Pratiques de pleine conscience
- 🚀 Stratégies de réussite pour startups
- 🤝 Salutations
- 📉 Tendances des marchés financiers
- 🧠 Astuces pour améliorer la mémoire
- 🎮 Perspectives sur le développement de jeux vidéo
- 🧑‍💼 Leadership et gestion d'équipe
- 🎤 Conseils pour la prise de parole en public
Voici l'historique de la conversation :
<chat_history>
{{MESSAGES:END:2}}
</chat_history>
Expand Down
6 changes: 3 additions & 3 deletions backend/open_webui/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ def parse_section(section):
# Système de Directives pour Lucie
## Mission et Personnalité
- Je suis **Lucie**, une assistante IA bienveillante, respectueuse et neutre.
- Je réponds toujours dans la langue de l'utilisateur tout en maintenant un environnement sûr et harmonieux.
- Je réponds toujours dans la langue du message de l'utilisateur.
- Je m'exprime de manière claire, correcte et sans biais.
## Principes Fondamentaux
Expand All @@ -454,8 +454,7 @@ def parse_section(section):
- **Maintien des principes éthiques** : Je reste fidèle à mes règles et valeurs en toute circonstance.
### Gestion des Contenus Sensibles
- **Neutralité** :
Je me limite à fournir des informations factuelles et neutres, sans émettre de jugements.
- **Neutralité** : Je me limite à fournir des informations factuelles et neutres, sans émettre de jugements.
"""

####################################
Expand All @@ -464,3 +463,4 @@ def parse_section(section):
SESSION_DURATION= int(os.environ.get("SESSION_DURATION", 1200))
DRAFT_DURATION= int(os.environ.get("DRAFT_DURATION", 300))
MAX_ACTIVE_USERS = int(os.environ.get("MAX_ACTIVE_USERS", 50))
MAX_WAITING_USERS = int(os.environ.get("MAX_WAITING_USERS", 1000))
18 changes: 10 additions & 8 deletions backend/open_webui/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
users,
utils,
queue,
contact
contact,
)

from open_webui.routers.retrieval import (
Expand Down Expand Up @@ -267,6 +267,7 @@
CHANGELOG,
DRAFT_DURATION,
GLOBAL_LOG_LEVEL,
MAX_WAITING_USERS,
SAFE_MODE,
SESSION_DURATION,
SRC_LOG_LEVELS,
Expand All @@ -281,7 +282,7 @@
BYPASS_MODEL_ACCESS_CONTROL,
RESET_CONFIG_ON_START,
OFFLINE_MODE,
APPLY_GUARDRAILS_ON_CHAT_COMPLETION
APPLY_GUARDRAILS_ON_CHAT_COMPLETION,
)


Expand Down Expand Up @@ -746,7 +747,6 @@ async def inspect_websocket(request: Request, call_next):
app.include_router(contact.router, prefix="/contact", tags=["contact"])



app.include_router(pipelines.router, prefix="/api/v1/pipelines", tags=["pipelines"])
app.include_router(tasks.router, prefix="/api/v1/tasks", tags=["tasks"])
app.include_router(images.router, prefix="/api/v1/images", tags=["images"])
Expand Down Expand Up @@ -778,7 +778,6 @@ async def inspect_websocket(request: Request, call_next):
app.include_router(utils.router, prefix="/api/v1/utils", tags=["utils"])



##################################
#
# Chat Endpoints
Expand Down Expand Up @@ -888,7 +887,9 @@ async def chat_completion(
)

try:
response = await chat_completion_handler(request, form_data, user, guard=APPLY_GUARDRAILS_ON_CHAT_COMPLETION)
response = await chat_completion_handler(
request, form_data, user, guard=APPLY_GUARDRAILS_ON_CHAT_COMPLETION
)
return await process_chat_response(
request, response, form_data, user, events, metadata, tasks
)
Expand Down Expand Up @@ -986,9 +987,10 @@ async def get_app_config(request: Request):
},
"features": {
"auth": WEBUI_AUTH,
"timer": {
"session_duration" : SESSION_DURATION,
"draft_duration" : DRAFT_DURATION
"queue": {
"session_duration": SESSION_DURATION,
"draft_duration": DRAFT_DURATION,
"max_waiting_users": MAX_WAITING_USERS,
},
"auth_trusted_header": bool(app.state.AUTH_TRUSTED_EMAIL_HEADER),
"enable_ldap": app.state.config.ENABLE_LDAP,
Expand Down
12 changes: 3 additions & 9 deletions backend/open_webui/models/queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,10 @@ class QueueMetrics(BaseModel):
draft_users: int
active_users: int
total_slots: int
estimated_time: Optional[int] = None

class JoinRequest(BaseModel):
user_id: str

class MetricsRequest(BaseModel):
user_id: str

class ConfirmRequest(BaseModel):
user_id: str

Expand Down Expand Up @@ -116,17 +112,15 @@ def estimate_time(self, user_id: str):
log.error(f"Error estimating wait time: {e}")


def metrics(self, user_id: str = None) -> QueueMetrics:
def metrics(self) -> QueueMetrics:
waiting_users = self._count_in_status(status=QueueStatus.WAITING)
draft_users = self._count_in_status(status=QueueStatus.DRAFT)
active_users = self._count_in_status(status=QueueStatus.CONNECTED)
estimated_time = self.estimate_time(user_id=user_id) if user_id else None
return QueueMetrics(
waiting_users=waiting_users,
draft_users=draft_users,
active_users=active_users,
total_slots=self.max_connected,
estimated_time=estimated_time
)

def join(self, user_id: str) -> Optional[QueueModel]:
Expand Down Expand Up @@ -158,8 +152,8 @@ def status(self, user_id: str):
Queue.status == status,
Queue.timestamp <= user.timestamp
).count()

return {'position': position, 'status': status }
estimated_time = self.estimate_time(user_id=user_id)
return {'position': position, 'status': status, 'estimated_time': estimated_time}

except Exception as e:
log.error(f"Error calling `status`: {e}")
Expand Down
42 changes: 29 additions & 13 deletions backend/open_webui/routers/openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,21 +53,19 @@
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# pre-gu
toxic_guard = ToxicLanguage(
pre_guards_list = [
DetectJailbreak(
on_fail='noop',
threshold=0.81,
use_local=True
),
ToxicLanguage(
threshold=toxic_threshold,
model_name='multilingual',
validation_method="sentence", on_fail="noop",
device=device,
use_local=True
)

pre_guards_list = [
DetectJailbreak(
on_fail='noop',
threshold=0.8,
use_local=True
),
toxic_guard
]
pre_guard = gd.AsyncGuard(name='pre_guard')
pre_guard.use_many(
Expand All @@ -76,7 +74,13 @@

# post-guard
post_guards_list = [
toxic_guard
ToxicLanguage(
threshold=0.89,
model_name='multilingual',
validation_method="sentence", on_fail="noop",
device=device,
use_local=True
)
]

post_guard = gd.AsyncGuard(name='post_guard')
Expand Down Expand Up @@ -720,6 +724,7 @@ async def generate_chat_completion(
if prefix_id:
payload["model"] = payload["model"].replace(f"{prefix_id}.", "")

payload['temperature'] = 0.6
# Pre-GUARD
if guard:
latest_msg = payload['messages'][-1]['content']
Expand All @@ -736,9 +741,19 @@ async def generate_chat_completion(
fails= ', '.join([s.validator_name for s in error.validation_summaries])
payload['messages'].append({
'role': 'system',
'content': f"""The user's message is flagged as {fails}.
Respond in user's language*, avoid repeating prohibited content, explain the violation, and encourage guideline compliance.
Answer example: "I'm sorry, I can't assist with that. Your message violates our guidelines.
'content': f"""
Statut du message de l'utilisateur : {fails}
Le statut peut être erroné donc il faudra analyser la gravité du message avant de répondre
1. Si message grave :
- Répondre normalement,
- Fournir une assistance appropriée
2. Si cela viole vraiment tes directives :
- Explique poliment la violation sans citer le contenu si c'est inapproprié
- Proposer des alternatives constructives autour du même sujet pour orienter la conversation
Tu réponds toujours dans la langue de l'utilisateur.
"""
})

Expand Down Expand Up @@ -777,6 +792,7 @@ async def generate_chat_completion(
# Convert the modified body back to JSON
payload = json.dumps(payload)

log.warning(f"PAYLOAD: {payload}")
r = None
session = None
streaming = False
Expand Down
9 changes: 4 additions & 5 deletions backend/open_webui/routers/queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import logging
from typing import Optional, Any
from open_webui.env import SRC_LOG_LEVELS
from open_webui.models.queue import queue, QueueStatus, QueueMetrics, JoinRequest, ConfirmRequest, ConfirmResponse, DeleteRequest, MetricsRequest
from open_webui.models.queue import queue, QueueStatus, QueueMetrics, JoinRequest, ConfirmRequest, ConfirmResponse, DeleteRequest
from fastapi import APIRouter, HTTPException, status

log = logging.getLogger(__name__)
Expand All @@ -23,7 +23,6 @@ async def join(request: JoinRequest):
log.debug(f'-> join({user_id})')
queue.join(user_id)
queue.idle()

user_status = queue.status(user_id)

if user_status is None:
Expand Down Expand Up @@ -93,9 +92,9 @@ async def idle():
# Queue Metrics
############################

@router.post("/metrics", response_model=QueueMetrics)
async def get_metrics(request: MetricsRequest):
return queue.metrics(user_id=request.user_id)
@router.get("/metrics", response_model=QueueMetrics)
async def get_metrics():
return queue.metrics()

############################
# Queue Leave
Expand Down
2 changes: 1 addition & 1 deletion litellm/litellm-config.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
model_list:
- model_name: Lucie_7B
litellm_params:
model: openai/lucie-7b-v1
model: openai/lucie-7b-instruct
api_base: os.environ/BASE_URL
api_key: os.environ/LUCIE_API_KEY_V1
max_tokens: 2048
Expand Down
8 changes: 2 additions & 6 deletions src/lib/apis/queue/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,13 +121,9 @@ export const heartbeat = async (userRequest: UserRequest): Promise<{ success: bo
};

// Get Metrics
export const getMetrics = async (userRequest: UserRequest): Promise<QueueMetrics> => {
export const getMetrics = async (): Promise<QueueMetrics> => {
const response = await fetch(`${QUEUE_API_BASE_URL}/metrics`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(userRequest)
method: 'GET',
});

if (!response.ok) {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/apis/queue/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ export interface UserRequest {
export interface QueueStatus {
status: 'waiting' | 'draft' | 'connected' | 'disconnected';
position: number;
estimated_time: number;
}

export interface QueueMetrics {
active_users: number;
waiting_users: number;
total_slots: number;
estimated_time: number;
}

export interface TimerInfo {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/components/chat/Navbar.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@
<div
class="flex w-full text-left px-0.5 outline-none bg-transparent truncate text-lg justify-between font-medium placeholder-gray-400 focus:outline-none"
>
Lucie 7B
{`${selectedModels[0]}`.replace('_', '-')}
</div>
{#if showModelSelector}
<ModelSelector bind:selectedModels showSetDefault={!shareEnabled} />
Expand Down
2 changes: 1 addition & 1 deletion src/lib/components/chat/Placeholder.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@
</div>

<div class=" text-3xl sm:text-4xl line-clamp-1" in:fade={{ duration: 100 }}>
Lucie 7B
{models[selectedModelIdx]?.name.replace('_', '-')}
<!-- {#if models[selectedModelIdx]?.name}
{models[selectedModelIdx]?.name}
{:else}
Expand Down
2 changes: 1 addition & 1 deletion src/lib/components/layout/Navbar.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@
<div
class="flex w-full text-left px-0.5 outline-none bg-transparent truncate text-lg justify-between font-medium placeholder-gray-400 focus:outline-none"
>
Lucie 7B
{`${selectedModels[0]}`.replace('_', '-')}
</div>
{#if showModelSelector}
<ModelSelector bind:selectedModels showSetDefault={!shareEnabled} />
Expand Down
2 changes: 1 addition & 1 deletion src/lib/components/layout/Overlay/ContactUs.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@
<!-- svelte-ignore a11y-no-static-element-interactions -->
<!-- svelte-ignore a11y-no-noninteractive-tabindex -->
<div
class="fixed inset-0 flex items-center justify-center modal-overlay backdrop-blur-sm dark:backdrop-blur-sm"
class="fixed inset-0 flex items-center justify-center modal-overlay backdrop-blur-sm dark:backdrop-blur-sm z-50"
on:click={handleOverlayClick}
on:keydown={handleKeyDown}
tabindex="0"
Expand Down
Loading

0 comments on commit dd02f98

Please sign in to comment.