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,28 @@
{
"Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.": "Integrieren Sie mit Sitespeakai, um die KI-gestützten Chatbots zu nutzen und die Benutzerinteraktionen auf Ihrer Website zu verbessern.",
"**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n": "**Geben Sie Ihren SiteSpeakAI API-Schlüssel ein.**\n---\n### Wie Sie Ihren API-Schlüssel\nerhalten. Registrieren / anmelden unter [SiteSpeakAI](https://sitespeak.ai/).\n2. Gehen Sie zu **Dashboard → Einstellungen → API-Tasten**.\n3. Generieren oder kopieren Sie einen API-Schlüssel.\n4. Fügen Sie ihn hier ein.\n",
"Send Query": "Abfrage senden",
"Create Finetune": "Erstelle Finetune",
"Delete Finetune": "Finetune löschen",
"Sends a query to the specified chatbot and retrieves a response.": "Sendet eine Anfrage an den angegebenen Chatbot und ruft eine Antwort ab.",
"Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.": "Fügt eine neue Feinabstimmung (Frage + Antwort) für den angegebenen Chatbot in SiteSpeakAI hinzu.",
"Deletes a fine-tune entry from the selected chatbot.": "Löscht einen Feineintrag aus dem ausgewählten Chatbot.",
"chatbotId": "chatbotId",
"Prompt": "Prompt",
"Conversation": "Unterhaltung",
"Response Format": "Antwortformat",
"Question": "Frage",
"Suggested Answer": "Empfohlene Antwort",
"Finetune Entry": "Finetune Eintrag",
"Chat bot ID ": "Chat bot ID ",
"The question or query text you want the chatbot to answer.": "Die Frage oder der Abfragetext, den der Chatbot beantworten soll.",
"Pick a conversation for context, or leave empty to start a new one.": "Wählen Sie eine Konversation aus oder lassen Sie leer, um ein neues zu starten.",
"Format of the returned response; markdown or html.": "Format der zurückgegebenen Antwort; Markdown oder html.",
"The question text you want the chatbot to be able to answer.": "Der Fragentext, den Sie möchten, dass der Chatbot in der Lage ist zu beantworten.",
"The answer you suggest the chatbot use for that question.": "Die Antwort, die Sie dem Chatbot für diese Frage vorschlagen.",
"Select the finetune entry to delete.": "Wählen Sie den finetune-Eintrag zum Löschen aus.",
"Markdown": "Markdown",
"HTML": "HTML",
"New Lead": "Neuer Lead",
"Triggers when a new lead with an email address is created in SiteSpeakAI.": "Wird ausgelöst, wenn ein neuer Lead mit einer E-Mail-Adresse in SiteSpeakAI erstellt wird."
}

View File

@@ -0,0 +1,28 @@
{
"Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.": "Integre con Sitespeakai para aprovechar los chatbots impulsados por AIs y mejorar las interacciones de los usuarios en su sitio web.",
"**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n": "**Introduzca su clave API SiteSpeakAI.**\n---\n### Cómo obtener su clave API\n1. Regístrate / inicia sesión en [SiteSpeakAI](https://sitespeak.ai/).\n2. Ve al **Panel → Configuración → Claves API**.\n3. Genera o copia una clave API.\n4. Pégala aquí.\n",
"Send Query": "Enviar consulta",
"Create Finetune": "Crear Finetune",
"Delete Finetune": "Eliminar Finetune",
"Sends a query to the specified chatbot and retrieves a response.": "Envía una consulta al chatbot especificado y recupera una respuesta.",
"Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.": "Añade una nueva sintonización (pregunta + respuesta sugerida) para el chatbot especificado en SiteSpeakAI.",
"Deletes a fine-tune entry from the selected chatbot.": "Elimina una entrada afinada del chatbot seleccionado.",
"chatbotId": "chatbotId",
"Prompt": "Petición",
"Conversation": "Conversación",
"Response Format": "Formato de respuesta",
"Question": "Pregunta",
"Suggested Answer": "Respuesta sugerida",
"Finetune Entry": "Entrada Finetune",
"Chat bot ID ": "Chat bot ID ",
"The question or query text you want the chatbot to answer.": "El texto de pregunta o consulta que quieres que responda el chatbot.",
"Pick a conversation for context, or leave empty to start a new one.": "Escoge una conversación para el contexto, o deja vacío para iniciar una nueva.",
"Format of the returned response; markdown or html.": "Formato de la respuesta devuelta; markdown o html.",
"The question text you want the chatbot to be able to answer.": "El texto de la pregunta que quieres que el chatbot sea capaz de responder.",
"The answer you suggest the chatbot use for that question.": "La respuesta que sugieres el uso del chatbot para esa pregunta.",
"Select the finetune entry to delete.": "Seleccione la entrada finetune a eliminar.",
"Markdown": "Markdown",
"HTML": "HTML",
"New Lead": "Nuevo plomo",
"Triggers when a new lead with an email address is created in SiteSpeakAI.": "Dispara cuando un nuevo líder con una dirección de correo electrónico es creado en SiteSpeakAI."
}

