FLUX.1 Kontext Max como uma ferramenta customizada para Discourse AI

Na semana passada, a Flux lançou um modelo muito impressionante chamado FLUX.1 Kontext.

Blog de Anúncio da Black Forest Labs

É particularmente interessante porque é ligeiramente mais barato que os modelos da OpenAI, que estão disponíveis através do persona de designer, e tem resultados excelentes.

Em Ação

Nesta postagem, eu queria compartilhar como você pode adicionar a ferramenta para fazer isso e explorar alguns recursos avançados no Discourse AI.

A ferramenta para o trabalho

Para definir a ferramenta, você precisará se inscrever em https://bfl.ai, gerar uma chave de API e comprar alguns créditos.

Com isso configurado:

Defina uma nova ferramenta personalizada em /admin/plugins/discourse-ai/ai-tools

Descrição

Criador e editor avançado de imagens - capaz de editar uploads do Discourse denotados como upload://…

Resumo

Edita ou cria imagens usando FLUX Kontext

Parâmetros

  • prompt: string: Descreva o que você deseja gerar. 2-3 frases, seja detalhado para obter melhores resultados (obrigatório)
  • input_image: string: um upload://… que você deseja modificar
  • seed: number: A semente aleatória. Se você deseja manter as saídas no mesmo estilo, mantenha o número o mesmo
  • aspect_ratio: string: A proporção da imagem, deve estar entre 21:9 e 9:21. Para imagens quadradas, use 1:1. O padrão é 16:9

Script

const apiKey = SUA_CHAVE_DE_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"
  };

  // Adiciona input_image se fornecido
  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: `A solicitação da API falhou com o status ${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: "Imagem gerada com sucesso", 
    seed: seed,
    aspect_ratio: params.aspect_ratio || "16:9",
    output_image: image?.short_url
  };
}

function details() {
  return "Imagem gerada usando o modelo Flux Kontext Max da Segmind";
}

Comentário

Isso demonstra algumas das instalações de ferramentas mais avançadas, incluindo várias adicionadas em https://github.com/discourse/discourse-ai/pull/1391, que serão necessárias antes que isso funcione.

  1. Fazendo solicitações POST com http.post — ferramentas personalizadas podem postar em qualquer URL!
const result = http.post(apiUrl, {
  headers: {
    "x-key": apiKey,
    "Content-Type": "application/json"
  },
  body: JSON.stringify(body)
});
  1. Suporte para payloads codificados em base64 na API

Obtenha o upload codificado em Base64:

body.input_image = upload.getBase64(params.input_image);

Obtenha o resultado de uma solicitação HTTP em Base64:

const base64 = http.get(imageUrl, { base64Encode: true }).body;

Crie um upload a partir de uma string base64:

image = upload.create("generated_image.jpg", base64);
  1. Forçando a renderização em uma postagem para evitar suposições e economizar tokens:
chain.setCustomRaw(raw);
  1. A API envolve polling; Discourse AI fornece um primitivo sleep para esperar entre os polls:
while (pollResult.status === "Pending" && checks < 30) {
  sleep(1000);
  pollResult = JSON.parse(http.get(pollingUrl).body);
  checks++;
}

Espero que isso ajude! Sinta-se à vontade para fazer perguntas ou compartilhar ideias!

4 curtidas