✦ Team Academy
Documentation complète candy-ai
Guide exhaustif de la librairie Python VibeCode — de l'installation aux patterns avancés. Maîtrisez les 90 personnalités IA, le streaming, le batch et l'API Team.
90
Personnalités
11
Chapitres
v18
Version
∞
Générations
Chapitre 01
Installation
candy-ai s'installe en une seule commande. Python 3.8+ requis. Aucune clé API à gérer — tout passe par votre compte VibeCode.
1
Installer via pip
Compatible macOS, Linux, Windows. L'option [full] ajoute les dépendances streaming et images.
terminal
# Installation standard $ pip install candy-ai # Avec streaming + images (recommandé Team) $ pip install candy-ai[full] # Vérifier l'installation $ python -c "import candy; print(candy.__version__)" # → 18.0.0
2
Authentification
Connectez votre compte VibeCode une seule fois. Le token est stocké dans ~/.candy/credentials.json.
terminal
$ candy login # → Ouvre le navigateur pour auth OAuth # → Token sauvegardé localement # Ou avec votre clé Team directement $ candy login --key vc_team_xxxxxxxxxxxxxxxx # Vérifier le statut $ candy whoami # → alice@acme.com · Plan: Team · Générations: ∞
Plan Team auto-détecté
Après
candy login, le plan Team est détecté automatiquement et déverrouille les générations illimitées, l'accès images Picasso, et les fonctionnalités multi-membres.Chapitre 02
Premiers pas
De zéro à votre première génération en moins de 30 secondes.
hello_candy.py
from candy import Coding # Une ligne — c'est tout print(Coding.ask("Explique les décorateurs Python en 3 points"))
avec_profil.py
from candy import Coding, Writing, Math, cfg # Configurer un profil nommé cfg.A.lang = "FR" # langue de réponse cfg.A.style = "detailed" # detailed | concise | bullet cfg.A.tokens = 2000 # max tokens cfg.A.temp = 0.7 # 0.0 précis → 1.0 créatif # Utiliser le profil A avec Coding rep = Coding.use("A").ask("Crée une fonction de tri rapide en Python") print(rep) # Changer de personnalité, garder le profil rep2 = Writing.use("A").ask("Rédige une intro de blog sur l'IA") print(rep2)
Bonne pratique
Définissez vos profils
cfg une fois en haut du fichier ou dans un module config.py dédié. Vous pouvez créer autant de profils que voulu : cfg.rapide, cfg.précis, cfg.créatif…Chapitre 03
Profils
cfgUn profil = un ensemble de paramètres nommé et réutilisable à volonté.
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
| lang | str | "FR" | Langue de réponse. FR, EN, ES, DE, IT, PT, ZH, AR… |
| style | str | "detailed" | detailed | concise | bullet | academic | casual |
| tokens | int | 1500 | Nombre maximum de tokens dans la réponse. |
| temp | float | 0.7 | Température : 0.0 (déterministe) → 1.0 (très créatif). |
| tone | str | "neutral" | neutral | formal | friendly | expert | teacher |
| context | str | None | Contexte système injecté avant chaque question. |
| format | str | "text" | text | markdown | json | html |
| retry | int | 3 | Tentatives automatiques en cas d'erreur réseau. |
| timeout | int | 30 | Timeout en secondes par requête. |
profiles_example.py
from candy import cfg, Coding, Writing # Profil "rapide" — réponses courtes et précises cfg.rapide.lang = "FR" cfg.rapide.style = "concise" cfg.rapide.tokens = 500 cfg.rapide.temp = 0.3 # Profil "rédac" — journalistique, markdown cfg.rédac.lang = "FR" cfg.rédac.style = "detailed" cfg.rédac.tone = "friendly" cfg.rédac.format = "markdown" cfg.rédac.tokens = 3000 cfg.rédac.temp = 0.85 # Profil "data" — JSON structuré, température basse cfg.data.format = "json" cfg.data.temp = 0.1 cfg.data.tokens = 2000 cfg.data.context = "Réponds uniquement en JSON valide, sans texte autour." # Usage print(Coding.use("rapide").ask("Différence list vs tuple Python ?")) print(Writing.use("rédac").ask("Article sur le réchauffement climatique"))
Chapitre 04
Méthodes disponibles
Chaque personnalité expose les mêmes méthodes. Certaines sont réservées Pro et Team.
.ask()
ask(question: str) → str
Génération classique. Retourne la réponse complète.
Free.stream()
stream(question: str) → Generator
Générateur token par token. Parfait pour l'affichage temps réel.
Pro+.stream_print()
stream_print(question: str) → None
Raccourci : stream avec affichage automatique dans le terminal.
Pro+.chat()
chat() → ChatSession
Session de conversation avec mémoire du contexte.
Free.batch()
batch(questions: list) → list[str]
Plusieurs questions en parallèle. Ordre garanti.
Pro+.imagine()
imagine(prompt: str) → Image
Génération d'image via Cédric8-Picasso.
Pro+.use()
use(profile: str) → Instance
Attache un profil
Freecfg. Retourne une instance chaînable..async_ask()
async_ask(q: str) → Awaitable[str]
Version async. Compatible asyncio, FastAPI, Django ASGI.
TeamChatSession — méthodes
chat_session.py
from candy import Coding session = Coding.chat() rep = session.send("Qu'est-ce qu'une closure en JavaScript ?") rep2 = session.send("Donne-moi 3 exemples concrets") # contexte conservé session.history() # liste [{role, content}] session.inject("contexte") # injecter un message système session.save("f.json") # exporter la session session.load("f.json") # restaurer une session session.reset() # remettre à zéro le contexte print(session.tokens_used) # {"input": 342, "output": 891}
Chapitre 05
Les 90 personnalités
Chaque personnalité est fine-tunée pour son domaine. Importez seulement celles dont vous avez besoin.
| Import | Personnalité | Spécialité |
|---|---|---|
| Coding | Dev généraliste | Python, JS, TS, Go, Rust, debugging, refactoring |
| Frontend | Frontend dev | React, Vue, CSS, animations, accessibilité, UX |
| Backend | Backend dev | APIs REST/GraphQL, bases de données, auth, microservices |
| DevOps | Ingénieur DevOps | Docker, K8s, CI/CD, Terraform, monitoring |
| Security | Expert sécurité | Pentest, OWASP, chiffrement, audit de code |
| DataSci | Data scientist | Pandas, scikit-learn, visualisation, feature engineering |
| MLEngineer | ML Engineer | PyTorch, TensorFlow, déploiement de modèles, MLOps |
| DBA | DBA | SQL, PostgreSQL, indexation, optimisation de requêtes |
| Mobile | Dev mobile | React Native, Flutter, Swift, Kotlin |
| SysAdmin | Sysadmin | Linux, bash, réseau, serveurs, backup, monitoring |
| Import | Personnalité | Spécialité |
|---|---|---|
| Writing | Rédacteur | Articles, blogs, storytelling, copywriting |
| Poet | Poète | Poésie, vers libre, haïku, sonnets |
| Novelist | Romancier | Fiction, dialogues, arcs narratifs, worldbuilding |
| Screenwriter | Scénariste | Scripts, scènes, format Hollywood, série TV |
| UXWriter | UX Writer | Microcopy, onboarding, messages d'erreur, UI text |
| SEO | Expert SEO | Optimisation, mots-clés, structure, meta descriptions |
| SocialMedia | Social Media | Captions, threads Twitter, LinkedIn, TikTok hooks |
| Translator | Traducteur | 30+ langues, nuances culturelles, terminologie |
| Import | Personnalité | Spécialité |
|---|---|---|
| Math | Mathématicien | Algèbre, analyse, topologie, démonstrations formelles |
| Physics | Physicien | Mécanique, quantique, relativité, astrophysique |
| Chemistry | Chimiste | Organique, inorganique, réactions, nomenclature IUPAC |
| Biology | Biologiste | Génétique, biochimie, biologie cellulaire, écologie |
| Medicine | Médecin | Anatomie, pathologies, traitements, pharmacologie |
| Stats | Statisticien | Tests d'hypothèse, distributions, régression, bayésien |
| Neuroscience | Neuroscientifique | Cerveau, cognition, comportement, neurotransmetteurs |
| Climate | Climatologue | Réchauffement, modèles climatiques, énergie renouvelable |
| Import | Personnalité | Spécialité |
|---|---|---|
| Marketing | Marketer | Stratégie, growth hacking, acquisition, retention |
| Finance | Analyste financier | Valorisation, P&L, investissement, modélisation |
| Law | Juriste | Contrats, droit des affaires, propriété intellectuelle |
| HR | DRH | Recrutement, onboarding, gestion d'équipe |
| Strategy | Consultant strat | Business plan, SWOT, marché, Go-to-market |
| ProductManager | Product Manager | Roadmap, user stories, priorisation, OKRs |
| Sales | Commercial | Prospection, closing, objections, CRM |
| Accountant | Comptable | Bilan, TVA, charges, fiscalité française |
| Import | Personnalité | Spécialité |
|---|---|---|
| Teacher | Enseignant | Pédagogie, cours adaptés, exercices, corrections |
| Coach | Coach | Développement personnel, motivation, objectifs SMART |
| Philosopher | Philosophe | Éthique, épistémologie, argumentation, pensée critique |
| Historian | Historien | Chronologie, contexte, causes et conséquences |
| Chef | Chef cuisinier | Recettes, techniques, accords mets-vins, nutrition |
| Psychologist | Psychologue | Comportement, biais cognitifs, thérapies, émotions |
| Architect | Architecte | Urbanisme, conception, matériaux, normes |
| Journalist | Journaliste | Investigation, interviews, angles, fact-checking |
Liste complète
Faites
candy.list_personalities() pour afficher les 90 personnalités. Toutes suivent la même interface — interchangeables à la volée sans changer votre code.Chapitre 06
Streaming
Recevez les réponses token par token pour une expérience temps réel. Disponible Pro et Team.
streaming.py
from candy import Writing, cfg import sys cfg.A.lang = "FR"; cfg.A.tokens = 3000 # stream_print() — le plus simple Writing.use("A").stream_print("Écris un article sur les trous noirs") # stream() — contrôle total for token in Writing.use("A").stream("Raconte une histoire courte"): sys.stdout.write(token) sys.stdout.flush() # Streaming dans FastAPI from fastapi import FastAPI from fastapi.responses import StreamingResponse from candy import Coding app = FastAPI() @app.get("/generate") async def generate(q: str): return StreamingResponse( Coding.stream(q), media_type="text/event-stream" )
Protocole SSE
Le streaming utilise Server-Sent Events. Chaque token arrive comme
data: {"{token}"}\n\n. Côté browser, utilisez l'API native EventSource.Chapitre 07
Conversations avec mémoire
ChatSession maintient le contexte entre les messages. Idéal pour assistants et workflows multi-tours.conversation.py
from candy import Teacher, cfg cfg.cours.lang = "FR" cfg.cours.tone = "friendly" session = Teacher.use("cours").chat() print(session.send("Je veux apprendre les probabilités")) # → "Super ! Commençons par les bases..." print(session.send("C'est quoi une loi normale ?")) # → "Comme on l'a vu, les probabilités..." (contexte conservé) print(session.send("Donne-moi un exercice")) # Injecter un contexte additionnel session.inject("L'utilisateur est un lycéen de terminale.") # Statistiques print(session.tokens_used) # {"input": 342, "output": 891} # Sauvegarder pour reprendre plus tard session.save("cours_probas.json")
Fenêtre de contexte
La fenêtre est de 128 000 tokens. Au-delà, candy-ai applique automatiquement une stratégie de sliding window — les anciens messages sont résumés pour garder le fil sans perdre de contexte.
Chapitre 08
Traitement en batch
Envoyez des dizaines de questions en parallèle. Idéal pour les pipelines de contenu, traitements de données, et automatisations.
batch.py
from candy import Writing, cfg import asyncio cfg.B.lang = "FR"; cfg.B.style = "concise" produits = [ "Casque Sony WH-1000XM5", "MacBook Pro M3", "Écran LG UltraWide 34 pouces", "Clavier mécanique Keychron K2", ] questions = [f"Description produit pour : {p}" for p in produits] # Batch synchrone (5 en parallèle par défaut) descriptions = Writing.use("B").batch(questions) # Concurrency custom descriptions = Writing.use("B").batch(questions, concurrency=10) # Batch async (Team) async def run(): return await Writing.use("B").async_batch(questions) résultats = asyncio.run(run()) for prod, desc in zip(produits, résultats): print(f"\n--- {prod} ---\n{desc}")
Rate limiting
Plan Team : 50 requêtes simultanées max. candy-ai gère automatiquement la file d'attente et les erreurs 429 — pas besoin de gérer cela côté application.
Chapitre 09
Génération d'images
Cédric8-Picasso est le modèle de génération d'images VibeCode. Accessible via
from candy import Picasso.images.py
from candy import Picasso # Génération simple img = Picasso.imagine("Un chat astronaute sur la lune, style aquarelle") img.save("chat_lune.png") img.show() # ouvre dans le viewer système # Avec paramètres complets img = Picasso.imagine( prompt = "Ville futuriste au coucher du soleil, cyberpunk", size = "1792x1024", # 1024x1024 | 1792x1024 | 1024x1792 quality = "hd", # standard | hd style = "vivid", # vivid | natural n = 3 # générer 3 variantes ) # Accéder aux variantes for i, image in enumerate(img): image.save(f"ville_{i}.png") print(img[0].url) # URL directe (expire après 1h) b64 = img[0].to_base64() # Encoder en base64 # Variation d'une image existante variante = Picasso.variate("mon_image.png", n=2) # Inpainting — éditer une zone masquée edité = Picasso.edit( image = "portrait.png", mask = "masque.png", # zone blanche = à remplacer prompt = "Remplace le fond par une forêt enchantée" )
| Format | Dimensions | Usage recommandé |
|---|---|---|
| carré | 1024 × 1024 | Réseaux sociaux, avatars, icônes produit |
| paysage | 1792 × 1024 | Bannières, headers, covers LinkedIn/Twitter |
| portrait | 1024 × 1792 | Stories Instagram, affiches, mobile-first |
Chapitre 10 · Team exclusif
API Team & gestion des clés
Gérez votre espace partagé, les membres, les quotas individuels et les sous-clés d'accès programmatiquement.
Fonctionnalité Team uniquement
Les clés d'équipe permettent à tous vos membres d'utiliser candy-ai avec un quota partagé Team, sans compte individuel requis.
team_setup.py
from candy import Team, Coding # Init avec clé (ou via env VIBECODE_TEAM_KEY) Team.init(key="vc_team_xxxxxxxxxxxxxxxx") # Stats d'utilisation de l'équipe stats = Team.usage() # → {"total": 12430, "this_month": 3210, # "members": {"alice": 1200, "bob": 890}} # Lister les membres members = Team.members() # Quota mensuel par membre Team.set_limit(user="alice@acme.com", monthly_limit=500) # Générer une sous-clé (expire en 30j) sub_key = Team.create_key(user="bob@acme.com", expires_days=30) print(sub_key) # → "vc_sub_xxxxxxxxxxxxxxxx" # Révoquer une sous-clé Team.revoke_key(sub_key)
Intégration CI/CD (GitHub Actions)
.github/workflows/generate.yml
name: Generate docs with candy-ai
on: [push]
jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: pip install candy-ai[full]
- run: python scripts/generate_docs.py
env:
VIBECODE_TEAM_KEY: ${{ secrets.VIBECODE_TEAM_KEY }}
Chapitre 11
Cheat Sheet
Toutes les commandes essentielles en un coup d'œil.
Imports
from candy import Coding, cfg
from candy import Writing, Math
from candy import Team, Picasso
from candy import * # tout
Profil cfg
cfg.A.lang = "FR"
cfg.A.style = "concise"
cfg.A.tokens = 1000
cfg.A.temp = 0.7
cfg.A.format = "markdown"
Générations
Coding.ask("...")
Coding.use("A").ask("...")
Coding.stream_print("...")
Coding.batch(["q1","q2"])
Chat / session
s = Coding.chat()
s.send("question")
s.inject("contexte")
s.history() / s.reset()
s.save("f.json")
Images Picasso
img = Picasso.imagine("...")
img.save("f.png") / img.show()
Picasso.variate("img.png")
Picasso.edit(img, mask, "...")
API Team
Team.init("vc_team_xxx")
Team.usage() / Team.members()
Team.create_key(user="...")
Team.revoke_key(key)
Styles
"detailed" # long & complet
"concise" # court & direct
"bullet" # liste à puces
"academic" # formel & sourcé
"casual" # décontracté
Formats de sortie
"text" # texte brut
"markdown" # MD avec titres
"json" # JSON valide
"html" # HTML structuré
Vous maîtrisez candy-ai
Cette documentation couvre 100% de l'API. Pour des exemples de projets complets (chatbot, pipeline de contenu, API en production), consultez les Exemples dans votre dashboard. Des questions ? Le support Team répond en moins de 24h.