Installation

Une seule commande. Aucune clé API. Aucun compte. Python 3.10+ requis.

terminal
pip install candy-ai

Fonctionne sur Windows, macOS et Linux. Candy se connecte automatiquement à l'API Cédric7-Thinking — aucune configuration requise.


Premier appel

Un import, une ligne.

hello.py
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.


50 personnalités spécialisées

Chaque personnalité est optimisée pour son domaine. Importe celle dont tu as besoin.

personnalités.py
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.


Système de profils

Les profils te permettent de contrôler la langue, le style, le ton, la longueur et bien plus.

profils.py
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ètreTypeValeurs
langstrFR, EN, ES, DE, IT, PT, JA, ZH, AR, RU...
stylestrdetailed, concise, technical, casual, bullet, markdown
tonestrfriendly, professional, strict, encouraging, empathetic, dramatic
expertisestrbeginner, intermediate, expert
max_tokensintnombre de tokens max dans la réponse
temperaturefloat0.0 (précis) → 2.0 (très créatif)
contextstrinstruction système ajoutée à chaque appel
output_formatstrmarkdown, 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().


Presets

14 profils prêts à l'emploi pour les cas d'usage courants.

presets.py
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
PresetLangueStyleTokens
french_beginnerFRdetailed · encouragingdefault
french_expertFRconcise · strict · expertdefault
english_beginnerENdetailed · encouragingdefault
english_expertENtechnical · strict · expertdefault
coderENmarkdown · expert3000
academicENmarkdown · expert2000
creativeENcasual · temp=1.11500
teacherENdetailed · encouraging2000
quickENconcise120
journalistENmarkdown2000
storytellerENcasual · temp=1.24096
analystENbullet · expert2000
coachENdetailed · encouraging1500
debugENmarkdown · expert3000

Streaming

Réponses token par token, comme ChatGPT. Idéal pour les apps web et les interfaces terminal.

streaming.py
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)

Batch

Plusieurs prompts en un seul appel. Idéal pour traiter des listes de textes ou de questions.

batch.py
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("---")

Conversations multi-tours

Sessions avec mémoire du contexte. Sauvegarde JSON. Rechargement possible.

conversation.py
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 web

candy s'intègre dans Flask, FastAPI et Django en quelques lignes.

Flask — API JSON + streaming SSE

app.py
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

main.py
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 & 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

PowerShell — à lancer une seule fois
# 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

Alternative — fonctionne sans modifier le PATH
# 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

bash / zsh — à ajouter dans ~/.bashrc ou ~/.zshrc
# 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

terminal
# 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.

mon_script.cdy
from candy import cfg, Coding

cfg.default.lang  = "FR"
cfg.default.style = "concise"

print(Coding.ask("C'est quoi un générateur Python ?"))
terminal
candy -- mon_script.cdy
# ou si candy n'est pas dans le PATH :
python -m candy.cli -- mon_script.cdy

Helper — génération de code

Le Helper génère du code candy complet à partir d'une description ou d'un template.

helper.py
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.


Candy — One-liner universel

Une seule interface pour tout. Candy détecte automatiquement la meilleure personnalité selon ton prompt.

candy_universal.py
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)

Multi-agents

Orchestre plusieurs personnalités en séquence. Chaque étape reçoit l'output de la précédente.

agents.py
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"])

Mémoire persistante

Sessions nommées sauvegardées dans ~/.candy/sessions/. Auto-versioning inclus.

memory.py
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")

Validation & JSON

Garantit le format des réponses. Régénère automatiquement si non conforme.

validation.py
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"])

candy.utils — 20 fonctions

Importables directement depuis candy. Pas besoin de profil ni de configuration.

utils.py
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"])

ImageGen — Génération d'images

Génère des images via le tunnel Cedric7-Thinking. Styles variés, variations, descriptions visuelles, batch.

imagegen.py
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

Toutes les méthodes

MéthodeRetourDescription
.ask(prompt)strAppel simple, retourne la réponse complète
.use("profil")selfAttache un profil nommé à l'appel
.stream(prompt)generatorItère les tokens un par un
.stream_print(prompt)NoneAffiche les tokens directement dans le terminal
.batch(liste)list[str]Envoie plusieurs prompts en un appel
.chat(profile)SessionCrée une session multi-tours
session.say(msg)strEnvoie un message dans la session
session.save(path)NoneSauvegarde la session en JSON
session.load(path)NoneCharge une session depuis JSON
session.show_history()NoneAffiche l'historique de la conversation
session.clear()NoneRemet la session à zéro
cfg.A.reset()NoneRemet le profil A aux valeurs par défaut
ping()boolVérifie que l'API est accessible
is_online()boolAlias de ping()
Copié !