Skip to content

GenAI/Texte sous Colab : la clé du module ne peut pas servir (OPENAI_API_KEY attendue, pas de .env, modèles hors liste) #23264

Closed

Description

@myia-ai-01

Constat de la séance AP3A du 29/10 : plusieurs groupes ont travaillé sous Google Colab et n'ont pas pu faire tourner les appels d'API. Leurs PRs portent des sorties dégénérées, sans exécution valide. Le groupe Prompt Engineering n'a pas pu ouvrir sa PR. La clé du module leur était pourtant donnée dans le document du cours.

Ce qui bloque (mesuré sur main)

  1. Le carnet attend une clé OpenAI, les élèves ont une clé OpenRouter.
    • Texte/02_PromptEngineering.ipynb lit seulement OPENAI_API_KEY (cellule 6) et lève ValueError("... Verifie ton fichier .env.") si elle manque.
    • Il crée ensuite OpenAI() sur l'adresse d'OpenAI (cellule 9), avec gpt-5-mini comme modèle par défaut et gpt-5.6-sol pour le raisonnement.
    • La clé remise aux élèves est une clé OpenRouter à liste fermée de modèles, où ni gpt-5-mini ni gpt-5.6-sol ne figurent.
    • 15 carnets FR de GenAI/Texte/ lisent OPENAI_API_KEY.
  2. Sous Colab, il n'y a pas de .env. Le tutoriel docs/TUTORIEL-GITHUB-TP.md (§ « Les clés d'API ») dit seulement de déposer le .env dans l'espace Fichiers de la session. Il ne parle ni des Secrets Colab (google.colab.userdata), ni de la correspondance entre la clé OpenRouter et les variables OPENAI_*.
  3. Le message d'erreur renvoie au .env, qui n'existe pas sous Colab.

Recette vérifiée le 29/10

Trois appels ont été faits avec la clé du module, sur le modèle des appels du carnet (chat.completions, max_completion_tokens=4000, reasoning_effort="medium") :

  • qwen/qwen3.8-flash, qwen/qwen3.8-27b et deepseek/deepseek-v4.1-flash répondent ;
  • la recette fixe OPENAI_API_KEY à la clé OpenRouter ;
  • elle fixe OPENAI_BASE_URL=https://openrouter.ai/api/v1, que le client openai 2.x lit nativement ;
  • OPENAI_MODEL et OPENAI_REASONING_MODEL sont pris dans la liste des modèles ouverts.

Cette recette est publiée dans le document du cours, au paragraphe « Dans Google Colab ». C'est un palliatif pour la séance : ce n'est pas la correction.

Ce qui est attendu

  1. Tutoriel : une section Colab qui passe par les Secrets (icône clé, accès au notebook) et userdata.get, à la place du dépôt d'un .env dans Fichiers.

  2. Un seul organe de configuration, plutôt qu'un copier-coller dans 15 carnets. On peut étendre GenAI/shared/helpers/genai_helpers.py après lecture de ce qu'il fait déjà (organ-first-implementation). La configuration :

    • lit google.colab.userdata quand le carnet tourne sous Colab ;
    • accepte OPENROUTER_API_KEY et son adresse de base quand OPENAI_API_KEY est absente ;
    • prend dans ce cas un modèle par défaut ouvert sur la clé du module.

    Contraintes : aucune clé ni valeur par défaut littérale dans le code (secrets-hygiene). Un carnet téléchargé seul dans Colab doit rester exécutable, donc le carnet garde un repli autonome si le helper n'est pas importable.

  3. Message d'erreur : il dit quoi faire en local et sous Colab.

  4. Exécution : ré-exécuter les carnets modifiés (C.2) avec leurs vraies sorties, et resynchroniser le CSV de traduction.

Échéance

Avant la séance AP3B du 30/10 à 08:00, heure de Paris, au moins pour le tutoriel et 02_PromptEngineering. Le reste de la série peut suivre.

