FLUX.1 Kontext Max come strumento personalizzato per Discourse AI

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![${params.prompt}](${image.short_url})`;
  
      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.

  1. 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)
});
  1. 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);
  1. Forzare il rendering su un post per evitare congetture e risparmiare token:
chain.setCustomRaw(raw);
  1. L’API prevede il polling; Discourse AI fornisce un primitivo sleep per 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!

4 Mi Piace