Felo API PlatformFelo API Platform

תוכן

הפכו סרטון YouTube למאמר שאפשר לפרסם

קחו תמלול עם חותמות זמן, עצבו אותו לבלוקים קריאים, הכינו שלד וטיוטה עם מודל שאתם שולטים בו והשאירו את התוצאה ב-LiveDoc לבדיקה.

זמן25 דקותרמהבינוניעודכן2026-10-29
למיצוותי תוכןכותבי ניוזלטריםעורכי וידאו ופודקאסט

העתיקו את הפרומפט

החליפו את השדות בסוגריים מרובעים והדביקו ב-Claude Code, Codex או AI עם גישה לטרמינל. הוא מתקין את סקיל Felo, שואל לפני שריפת קרדיטים ומריץ את תהליך העבודה.

הפוך את הסרטון הזה למאמר שניתן לפרסם: [URL של YouTube או מזהה סרטון].

קהל: [קוראים]. טון: [סגנון פרסום]. אורך יעד: [800–1200 מילים] ב[שפה].
טיפול במקורות: שמור את כותרת הסרטון, הערוץ וה-URL. צטט לכל היותר קטעים קצרים, עם חותמות זמן.

הפק:
1. כותרת עבודה.
2. פסקת פתיחה.
3. פרקים עם פסקאות קצרות.
4. שניים או שלושה ציטוטים עם חותמות זמן.
5. מה הסרטון לא כיסה.
6. רשימת מקורות עם הסרטון והעמודים המקושרים.

כללים:
- אל תשחזר את התמלול המלא. סכם וצטט בקצרה.
- כל טענה עובדתית מהסרטון צריכה חותמת זמן; טענות מעמודים מקושרים צריכות URL.
- סמן כ„לא מאומת” כל מה שלא ניתן לבדוק.
- שאל לפני שימוש בקרדיטים בתמלול או בחילוץ עמודים.
- אל תפרסם, תזמן או תשלח דבר.
- כתוב את התוצאה ל-./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 נפרדים.

עמודי העזר שמאחורי המתכון והשלבים הבאים.