# Fonctions utilitaires from typing import Any, Dict, List def filter_tools_for_context(tools: List[Any], conversation_messages: List[Dict[str, Any]], keywords: List[str]) -> List[Any]: """Filtrage simple des outils selon contexte récent et mots-clés.""" recent_text = " ".join( msg["content"] if isinstance(msg.get("content"), str) else " ".join( item.get("text", "") for item in msg.get("content", []) if isinstance(item, dict) ) for msg in conversation_messages[-5:] ).lower() selected = [] for tool in tools: name = (tool.get("name") if isinstance(tool, dict) else getattr(tool, "name", "")).lower() desc = (tool.get("description") if isinstance(tool, dict) else getattr(tool, "description", "")).lower() if not keywords or any(kw.lower() in (name + desc + recent_text) for kw in keywords): selected.append(tool) return selected def summarize_latest_results(conversation_messages: List[Dict[str, Any]]) -> str: """Résumé des derniers résultats outils.""" summaries = [] for msg in conversation_messages: if msg.get("role") == "user" and isinstance(msg.get("content"), list): for item in msg["content"]: if isinstance(item, dict) and item.get("type") == "tool_result": summaries.append(item.get("content", "")) return "\n".join(summaries[-5:]).strip() def count_tokens(conversation_messages: List[Dict[str, Any]]) -> int: """Comptage naïf de tokens (optimisation mémoire).""" total = 0 for msg in conversation_messages: content = msg.get("content") if isinstance(content, str): total += len(content.split()) elif isinstance(content, list): for item in content: if isinstance(item, dict) and "text" in item: total += len(item["text"].split()) elif isinstance(item, str): total += len(item.split()) return total def trim_conversation(conversation_messages: List[Dict[str, Any]], keep_last_n: int = 5) -> List[Dict[str, Any]]: """Réduction du contexte conversationnel.""" if len(conversation_messages) <= keep_last_n: return conversation_messages trimmed = conversation_messages[-keep_last_n:] trimmed.insert(0, {"role": "system", "content": "Résumé des messages précédents supprimés pour raison de contexte."}) return trimmed