Démarrage
Installation
Une seule commande. Aucune clé API. Aucun compte. Python 3.10+ requis.
pip install candy-ai
Fonctionne sur Windows, macOS et Linux. Candy se connecte automatiquement à l'API Cédric7-Thinking — aucune configuration requise.
Démarrage
Premier appel
Un import, une ligne.
from candy import Coding print(Coding.ask("Écris une fonction Python qui inverse une chaîne"))
Pas de profil, pas de configuration — candy utilise le profil default automatiquement.
Personnalités
50 personnalités spécialisées
Chaque personnalité est optimisée pour son domaine. Importe celle dont tu as besoin.
from candy import Math, Writing, Medicine, Law, Finance print(Math.ask("Quelle est la dérivée de x³ + 2x ?")) print(Writing.ask("Écris un email professionnel pour décliner une réunion")) print(Medicine.ask("Quels sont les symptômes du diabète de type 2 ?")) print(Law.ask("Différence entre droit civil et droit pénal ?")) print(Finance.ask("Explique les intérêts composés avec un exemple"))
La liste complète des 50 personnalités est disponible sur la page d'accueil.
Configuration
Système de profils
Les profils te permettent de contrôler la langue, le style, le ton, la longueur et bien plus.
from candy import cfg, Coding, Math cfg.A.lang = "FR" cfg.A.style = "detailed" cfg.A.tone = "friendly" cfg.A.expertise = "beginner" cfg.A.max_tokens = 2000 cfg.A.temperature = 0.7 cfg.A.context = "Réponds toujours avec des exemples concrets." print(Coding.use("A").ask("Explique la récursivité")) print(Math.use("A").ask("Résous ∫x²sin(x)dx"))
Paramètres disponibles
| Paramètre | Type | Valeurs |
|---|---|---|
| lang | str | FR, EN, ES, DE, IT, PT, JA, ZH, AR, RU... |
| style | str | detailed, concise, technical, casual, bullet, markdown |
| tone | str | friendly, professional, strict, encouraging, empathetic, dramatic |
| expertise | str | beginner, intermediate, expert |
| max_tokens | int | nombre de tokens max dans la réponse |
| temperature | float | 0.0 (précis) → 2.0 (très créatif) |
| context | str | instruction système ajoutée à chaque appel |
| output_format | str | markdown, plain, json |
Tu peux créer autant de profils nommés que tu veux : cfg.A, cfg.B, cfg.monprofil, etc. Le profil default est utilisé quand tu n'appelles pas .use().
Configuration
Presets
14 profils prêts à l'emploi pour les cas d'usage courants.
cfg.A = cfg.preset("coder") # expert, markdown, 3000 tokens cfg.B = cfg.preset("french_beginner") # FR, détaillé, encourageant cfg.C = cfg.preset("creative") # casual, temperature=1.1 cfg.D = cfg.preset("quick") # concis, 120 tokens max
| Preset | Langue | Style | Tokens |
|---|---|---|---|
| french_beginner | FR | detailed · encouraging | default |
| french_expert | FR | concise · strict · expert | default |
| english_beginner | EN | detailed · encouraging | default |
| english_expert | EN | technical · strict · expert | default |
| coder | EN | markdown · expert | 3000 |
| academic | EN | markdown · expert | 2000 |
| creative | EN | casual · temp=1.1 | 1500 |
| teacher | EN | detailed · encouraging | 2000 |
| quick | EN | concise | 120 |
| journalist | EN | markdown | 2000 |
| storyteller | EN | casual · temp=1.2 | 4096 |
| analyst | EN | bullet · expert | 2000 |
| coach | EN | detailed · encouraging | 1500 |
| debug | EN | markdown · expert | 3000 |
Fonctionnalités
Streaming
Réponses token par token, comme ChatGPT. Idéal pour les apps web et les interfaces terminal.
from candy import Writing # Méthode 1 — stream_print() affiche directement Writing.stream_print("Raconte une histoire courte") # Méthode 2 — itérer token par token for token in Writing.stream("Raconte une histoire courte"): print(token, end="", flush=True)
Fonctionnalités
Batch
Plusieurs prompts en un seul appel. Idéal pour traiter des listes de textes ou de questions.
from candy import cfg, Summarizer cfg.A.lang = "FR" cfg.A.max_tokens = 300 cfg.A.style = "concise" textes = ["Article 1...", "Article 2...", "Article 3..."] resumes = Summarizer.use("A").batch( [f"Résume en 3 points :\n{t}" for t in textes] ) for resume in resumes: print(resume) print("---")
Fonctionnalités
Conversations multi-tours
Sessions avec mémoire du contexte. Sauvegarde JSON. Rechargement possible.
from candy import cfg, Tutor cfg.s.lang = "FR" cfg.s.expertise = "beginner" cfg.s.tone = "encouraging" session = Tutor.chat(profile="s") print(session.say("Je veux apprendre Python. Par où commencer ?")) print(session.say("Explique-moi les variables")) print(session.say("Et les listes ?")) session.save("session.json") session.show_history() session.clear()
Intégration
Intégration web
candy s'intègre dans Flask, FastAPI et Django en quelques lignes.
Flask — API JSON + streaming SSE
from flask import Flask, request, jsonify, Response from candy import cfg, Full app = Flask(__name__) cfg.web.lang = "FR" @app.route("/ask", methods=["POST"]) def ask(): question = request.get_json().get("question", "") return jsonify({"answer": Full.use("web").ask(question)}) @app.route("/stream", methods=["POST"]) def stream(): question = request.get_json().get("question") def generate(): for token in Full.use("web").stream(question): yield f"data: {token}\n\n" return Response(generate(), mimetype="text/event-stream") if __name__ == "__main__": app.run(debug=True)
FastAPI
from fastapi import FastAPI from pydantic import BaseModel from candy import cfg, Full app = FastAPI() cfg.web.lang = "FR" class Query(BaseModel): question: str @app.post("/ask") def ask(query: Query): return {"answer": Full.use("web").ask(query.question)}
CLI
CLI & fichiers .cdy
candy est aussi une commande système. Tape candy helper dans ton terminal pour ouvrir la fenêtre Helper, ou candy -- script.cdy pour exécuter un script.
⚠️ Rendre la commande candy disponible partout
Après pip install candy-ai, la commande candy est installée dans le dossier Scripts de Python. Si elle n'est pas reconnue dans ton terminal, suis ces étapes selon ton système.
Windows — PowerShell
# Ajoute le dossier Scripts au PATH de façon permanente [Environment]::SetEnvironmentVariable( "PATH", $env:PATH + ";C:\Users\TON_NOM\AppData\Roaming\Python\Python310\Scripts", "User" ) # Ferme puis réouvre ton terminal, puis teste : candy helper
Remplace TON_NOM par ton nom d'utilisateur Windows et Python310 par ta version Python. Pour trouver le bon chemin : python -m site --user-scripts
# Si candy n'est toujours pas reconnu, utilise cette commande équivalente :
python -m candy.cli helper
python -m candy.cli -- mon_script.cdy
macOS / Linux
# Trouve le dossier bin de pip python3 -m site --user-base # Ajoute au PATH (remplace par le chemin trouvé ci-dessus) export PATH="$HOME/.local/bin:$PATH" # Recharge ton shell source ~/.bashrc # ou source ~/.zshrc # Teste candy helper
Commandes disponibles
# Ouvre la fenêtre Helper graphique candy helper # Exécute un fichier .cdy candy -- mon_script.cdy # Affiche l'aide candy
Fichiers .cdy
Un fichier .cdy est du Python candy standard avec une extension dédiée. Crée-le dans n'importe quel éditeur de texte.
from candy import cfg, Coding cfg.default.lang = "FR" cfg.default.style = "concise" print(Coding.ask("C'est quoi un générateur Python ?"))
candy -- mon_script.cdy
# ou si candy n'est pas dans le PATH :
python -m candy.cli -- mon_script.cdy
Helper
Helper — génération de code
Le Helper génère du code candy complet à partir d'une description ou d'un template.
from candy import Helper Helper.list() code = Helper.write("chatbot", lang="FR", module="Full") print(code) Helper.run("livre", sujet="Napoléon", lang="FR") Helper.run("traduction", texte="Bonjour", langues=["ES","DE","JA"])
Templates disponibles : livre, traduction, chatbot, pipeline, batch, resume, question.
Nouveautés v16
Candy — One-liner universel
Une seule interface pour tout. Candy détecte automatiquement la meilleure personnalité selon ton prompt.
from candy import Candy # Auto-détecte la personnalité selon le prompt print(Candy.ask("Explique les décorateurs Python")) # → Coding print(Candy.ask("Recette de tiramisu", lang="FR")) # → Cooking print(Candy.ask("Traduis en anglais", max_tokens=300)) # → Translator # Score qualité d'un prompt (0-100, grade A→F) score = Candy.score("fais un truc") print(score["score"]) # → 20 print(score["grade"]) # → F print(score["issues"]) # → ["Termes vagues : truc"] # Auto-optimise un prompt print(Candy.fix("fais un truc en python")) # → "Écris une fonction Python qui trie une liste par longueur." # Dry-run — simule sans appeler l'API result = Candy.dry_run("fais un truc") print(result["would_use_personality"]) # → full print(result["api_call"]) # → SKIPPED (dry-run mode)
Nouveautés v16
Multi-agents
Orchestre plusieurs personnalités en séquence. Chaque étape reçoit l'output de la précédente.
from candy import cfg, Agent, Coding, Debugger, Reviewer from candy import Philosophy, Ethics, Law cfg.dev = cfg.preset("coder") cfg.dev.lang = "FR" # Pipeline séquentiel result = Agent.run( modules=[Coding, Debugger, Reviewer], task="Écris un client REST Python", profile="dev", verbose=True ) print(result["final"]) # Débat entre personnalités cfg.phi.lang = "FR" debate = Agent.debate( [Philosophy, Ethics, Law], "L'IA doit-elle être régulée ?", profile="phi" ) print(debate["synthesis"]) # App complète : code + tests + README Agent.build_app("todo app avec login", profile="dev", output_dir="./mon_app") # Pipeline de transformations result = Agent.pipeline( "Mon texte brut...", steps=[ ("summarizer", "Résume en 2 phrases."), ("writing", "Rends plus engageant."), ("reviewer", "Corrige les erreurs."), ] ) print(result["final"])
Nouveautés v16
Mémoire persistante
Sessions nommées sauvegardées dans ~/.candy/sessions/. Auto-versioning inclus.
from candy import Memory # Créer / reprendre une session mem = Memory("mon_projet") mem.add("user", "Bonjour !") mem.add("assistant", "Bonjour, comment puis-je t'aider ?") mem.save() # Versioning nommé mem.save_version("avant-refactor") # Reprendre plus tard mem2 = Memory("mon_projet") print(mem2.history) print(mem2.as_context(last_n=5)) print(mem2.count_turns()) # Lister / supprimer print(Memory.list_sessions()) Memory.delete_session("mon_projet") # Dossier custom mem3 = Memory("session", base_dir="./mes_sessions")
Nouveautés v16
Validation & JSON
Garantit le format des réponses. Régénère automatiquement si non conforme.
from candy import cfg, Cooking, Analytic, ask_validated, ask_json cfg.p.lang = "FR" # Retry si format non respecté page = ask_validated( Cooking, "p", prompt="Recette. Format:\n- Plat:\n- Ingrédients:\n- Étapes:", required_fields=["- Plat:", "- Ingrédients:", "- Étapes:"], max_attempts=3 ) print(page) # JSON garanti valide (auto-corrigé si invalide) cfg.a.lang = "FR" result = ask_json( Analytic, "a", prompt='Analyse. JSON strict: {"ton": "", "score": 0, "mots_cles": []}\nTexte: Super produit !' ) print(result["ton"]) print(result["score"])
Utilitaires v16
candy.utils — 20 fonctions
Importables directement depuis candy. Pas besoin de profil ni de configuration.
from candy import ( detect_lang, translate, summarize, spellcheck, keywords, sentiment, generate_title, ask_about, rephrase, generate_faq, compare, codegen, explain_code, mock_data, timed_ask, cached_ask, clear_cache, optimize_prompt, extract, pipeline, full_report ) # Détection de langue print(detect_lang("Hello world")) # → EN # Traduction print(translate("Hello", to="FR")) # → Bonjour # Résumé print(summarize(long_text, words=30)) # Sentiment s = sentiment("Ce produit est fantastique !") print(s["label"], s["score"]) # → positive 0.95 # Mots-clés kws = keywords(texte, n=5, lang="FR") # Génération de code code = codegen("trier une liste par longueur", language="python") # Cache (évite les doublons) r = cached_ask("math", "C'est quoi pi ?", ttl=3600) # Pipeline de transformations result = pipeline(texte, steps=[ ("summarizer", "Résume en 2 phrases"), ("writing", "Rends plus engageant"), ], lang="FR") print(result["final"]) # Rapport complet report = full_report(article, lang="FR") print(report["summary"], report["sentiment"], report["keywords"])
Nouveautés v17 BETA
ImageGen — Génération d'images
Génère des images via le tunnel Cedric7-Thinking. Styles variés, variations, descriptions visuelles, batch.
from candy import ImageGen # Génère et sauvegarde ImageGen.create("un chat astronaute sur la lune", save="chat.png") # Avec style et taille ImageGen.create( "portrait d'un robot steampunk", style="photorealistic", size="1024x1024", save="robot.png" ) # Variation d'une image existante ImageGen.variation("original.png", strength=0.6, save="variation.png") # Description d'une image desc = ImageGen.describe("photo.jpg", lang="FR") print(desc) # Batch images = ImageGen.batch([ "forêt enchantée au lever du soleil", "ville futuriste la nuit", "portrait impressionniste" ], save_dir="./generated/") # Styles disponibles print(ImageGen.styles()) # default photorealistic anime painting sketch 3d pixel watercolor oil comic cyberpunk fantasy
Référence
Toutes les méthodes
| Méthode | Retour | Description |
|---|---|---|
| .ask(prompt) | str | Appel simple, retourne la réponse complète |
| .use("profil") | self | Attache un profil nommé à l'appel |
| .stream(prompt) | generator | Itère les tokens un par un |
| .stream_print(prompt) | None | Affiche les tokens directement dans le terminal |
| .batch(liste) | list[str] | Envoie plusieurs prompts en un appel |
| .chat(profile) | Session | Crée une session multi-tours |
| session.say(msg) | str | Envoie un message dans la session |
| session.save(path) | None | Sauvegarde la session en JSON |
| session.load(path) | None | Charge une session depuis JSON |
| session.show_history() | None | Affiche l'historique de la conversation |
| session.clear() | None | Remet la session à zéro |
| cfg.A.reset() | None | Remet le profil A aux valeurs par défaut |
| ping() | bool | Vérifie que l'API est accessible |
| is_online() | bool | Alias de ping() |