Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,62 @@
{
"You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).": "Du kannst deinen API-Schlüssel erhalten, indem du zu [API-Einstellungen]navigierst (https://app.slidespeak.co/settings/developer).",
"Create Presentation": "Create Presentation",
"Edit Presentation": "Präsentation bearbeiten",
"Get Task Status": "Get Task Status",
"Upload Document": "Dokument hochladen",
"Custom API Call": "Eigener API-Aufruf",
"Creates a new presentation.": "Erstellt eine neue Präsentation.",
"Edits an existing presentation.": "Bearbeitet eine bestehende Präsentation.",
"Gets status of task by id.": "Ruft den Status der Aufgabe durch ID ab.",
"Uploads a document file to SlideSpeak.": "Lädt eine Dokumentdatei auf SlideSpeak hoch.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Topic": "Thema",
"Number of Slides": "Anzahl der Folien",
"Documents": "Dokumente",
"Dropdown": "Dropdown",
"Language": "Sprache",
"Custom User Instructions": "Benutzerdefinierte Benutzeranleitungen",
"Fetch Images": "Bilder abrufen",
"Tone": "Ton",
"Verbosity": "Ausführlichkeit",
"include the cover slide.": "inklusive der „Cover“-Folie.",
" include the table of contents slides.": " die Folientabelle enthalten.",
"Response Format": "Antwortformat",
"Powepoint File (.pptx)": "Powepoint-Datei (.pptx)",
"Config": "Konfiguration",
"Task ID": "Task ID",
"File": "Datei",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"Topic of presentation.": "Thema der Präsentation.",
"Uploaded docuemts to use in presentation.": "Hochgeladene Docuemts für die Präsentation.",
"Whether to include stock images.": "Gibt an, ob Bilder mit aufgenommen werden sollen.",
"The tone to use for the text.": "Der Ton für den Text.",
"How verbose, or long, the text should be.": "Wie ausführlich, oder lang, der Text sollte sein.",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"default": "standard",
"casual": "lässig",
"professional": "professionell",
"funny": "lustig",
"educational": "pädagogisch",
"sales_pitch": "verkaufs_Pitch",
"concise": "prägnant",
"standard": "standard",
"text-heavy": "text-schwer",
"powerpoint": "powerpoint",
"pdf": "pdf",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Presentation": "Neue Präsentation",
"Triggers when a new presentation is created.": "Wird ausgelöst, wenn eine neue Präsentation erstellt wird."
}

View File

@@ -0,0 +1,62 @@
{
"You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).": "Puedes obtener tu clave API navegando a [Configuración API](https://app.slidespeak.co/settings/developer).",
"Create Presentation": "Create Presentation",
"Edit Presentation": "Editar presentación",
"Get Task Status": "Get Task Status",
"Upload Document": "Subir Documento",
"Custom API Call": "Llamada API personalizada",
"Creates a new presentation.": "Crea una nueva presentación.",
"Edits an existing presentation.": "Edita una presentación existente.",
"Gets status of task by id.": "Obtiene el estado de la tarea por id.",
"Uploads a document file to SlideSpeak.": "Sube un archivo de documento a SlideSpeak.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Topic": "Tema",
"Number of Slides": "Número de diapositivas",
"Documents": "Documentos",
"Dropdown": "Soltar",
"Language": "Idioma",
"Custom User Instructions": "Instrucciones de usuario personalizadas",
"Fetch Images": "Obtener imágenes",
"Tone": "Tono",
"Verbosity": "Verbosidad",
"include the cover slide.": "incluye la diapositiva de la \"portada\".",
" include the table of contents slides.": " incluye las diapositivas de “tabla de contenidos”.",
"Response Format": "Formato de respuesta",
"Powepoint File (.pptx)": "Archivo Powepoint (.ptx)",
"Config": "Configuración",
"Task ID": "Task ID",
"File": "Archivo",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"Topic of presentation.": "Tema de presentación.",
"Uploaded docuemts to use in presentation.": "Subidos tópicos a usar en la presentación.",
"Whether to include stock images.": "Si incluir o no imágenes en stock.",
"The tone to use for the text.": "El tono a usar para el texto.",
"How verbose, or long, the text should be.": "Cuán detallado o largo debería ser el texto.",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"default": "por defecto",
"casual": "casual",
"professional": "profesional",
"funny": "divertido",
"educational": "educativo",
"sales_pitch": "ventas_pitch",
"concise": "conciso",
"standard": "estándar",
"text-heavy": "texto-pesado",
"powerpoint": "powerpoint",
"pdf": "pdf",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Presentation": "Nueva presentación",
"Triggers when a new presentation is created.": "Dispara cuando se crea una nueva presentación."
}

