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`;
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.
- 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)
});
- 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);
- Forçando a renderização em uma postagem para evitar suposições e economizar tokens:
chain.setCustomRaw(raw);
- A API envolve polling; Discourse AI fornece um primitivo
sleeppara 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!

