- Clarifier l’objectif produit
- Agent dans le side panel qui : lit la page, prend des décisions avec un LLM via OpenRouter, et déclenche des actions sur les onglets (navigation, extraction, assistance à la rédaction, etc.).
- Cible fonctionnelle : navigation générale, plus éventuellement assistance sur LinkedIn (lecture, résumé, aide à la rédaction), avec un mode très conservateur sur les actions automatiques.
- Poser les contraintes LinkedIn dès le départ
- Les CGU LinkedIn interdisent explicitement l’automatisation de l’UI, le scraping massif et les bots.[^2][^1]
- Même un comportement human‑like ne garantit pas d’éviter les restrictions ; LinkedIn utilise des modèles de détection comportementale avancés (timing, volume, patterns d’actions).[^3][^4][^5]
- Décider :
- Soit limiter l’agent à un rôle assistif sur LinkedIn (pré‑remplir, suggérer, laisser l’humain cliquer).
- Soit assumer un mode « automations » avec risques, documentés clairement à l’utilisateur.
- Choix techniques
- Extension Chrome Manifest V3.
- Side panel + UI en React/TypeScript (Vite ou CRA), ou autre framework.
- Service worker (background) en TS (module).
- Content scripts en TS pour la manipulation du DOM.
- Eventuel backend proxy (FastAPI, Cloudflare Workers, Node) pour appeler OpenRouter.
- Architecture logique
- UI Side Panel : interface de chat + affichage des actions de l’agent.
- Service Worker :
- Orchestrateur des tâches agentiques.
- Point central pour les appels OpenRouter et la logique de tools.
- State machine (jobs, steps, reprise après redémarrage).
- Content Scripts :
- Fonctions DOM
read_page,click_selector,fill_input,scroll, etc.
- Fonctions DOM
- Backend (optionnel mais recommandé) :
- Proxy OpenRouter (clé côté serveur, quotas, logs, filtrage).
- Étapes
- Créer le squelette du projet (template MV3 + React ou équivalent).
- Écrire un
manifest.jsonminimal :manifest_version: 3,name,version.background.service_worker,type: module.side_panel.default_path.- Permissions :
sidePanel,tabs,scripting,storage,activeTab.[^6][^7][^8] host_permissions:https://*/*,http://*/*(ou domaines restreints).content_scriptsbasiques pour toutes les pages.
- Objectif de ce bloc
- Avoir une extension installable, avec side panel ouvert au clic et un service worker qui logge les messages.
- Backend (recommandé)
- Créer un endpoint
/llmqui proxy :POST /llm→https://openrouter.ai/api/v1/chat/completionsavec la vraie clé en headerAuthorization.- Ajout des headers recommandés (
HTTP-Referer,X-Title).[^9]
- Gérer les erreurs, timeouts, quotas, logging minimal.
- Créer un endpoint
- Service worker
- Fonction
callLLM(messages)qui envoie au backend les messages du chat (format OpenAI‑like / OpenRouter). - Gestion simple des réponses (
assistanttextuel only).
- Fonction
- UI
- Chat minimal dans le side panel :
- Input texte.
- Affichage des tours de conversation.
- Envoi des messages au service worker (
chrome.runtime.sendMessage) qui appellecallLLMet renvoie la réponse.
- Chat minimal dans le side panel :
- Objectif
- Avoir un chat LLM fonctionnel dans le side panel, sans tools ni actions sur les onglets.
- Spécifier un format strict pour les tool calls / tool results (JSON) par ex. :
- Tool call :
{ "type": "tool_call", "tool": "read_page", "args": { "tabId": 123 } }- Tool result :
{ "type": "tool_result", "tool": "read_page", "result": "…texte de la page…" }- Définir un schéma TS (types) pour :
AgentMessage,ToolCall,ToolResult,AgentTask.
- Côté content script / scripting :
- Fonction
readPage(tabId)qui :- Utilise
chrome.scripting.executeScriptsur le tab courant pour renvoyerdocument.body.innerTexttronqué.[^10]
- Utilise
- Fonction
- Côté worker :
- Quand un tool call
read_pagearrive, exécuterreadPage, puis renvoyer un messagetool_resultau LLM comme nouveau message dans le chat.
- Quand un tool call
- Écrire un prompt système qui :
- Décrit les tools disponibles (
read_pageau début). - Impose le format JSON pour les tool calls.
- Explique la boucle : réfléchir, appeler un tool si besoin, intégrer son résultat, puis répondre.
- Décrit les tools disponibles (
- Objectif de cette phase
- Obtenir un agent qui sait lire la page active et utiliser cette info dans sa réponse.
goto_url(url):- Utilise
chrome.tabs.update({ url })sur le tab actif.
- Utilise
open_tab(url):- Utilise
chrome.tabs.create({ url }).
- Utilise
click_selector(selector):- Injecte une fonction via
chrome.scripting.executeScriptqui faitdocument.querySelector(selector)?.click().
- Injecte une fonction via
fill_input(selector, value):- Même principe, mais modifie
valueet déclenche les events nécessaires.
- Même principe, mais modifie
- Mapper chaque nom de tool à une fonction TS pure qui :
- Valide les arguments.
- Appelle
tabs/scripting/ content scripts. - Retourne un objet structuré (succès/échec, infos pertinentes).
- Gérer la state machine de tâche :
PENDING → RUNNING → WAITING_TOOL → DONE / ERROR.- Persister l’état dans
chrome.storagepour les longues opérations / redémarrage du worker.[^11]
- Objectif
- Arriver à un agent qui peut enchaîner plusieurs actions (ouvrir une page, lire, cliquer, revenir, etc.).
- Ajouter un module de scheduler côté worker qui :
- Planifie les tool calls dans le temps, au lieu de tout lancer immédiatement.
- Introduit des délais aléatoires entre les actions, avec des plages larges (ex. 10–120 s) plutôt que de petites variations de quelques secondes.[^4][^3]
- Imite des sessions avec pauses (ex. après 10–15 actions, pause 10–15 min).[^3][^4]
- Ajouter des tools internes utilisés par l’agent pour générer du « bruit » humain crédible sur les sites cibles (quand c’est acceptable) :
scroll_naturally(direction, duration): scroll progressif avec pauses.open_random_internal_link(): clic sur un lien interne choisi dans une liste pré‑filtrée.
- Varier l’ordre et la nature des actions pour éviter des patterns trop rigides (toujours le même enchaînement).[^4]
- Limites journalières / par session configurables :
- Nombre maximal de tool calls « sensibles » (clics, formulaires).
- Durée maximale d’une session agentique avant arrêt forcé (cooldown).
- Intégrer dans le design les points suivants (à rappeler dans la doc utilisateur) :
- LinkedIn surveille volume, rapidité, répétitivité des actions (vues profils, invités, messages).[^5][^3][^4]
- Comportements typiques de bots :
- Actions à intervalles quasi constants.
- Pics d’activité massifs en peu de temps.
- Faible variété d’actions (que des visites/invitations, aucun contenu).
- Messages très répétitifs / peu personnalisés.[^12][^3]
- Pour rester au plus près d’un usage « tolérable » :
- Limiter l’agent aux tasks suivantes sur LinkedIn :
- Lecture et analyse (extraction de données, résumé de profil) côté content script.
- Aide à la rédaction : l’agent génère un message / commentaire, mais ne clique pas sur « envoyer ».
- Laisser l’utilisateur :
- Cliquer sur les boutons d’invitation / message.
- Valider ou éditer chaque message généré.
- Limiter l’agent aux tasks suivantes sur LinkedIn :
- Mettre en avant ce mode comme par défaut dans ton UI LinkedIn.
Si tu choisis de proposer un mode plus intrusif (toujours en rappelant que c’est contre les CGU et à risque) :
- Limites strictes côté agent (non négociables) :
- Volume très faible : ex. 10–20 connexions / jour, 20–40 likes / jour max, etc., en‑dessous des recommandations des outils spécialisés.[^3][^4]
- Rampe progressive : démarrer avec quelques actions/jour, augmenter lentement si les taux d’acceptation / absence d’alertes sont bons.[^3]
- Comportement human‑like appliqué :
- Randomiser les délais entre actions (plage large, 45–90 s entre actions critiques).[^4][^3]
- Répartir les actions sur les heures de travail typiques de l’utilisateur (profilable dans les settings), pas de « blast » concentré.[^4][^3]
- Mixer actions « utiles » et bruit : vues de profil, visites de feed, check notifications, etc., pas seulement des invitations.[^13][^4]
- Qualité du contenu :
- Génération de messages ultra personnalisés (référence poste récent, détail du profil, etc.), en ligne avec les bonnes pratiques d’outreach.[^14][^15][^3]
- Variantes multiples de templates pour éviter l’uniformité (au moins 5–7 variations par séquence).[^3][^4]
- Garde‑fous :
- Stop rules : si une alerte LinkedIn apparaît ou si les metrics (acceptation / réponses) chutent sous un seuil, pause auto.[^4][^3]
- Jamais de conversation full auto : dès qu’un prospect répond, passage en mode manuel.[^16][^3]
- Écran de configuration
- Modes :
Assistif (recommandé)/Automation (risqué). - Limites quotidiennes configurables par l’utilisateur (avec valeurs max sûres prédéfinies).
- Plages horaires d’activité autorisée.
- Modes :
- Journal d’activité
- Log détaillé des actions effectuées par l’agent (page, action, timestamp, statut).
- Filtre spécial LinkedIn pour que l’utilisateur voie exactement ce que l’agent fait sur la plateforme.
- Messages de warning
- Bannières dans l’UI rappelant que :
- LinkedIn peut restreindre / bannir le compte en cas de suspicion d’automation.[^1][^12]
- Tu ne garantis pas l’absence de risque.
- Le mode assistif reste la voie la plus prudente.
- Bannières dans l’UI rappelant que :
- Tests techniques
- Tests unitaires des tools (fonctions DOM,
tabs,scripting). - Tests d’intégration : flow complet UI → worker → tool → LLM → retour UI.
- Tests du cycle de vie MV3 : redémarrage du worker, reprise de tâche.
- Tests unitaires des tools (fonctions DOM,
- Tests comportementaux
- Scénarios multi‑étapes : navigation sur un site, lecture, clics, etc.
- Sur LinkedIn, tester uniquement avec comptes de test en mode assistif ; surveiller toute alerte.
- Hardening
- Ajout de garde‑fous supplémentaires (blacklist de domaines, impossibilité d’exécuter certains tools sur
linkedin.comsi tu veux un mode 100% safe). - Debrief sur le comportement observé et ajustement des délais, de la variété et des limites.
- Ajout de garde‑fous supplémentaires (blacklist de domaines, impossibilité d’exécuter certains tools sur
- Documentation développeur
- Schémas d’architecture (UI / worker / tools / backend).
- Spécification du protocole de tools.
- Guide d’extension MV3 (permissions, limitations, bonnes pratiques).
- Documentation utilisateur
- Tutoriel d’installation et de configuration.
- Explication claire des modes (assistif vs automation) et de leurs implications.
- Section dédiée (LinkedIn) qui :
- Explique les règles de la plateforme.[^2][^1]
- Donne les recommandations de volume, lent ramp‑up et human‑like (d’après les bonnes pratiques publiques).[^3][^4]
- Rappelle que la responsabilité d’usage final revient à l’utilisateur.