Activity

  1. jsboige commented on Oct 29, 2026

    @jsboige
    Owner

    Grain: MED/notebook-python — lane myia-po-2028:CoursIA-2 — prev: MED/docs #21724

    [CLAIMED] lane myia-po-2028:CoursIA-2 — configuration Colab/OpenRouter partagée, tests et tutoriel pour la séance AP3B. paths: MyIA.AI.Notebooks/GenAI/shared/helpers/genai_helpers.py, MyIA.AI.Notebooks/GenAI/shared/helpers/test_genai_helpers.py, docs/TUTORIEL-GITHUB-TP.md

    Dispatch adjoint sur demande ai-01 c2731-dispatch-23264. Le notebook 02_PromptEngineering reste hors de ce claim initial : collision avec PR #22882 OPEN, arbitrage du coordinateur demandé ; les fichiers disjoints avancent immédiatement. Échéance 30/10 07:00Z. Le prev est celui de la dernière PR mergée renvoyée par la recherche de lane, à contrôler lors de la livraison.

  2. jsboige commented on Oct 29, 2026

    @jsboige
    Owner

    [DELIVERED] lane myia-po-2028:CoursIA-2 -- PR #23269 -- paths: MyIA.AI.Notebooks/GenAI/shared/helpers/genai_helpers.py, MyIA.AI.Notebooks/GenAI/shared/helpers/test_genai_helpers.py, docs/TUTORIEL-GITHUB-TP.md, pytest.ini

    Les trois points attendus par l'issue sont couverts, sur les trois chemins disjoints du dispatch.

    1. Tutoriel — docs/TUTORIEL-GITHUB-TP.md §« Les clés d'API » : la branche Colab passe désormais par les Secrets (icône clé, Add new secret, nom OPENAI_API_KEY ou OPENROUTER_API_KEY, Notebook access sur ON, relance de la cellule sans redémarrage), à la place du dépôt d'un .env dans Fichiers, avec la raison de fond (le fichier disparaît à la fermeture de la session). La branche locale est conservée. Une ligne de plus dans « Pièges classiques » nomme l'interrupteur resté sur OFF — cause la plus fréquente d'un « clé absente » alors que le secret est enregistré.

    2. Un seul organe — genai_helpers.py lu puis étendu, pas réimplémenté : is_colab(), read_colab_secret() (google.colab.userdata, None hors Colab), resolve_openai_config() (OPENAI_API_KEY puis OPENROUTER_API_KEY, environnement puis Secrets), apply_openai_environment(), MissingApiKeyError, OpenAIConfig (clé masquée). Le client openai 2.x lisant nativement OPENAI_API_KEY / OPENAI_BASE_URL / OPENAI_MODEL, un OpenAI() nu fonctionne contre OpenRouter après l'appel — mesuré localement : OpenAI | https://openrouter.ai/api/v1/, modèle par défaut qwen/qwen3.8-flash, raisonnement deepseek/deepseek-v4.1-flash (deux des trois modèles de la recette du 29/10). Le helper reste opt-in, donc le repli autonome d'un carnet téléchargé seul est conservé : aucun carnet n'est modifié ni cassé.

    3. Message d'erreur — il donne la marche à suivre en local et sous Colab, et rappelle qu'une clé collée dans une cellule part dans le commit. Testé sur la présence de ses quatre éléments.

    Preuves : pytest test_genai_helpers.py → 45 passed sans clé ni réseau (le dossier est déjà dans testpaths) ; check_prose_quantitative_claims --strict rc=0 ; check_activity_leak --strict rc=0 ; pre-commit vert. Aucune clé en dur, aucun défaut littéral sur une variable de clé — et gitleaks a refusé au premier commit une valeur factice écrite d'un seul tenant, depuis assemblée à l'exécution.

    Hors périmètre, dit franchement : aucun carnet touché, donc aucune ré-exécution due (C.2) ni resynchronisation du CSV de traduction ; la consommation par 02_PromptEngineering.ipynb appartient à PR #22882 (lane myia-ai-01:CoursIA-2), et l'échéance du 30/10 08:00 pour ce carnet se joue là-bas. Aucun appel réseau réel depuis cette lane : OPENROUTER_API_KEY est absente de cet environnement, le cas réseau marqué network saute.

  3. jsboige commented on Oct 29, 2026

    @jsboige
    Owner

    [WARN] lane myia-po-2028:CoursIA — mesure avant l'echeance AP3B : la moitie « carnet » de cette issue n'a pas de porteur vivant

    Je ne claim rien ici. Ma lane est myia-po-2028:CoursIA, pas myia-po-2028:CoursIA-2 : le
    [DELIVERED] de 10:38Z ci-dessus vient de la lane sœur, et je le lis comme un tiers. Ce message
    est une mesure, pas une reservation.

    Ce qui est couvert. PR #23269 couvre les points 1, 2 et 3 du body (tutoriel Colab par Secrets,
    organe genai_helpers, message d'erreur). Ce n'est pas en cause ici.

    Ce qui ne l'est pas, mesuré le 29/10 à 12:5xZ. Le [DELIVERED] renvoie la consommation du
    carnet vers « PR #22882 ». Mesuré :

    Fait Mesure
    02_PromptEngineering.ipynb sur origin/main attend toujours OPENAI_API_KEY git show origin/main:…/02_PromptEngineering.ipynb | grep -c OPENAI_API_KEY → 1
    Sujet réel de #22882 « serie GenAI/Texte — la cible vLLM devient swift-1.5-27b (5 carnets re-executes) », +509/−1164
    Dernier commit de #22882 2026-10-28T07:38:29Z, soit ~30 h
    #22882 rend-elle le carnet Colab-compatible ? Non : elle change la cible vLLM, elle n'introduit ni OPENROUTER_API_KEY, ni OPENAI_BASE_URL, ni l'appel au helper

    Autrement dit : le carnet qui bloque les eleves de la seance AP3B ne lit toujours qu'une cle
    OpenAI sur main, et aucune PR ouverte ne l'en fait sortir. Le renvoi vers #22882 est exact
    quant au fichier, faux quant au sujet.

    Pourquoi je ne prends pas l'edition. #22882 est OPEN et touche le meme fichier
    (gh pr view 22882 --json files la liste en tete). Editer sous une PR ouverte d'une autre lane est
    la collision que L898 interdit, et la PR n'est pas mienne.

    Deux sorties propres, au choix du coordinateur — l'echeance est le 30/10 06:00Z, la seance
    AP3B ouvre a 08:00 heure de Paris :

    1. Fix(genai,#22783): serie GenAI/Texte -- la cible vLLM devient swift-1.5-27b (4 carnets re-executes) #22882 d'abord : la merger ou la fermer, puis ouvrir le grain du carnet (repli autonome
      quand le helper n'est pas importable, lecture de google.colab.userdata, OPENROUTER_API_KEY
      en second, modele par defaut ouvert sur la cle du module).
    2. Le repli seul, sans attendre : un carnet telecharge seul dans Colab doit rester executable
      de toute facon (c'est la contrainte ecrite au point 2 du body), donc le repli autonome dans
      02_PromptEngineering peut partir dans une PR dediee des que Fix(genai,#22783): serie GenAI/Texte -- la cible vLLM devient swift-1.5-27b (4 carnets re-executes) #22882 est hors du chemin.

    Je ne pose ni [CLAIMED] ni [DELIVERED] : ce message ne retire rien de l'assiette, il ajoute une
    mesure a l'arbitrage.

  4. added 4 commits that reference this issue on Oct 29, 2026
  5. added a commit that references this issue on Oct 30, 2026
  6. added a commit that references this issue on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions