FLUX.1 Kontext Max كأداة مخصصة لـ Discourse AI

في الأسبوع الماضي، أصدرت Flux نموذجًا مثيرًا للإعجاب للغاية يسمى FLUX.1 Kontext.

مدونة إعلان من Black Forest Labs

إنه مثير للاهتمام بشكل خاص لأنه أرخص قليلاً من نماذج OpenAI، المتوفرة عبر شخصية المصمم، وله نتائج ممتازة.

في العمل

في هذا المنشور، أردت مشاركة كيفية إضافة الأداة للقيام بذلك، واستعراض بعض الميزات المتقدمة في Discourse AI.

الأداة للقيام بالمهمة

لتحديد الأداة، ستحتاج إلى التسجيل في \u003chttps://bfl.ai\u003e، وإنشاء مفتاح API، وشراء بعض الأرصدة.

مع وضع هذا في الاعتبار:

حدد أداة مخصصة جديدة في /admin/plugins/discourse-ai/ai-tools

الوصف

\u003e منشئ ومحرر صور متقدم - قادر على تحرير تحميلات Discourse المشار إليها كـ upload://…

الملخص

\u003e يقوم بتحرير أو إنشاء صور باستخدام FLUX Kontext

المعلمات

  • prompt: string: صف ما تريد إنشاؤه. 2-3 جمل، كن مفصلاً للحصول على أفضل النتائج (مطلوب)
  • input_image: string: ملف upload://… الذي ترغب في تعديله
  • seed: number: البذرة العشوائية. إذا كنت ترغب في الاحتفاظ بالمخرجات بنفس النمط، احتفظ بالرقم نفسه
  • aspect_ratio: string: نسبة أبعاد الصورة، يجب أن تكون بين 21:9 و 9:21. للصور المربعة، استخدم 1:1. الافتراضي هو 16:9

البرنامج النصي

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"
  };

  // إضافة input_image إذا تم توفيرها
  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: `فشل طلب API مع الحالة ${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: "تم إنشاء الصورة بنجاح", 
    seed: seed,
    aspect_ratio: params.aspect_ratio || "16:9",
    output_image: image?.short_url
  };
}

function details() {
  return "تم إنشاء الصورة باستخدام نموذج Segmind's Flux Kontext Max";
}

تعليق

يعرض هذا بعض إمكانيات الأدوات الأكثر تقدمًا، بما في ذلك عدد قليل تم إضافته في \u003chttps://github.com/discourse/discourse-ai/pull/1391\u003e، والتي ستكون مطلوبة قبل أن تعمل هذه.

  1. إجراء طلبات POST باستخدام http.post — يمكن للأدوات المخصصة النشر إلى أي عنوان URL!
const result = http.post(apiUrl, {
  headers: {
    "x-key": apiKey,
    "Content-Type": "application/json"
  },
  body: JSON.stringify(body)
});
  1. دعم الحمولة المشفرة بـ base64 في API

الحصول على تحميل مشفر بـ Base64:

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

الحصول على نتيجة طلب HTTP بـ Base64:

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

إنشاء تحميل من سلسلة base64:

image = upload.create("generated_image.jpg", base64);
  1. فرض العرض على منشور لتجنب التخمين وتوفير الرموز:
chain.setCustomRaw(raw);
  1. تتضمن API الاستقصاء؛ يوفر Discourse AI بدائي sleep للانتظار بين الاستقصاءات:
while (pollResult.status === "Pending" && checks < 30) {
  sleep(1000);
  pollResult = JSON.parse(http.get(pollingUrl).body);
  checks++;
}

آمل أن تجد هذا مفيدًا! لا تتردد في طرح الأسئلة أو مشاركة الأفكار!

4 إعجابات