View File

@@ -0,0 +1,62 @@
{
"You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).": "Vous pouvez obtenir votre clé API en accédant à [API Settings](https://app.slidespeak.co/settings/developer).",
"Create Presentation": "Create Presentation",
"Edit Presentation": "Modifier la présentation",
"Get Task Status": "Get Task Status",
"Upload Document": "Télécharger le document",
"Custom API Call": "Appel d'API personnalisé",
"Creates a new presentation.": "Crée une nouvelle présentation.",
"Edits an existing presentation.": "Modifie une présentation existante.",
"Gets status of task by id.": "Obtient le statut de la tâche par ID.",
"Uploads a document file to SlideSpeak.": "Télécharge un fichier de document sur SlideSpeak.",
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
"Topic": "Sujet",
"Number of Slides": "Nombre de diapositives",
"Documents": "Documents",
"Dropdown": "Liste déroulante",
"Language": "Langue",
"Custom User Instructions": "Instructions utilisateur personnalisées",
"Fetch Images": "Récupérer les images",
"Tone": "Tonalité",
"Verbosity": "Verbosité",
"include the cover slide.": "inclure la diapositive « couverture».",
" include the table of contents slides.": " inclure les diapositives de la table des matières.",
"Response Format": "Format de réponse",
"Powepoint File (.pptx)": "Fichier Powepoint (.pptx)",
"Config": "Configuration",
"Task ID": "Task ID",
"File": "Ficher",
"Method": "Méthode",
"Headers": "Headers",
"Query Parameters": "Paramètres de requête",
"Body": "Body",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'expiration (en secondes)",
"Topic of presentation.": "Sujet de la présentation.",
"Uploaded docuemts to use in presentation.": "Documents téléchargés à utiliser dans la présentation.",
"Whether to include stock images.": "Inclure ou non les images par défaut.",
"The tone to use for the text.": "Le ton à utiliser pour le texte.",
"How verbose, or long, the text should be.": "À quel point le texte doit être long ou verbeux.",
"Authorization headers are injected automatically from your connection.": "Les Headers d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"default": "par défaut",
"casual": "décontracté",
"professional": "professionnel",
"funny": "drôle",
"educational": "éducatif",
"sales_pitch": "ventes_pitch",
"concise": "concis",
"standard": "standard",
"text-heavy": "texte-lourd",
"powerpoint": "powerpoint",
"pdf": "pdf",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Presentation": "Nouvelle présentation",
"Triggers when a new presentation is created.": "Déclenche quand une nouvelle présentation est créée."
}

View File