View File

@@ -0,0 +1,28 @@
{
"Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.": "Intégrez avec Sitespeakai pour tirer parti des chatbots alimentés par l'IA et améliorer les interactions utilisateur sur votre site Web.",
"**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n": "**Entrez votre clé API SiteSpeakAI.**\n---\n### Comment obtenir votre clé API\n1. S'inscrire / se connecter à [SiteSpeakAI](https://sitespeak.ai/).\n2. Allez dans **Tableau de bord → Paramètres → Clés API**.\n3. Générez ou copiez une clé API.\n4. Collez-la ici.\n",
"Send Query": "Envoyer une requête",
"Create Finetune": "Créer Finetune",
"Delete Finetune": "Supprimer Finetune",
"Sends a query to the specified chatbot and retrieves a response.": "Envoie une requête au chatbot spécifié et récupère une réponse.",
"Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.": "Ajoute une nouvelle mise à jour (question + réponse suggérée) pour le chatbot spécifié dans SiteSpeakAI.",
"Deletes a fine-tune entry from the selected chatbot.": "Supprime une entrée de fine-tune du chatbot sélectionné.",
"chatbotId": "chatbotId",
"Prompt": "Prompt",
"Conversation": "Conversation",
"Response Format": "Format de réponse",
"Question": "Question",
"Suggested Answer": "Réponse suggérée",
"Finetune Entry": "Entrée Finetune",
"Chat bot ID ": "Chat bot ID ",
"The question or query text you want the chatbot to answer.": "Le texte de la question ou de la requête que vous voulez que le chatbot réponde.",
"Pick a conversation for context, or leave empty to start a new one.": "Choisissez une conversation pour le contexte, ou laissez vide pour en démarrer une nouvelle.",
"Format of the returned response; markdown or html.": "Format de la réponse retournée; markdown ou html.",
"The question text you want the chatbot to be able to answer.": "Le texte de la question que vous voulez que le chatbot soit en mesure de répondre.",
"The answer you suggest the chatbot use for that question.": "La réponse que vous suggérez à l'utilisation du chatbot pour cette question.",
"Select the finetune entry to delete.": "Sélectionnez l'entrée finetune à supprimer.",
"Markdown": "Markdown",
"HTML": "HTML",
"New Lead": "Nouveau prospect",
"Triggers when a new lead with an email address is created in SiteSpeakAI.": "Déclenche lorsqu'un nouveau prospect avec une adresse e-mail est créé dans SiteSpeakAI."
}

View File

@@ -0,0 +1,28 @@
{
"Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.": "Sitespeakaiと統合し、AIを活用したチャットボットを活用し、ウェブサイトでのユーザーのインタラクションを強化します。",
"**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n": "**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n",
"Send Query": "クエリを送信",
"Create Finetune": "Finetuneを作成",
"Delete Finetune": "Finetuneを削除",
"Sends a query to the specified chatbot and retrieves a response.": "指定したチャットボットにクエリを送信し、レスポンスを取得します。",
"Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.": "SiteSpeakAI で指定されたチャットボットに新しい微調整(質問 + 提案された回答)を追加します。",
"Deletes a fine-tune entry from the selected chatbot.": "選択したチャットボットから微調整項目を削除します。",
"chatbotId": "chatbotId",
"Prompt": "Prompt",
"Conversation": "会話",
"Response Format": "応答形式",
"Question": "質問",
"Suggested Answer": "提案された回答",
"Finetune Entry": "Finetune Entry",
"Chat bot ID ": "Chat bot ID ",
"The question or query text you want the chatbot to answer.": "チャットボットに回答させたい質問またはクエリテキスト。",
"Pick a conversation for context, or leave empty to start a new one.": "コンテキストの会話を選択するか、空白のままにして新しい会話を開始します。",
"Format of the returned response; markdown or html.": "返されるレスポンスのフォーマット。markdown または html 。",
"The question text you want the chatbot to be able to answer.": "チャットボットが答えられる質問テキストです。",
"The answer you suggest the chatbot use for that question.": "チャットボットがその質問に使用することをお勧めします。",
"Select the finetune entry to delete.": "削除する有限項目を選択します。",
"Markdown": "Markdown",
"HTML": "HTML",
"New Lead": "新しいリード",
"Triggers when a new lead with an email address is created in SiteSpeakAI.": "SiteSpeakAI にメールアドレスを持つ新しいリードが作成されたときにトリガーされます。"
}

View File

@@ -0,0 +1,28 @@
{
"Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.": "Integreer met Sitespeakai om AI-powered chatbots te gebruiken en de gebruikersinteracties op je website te verbeteren.",
"**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n": "**Voer je SiteSpeakAI API Key in.**\n---\n### Hoe je je API key\n1 kunt bemachtigen. Meld je aan / log in bij [SiteSpeakAI](https://sitespeak.ai/).\n2. Ga naar **Dashboard → Instellingen → API Keys**.\n3. Een API-sleutel genereren of kopiëren.\n4. Plak het hier.\n",
"Send Query": "Query verzenden",
"Create Finetune": "Finetune aanmaken",
"Delete Finetune": "Verwijder Finetune",
"Sends a query to the specified chatbot and retrieves a response.": "Verstuurt een query naar de opgegeven chatbot en haalt een antwoord op.",
"Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.": "Voegt een nieuwe fine-tune toe (vraag + voorgesteld antwoord) voor de opgegeven chatbot in SiteSpeakAI.",
"Deletes a fine-tune entry from the selected chatbot.": "Verwijdert een prima afstemming item van de geselecteerde chatbot.",
"chatbotId": "chatbotId",
"Prompt": "Prompt",
"Conversation": "Gesprek",
"Response Format": "Antwoord formaat",
"Question": "Vraag",
"Suggested Answer": "Voorgesteld antwoord",
"Finetune Entry": "Afronden Invoer",
"Chat bot ID ": "Chat bot ID ",
"The question or query text you want the chatbot to answer.": "De vraag of vraag naar de tekst die je wilt dat de chatbot beantwoordt.",
"Pick a conversation for context, or leave empty to start a new one.": "Kies een gesprek voor de context, of laat leeg om een nieuwe te starten.",
"Format of the returned response; markdown or html.": "Formaat van het geretourneerde antwoord; markdown of html.",
"The question text you want the chatbot to be able to answer.": "De vraagtekst die je wilt dat de chatbot kan beantwoorden.",
"The answer you suggest the chatbot use for that question.": "Het antwoord dat je de chatbot voorstelt voor die vraag.",
"Select the finetune entry to delete.": "Selecteer de finetune om te verwijderen.",
"Markdown": "Markdown",
"HTML": "HTML",
"New Lead": "Nieuwe Lead",
"Triggers when a new lead with an email address is created in SiteSpeakAI.": "Triggert wanneer een nieuwe lead met een e-mailadres wordt gemaakt in SiteSpeakAI."
}

View File

