Felo API PlatformFelo API Platform

المحتوى

حوّل فيديو YouTube إلى مقال قابل للنشر

خذ النص بطوابع زمنية وحوّله إلى كتل مقروءة واصنع الهيكل والمسودة بنموذج تتحكم به واترك النتيجة في LiveDoc للمراجعة.

الوقت25 دقيقةالمستوىمتوسطمحدّث2026-10-29
لمنفرق المحتوىكتّاب النشراتمحررو الفيديو والبودكاست

انسخ الموجّه

استبدل الحقول بين الأقواس المربعة وألصق في Claude Code أو Codex أو أي ذكاء اصطناعي يملك وصولًا إلى الطرفية. يثبّت مهارة Felo ويسأل قبل إنفاق الرصيد وينفّذ سير العمل.

حوّل هذا الفيديو إلى مقال قابل للنشر: [رابط YouTube أو معرّف الفيديو].

الجمهور: [القراء]. النبرة: [أسلوب النشر]. الطول المستهدف: [800–1200 كلمة] باللغة [اللغة].
التعامل مع المصادر: احتفظ بعنوان الفيديو والقناة والرابط. اقتبس مقاطع قصيرة فقط، مع طوابع زمنية.

أنتج:
1. عنوانًا مؤقتًا.
2. فقرة افتتاحية.
3. أقسامًا بفقرات قصيرة.
4. اقتباسين أو ثلاثة مع طوابع زمنية.
5. ما لم يغطه الفيديو.
6. قائمة مصادر بالفيديو والصفحات المرتبطة.

القواعد:
- لا تعِد إنتاج النص الكامل. لخّص واقتبس بإيجاز.
- كل ادعاء واقعي من الفيديو يحتاج إلى طابع زمني؛ والادعاءات من الصفحات المرتبطة تحتاج إلى رابط.
- ضع وسم «غير مُتحقق» على كل ما لم تستطع التحقق منه.
- اسأل قبل استهلاك الأرصدة في جلب النص أو استخراج الصفحات.
- لا تنشر ولا تجدول ولا ترسل شيئًا.
- اكتب النتيجة في ./video-article.md ولخّصها في الدردشة.

تتضمن النسخة خطوات التثبيت وقواعد الأمان أيضًا.

ما تحصل عليه

مخرجات نموذجية لتشغيل واحد. ليست توليدًا مباشرًا.

مثال مقال (مقتطف)

ما قاله فعلًا حديث 40 دقيقة عن الوكلاء

المقدمة

كان العرض مبهرًا؛ الجزء المفيد هو معالجة الأخطاء.

الادعاء الذي اقتبسه الجميع

> «لم يصبح الوكيل أذكى. توقفنا فقط عن السماح له بإعادة المحاولة دون ميزانية». — [12:40]

ما لم يغطه الفيديو

تكلفة المهمة الناجحة، وما يحدث عندما يكون المصدر المسترجع خاطئًا.

المصادر

  • الفيديو: https://www.youtube.com/watch?v=...
  • المعيار المرتبط: https://example.com/benchmark

الاستدعاءات الدقيقة

للمطورين: سير العمل نفسه ككود، بترتيب التنفيذ.