@@ -0,0 +1,62 @@
{
"You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).": "[API 設定](https://app.slidespeak.co/settings/developer ) に移動すると、API キーを取得できます。",
"Create Presentation": "Create Presentation",
"Edit Presentation": "プレゼンテーションを編集",
"Get Task Status": "Get Task Status",
"Upload Document": "ドキュメントをアップロード",
"Custom API Call": "カスタムAPI通話",
"Creates a new presentation.": "新しいプレゼンテーションを作成します。",
"Edits an existing presentation.": "既存のプレゼンテーションを編集します",
"Gets status of task by id.": "タスクの状態を id で取得します。",
"Uploads a document file to SlideSpeak.": "SlideSpeakにドキュメントファイルをアップロードします。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Topic": "トピック",
"Number of Slides": "スライドの数",
"Documents": "ドキュメント",
"Dropdown": "ドロップダウン",
"Language": "言語",
"Custom User Instructions": "カスタムユーザーの説明",
"Fetch Images": "画像を取得",
"Tone": "Tone",
"Verbosity": "詳細度",
"include the cover slide.": "「カバー」スライドを含めます。",
" include the table of contents slides.": " 「目次」スライドを含めます。",
"Response Format": "応答形式",
"Powepoint File (.pptx)": "Powepoint ファイル (.pptx)",
"Config": "設定",
"Task ID": "Task ID",
"File": "ファイル",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"Topic of presentation.": "プレゼンテーションのトピック",
"Uploaded docuemts to use in presentation.": "プレゼンテーションで使用するドキュメントがアップロードされました。",
"Whether to include stock images.": "ストック画像を含めるかどうか。",
"The tone to use for the text.": "テキストに使用するトーン。",
"How verbose, or long, the text should be.": "どのように冗長、または長い、テキストである必要があります。",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"default": "デフォルト",
"casual": "カジュアルな",
"professional": "プロフェッショナル",
"funny": "面白い|面白い|面白い|面白い|面白い|面白い|",
"educational": "教育",
"sales_pitch": "sales_pitch",
"concise": "簡潔に",
"standard": "標準",
"text-heavy": "text-heavy",
"powerpoint": "powerpoint",
"pdf": "pdf",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Presentation": "新しいプレゼンテーション",
"Triggers when a new presentation is created.": "新しいプレゼンテーションが作成されたときにトリガーします。"
}

View File

@@ -0,0 +1,62 @@
{
"You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).": "U kunt uw API-sleutel verkrijgen door te navigeren naar [API Settings](https://app.slidespeak.co/settings/developer).",
"Create Presentation": "Create Presentation",
"Edit Presentation": "Presentatie bewerken",
"Get Task Status": "Get Task Status",
"Upload Document": "Document uploaden",
"Custom API Call": "Custom API Call",
"Creates a new presentation.": "Maakt een nieuwe presentatie.",
"Edits an existing presentation.": "Bewerkt een bestaande presentatie.",
"Gets status of task by id.": "Krijgt de status van taak door id.",
"Uploads a document file to SlideSpeak.": "Upload een documentbestand naar SlideSpeak.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Topic": "Onderwerp",
"Number of Slides": "Aantal dia's",
"Documents": "Documenten",
"Dropdown": "Uitklapmenu",
"Language": "Taal",
"Custom User Instructions": "Aangepaste gebruikersinstructies",
"Fetch Images": "Afbeeldingen ophalen",
"Tone": "Toon",
"Verbosity": "Verbossing",
"include the cover slide.": "inclusief de cover-slide.",
" include the table of contents slides.": " omvatten de tabel met inhoud slides.",
"Response Format": "Antwoord formaat",
"Powepoint File (.pptx)": "Powepoint bestand (.pptx)",
"Config": "Configuratie",
"Task ID": "Task ID",
"File": "Bestand",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"Topic of presentation.": "Onderwerp van presentatie.",
"Uploaded docuemts to use in presentation.": "Geüploade documenten om te gebruiken in presentatie.",
"Whether to include stock images.": "Of er afbeeldingen van de voorraad moeten worden toegevoegd.",
"The tone to use for the text.": "De toon voor de tekst.",
"How verbose, or long, the text should be.": "Hoe uitgebreid of lang, de tekst zou moeten zijn.",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"default": "standaard",
"casual": "onvolledig",
"professional": "professioneel",
"funny": "grappig",
"educational": "educatief",
"sales_pitch": "verkoop_toonhoogte",
"concise": "beknopt",
"standard": "standaard",
"text-heavy": "tekstzwaar",
"powerpoint": "powerpoint",
"pdf": "PDF",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Presentation": "Nieuwe presentatie",
"Triggers when a new presentation is created.": "Triggert wanneer een nieuwe presentatie wordt gemaakt."
}

View File