@@ -0,0 +1,28 @@
{
"Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.": "Integre com Sitespeakai para alavancar chatbots fortalecidos com IA e aprimorar as interações dos usuários em seu site.",
"**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n": "**Digite sua chave de API do SiteSpeakAI.**\n---\n### Como obter a sua chave de API\n1. Registrar-se / entrar em [SiteSpeakAI](https://sitespeak.ai/).\n2. Vá para **Painel → Configurações → Chaves API**.\n3. Gere ou copie uma chave API.\n4. Cole aqui.\n",
"Send Query": "Enviar consulta",
"Create Finetune": "Criar Finetune",
"Delete Finetune": "Excluir Finetune",
"Sends a query to the specified chatbot and retrieves a response.": "Envia uma consulta para o ChatBot especificado e obtém uma resposta.",
"Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.": "Adiciona uma nova melodia (pergunta + resposta sugerida) para o ChatBot especificado no SiteSpeakAI.",
"Deletes a fine-tune entry from the selected chatbot.": "Exclui uma entrada refinada do ChatBot selecionado.",
"chatbotId": "chatbotId",
"Prompt": "Aviso",
"Conversation": "Conversa",
"Response Format": "Formato de Resposta",
"Question": "Questão",
"Suggested Answer": "Resposta sugerida",
"Finetune Entry": "Entrada de Finetune",
"Chat bot ID ": "Chat bot ID ",
"The question or query text you want the chatbot to answer.": "A pergunta ou o texto de consulta que você quer que o ChatBot responda.",
"Pick a conversation for context, or leave empty to start a new one.": "Escolha uma conversa para o contexto, ou deixe vazio para iniciar uma nova.",
"Format of the returned response; markdown or html.": "Formato da resposta retornada; markdown ou html.",
"The question text you want the chatbot to be able to answer.": "O texto da pergunta que você quer que o ChatBot seja capaz de responder.",
"The answer you suggest the chatbot use for that question.": "A resposta que você sugere que o ChatBot use para essa pergunta.",
"Select the finetune entry to delete.": "Selecione a entrada finetune para excluir.",
"Markdown": "Markdown",
"HTML": "HTML",
"New Lead": "Novo Potencial",
"Triggers when a new lead with an email address is created in SiteSpeakAI.": "Aciona quando um novo lead com um endereço de e-mail é criado no SiteSpeakAI."
}

View File

@@ -0,0 +1,28 @@
{
"Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.": "Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.",
"**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n": "**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n",
"Send Query": "Send Query",
"Create Finetune": "Create Finetune",
"Delete Finetune": "Delete Finetune",
"Sends a query to the specified chatbot and retrieves a response.": "Sends a query to the specified chatbot and retrieves a response.",
"Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.": "Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.",
"Deletes a fine-tune entry from the selected chatbot.": "Deletes a fine-tune entry from the selected chatbot.",
"chatbotId": "chatbotId",
"Prompt": "Prompt",
"Conversation": "Conversation",
"Response Format": "Response Format",
"Question": "Question",
"Suggested Answer": "Suggested Answer",
"Finetune Entry": "Finetune Entry",
"Chat bot ID ": "Chat bot ID ",
"The question or query text you want the chatbot to answer.": "The question or query text you want the chatbot to answer.",
"Pick a conversation for context, or leave empty to start a new one.": "Pick a conversation for context, or leave empty to start a new one.",
"Format of the returned response; markdown or html.": "Format of the returned response; markdown or html.",
"The question text you want the chatbot to be able to answer.": "The question text you want the chatbot to be able to answer.",
"The answer you suggest the chatbot use for that question.": "The answer you suggest the chatbot use for that question.",
"Select the finetune entry to delete.": "Select the finetune entry to delete.",
"Markdown": "Markdown",
"HTML": "HTML",
"New Lead": "New Lead",
"Triggers when a new lead with an email address is created in SiteSpeakAI.": "Triggers when a new lead with an email address is created in SiteSpeakAI."
}

View File

