diff --git a/backend/orchestrator.py b/backend/orchestrator.py index 9efde6a..85cd573 100644 --- a/backend/orchestrator.py +++ b/backend/orchestrator.py @@ -141,7 +141,6 @@ async def sync_providers_models(db: Session, settings: SystemSettings, sync_type models_to_process[m_id] = {"provider": "cloudflare", "name": m_id.split("/")[-1], "desc": "Modèle Serverless Cloudflare Workers AI.", "domain": determine_domain(m_id), "is_free": True, "ctx": 4096, "pp": 0.0, "pc": 0.0} except Exception: pass - # Phase de traduction asynchrone pour les modèles OpenRouter (les autres sont déjà en français natif) sem = asyncio.Semaphore(15) async def process_and_translate(m_id, data, client_session): async with sem: @@ -206,7 +205,6 @@ async def run_orchestrator(db: Session, history: list, settings: SystemSettings, final_response = "" try: - # Étape 1 : Le prompteur traduit et optimise la requête en ANGLAIS pour les travailleurs p_mod = config.get("prompter", "gemini-3.5-flash-lite") p_client, p_prov = get_client_for_model(db, p_mod, settings) prompt_system = "You are an expert prompt engineer. Translate and optimize the user request into clear, precise English tailored for AI execution." @@ -224,7 +222,6 @@ async def run_orchestrator(db: Session, history: list, settings: SystemSettings, w_tasks.append(ask_agent(w_client, w, formatted_history + [{"role": "user", "content": optimized}], w_prov)) responses = await asyncio.gather(*w_tasks, return_exceptions=True) - # Étape 2 : Le concaténeur synthétise et traduit le retour en FRANÇAIS (en préservant le code et les commentaires) c_mod = config.get("concatenator", "gemini-3.5-flash-lite") c_client, c_prov = get_client_for_model(db, c_mod, settings) diff --git a/frontend/dashboard.html b/frontend/dashboard.html index d1575f6..3b0529f 100644 --- a/frontend/dashboard.html +++ b/frontend/dashboard.html @@ -292,11 +292,23 @@ - -
-
+
+ +
+ Configuration des IA +
+ + +
+
+ + +
- +
- +
-
- +
- +
@@ -502,7 +513,6 @@ await fetchModelsInfo(); await fetchFinances(); - // GENERATION DU FICHIER MARKDOWN A L'EXTRACTION let mdContent = `# Extraction des Modèles IA - AETHAS38\n\n`; const d = new Date(); const dateStr = d.getFullYear() + String(d.getMonth()+1).padStart(2, '0') + String(d.getDate()).padStart(2, '0'); @@ -535,6 +545,39 @@ isSyncing.value = false; }; + const downloadTemplate = () => { + const templateContent = `# AETHAS38 - Configuration Multi-Agents\n\n**Rappel important :**\n- **Prompteur :** Le système de l'orchestrateur utilisera ce modèle pour traduire et optimiser votre requête initiale en ANGLAIS (langue native des IA).\n- **Concaténeur :** Le système utilisera ce modèle pour regrouper les réponses des travailleurs et traduire la synthèse finale en FRANÇAIS (en préservant le code brut).\n\n## Sélection des Modèles\nRenseignez l'ID exact du modèle (ex: gemini-3.5-flash-lite, mistralai/mistral-large-4-0). Laissez vide si inutilisé.\n\n- Prompteur : gemini-3.5-flash-lite\n- Travailleur 1 : \n- Travailleur 2 : \n- Travailleur 3 : \n- Travailleur 4 : \n- Travailleur 5 : \n- Concaténeur : gemini-3.5-flash-lite\n`; + downloadFile(templateContent, 'aethas38-config-agents.md'); + }; + + const handleConfigImport = (event) => { + const file = event.target.files[0]; + if (!file) return; + const reader = new FileReader(); + reader.onload = (e) => { + const content = e.target.result; + const extractModel = (key) => { + const regex = new RegExp(`- ${key} : (.*)`, 'i'); + const match = content.match(regex); + return match && match[1] ? match[1].trim() : ""; + }; + + const checkAndSet = (val, defaultVal) => val !== "" ? val : defaultVal; + + selectedPrompter.value = checkAndSet(extractModel('Prompteur'), 'gemini-3.5-flash-lite'); + workers.value[0] = extractModel('Travailleur 1'); + workers.value[1] = extractModel('Travailleur 2'); + workers.value[2] = extractModel('Travailleur 3'); + workers.value[3] = extractModel('Travailleur 4'); + workers.value[4] = extractModel('Travailleur 5'); + selectedConcatenator.value = checkAndSet(extractModel('Concaténeur'), 'gemini-3.5-flash-lite'); + + alert("Configuration IA importée et appliquée avec succès !"); + }; + reader.readAsText(file); + event.target.value = null; + }; + const uploadAvatar = async (event) => { const file = event.target.files[0]; if (!file) return; @@ -660,7 +703,7 @@ createNewProject, selectProject, renameProject, sendMessage, isLoading, togglePin, deleteProject, isSettingsModalOpen, openSettings, closeSettings, passForm, settingsMessage, isSavingSettings, changePassword, uploadAvatar, modelInfo, financesList, filterSearch, filterDomain, filterPricing, filteredModels, getFilteredModelsForCol, formatDate, syncModels, isSyncing, - workers, selectedPrompter, selectedConcatenator, colPricing, colDomain, + workers, selectedPrompter, selectedConcatenator, colPricing, colDomain, downloadTemplate, handleConfigImport, attachedFiles, handleFileUpload, handlePaste, removeFile, exportProject, copyToClipboard, downloadFile, downloadMessage, parseMessage };