@@ -0,0 +1,62 @@
{
"You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).": "Você pode obter sua chave de API navegando para [Configurações da API](https://app.slidespeak.co/settings/developer).",
"Create Presentation": "Create Presentation",
"Edit Presentation": "Editar apresentação",
"Get Task Status": "Get Task Status",
"Upload Document": "Upload de documento",
"Custom API Call": "Chamada de API personalizada",
"Creates a new presentation.": "Cria uma nova apresentação.",
"Edits an existing presentation.": "Edita uma apresentação existente.",
"Gets status of task by id.": "Obtém status da tarefa por id.",
"Uploads a document file to SlideSpeak.": "Carrega um arquivo de documento para SlideSpeak.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Topic": "Tópico",
"Number of Slides": "Número de slides",
"Documents": "Documentos",
"Dropdown": "Suspensa",
"Language": "IDIOMA",
"Custom User Instructions": "Instruções Personalizadas do Usuário",
"Fetch Images": "Buscar imagens",
"Tone": "Tom",
"Verbosity": "Verbossidade",
"include the cover slide.": "incluir o slide 'capa'.",
" include the table of contents slides.": " incluir os slides 'tabela de conteúdo'.",
"Response Format": "Formato de Resposta",
"Powepoint File (.pptx)": "Arquivo Powepoint (.pptx)",
"Config": "Configuração",
"Task ID": "Task ID",
"File": "Arquivo",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"Topic of presentation.": "Tópico de apresentação.",
"Uploaded docuemts to use in presentation.": "Docuemts carregados para serem usados na apresentação.",
"Whether to include stock images.": "Se deseja incluir imagens de estoque.",
"The tone to use for the text.": "O tom a ser usado para o texto.",
"How verbose, or long, the text should be.": "Quão detalhado ou longo o texto deve ser.",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"default": "padrão",
"casual": "casual",
"professional": "profissional",
"funny": "Engraçado",
"educational": "educacional",
"sales_pitch": "tom_vendas",
"concise": "conciso",
"standard": "padrão",
"text-heavy": "texto-pesado",
"powerpoint": "powerpoint",
"pdf": "PDF",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Presentation": "Nova apresentação",
"Triggers when a new presentation is created.": "Dispara quando uma nova apresentação é criada."
}

View File

@@ -0,0 +1,62 @@
{
"You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).": "You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).",
"Create Presentation": "Create Presentation",
"Edit Presentation": "Edit Presentation",
"Get Task Status": "Get Task Status",
"Upload Document": "Upload Document",
"Custom API Call": "Custom API Call",
"Creates a new presentation.": "Creates a new presentation.",
"Edits an existing presentation.": "Edits an existing presentation.",
"Gets status of task by id.": "Gets status of task by id.",
"Uploads a document file to SlideSpeak.": "Uploads a document file to SlideSpeak.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Topic": "Topic",
"Number of Slides": "Number of Slides",
"Documents": "Documents",
"Dropdown": "Dropdown",
"Language": "Language",
"Custom User Instructions": "Custom User Instructions",
"Fetch Images": "Fetch Images",
"Tone": "Tone",
"Verbosity": "Verbosity",
"include the cover slide.": "include the cover slide.",
" include the table of contents slides.": " include the table of contents slides.",
"Response Format": "Response Format",
"Powepoint File (.pptx)": "Powepoint File (.pptx)",
"Config": "Config",
"Task ID": "Task ID",
"File": "File",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Topic of presentation.": "Topic of presentation.",
"Uploaded docuemts to use in presentation.": "Uploaded docuemts to use in presentation.",
"Whether to include stock images.": "Whether to include stock images.",
"The tone to use for the text.": "The tone to use for the text.",
"How verbose, or long, the text should be.": "How verbose, or long, the text should be.",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"default": "default",
"casual": "casual",
"professional": "professional",
"funny": "funny",
"educational": "educational",
"sales_pitch": "sales_pitch",
"concise": "concise",
"standard": "standard",
"text-heavy": "text-heavy",
"powerpoint": "powerpoint",
"pdf": "pdf",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Presentation": "New Presentation",
"Triggers when a new presentation is created.": "Triggers when a new presentation is created."
}

View File