@@ -0,0 +1,28 @@
{
"Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.": "Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.",
"**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n": "**Enter your SiteSpeakAI API Key.**\n---\n### How to obtain your API key\n1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).\n2. Go to **Dashboard → Settings → API Keys**.\n3. Generate or copy an API key.\n4. Paste it here.\n",
"Send Query": "Send Query",
"Create Finetune": "Create Finetune",
"Delete Finetune": "Delete Finetune",
"Sends a query to the specified chatbot and retrieves a response.": "Sends a query to the specified chatbot and retrieves a response.",
"Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.": "Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.",
"Deletes a fine-tune entry from the selected chatbot.": "Deletes a fine-tune entry from the selected chatbot.",
"chatbotId": "chatbotId",
"Prompt": "Prompt",
"Conversation": "Conversation",
"Response Format": "Response Format",
"Question": "Question",
"Suggested Answer": "Suggested Answer",
"Finetune Entry": "Finetune Entry",
"Chat bot ID ": "Chat bot ID ",
"The question or query text you want the chatbot to answer.": "The question or query text you want the chatbot to answer.",
"Pick a conversation for context, or leave empty to start a new one.": "Pick a conversation for context, or leave empty to start a new one.",
"Format of the returned response; markdown or html.": "Format of the returned response; markdown or html.",
"The question text you want the chatbot to be able to answer.": "The question text you want the chatbot to be able to answer.",
"The answer you suggest the chatbot use for that question.": "The answer you suggest the chatbot use for that question.",
"Select the finetune entry to delete.": "Select the finetune entry to delete.",
"Markdown": "Markdown",
"HTML": "HTML",
"New Lead": "New Lead",
"Triggers when a new lead with an email address is created in SiteSpeakAI.": "Triggers when a new lead with an email address is created in SiteSpeakAI."
}

View File

@@ -0,0 +1,20 @@
import { createPiece, PieceAuth } from "@activepieces/pieces-framework";
import { sendQuery } from "./lib/actions/send-query";
import { createFinetune } from "./lib/actions/create-finetune";
import { deleteFinetune } from "./lib/actions/delete-finetune";
import { newLead } from "./lib/triggers/new-lead";
import { SiteSpeakAuth } from "./lib/common/auth";
import { PieceCategory } from "@activepieces/shared";
export const sitespeakai = createPiece({
displayName: "SiteSpeakAI",
description: "Integrate with Sitespeakai to leverage AI-powered chatbots and enhance user interactions on your website.",
auth: SiteSpeakAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: "https://cdn.activepieces.com/pieces/sitespeakai.png",
categories:[PieceCategory.ARTIFICIAL_INTELLIGENCE],
authors: ["Niket2035"],
actions: [sendQuery, createFinetune, deleteFinetune],
triggers: [newLead],
});

View File

@@ -0,0 +1,40 @@
import { createAction, Property } from "@activepieces/pieces-framework";
import { SiteSpeakAuth } from "../common/auth";
import { makeRequest } from "../common/client";
import { HttpMethod } from "@activepieces/pieces-common";
import { chatbotIdDropdown } from "../common/dropdown";
export const createFinetune = createAction({
auth: SiteSpeakAuth,
name: 'create_finetune',
displayName: 'Create Finetune',
description: 'Adds a new fine-tune (question + suggested answer) for the specified chatbot in SiteSpeakAI.',
props: {
chatbotId: chatbotIdDropdown,
question: Property.LongText({
displayName: 'Question',
required: true,
description: 'The question text you want the chatbot to be able to answer.',
}),
suggestedAnswer: Property.LongText({
displayName: 'Suggested Answer',
required: true,
description: 'The answer you suggest the chatbot use for that question.',
}),
},
async run({ auth, propsValue }) {
const body = {
question: propsValue.question,
suggested_answer: propsValue.suggestedAnswer,
};
const response = await makeRequest(
auth.secret_text,
HttpMethod.POST,
`/${propsValue.chatbotId}/finetunes`,
body
);
return response;
},
});

View File

@@ -0,0 +1,30 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { SiteSpeakAuth } from '../common/auth';
import { makeRequest } from '../common/client';
import { HttpMethod } from '@activepieces/pieces-common';
import { chatbotIdDropdown, finetuneIdDropdown } from '../common/dropdown';
export const deleteFinetune = createAction({
name: 'delete_finetune',
displayName: 'Delete Finetune',
description: 'Deletes a fine-tune entry from the selected chatbot.',
auth: SiteSpeakAuth,
props: {
chatbotId: chatbotIdDropdown,
finetuneId: finetuneIdDropdown,
},
async run({ auth, propsValue }) {
const props = propsValue as { chatbotId: string; finetuneId: string };
const response = await makeRequest(
auth.secret_text,
HttpMethod.DELETE,
`/${props.chatbotId}/finetunes/${props.finetuneId}`
);
return {
success: true,
data: response,
};
},
});