عرض استدعاءات API الفعلية
  1. خذ النص بطوابع زمنية

    استخدم YouTube Subtitling لترجمة اللغة الهدف واحفظ بداية كل سطر ومدته.

    article.ts
    const BASE = "https://openapi.felo.ai";
    const headers = {
      Authorization: `Bearer ${process.env.FELO_API_KEY}`,
      "Content-Type": "application/json",
    };
    
    async function felo<T>(path: string, body?: unknown): Promise<T> {
      const res = await fetch(`${BASE}${path}`, {
        method: body ? "POST" : "GET",
        headers,
        body: body ? JSON.stringify(body) : undefined,
      });
      if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
      return res.json() as Promise<T>;
    }
    
    type Transcript = {
      data: {
        title: string;
        contents: { text: string; start: number; duration: number }[];
      };
    };
    
    export async function fetchTranscript(videoId: string, language = "en") {
      const query = new URLSearchParams({
        video_code: videoId,
        language,
        with_time: "true",
      });
      const { data } = await felo<Transcript>(`/v2/youtube/subtitling?${query}`);
      if (data.contents.length === 0) throw new Error("This video has no subtitles");
      return data;
    }

    مخرجات نموذجية

    {
      "title": "How we rebuilt onboarding",
      "contents": [
        { "text": "Welcome back to the channel.", "start": 0.32, "duration": 4.1 }
      ]
    }
  2. حوّله إلى كتل مقروءة

    قسّم حسب الموضوع وأزل كلمات الحشو واحفظ الطوابع الزمنية.

    article.ts
    const toClock = (seconds: number) => {
      const minutes = Math.floor(seconds / 60);
      const rest = Math.floor(seconds % 60);
      return `${String(minutes).padStart(2, "0")}:${String(rest).padStart(2, "0")}`;
    };
    
    export function toBlocks(
      contents: Transcript["data"]["contents"],
      window = 60,
    ) {
      const grouped = new Map<number, string[]>();
      for (const line of contents) {
        const bucket = Math.floor(line.start / window) * window;
        grouped.set(bucket, [...(grouped.get(bucket) ?? []), line.text.trim()]);
      }
      return [...grouped]
        .map(([start, lines]) => `[${toClock(start)}] ${lines.join(" ")}`)
        .join("\n\n");
    }

    مخرجات نموذجية

    [00:00] Welcome back to the channel. Today we are talking about onboarding.
    
    [01:00] The first thing we changed was the welcome screen.
  3. احصل على المصادر المقتبسة

    عبر Web Fetch اقرأ الصفحات المذكورة في الفيديو وأضف الروابط والحقائق.

    article.ts
    type ExtractData = { data: { content: string } };
    
    export async function fetchSources(urls: string[]) {
      return Promise.all(
        urls.slice(0, 5).map(async (url) => {
          const page = await felo<ExtractData>("/v2/web/extract", {
            url,
            output_format: "markdown",
            with_readability: true,
          });
          return { url, content: page.data.content };
        }),
      );
    }

    مخرجات نموذجية

    [
      {
        "url": "https://example.com/reference",
        "content": "# Reference\n\nExtracted page text…"
      }
    ]
  4. اصنع الهيكل ثم المسودة

    اطلب الهيكل من Model API أولًا ثم اكتب المقال وفق الهيكل باقتباسات قصيرة وطوابع زمنية.

    article.ts
    const MODEL_API = "https://openapi.felo.ai/api/v1";
    
    type Completion = {
      choices: { message: { content: string } }[];
      usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number };
    };
    
    async function complete(model: string, prompt: string): Promise<Completion> {
      const res = await fetch(`${MODEL_API}/chat/completions`, {
        method: "POST",
        headers,
        body: JSON.stringify({ model, messages: [{ role: "user", content: prompt }] }),
      });
      if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
      return res.json() as Promise<Completion>;
    }
    
    export async function draftArticle(title: string, transcript: string) {
      const outline = await complete(
        "claude-haiku-5-5",
        "Outline a short article from this transcript. Return only headings.\n\n" + transcript,
      );
      const article = await complete(
        "claude-sonnet-5-5",
        `Write the article "${title}" from the transcript. Follow the outline and keep [mm:ss] on direct quotes.\n\nOutline:\n${outline.choices[0].message.content}\n\nTranscript:\n${transcript}`,
      );
      return {
        outline: outline.choices[0].message.content,
        article: article.choices[0].message.content,
        usage: article.usage,
      };
    }

    مخرجات نموذجية

    {
      "outline": "1. The problem\n2. What changed\n3. What we learned",
      "article": "## The problem\n\nWhen we…",
      "usage": { "prompt_tokens": 4120, "completion_tokens": 640, "total_tokens": 4760 }
    }
  5. اتركه في LiveDoc للمراجعة

    احفظ المسودة والاقتباسات في LiveDoc وسلّمها للمحرر للتصحيح والاعتماد.

    article.ts
    type LiveDocData = { data: { short_id: string } };
    type ResourceData = { data: { id: string } };
    
    export async function saveDraft(
      title: string,
      result: { outline: string; article: string },
    ) {
      const doc = await felo<LiveDocData>("/v2/livedocs", {
        name: `Article draft: ${title}`,
        description: "Draft generated from a video transcript",
      });
    
      await felo<ResourceData>(`/v2/livedocs/${doc.data.short_id}/resources/doc`, {
        title: "Draft",
        content: result.article,
      });
    
      await felo<ResourceData>(`/v2/livedocs/${doc.data.short_id}/resources/doc`, {
        title: "Outline",
        content: result.outline,
      });
    
      return doc.data.short_id;
    }

    مخرجات نموذجية

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

ما يتضمنه

  • نص YouTube بطوابع زمنية
  • الصفحات التي يذكرها الفيديو بصيغة Markdown
  • الهيكل والمسودة من Model API
  • LiveDoc بالمسودة للمراجعة

ما لا يفعله

  • لا ينسخ النص كاملًا؛ اقتباسات قصيرة وإعادة صياغة فقط
  • يجب أن يكون للفيديو ترجمة
  • تحقق من الحقوق وحدود الاقتباس قبل النشر
  • النموذج يصنع الهيكل والمسودة والقرار النهائي للمحرر
  • لا ينشر أو يترجم تلقائيًا

أسئلة

هل يجب أن يكون للفيديو ترجمة؟

نعم. يبدأ سير العمل بالترجمة؛ وإن غابت يتوقف بدل تخمين ما قيل.

هل يمكن تحويل بودكاست إلى مقال؟

سير العمل هذا لـ YouTube. للبودكاست جهّز نصًا أولًا واستخدم قواعد الكتابة نفسها.

هل يمكن الكتابة بلغة أخرى؟

نعم. حدد اللغة الهدف؛ تبقى الاقتباسات بالأصل مع ترجمة عند الحاجة.

من يكتب المقال؟

وكيل AI الذي تلصق فيه الموجّه يكتب المسودة؛ ويوفر Felo النص والصفحات ومساحة المراجعة.

هل يمكن إعادة نشر النص كاملًا؟

لا. ينشئ سير العمل مقالًا جديدًا باقتباسات قصيرة ولا ينسخ النص كاملًا.

كم تكلفة تشغيل واحد؟

يُحتسب النص واستخراج الصفحات حسب الاستخدام؛ الأسعار الحالية في صفحة الأسعار ويطلب الموجّه الموافقة قبل الإنفاق.

سير عمل مرتبط

اجعله مناسبًا لك

الوصفة نفسها، معدّلة بحسب طريقة تسليمك الفعلية.

اقتباسات بطوابع زمنية فقط

لا تكتب مقالًا؛ سلّم قائمة اقتباسات قابلة للتحقق لإعادة الاستخدام.

نسخة النشرة أولًا

اختصر المقال واجعله أكثر محادثة للنشرة.

عالج قناة دفعة واحدة

كرر الخطوات لكل فيديو واحفظ LiveDocs منفصلة.

صفحات المراجع خلف هذه الوصفة والخطوات التالية.