@@ -0,0 +1,62 @@
{
"You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).": "You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).",
"Create Presentation": "Create Presentation",
"Edit Presentation": "Edit Presentation",
"Get Task Status": "Get Task Status",
"Upload Document": "Upload Document",
"Custom API Call": "自定义 API 呼叫",
"Creates a new presentation.": "Creates a new presentation.",
"Edits an existing presentation.": "Edits an existing presentation.",
"Gets status of task by id.": "Gets status of task by id.",
"Uploads a document file to SlideSpeak.": "Uploads a document file to SlideSpeak.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Topic": "Topic",
"Number of Slides": "Number of Slides",
"Documents": "Documents",
"Dropdown": "Dropdown",
"Language": "Language",
"Custom User Instructions": "Custom User Instructions",
"Fetch Images": "Fetch Images",
"Tone": "Tone",
"Verbosity": "Verbosity",
"include the cover slide.": "include the cover slide.",
" include the table of contents slides.": " include the table of contents slides.",
"Response Format": "Response Format",
"Powepoint File (.pptx)": "Powepoint File (.pptx)",
"Config": "Config",
"Task ID": "Task ID",
"File": "文件",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"Topic of presentation.": "Topic of presentation.",
"Uploaded docuemts to use in presentation.": "Uploaded docuemts to use in presentation.",
"Whether to include stock images.": "Whether to include stock images.",
"The tone to use for the text.": "The tone to use for the text.",
"How verbose, or long, the text should be.": "How verbose, or long, the text should be.",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"default": "default",
"casual": "casual",
"professional": "professional",
"funny": "funny",
"educational": "educational",
"sales_pitch": "sales_pitch",
"concise": "concise",
"standard": "standard",
"text-heavy": "text-heavy",
"powerpoint": "powerpoint",
"pdf": "pdf",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Presentation": "New Presentation",
"Triggers when a new presentation is created.": "Triggers when a new presentation is created."
}

View File

@@ -0,0 +1,64 @@
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import {
HttpMethod,
createCustomApiCallAction,
httpClient,
} from '@activepieces/pieces-common';
import { BASE_URL } from './lib/common/constants';
import { uploadDocumentAction } from './lib/actions/upload-document';
import { createPresentationAction } from './lib/actions/create-presentation';
import { editPresentationAction } from './lib/actions/edit-presentation';
import { getTaskStatusAction } from './lib/actions/get-task-status';
import { newPresentationTrigger } from './lib/triggers/new-presentation';
import { PieceCategory } from '@activepieces/shared';
export const slidespeakAuth = PieceAuth.SecretText({
displayName: 'API Key',
required: true,
description: `You can obtain your API key by navigating to [API Settings](https://app.slidespeak.co/settings/developer).`,
validate: async ({ auth }) => {
try {
await httpClient.sendRequest({
url: BASE_URL + '/me',
method: HttpMethod.GET,
headers: {
'X-API-key': auth,
},
});
return {
valid: true,
};
} catch {
return {
valid: false,
error: 'Invalid API Key',
};
}
},
});
export const slidespeak = createPiece({
displayName: 'SlideSpeak',
auth: slidespeakAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/slidespeak.png',
authors: ['rimjhimyadav'],
categories:[PieceCategory.CONTENT_AND_FILES,PieceCategory.PRODUCTIVITY],
actions: [
createPresentationAction,
editPresentationAction,
getTaskStatusAction,
uploadDocumentAction,
createCustomApiCallAction({
auth:slidespeakAuth,
baseUrl:()=>BASE_URL,
authMapping:async (auth)=>{
return{
'X-API-key':auth.secret_text,
}
}
})
],
triggers: [newPresentationTrigger],
});

View File