View File

@@ -0,0 +1,55 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { SiteSpeakAuth } from '../common/auth';
import { HttpMethod } from '@activepieces/pieces-common';
import { makeRequest } from '../common/client';
import { chatbotIdDropdown, conversationIdDropdown } from '../common/dropdown';
export const sendQuery = createAction({
auth: SiteSpeakAuth,
name: 'sendQuery',
displayName: 'Send Query',
description:
'Sends a query to the specified chatbot and retrieves a response.',
props: {
chatbotId: chatbotIdDropdown,
prompt: Property.LongText({
displayName: 'Prompt',
required: true,
description: 'The question or query text you want the chatbot to answer.',
}),
conversationId: conversationIdDropdown,
format: Property.StaticDropdown({
displayName: 'Response Format',
required: false,
defaultValue: 'markdown',
options: {
disabled: false,
options: [
{ label: 'Markdown', value: 'markdown' },
{ label: 'HTML', value: 'html' },
],
},
description: 'Format of the returned response; markdown or html.',
}),
},
async run({ auth, propsValue }) {
const body: Record<string, any> = {
prompt: propsValue.prompt,
};
if (propsValue.conversationId) {
body['conversation_id'] = propsValue.conversationId;
}
if (propsValue.format) {
body['format'] = propsValue.format;
}
const response = await makeRequest(
auth.secret_text,
HttpMethod.POST,
`/${propsValue.chatbotId}/query`,
body
);
return response;
},
});

View File

@@ -0,0 +1,36 @@
import { PieceAuth } from "@activepieces/pieces-framework";
import { makeRequest } from "./client";
import { HttpMethod } from "@activepieces/pieces-common";
export const SiteSpeakAuth = PieceAuth.SecretText({
displayName: 'SiteSpeakAI API Key',
description: `**Enter your SiteSpeakAI API Key.**
---
### How to obtain your API key
1. Sign up / log in at [SiteSpeakAI](https://sitespeak.ai/).
2. Go to **Dashboard → Settings → API Keys**.
3. Generate or copy an API key.
4. Paste it here.
`,
required: true,
validate: async ({ auth }) => {
if (!auth) {
return {
valid: false,
error: 'API Key is required',
};
}
try {
await makeRequest(auth as string, HttpMethod.GET, `/me`);
return {
valid: true,
};
} catch (error) {
return {
valid: false,
error: 'Invalid SiteSpeakAI API Key',
};
}
},
});

View File

@@ -0,0 +1,22 @@
import { HttpMethod, httpClient } from '@activepieces/pieces-common';
export const BASE_URL = `https://api.sitespeak.ai/v1`;
export async function makeRequest(
api_key: string, method: HttpMethod, path: string, body?: unknown, p0?: { Accept: string; }) {
try {
const response = await httpClient.sendRequest({
method,
url: `${BASE_URL}${path}`,
headers: {
Authorization: `Bearer ${api_key}`,
'Content-Type': 'application/json',
},
body,
});
return response.body;
} catch (error: any) {
throw new Error(`Unexpected error: ${error.message || String(error)}`);
}
}

View File

