La semana pasada, Flux lanzó un modelo muy impresionante llamado FLUX.1 Kontext.
Blog de anuncio de Black Forest Labs
Es particularmente interesante porque es un poco más barato que los modelos de OpenAI, que están disponibles a través del persona de diseñador, y tiene excelentes resultados.
En Acción
En esta publicación, quería compartir cómo puedes agregar la herramienta para hacerlo y repasar algunas características avanzadas en Discourse AI.
La herramienta para hacer el trabajo
Para definir la herramienta, deberás registrarte en \u003chttps://bfl.ai\u003e, generar una clave API y comprar algunos créditos.
Con esto en su lugar:
Define una nueva herramienta personalizada en /admin/plugins/discourse-ai/ai-tools
Descripción
\u003e Creador y editor de imágenes avanzado, capaz de editar cargas de Discourse denotadas como upload://…
Resumen
\u003e Edita o crea imágenes usando FLUX Kontext
Parámetros
- prompt: string: Describe lo que quieres generar. 2-3 oraciones, sé detallado para obtener mejores resultados (requerido)
- input_image: string: un upload://… que deseas modificar
- seed: number: La semilla aleatoria. Si deseas mantener las salidas en el mismo estilo, mantén el mismo número
- aspect_ratio: string: La relación de aspecto de la imagen, debe estar entre 21:9 y 9:21. Para imágenes cuadradas, usa 1:1. Por defecto es 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"
};
// Añadir input_image si se proporciona
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 solicitud API falló con el estado ${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: "Imagen generada con éxito",
seed: seed,
aspect_ratio: params.aspect_ratio || "16:9",
output_image: image?.short_url
};
}
function details() {
return "Imagen generada usando el modelo Flux Kontext Max de Segmind";
}
Comentario
Esto muestra algunas de las capacidades de herramientas más avanzadas, incluidas varias añadidas en \u003chttps://github.com/discourse/discourse-ai/pull/1391\u003e, que serán necesarias antes de que esto funcione.
- Realizar solicitudes POST con
http.post— ¡las herramientas personalizadas pueden publicar en cualquier URL!
const result = http.post(apiUrl, {
headers: {
"x-key": apiKey,
"Content-Type": "application/json"
},
body: JSON.stringify(body)
});
- Soporte para cargas codificadas en base64 en la API
Obtener carga codificada en Base64:
body.input_image = upload.getBase64(params.input_image);
Obtener el resultado de una solicitud HTTP en Base64:
const base64 = http.get(imageUrl, { base64Encode: true }).body;
Crear una carga a partir de una cadena base64:
image = upload.create("generated_image.jpg", base64);
- Forzar la renderización en una publicación para evitar suposiciones y ahorrar tokens:
chain.setCustomRaw(raw);
- La API implica sondeos; Discourse AI proporciona una primitiva
sleeppara esperar entre sondeos:
while (pollResult.status === "Pending" && checks < 30) {
sleep(1000);
pollResult = JSON.parse(http.get(pollingUrl).body);
checks++;
}
¡Espero que esto te resulte útil! ¡No dudes en hacer preguntas o compartir ideas!