@@ -0,0 +1,189 @@
import { slidespeakAuth } from '../../index';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { BASE_URL } from '../common/constants';
export const createPresentationAction = createAction({
auth: slidespeakAuth,
name: 'create-presentation',
displayName: 'Create Presentation',
description: 'Creates a new presentation.',
props: {
plain_text: Property.ShortText({
displayName: 'Topic',
description: 'Topic of presentation.',
required: true,
}),
length: Property.Number({
displayName: 'Number of Slides',
required: false,
}),
document_uuids: Property.Array({
displayName: 'Documents',
description: 'Uploaded docuemts to use in presentation.',
required: false,
}),
template: Property.Dropdown({
auth: slidespeakAuth,
displayName: 'Dropdown',
refreshers: [],
required: false,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first.',
options: [],
};
}
const response = await httpClient.sendRequest<{ name: string }[]>({
method: HttpMethod.GET,
url: BASE_URL + '/presentation/templates',
headers: {
'X-API-key': auth.secret_text,
},
});
return {
disabled: false,
options: response.body.map((template) => {
return {
label: template.name,
value: template.name,
};
}),
};
},
}),
language: Property.ShortText({
displayName: 'Language',
required: false,
}),
custom_user_instructions: Property.LongText({
displayName: 'Custom User Instructions',
required: false,
}),
fetch_images: Property.Checkbox({
displayName: 'Fetch Images',
description: 'Whether to include stock images.',
required: false,
}),
tone: Property.StaticDropdown({
displayName: 'Tone',
description: 'The tone to use for the text.',
required: false,
options: {
disabled: false,
options: [
{ label: 'default', value: 'default' },
{ label: 'casual', value: 'casual' },
{ label: 'professional', value: 'professional' },
{ label: 'funny', value: 'funny' },
{ label: 'educational', value: 'educational' },
{ label: 'sales_pitch', value: 'sales_pitch' },
],
},
}),
verbosity: Property.StaticDropdown({
displayName: 'Verbosity',
description: 'How verbose, or long, the text should be.',
required: false,
options: {
disabled: false,
options: [
{ label: 'concise', value: 'concise' },
{ label: 'standard', value: 'standard' },
{ label: 'text-heavy', value: 'text-heavy' },
],
},
}),
include_cover: Property.Checkbox({
displayName: 'include the cover slide.',
required: false,
}),
include_table_of_contents: Property.Checkbox({
displayName: ' include the table of contents slides.',
required: false,
}),
response_format: Property.StaticDropdown({
displayName: 'Response Format',
required: false,
options: {
disabled: false,
options: [
{ label: 'powerpoint', value: 'powerpoint' },
{ label: 'pdf', value: 'pdf' },
],
},
}),
},
async run(context) {
const {
plain_text,
length,
document_uuids,
template,
language,
fetch_images,
tone,
verbosity,
include_cover,
response_format,
include_table_of_contents,
custom_user_instructions,
} = context.propsValue;
const apiKey = context.auth;
const response = await httpClient.sendRequest<{ task_id: string }>({
method: HttpMethod.POST,
url: BASE_URL + '/presentation/generate',
headers: {
'X-API-key': apiKey.secret_text,
},
body: {
plain_text,
length,
document_uuids,
template,
language,
fetch_images,
tone,
verbosity,
include_cover,
include_table_of_contents,
response_format,
custom_user_instructions,
},
});
if (!response || !response.body.task_id) {
throw new Error('Failed to create presentation.');
}
let status = 'FAILURE';
const timeoutAt = Date.now() + 5 * 60 * 1000;
const taskId = response.body.task_id;
do {
await new Promise((resolve) => setTimeout(resolve, 5000));
const pollRes = await httpClient.sendRequest<{
task_id: string;
task_status: string;
}>({
method: HttpMethod.GET,
url: BASE_URL + `/task_status/${taskId}`,
headers: {
'X-API-key': apiKey.secret_text,
},
});
status = pollRes.body.task_status;
if (status === 'SUCCESS') return pollRes.body;
} while (status !== 'SUCCESS' && Date.now() < timeoutAt);
throw new Error('Create resentation timed out or failed.');
},
});

View File

@@ -0,0 +1,51 @@
import { slidespeakAuth } from '../../index';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { BASE_URL } from '../common/constants';
import FormData from 'form-data';
export const editPresentationAction = createAction({
auth: slidespeakAuth,
name: 'edit-presentation',
displayName: 'Edit Presentation',
description: 'Edits an existing presentation.',
props: {
pptx_file: Property.File({
displayName: 'Powepoint File (.pptx)',
required: true,
}),
config: Property.Json({
displayName: 'Config',
required: true,
defaultValue: {
replacements: [
{
shape_name: 'TARGET_TITLE',
content: 'Your new title',
},
],
},
}),
},
async run(context) {
const { pptx_file, config } = context.propsValue;
const apiKey = context.auth;
const formData = new FormData();
const fileBuffer = Buffer.from(pptx_file.base64, 'base64');
formData.append('pptx_file', fileBuffer, pptx_file.filename);
formData.append('config', JSON.stringify(config));
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: BASE_URL + '/presentation/edit',
headers: {
'X-API-key': apiKey.secret_text,
...formData.getHeaders()
},
body: formData,
});
return response.body;
},
});