@@ -0,0 +1,129 @@
import { Property } from "@activepieces/pieces-framework";
import { makeRequest } from "./client";
import { HttpMethod } from "@activepieces/pieces-common";
import { SiteSpeakAuth } from "./auth";
export const chatbotIdDropdown = Property.Dropdown({
auth: SiteSpeakAuth,
displayName: 'chatbotId',
description: 'Chat bot ID ',
required: false,
refreshers: ['auth'],
async options({ auth, }) {
if (!auth ) {
return {
disabled: true,
options: [],
placeholder: 'Select a chatbot first',
};
}
try {
const response = await makeRequest(
auth.secret_text,
HttpMethod.GET,
`/me/chatbots`
);
return {
disabled: false,
options: response.map((chatbot: any) => ({
label: chatbot.name || chatbot.id,
value: chatbot.id,
})),
};
} catch (e: any) {
return {
disabled: true,
options: [],
placeholder: 'Failed to fetch conversations',
};
}
},
});
export const conversationIdDropdown = Property.Dropdown<string,false,typeof SiteSpeakAuth>({
auth: SiteSpeakAuth,
displayName: 'Conversation',
description: 'Pick a conversation for context, or leave empty to start a new one.',
required: false,
refreshers: ['chatbotId'],
async options({ auth, chatbotId }) {
if (!auth || !chatbotId) {
return {
disabled: true,
options: [],
placeholder: "Select a chatbot first",
};
}
try {
const response = await makeRequest(
auth.secret_text,
HttpMethod.GET,
`/${chatbotId}/conversations`
);
return {
disabled: false,
options: response.map((conv: any) => ({
label: `Speaker: ${conv.speaker}, Started: ${new Date(conv.created_at).toLocaleDateString()}` || conv.id,
value: conv.id,
})),
};
} catch (e: any) {
return {
disabled: true,
options: [],
placeholder: "Failed to fetch conversations",
};
}
},
});
export const finetuneIdDropdown = Property.Dropdown<string,true,typeof SiteSpeakAuth>({
auth: SiteSpeakAuth,
displayName: 'Finetune Entry',
description: 'Select the finetune entry to delete.',
required: true,
refreshers: ['chatbotId'],
async options({ auth, chatbotId }) {
if (!auth || !chatbotId) {
return {
disabled: true,
options: [],
placeholder: "Please enter/select a chatbot ID first",
};
}
try {
const response = await makeRequest(
auth.secret_text,
HttpMethod.GET,
`/${chatbotId}/finetunes`
);
if (!response || response.length === 0) {
return {
disabled: true,
options: [],
placeholder: "No finetune entries found for this chatbot",
};
}
return {
disabled: false,
options: response.map((item: any) => ({
label: item.question || item.id,
value: item.id,
})),
};
} catch (e: any) {
return {
disabled: true,
options: [],
placeholder: "Failed to fetch finetune entries",
};
}
},
});

View File

@@ -0,0 +1,74 @@
import { createTrigger, TriggerStrategy, StaticPropsValue, AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework';
import { DedupeStrategy, Polling, pollingHelper, HttpMethod } from '@activepieces/pieces-common';
import dayjs from 'dayjs';
import { makeRequest } from '../common/client';
import { SiteSpeakAuth } from '../common/auth';
import { chatbotIdDropdown } from '../common/dropdown';
const props = {
chatbotId: chatbotIdDropdown,
}
const polling: Polling<AppConnectionValueForAuthProperty<typeof SiteSpeakAuth>, StaticPropsValue<typeof props>> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
if (!propsValue.chatbotId) {
return [];
}
const response = await makeRequest(
auth.secret_text,
HttpMethod.GET,
`/${propsValue.chatbotId}/leads`,
undefined,
{
Accept: 'application/json',
}
);
console.log(response);
const leads = response || [];
return leads
.filter((lead: any) => lead.email)
.map((lead: any) => ({
epochMilliSeconds: dayjs(lead.created_at).valueOf(),
data: lead,
}));
},
};
export const newLead = createTrigger({
auth: SiteSpeakAuth,
name: 'newLead',
displayName: 'New Lead',
description: 'Triggers when a new lead with an email address is created in SiteSpeakAI.',
props,
sampleData: {
id: 'lead_12345',
chatbot_id: 'chatbot_6789',
visitor_id: 'visitor_9876',
name: 'John Doe',
email: 'john.doe@example.com',
phone: null,
status: 'read',
last_entry_at: '2023-09-30 13:10:39',
created_at: '2023-09-30 13:10:19',
updated_at: '2023-10-03 05:49:48',
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(polling, context);
},
async onEnable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onEnable(polling, { store, auth, propsValue });
},
async onDisable(context) {
const { store, auth, propsValue } = context;
await pollingHelper.onDisable(polling, { store, auth, propsValue });
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
});