npx skills add ...
npx skills add felo-inc/felo-skills --skill felo-slides
Generate PPT/slides from prompts, local images, PDFs, and other files with the Felo PPT Task API. Use when users ask to create, make, generate, or export presentations or slide decks; turn an attached/local file into slides; include an original image in a PPT; or explicitly invoke /felo-slides. Handles file upload, API key checks, task creation, polling, and final ppt_url output.
npx skills add felo-inc/felo-skills --skill felo-slides
Trigger this skill for requests about creating presentation files:
Trigger keywords:
/felo-slides, "use felo slides"Do NOT use this skill for:
felo-search)Linux/macOS:
Windows PowerShell:
Use Bash tool commands and follow this workflow exactly.
If key is missing, stop and return setup instructions.
Use the bundled script (no jq dependency):
When the user provides a local image or file, pass its absolute path with
--file. Include the desired use of the original asset in the prompt. For
example:
Do not replace --file with a textual description when the user explicitly
wants the original file or image used in the PPT.
To apply a specific theme, first list available themes with felo ppt-themes, then pass the theme ID:
Script behavior:
POST https://openapi.felo.ai/v2/ppts--file <path> to upload one local file with multipart/form-data--theme <id> to apply a PPT theme (sends ppt_config.ai_theme_id)--livedoc-id <id> to reuse an existing LiveDoc instead of auto-creating a new one--task-id <id> to resume polling an existing task (skips creation)GET https://openapi.felo.ai/v2/tasks/{task_id}/historicalCOMPLETED/SUCCESS as success terminal (case-insensitive)FAILED/ERROR as failure terminalppt_url on success (fallback: live_doc_url)Optional debug output:
This outputs structured JSON including:
task_idtask_statusppt_urllive_doc_urllivedoc_short_idppt_business_iderror_messageThe script polls the historical endpoint automatically. Wait for it to exit before responding:
COMPLETED or SUCCESS, and the script prints
ppt_url (fallback: live_doc_url)FAILED or ERROR; return the error format belowtask_id and tell the user to resume with --task-id
instead of creating a duplicate PPT taskOn success, return:
ppt_url immediately (script default output, fallback live_doc_url)--json is used, also include task_id, terminal status, and optional metadataUse this response structure:
Error format:
Known API error codes:
INVALID_API_KEY (401): key invalid or revokedPPT_TASK_CREATE_FAILED (502): create task downstream failedPPT_TASK_QUERY_FAILED (502): query task downstream failedTimeout handling:
task_id so user can query again--task-id instead of --query to avoid creating a duplicate PPT:task_id so follow-up queries can continue from the same task.node felo-slides/scripts/run_ppt_task.mjs \
--query "USER_PROMPT_HERE" \
--interval 10 \
--max-wait 1800 \
--timeout 60node felo-slides/scripts/run_ppt_task.mjs \
--query "Create exactly 2 slides and place the uploaded original image directly in the PPT" \
--file "/absolute/path/to/source.jpg" \
--interval 10 \
--max-wait 1800 \
--timeout 60node felo-slides/scripts/run_ppt_task.mjs \
--query "USER_PROMPT_HERE" \
--theme "THEME_ID_HERE" \
--interval 10 \
--max-wait 1800 \
--timeout 60node felo-slides/scripts/run_ppt_task.mjs \
--query "USER_PROMPT_HERE" \
--interval 10 \
--max-wait 1800 \
--json \
--verbose## PPT Generation Result
- Task ID: <task_id>
- Status: <status>
- PPT URL: <ppt_url>
- Live Doc URL: <live_doc_url or N/A>
## Notes
- livedoc_short_id: <value or N/A>
- ppt_business_id: <value or N/A>## PPT Generation Failed
- Error Type: <error code or category>
- Message: <readable message>
- Suggested Action: <next step>node felo-slides/scripts/run_ppt_task.mjs \
--task-id "TASK_ID_HERE" \
--interval 10 \
--max-wait 1800