View File

@@ -0,0 +1,31 @@
import { slidespeakAuth } from '../../index';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { BASE_URL } from '../common/constants';
export const getTaskStatusAction = createAction({
auth: slidespeakAuth,
name: 'get-task-status',
displayName: 'Get Task Status',
description: 'Gets status of task by id.',
props: {
taskId: Property.ShortText({
displayName: 'Task ID',
required: true,
}),
},
async run(context) {
const { taskId } = context.propsValue;
const apiKey = context.auth;
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: BASE_URL + `/task_status/${taskId}`,
headers: {
'X-API-key': apiKey.secret_text,
},
});
return response.body;
},
});

View File

@@ -0,0 +1,64 @@
import { slidespeakAuth } from '../../index';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { createAction, Property } from '@activepieces/pieces-framework';
import FormData from 'form-data';
import { BASE_URL } from '../common/constants';
export const uploadDocumentAction = createAction({
auth: slidespeakAuth,
name: 'upload-docuemnt',
displayName: 'Upload Document',
description: 'Uploads a document file to SlideSpeak.',
props: {
file: Property.File({
displayName: 'File',
required: true,
}),
},
async run(context) {
const { file } = context.propsValue;
const apiKey = context.auth;
const formData = new FormData();
const fileBuffer = Buffer.from(file.base64, 'base64');
formData.append('file', fileBuffer, file.filename);
const response = await httpClient.sendRequest<{task_id:string}>({
method: HttpMethod.POST,
url: BASE_URL + '/document/upload',
headers: {
'X-API-key': apiKey.secret_text,
...formData.getHeaders(),
},
body:formData
});
if(!response || !response.body.task_id){
throw new Error('Failed to upload document.')
}
let status = 'FAILURE'
const timeoutAt = Date.now() + 5 * 60 * 1000;
const taskId = response.body.task_id
do
{
await new Promise((resolve) => setTimeout(resolve, 5000));
const pollRes = await httpClient.sendRequest<{task_id:string,task_status:string}>({
method:HttpMethod.GET,
url:BASE_URL + `/task_status/${taskId}`,
headers: {
'X-API-key': apiKey.secret_text,
}
})
status = pollRes.body.task_status
if(status === 'SUCCESS') return pollRes.body;
}while(status !== 'SUCCESS'&& Date.now() < timeoutAt )
throw new Error('Upload document timed out or failed.');
},
});

View File

@@ -0,0 +1 @@
export const BASE_URL = 'https://api.slidespeak.co/api/v1'

View File

@@ -0,0 +1,53 @@
import { slidespeakAuth } from '../../index';
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { isNil } from '@activepieces/shared';
import { BASE_URL } from '../common/constants';
export const newPresentationTrigger = createTrigger({
auth: slidespeakAuth,
name: 'new-presentation',
displayName: 'New Presentation',
description: 'Triggers when a new presentation is created.',
type: TriggerStrategy.WEBHOOK,
props: {},
async onEnable(context) {
const apiKey = context.auth;
const response = await httpClient.sendRequest<{ webhook_id: string }>({
method: HttpMethod.POST,
url: BASE_URL + '/webhook/subscribe',
headers: {
'X-API-key': apiKey.secret_text,
},
body: {
endpoint: context.webhookUrl,
},
});
await context.store.put<string>('webhook_id', response.body.webhook_id);
},
async onDisable(context) {
const webhookId = await context.store.get<string>('webhook_id');
const apiKey = context.auth;
if (!isNil(webhookId)) {
await httpClient.sendRequest({
method: HttpMethod.DELETE,
url: BASE_URL + '/webhook/unsubscribe',
headers: {
'X-API-key': apiKey.secret_text,
},
body: {
webhook_id: webhookId,
},
});
}
},
async run(context) {
return [context.payload.body];
},
sampleData: {
url: 'https://slidespeak-files.s3.us-east-2.amazonaws.com/e9c29f9f-0676-49ac-a550.pptx',
},
});