Optimisation performance (30t/s --> 50t/s) & adaptation parsing json --> llama.cpp & Fix système mémoire
This commit is contained in:
parent
e27b60e60c
commit
0ba47f8363
19 changed files with 457 additions and 123 deletions
|
|
@ -647,7 +647,7 @@ class Superviseur(commands.Bot):
|
|||
logger.info(f"AI interaction triggered (Monitoring: {is_monitoring})")
|
||||
|
||||
# ... (same caching logic)
|
||||
if message.guild:
|
||||
if message.guild and hasattr(message.author, 'guild_permissions'):
|
||||
perms = message.author.guild_permissions
|
||||
if check_is_admin(perms):
|
||||
self._invalidate_caches(message.guild.id)
|
||||
|
|
@ -676,13 +676,23 @@ class Superviseur(commands.Bot):
|
|||
|
||||
user_id = str(message.author.id)
|
||||
guild_name = sanitize_guild_name(message.guild.name) if message.guild else "Direct"
|
||||
history = await build_context_for_model(user_id, max_recent=12, guild_id=guild_name) or ""
|
||||
|
||||
from ia.memoire import get_structured_history
|
||||
resume, structured_history = await get_structured_history(user_id, max_recent=12, guild_id=guild_name)
|
||||
|
||||
# Prepare content
|
||||
content = self._prepare_content(message) + extra_context
|
||||
|
||||
# Build payload
|
||||
payload = self._build_payload(permissions_info, server_context, channels_list, history, content, message)
|
||||
payload = self._build_payload(
|
||||
permissions_info,
|
||||
server_context,
|
||||
channels_list,
|
||||
resume,
|
||||
structured_history,
|
||||
content,
|
||||
message
|
||||
)
|
||||
|
||||
# Execute request
|
||||
async with self._request_semaphore:
|
||||
|
|
@ -853,8 +863,8 @@ class Superviseur(commands.Bot):
|
|||
content = content.replace(f'<@{mention.id}>', f'@{mention.display_name}')
|
||||
content = content.replace(f'<@!{mention.id}>', f'@{mention.display_name}')
|
||||
|
||||
# Remove bot mention
|
||||
content = content.lstrip(f'<@{self.user.id}>').lstrip(f'<@!{self.user.id}>').strip()
|
||||
# Remove bot mention (Désactivé pour que le LLM voit qu'il est mentionné)
|
||||
# content = content.lstrip(f'<@{self.user.id}>').lstrip(f'<@!{self.user.id}>').strip()
|
||||
|
||||
# Handle attachments
|
||||
if message.attachments:
|
||||
|
|
@ -935,20 +945,35 @@ class Superviseur(commands.Bot):
|
|||
permissions_info: str,
|
||||
server_context: str,
|
||||
channels_list: str,
|
||||
history: str,
|
||||
resume: str,
|
||||
structured_history: list,
|
||||
content: str,
|
||||
message
|
||||
message,
|
||||
is_monitoring: bool = False
|
||||
) -> dict:
|
||||
"""Build LLM payload."""
|
||||
"""Build LLM payload with interaction mode context."""
|
||||
user_name_info = f"Nom d'utilisateur : {message.author.display_name} (ID: {message.author.id})"
|
||||
prompt = f"{self.system_prompt}\n{permissions_info}\n{user_name_info}{server_context}{channels_list}\n{history}\n\nUser: {content}"
|
||||
|
||||
# Indicateur de mode pour éviter que l'IA ne bégaye sur sa légitimité à répondre
|
||||
mode_indicator = "[MODE: RÉPONSE DIRECTE (Vous avez été interpellé par l'utilisateur)]"
|
||||
if is_monitoring:
|
||||
mode_indicator = "[MODE: SURVEILLANCE HEURISTIQUE (N'intervenez que si nécessaire via ALERT/INSIGHT)]"
|
||||
|
||||
import time
|
||||
current_time = time.strftime('%H:%M:%S le %d/%m/%Y')
|
||||
time_info = f"[Heure actuelle du serveur : {current_time}]"
|
||||
|
||||
prompt_system = f"{self.system_prompt}\n{time_info}\n{permissions_info}\n{mode_indicator}\n{user_name_info}{server_context}{channels_list}"
|
||||
if resume:
|
||||
prompt_system += f"\nContexte global (mémoire) :\n{resume}"
|
||||
|
||||
vision_model = any(v in self.ollama_model.lower() for v in
|
||||
['llava', 'bakllava', 'moondream', 'llama3.2-vision', 'minicpm-v']) and message.attachments
|
||||
|
||||
return self.llm.build_payload(
|
||||
prompt=prompt,
|
||||
system_prompt=self.system_prompt,
|
||||
prompt=content,
|
||||
system_prompt=prompt_system,
|
||||
structured_history=structured_history,
|
||||
vision_model=vision_model,
|
||||
attachments=message.attachments
|
||||
)
|
||||
|
|
@ -968,7 +993,21 @@ class Superviseur(commands.Bot):
|
|||
# 2. Nettoyage des éventuels backticks de code et résidus de JSON
|
||||
clean_reply = clean_reply.replace('```json', '').replace('```', '').strip()
|
||||
|
||||
# 3. Filtrer les marqueurs internes fréquents (Leak prevention)
|
||||
# 3. Supprimer les balises de réflexion (Thinking/Thought) et leur contenu
|
||||
clean_reply = re.sub(r'<thought>.*?</thought>', '', clean_reply, flags=re.DOTALL | re.IGNORECASE)
|
||||
clean_reply = re.sub(r'<reflexion>.*?</reflexion>', '', clean_reply, flags=re.DOTALL | re.IGNORECASE)
|
||||
clean_reply = re.sub(r'\[THOUGHT\].*?\[/THOUGHT\]', '', clean_reply, flags=re.DOTALL | re.IGNORECASE)
|
||||
|
||||
# 4. Nettoyage des tokens spéciaux de modèles (ChatML/DeepSeek etc)
|
||||
tokens_to_remove = [
|
||||
"<|end_of_sentence|>", "<|endoftext|>", "<|end|>", "<|start|>",
|
||||
"<|assistant|>", "<|user|>", "<|system|>", "<|channel|>",
|
||||
"<|constrain|>", "<|message|>", "<|thought|>"
|
||||
]
|
||||
for token in tokens_to_remove:
|
||||
clean_reply = clean_reply.replace(token, "")
|
||||
|
||||
# 5. Filtrer les marqueurs internes fréquents (Leak prevention)
|
||||
markers_to_remove = [
|
||||
"[Public]", "[Relevant]", "[Irrelevant]", "[Alerte]", "[Insight]",
|
||||
"[CRITICITÉ", "[MENACE", "[RISQUE", "[DÉTECTION", "[ANALYSE", "[ACTION"
|
||||
|
|
@ -986,10 +1025,10 @@ class Superviseur(commands.Bot):
|
|||
else:
|
||||
clean_reply = clean_reply.replace(marker, "")
|
||||
|
||||
# 4. Supprimer les résidus JSON rémanents avec un regex plus large
|
||||
# 6. Supprimer les résidus JSON rémanents avec un regex plus large
|
||||
clean_reply = re.sub(r'\{[\s\n]*[\"\']action[\"\'].*?\}', '', clean_reply, flags=re.DOTALL)
|
||||
|
||||
# 5. Supprimer les lignes vides en trop et les espaces multiples
|
||||
# 7. Supprimer les lignes vides en trop et les espaces multiples
|
||||
clean_reply = re.sub(r'\n{3,}', '\n\n', clean_reply)
|
||||
clean_reply = clean_reply.strip()
|
||||
|
||||
|
|
@ -1010,7 +1049,7 @@ class Superviseur(commands.Bot):
|
|||
|
||||
# Store interaction (Even if silent, we store the input for better context next time)
|
||||
user_id = str(message.author.id)
|
||||
guild_id = sanitize_guild_name(message.guild.name) if message.guild else None
|
||||
guild_id = sanitize_guild_name(message.guild.name) if message.guild else "Direct"
|
||||
await add_interaction(user_id, message.channel.id, message.content, clean_reply if not is_monitoring else "", guild_id)
|
||||
|
||||
# En mode monitoring, on ne répond PAS au canal public sauf si l'IA l'a explicitement demandé via une action
|
||||
|
|
@ -1088,10 +1127,10 @@ class Superviseur(commands.Bot):
|
|||
|
||||
action = item['action']
|
||||
if action == 'NONE':
|
||||
action_executed = True # Bloque le fallback text même si la réponse est vide
|
||||
resp = item.get('response', "").strip()
|
||||
if resp and not is_monitoring:
|
||||
await self.messaging.reply_with_limit(message, format_mentions_in_text(resp))
|
||||
action_executed = True
|
||||
else:
|
||||
success, result = await self.execute_action(action, item, message)
|
||||
action_logger.log_action(action, str(message.author), str(message.guild), item, success, result)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue