La semaine dernière, Flux a publié un modèle très impressionnant appelé FLUX.1 Kontext.
Blog d’annonce par Black Forest Labs
Il est particulièrement intéressant car il est légèrement moins cher que les modèles OpenAI, qui sont disponibles via le persona de designer, et il donne d’excellents résultats.
En action
Dans ce post, je voulais partager comment vous pouvez ajouter l’outil pour le faire, et parcourir certaines fonctionnalités avancées de Discourse AI.
L’outil pour faire le travail
Pour définir l’outil, vous devrez vous inscrire sur \u003chttps://bfl.ai\u003e, générer une clé API et acheter des crédits.
Avec cela en place :
Définissez un nouvel outil personnalisé dans /admin/plugins/discourse-ai/ai-tools
Description
\u003e Créateur et éditeur d’images avancé - capable d’éditer les téléchargements Discourse désignés par upload://…
Résumé
\u003e Édite ou crée des images en utilisant FLUX Kontext
Paramètres
- prompt: string: Décrivez ce que vous voulez générer. 2-3 phrases, soyez détaillé pour de meilleurs résultats (requis)
- input_image: string: un upload://… que vous souhaitez modifier
- seed: number: La graine aléatoire. Si vous souhaitez conserver les sorties dans le même style, gardez le même nombre
- aspect_ratio: string: Le rapport d’aspect de l’image, doit être compris entre 21:9 et 9:21. Pour les images carrées, utilisez 1:1. Par défaut 16:9
Script
const apiKey = VOTRE_CLE_API;
const apiUrl = "https://api.us1.bfl.ai/v1/flux-kontext-max";
function invoke(params) {
let seed = parseInt(params.seed);
if (!(seed > 0)) {
seed = Math.floor(Math.random() * 1000000) + 1;
}
const body = {
prompt: params.prompt,
seed: seed,
aspect_ratio: params.aspect_ratio || "16:9"
};
// Ajouter input_image si fourni
if (params.input_image) {
body.input_image = upload.getBase64(params.input_image);
}
const result = http.post(apiUrl, {
headers: {
"x-key": apiKey,
"Content-Type": "application/json"
},
body: JSON.stringify(body)
});
if (result.status !== 200) {
return { error: `La requête API a échoué avec le statut ${result.status}`, body: body };
}
const parsed = JSON.parse(result.body);
const pollingUrl = parsed.polling_url;
let pollResult = JSON.parse(http.get(pollingUrl).body);
let checks = 0;
while (pollResult.status === "Pending" && checks < 30) {
sleep(1000);
pollResult = JSON.parse(http.get(pollingUrl).body);
checks++;
}
let image;
if (pollResult.status === "Ready") {
const imageUrl = pollResult.result.sample;
const base64 = http.get(imageUrl, { base64Encode: true }).body;
image = upload.create("generated_image.jpg", base64);
const raw = `\n\n`;
chain.setCustomRaw(raw);
}
return {
result: "Image générée avec succès",
seed: seed,
aspect_ratio: params.aspect_ratio || "16:9",
output_image: image?.short_url
};
}
function details() {
return "Image générée en utilisant le modèle Flux Kontext Max de Segmind";
}
Commentaires
Cela présente certaines des fonctionnalités d’outils les plus avancées, y compris plusieurs ajoutées dans \u003chttps://github.com/discourse/discourse-ai/pull/1391\u003e, qui seront nécessaires pour que cela fonctionne.
- Effectuer des requêtes POST avec
http.post— les outils personnalisés peuvent poster à n’importe quelle URL !
const result = http.post(apiUrl, {
headers: {
"x-key": apiKey,
"Content-Type": "application/json"
},
body: JSON.stringify(body)
});
- Prise en charge des charges utiles encodées en base64 dans l’API
Obtenir le téléchargement encodé en Base64 :
body.input_image = upload.getBase64(params.input_image);
Obtenir le résultat d’une requête HTTP en Base64 :
const base64 = http.get(imageUrl, { base64Encode: true }).body;
Créer un téléchargement à partir d’une chaîne base64 :
image = upload.create("generated_image.jpg", base64);
- Forcer le rendu sur un post pour éviter les suppositions et économiser des jetons :
chain.setCustomRaw(raw);
- L’API implique le polling ; Discourse AI fournit une primitive
sleeppour attendre entre les sondages :
while (pollResult.status === "Pending" && checks < 30) {
sleep(1000);
pollResult = JSON.parse(http.get(pollingUrl).body);
checks++;
}
J’espère que cela vous sera utile ! N’hésitez pas à poser des questions ou à partager des idées !

