La settimana scorsa, Flux ha rilasciato un modello molto impressionante chiamato FLUX.1 Kontext.
Blog di Annuncio di Black Forest Labs
È particolarmente interessante perché è leggermente più economico dei modelli OpenAI, disponibili tramite il designer persona, e ha risultati eccellenti.
In Azione
In questo post, volevo condividere come puoi aggiungere lo strumento per farlo e illustrare alcune funzionalità avanzate in Discourse AI.
Lo strumento per fare il lavoro
Per definire lo strumento, dovrai registrarti su \u003chttps://bfl.ai\u003e, generare una chiave API e acquistare dei crediti.
Con questo impostato:
Definisci un nuovo strumento personalizzato in /admin/plugins/discourse-ai/ai-tools
Descrizione
\u003e Creatore e editor di immagini avanzato - in grado di modificare gli upload di Discourse indicati come upload://…
Riepilogo
\u003e Modifica o crea immagini utilizzando FLUX Kontext
Parametri
- prompt: string: Descrivi cosa vuoi generare. 2-3 frasi, sii dettagliato per ottenere i migliori risultati (richiesto)
- input_image: string: un upload://… che desideri modificare
- seed: number: Il seed casuale. Se desideri mantenere gli output nello stesso stile, mantieni lo stesso numero
- aspect_ratio: string: Il rapporto d’aspetto dell’immagine, deve essere compreso tra 21:9 e 9:21. Per immagini quadrate, usa 1:1. Il valore predefinito è 16:9
Script
const apiKey = YOUR_API_KEY;
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"
};
// Aggiungi input_image se fornito
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 richiesta API è fallita con stato ${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: "Immagine generata con successo",
seed: seed,
aspect_ratio: params.aspect_ratio || "16:9",
output_image: image?.short_url
};
}
function details() {
return "Immagine generata utilizzando il modello Flux Kontext Max di Segmind";
}
Commento
Questo mostra alcune delle funzionalità degli strumenti più avanzate, incluse diverse aggiunte in \u003chttps://github.com/discourse/discourse-ai/pull/1391\u003e, che saranno necessarie prima che questo funzioni.
- Effettuare richieste POST con
http.post— gli strumenti personalizzati possono inviare richieste a qualsiasi URL!
const result = http.post(apiUrl, {
headers: {
"x-key": apiKey,
"Content-Type": "application/json"
},
body: JSON.stringify(body)
});
- Supporto per payload codificati in base64 nell’API
Ottieni l’upload codificato in Base64:
body.input_image = upload.getBase64(params.input_image);
Ottieni il risultato di una richiesta HTTP in Base64:
const base64 = http.get(imageUrl, { base64Encode: true }).body;
Crea un upload da una stringa base64:
image = upload.create("generated_image.jpg", base64);
- Forzare il rendering su un post per evitare congetture e risparmiare token:
chain.setCustomRaw(raw);
- L’API prevede il polling; Discourse AI fornisce un primitivo
sleepper attendere tra i sondaggi:
while (pollResult.status === "Pending" && checks < 30) {
sleep(1000);
pollResult = JSON.parse(http.get(pollingUrl).body);
checks++;
}
Spero che questo ti sia d’aiuto! Sentiti libero di fare domande o condividere idee!

