[ '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 file.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'UPSTASH_URL', 'description' => 'The endpoint to connect to your Upstash Vector database. Learn more.', '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. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'REDIS_HOST', 'description' => 'The endpoint to connect to your Redis database. Learn more.', '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. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'NEO4J_URI', 'description' => 'The endpoint to connect to your Neo4j database. Learn more.', 'value' => '', 'placeholder' => 'neo4j+s://4tg4mddo.databases.neo4j.io', 'required' => true, 'type' => 'text' ], [ 'name' => 'NEO4J_USER', 'description' => 'Authentication user to access your Neo4j database. Learn more.', 'value' => '', 'placeholder' => 'neo4j', 'required' => true, 'type' => 'text' ], [ 'name' => 'NEO4J_PASSWORD', 'description' => 'Authentication password to access your Neo4j database. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'MONGO_URI', 'description' => 'The endpoint to connect to your Mongo database. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'PGHOST', 'description' => 'The endpoint to connect to your Postgres database. Learn more.', 'value' => '', 'placeholder' => 'ep-still-sea-a792sh84.eu-central-1.aws.neon.tech', 'required' => true, 'type' => 'text' ], [ 'name' => 'PGDATABASE', 'description' => 'Name of our Postgres database. Learn more.', 'value' => '', 'placeholder' => 'main', 'required' => true, 'type' => 'text' ], [ 'name' => 'PGUSER', 'description' => 'Name of our Postgres user for authentication. Learn more.', 'value' => '', 'placeholder' => 'main_owner', 'required' => true, 'type' => 'text' ], [ 'name' => 'PGPASSWORD', 'description' => 'Password of our Postgres user for authentication. Learn more.', 'value' => '', 'placeholder' => 'iQCfaUaaWB3B', 'required' => true, 'type' => 'password' ], [ 'name' => 'ENDPOINT_ID', 'description' => 'Endpoint ID provided for your Postgres database. Learn more.', '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 file.', '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. Learn more.', '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. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'DISCORD_PUBLIC_KEY', 'description' => 'Public Key of your application in Discord Developer Portal. Learn more.', 'value' => '', 'placeholder' => 'db9...980', 'required' => true, 'type' => 'password' ], [ 'name' => 'DISCORD_APPLICATION_ID', 'description' => 'ID of your application in Discord Developer Portal. Learn more.', 'value' => '', 'placeholder' => '427...169', 'required' => true, 'type' => 'password' ], [ 'name' => 'DISCORD_TOKEN', 'description' => 'Bot token of your application in Discord Developer Portal. Learn more.', '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 file.', '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. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'PANGEA_REDACT_TOKEN', 'description' => 'Access token for the Pangea Redact API. Learn more.', '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 file.', '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 file.', '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. Learn more.', '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. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database to store the short URLs. Learn more.', 'value' => 'urlShortener', 'placeholder' => 'urlShortener', 'required' => false, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection to store the short URLs. Learn more.', '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 file.', '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. Learn more.', 'placeholder' => '64a55...7b912', 'required' => true, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection in the Appwrite database to sync. Learn more.', 'placeholder' => '7c3e8...2a9f1', 'required' => true, 'type' => 'text' ], [ 'name' => 'ALGOLIA_APP_ID', 'description' => 'The ID of the application in Algolia. Learn more.', 'placeholder' => 'OFCNCOG2CU', 'required' => true, 'type' => 'text' ], [ 'name' => 'ALGOLIA_ADMIN_API_KEY', 'description' => 'The admin API Key for your Algolia service. Learn more.', '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. Learn more.', '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. Learn more.', '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 file.', '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. Learn more.', 'placeholder' => '64a55...7b912', 'required' => true, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection in the Appwrite database to sync. Learn more.', 'placeholder' => '7c3e8...2a9f1', 'required' => true, 'type' => 'text' ], [ 'name' => 'MEILISEARCH_ENDPOINT', 'description' => 'The host URL of the Meilisearch server. Learn more.', 'placeholder' => 'http://127.0.0.1:7700', 'required' => true, 'type' => 'url' ], [ 'name' => 'MEILISEARCH_ADMIN_API_KEY', 'description' => 'The admin API key for Meilisearch. Learn more.', 'placeholder' => 'masterKey1234', 'required' => true, 'type' => 'password' ], [ 'name' => 'MEILISEARCH_SEARCH_API_KEY', 'description' => 'API Key for Meilisearch search operations. Learn more.', 'placeholder' => 'searchKey1234', 'required' => true, 'type' => 'password' ], [ 'name' => 'MEILISEARCH_INDEX_NAME', 'description' => 'Name of the Meilisearch index to which the documents will be synchronized. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'VONAGE_API_KEY', 'description' => 'API Key to use the Vonage API. Learn more.', 'value' => '', 'placeholder' => '62...97', 'required' => true, 'type' => 'password' ], [ 'name' => 'VONAGE_API_SECRET', 'description' => 'Secret to use the Vonage API. Learn more.', 'placeholder' => 'Zjc...5PH', 'required' => true, 'type' => 'password' ], [ 'name' => 'VONAGE_API_SIGNATURE_SECRET', 'description' => 'Secret to verify the JWT token sent by Vonage. Learn more.', 'placeholder' => 'NXOi3...IBHDa', 'required' => true, 'type' => 'password' ], [ 'name' => 'VONAGE_WHATSAPP_NUMBER', 'description' => 'Vonage WhatsApp number to send messages from. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'FCM_PROJECT_ID', 'description' => 'A unique identifier for your FCM project. Learn more.', 'value' => '', 'placeholder' => 'mywebapp-f6e57', 'required' => true, 'type' => 'text' ], [ 'name' => 'FCM_CLIENT_EMAIL', 'description' => 'Your FCM service account email. Learn more.', '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. Learn more.', 'placeholder' => '0b683...75675', 'required' => true, 'type' => 'password' ], [ 'name' => 'FCM_DATABASE_URL', 'description' => 'URL of your FCM database. Learn more.', '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 file.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'STRIPE_SECRET_KEY', 'description' => 'Secret for sending requests to the Stripe API. Learn more.', 'placeholder' => 'sk_test_51J...', 'required' => true, 'type' => 'password' ], [ 'name' => 'STRIPE_WEBHOOK_SECRET', 'description' => 'Secret used to validate the Stripe Webhook signature. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'STRIPE_SECRET_KEY', 'description' => 'Secret for sending requests to the Stripe API. Learn more.', 'placeholder' => 'sk_test_51J...', 'required' => true, 'type' => 'password' ], [ 'name' => 'STRIPE_WEBHOOK_SECRET', 'description' => 'Secret used to validate the Stripe Webhook signature. Learn more.', 'placeholder' => 'whsec_...', 'required' => true, 'type' => 'password' ], [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database to store paid orders. Learn more.', 'value' => 'orders', 'placeholder' => 'orders', 'required' => false, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection to store paid orders. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'HUGGINGFACE_ACCESS_TOKEN', 'description' => 'Secret for sending requests to the Hugging Face API. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'HUGGINGFACE_ACCESS_TOKEN', 'description' => 'Secret for sending requests to the Hugging Face API. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database where the responses are stored. Learn more.', 'value' => 'ai', 'placeholder' => 'ai', 'required' => false, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection where the responses are stored. Learn more.', '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. Learn more.', 'value' => 'image_classification', 'placeholder' => 'image_classification', 'required' => false, 'type' => 'text' ], [ 'name' => 'HUGGINGFACE_ACCESS_TOKEN', 'description' => 'Secret for sending requests to the Hugging Face API. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database where the responses are stored. Learn more.', 'value' => 'ai', 'placeholder' => 'ai', 'required' => false, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection where the responses are stored. Learn more.', '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. Learn more.', 'value' => 'object_detection', 'placeholder' => 'object_detection', 'required' => false, 'type' => 'text' ], [ 'name' => 'HUGGINGFACE_ACCESS_TOKEN', 'description' => 'Secret for sending requests to the Hugging Face API. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database where the responses are stored. Learn more.', 'value' => 'ai', 'placeholder' => 'ai', 'required' => false, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection where the responses are stored. Learn more.', 'value' => 'speech_recognition', 'placeholder' => 'speech_recognition', 'required' => false, 'type' => 'text' ], [ 'name' => 'APPWRITE_BUCKET_ID', 'description' => 'The ID of the bucket where audio is stored. Learn more.', 'value' => 'speech_recognition', 'placeholder' => 'speech_recognition', 'required' => false, 'type' => 'text' ], [ 'name' => 'HUGGINGFACE_ACCESS_TOKEN', 'description' => 'Secret for sending requests to the Hugging Face API. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database where the responses are stored. Learn more.', 'value' => 'ai', 'placeholder' => 'ai', 'required' => false, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection where the responses are stored. Learn more.', 'value' => 'speech_recognition', 'placeholder' => 'speech_recognition', 'required' => false, 'type' => 'text' ], [ 'name' => 'APPWRITE_BUCKET_ID', 'description' => 'The ID of the bucket where audio is stored. Learn more.', 'value' => 'speech_recognition', 'placeholder' => 'speech_recognition', 'required' => false, 'type' => 'text' ], [ 'name' => 'HUGGINGFACE_ACCESS_TOKEN', 'description' => 'Secret for sending requests to the Hugging Face API. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'REPLICATE_API_KEY', 'description' => 'A unique key used to authenticate with the Replicate API. Learn more.', '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 file.', '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. Learn more.', 'value' => '', 'placeholder' => 'd1efb...aec35', 'required' => true, 'type' => 'password' ], [ 'name' => 'APPWRITE_BUCKET_ID', 'description' => 'The ID of the bucket where audio is stored. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'PERPLEXITY_API_KEY', 'description' => 'A unique key used to authenticate with the Perplexity API. Learn more.', 'placeholder' => 'pplex-68...999', 'required' => true, 'type' => 'password' ], [ 'name' => 'PERPLEXITY_MAX_TOKENS', 'description' => 'The maximum number of tokens to generate. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'REPLICATE_API_KEY', 'description' => 'A unique key used to authenticate with the Replicate API. Learn more.', '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 file.', '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. Learn more.', 'value' => '', 'placeholder' => 'sk-wzG...vcy', 'required' => true, 'type' => 'password' ], [ 'name' => 'PINECONE_API_KEY', 'description' => 'A unique key used to authenticate with the Pinecone API. Learn more.', 'placeholder' => 'd1efb...aec35', 'required' => true, 'type' => 'password' ], [ 'name' => 'PINECONE_INDEX_NAME', 'description' => 'The name of the index in Pinecone. Learn more.', 'placeholder' => 'my-index', 'required' => true, 'type' => 'text' ], [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database where the documents are stored. Learn more.', 'placeholder' => 'my-database', 'required' => true, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection where the documents are stored. Learn more.', '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 file.', '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. Learn more.', 'value' => '', 'placeholder' => 'sk-wzG...vcy', 'required' => true, 'type' => 'password' ], [ 'name' => 'PINECONE_API_KEY', 'description' => 'A unique key used to authenticate with the Pinecone API. Learn more.', 'placeholder' => 'd1efb...aec35', 'required' => true, 'type' => 'password' ], [ 'name' => 'PINECONE_INDEX_NAME', 'description' => 'The name of the index in Pinecone. Learn more.', 'placeholder' => 'my-index', 'required' => true, 'type' => 'text' ], [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database where the documents are stored. Learn more.', 'placeholder' => 'my-database', 'required' => true, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection where the documents are stored. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'ELEVENLABS_API_KEY', 'description' => 'A unique key used to authenticate with the ElevenLabs API. Learn more.', 'placeholder' => 'd03xxxxxxxx26', 'required' => true, 'type' => 'password' ], [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database where the responses are stored. Learn more.', 'placeholder' => 'my-database', 'required' => true, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection where the responses are stored. Learn more.', 'placeholder' => 'my-collection', 'required' => true, 'type' => 'text' ], [ 'name' => 'APPWRITE_BUCKET_ID', 'description' => 'The ID of the bucket where audio is stored. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'LMNT_API_KEY', 'description' => 'A unique key used to authenticate with the LMNT API. Learn more.', 'placeholder' => 'd03xxxxxxxx26', 'required' => true, 'type' => 'password' ], [ 'name' => 'APPWRITE_BUCKET_ID', 'description' => 'The ID of the bucket where audio is stored. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'ANYSCALE_API_KEY', 'description' => 'A unique key used to authenticate with the AnyScale API. Learn more.', 'placeholder' => 'd03xxxxxxxx26', 'required' => true, 'type' => 'password' ], [ 'name' => 'ANYSCALE_MAX_TOKENS', 'description' => 'The maximum number of tokens that Anyscale responses should contain. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'APPWRITE_BUCKET_ID', 'description' => 'The ID of the bucket where generated music is stored. Learn more.', 'value' => 'generated_music', 'placeholder' => 'generated_music', 'required' => false, 'type' => 'text' ], [ 'name' => 'HUGGINGFACE_ACCESS_TOKEN', 'description' => 'Secret for sending requests to the Hugging Face API. Learn more.', '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 file.', '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. Learn more.', '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 file.', '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. Learn more.', 'placeholder' => 'eyJ0eXAiOiJ...', 'required' => true, 'type' => 'password' ], [ 'name' => 'LEMON_SQUEEZY_WEBHOOK_SECRET', 'description' => 'Secret used to validate the Lemon Squuezy Webhook signature. Learn more.', 'placeholder' => 'abcd...', 'required' => true, 'type' => 'password' ], [ 'name' => 'LEMON_SQUEEZY_STORE_ID', 'description' => 'Store ID required to create a checkout using the Lemon Squeezy API. Learn more.', '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. Learn more.', '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 file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', 'providerBranch' => 'main', 'variables' => [ [ 'name' => 'APPWRITE_DATABASE_ID', 'description' => 'The ID of the database to store paid orders. Learn more.', 'value' => 'orders', 'placeholder' => 'orders', 'required' => false, 'type' => 'text' ], [ 'name' => 'APPWRITE_COLLECTION_ID', 'description' => 'The ID of the collection to store paid orders. Learn more.', 'value' => 'orders', 'placeholder' => 'orders', 'required' => false, 'type' => 'text' ], [ 'name' => 'LEMON_SQUEEZY_API_KEY', 'description' => 'API key for sending requests to the Lemon Squeezy API. Learn more.', 'placeholder' => 'eyJ0eXAiOiJ...', 'required' => true, 'type' => 'password' ], [ 'name' => 'LEMON_SQUEEZY_WEBHOOK_SECRET', 'description' => 'Secret used to validate the Lemon Squuezy Webhook signature. Learn more.', 'placeholder' => 'abcd...', 'required' => true, 'type' => 'password' ], [ 'name' => 'LEMON_SQUEEZY_STORE_ID', 'description' => 'Store ID required to create a checkout using the Lemon Squeezy API. Learn more.', '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. Learn more.', 'placeholder' => 'abcd...', 'required' => true, 'type' => 'text' ] ], "scopes" => ["users.read", "users.write"] ] ];