2048 lines
93 KiB
PHP
2048 lines
93 KiB
PHP
<?php
|
|
|
|
const TEMPLATE_RUNTIMES = [
|
|
'NODE' => [
|
|
'name' => 'node',
|
|
'versions' => ['21.0', '20.0', '19.0', '18.0', '16.0', '14.5']
|
|
],
|
|
'PHP' => [
|
|
'name' => 'php',
|
|
'versions' => ['8.3', '8.2', '8.1', '8.0']
|
|
],
|
|
'RUBY' => [
|
|
'name' => 'ruby',
|
|
'versions' => ['3.3', '3.2', '3.1', '3.0']
|
|
],
|
|
'PYTHON' => [
|
|
'name' => 'python',
|
|
'versions' => ['3.12', '3.11', '3.10', '3.9', '3.8']
|
|
],
|
|
'DART' => [
|
|
'name' => 'dart',
|
|
'versions' => ['3.3', '3.1', '3.0', '2.19', '2.18', '2.17', '2.16', '2.16']
|
|
],
|
|
'BUN' => [
|
|
'name' => 'bun',
|
|
'versions' => ['1.0']
|
|
],
|
|
'GO' => [
|
|
'name' => 'go',
|
|
'versions' => ['1.22']
|
|
]
|
|
];
|
|
|
|
function getRuntimes($runtime, $commands, $entrypoint, $providerRootDirectory, $versionsDenyList = [])
|
|
{
|
|
return array_map(function ($version) use ($runtime, $commands, $entrypoint, $providerRootDirectory) {
|
|
return [
|
|
'name' => $runtime['name'] . '-' . $version,
|
|
'commands' => $commands,
|
|
'entrypoint' => $entrypoint,
|
|
'providerRootDirectory' => $providerRootDirectory
|
|
];
|
|
}, array_filter($runtime['versions'], function ($version) use ($versionsDenyList) {
|
|
return !in_array($version, $versionsDenyList);
|
|
}));
|
|
}
|
|
|
|
return [
|
|
[
|
|
'icon' => 'icon-lightning-bolt',
|
|
'id' => 'starter',
|
|
'name' => 'Starter function',
|
|
'tagline' =>
|
|
'A simple function to get started. Edit this function to explore endless possibilities with Appwrite Functions.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['starter'],
|
|
'runtimes' => [
|
|
...getRuntimes(TEMPLATE_RUNTIMES['NODE'], 'npm install', 'src/main.js', 'node/starter'),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PHP'],
|
|
'composer install',
|
|
'src/index.php',
|
|
'php/starter'
|
|
),
|
|
...getRuntimes(TEMPLATE_RUNTIMES['RUBY'], 'bundle install', 'lib/main.rb', 'ruby/starter'),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PYTHON'],
|
|
'pip install -r requirements.txt',
|
|
'src/main.py',
|
|
'python/starter'
|
|
),
|
|
...getRuntimes(TEMPLATE_RUNTIMES['DART'], 'dart pub get', 'lib/main.dart', 'dart/starter'),
|
|
...getRuntimes(TEMPLATE_RUNTIMES['BUN'], 'bun install', 'src/main.ts', 'bun/starter'),
|
|
...getRuntimes(TEMPLATE_RUNTIMES['GO'], '', 'main.go', 'go/starter')
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/starter">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [],
|
|
'scopes' => ["users.read"]
|
|
],
|
|
[
|
|
'icon' => 'icon-upstash',
|
|
'id' => 'query-upstash-vector',
|
|
'name' => 'Query Upstash Vector',
|
|
'tagline' => 'Vector database that stores text embeddings and context retrieval for LLMs',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['databases'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/query-upstash-vector'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/query-upstash-vector">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'UPSTASH_URL',
|
|
'description' => 'The endpoint to connect to your Upstash Vector database. <a class="u-bold" target="_blank" href="https://upstash.com/docs/vector/overall/getstarted">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'https://resolved-mallard-84564-eu1-vector.upstash.io',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'UPSTASH_TOKEN',
|
|
'description' => 'Authentication token to access your Upstash Vector database. <a class="u-bold" target="_blank" href="https://upstash.com/docs/vector/overall/getstarted">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' =>
|
|
'oe4wNTbwHVLcDNa6oceZfhBEABsCNYh43ii6Xdq4bKBH7mq7qJkUmc4cs3ABbYyuVKWZTxVQjiNjYgydn2dkhABNes4NAuDpj7qxUAmZYqGJT78',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-redis',
|
|
'id' => 'query-redis-labs',
|
|
'name' => 'Query Redis Labs',
|
|
'tagline' => 'Key-value database with advanced caching capabilities.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['databases'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/query-redis-labs'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/query-redis-labs">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'REDIS_HOST',
|
|
'description' => 'The endpoint to connect to your Redis database. <a class="u-bold" target="_blank" href="https://redis.io/docs/latest/operate/rc/rc-quickstart/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'redis-13258.c35.eu-central-1-1.ec2.redns.redis-cloud.com',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'REDIS_PASSWORD',
|
|
'description' => 'Authentication password to access your Redis database. <a class="u-bold" target="_blank" href="https://redis.io/docs/latest/operate/rc/rc-quickstart/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'efNNehiACfcZiwsTAjcK6xiwPyu6Dpdq',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-neo4j',
|
|
'id' => 'query-neo4j-auradb',
|
|
'name' => 'Query Neo4j AuraDB',
|
|
'tagline' => 'Graph database with focus on relations between data.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['databases'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/query-neo4j-auradb'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/query-neo4j-auradb">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'NEO4J_URI',
|
|
'description' => 'The endpoint to connect to your Neo4j database. <a class="u-bold" target="_blank" href="https://neo4j.com/docs/aura/auradb/getting-started/connect-database/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'neo4j+s://4tg4mddo.databases.neo4j.io',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'NEO4J_USER',
|
|
'description' => 'Authentication user to access your Neo4j database. <a class="u-bold" target="_blank" href="https://neo4j.com/docs/aura/auradb/getting-started/connect-database/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'neo4j',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'NEO4J_PASSWORD',
|
|
'description' => 'Authentication password to access your Neo4j database. <a class="u-bold" target="_blank" href="https://neo4j.com/docs/aura/auradb/getting-started/connect-database/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'mCUc4PbVUQN-_NkTLJLisb6ccnwzQKKhrkF77YMctzx',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-mongodb',
|
|
'id' => 'query-mongo-atlas',
|
|
'name' => 'Query MongoDB Atlas',
|
|
'tagline' =>
|
|
'Realtime NoSQL document database with geospecial, graph, search, and vector suport.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['databases'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/query-mongo-atlas'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/query-mongo-atlas">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'MONGO_URI',
|
|
'description' => 'The endpoint to connect to your Mongo database. <a class="u-bold" target="_blank" href="https://www.mongodb.com/docs/atlas/getting-started/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' =>
|
|
'mongodb+srv://appwrite:Yx42hafg7Q4fgkxe@cluster0.7mslfog.mongodb.net/?retryWrites=true&w=majority&appName=Appwrite',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-neon',
|
|
'id' => 'query-neon-postgres',
|
|
'name' => 'Query Neon Postgres',
|
|
'tagline' =>
|
|
'Reliable SQL database with replication, point-in-time recovery, and pgvector support.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['databases'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/query-neon-postgres'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/query-neon-postgres">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'PGHOST',
|
|
'description' => 'The endpoint to connect to your Postgres database. <a class="u-bold" target="_blank" href="https://neon.tech/docs/get-started-with-neon/signing-up/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'ep-still-sea-a792sh84.eu-central-1.aws.neon.tech',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'PGDATABASE',
|
|
'description' => 'Name of our Postgres database. <a class="u-bold" target="_blank" href="https://neon.tech/docs/get-started-with-neon/signing-up/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'main',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'PGUSER',
|
|
'description' => 'Name of our Postgres user for authentication. <a class="u-bold" target="_blank" href="https://neon.tech/docs/get-started-with-neon/signing-up/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'main_owner',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'PGPASSWORD',
|
|
'description' => 'Password of our Postgres user for authentication. <a class="u-bold" target="_blank" href="https://neon.tech/docs/get-started-with-neon/signing-up/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'iQCfaUaaWB3B',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'ENDPOINT_ID',
|
|
'description' => 'Endpoint ID provided for your Postgres database. <a class="u-bold" target="_blank" href="https://neon.tech/docs/get-started-with-neon/signing-up/">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'ep-still-sea-a792sh84',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-open-ai',
|
|
'id' => 'prompt-chatgpt',
|
|
'name' => 'Prompt ChatGPT',
|
|
'tagline' => 'Ask questions and let OpenAI GPT-3.5-turbo answer.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/prompt-chatgpt'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PYTHON'],
|
|
'pip install -r requirements.txt',
|
|
'src/main.py',
|
|
'python/prompt_chatgpt'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PHP'],
|
|
'composer install',
|
|
'src/index.php',
|
|
'php/prompt-chatgpt'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['DART'],
|
|
'dart pub get',
|
|
'lib/main.dart',
|
|
'dart/prompt_chatgpt'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/prompt-chatgpt">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'OPENAI_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the OpenAI API. This is a paid service and you will be charged for each request made to the API. <a class="u-bold" target="_blank" href="https://platform.openai.com/docs/quickstart/add-your-api-key">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'sk-wzG...vcy',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'OPENAI_MAX_TOKENS',
|
|
'description' => 'The maximum number of tokens that the OpenAI response should contain. Be aware that OpenAI models read and write a maximum number of tokens per API call, which varies depending on the model. For GPT-3.5-turbo, the limit is 4096 tokens. <a class="u-bold" target="_blank" href="https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them">Learn more</a>.',
|
|
'value' => '512',
|
|
'placeholder' => '512',
|
|
'required' => false,
|
|
'type' => 'number'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-discord',
|
|
'id' => 'discord-command-bot',
|
|
'name' => 'Discord Command Bot',
|
|
'tagline' => 'Simple command using Discord Interactions.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['messaging'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install && npm run setup',
|
|
'src/main.js',
|
|
'node/discord-command-bot'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PYTHON'],
|
|
'pip install -r requirements.txt && python src/setup.py',
|
|
'src/main.py',
|
|
'python/discord_command_bot'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['GO'],
|
|
'',
|
|
'main.go',
|
|
'go/discord-command-bot'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/discord-command-bot">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'DISCORD_PUBLIC_KEY',
|
|
'description' => 'Public Key of your application in Discord Developer Portal. <a class="u-bold" target="_blank" href="https://discord.com/developers/docs/tutorials/hosting-on-cloudflare-workers#creating-an-app-on-discord">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'db9...980',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'DISCORD_APPLICATION_ID',
|
|
'description' => 'ID of your application in Discord Developer Portal. <a class="u-bold" target="_blank" href="https://discord.com/developers/docs/tutorials/hosting-on-cloudflare-workers#creating-an-app-on-discord">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => '427...169',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'DISCORD_TOKEN',
|
|
'description' => 'Bot token of your application in Discord Developer Portal. <a class="u-bold" target="_blank" href="https://discord.com/developers/docs/tutorials/hosting-on-cloudflare-workers#creating-an-app-on-discord">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'NDI...LUfg',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-perspective-api',
|
|
'id' => 'analyze-with-perspectiveapi',
|
|
'name' => 'Analyze with PerspectiveAPI',
|
|
'tagline' => 'Automate moderation by getting toxicity of messages.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/analyze-with-perspectiveapi'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/analyze-with-perspectiveapi">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'PERSPECTIVE_API_KEY',
|
|
'description' => 'Google Perspective API key. It authenticates your function, allowing it to interact with the API. <a class="u-bold" target="_blank" href="https://developers.google.com/codelabs/setup-perspective-api">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'AIzaS...fk-fuM',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-pangea',
|
|
'id' => 'censor-with-redact',
|
|
'name' => 'Censor with Redact',
|
|
'tagline' =>
|
|
'Censor sensitive information from a provided text string using Redact API by Pangea.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/censor-with-redact'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PYTHON'],
|
|
'pip install -r requirements.txt',
|
|
'src/main.py',
|
|
'python/censor_with_redact'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['DART'],
|
|
'dart pub get',
|
|
'lib/main.dart',
|
|
'dart/censor_with_redact'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/censor-with-redact">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'PANGEA_REDACT_TOKEN',
|
|
'description' => 'Access token for the Pangea Redact API. <a class="u-bold" target="_blank" href="https://pangea.cloud/docs/redact/getting-started/configuration">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'pts_7p4...5wl4',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-document',
|
|
'id' => 'generate-pdf',
|
|
'name' => 'Generate PDF',
|
|
'tagline' => 'Document containing sample invoice in PDF format.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['utilities'],
|
|
'runtimes' => [
|
|
...getRuntimes(TEMPLATE_RUNTIMES['NODE'], 'npm install', 'src/main.js', 'node/generate-pdf')
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/generate-pdf">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => []
|
|
],
|
|
[
|
|
'icon' => 'icon-github',
|
|
'id' => 'github-issue-bot',
|
|
'name' => 'GitHub issue bot',
|
|
'tagline' =>
|
|
'Automate the process of responding to newly opened issues in a GitHub repository.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['dev-tools'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/github-issue-bot'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/github-issue-bot">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'GITHUB_TOKEN',
|
|
'description' => 'A personal access token from GitHub with the necessary permissions to post comments on issues. <a class="u-bold" target="_blank" href="https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'ghp_1...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'GITHUB_WEBHOOK_SECRET',
|
|
'description' => 'The secret used to verify that the webhook request comes from GitHub. <a class="u-bold" target="_blank" href="https://docs.github.com/en/developers/webhooks-and-events/securing-your-webhooks">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'd1efb...aec35',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-bookmark',
|
|
'id' => 'url-shortener',
|
|
'name' => 'URL shortener',
|
|
'tagline' => 'Generate URL with short ID and redirect to the original URL when visited.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['utilities'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/url-shortener'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/url-shortener">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database to store the short URLs. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'value' => 'urlShortener',
|
|
'placeholder' => 'urlShortener',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection to store the short URLs. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'value' => 'urls',
|
|
'placeholder' => 'urls',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'SHORT_BASE_URL',
|
|
'description' => 'The domain to use for the short URLs. You can use your functions subdomain or a custom domain.',
|
|
'value' => '',
|
|
'placeholder' => 'https://shortdomain.io',
|
|
'required' => true,
|
|
'type' => 'url'
|
|
]
|
|
],
|
|
'scopes' => ["databases.read", "databases.write", "collections.write", "attributes.write", "documents.read", "documents.write"]
|
|
],
|
|
[
|
|
'icon' => 'icon-algolia',
|
|
'id' => 'sync-with-algolia',
|
|
'name' => 'Sync with Algolia',
|
|
'tagline' => 'Intuitive search bar for any data in Appwrite Databases.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['databases'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/sync-with-algolia'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PYTHON'],
|
|
'pip install -r requirements.txt',
|
|
'src/main.py',
|
|
'python/sync_with_algolia'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PHP'],
|
|
'composer install',
|
|
'src/index.php',
|
|
'php/sync-with-algolia'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/sync-with-algolia">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the Appwrite database that contains the collection to sync. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'placeholder' => '64a55...7b912',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection in the Appwrite database to sync. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'placeholder' => '7c3e8...2a9f1',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'ALGOLIA_APP_ID',
|
|
'description' => 'The ID of the application in Algolia. <a class="u-bold" target="_blank" href="https://support.algolia.com/hc/en-us/articles/11040113398673-Where-can-I-find-my-application-ID-and-the-index-name-">Learn more</a>.',
|
|
'placeholder' => 'OFCNCOG2CU',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'ALGOLIA_ADMIN_API_KEY',
|
|
'description' => 'The admin API Key for your Algolia service. <a class="u-bold" target="_blank" href="https://www.algolia.com/doc/guides/security/api-keys/">Learn more</a>.',
|
|
'placeholder' => 'fd0aa...136a8',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'ALGOLIA_INDEX_ID',
|
|
'description' => 'The ID of the index in Algolia where the documents are to be synced. <a class="u-bold" target="_blank" href="https://www.algolia.com/doc/api-client/methods/indexing/">Learn more</a>.',
|
|
'placeholder' => 'my_index',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'ALGOLIA_SEARCH_API_KEY',
|
|
'description' => 'The search API Key for your Algolia service. This key is used for searching the synced index. <a class="u-bold" target="_blank" href="https://www.algolia.com/doc/guides/security/api-keys/">Learn more</a>.',
|
|
'placeholder' => 'bf2f5...df733',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
],
|
|
'scopes' => ["databases.read", "collections.read", "documents.read"]
|
|
],
|
|
[
|
|
'icon' => 'icon-meilisearch',
|
|
'id' => 'sync-with-meilisearch',
|
|
'name' => 'Sync with Meilisearch',
|
|
'tagline' => 'Intuitive search bar for any data in Appwrite Databases.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['databases'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/sync-with-meilisearch'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PYTHON'],
|
|
'pip install -r requirements.txt',
|
|
'src/main.py',
|
|
'python/sync-with-meilisearch'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PHP'],
|
|
'composer install',
|
|
'src/index.php',
|
|
'php/sync-with-meilisearch'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['BUN'],
|
|
'bun install',
|
|
'src/main.ts',
|
|
'bun/sync-with-meilisearch'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['RUBY'],
|
|
'bundle install',
|
|
'lib/main.rb',
|
|
'ruby/sync-with-meilisearch'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/sync-with-meilisearch">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the Appwrite database that contains the collection to sync. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'placeholder' => '64a55...7b912',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection in the Appwrite database to sync. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'placeholder' => '7c3e8...2a9f1',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'MEILISEARCH_ENDPOINT',
|
|
'description' => 'The host URL of the Meilisearch server. <a class="u-bold" target="_blank" href="https://www.meilisearch.com/docs/learn/getting_started/quick_start/">Learn more</a>.',
|
|
'placeholder' => 'http://127.0.0.1:7700',
|
|
'required' => true,
|
|
'type' => 'url'
|
|
],
|
|
[
|
|
'name' => 'MEILISEARCH_ADMIN_API_KEY',
|
|
'description' => 'The admin API key for Meilisearch. <a class="u-bold" target="_blank" href="https://docs.meilisearch.com/reference/api/keys/">Learn more</a>.',
|
|
'placeholder' => 'masterKey1234',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'MEILISEARCH_SEARCH_API_KEY',
|
|
'description' => 'API Key for Meilisearch search operations. <a class="u-bold" target="_blank" href="https://www.algolia.com/doc/guides/security/api-keys/">Learn more</a>.',
|
|
'placeholder' => 'searchKey1234',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'MEILISEARCH_INDEX_NAME',
|
|
'description' => 'Name of the Meilisearch index to which the documents will be synchronized. <a class="u-bold" target="_blank" href="https://www.meilisearch.com/docs/learn/core_concepts/indexes/">Learn more</a>.',
|
|
'placeholder' => 'appwrite_index',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
],
|
|
'scopes' => ["databases.read", "collections.read", "documents.read"]
|
|
],
|
|
[
|
|
'icon' => 'icon-vonage',
|
|
'id' => 'whatsapp-with-vonage',
|
|
'name' => 'WhatsApp with Vonage',
|
|
'tagline' => 'Simple bot to answer WhatsApp messages.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['messaging'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/whatsapp-with-vonage'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PYTHON'],
|
|
'pip install -r requirements.txt',
|
|
'src/main.py',
|
|
'python/whatsapp_with_vonage'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PHP'],
|
|
'composer install',
|
|
'src/index.php',
|
|
'php/whatsapp-with-vonage'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['DART'],
|
|
'dart pub get',
|
|
'lib/main.dart',
|
|
'dart/whatsapp-with-vonage'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['RUBY'],
|
|
'bundle install',
|
|
'lib/main.rb',
|
|
'ruby/whatsapp-with-vonage'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['BUN'],
|
|
'bun install',
|
|
'src/main.ts',
|
|
'bun/whatsapp-with-vonage'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/whatsapp-with-vonage">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'VONAGE_API_KEY',
|
|
'description' => 'API Key to use the Vonage API. <a class="u-bold" target="_blank" href="https://api.support.vonage.com/hc/en-us/articles/204014493-How-do-I-find-my-Voice-API-key-and-API-secret-">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => '62...97',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'VONAGE_API_SECRET',
|
|
'description' => 'Secret to use the Vonage API. <a class="u-bold" target="_blank" href="https://api.support.vonage.com/hc/en-us/articles/204014493-How-do-I-find-my-Voice-API-key-and-API-secret-">Learn more</a>.',
|
|
'placeholder' => 'Zjc...5PH',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'VONAGE_API_SIGNATURE_SECRET',
|
|
'description' => 'Secret to verify the JWT token sent by Vonage. <a class="u-bold" target="_blank" href="https://developer.vonage.com/en/getting-started/concepts/signing-messages">Learn more</a>.',
|
|
'placeholder' => 'NXOi3...IBHDa',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'VONAGE_WHATSAPP_NUMBER',
|
|
'description' => 'Vonage WhatsApp number to send messages from. <a class="u-bold" target="_blank" href="https://api.support.vonage.com/hc/en-us/articles/4431993282580-Where-do-I-find-my-WhatsApp-Number-Certificate-">Learn more</a>.',
|
|
'placeholder' => '+14000000102',
|
|
'required' => true,
|
|
'type' => 'phone'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-bell',
|
|
'id' => 'push-notification-with-fcm',
|
|
'name' => 'Push notification with FCM',
|
|
'tagline' => 'Send push notifications to your users using Firebase Cloud Messaging (FCM).',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['messaging'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/push-notification-with-fcm'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/push-notification-with-fcm">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'FCM_PROJECT_ID',
|
|
'description' => 'A unique identifier for your FCM project. <a class="u-bold" target="_blank" href="https://firebase.google.com/docs/projects/learn-more#project-id">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'mywebapp-f6e57',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'FCM_CLIENT_EMAIL',
|
|
'description' => 'Your FCM service account email. <a class="u-bold" target="_blank" href="https://github.com/appwrite/templates/tree/main/node/push-notification-with-fcm#:~:text=Documentation-,FCM%3A%20SDK%20Setup,-FCM_PRIVATE_KEY">Learn more</a>.',
|
|
'placeholder' => 'fcm-adminsdk-2f0de@test-f7q57.iam.gserviceaccount.com',
|
|
'required' => true,
|
|
'type' => 'email'
|
|
],
|
|
[
|
|
'name' => 'FCM_PRIVATE_KEY',
|
|
'description' => 'A unique private key used to authenticate with FCM. <a class="u-bold" target="_blank" href="https://github.com/appwrite/templates/tree/main/node/push-notification-with-fcm#:~:text=Documentation-,FCM%3A%20SDK%20Setup,-FCM_DATABASE_URL">Learn more</a>.',
|
|
'placeholder' => '0b683...75675',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'FCM_DATABASE_URL',
|
|
'description' => 'URL of your FCM database. <a class="u-bold" target="_blank" href="https://firebase.google.com/docs/admin/setup#initialize_the_sdk_in_non-google_environments">Learn more</a>.',
|
|
'placeholder' => 'https://my-app-f298e.firebaseio.com',
|
|
'required' => true,
|
|
'type' => 'url'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-mail',
|
|
'id' => 'email-contact-form',
|
|
'name' => 'Email contact form',
|
|
'tagline' => 'Sends an email with the contents of a HTML form.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['utilities'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/email-contact-form'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PYTHON'],
|
|
'pip install -r requirements.txt',
|
|
'src/main.py',
|
|
'python/email_contact_form'
|
|
),
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['PHP'],
|
|
'composer install',
|
|
'src/index.php',
|
|
'php/email-contact-form'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/email-contact-form">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'SMTP_HOST',
|
|
'description' => 'The address of your SMTP server. Many STMP providers will provide this information in their documentation. Some popular providers include: Mailgun, SendGrid, and Gmail.',
|
|
'value' => '',
|
|
'placeholder' => 'smtp.mailgun.org',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'SMTP_PORT',
|
|
'description' => 'The port of your STMP server. Commnly used ports include 25, 465, and 587.',
|
|
'placeholder' => '25',
|
|
'required' => true,
|
|
'type' => 'number'
|
|
],
|
|
[
|
|
'name' => 'SMTP_USERNAME',
|
|
'description' => 'The username for your SMTP server. This is commonly your email address.',
|
|
'placeholder' => 'no-reply@mywebapp.org',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'SMTP_PASSWORD',
|
|
'description' => 'The password for your SMTP server.',
|
|
'placeholder' => '5up3r5tr0ngP4ssw0rd',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'SUBMIT_EMAIL',
|
|
'description' => 'The email address to send form submissions to.',
|
|
'placeholder' => 'me@mywebapp.org',
|
|
'required' => true,
|
|
'type' => 'email'
|
|
],
|
|
[
|
|
'name' => 'ALLOWED_ORIGINS',
|
|
'description' => 'An optional comma-separated list of allowed origins for CORS (defaults to *). This is an important security measure to prevent malicious users from abusing your function.',
|
|
'value' => '',
|
|
'placeholder' => 'https://mywebapp.org,https://mywebapp.com',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-stripe',
|
|
'id' => 'subscriptions-with-stripe',
|
|
'name' => 'Subscriptions with Stripe',
|
|
'tagline' => 'Receive recurring card payments and grant subscribers extra permissions.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['utilities'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/subscriptions-with-stripe'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/subscriptions-with-stripe">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'STRIPE_SECRET_KEY',
|
|
'description' => 'Secret for sending requests to the Stripe API. <a class="u-bold" target="_blank" href="https://stripe.com/docs/keys">Learn more</a>.',
|
|
'placeholder' => 'sk_test_51J...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'STRIPE_WEBHOOK_SECRET',
|
|
'description' => 'Secret used to validate the Stripe Webhook signature. <a class="u-bold" target="_blank" href="https://stripe.com/docs/webhooks">Learn more</a>.',
|
|
'placeholder' => 'whsec_...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
],
|
|
'scopes' => ["users.read", "sessions.write", "users.write"]
|
|
],
|
|
[
|
|
'icon' => 'icon-stripe',
|
|
'id' => 'payments-with-stripe',
|
|
'name' => 'Payments with Stripe',
|
|
'tagline' => 'Receive card payments and store paid orders.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['utilities'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/payments-with-stripe'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/payments-with-stripe">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'STRIPE_SECRET_KEY',
|
|
'description' => 'Secret for sending requests to the Stripe API. <a class="u-bold" target="_blank" href="https://stripe.com/docs/keys">Learn more</a>.',
|
|
'placeholder' => 'sk_test_51J...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'STRIPE_WEBHOOK_SECRET',
|
|
'description' => 'Secret used to validate the Stripe Webhook signature. <a class="u-bold" target="_blank" href="https://stripe.com/docs/webhooks">Learn more</a>.',
|
|
'placeholder' => 'whsec_...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database to store paid orders. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'value' => 'orders',
|
|
'placeholder' => 'orders',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection to store paid orders. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'value' => 'orders',
|
|
'placeholder' => 'orders',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
]
|
|
],
|
|
'scopes' => ["databases.read", "databases.write", "collections.write", "attributes.write", "documents.read", "documents.write"]
|
|
],
|
|
[
|
|
'icon' => 'icon-chat',
|
|
'id' => 'text-generation-with-huggingface',
|
|
'name' => 'Text generation',
|
|
'tagline' => 'Generate text using the Hugging Face inference API.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 30,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/text-generation-with-huggingface'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/text-generation-with-huggingface">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'HUGGINGFACE_ACCESS_TOKEN',
|
|
'description' => 'Secret for sending requests to the Hugging Face API. <a class="u-bold" target="_blank" href="https://huggingface.co/docs/api-inference/en/quicktour#get-your-api-token">Learn more</a>.',
|
|
'placeholder' => 'hf_MUvn...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-translate',
|
|
'id' => 'language-translation-with-huggingface',
|
|
'name' => 'Language translation',
|
|
'tagline' => 'Translate text using the Hugging Face inference API.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 30,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/language-translation-with-huggingface'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/language-translation-with-huggingface">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'HUGGINGFACE_ACCESS_TOKEN',
|
|
'description' => 'Secret for sending requests to the Hugging Face API. <a class="u-bold" target="_blank" href="https://huggingface.co/docs/api-inference/en/quicktour#get-your-api-token">Learn more</a>.',
|
|
'placeholder' => 'hf_MUvn...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-eye',
|
|
'id' => 'image-classification-with-huggingface',
|
|
'name' => 'Image classification',
|
|
'tagline' => 'Classify images using the Hugging Face inference API.',
|
|
'permissions' => ['any'],
|
|
'events' => ['buckets.*.files.*.create'],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install && npm run setup',
|
|
'src/main.js',
|
|
'node/image-classification-with-huggingface'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/image-classification-with-huggingface">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'value' => 'ai',
|
|
'placeholder' => 'ai',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'value' => 'image_classification',
|
|
'placeholder' => 'image_classification',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_BUCKET_ID',
|
|
'description' => 'The ID of the bucket where the images are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/storage/buckets">Learn more</a>.',
|
|
'value' => 'image_classification',
|
|
'placeholder' => 'image_classification',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'HUGGINGFACE_ACCESS_TOKEN',
|
|
'description' => 'Secret for sending requests to the Hugging Face API. <a class="u-bold" target="_blank" href="https://huggingface.co/docs/api-inference/en/quicktour#get-your-api-token">Learn more</a>.',
|
|
'placeholder' => 'hf_MUvn...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
],
|
|
'scopes' => ["databases.read", "databases.write", "collections.read", "collections.write", "attributes.write", "documents.read", "documents.write", "buckets.read", "buckets.write", "files.read"]
|
|
],
|
|
[
|
|
'icon' => 'icon-eye',
|
|
'id' => 'object-detection-with-huggingface',
|
|
'name' => 'Object detection',
|
|
'tagline' => 'Detect objects in images using the Hugging Face inference API.',
|
|
'permissions' => ['any'],
|
|
'events' => ['buckets.*.files.*.create'],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install && npm run setup',
|
|
'src/main.js',
|
|
'node/object-detection-with-huggingface'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/object-detection-with-huggingface">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'value' => 'ai',
|
|
'placeholder' => 'ai',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'value' => 'object_detection',
|
|
'placeholder' => 'object_detection',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_BUCKET_ID',
|
|
'description' => 'The ID of the bucket where the images are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/storage/buckets">Learn more</a>.',
|
|
'value' => 'object_detection',
|
|
'placeholder' => 'object_detection',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'HUGGINGFACE_ACCESS_TOKEN',
|
|
'description' => 'Secret for sending requests to the Hugging Face API. <a class="u-bold" target="_blank" href="https://huggingface.co/docs/api-inference/en/quicktour#get-your-api-token">Learn more</a>.',
|
|
'placeholder' => 'hf_MUvn...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
],
|
|
"scopes" => ["databases.read", "databases.write", "collections.read", "collections.write", "attributes.write", "documents.read", "documents.write", "buckets.read", "buckets.write", "files.read"]
|
|
],
|
|
[
|
|
'icon' => 'icon-text',
|
|
'id' => 'speech-recognition-with-huggingface',
|
|
'name' => 'Speech recognition',
|
|
'tagline' => 'Transcribe audio to text using the Hugging Face inference API.',
|
|
'permissions' => ['any'],
|
|
'events' => ['buckets.*.files.*.create'],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install && npm run setup',
|
|
'src/main.js',
|
|
'node/speech-recognition-with-huggingface'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/speech-recognition-with-huggingface">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'value' => 'ai',
|
|
'placeholder' => 'ai',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'value' => 'speech_recognition',
|
|
'placeholder' => 'speech_recognition',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_BUCKET_ID',
|
|
'description' => 'The ID of the bucket where audio is stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/storage/buckets">Learn more</a>.',
|
|
'value' => 'speech_recognition',
|
|
'placeholder' => 'speech_recognition',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'HUGGINGFACE_ACCESS_TOKEN',
|
|
'description' => 'Secret for sending requests to the Hugging Face API. <a class="u-bold" target="_blank" href="https://huggingface.co/docs/api-inference/en/quicktour#get-your-api-token">Learn more</a>.',
|
|
'placeholder' => 'hf_MUvn...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
],
|
|
"scopes" => ["databases.read", "databases.write", "collections.read", "collections.write", "attributes.write", "documents.read", "documents.write", "buckets.read", "buckets.write", "files.read"]
|
|
],
|
|
[
|
|
'icon' => 'icon-chat',
|
|
'id' => 'text-to-speech-with-huggingface',
|
|
'name' => 'Text to speech',
|
|
'tagline' => 'Convert text to speech using the Hugging Face inference API.',
|
|
'permissions' => ['any'],
|
|
'events' => ['databases.*.collections.*.documents.*.create'],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install && npm run setup',
|
|
'src/main.js',
|
|
'node/text-to-speech-with-huggingface'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/text-to-speech-with-huggingface">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'value' => 'ai',
|
|
'placeholder' => 'ai',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'value' => 'speech_recognition',
|
|
'placeholder' => 'speech_recognition',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_BUCKET_ID',
|
|
'description' => 'The ID of the bucket where audio is stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/storage/buckets">Learn more</a>.',
|
|
'value' => 'speech_recognition',
|
|
'placeholder' => 'speech_recognition',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'HUGGINGFACE_ACCESS_TOKEN',
|
|
'description' => 'Secret for sending requests to the Hugging Face API. <a class="u-bold" target="_blank" href="https://huggingface.co/docs/api-inference/en/quicktour#get-your-api-token">Learn more</a>.',
|
|
'placeholder' => 'hf_MUvn...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
],
|
|
"scopes" => ["buckets.read", "buckets.write", "files.read", "files.write"]
|
|
],
|
|
[
|
|
'icon' => 'icon-chip',
|
|
'id' => 'generate-with-replicate',
|
|
'name' => 'Generate with Replicate',
|
|
'tagline' => "Generate text, audio and images using Replicate's API.",
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 300,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/generate-with-replicate'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/generate-with-replicate">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'REPLICATE_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the Replicate API. <a class="u-bold" target="_blank" href="https://replicate.com/docs/get-started/nodejs">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'd1efb...aec35',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-chip',
|
|
'id' => 'generate-with-together-ai',
|
|
'name' => 'Generate with Together AI',
|
|
'tagline' => "Generate text and images using Together AI's API.",
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 300,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/generate-with-together-ai'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/generate-with-together-ai">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'TOGETHER_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the Together AI API. <a class="u-bold" target="_blank" href="https://docs.together.ai/reference/authentication-1">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'd1efb...aec35',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_BUCKET_ID',
|
|
'description' => 'The ID of the bucket where audio is stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/storage/buckets">Learn more</a>.',
|
|
'placeholder' => 'generated_speech',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
]
|
|
],
|
|
"scopes" => ["buckets.write", "files.read", "files.write"]
|
|
],
|
|
[
|
|
'icon' => 'icon-chip',
|
|
'id' => 'chat-with-perplexity-ai',
|
|
'name' => 'Chat with Perplexity AI',
|
|
'tagline' => 'Create a chatbot using the Perplexity AI API.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/chat-with-perplexity-ai'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/chat-with-perplexity-ai">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'PERPLEXITY_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the Perplexity API. <a class="u-bold" target="_blank" href="https://docs.perplexity.ai/docs/getting-started">Learn more</a>.',
|
|
'placeholder' => 'pplex-68...999',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'PERPLEXITY_MAX_TOKENS',
|
|
'description' => 'The maximum number of tokens to generate. <a class="u-bold" target="_blank" href="https://docs.perplexity.ai/docs/getting-started">Learn more</a>.',
|
|
'placeholder' => '512',
|
|
'required' => false,
|
|
'type' => 'number'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-chip',
|
|
'id' => 'generate-with-replicate',
|
|
'name' => 'Generate with Replicate',
|
|
'tagline' => "Generate text, audio and images using Replicate's API.",
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 300,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/generate-with-replicate'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/generate-with-replicate">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'REPLICATE_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the Replicate API. <a class="u-bold" target="_blank" href="https://replicate.com/docs/get-started/nodejs">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'd1efb...aec35',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-document-search',
|
|
'id' => 'sync-with-pinecone',
|
|
'name' => 'Sync with Pinecone',
|
|
'tagline' => "Sync your Appwrite database with Pinecone's vector database.",
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 30,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/sync-with-pinecone'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/sync-with-pinecone">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'OPENAI_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the OpenAI API. This is a paid service and you will be charged for each request made to the API. <a class="u-bold" target="_blank" href="https://platform.openai.com/docs/quickstart/add-your-api-key">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'sk-wzG...vcy',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'PINECONE_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the Pinecone API. <a class="u-bold" target="_blank" href="https://docs.pinecone.io/guides/getting-started/authentication">Learn more</a>.',
|
|
'placeholder' => 'd1efb...aec35',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'PINECONE_INDEX_NAME',
|
|
'description' => 'The name of the index in Pinecone. <a class="u-bold" target="_blank" href="https://docs.pinecone.io/guides/getting-started/create-index">Learn more</a>.',
|
|
'placeholder' => 'my-index',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database where the documents are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'placeholder' => 'my-database',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection where the documents are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'placeholder' => 'my-collection',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
]
|
|
],
|
|
"scopes" => ["databases.read", "collections.read", "documents.read"]
|
|
],
|
|
[
|
|
'icon' => 'icon-chip',
|
|
'id' => 'rag-with-langchain',
|
|
'name' => 'RAG with LangChain',
|
|
'tagline' => 'Generate text using a LangChain RAG model',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 30,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/rag-with-langchain'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/rag-with-langchain">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'OPENAI_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the OpenAI API. This is a paid service and you will be charged for each request made to the API. <a class="u-bold" target="_blank" href="https://platform.openai.com/docs/quickstart/add-your-api-key">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'sk-wzG...vcy',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'PINECONE_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the Pinecone API. <a class="u-bold" target="_blank" href="https://docs.pinecone.io/guides/getting-started/authentication">Learn more</a>.',
|
|
'placeholder' => 'd1efb...aec35',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'PINECONE_INDEX_NAME',
|
|
'description' => 'The name of the index in Pinecone. <a class="u-bold" target="_blank" href="https://docs.pinecone.io/guides/getting-started/create-index">Learn more</a>.',
|
|
'placeholder' => 'my-index',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database where the documents are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'placeholder' => 'my-database',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection where the documents are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'placeholder' => 'my-collection',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
]
|
|
],
|
|
"scopes" => ["databases.read", "collections.read", "documents.read"]
|
|
],
|
|
[
|
|
'icon' => 'icon-chat',
|
|
'id' => 'speak-with-elevenlabs',
|
|
'name' => 'Speak with ElevenLabs',
|
|
'tagline' => 'Convert text to speech using the ElevenLabs API.',
|
|
'permissions' => ['any'],
|
|
'cron' => '',
|
|
'events' => [],
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/speak-with-elevenlabs'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/speak-with-elevenlabs">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'ELEVENLABS_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the ElevenLabs API. <a class="u-bold" target="_blank" href="https://elevenlabs.io/docs/api-reference/getting-started">Learn more</a>.',
|
|
'placeholder' => 'd03xxxxxxxx26',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'placeholder' => 'my-database',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection where the responses are stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'placeholder' => 'my-collection',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_BUCKET_ID',
|
|
'description' => 'The ID of the bucket where audio is stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/storage/buckets">Learn more</a>.',
|
|
'placeholder' => 'generated_speech',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
]
|
|
],
|
|
"scopes" => ["buckets.read", "buckets.write", "files.read", "files.write"]
|
|
],
|
|
[
|
|
'icon' => 'icon-chip',
|
|
'id' => 'speak-with-lmnt',
|
|
'name' => 'Speak with LMNT',
|
|
'tagline' => 'Convert text to speech using the LMNT API.',
|
|
'permissions' => ['any'],
|
|
'cron' => '',
|
|
'events' => [],
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/speak-with-lmnt'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/speak-with-lmnt">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'LMNT_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the LMNT API. <a class="u-bold" target="_blank" href="https://app.lmnt.com/account">Learn more</a>.',
|
|
'placeholder' => 'd03xxxxxxxx26',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_BUCKET_ID',
|
|
'description' => 'The ID of the bucket where audio is stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/storage/buckets">Learn more</a>.',
|
|
'placeholder' => 'generated_speech',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
]
|
|
],
|
|
"scopes" => ["buckets.read", "buckets.write", "files.read", "files.write"]
|
|
],
|
|
[
|
|
'icon' => 'icon-chip',
|
|
'id' => 'chat-with-anyscale',
|
|
'name' => 'Chat with AnyScale',
|
|
'tagline' => 'Create a chatbot using the AnyScale API.',
|
|
'permissions' => ['any'],
|
|
'cron' => '',
|
|
'events' => [],
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/chat-with-anyscale'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/chat-with-anyscale">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'ANYSCALE_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the AnyScale API. <a class="u-bold" target="_blank" href="https://app.endpoints.anyscale.com/credentials">Learn more</a>.',
|
|
'placeholder' => 'd03xxxxxxxx26',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'ANYSCALE_MAX_TOKENS',
|
|
'description' => 'The maximum number of tokens that Anyscale responses should contain. <a class="u-bold" target="_blank" href="https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them">Learn more</a>.',
|
|
'placeholder' => '',
|
|
'required' => false,
|
|
'type' => 'number'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-music-note',
|
|
'id' => 'music-generation-with-huggingface',
|
|
'name' => 'Music generation',
|
|
'tagline' => 'Generate music from a text prompt using the Hugging Face inference API.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install && npm run setup',
|
|
'src/main.js',
|
|
'node/music-generation-with-huggingface'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/music-generation-with-huggingface">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'APPWRITE_BUCKET_ID',
|
|
'description' => 'The ID of the bucket where generated music is stored. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/storage/buckets">Learn more</a>.',
|
|
'value' => 'generated_music',
|
|
'placeholder' => 'generated_music',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'HUGGINGFACE_ACCESS_TOKEN',
|
|
'description' => 'Secret for sending requests to the Hugging Face API. <a class="u-bold" target="_blank" href="https://huggingface.co/docs/api-inference/en/quicktour#get-your-api-token">Learn more</a>.',
|
|
'placeholder' => 'hf_MUvn...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
],
|
|
"scopes" => ["buckets.read", "buckets.write", "files.read", "files.write"]
|
|
],
|
|
[
|
|
'icon' => 'icon-chip',
|
|
'id' => 'generate-with-fal-ai',
|
|
'name' => 'Generate with fal.ai',
|
|
'tagline' => "Generate images using fal.ai's API.",
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 300,
|
|
'useCases' => ['ai'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/generate-with-fal-ai'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/generate-with-fal-ai">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'FAL_API_KEY',
|
|
'description' => 'A unique key used to authenticate with the fal.ai API. <a class="u-bold" target="_blank" href="https://fal.ai/docs/authentication/key-based">Learn more</a>.',
|
|
'value' => '',
|
|
'placeholder' => 'd1efb...aec35',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
]
|
|
]
|
|
],
|
|
[
|
|
'icon' => 'icon-currency-dollar',
|
|
'id' => 'subscriptions-with-lemon-squeezy',
|
|
'name' => 'Subscriptions with Lemon Squeezy',
|
|
'tagline' => 'Receive recurring card payments and grant subscribers extra permissions.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['utilities'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/subscriptions-with-lemon-squeezy'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/subscriptions-with-lemon-squeezy">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'LEMON_SQUEEZY_API_KEY',
|
|
'description' => 'API key for sending requests to the Lemon Squeezy API. <a class="u-bold" target="_blank" href="https://docs.lemonsqueezy.com/api#authentication">Learn more</a>.',
|
|
'placeholder' => 'eyJ0eXAiOiJ...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'LEMON_SQUEEZY_WEBHOOK_SECRET',
|
|
'description' => 'Secret used to validate the Lemon Squuezy Webhook signature. <a class="u-bold" target="_blank" href="https://docs.lemonsqueezy.com/guides/developer-guide/webhooks#from-the-dashboard">Learn more</a>.',
|
|
'placeholder' => 'abcd...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'LEMON_SQUEEZY_STORE_ID',
|
|
'description' => 'Store ID required to create a checkout using the Lemon Squeezy API. <a class="u-bold" target="_blank" href="https://docs.lemonsqueezy.com/guides/developer-guide/taking-payments#creating-checkouts-with-the-api">Learn more</a>.',
|
|
'placeholder' => '123456',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'LEMON_SQUEEZY_VARIANT_ID',
|
|
'description' => 'Variant ID of a product required to create a checkout using the Lemon Squeezy API. <a class="u-bold" target="_blank" href="https://docs.lemonsqueezy.com/guides/developer-guide/taking-payments#creating-checkouts-with-the-api">Learn more</a>.',
|
|
'placeholder' => 'abcd...',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
]
|
|
],
|
|
"scopes" => ["users.read", "users.write"]
|
|
],
|
|
[
|
|
'icon' => 'icon-currency-dollar',
|
|
'id' => 'payments-with-lemon-squeezy',
|
|
'name' => 'Payments with Lemon Squeezy',
|
|
'tagline' => 'Receive card payments and store paid orders.',
|
|
'permissions' => ['any'],
|
|
'events' => [],
|
|
'cron' => '',
|
|
'timeout' => 15,
|
|
'useCases' => ['utilities'],
|
|
'runtimes' => [
|
|
...getRuntimes(
|
|
TEMPLATE_RUNTIMES['NODE'],
|
|
'npm install',
|
|
'src/main.js',
|
|
'node/payments-with-lemon-squeezy'
|
|
)
|
|
],
|
|
'instructions' => 'For documentation and instructions check out <a target="_blank" rel="noopener noreferrer" class="link" href="https://github.com/appwrite/templates/tree/main/node/payments-with-lemon-squeezy">file</a>.',
|
|
'vcsProvider' => 'github',
|
|
'providerRepositoryId' => 'templates',
|
|
'providerOwner' => 'appwrite',
|
|
'providerBranch' => 'main',
|
|
'variables' => [
|
|
[
|
|
'name' => 'APPWRITE_DATABASE_ID',
|
|
'description' => 'The ID of the database to store paid orders. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/databases">Learn more</a>.',
|
|
'value' => 'orders',
|
|
'placeholder' => 'orders',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'APPWRITE_COLLECTION_ID',
|
|
'description' => 'The ID of the collection to store paid orders. <a class="u-bold" target="_blank" href="https://appwrite.io/docs/products/databases/collections">Learn more</a>.',
|
|
'value' => 'orders',
|
|
'placeholder' => 'orders',
|
|
'required' => false,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'LEMON_SQUEEZY_API_KEY',
|
|
'description' => 'API key for sending requests to the Lemon Squeezy API. <a class="u-bold" target="_blank" href="https://docs.lemonsqueezy.com/api#authentication">Learn more</a>.',
|
|
'placeholder' => 'eyJ0eXAiOiJ...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'LEMON_SQUEEZY_WEBHOOK_SECRET',
|
|
'description' => 'Secret used to validate the Lemon Squuezy Webhook signature. <a class="u-bold" target="_blank" href="https://docs.lemonsqueezy.com/guides/developer-guide/webhooks#from-the-dashboard">Learn more</a>.',
|
|
'placeholder' => 'abcd...',
|
|
'required' => true,
|
|
'type' => 'password'
|
|
],
|
|
[
|
|
'name' => 'LEMON_SQUEEZY_STORE_ID',
|
|
'description' => 'Store ID required to create a checkout using the Lemon Squeezy API. <a class="u-bold" target="_blank" href="https://docs.lemonsqueezy.com/guides/developer-guide/taking-payments#creating-checkouts-with-the-api">Learn more</a>.',
|
|
'placeholder' => '123456',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
],
|
|
[
|
|
'name' => 'LEMON_SQUEEZY_VARIANT_ID',
|
|
'description' => 'Variant ID of a product required to create a checkout using the Lemon Squeezy API. <a class="u-bold" target="_blank" href="https://docs.lemonsqueezy.com/guides/developer-guide/taking-payments#creating-checkouts-with-the-api">Learn more</a>.',
|
|
'placeholder' => 'abcd...',
|
|
'required' => true,
|
|
'type' => 'text'
|
|
]
|
|
],
|
|
"scopes" => ["users.read", "users.write"]
|
|
]
|
|
];
|