{"owner":"Portkey-AI","repo":"gateway","hasSkills":true,"totalSkillsCount":25,"totalTokensCount":19109,"categories":["anthropic-skill","claude-rule","plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":["plugins/aporia/manifest.json","plugins/bedrock/manifest.json","CLAUDE.md","plugins/Contributing.md","plugins/README.md","plugins/azure/manifest.json","plugins/acuvity/manifest.json","plugins/crowdstrike-aidr/manifest.json","plugins/javelin/manifest.json","plugins/f5-guardrails/manifest.json","plugins/default/manifest.json","plugins/exa/manifest.json","plugins/lasso/manifest.json","plugins/lasso/README.md","plugins/mistral/manifest.json","plugins/pangea/manifest.json","plugins/panw-prisma-airs/manifest.json","plugins/patronus/manifest.json","plugins/pillar/manifest.json","plugins/portkey/manifest.json","plugins/promptfoo/manifest.json","plugins/promptsecurity/manifest.json","plugins/qualifire/manifest.json","plugins/sydelabs/manifest.json","plugins/walledai/manifest.json"],"skills":{"plugins/aporia/manifest.json":"{\n  \"id\": \"aporia\",\n  \"description\": \"Aporia Guardrails mitigates LLM hallucinations, inappropriate responses, prompt injection attacks, and other unintended behaviors in real-time\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Find your API key in the Aporia dashboard\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Validate - Project\",\n      \"id\": \"validateProject\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check all the policies within an Aporia project\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"projectID\": {\n            \"type\": \"string\",\n            \"label\": \"Project ID\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the Aporia Project ID to validate\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"projectID\"]\n      }\n    }\n  ]\n}\n","plugins/bedrock/manifest.json":"{\n  \"id\": \"bedrock\",\n  \"description\": \"AWS Bedrock Content Moderation classifier leverages AWS guardrails for effective guardrails and introduces a pragmatic approach to LLM safety by addressing model-generated harms such as unqualified advice and PII\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"accessKeyId\": {\n        \"type\": \"string\",\n        \"label\": \"Access Key ID\",\n        \"description\": \"Find your Access Key ID in the AWS Management Console\",\n        \"encrypted\": true\n      },\n      \"accessKeySecret\": {\n        \"type\": \"string\",\n        \"label\": \"Access Key Secret\",\n        \"description\": \"Find your Access Key Secret in the AWS Management Console\",\n        \"encrypted\": true\n      },\n      \"awsSessionToken\": {\n        \"type\": \"string\",\n        \"label\": \"AWS Session Token\",\n        \"description\": \"AWS Session token.\"\n      },\n      \"region\": {\n        \"type\": \"string\",\n        \"description\": \"Bedrock guardrail hosted region\",\n        \"lable\": \"Region\"\n      }\n    },\n    \"required\": [\"accessKeyId\", \"accessKeySecret\", \"region\"]\n  },\n\n  \"functions\": [\n    {\n      \"name\": \"Apply Bedrock guardrail\",\n      \"id\": \"guard\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Filters out Content that contain harmful content & prompt filters\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"guardrailVersion\": {\n            \"type\": \"string\",\n            \"label\": \"Guardrail Version\",\n            \"description\": \"Select the version of the guardrail to use\"\n          },\n          \"guardrailId\": {\n            \"type\": \"string\",\n            \"label\": \"Guardrail ID\",\n            \"description\": \"ID of the guardrail.\"\n          },\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"label\": \"Redact PII\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the PII identified will be redacted\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"guardrailVersion\", \"guardrailId\"]\n      }\n    }\n  ]\n}\n","CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nThis is the **Portkey AI Gateway** - a fast, reliable AI gateway that routes requests to 250+ LLMs with sub-1ms latency. It's built with Hono framework for TypeScript/JavaScript and can be deployed to multiple environments including Cloudflare Workers, Node.js servers, and Docker containers.\n\n## Development Commands\n\n### Core Development\n- `npm run dev` - Start development server using Wrangler (Cloudflare Workers)\n- `npm run dev:node` - Start development server using Node.js\n- `npm run build` - Build the project for production\n- `npm run build-plugins` - Build the plugin system\n\n### Testing\n- `npm run test:gateway` - Run tests for the main gateway code (src/)\n- `npm run test:plugins` - Run tests for plugins\n- `jest src/` - Run specific gateway tests\n- `jest plugins/` - Run specific plugin tests\n\n### Code Quality\n- `npm run format` - Format code with Prettier\n- `npm run format:check` - Check code formatting\n- `npm run pretty` - Alternative format command\n\n### Deployment\n- `npm run deploy` - Deploy to Cloudflare Workers\n- `npm run start:node` - Start production Node.js server\n\n## Architecture\n\n### Core Components\n\n**Main Application (`src/index.ts`)**\n- Hono-based HTTP server with middleware pipeline\n- Handles multiple AI provider integrations\n- Routes: `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, etc.\n\n**Provider System (`src/providers/`)**\n- Modular provider implementations (OpenAI, Anthropic, Azure, etc.)\n- Each provider has standardized interface: `api.ts`, `chatComplete.ts`, `embed.ts`\n- Provider configs define supported features and transformations\n\n**Middleware Pipeline**\n- `requestValidator` - Validates incoming requests\n- `hooks` - Pre/post request hooks\n- `memoryCache` - Response caching\n- `logger` - Request/response logging\n- `adminAuth` - Node-only local UI session auth for `/public/*` login endpoints and `/log/stream`\n- `portkey` - Core Portkey-specific middleware for routing, guardrails, etc.\n\n**Plugin System (`plugins/`)**\n- Guardrail plugins for content filtering, PII detection, etc.\n- Each plugin has `manifest.json` defining capabilities\n- Plugins are built separately with `npm run build-plugins`\n\n### Key Concepts\n\n**Configs** - JSON configurations that define:\n- Provider routing and fallbacks\n- Load balancing strategies\n- Guardrails and content filtering\n- Caching and retry policies\n\n**Handlers** - Route-specific request processors in `src/handlers/`\n- Each AI API endpoint has dedicated handler\n- Stream handling for real-time responses\n- WebSocket support for realtime APIs\n\n## File Structure\n\n- `src/providers/` - AI provider integrations\n- `src/handlers/` - API endpoint handlers\n- `src/middlewares/` - Request/response middleware\n- `plugins/` - Guardrail and validation plugins\n- `cookbook/` - Example integrations and use cases\n- `conf.json` - Runtime configuration\n\n## Testing Strategy\n\nTests are organized by component:\n- `src/tests/` - Core gateway functionality tests\n- `src/handlers/__tests__/` - Handler-specific tests\n- `plugins/*/**.test.ts` - Plugin tests\n- Test timeout: 30 seconds (configured in jest.config.js)\n\n## Configuration\n\nThe gateway uses `conf.json` for runtime configuration. Sample config available in `conf_sample.json`.\n\nFor local UI hardening, set `admin_token` in `conf.json`. The `/public` UI uses this token to establish an in-memory admin session, and `/log/stream` requires that session.\n\nKey environment variables and configuration handled through Hono's adapter system for multi-environment deployment.","plugins/Contributing.md":"## 🎉 Welcome\n\nHello and Thank you for your interest in contributing to Portkey Gateway Plugins! We're excited to welcome new  developers to our community. This guide will help you get started with creating and submitting new guardrails plugins for the Portkey Gateway.\n\n## 🚀 Quick Start\n\n1. Fork the repository on GitHub: [https://github.com/Portkey-AI/gateway](https://github.com/Portkey-AI/gateway)\n2. Clone your forked repository to your local machine:\n   ```sh\n   git clone https://github.com/YOUR_USERNAME/gateway.git\n3. Navigate to the plugins directory:\n    ```sh \n    cd gateway/plugins\n    ```\n\n## 🔧 Creating a New Plugin\n\nCreate a new directory for your plugin in the `/plugins` folder:\n```sh \nCopy/plugins\n  /your-plugin-name\n    - manifest.json\n    - main-function.ts\n    - test-file.test.ts (recommended)\n```\n\nCreate a `manifest.json` file defining your plugin's properties, credentials, and functions.\nImplement your plugin logic in `main-function.ts.`\nWrite tests for your plugin in `test-file.test.ts`.\n\nFor detailed information on plugin structure and implementation, please refer to the  [Plugins README](https://github.com/Portkey-AI/gateway/tree/main/plugins#readme).\n\n\n## 📝 Plugin Guidelines\n\nFocus on implementing guardrails as the primary function of your plugin.\nEnsure your plugin works with the `beforeRequest` and `afterRequest` hooks.\nWrite clear and concise documentation within your code and in the `manifest.json` file.\nTest your plugin thoroughly before submission.\n\n\n## 🔄 Contributing a Plugin\n\nThere are two main ways to contribute a plugin to the Portkey Gateway:\n\n### 1. Work on Existing Issues\n\n1. Check the [Issues tab](https://github.com/Portkey-AI/gateway/issues) in the Portkey Gateway repository.\n2. Look for issues labeled with `good-first-issue` and `plugin`.\n3. Submit a pull request referencing the original issue number.\n\n### 2. Propose and Develop a New Plugin\n\nIf you have an idea for a new plugin:\n\n1. Check the [Issues tab](https://github.com/Portkey-AI/gateway/issues) to ensure a similar plugin hasn't been proposed.\n2. Create a new issue with the following title format: [Feature] Your Plugin Name.\n3. In the issue description, provide:\n   - **Plugin Name**: A clear, descriptive name for your plugin.\n   - **Description**: A brief overview of your plugin's functionality and its benefits.\n3. Submit a pull request referencing your proposal issue number.\n\n## 📤 Submitting Your Pull Request\n\nWhen your plugin is ready for review:\n\n1. Ensure your code follows the structure outlined in the [Plugins README](https://github.com/Portkey-AI/gateway/blob/main/plugins/README.md).\n3. Run tests to ensure your plugin works as expected.\n4. Create a pull request with the following title format: `[New Plugin] Your Plugin Name`.\n5. In the pull request description, provide:\n   - A link to the original issue or proposal\n   - A summary of the changes and new features\n\n\nThe maintainers will review your submission and may suggest changes or improvements. Be prepared to engage in a constructive dialogue and make updates as needed.\n\n## 🧪 Testing\n\nBefore submitting your pull request:\n\n1. Write unit tests for your plugin in a `test-file.test.ts` file.\n2. Ensure all tests pass by running:\n\n\n\n## 🤔 Getting Help\nIf you have any questions or need assistance while developing your plugin, please join our [Discord](https://discord.gg/DD7vgKK299) community. It's the fastest way to get support and connect with other contributors.\n\n## 🎊 Your Plugin is Accepted!\nOnce your plugin is reviewed and accepted, it will be merged into the main repository. We appreciate your contribution to making the Portkey Gateway more powerful and versatile!\nThank you for contributing to Portkey Gateway Plugins!\n","plugins/README.md":"# Portkey Gateway Plugins\n\n## Table of Contents\n- [Portkey Gateway Plugins](#portkey-gateway-plugins)\n  - [Table of Contents](#table-of-contents)\n  - [Introduction](#introduction)\n  - [What are Plugins?](#what-are-plugins)\n  - [Why are Plugins Important?](#why-are-plugins-important)\n  - [Concepts](#concepts)\n    - [Hooks](#hooks)\n    - [Guardrails](#guardrails)\n    - [Checks](#checks)\n  - [Creating a Plugin](#creating-a-plugin)\n    - [Folder Structure](#folder-structure)\n    - [Manifest File](#manifest-file)\n    - [Plugin Function](#plugin-function)\n  - [Building Plugins into Your Gateway](#building-plugins-into-your-gateway)\n  - [Using Plugins](#using-plugins)\n  - [Testing Plugins](#testing-plugins)\n\n## Introduction\n\nThis folder contains plugins for the Portkey Gateway. Plugins allow developers to extend the capabilities of the Gateway by adding custom functionality at various stages of the request lifecycle. Currently, the primary type of plugins supported in the AI gateway are guardrails.\n\n## What are Plugins?\n\nPlugins in Portkey enable developers to extend the capabilities of the AI gateway by writing their own functionality. Portkey exposes the concept of hooks, which allows developers to execute custom functions at key points in the request journey. While the plugin system is designed to be extensible, the current focus is on implementing guardrails.\n\n## Why are Plugins Important?\n\nPlugins are crucial for several reasons:\n\n1. **Customization**: They allow you to tailor the Gateway's behavior to your specific needs, especially in terms of implementing guardrails.\n2. **Extensibility**: You can add new features and integrations without modifying the core Gateway code.\n3. **Modularity**: Plugins can be easily added, removed, or updated without affecting other parts of the system.\n4. **Community Contributions**: The plugin system allows the community to contribute and share useful extensions, particularly for guardrail implementations.\n\n## Concepts\n\n### Hooks\n\nHooks in Portkey's AI gateway allow custom functions to be executed at various stages of the request lifecycle. Currently, four types of hooks are supported:\n\n1. **Start**: Executed at the beginning of the request lifecycle for initial setup and logging.\n2. **BeforeRequest**: Executed before the request is sent to the AI model, typically used for implementing guardrails.\n3. **AfterRequest**: Executed after the AI model processes the request but before the response is returned, used for post-processing and validations.\n4. **End**: Executed at the end of the request lifecycle for final logging and cleanup.\n\nWhile hooks can be extended for custom logging solutions and other custom functionalities, their primary intended purpose is to set up and enforce guardrails.\n\n### Guardrails\n\nGuardrails in Portkey's AI gateway are a set of checks that are run together within the `beforeRequest` or `afterRequest` hooks to determine a `verdict`. The verdict of a guardrail dictates the actions to be taken on the request or response. For example, if the guardrail fails, the request can be failed, or the response can be returned with a 246 status code indicating that the guardrails failed.\n\nGuardrails can be defined either through the user interface (UI) of Portkey or as a JSON configuration within the Portkey `config`. This flexibility allows for easy management and customization of guardrails according to the specific needs of the application.\n\n### Checks\n\nA check is an individual function that assesses the input prompt or output response against predefined conditions. Each check returns a boolean verdict or may error out if issues are encountered. Checks are the building blocks of guardrails, and Portkey includes a set of predefined checks as well as the ability to add custom checks.\n\n## Creating a Plugin\n\nWhen creating a plugin for Portkey, keep in mind that it should primarily focus on implementing guardrails. Here's how to structure your plugin:\n\n### Folder Structure\n\nTo create a plugin, follow this structure in the `/plugins` folder:\n\n```\n/plugins\n  /your-plugin-name\n    - manifest.json\n    - main-function.ts\n    - test-file.test.ts (recommended)\n```\n\n### Manifest File\n\nThe `manifest.json` file defines the plugin's properties, required credentials, and available functions. Here's an example structure:\n\n```json\n{\n  \"id\": \"your-plugin-id\",\n  \"description\": \"A brief description of your guardrail plugin\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your API key description\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Your Guardrail Function\",\n      \"id\": \"yourGuardrailId\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Description of your guardrail function\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"paramName\": {\n            \"type\": \"string\",\n            \"label\": \"Parameter Label\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Description of the parameter\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"paramName\"]\n      }\n    }\n  ]\n}\n```\n\n### Plugin Function\n\nCreate a TypeScript file (e.g., `main-function.ts`) that exports a handler function. This function will implement your guardrail logic. Here's a basic structure:\n\n```typescript\nimport { HookEventType, PluginContext, PluginHandler, PluginParameters } from '../types';\n\nexport const handler: PluginHandler = async (\n  context: PluginContext,\n  parameters: PluginParameters,\n  eventType: HookEventType\n) => {\n  // Your guardrail logic here\n  // You can access:\n  // - context.request for request data\n  // - context.response for response data (in afterRequestHook)\n  // - parameters for plugin-specific parameters\n  // - eventType to determine which hook is being executed\n\n  return {\n    error: null, // or error object if an error occurred\n    verdict: true, // or false to indicate if the guardrail passed or failed\n    data: {} // any additional data you want to return\n  };\n};\n```\n\n## Building Plugins into Your Gateway\n\nTo build plugins into your Gateway, follow these steps:\n\n1. In the root directory of the Gateway repository, locate the `conf.json` file.\n2. Edit the `conf.json` file to specify which plugins you want to enable and provide any necessary credentials. Here's an example:\n\n```json\n{\n  \"plugins_enabled\": [\"default\", \"your-guardrail-plugin\"],\n  \"credentials\": {\n    \"your-guardrail-plugin\": {\n      \"apiKey\": \"your-api-key-here\"\n    }\n  },\n  \"cache\": false\n}\n```\n\n3. Run the build command to compile the plugins:\n\n```\nnpm run build-plugins\n```\n\nThis command will compile the plugins and prepare them for use with the Gateway.\n\n## Using Plugins\n\nOnce you've built the plugins, they will be automatically deployed with the Gateway when you run it. You can start the Gateway using one of the following commands:\n\n- For development:\n  ```\n  npm run dev\n  ```\n- For Node.js:\n  ```\n  npm run dev:node\n  ```\n- For Cloudflare Workers:\n  ```\n  npm run dev:workerd\n  ```\n\nThe guardrail plugins you've enabled in the `conf.json` file will be loaded and ready to use.\n\n## Testing Plugins\n\nTo test your guardrail plugins:\n\n1. Ensure you have written test files for your plugins (e.g., `test-file.test.ts`).\n2. Run the test command:\n\n```\nnpx jest\n```\n\nThis command will execute the test files in the plugins repository, allowing you to verify that your guardrail plugins are functioning correctly.","plugins/azure/manifest.json":"{\n  \"name\": \"azure-ai\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Azure AI Content Safety and PII Detection plugins for content moderation\",\n  \"author\": \"Portkey AI\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"pii\": {\n        \"$ref\": \"#/definitions/credentials\"\n      },\n      \"contentSafety\": {\n        \"$ref\": \"#/definitions/credentials\"\n      }\n    }\n  },\n  \"functions\": [\n    {\n      \"name\": \"Content Safety\",\n      \"id\": \"contentSafety\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"parameters\": {\n        \"contentSafety\": {\n          \"blocklistNames\": {\n            \"type\": \"array\",\n            \"description\": \"Array of blocklist names to check against\",\n            \"default\": []\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-11-01\"\n          },\n          \"severity\": {\n            \"type\": \"number\",\n            \"description\": \"Severity threshold for the Content Safety API\",\n            \"default\": 2\n          },\n          \"categories\": {\n            \"type\": \"array\",\n            \"description\": \"Categories to check against\",\n            \"default\": [\"Hate\", \"SelfHarm\", \"Sexual\", \"Violence\"],\n            \"enum\": [\"Hate\", \"SelfHarm\", \"Sexual\", \"Violence\"]\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"PII Detection\",\n      \"id\": \"pii\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"domain\": {\n            \"type\": \"string\",\n            \"description\": \"Domain for PII detection ('none' or 'healthcare')\",\n            \"default\": \"none\"\n          },\n          \"modelVersion\": {\n            \"type\": \"string\",\n            \"description\": \"Version of the PII detection model to use\",\n            \"default\": \"latest\"\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-11-01\"\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"description\": \"Whether to redact the PII detected\",\n            \"default\": false\n          },\n          \"language\": {\n            \"type\": \"string\",\n            \"description\": \"Language for PII detection\",\n            \"default\": \"en\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Shield Prompt\",\n      \"id\": \"shieldPrompt\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": \"Detects jailbreak and prompt injection attacks using Azure AI Content Safety Prompt Shields API\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-09-01\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Protected Material\",\n      \"id\": \"protectedMaterial\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": \"Detects known protected/copyrighted text content in LLM outputs using Azure AI Content Safety Protected Material Detection API\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-09-01\"\n          }\n        }\n      }\n    }\n  ],\n  \"definitions\": {\n    \"credentials\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"azureAuthMode\": {\n          \"type\": \"string\",\n          \"description\": \"Authentication mode for Azure AI services\",\n          \"default\": \"apiKey\",\n          \"enum\": [\"apiKey\", \"entra\", \"managed\"]\n        },\n        \"resourceName\": {\n          \"type\": \"string\",\n          \"description\": \"Azure Cognitive Services resource name (e.g., https://<your-resource-name>.cognitiveservices.azure.com)\",\n          \"required\": true\n        },\n        \"apiKey\": {\n          \"type\": \"string\",\n          \"description\": \"Azure API key\"\n        },\n        \"clientId\": {\n          \"type\": \"string\",\n          \"description\": \"Client ID for Azure Entra ID or Managed Identity authentication\"\n        },\n        \"clientSecret\": {\n          \"type\": \"string\",\n          \"description\": \"Client Secret for Azure Entra ID authentication\"\n        },\n        \"tenantId\": {\n          \"type\": \"string\",\n          \"description\": \"Tenant ID for Azure Entra ID authentication\"\n        },\n        \"customHost\": {\n          \"type\": \"string\",\n          \"description\": \"Custom host for Azure AI services (Private Link etc.)\"\n        }\n      },\n      \"anyOf\": [\n        {\n          \"required\": [\"apiKey\", \"azureAuthMode\"]\n        },\n        {\n          \"required\": [\"clientId\", \"clientSecret\", \"tenantId\", \"azureAuthMode\"]\n        },\n        {\n          \"required\": [\"clientId\", \"azureAuthMode\"]\n        }\n      ]\n    }\n  }\n}\n","plugins/acuvity/manifest.json":"{\n  \"id\": \"acuvity\",\n  \"description\": \"acuvity Plugin\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Find your API key in the acuvity dashboard\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Acuvity\",\n      \"id\": \"Acuvity\",\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Comprehensive content safety and security checks\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prompt_injection\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable prompt injection detection\"\n              }\n            ]\n          },\n          \"prompt_injection_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for prompt injection detection\"\n              }\n            ]\n          },\n          \"toxic\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable toxicity detection\"\n              }\n            ]\n          },\n          \"toxic_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for toxicity detection\"\n              }\n            ]\n          },\n          \"jail_break\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable jailbreak detection\"\n              }\n            ]\n          },\n          \"jail_break_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for jailbreak detection\"\n              }\n            ]\n          },\n          \"malicious_url\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable malicious URL detection\"\n              }\n            ]\n          },\n          \"malicious_url_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for malicious URL detection\"\n              }\n            ]\n          },\n          \"biased\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable bias detection\"\n              }\n            ]\n          },\n          \"biased_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for bias detection\"\n              }\n            ]\n          },\n          \"harmful\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable harmful content detection\"\n              }\n            ]\n          },\n          \"harmful_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for harmful content detection\"\n              }\n            ]\n          },\n          \"language\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable language check\"\n              }\n            ]\n          },\n          \"language_values\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"english\",\n              \"chinese\",\n              \"spanish\",\n              \"french\",\n              \"german\",\n              \"japanese\",\n              \"gibberish\"\n            ],\n            \"default\": \"english\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the language to check\"\n              }\n            ]\n          },\n          \"pii\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable PII detection\"\n              }\n            ]\n          },\n          \"pii_redact\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable PII redaction\"\n              }\n            ]\n          },\n          \"pii_categories\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"email_address\",\n                \"ssn\",\n                \"person\",\n                \"aba_routing_number\",\n                \"address\",\n                \"bank_account\",\n                \"bitcoin_wallet\",\n                \"credit_card\",\n                \"driver_license\",\n                \"itin_number\",\n                \"location\",\n                \"medical_license\",\n                \"money_amount\",\n                \"passport_number\",\n                \"phone_number\"\n              ]\n            },\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the categories that should NOT be allowed in the content\"\n              }\n            ]\n          },\n          \"secrets\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable secrets detection\"\n              }\n            ]\n          },\n          \"secrets_redact\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable secrets redaction\"\n              }\n            ]\n          },\n          \"secrets_categories\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"credentials\",\n                \"adafruit\",\n                \"alibaba\",\n                \"anthropic\",\n                \"apideck\",\n                \"apify\",\n                \"atlassian\",\n                \"aws_secret_key\",\n                \"buildkite\",\n                \"checkout\",\n                \"clickuppersonal\",\n                \"contentfulpersonalaccess\",\n                \"database_url_with_credentials\",\n                \"databricks\",\n                \"denodeploy\",\n                \"dfuse\",\n                \"digitalocean\",\n                \"discord_webhook\",\n                \"docker_hub\",\n                \"doppler\",\n                \"dropbox\",\n                \"endorlabs\",\n                \"fleetbase\",\n                \"flutterwave\",\n                \"frameio\",\n                \"freshdesk\",\n                \"fullstory\",\n                \"github\",\n                \"gitlab\",\n                \"gocardless\",\n                \"google_api\",\n                \"grafana\",\n                \"groq\",\n                \"huggingface\",\n                \"intra42\",\n                \"jwt\",\n                \"klaviyo\",\n                \"launchdarkly\",\n                \"linearapi\",\n                \"locationiq\",\n                \"mailchimp\",\n                \"mailgun\",\n                \"mapbox\",\n                \"maxmind\",\n                \"microsoft_teams_webhook\",\n                \"nightfall\",\n                \"notion\",\n                \"npm\",\n                \"openai\",\n                \"pagarme\",\n                \"paystack\",\n                \"planetscale\",\n                \"planetscaledb\",\n                \"portainer\",\n                \"posthog\",\n                \"postman\",\n                \"prefect\",\n                \"private_key\",\n                \"pubnub_publish\",\n                \"pubnub_subscribe\",\n                \"pulumi\",\n                \"ramp\",\n                \"razorpay\",\n                \"readme\",\n                \"rechargepayments\",\n                \"replicate\",\n                \"rubygems\",\n                \"salesforce\",\n                \"sendgrid\",\n                \"sendinblue\",\n                \"shopify\",\n                \"slack_access\",\n                \"slack_bot\",\n                \"slack_refresh\",\n                \"slack_user\",\n                \"slack_webhook\",\n                \"slack_workflow_webhook\",\n                \"sourcegraph\",\n                \"sourcegraphcody\",\n                \"squareapp\",\n                \"squareup\",\n                \"stripe\",\n                \"supabase\",\n                \"tailscale\",\n                \"tines_webhook\",\n                \"trufflehog\",\n                \"twilio\",\n                \"ubidots\",\n                \"voiceflow\",\n                \"web_url_with_credentials\",\n                \"zapierwebhook\"\n              ]\n            },\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the types of secrets that should be detected in the content\"\n              }\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n","plugins/crowdstrike-aidr/manifest.json":"{\n  \"id\": \"crowdstrike-aidr\",\n  \"description\": \"CrowdStrike AIDR for scanning LLM inputs and outputs\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"AIDR API token\",\n        \"description\": \"AIDR Token. Get your token from the Falcon console.\",\n        \"encrypted\": true\n      },\n      \"baseUrl\": {\n        \"type\": \"string\",\n        \"label\": \"Base url\",\n        \"description\": \"Base URL\"\n      }\n    },\n    \"required\": [\"baseUrl\", \"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Guard Chat Completions\",\n      \"id\": \"guardChatCompletions\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Pass LLM Input and Output to the guard_chat_completions endpoint. Able to block or sanitize text depending on configured rules.\"\n        }\n      ]\n    }\n  ]\n}\n","plugins/javelin/manifest.json":"{\n  \"id\": \"javelin\",\n  \"description\": \"Javelin's AI security platform provides comprehensive guardrails for trust & safety, prompt injection detection, and language detection. Applies all enabled guardrails configured in your Javelin application policy.\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Your Javelin API key for authentication\"\n          }\n        ]\n      },\n      \"domain\": {\n        \"type\": \"string\",\n        \"label\": \"Domain\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Javelin API domain\"\n          }\n        ],\n        \"default\": \"api-dev.javelin.live\",\n        \"required\": false\n      },\n      \"application\": {\n        \"type\": \"string\",\n        \"label\": \"Application Name\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Application name for policy-specific guardrails (required)\"\n          }\n        ],\n        \"required\": true\n      }\n    },\n    \"required\": [\"apiKey\", \"application\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Javelin Guardrails\",\n      \"id\": \"guardrails\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Auto-applies all enabled guardrails in your Javelin application policy including trust & safety, prompt injection detection, language detection, and more\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {}\n      }\n    }\n  ]\n}\n","plugins/f5-guardrails/manifest.json":"{\n  \"id\": \"f5-guardrails\",\n  \"description\": \"F5 Guardrails Plugin - Partner guardrail powered by F5 Guardrails\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your F5 Guardrails API key for authentication\",\n        \"encrypted\": true\n      },\n      \"calypsoUrl\": {\n        \"type\": \"string\",\n        \"label\": \"F5 Guardrails URL\",\n        \"description\": \"The base URL for F5 Guardrails API. Defaults to https://us1.calypsoai.app\",\n        \"default\": \"https://us1.calypsoai.app\"\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"F5 Guardrails\",\n      \"id\": \"scan\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"F5 Guardrails powered by F5 Guardrails provides advanced content moderation and PII detection capabilities for your LLM inputs and outputs.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"label\": \"Redact\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Whether to redact PII data detected by the F5 guardrail. When enabled, detected PII will be masked in the content.\"\n              }\n            ],\n            \"default\": false\n          },\n          \"projectId\": {\n            \"type\": \"string\",\n            \"label\": \"Project-Id\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Your F5 Guardrails project identifier\"\n              }\n            ]\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"label\": \"Timeout\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"The timeout in milliseconds for the F5 guardrail scan. Defaults to 5000.\"\n              }\n            ],\n            \"default\": 5000\n          }\n        }\n      },\n      \"required\": [\"projectId\"]\n    }\n  ]\n}\n","plugins/default/manifest.json":"{\n  \"id\": \"default\",\n  \"name\": \"Default\",\n  \"description\": \"The default set of guardrail functions available in the AI Gateway.\",\n  \"credentials\": [],\n  \"functions\": [\n    {\n      \"name\": \"Regex Match\",\n      \"id\": \"regexMatch\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the request or response text matches a regex pattern.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"rule\": {\n            \"type\": \"string\",\n            \"label\": \"Regex Rule\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the regex pattern\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Match\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be inverted\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"rule\"]\n      }\n    },\n    {\n      \"name\": \"Allowed Request Types\",\n      \"id\": \"allowedRequestTypes\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Control which request types (endpoints) can be processed. Use either an allowlist or blocklist approach. If no types are specified, all request types are allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"allowedTypes\": {\n            \"type\": \"array\",\n            \"label\": \"Allowed Request Types (Multi-select)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select request types to allow. Can be combined with blockedTypes for refined control. Can also be specified in metadata as 'supported_endpoints'.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"complete\",\n                \"chatComplete\",\n                \"embed\",\n                \"rerank\",\n                \"moderate\",\n                \"stream-complete\",\n                \"stream-chatComplete\",\n                \"stream-messages\",\n                \"proxy\",\n                \"imageGenerate\",\n                \"createSpeech\",\n                \"createTranscription\",\n                \"createTranslation\",\n                \"realtime\",\n                \"uploadFile\",\n                \"listFiles\",\n                \"retrieveFile\",\n                \"deleteFile\",\n                \"retrieveFileContent\",\n                \"createBatch\",\n                \"retrieveBatch\",\n                \"cancelBatch\",\n                \"listBatches\",\n                \"getBatchOutput\",\n                \"listFinetunes\",\n                \"createFinetune\",\n                \"retrieveFinetune\",\n                \"cancelFinetune\",\n                \"createModelResponse\",\n                \"getModelResponse\",\n                \"deleteModelResponse\",\n                \"listResponseInputItems\",\n                \"messages\"\n              ]\n            }\n          },\n          \"blockedTypes\": {\n            \"type\": \"array\",\n            \"label\": \"Blocked Request Types (Multi-select)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select request types to block. When combined with allowedTypes, blocked types take precedence. Can also be specified in metadata as 'blocked_endpoints'.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"complete\",\n                \"chatComplete\",\n                \"embed\",\n                \"rerank\",\n                \"moderate\",\n                \"stream-complete\",\n                \"stream-chatComplete\",\n                \"stream-messages\",\n                \"proxy\",\n                \"imageGenerate\",\n                \"createSpeech\",\n                \"createTranscription\",\n                \"createTranslation\",\n                \"realtime\",\n                \"uploadFile\",\n                \"listFiles\",\n                \"retrieveFile\",\n                \"deleteFile\",\n                \"retrieveFileContent\",\n                \"createBatch\",\n                \"retrieveBatch\",\n                \"cancelBatch\",\n                \"listBatches\",\n                \"getBatchOutput\",\n                \"listFinetunes\",\n                \"createFinetune\",\n                \"retrieveFinetune\",\n                \"cancelFinetune\",\n                \"createModelResponse\",\n                \"getModelResponse\",\n                \"deleteModelResponse\",\n                \"listResponseInputItems\",\n                \"messages\"\n              ]\n            }\n          }\n        },\n        \"required\": []\n      }\n    },\n    {\n      \"name\": \"Sentence Count\",\n      \"id\": \"sentenceCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of sentences. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minSentences\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Sentence Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of sentences to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxSentences\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Sentence Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of sentences to allow.\"\n              }\n            ],\n            \"default\": 99999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Word Count\",\n      \"id\": \"wordCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of words. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minWords\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Word Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of words to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxWords\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Word Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of words to allow.\"\n              }\n            ],\n            \"default\": 99999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Character Count\",\n      \"id\": \"characterCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of characters. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minCharacters\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Character Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of characters to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxCharacters\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Character Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of characters to allow.\"\n              }\n            ],\n            \"default\": 9999999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"JSON Schema\",\n      \"id\": \"jsonSchema\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the response JSON matches a JSON schema.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"schema\": {\n            \"type\": \"json\",\n            \"label\": \"JSON Schema\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the JSON schema to validate against.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Schema Match\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when schema does not match\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"schema\"]\n      }\n    },\n    {\n      \"name\": \"JSON Keys\",\n      \"id\": \"jsonKeys\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the response JSON contains any, all or none of the mentioned keys.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"keys\": {\n            \"type\": \"array\",\n            \"label\": \"JSON Keys\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the keys to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"any\", \"all\", \"none\"],\n            \"default\": \"any\"\n          }\n        },\n        \"required\": [\"keys\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Contains\",\n      \"id\": \"contains\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains any, all or none of the words or phrases\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"words\": {\n            \"type\": \"array\",\n            \"label\": \"Words or Phrases\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the words or phrases to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"any\", \"all\", \"none\"],\n            \"default\": \"any\"\n          }\n        },\n        \"required\": [\"words\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Valid URLs\",\n      \"id\": \"validUrls\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if all the URLs mentioned in the content are valid\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"onlyDNS\": {\n            \"type\": \"boolean\",\n            \"label\": \"Only DNS (10x faster)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Only check if all URL domains resolve.\"\n              }\n            ],\n            \"default\": false\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert URL Validation\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when URLs are invalid\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Webhook\",\n      \"id\": \"webhook\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Makes a request to a webhook which returns the verdict and data\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"webhookURL\": {\n            \"type\": \"string\",\n            \"label\": \"Webhook URL\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"eg: https://webhook.site/guardrail\"\n              }\n            ]\n          },\n          \"headers\": {\n            \"type\": \"json\",\n            \"label\": \"Headers\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the headers to send with the request.\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"webhookURL\"]\n      }\n    },\n    {\n      \"name\": \"Log\",\n      \"id\": \"log\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Makes a request to a log URL and always gives `true` as the verdict.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"logURL\": {\n            \"type\": \"string\",\n            \"label\": \"Log URL\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"eg: https://logging.site/collector\"\n              }\n            ]\n          },\n          \"headers\": {\n            \"type\": \"json\",\n            \"label\": \"Headers\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the headers to send with the request.\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"logURL\"]\n      }\n    },\n    {\n      \"name\": \"Contains Code\",\n      \"id\": \"containsCode\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains code of format SQL, Python, TypeScript, etc.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"format\": {\n            \"type\": \"string\",\n            \"label\": \"Code Format\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the code format to check for.\"\n              }\n            ],\n            \"enum\": [\n              \"SQL\",\n              \"Python\",\n              \"TypeScript\",\n              \"JavaScript\",\n              \"Java\",\n              \"C#\",\n              \"C++\",\n              \"C\",\n              \"Ruby\",\n              \"PHP\",\n              \"Swift\",\n              \"Kotlin\",\n              \"Go\",\n              \"Rust\",\n              \"Scala\",\n              \"R\",\n              \"Perl\",\n              \"Shell\",\n              \"HTML\",\n              \"CSS\",\n              \"XML\",\n              \"JSON\",\n              \"YAML\",\n              \"Markdown\",\n              \"Dockerfile\"\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Code Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when code is not found\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"format\"]\n      }\n    },\n    {\n      \"name\": \"Uppercase check\",\n      \"id\": \"alluppercase\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if content has all uppercase letters.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Case Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text is not all uppercase\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Ends With\",\n      \"id\": \"endsWith\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the content ends with a specified string.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"suffix\": {\n            \"type\": \"string\",\n            \"label\": \"Suffix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the suffix to check for.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Suffix Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text does not end with suffix\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"suffix\"]\n      }\n    },\n    {\n      \"name\": \"Lowercase check\",\n      \"id\": \"alllowercase\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if content has all lowercase letters.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Case Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text is not all lowercase\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Allowed Models\",\n      \"id\": \"modelwhitelist\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Blocks any request whose model isn’t on this list.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"models\": {\n            \"type\": \"array\",\n            \"label\": \"Model list\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the allowed models. e.g. gpt-4o, llama-3-70b, mixtral-8x7b\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Model Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"When on, any model in the list is blocked instead of allowed.\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"models\"]\n      }\n    },\n    {\n      \"name\": \"Model Rules\",\n      \"id\": \"modelRules\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Allow requests based on metadata-driven rules mapping to allowed models.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"rules\": {\n            \"type\": \"object\",\n            \"label\": \"Rules object: {\\\"defaults\\\": [\\\"model\\\"], \\\"metadata\\\": {\\\"key\\\": {\\\"value\\\": [\\\"models\\\"]}}}\",\n            \"description\": [\n              {\n                \"type\": \"text\",\n                \"text\": \"Overrides model list using metadata-based routing.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Model Check\",\n            \"description\": [\n              {\n                \"type\": \"text\",\n                \"text\": \"When on, any model resolved by rules is blocked instead of allowed.\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"rules\"]\n      }\n    },\n    {\n      \"name\": \"JWT\",\n      \"id\": \"jwt\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the JWT token is valid.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"jwksUri\": {\n            \"type\": \"string\",\n            \"label\": \"JWKS URI\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the JWKS URI of the JWT token.\"\n              }\n            ]\n          },\n          \"headerKey\": {\n            \"type\": \"string\",\n            \"label\": \"Header Key\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the header key to check for the JWT token.\"\n              }\n            ]\n          },\n          \"cacheMaxAge\": {\n            \"type\": \"number\",\n            \"label\": \"Cache Max Age\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the cache max age in seconds.\"\n              }\n            ],\n            \"default\": 86400\n          },\n          \"clockTolerance\": {\n            \"type\": \"number\",\n            \"label\": \"Clock Tolerance\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the clock tolerance in seconds.\"\n              }\n            ],\n            \"default\": 5\n          },\n          \"maxTokenAge\": {\n            \"type\": \"string\",\n            \"label\": \"Max Token Age\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the max token age.\"\n              }\n            ],\n            \"default\": \"1d\"\n          }\n        },\n        \"required\": [\"jwksUri\", \"headerKey\"]\n      }\n    },\n    {\n      \"name\": \"Required Metadata Keys\",\n      \"id\": \"requiredMetadataKeys\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the metadata contains all the required keys\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"metadataKeys\": {\n            \"type\": \"array\",\n            \"label\": \"Metadata Keys\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the metadata keys to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"all\", \"any\", \"none\"],\n            \"default\": \"all\"\n          }\n        },\n        \"required\": [\"metadataKeys\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Add Prefix\",\n      \"id\": \"addPrefix\",\n      \"type\": \"transformer\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Adds a configurable prefix to the user's prompt or messages before sending to the AI model\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prefix\": {\n            \"type\": \"string\",\n            \"label\": \"Prefix Text\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"The text to prepend to the user's prompt or message\"\n              }\n            ],\n            \"default\": \"Please respond helpfully and accurately to the following: \"\n          },\n          \"applyToRole\": {\n            \"type\": \"string\",\n            \"label\": \"Apply to Role\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"For chat completions, which message role to apply the prefix to\"\n              }\n            ],\n            \"enum\": [\"user\", \"system\", \"assistant\"],\n            \"default\": \"user\"\n          },\n          \"addToExisting\": {\n            \"type\": \"boolean\",\n            \"label\": \"Add to Existing Message\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, adds prefix to existing message. If false, creates new message with prefix\"\n              }\n            ],\n            \"default\": true\n          },\n          \"onlyIfEmpty\": {\n            \"type\": \"boolean\",\n            \"label\": \"Only Apply If Role Empty\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Only apply prefix if no message exists for the specified role (useful for system messages)\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"prefix\"]\n      }\n    },\n    {\n      \"name\": \"Not Null\",\n      \"id\": \"notNull\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the response content is not null, undefined, or empty. Useful for detecting when an AI model returns no content.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when content IS null (inverts the check)\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    }\n  ]\n}\n","plugins/exa/manifest.json":"{\n  \"id\": \"exa\",\n  \"description\": \"Exa.ai integration for enhancing AI responses with real-time web search information\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your Exa.ai API key\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Online Search\",\n      \"id\": \"online\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"type\": \"transformer\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Enhances prompts with relevant web search results from Exa's search API before processing the request\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prefix\": {\n            \"type\": \"string\",\n            \"label\": \"Context Prefix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"String to prepend to the search context\"\n              }\n            ],\n            \"default\": \"\\n<web_search_context>\"\n          },\n          \"suffix\": {\n            \"type\": \"string\",\n            \"label\": \"Context Suffix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"String to append to the search context\"\n              }\n            ],\n            \"default\": \"\\n</web_search_context>\"\n          },\n          \"numResults\": {\n            \"type\": \"number\",\n            \"label\": \"Number of Results\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Number of search results to include in the enhanced prompt\"\n              }\n            ],\n            \"default\": 5\n          },\n          \"includeDomains\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"label\": \"Include Domains\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Limit search results to these domains (e.g., ['nytimes.com', 'bbc.com'])\"\n              }\n            ]\n          },\n          \"excludeDomains\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"label\": \"Exclude Domains\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Remove these domains from search results (e.g., ['wikipedia.org', 'reddit.com'])\"\n              }\n            ]\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"label\": \"Timeout\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Timeout for the Exa API call in milliseconds\"\n              }\n            ],\n            \"default\": 10000\n          }\n        },\n        \"required\": []\n      }\n    }\n  ]\n}\n","plugins/lasso/manifest.json":"# Lasso Skill\n\nPath: `plugins/lasso/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/manifest.json)","plugins/lasso/README.md":"# lasso Documentation\n\nPath: `plugins/lasso/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/README.md)","plugins/mistral/manifest.json":"# Mistral Skill\n\nPath: `plugins/mistral/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/mistral/manifest.json)","plugins/pangea/manifest.json":"# Pangea Skill\n\nPath: `plugins/pangea/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pangea/manifest.json)","plugins/panw-prisma-airs/manifest.json":"# Panw-prisma-airs Skill\n\nPath: `plugins/panw-prisma-airs/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/panw-prisma-airs/manifest.json)","plugins/patronus/manifest.json":"# Patronus Skill\n\nPath: `plugins/patronus/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/patronus/manifest.json)","plugins/pillar/manifest.json":"# Pillar Skill\n\nPath: `plugins/pillar/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pillar/manifest.json)","plugins/portkey/manifest.json":"# Portkey Skill\n\nPath: `plugins/portkey/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/portkey/manifest.json)","plugins/promptfoo/manifest.json":"# Promptfoo Skill\n\nPath: `plugins/promptfoo/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptfoo/manifest.json)","plugins/promptsecurity/manifest.json":"# Promptsecurity Skill\n\nPath: `plugins/promptsecurity/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptsecurity/manifest.json)","plugins/qualifire/manifest.json":"# Qualifire Skill\n\nPath: `plugins/qualifire/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/qualifire/manifest.json)","plugins/sydelabs/manifest.json":"# Sydelabs Skill\n\nPath: `plugins/sydelabs/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/sydelabs/manifest.json)","plugins/walledai/manifest.json":"# Walledai Skill\n\nPath: `plugins/walledai/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/walledai/manifest.json)"},"files":{"plugins/aporia/manifest.json":"{\n  \"id\": \"aporia\",\n  \"description\": \"Aporia Guardrails mitigates LLM hallucinations, inappropriate responses, prompt injection attacks, and other unintended behaviors in real-time\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Find your API key in the Aporia dashboard\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Validate - Project\",\n      \"id\": \"validateProject\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check all the policies within an Aporia project\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"projectID\": {\n            \"type\": \"string\",\n            \"label\": \"Project ID\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the Aporia Project ID to validate\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"projectID\"]\n      }\n    }\n  ]\n}\n","plugins/bedrock/manifest.json":"{\n  \"id\": \"bedrock\",\n  \"description\": \"AWS Bedrock Content Moderation classifier leverages AWS guardrails for effective guardrails and introduces a pragmatic approach to LLM safety by addressing model-generated harms such as unqualified advice and PII\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"accessKeyId\": {\n        \"type\": \"string\",\n        \"label\": \"Access Key ID\",\n        \"description\": \"Find your Access Key ID in the AWS Management Console\",\n        \"encrypted\": true\n      },\n      \"accessKeySecret\": {\n        \"type\": \"string\",\n        \"label\": \"Access Key Secret\",\n        \"description\": \"Find your Access Key Secret in the AWS Management Console\",\n        \"encrypted\": true\n      },\n      \"awsSessionToken\": {\n        \"type\": \"string\",\n        \"label\": \"AWS Session Token\",\n        \"description\": \"AWS Session token.\"\n      },\n      \"region\": {\n        \"type\": \"string\",\n        \"description\": \"Bedrock guardrail hosted region\",\n        \"lable\": \"Region\"\n      }\n    },\n    \"required\": [\"accessKeyId\", \"accessKeySecret\", \"region\"]\n  },\n\n  \"functions\": [\n    {\n      \"name\": \"Apply Bedrock guardrail\",\n      \"id\": \"guard\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Filters out Content that contain harmful content & prompt filters\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"guardrailVersion\": {\n            \"type\": \"string\",\n            \"label\": \"Guardrail Version\",\n            \"description\": \"Select the version of the guardrail to use\"\n          },\n          \"guardrailId\": {\n            \"type\": \"string\",\n            \"label\": \"Guardrail ID\",\n            \"description\": \"ID of the guardrail.\"\n          },\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"label\": \"Redact PII\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the PII identified will be redacted\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"guardrailVersion\", \"guardrailId\"]\n      }\n    }\n  ]\n}\n","CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nThis is the **Portkey AI Gateway** - a fast, reliable AI gateway that routes requests to 250+ LLMs with sub-1ms latency. It's built with Hono framework for TypeScript/JavaScript and can be deployed to multiple environments including Cloudflare Workers, Node.js servers, and Docker containers.\n\n## Development Commands\n\n### Core Development\n- `npm run dev` - Start development server using Wrangler (Cloudflare Workers)\n- `npm run dev:node` - Start development server using Node.js\n- `npm run build` - Build the project for production\n- `npm run build-plugins` - Build the plugin system\n\n### Testing\n- `npm run test:gateway` - Run tests for the main gateway code (src/)\n- `npm run test:plugins` - Run tests for plugins\n- `jest src/` - Run specific gateway tests\n- `jest plugins/` - Run specific plugin tests\n\n### Code Quality\n- `npm run format` - Format code with Prettier\n- `npm run format:check` - Check code formatting\n- `npm run pretty` - Alternative format command\n\n### Deployment\n- `npm run deploy` - Deploy to Cloudflare Workers\n- `npm run start:node` - Start production Node.js server\n\n## Architecture\n\n### Core Components\n\n**Main Application (`src/index.ts`)**\n- Hono-based HTTP server with middleware pipeline\n- Handles multiple AI provider integrations\n- Routes: `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, etc.\n\n**Provider System (`src/providers/`)**\n- Modular provider implementations (OpenAI, Anthropic, Azure, etc.)\n- Each provider has standardized interface: `api.ts`, `chatComplete.ts`, `embed.ts`\n- Provider configs define supported features and transformations\n\n**Middleware Pipeline**\n- `requestValidator` - Validates incoming requests\n- `hooks` - Pre/post request hooks\n- `memoryCache` - Response caching\n- `logger` - Request/response logging\n- `adminAuth` - Node-only local UI session auth for `/public/*` login endpoints and `/log/stream`\n- `portkey` - Core Portkey-specific middleware for routing, guardrails, etc.\n\n**Plugin System (`plugins/`)**\n- Guardrail plugins for content filtering, PII detection, etc.\n- Each plugin has `manifest.json` defining capabilities\n- Plugins are built separately with `npm run build-plugins`\n\n### Key Concepts\n\n**Configs** - JSON configurations that define:\n- Provider routing and fallbacks\n- Load balancing strategies\n- Guardrails and content filtering\n- Caching and retry policies\n\n**Handlers** - Route-specific request processors in `src/handlers/`\n- Each AI API endpoint has dedicated handler\n- Stream handling for real-time responses\n- WebSocket support for realtime APIs\n\n## File Structure\n\n- `src/providers/` - AI provider integrations\n- `src/handlers/` - API endpoint handlers\n- `src/middlewares/` - Request/response middleware\n- `plugins/` - Guardrail and validation plugins\n- `cookbook/` - Example integrations and use cases\n- `conf.json` - Runtime configuration\n\n## Testing Strategy\n\nTests are organized by component:\n- `src/tests/` - Core gateway functionality tests\n- `src/handlers/__tests__/` - Handler-specific tests\n- `plugins/*/**.test.ts` - Plugin tests\n- Test timeout: 30 seconds (configured in jest.config.js)\n\n## Configuration\n\nThe gateway uses `conf.json` for runtime configuration. Sample config available in `conf_sample.json`.\n\nFor local UI hardening, set `admin_token` in `conf.json`. The `/public` UI uses this token to establish an in-memory admin session, and `/log/stream` requires that session.\n\nKey environment variables and configuration handled through Hono's adapter system for multi-environment deployment.","plugins/Contributing.md":"## 🎉 Welcome\n\nHello and Thank you for your interest in contributing to Portkey Gateway Plugins! We're excited to welcome new  developers to our community. This guide will help you get started with creating and submitting new guardrails plugins for the Portkey Gateway.\n\n## 🚀 Quick Start\n\n1. Fork the repository on GitHub: [https://github.com/Portkey-AI/gateway](https://github.com/Portkey-AI/gateway)\n2. Clone your forked repository to your local machine:\n   ```sh\n   git clone https://github.com/YOUR_USERNAME/gateway.git\n3. Navigate to the plugins directory:\n    ```sh \n    cd gateway/plugins\n    ```\n\n## 🔧 Creating a New Plugin\n\nCreate a new directory for your plugin in the `/plugins` folder:\n```sh \nCopy/plugins\n  /your-plugin-name\n    - manifest.json\n    - main-function.ts\n    - test-file.test.ts (recommended)\n```\n\nCreate a `manifest.json` file defining your plugin's properties, credentials, and functions.\nImplement your plugin logic in `main-function.ts.`\nWrite tests for your plugin in `test-file.test.ts`.\n\nFor detailed information on plugin structure and implementation, please refer to the  [Plugins README](https://github.com/Portkey-AI/gateway/tree/main/plugins#readme).\n\n\n## 📝 Plugin Guidelines\n\nFocus on implementing guardrails as the primary function of your plugin.\nEnsure your plugin works with the `beforeRequest` and `afterRequest` hooks.\nWrite clear and concise documentation within your code and in the `manifest.json` file.\nTest your plugin thoroughly before submission.\n\n\n## 🔄 Contributing a Plugin\n\nThere are two main ways to contribute a plugin to the Portkey Gateway:\n\n### 1. Work on Existing Issues\n\n1. Check the [Issues tab](https://github.com/Portkey-AI/gateway/issues) in the Portkey Gateway repository.\n2. Look for issues labeled with `good-first-issue` and `plugin`.\n3. Submit a pull request referencing the original issue number.\n\n### 2. Propose and Develop a New Plugin\n\nIf you have an idea for a new plugin:\n\n1. Check the [Issues tab](https://github.com/Portkey-AI/gateway/issues) to ensure a similar plugin hasn't been proposed.\n2. Create a new issue with the following title format: [Feature] Your Plugin Name.\n3. In the issue description, provide:\n   - **Plugin Name**: A clear, descriptive name for your plugin.\n   - **Description**: A brief overview of your plugin's functionality and its benefits.\n3. Submit a pull request referencing your proposal issue number.\n\n## 📤 Submitting Your Pull Request\n\nWhen your plugin is ready for review:\n\n1. Ensure your code follows the structure outlined in the [Plugins README](https://github.com/Portkey-AI/gateway/blob/main/plugins/README.md).\n3. Run tests to ensure your plugin works as expected.\n4. Create a pull request with the following title format: `[New Plugin] Your Plugin Name`.\n5. In the pull request description, provide:\n   - A link to the original issue or proposal\n   - A summary of the changes and new features\n\n\nThe maintainers will review your submission and may suggest changes or improvements. Be prepared to engage in a constructive dialogue and make updates as needed.\n\n## 🧪 Testing\n\nBefore submitting your pull request:\n\n1. Write unit tests for your plugin in a `test-file.test.ts` file.\n2. Ensure all tests pass by running:\n\n\n\n## 🤔 Getting Help\nIf you have any questions or need assistance while developing your plugin, please join our [Discord](https://discord.gg/DD7vgKK299) community. It's the fastest way to get support and connect with other contributors.\n\n## 🎊 Your Plugin is Accepted!\nOnce your plugin is reviewed and accepted, it will be merged into the main repository. We appreciate your contribution to making the Portkey Gateway more powerful and versatile!\nThank you for contributing to Portkey Gateway Plugins!\n","plugins/README.md":"# Portkey Gateway Plugins\n\n## Table of Contents\n- [Portkey Gateway Plugins](#portkey-gateway-plugins)\n  - [Table of Contents](#table-of-contents)\n  - [Introduction](#introduction)\n  - [What are Plugins?](#what-are-plugins)\n  - [Why are Plugins Important?](#why-are-plugins-important)\n  - [Concepts](#concepts)\n    - [Hooks](#hooks)\n    - [Guardrails](#guardrails)\n    - [Checks](#checks)\n  - [Creating a Plugin](#creating-a-plugin)\n    - [Folder Structure](#folder-structure)\n    - [Manifest File](#manifest-file)\n    - [Plugin Function](#plugin-function)\n  - [Building Plugins into Your Gateway](#building-plugins-into-your-gateway)\n  - [Using Plugins](#using-plugins)\n  - [Testing Plugins](#testing-plugins)\n\n## Introduction\n\nThis folder contains plugins for the Portkey Gateway. Plugins allow developers to extend the capabilities of the Gateway by adding custom functionality at various stages of the request lifecycle. Currently, the primary type of plugins supported in the AI gateway are guardrails.\n\n## What are Plugins?\n\nPlugins in Portkey enable developers to extend the capabilities of the AI gateway by writing their own functionality. Portkey exposes the concept of hooks, which allows developers to execute custom functions at key points in the request journey. While the plugin system is designed to be extensible, the current focus is on implementing guardrails.\n\n## Why are Plugins Important?\n\nPlugins are crucial for several reasons:\n\n1. **Customization**: They allow you to tailor the Gateway's behavior to your specific needs, especially in terms of implementing guardrails.\n2. **Extensibility**: You can add new features and integrations without modifying the core Gateway code.\n3. **Modularity**: Plugins can be easily added, removed, or updated without affecting other parts of the system.\n4. **Community Contributions**: The plugin system allows the community to contribute and share useful extensions, particularly for guardrail implementations.\n\n## Concepts\n\n### Hooks\n\nHooks in Portkey's AI gateway allow custom functions to be executed at various stages of the request lifecycle. Currently, four types of hooks are supported:\n\n1. **Start**: Executed at the beginning of the request lifecycle for initial setup and logging.\n2. **BeforeRequest**: Executed before the request is sent to the AI model, typically used for implementing guardrails.\n3. **AfterRequest**: Executed after the AI model processes the request but before the response is returned, used for post-processing and validations.\n4. **End**: Executed at the end of the request lifecycle for final logging and cleanup.\n\nWhile hooks can be extended for custom logging solutions and other custom functionalities, their primary intended purpose is to set up and enforce guardrails.\n\n### Guardrails\n\nGuardrails in Portkey's AI gateway are a set of checks that are run together within the `beforeRequest` or `afterRequest` hooks to determine a `verdict`. The verdict of a guardrail dictates the actions to be taken on the request or response. For example, if the guardrail fails, the request can be failed, or the response can be returned with a 246 status code indicating that the guardrails failed.\n\nGuardrails can be defined either through the user interface (UI) of Portkey or as a JSON configuration within the Portkey `config`. This flexibility allows for easy management and customization of guardrails according to the specific needs of the application.\n\n### Checks\n\nA check is an individual function that assesses the input prompt or output response against predefined conditions. Each check returns a boolean verdict or may error out if issues are encountered. Checks are the building blocks of guardrails, and Portkey includes a set of predefined checks as well as the ability to add custom checks.\n\n## Creating a Plugin\n\nWhen creating a plugin for Portkey, keep in mind that it should primarily focus on implementing guardrails. Here's how to structure your plugin:\n\n### Folder Structure\n\nTo create a plugin, follow this structure in the `/plugins` folder:\n\n```\n/plugins\n  /your-plugin-name\n    - manifest.json\n    - main-function.ts\n    - test-file.test.ts (recommended)\n```\n\n### Manifest File\n\nThe `manifest.json` file defines the plugin's properties, required credentials, and available functions. Here's an example structure:\n\n```json\n{\n  \"id\": \"your-plugin-id\",\n  \"description\": \"A brief description of your guardrail plugin\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your API key description\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Your Guardrail Function\",\n      \"id\": \"yourGuardrailId\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Description of your guardrail function\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"paramName\": {\n            \"type\": \"string\",\n            \"label\": \"Parameter Label\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Description of the parameter\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"paramName\"]\n      }\n    }\n  ]\n}\n```\n\n### Plugin Function\n\nCreate a TypeScript file (e.g., `main-function.ts`) that exports a handler function. This function will implement your guardrail logic. Here's a basic structure:\n\n```typescript\nimport { HookEventType, PluginContext, PluginHandler, PluginParameters } from '../types';\n\nexport const handler: PluginHandler = async (\n  context: PluginContext,\n  parameters: PluginParameters,\n  eventType: HookEventType\n) => {\n  // Your guardrail logic here\n  // You can access:\n  // - context.request for request data\n  // - context.response for response data (in afterRequestHook)\n  // - parameters for plugin-specific parameters\n  // - eventType to determine which hook is being executed\n\n  return {\n    error: null, // or error object if an error occurred\n    verdict: true, // or false to indicate if the guardrail passed or failed\n    data: {} // any additional data you want to return\n  };\n};\n```\n\n## Building Plugins into Your Gateway\n\nTo build plugins into your Gateway, follow these steps:\n\n1. In the root directory of the Gateway repository, locate the `conf.json` file.\n2. Edit the `conf.json` file to specify which plugins you want to enable and provide any necessary credentials. Here's an example:\n\n```json\n{\n  \"plugins_enabled\": [\"default\", \"your-guardrail-plugin\"],\n  \"credentials\": {\n    \"your-guardrail-plugin\": {\n      \"apiKey\": \"your-api-key-here\"\n    }\n  },\n  \"cache\": false\n}\n```\n\n3. Run the build command to compile the plugins:\n\n```\nnpm run build-plugins\n```\n\nThis command will compile the plugins and prepare them for use with the Gateway.\n\n## Using Plugins\n\nOnce you've built the plugins, they will be automatically deployed with the Gateway when you run it. You can start the Gateway using one of the following commands:\n\n- For development:\n  ```\n  npm run dev\n  ```\n- For Node.js:\n  ```\n  npm run dev:node\n  ```\n- For Cloudflare Workers:\n  ```\n  npm run dev:workerd\n  ```\n\nThe guardrail plugins you've enabled in the `conf.json` file will be loaded and ready to use.\n\n## Testing Plugins\n\nTo test your guardrail plugins:\n\n1. Ensure you have written test files for your plugins (e.g., `test-file.test.ts`).\n2. Run the test command:\n\n```\nnpx jest\n```\n\nThis command will execute the test files in the plugins repository, allowing you to verify that your guardrail plugins are functioning correctly.","plugins/azure/manifest.json":"{\n  \"name\": \"azure-ai\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Azure AI Content Safety and PII Detection plugins for content moderation\",\n  \"author\": \"Portkey AI\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"pii\": {\n        \"$ref\": \"#/definitions/credentials\"\n      },\n      \"contentSafety\": {\n        \"$ref\": \"#/definitions/credentials\"\n      }\n    }\n  },\n  \"functions\": [\n    {\n      \"name\": \"Content Safety\",\n      \"id\": \"contentSafety\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"parameters\": {\n        \"contentSafety\": {\n          \"blocklistNames\": {\n            \"type\": \"array\",\n            \"description\": \"Array of blocklist names to check against\",\n            \"default\": []\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-11-01\"\n          },\n          \"severity\": {\n            \"type\": \"number\",\n            \"description\": \"Severity threshold for the Content Safety API\",\n            \"default\": 2\n          },\n          \"categories\": {\n            \"type\": \"array\",\n            \"description\": \"Categories to check against\",\n            \"default\": [\"Hate\", \"SelfHarm\", \"Sexual\", \"Violence\"],\n            \"enum\": [\"Hate\", \"SelfHarm\", \"Sexual\", \"Violence\"]\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"PII Detection\",\n      \"id\": \"pii\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"domain\": {\n            \"type\": \"string\",\n            \"description\": \"Domain for PII detection ('none' or 'healthcare')\",\n            \"default\": \"none\"\n          },\n          \"modelVersion\": {\n            \"type\": \"string\",\n            \"description\": \"Version of the PII detection model to use\",\n            \"default\": \"latest\"\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-11-01\"\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"description\": \"Whether to redact the PII detected\",\n            \"default\": false\n          },\n          \"language\": {\n            \"type\": \"string\",\n            \"description\": \"Language for PII detection\",\n            \"default\": \"en\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Shield Prompt\",\n      \"id\": \"shieldPrompt\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": \"Detects jailbreak and prompt injection attacks using Azure AI Content Safety Prompt Shields API\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-09-01\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Protected Material\",\n      \"id\": \"protectedMaterial\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": \"Detects known protected/copyrighted text content in LLM outputs using Azure AI Content Safety Protected Material Detection API\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-09-01\"\n          }\n        }\n      }\n    }\n  ],\n  \"definitions\": {\n    \"credentials\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"azureAuthMode\": {\n          \"type\": \"string\",\n          \"description\": \"Authentication mode for Azure AI services\",\n          \"default\": \"apiKey\",\n          \"enum\": [\"apiKey\", \"entra\", \"managed\"]\n        },\n        \"resourceName\": {\n          \"type\": \"string\",\n          \"description\": \"Azure Cognitive Services resource name (e.g., https://<your-resource-name>.cognitiveservices.azure.com)\",\n          \"required\": true\n        },\n        \"apiKey\": {\n          \"type\": \"string\",\n          \"description\": \"Azure API key\"\n        },\n        \"clientId\": {\n          \"type\": \"string\",\n          \"description\": \"Client ID for Azure Entra ID or Managed Identity authentication\"\n        },\n        \"clientSecret\": {\n          \"type\": \"string\",\n          \"description\": \"Client Secret for Azure Entra ID authentication\"\n        },\n        \"tenantId\": {\n          \"type\": \"string\",\n          \"description\": \"Tenant ID for Azure Entra ID authentication\"\n        },\n        \"customHost\": {\n          \"type\": \"string\",\n          \"description\": \"Custom host for Azure AI services (Private Link etc.)\"\n        }\n      },\n      \"anyOf\": [\n        {\n          \"required\": [\"apiKey\", \"azureAuthMode\"]\n        },\n        {\n          \"required\": [\"clientId\", \"clientSecret\", \"tenantId\", \"azureAuthMode\"]\n        },\n        {\n          \"required\": [\"clientId\", \"azureAuthMode\"]\n        }\n      ]\n    }\n  }\n}\n","plugins/acuvity/manifest.json":"{\n  \"id\": \"acuvity\",\n  \"description\": \"acuvity Plugin\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Find your API key in the acuvity dashboard\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Acuvity\",\n      \"id\": \"Acuvity\",\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Comprehensive content safety and security checks\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prompt_injection\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable prompt injection detection\"\n              }\n            ]\n          },\n          \"prompt_injection_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for prompt injection detection\"\n              }\n            ]\n          },\n          \"toxic\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable toxicity detection\"\n              }\n            ]\n          },\n          \"toxic_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for toxicity detection\"\n              }\n            ]\n          },\n          \"jail_break\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable jailbreak detection\"\n              }\n            ]\n          },\n          \"jail_break_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for jailbreak detection\"\n              }\n            ]\n          },\n          \"malicious_url\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable malicious URL detection\"\n              }\n            ]\n          },\n          \"malicious_url_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for malicious URL detection\"\n              }\n            ]\n          },\n          \"biased\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable bias detection\"\n              }\n            ]\n          },\n          \"biased_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for bias detection\"\n              }\n            ]\n          },\n          \"harmful\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable harmful content detection\"\n              }\n            ]\n          },\n          \"harmful_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for harmful content detection\"\n              }\n            ]\n          },\n          \"language\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable language check\"\n              }\n            ]\n          },\n          \"language_values\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"english\",\n              \"chinese\",\n              \"spanish\",\n              \"french\",\n              \"german\",\n              \"japanese\",\n              \"gibberish\"\n            ],\n            \"default\": \"english\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the language to check\"\n              }\n            ]\n          },\n          \"pii\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable PII detection\"\n              }\n            ]\n          },\n          \"pii_redact\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable PII redaction\"\n              }\n            ]\n          },\n          \"pii_categories\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"email_address\",\n                \"ssn\",\n                \"person\",\n                \"aba_routing_number\",\n                \"address\",\n                \"bank_account\",\n                \"bitcoin_wallet\",\n                \"credit_card\",\n                \"driver_license\",\n                \"itin_number\",\n                \"location\",\n                \"medical_license\",\n                \"money_amount\",\n                \"passport_number\",\n                \"phone_number\"\n              ]\n            },\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the categories that should NOT be allowed in the content\"\n              }\n            ]\n          },\n          \"secrets\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable secrets detection\"\n              }\n            ]\n          },\n          \"secrets_redact\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable secrets redaction\"\n              }\n            ]\n          },\n          \"secrets_categories\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"credentials\",\n                \"adafruit\",\n                \"alibaba\",\n                \"anthropic\",\n                \"apideck\",\n                \"apify\",\n                \"atlassian\",\n                \"aws_secret_key\",\n                \"buildkite\",\n                \"checkout\",\n                \"clickuppersonal\",\n                \"contentfulpersonalaccess\",\n                \"database_url_with_credentials\",\n                \"databricks\",\n                \"denodeploy\",\n                \"dfuse\",\n                \"digitalocean\",\n                \"discord_webhook\",\n                \"docker_hub\",\n                \"doppler\",\n                \"dropbox\",\n                \"endorlabs\",\n                \"fleetbase\",\n                \"flutterwave\",\n                \"frameio\",\n                \"freshdesk\",\n                \"fullstory\",\n                \"github\",\n                \"gitlab\",\n                \"gocardless\",\n                \"google_api\",\n                \"grafana\",\n                \"groq\",\n                \"huggingface\",\n                \"intra42\",\n                \"jwt\",\n                \"klaviyo\",\n                \"launchdarkly\",\n                \"linearapi\",\n                \"locationiq\",\n                \"mailchimp\",\n                \"mailgun\",\n                \"mapbox\",\n                \"maxmind\",\n                \"microsoft_teams_webhook\",\n                \"nightfall\",\n                \"notion\",\n                \"npm\",\n                \"openai\",\n                \"pagarme\",\n                \"paystack\",\n                \"planetscale\",\n                \"planetscaledb\",\n                \"portainer\",\n                \"posthog\",\n                \"postman\",\n                \"prefect\",\n                \"private_key\",\n                \"pubnub_publish\",\n                \"pubnub_subscribe\",\n                \"pulumi\",\n                \"ramp\",\n                \"razorpay\",\n                \"readme\",\n                \"rechargepayments\",\n                \"replicate\",\n                \"rubygems\",\n                \"salesforce\",\n                \"sendgrid\",\n                \"sendinblue\",\n                \"shopify\",\n                \"slack_access\",\n                \"slack_bot\",\n                \"slack_refresh\",\n                \"slack_user\",\n                \"slack_webhook\",\n                \"slack_workflow_webhook\",\n                \"sourcegraph\",\n                \"sourcegraphcody\",\n                \"squareapp\",\n                \"squareup\",\n                \"stripe\",\n                \"supabase\",\n                \"tailscale\",\n                \"tines_webhook\",\n                \"trufflehog\",\n                \"twilio\",\n                \"ubidots\",\n                \"voiceflow\",\n                \"web_url_with_credentials\",\n                \"zapierwebhook\"\n              ]\n            },\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the types of secrets that should be detected in the content\"\n              }\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n","plugins/crowdstrike-aidr/manifest.json":"{\n  \"id\": \"crowdstrike-aidr\",\n  \"description\": \"CrowdStrike AIDR for scanning LLM inputs and outputs\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"AIDR API token\",\n        \"description\": \"AIDR Token. Get your token from the Falcon console.\",\n        \"encrypted\": true\n      },\n      \"baseUrl\": {\n        \"type\": \"string\",\n        \"label\": \"Base url\",\n        \"description\": \"Base URL\"\n      }\n    },\n    \"required\": [\"baseUrl\", \"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Guard Chat Completions\",\n      \"id\": \"guardChatCompletions\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Pass LLM Input and Output to the guard_chat_completions endpoint. Able to block or sanitize text depending on configured rules.\"\n        }\n      ]\n    }\n  ]\n}\n","plugins/javelin/manifest.json":"{\n  \"id\": \"javelin\",\n  \"description\": \"Javelin's AI security platform provides comprehensive guardrails for trust & safety, prompt injection detection, and language detection. Applies all enabled guardrails configured in your Javelin application policy.\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Your Javelin API key for authentication\"\n          }\n        ]\n      },\n      \"domain\": {\n        \"type\": \"string\",\n        \"label\": \"Domain\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Javelin API domain\"\n          }\n        ],\n        \"default\": \"api-dev.javelin.live\",\n        \"required\": false\n      },\n      \"application\": {\n        \"type\": \"string\",\n        \"label\": \"Application Name\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Application name for policy-specific guardrails (required)\"\n          }\n        ],\n        \"required\": true\n      }\n    },\n    \"required\": [\"apiKey\", \"application\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Javelin Guardrails\",\n      \"id\": \"guardrails\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Auto-applies all enabled guardrails in your Javelin application policy including trust & safety, prompt injection detection, language detection, and more\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {}\n      }\n    }\n  ]\n}\n","plugins/f5-guardrails/manifest.json":"{\n  \"id\": \"f5-guardrails\",\n  \"description\": \"F5 Guardrails Plugin - Partner guardrail powered by F5 Guardrails\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your F5 Guardrails API key for authentication\",\n        \"encrypted\": true\n      },\n      \"calypsoUrl\": {\n        \"type\": \"string\",\n        \"label\": \"F5 Guardrails URL\",\n        \"description\": \"The base URL for F5 Guardrails API. Defaults to https://us1.calypsoai.app\",\n        \"default\": \"https://us1.calypsoai.app\"\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"F5 Guardrails\",\n      \"id\": \"scan\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"F5 Guardrails powered by F5 Guardrails provides advanced content moderation and PII detection capabilities for your LLM inputs and outputs.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"label\": \"Redact\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Whether to redact PII data detected by the F5 guardrail. When enabled, detected PII will be masked in the content.\"\n              }\n            ],\n            \"default\": false\n          },\n          \"projectId\": {\n            \"type\": \"string\",\n            \"label\": \"Project-Id\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Your F5 Guardrails project identifier\"\n              }\n            ]\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"label\": \"Timeout\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"The timeout in milliseconds for the F5 guardrail scan. Defaults to 5000.\"\n              }\n            ],\n            \"default\": 5000\n          }\n        }\n      },\n      \"required\": [\"projectId\"]\n    }\n  ]\n}\n","plugins/default/manifest.json":"{\n  \"id\": \"default\",\n  \"name\": \"Default\",\n  \"description\": \"The default set of guardrail functions available in the AI Gateway.\",\n  \"credentials\": [],\n  \"functions\": [\n    {\n      \"name\": \"Regex Match\",\n      \"id\": \"regexMatch\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the request or response text matches a regex pattern.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"rule\": {\n            \"type\": \"string\",\n            \"label\": \"Regex Rule\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the regex pattern\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Match\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be inverted\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"rule\"]\n      }\n    },\n    {\n      \"name\": \"Allowed Request Types\",\n      \"id\": \"allowedRequestTypes\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Control which request types (endpoints) can be processed. Use either an allowlist or blocklist approach. If no types are specified, all request types are allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"allowedTypes\": {\n            \"type\": \"array\",\n            \"label\": \"Allowed Request Types (Multi-select)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select request types to allow. Can be combined with blockedTypes for refined control. Can also be specified in metadata as 'supported_endpoints'.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"complete\",\n                \"chatComplete\",\n                \"embed\",\n                \"rerank\",\n                \"moderate\",\n                \"stream-complete\",\n                \"stream-chatComplete\",\n                \"stream-messages\",\n                \"proxy\",\n                \"imageGenerate\",\n                \"createSpeech\",\n                \"createTranscription\",\n                \"createTranslation\",\n                \"realtime\",\n                \"uploadFile\",\n                \"listFiles\",\n                \"retrieveFile\",\n                \"deleteFile\",\n                \"retrieveFileContent\",\n                \"createBatch\",\n                \"retrieveBatch\",\n                \"cancelBatch\",\n                \"listBatches\",\n                \"getBatchOutput\",\n                \"listFinetunes\",\n                \"createFinetune\",\n                \"retrieveFinetune\",\n                \"cancelFinetune\",\n                \"createModelResponse\",\n                \"getModelResponse\",\n                \"deleteModelResponse\",\n                \"listResponseInputItems\",\n                \"messages\"\n              ]\n            }\n          },\n          \"blockedTypes\": {\n            \"type\": \"array\",\n            \"label\": \"Blocked Request Types (Multi-select)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select request types to block. When combined with allowedTypes, blocked types take precedence. Can also be specified in metadata as 'blocked_endpoints'.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"complete\",\n                \"chatComplete\",\n                \"embed\",\n                \"rerank\",\n                \"moderate\",\n                \"stream-complete\",\n                \"stream-chatComplete\",\n                \"stream-messages\",\n                \"proxy\",\n                \"imageGenerate\",\n                \"createSpeech\",\n                \"createTranscription\",\n                \"createTranslation\",\n                \"realtime\",\n                \"uploadFile\",\n                \"listFiles\",\n                \"retrieveFile\",\n                \"deleteFile\",\n                \"retrieveFileContent\",\n                \"createBatch\",\n                \"retrieveBatch\",\n                \"cancelBatch\",\n                \"listBatches\",\n                \"getBatchOutput\",\n                \"listFinetunes\",\n                \"createFinetune\",\n                \"retrieveFinetune\",\n                \"cancelFinetune\",\n                \"createModelResponse\",\n                \"getModelResponse\",\n                \"deleteModelResponse\",\n                \"listResponseInputItems\",\n                \"messages\"\n              ]\n            }\n          }\n        },\n        \"required\": []\n      }\n    },\n    {\n      \"name\": \"Sentence Count\",\n      \"id\": \"sentenceCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of sentences. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minSentences\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Sentence Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of sentences to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxSentences\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Sentence Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of sentences to allow.\"\n              }\n            ],\n            \"default\": 99999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Word Count\",\n      \"id\": \"wordCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of words. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minWords\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Word Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of words to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxWords\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Word Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of words to allow.\"\n              }\n            ],\n            \"default\": 99999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Character Count\",\n      \"id\": \"characterCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of characters. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minCharacters\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Character Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of characters to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxCharacters\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Character Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of characters to allow.\"\n              }\n            ],\n            \"default\": 9999999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"JSON Schema\",\n      \"id\": \"jsonSchema\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the response JSON matches a JSON schema.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"schema\": {\n            \"type\": \"json\",\n            \"label\": \"JSON Schema\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the JSON schema to validate against.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Schema Match\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when schema does not match\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"schema\"]\n      }\n    },\n    {\n      \"name\": \"JSON Keys\",\n      \"id\": \"jsonKeys\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the response JSON contains any, all or none of the mentioned keys.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"keys\": {\n            \"type\": \"array\",\n            \"label\": \"JSON Keys\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the keys to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"any\", \"all\", \"none\"],\n            \"default\": \"any\"\n          }\n        },\n        \"required\": [\"keys\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Contains\",\n      \"id\": \"contains\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains any, all or none of the words or phrases\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"words\": {\n            \"type\": \"array\",\n            \"label\": \"Words or Phrases\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the words or phrases to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"any\", \"all\", \"none\"],\n            \"default\": \"any\"\n          }\n        },\n        \"required\": [\"words\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Valid URLs\",\n      \"id\": \"validUrls\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if all the URLs mentioned in the content are valid\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"onlyDNS\": {\n            \"type\": \"boolean\",\n            \"label\": \"Only DNS (10x faster)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Only check if all URL domains resolve.\"\n              }\n            ],\n            \"default\": false\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert URL Validation\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when URLs are invalid\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Webhook\",\n      \"id\": \"webhook\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Makes a request to a webhook which returns the verdict and data\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"webhookURL\": {\n            \"type\": \"string\",\n            \"label\": \"Webhook URL\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"eg: https://webhook.site/guardrail\"\n              }\n            ]\n          },\n          \"headers\": {\n            \"type\": \"json\",\n            \"label\": \"Headers\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the headers to send with the request.\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"webhookURL\"]\n      }\n    },\n    {\n      \"name\": \"Log\",\n      \"id\": \"log\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Makes a request to a log URL and always gives `true` as the verdict.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"logURL\": {\n            \"type\": \"string\",\n            \"label\": \"Log URL\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"eg: https://logging.site/collector\"\n              }\n            ]\n          },\n          \"headers\": {\n            \"type\": \"json\",\n            \"label\": \"Headers\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the headers to send with the request.\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"logURL\"]\n      }\n    },\n    {\n      \"name\": \"Contains Code\",\n      \"id\": \"containsCode\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains code of format SQL, Python, TypeScript, etc.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"format\": {\n            \"type\": \"string\",\n            \"label\": \"Code Format\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the code format to check for.\"\n              }\n            ],\n            \"enum\": [\n              \"SQL\",\n              \"Python\",\n              \"TypeScript\",\n              \"JavaScript\",\n              \"Java\",\n              \"C#\",\n              \"C++\",\n              \"C\",\n              \"Ruby\",\n              \"PHP\",\n              \"Swift\",\n              \"Kotlin\",\n              \"Go\",\n              \"Rust\",\n              \"Scala\",\n              \"R\",\n              \"Perl\",\n              \"Shell\",\n              \"HTML\",\n              \"CSS\",\n              \"XML\",\n              \"JSON\",\n              \"YAML\",\n              \"Markdown\",\n              \"Dockerfile\"\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Code Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when code is not found\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"format\"]\n      }\n    },\n    {\n      \"name\": \"Uppercase check\",\n      \"id\": \"alluppercase\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if content has all uppercase letters.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Case Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text is not all uppercase\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Ends With\",\n      \"id\": \"endsWith\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the content ends with a specified string.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"suffix\": {\n            \"type\": \"string\",\n            \"label\": \"Suffix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the suffix to check for.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Suffix Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text does not end with suffix\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"suffix\"]\n      }\n    },\n    {\n      \"name\": \"Lowercase check\",\n      \"id\": \"alllowercase\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if content has all lowercase letters.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Case Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text is not all lowercase\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Allowed Models\",\n      \"id\": \"modelwhitelist\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Blocks any request whose model isn’t on this list.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"models\": {\n            \"type\": \"array\",\n            \"label\": \"Model list\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the allowed models. e.g. gpt-4o, llama-3-70b, mixtral-8x7b\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Model Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"When on, any model in the list is blocked instead of allowed.\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"models\"]\n      }\n    },\n    {\n      \"name\": \"Model Rules\",\n      \"id\": \"modelRules\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Allow requests based on metadata-driven rules mapping to allowed models.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"rules\": {\n            \"type\": \"object\",\n            \"label\": \"Rules object: {\\\"defaults\\\": [\\\"model\\\"], \\\"metadata\\\": {\\\"key\\\": {\\\"value\\\": [\\\"models\\\"]}}}\",\n            \"description\": [\n              {\n                \"type\": \"text\",\n                \"text\": \"Overrides model list using metadata-based routing.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Model Check\",\n            \"description\": [\n              {\n                \"type\": \"text\",\n                \"text\": \"When on, any model resolved by rules is blocked instead of allowed.\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"rules\"]\n      }\n    },\n    {\n      \"name\": \"JWT\",\n      \"id\": \"jwt\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the JWT token is valid.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"jwksUri\": {\n            \"type\": \"string\",\n            \"label\": \"JWKS URI\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the JWKS URI of the JWT token.\"\n              }\n            ]\n          },\n          \"headerKey\": {\n            \"type\": \"string\",\n            \"label\": \"Header Key\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the header key to check for the JWT token.\"\n              }\n            ]\n          },\n          \"cacheMaxAge\": {\n            \"type\": \"number\",\n            \"label\": \"Cache Max Age\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the cache max age in seconds.\"\n              }\n            ],\n            \"default\": 86400\n          },\n          \"clockTolerance\": {\n            \"type\": \"number\",\n            \"label\": \"Clock Tolerance\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the clock tolerance in seconds.\"\n              }\n            ],\n            \"default\": 5\n          },\n          \"maxTokenAge\": {\n            \"type\": \"string\",\n            \"label\": \"Max Token Age\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the max token age.\"\n              }\n            ],\n            \"default\": \"1d\"\n          }\n        },\n        \"required\": [\"jwksUri\", \"headerKey\"]\n      }\n    },\n    {\n      \"name\": \"Required Metadata Keys\",\n      \"id\": \"requiredMetadataKeys\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the metadata contains all the required keys\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"metadataKeys\": {\n            \"type\": \"array\",\n            \"label\": \"Metadata Keys\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the metadata keys to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"all\", \"any\", \"none\"],\n            \"default\": \"all\"\n          }\n        },\n        \"required\": [\"metadataKeys\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Add Prefix\",\n      \"id\": \"addPrefix\",\n      \"type\": \"transformer\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Adds a configurable prefix to the user's prompt or messages before sending to the AI model\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prefix\": {\n            \"type\": \"string\",\n            \"label\": \"Prefix Text\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"The text to prepend to the user's prompt or message\"\n              }\n            ],\n            \"default\": \"Please respond helpfully and accurately to the following: \"\n          },\n          \"applyToRole\": {\n            \"type\": \"string\",\n            \"label\": \"Apply to Role\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"For chat completions, which message role to apply the prefix to\"\n              }\n            ],\n            \"enum\": [\"user\", \"system\", \"assistant\"],\n            \"default\": \"user\"\n          },\n          \"addToExisting\": {\n            \"type\": \"boolean\",\n            \"label\": \"Add to Existing Message\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, adds prefix to existing message. If false, creates new message with prefix\"\n              }\n            ],\n            \"default\": true\n          },\n          \"onlyIfEmpty\": {\n            \"type\": \"boolean\",\n            \"label\": \"Only Apply If Role Empty\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Only apply prefix if no message exists for the specified role (useful for system messages)\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"prefix\"]\n      }\n    },\n    {\n      \"name\": \"Not Null\",\n      \"id\": \"notNull\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the response content is not null, undefined, or empty. Useful for detecting when an AI model returns no content.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when content IS null (inverts the check)\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    }\n  ]\n}\n","plugins/exa/manifest.json":"{\n  \"id\": \"exa\",\n  \"description\": \"Exa.ai integration for enhancing AI responses with real-time web search information\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your Exa.ai API key\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Online Search\",\n      \"id\": \"online\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"type\": \"transformer\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Enhances prompts with relevant web search results from Exa's search API before processing the request\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prefix\": {\n            \"type\": \"string\",\n            \"label\": \"Context Prefix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"String to prepend to the search context\"\n              }\n            ],\n            \"default\": \"\\n<web_search_context>\"\n          },\n          \"suffix\": {\n            \"type\": \"string\",\n            \"label\": \"Context Suffix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"String to append to the search context\"\n              }\n            ],\n            \"default\": \"\\n</web_search_context>\"\n          },\n          \"numResults\": {\n            \"type\": \"number\",\n            \"label\": \"Number of Results\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Number of search results to include in the enhanced prompt\"\n              }\n            ],\n            \"default\": 5\n          },\n          \"includeDomains\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"label\": \"Include Domains\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Limit search results to these domains (e.g., ['nytimes.com', 'bbc.com'])\"\n              }\n            ]\n          },\n          \"excludeDomains\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"label\": \"Exclude Domains\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Remove these domains from search results (e.g., ['wikipedia.org', 'reddit.com'])\"\n              }\n            ]\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"label\": \"Timeout\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Timeout for the Exa API call in milliseconds\"\n              }\n            ],\n            \"default\": 10000\n          }\n        },\n        \"required\": []\n      }\n    }\n  ]\n}\n","plugins/lasso/manifest.json":"# Lasso Skill\n\nPath: `plugins/lasso/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/manifest.json)","plugins/lasso/README.md":"# lasso Documentation\n\nPath: `plugins/lasso/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/README.md)","plugins/mistral/manifest.json":"# Mistral Skill\n\nPath: `plugins/mistral/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/mistral/manifest.json)","plugins/pangea/manifest.json":"# Pangea Skill\n\nPath: `plugins/pangea/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pangea/manifest.json)","plugins/panw-prisma-airs/manifest.json":"# Panw-prisma-airs Skill\n\nPath: `plugins/panw-prisma-airs/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/panw-prisma-airs/manifest.json)","plugins/patronus/manifest.json":"# Patronus Skill\n\nPath: `plugins/patronus/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/patronus/manifest.json)","plugins/pillar/manifest.json":"# Pillar Skill\n\nPath: `plugins/pillar/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pillar/manifest.json)","plugins/portkey/manifest.json":"# Portkey Skill\n\nPath: `plugins/portkey/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/portkey/manifest.json)","plugins/promptfoo/manifest.json":"# Promptfoo Skill\n\nPath: `plugins/promptfoo/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptfoo/manifest.json)","plugins/promptsecurity/manifest.json":"# Promptsecurity Skill\n\nPath: `plugins/promptsecurity/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptsecurity/manifest.json)","plugins/qualifire/manifest.json":"# Qualifire Skill\n\nPath: `plugins/qualifire/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/qualifire/manifest.json)","plugins/sydelabs/manifest.json":"# Sydelabs Skill\n\nPath: `plugins/sydelabs/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/sydelabs/manifest.json)","plugins/walledai/manifest.json":"# Walledai Skill\n\nPath: `plugins/walledai/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/walledai/manifest.json)"},"items":[{"name":"manifest.json","path":"plugins/acuvity/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/acuvity/manifest.json","title":"Acuvity Skill","category":"anthropic-skill","format":"json","content":"{\n  \"id\": \"acuvity\",\n  \"description\": \"acuvity Plugin\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Find your API key in the acuvity dashboard\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Acuvity\",\n      \"id\": \"Acuvity\",\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Comprehensive content safety and security checks\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prompt_injection\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable prompt injection detection\"\n              }\n            ]\n          },\n          \"prompt_injection_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for prompt injection detection\"\n              }\n            ]\n          },\n          \"toxic\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable toxicity detection\"\n              }\n            ]\n          },\n          \"toxic_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for toxicity detection\"\n              }\n            ]\n          },\n          \"jail_break\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable jailbreak detection\"\n              }\n            ]\n          },\n          \"jail_break_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for jailbreak detection\"\n              }\n            ]\n          },\n          \"malicious_url\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable malicious URL detection\"\n              }\n            ]\n          },\n          \"malicious_url_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for malicious URL detection\"\n              }\n            ]\n          },\n          \"biased\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable bias detection\"\n              }\n            ]\n          },\n          \"biased_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for bias detection\"\n              }\n            ]\n          },\n          \"harmful\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable harmful content detection\"\n              }\n            ]\n          },\n          \"harmful_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for harmful content detection\"\n              }\n            ]\n          },\n          \"language\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable language check\"\n              }\n            ]\n          },\n          \"language_values\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"english\",\n              \"chinese\",\n              \"spanish\",\n              \"french\",\n              \"german\",\n              \"japanese\",\n              \"gibberish\"\n            ],\n            \"default\": \"english\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the language to check\"\n              }\n            ]\n          },\n          \"pii\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable PII detection\"\n              }\n            ]\n          },\n          \"pii_redact\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable PII redaction\"\n              }\n            ]\n          },\n          \"pii_categories\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"email_address\",\n                \"ssn\",\n                \"person\",\n                \"aba_routing_number\",\n                \"address\",\n                \"bank_account\",\n                \"bitcoin_wallet\",\n                \"credit_card\",\n                \"driver_license\",\n                \"itin_number\",\n                \"location\",\n                \"medical_license\",\n                \"money_amount\",\n                \"passport_number\",\n                \"phone_number\"\n              ]\n            },\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the categories that should NOT be allowed in the content\"\n              }\n            ]\n          },\n          \"secrets\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable secrets detection\"\n              }\n            ]\n          },\n          \"secrets_redact\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable secrets redaction\"\n              }\n            ]\n          },\n          \"secrets_categories\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"credentials\",\n                \"adafruit\",\n                \"alibaba\",\n                \"anthropic\",\n                \"apideck\",\n                \"apify\",\n                \"atlassian\",\n                \"aws_secret_key\",\n                \"buildkite\",\n                \"checkout\",\n                \"clickuppersonal\",\n                \"contentfulpersonalaccess\",\n                \"database_url_with_credentials\",\n                \"databricks\",\n                \"denodeploy\",\n                \"dfuse\",\n                \"digitalocean\",\n                \"discord_webhook\",\n                \"docker_hub\",\n                \"doppler\",\n                \"dropbox\",\n                \"endorlabs\",\n                \"fleetbase\",\n                \"flutterwave\",\n                \"frameio\",\n                \"freshdesk\",\n                \"fullstory\",\n                \"github\",\n                \"gitlab\",\n                \"gocardless\",\n                \"google_api\",\n                \"grafana\",\n                \"groq\",\n                \"huggingface\",\n                \"intra42\",\n                \"jwt\",\n                \"klaviyo\",\n                \"launchdarkly\",\n                \"linearapi\",\n                \"locationiq\",\n                \"mailchimp\",\n                \"mailgun\",\n                \"mapbox\",\n                \"maxmind\",\n                \"microsoft_teams_webhook\",\n                \"nightfall\",\n                \"notion\",\n                \"npm\",\n                \"openai\",\n                \"pagarme\",\n                \"paystack\",\n                \"planetscale\",\n                \"planetscaledb\",\n                \"portainer\",\n                \"posthog\",\n                \"postman\",\n                \"prefect\",\n                \"private_key\",\n                \"pubnub_publish\",\n                \"pubnub_subscribe\",\n                \"pulumi\",\n                \"ramp\",\n                \"razorpay\",\n                \"readme\",\n                \"rechargepayments\",\n                \"replicate\",\n                \"rubygems\",\n                \"salesforce\",\n                \"sendgrid\",\n                \"sendinblue\",\n                \"shopify\",\n                \"slack_access\",\n                \"slack_bot\",\n                \"slack_refresh\",\n                \"slack_user\",\n                \"slack_webhook\",\n                \"slack_workflow_webhook\",\n                \"sourcegraph\",\n                \"sourcegraphcody\",\n                \"squareapp\",\n                \"squareup\",\n                \"stripe\",\n                \"supabase\",\n                \"tailscale\",\n                \"tines_webhook\",\n                \"trufflehog\",\n                \"twilio\",\n                \"ubidots\",\n                \"voiceflow\",\n                \"web_url_with_credentials\",\n                \"zapierwebhook\"\n              ]\n            },\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the types of secrets that should be detected in the content\"\n              }\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n","frontmatter":{"id":"acuvity","description":"acuvity Plugin","credentials":{"type":"object","properties":{"apiKey":{"type":"string","label":"API Key","description":"Find your API key in the acuvity dashboard","encrypted":true}},"required":["apiKey"]},"functions":[{"name":"Acuvity","id":"Acuvity","type":"guardrail","description":[{"type":"subHeading","text":"Comprehensive content safety and security checks"}],"parameters":{"type":"object","properties":{"prompt_injection":{"type":"boolean","default":true,"description":[{"type":"subHeading","text":"Enable prompt injection detection"}]},"prompt_injection_threshold":{"type":"number","minimum":0,"maximum":1,"multipleOf":0.01,"default":0.5,"description":[{"type":"subHeading","text":"Set the threshold for prompt injection detection"}]},"toxic":{"type":"boolean","default":true,"description":[{"type":"subHeading","text":"Enable toxicity detection"}]},"toxic_threshold":{"type":"number","minimum":0,"maximum":1,"multipleOf":0.01,"default":0.5,"description":[{"type":"subHeading","text":"Set the threshold for toxicity detection"}]},"jail_break":{"type":"boolean","default":true,"description":[{"type":"subHeading","text":"Enable jailbreak detection"}]},"jail_break_threshold":{"type":"number","minimum":0,"maximum":1,"multipleOf":0.01,"default":0.5,"description":[{"type":"subHeading","text":"Set the threshold for jailbreak detection"}]},"malicious_url":{"type":"boolean","default":true,"description":[{"type":"subHeading","text":"Enable malicious URL detection"}]},"malicious_url_threshold":{"type":"number","minimum":0,"maximum":1,"multipleOf":0.01,"default":0.5,"description":[{"type":"subHeading","text":"Set the threshold for malicious URL detection"}]},"biased":{"type":"boolean","default":true,"description":[{"type":"subHeading","text":"Enable bias detection"}]},"biased_threshold":{"type":"number","minimum":0,"maximum":1,"multipleOf":0.01,"default":0.5,"description":[{"type":"subHeading","text":"Set the threshold for bias detection"}]},"harmful":{"type":"boolean","default":true,"description":[{"type":"subHeading","text":"Enable harmful content detection"}]},"harmful_threshold":{"type":"number","minimum":0,"maximum":1,"multipleOf":0.01,"default":0.5,"description":[{"type":"subHeading","text":"Set the threshold for harmful content detection"}]},"language":{"type":"boolean","default":true,"description":[{"type":"subHeading","text":"Enable language check"}]},"language_values":{"type":"string","enum":["english","chinese","spanish","french","german","japanese","gibberish"],"default":"english","description":[{"type":"subHeading","text":"Select the language to check"}]},"pii":{"type":"boolean","default":true,"description":[{"type":"subHeading","text":"Enable PII detection"}]},"pii_redact":{"type":"boolean","default":false,"description":[{"type":"subHeading","text":"Enable PII redaction"}]},"pii_categories":{"type":"array","items":{"type":"string","enum":["email_address","ssn","person","aba_routing_number","address","bank_account","bitcoin_wallet","credit_card","driver_license","itin_number","location","medical_license","money_amount","passport_number","phone_number"]},"description":[{"type":"subHeading","text":"Select the categories that should NOT be allowed in the content"}]},"secrets":{"type":"boolean","default":true,"description":[{"type":"subHeading","text":"Enable secrets detection"}]},"secrets_redact":{"type":"boolean","default":false,"description":[{"type":"subHeading","text":"Enable secrets redaction"}]},"secrets_categories":{"type":"array","items":{"type":"string","enum":["credentials","adafruit","alibaba","anthropic","apideck","apify","atlassian","aws_secret_key","buildkite","checkout","clickuppersonal","contentfulpersonalaccess","database_url_with_credentials","databricks","denodeploy","dfuse","digitalocean","discord_webhook","docker_hub","doppler","dropbox","endorlabs","fleetbase","flutterwave","frameio","freshdesk","fullstory","github","gitlab","gocardless","google_api","grafana","groq","huggingface","intra42","jwt","klaviyo","launchdarkly","linearapi","locationiq","mailchimp","mailgun","mapbox","maxmind","microsoft_teams_webhook","nightfall","notion","npm","openai","pagarme","paystack","planetscale","planetscaledb","portainer","posthog","postman","prefect","private_key","pubnub_publish","pubnub_subscribe","pulumi","ramp","razorpay","readme","rechargepayments","replicate","rubygems","salesforce","sendgrid","sendinblue","shopify","slack_access","slack_bot","slack_refresh","slack_user","slack_webhook","slack_workflow_webhook","sourcegraph","sourcegraphcody","squareapp","squareup","stripe","supabase","tailscale","tines_webhook","trufflehog","twilio","ubidots","voiceflow","web_url_with_credentials","zapierwebhook"]},"description":[{"type":"subHeading","text":"Select the types of secrets that should be detected in the content"}]}}}}]},"isInternal":false,"tokens":2029,"sizeBytes":10265},{"name":"manifest.json","path":"plugins/aporia/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/aporia/manifest.json","title":"Aporia Skill","category":"anthropic-skill","format":"json","content":"{\n  \"id\": \"aporia\",\n  \"description\": \"Aporia Guardrails mitigates LLM hallucinations, inappropriate responses, prompt injection attacks, and other unintended behaviors in real-time\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Find your API key in the Aporia dashboard\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Validate - Project\",\n      \"id\": \"validateProject\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check all the policies within an Aporia project\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"projectID\": {\n            \"type\": \"string\",\n            \"label\": \"Project ID\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the Aporia Project ID to validate\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"projectID\"]\n      }\n    }\n  ]\n}\n","frontmatter":{"id":"aporia","description":"Aporia Guardrails mitigates LLM hallucinations, inappropriate responses, prompt injection attacks, and other unintended behaviors in real-time","credentials":{"type":"object","properties":{"apiKey":{"type":"string","label":"API Key","description":"Find your API key in the Aporia dashboard","encrypted":true}},"required":["apiKey"]},"functions":[{"name":"Validate - Project","id":"validateProject","supportedHooks":["beforeRequestHook","afterRequestHook"],"type":"guardrail","description":[{"type":"subHeading","text":"Check all the policies within an Aporia project"}],"parameters":{"type":"object","properties":{"projectID":{"type":"string","label":"Project ID","description":[{"type":"subHeading","text":"Enter the Aporia Project ID to validate"}]}},"required":["projectID"]}}]},"isInternal":false,"tokens":286,"sizeBytes":1211},{"name":"manifest.json","path":"plugins/azure/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/azure/manifest.json","title":"azure-ai","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"azure-ai\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Azure AI Content Safety and PII Detection plugins for content moderation\",\n  \"author\": \"Portkey AI\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"pii\": {\n        \"$ref\": \"#/definitions/credentials\"\n      },\n      \"contentSafety\": {\n        \"$ref\": \"#/definitions/credentials\"\n      }\n    }\n  },\n  \"functions\": [\n    {\n      \"name\": \"Content Safety\",\n      \"id\": \"contentSafety\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"parameters\": {\n        \"contentSafety\": {\n          \"blocklistNames\": {\n            \"type\": \"array\",\n            \"description\": \"Array of blocklist names to check against\",\n            \"default\": []\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-11-01\"\n          },\n          \"severity\": {\n            \"type\": \"number\",\n            \"description\": \"Severity threshold for the Content Safety API\",\n            \"default\": 2\n          },\n          \"categories\": {\n            \"type\": \"array\",\n            \"description\": \"Categories to check against\",\n            \"default\": [\"Hate\", \"SelfHarm\", \"Sexual\", \"Violence\"],\n            \"enum\": [\"Hate\", \"SelfHarm\", \"Sexual\", \"Violence\"]\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"PII Detection\",\n      \"id\": \"pii\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"domain\": {\n            \"type\": \"string\",\n            \"description\": \"Domain for PII detection ('none' or 'healthcare')\",\n            \"default\": \"none\"\n          },\n          \"modelVersion\": {\n            \"type\": \"string\",\n            \"description\": \"Version of the PII detection model to use\",\n            \"default\": \"latest\"\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-11-01\"\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"description\": \"Whether to redact the PII detected\",\n            \"default\": false\n          },\n          \"language\": {\n            \"type\": \"string\",\n            \"description\": \"Language for PII detection\",\n            \"default\": \"en\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Shield Prompt\",\n      \"id\": \"shieldPrompt\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": \"Detects jailbreak and prompt injection attacks using Azure AI Content Safety Prompt Shields API\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-09-01\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Protected Material\",\n      \"id\": \"protectedMaterial\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": \"Detects known protected/copyrighted text content in LLM outputs using Azure AI Content Safety Protected Material Detection API\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-09-01\"\n          }\n        }\n      }\n    }\n  ],\n  \"definitions\": {\n    \"credentials\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"azureAuthMode\": {\n          \"type\": \"string\",\n          \"description\": \"Authentication mode for Azure AI services\",\n          \"default\": \"apiKey\",\n          \"enum\": [\"apiKey\", \"entra\", \"managed\"]\n        },\n        \"resourceName\": {\n          \"type\": \"string\",\n          \"description\": \"Azure Cognitive Services resource name (e.g., https://<your-resource-name>.cognitiveservices.azure.com)\",\n          \"required\": true\n        },\n        \"apiKey\": {\n          \"type\": \"string\",\n          \"description\": \"Azure API key\"\n        },\n        \"clientId\": {\n          \"type\": \"string\",\n          \"description\": \"Client ID for Azure Entra ID or Managed Identity authentication\"\n        },\n        \"clientSecret\": {\n          \"type\": \"string\",\n          \"description\": \"Client Secret for Azure Entra ID authentication\"\n        },\n        \"tenantId\": {\n          \"type\": \"string\",\n          \"description\": \"Tenant ID for Azure Entra ID authentication\"\n        },\n        \"customHost\": {\n          \"type\": \"string\",\n          \"description\": \"Custom host for Azure AI services (Private Link etc.)\"\n        }\n      },\n      \"anyOf\": [\n        {\n          \"required\": [\"apiKey\", \"azureAuthMode\"]\n        },\n        {\n          \"required\": [\"clientId\", \"clientSecret\", \"tenantId\", \"azureAuthMode\"]\n        },\n        {\n          \"required\": [\"clientId\", \"azureAuthMode\"]\n        }\n      ]\n    }\n  }\n}\n","frontmatter":{"name":"azure-ai","version":"1.0.0","description":"Azure AI Content Safety and PII Detection plugins for content moderation","author":"Portkey AI","credentials":{"type":"object","properties":{"pii":{"$ref":"#/definitions/credentials"},"contentSafety":{"$ref":"#/definitions/credentials"}}},"functions":[{"name":"Content Safety","id":"contentSafety","type":"guardrail","supportedHooks":["beforeRequestHook","afterRequestHook"],"parameters":{"contentSafety":{"blocklistNames":{"type":"array","description":"Array of blocklist names to check against","default":[]},"timeout":{"type":"number","description":"Timeout in milliseconds for the API request","default":5000},"apiVersion":{"type":"string","description":"API version for the Content Safety API","default":"2024-11-01"},"severity":{"type":"number","description":"Severity threshold for the Content Safety API","default":2},"categories":{"type":"array","description":"Categories to check against","default":["Hate","SelfHarm","Sexual","Violence"],"enum":["Hate","SelfHarm","Sexual","Violence"]}}}},{"name":"PII Detection","id":"pii","type":"guardrail","supportedHooks":["beforeRequestHook","afterRequestHook"],"parameters":{"type":"object","properties":{"domain":{"type":"string","description":"Domain for PII detection ('none' or 'healthcare')","default":"none"},"modelVersion":{"type":"string","description":"Version of the PII detection model to use","default":"latest"},"apiVersion":{"type":"string","description":"API version for the Content Safety API","default":"2024-11-01"},"timeout":{"type":"number","description":"Timeout in milliseconds for the API request","default":5000},"redact":{"type":"boolean","description":"Whether to redact the PII detected","default":false},"language":{"type":"string","description":"Language for PII detection","default":"en"}}}},{"name":"Shield Prompt","id":"shieldPrompt","type":"guardrail","supportedHooks":["beforeRequestHook"],"description":"Detects jailbreak and prompt injection attacks using Azure AI Content Safety Prompt Shields API","parameters":{"type":"object","properties":{"timeout":{"type":"number","description":"Timeout in milliseconds for the API request","default":5000},"apiVersion":{"type":"string","description":"API version for the Content Safety API","default":"2024-09-01"}}}},{"name":"Protected Material","id":"protectedMaterial","type":"guardrail","supportedHooks":["afterRequestHook"],"description":"Detects known protected/copyrighted text content in LLM outputs using Azure AI Content Safety Protected Material Detection API","parameters":{"type":"object","properties":{"timeout":{"type":"number","description":"Timeout in milliseconds for the API request","default":5000},"apiVersion":{"type":"string","description":"API version for the Content Safety API","default":"2024-09-01"}}}}],"definitions":{"credentials":{"type":"object","properties":{"azureAuthMode":{"type":"string","description":"Authentication mode for Azure AI services","default":"apiKey","enum":["apiKey","entra","managed"]},"resourceName":{"type":"string","description":"Azure Cognitive Services resource name (e.g., https://<your-resource-name>.cognitiveservices.azure.com)","required":true},"apiKey":{"type":"string","description":"Azure API key"},"clientId":{"type":"string","description":"Client ID for Azure Entra ID or Managed Identity authentication"},"clientSecret":{"type":"string","description":"Client Secret for Azure Entra ID authentication"},"tenantId":{"type":"string","description":"Tenant ID for Azure Entra ID authentication"},"customHost":{"type":"string","description":"Custom host for Azure AI services (Private Link etc.)"}},"anyOf":[{"required":["apiKey","azureAuthMode"]},{"required":["clientId","clientSecret","tenantId","azureAuthMode"]},{"required":["clientId","azureAuthMode"]}]}}},"isInternal":false,"tokens":1315,"sizeBytes":5740},{"name":"manifest.json","path":"plugins/bedrock/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/bedrock/manifest.json","title":"Bedrock Skill","category":"anthropic-skill","format":"json","content":"{\n  \"id\": \"bedrock\",\n  \"description\": \"AWS Bedrock Content Moderation classifier leverages AWS guardrails for effective guardrails and introduces a pragmatic approach to LLM safety by addressing model-generated harms such as unqualified advice and PII\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"accessKeyId\": {\n        \"type\": \"string\",\n        \"label\": \"Access Key ID\",\n        \"description\": \"Find your Access Key ID in the AWS Management Console\",\n        \"encrypted\": true\n      },\n      \"accessKeySecret\": {\n        \"type\": \"string\",\n        \"label\": \"Access Key Secret\",\n        \"description\": \"Find your Access Key Secret in the AWS Management Console\",\n        \"encrypted\": true\n      },\n      \"awsSessionToken\": {\n        \"type\": \"string\",\n        \"label\": \"AWS Session Token\",\n        \"description\": \"AWS Session token.\"\n      },\n      \"region\": {\n        \"type\": \"string\",\n        \"description\": \"Bedrock guardrail hosted region\",\n        \"lable\": \"Region\"\n      }\n    },\n    \"required\": [\"accessKeyId\", \"accessKeySecret\", \"region\"]\n  },\n\n  \"functions\": [\n    {\n      \"name\": \"Apply Bedrock guardrail\",\n      \"id\": \"guard\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Filters out Content that contain harmful content & prompt filters\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"guardrailVersion\": {\n            \"type\": \"string\",\n            \"label\": \"Guardrail Version\",\n            \"description\": \"Select the version of the guardrail to use\"\n          },\n          \"guardrailId\": {\n            \"type\": \"string\",\n            \"label\": \"Guardrail ID\",\n            \"description\": \"ID of the guardrail.\"\n          },\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"label\": \"Redact PII\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the PII identified will be redacted\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"guardrailVersion\", \"guardrailId\"]\n      }\n    }\n  ]\n}\n","frontmatter":{"id":"bedrock","description":"AWS Bedrock Content Moderation classifier leverages AWS guardrails for effective guardrails and introduces a pragmatic approach to LLM safety by addressing model-generated harms such as unqualified advice and PII","credentials":{"type":"object","properties":{"accessKeyId":{"type":"string","label":"Access Key ID","description":"Find your Access Key ID in the AWS Management Console","encrypted":true},"accessKeySecret":{"type":"string","label":"Access Key Secret","description":"Find your Access Key Secret in the AWS Management Console","encrypted":true},"awsSessionToken":{"type":"string","label":"AWS Session Token","description":"AWS Session token."},"region":{"type":"string","description":"Bedrock guardrail hosted region","lable":"Region"}},"required":["accessKeyId","accessKeySecret","region"]},"functions":[{"name":"Apply Bedrock guardrail","id":"guard","type":"guardrail","supportedHooks":["beforeRequestHook","afterRequestHook"],"description":[{"type":"subHeading","text":"Filters out Content that contain harmful content & prompt filters"}],"parameters":{"type":"object","properties":{"guardrailVersion":{"type":"string","label":"Guardrail Version","description":"Select the version of the guardrail to use"},"guardrailId":{"type":"string","label":"Guardrail ID","description":"ID of the guardrail."},"redact":{"type":"boolean","label":"Redact PII","description":[{"type":"subHeading","text":"If true, the PII identified will be redacted"}],"default":false}},"required":["guardrailVersion","guardrailId"]}}]},"isInternal":false,"tokens":517,"sizeBytes":2245},{"name":"Contributing.md","path":"plugins/Contributing.md","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/Contributing.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"## 🎉 Welcome\n\nHello and Thank you for your interest in contributing to Portkey Gateway Plugins! We're excited to welcome new  developers to our community. This guide will help you get started with creating and submitting new guardrails plugins for the Portkey Gateway.\n\n## 🚀 Quick Start\n\n1. Fork the repository on GitHub: [https://github.com/Portkey-AI/gateway](https://github.com/Portkey-AI/gateway)\n2. Clone your forked repository to your local machine:\n   ```sh\n   git clone https://github.com/YOUR_USERNAME/gateway.git\n3. Navigate to the plugins directory:\n    ```sh \n    cd gateway/plugins\n    ```\n\n## 🔧 Creating a New Plugin\n\nCreate a new directory for your plugin in the `/plugins` folder:\n```sh \nCopy/plugins\n  /your-plugin-name\n    - manifest.json\n    - main-function.ts\n    - test-file.test.ts (recommended)\n```\n\nCreate a `manifest.json` file defining your plugin's properties, credentials, and functions.\nImplement your plugin logic in `main-function.ts.`\nWrite tests for your plugin in `test-file.test.ts`.\n\nFor detailed information on plugin structure and implementation, please refer to the  [Plugins README](https://github.com/Portkey-AI/gateway/tree/main/plugins#readme).\n\n\n## 📝 Plugin Guidelines\n\nFocus on implementing guardrails as the primary function of your plugin.\nEnsure your plugin works with the `beforeRequest` and `afterRequest` hooks.\nWrite clear and concise documentation within your code and in the `manifest.json` file.\nTest your plugin thoroughly before submission.\n\n\n## 🔄 Contributing a Plugin\n\nThere are two main ways to contribute a plugin to the Portkey Gateway:\n\n### 1. Work on Existing Issues\n\n1. Check the [Issues tab](https://github.com/Portkey-AI/gateway/issues) in the Portkey Gateway repository.\n2. Look for issues labeled with `good-first-issue` and `plugin`.\n3. Submit a pull request referencing the original issue number.\n\n### 2. Propose and Develop a New Plugin\n\nIf you have an idea for a new plugin:\n\n1. Check the [Issues tab](https://github.com/Portkey-AI/gateway/issues) to ensure a similar plugin hasn't been proposed.\n2. Create a new issue with the following title format: [Feature] Your Plugin Name.\n3. In the issue description, provide:\n   - **Plugin Name**: A clear, descriptive name for your plugin.\n   - **Description**: A brief overview of your plugin's functionality and its benefits.\n3. Submit a pull request referencing your proposal issue number.\n\n## 📤 Submitting Your Pull Request\n\nWhen your plugin is ready for review:\n\n1. Ensure your code follows the structure outlined in the [Plugins README](https://github.com/Portkey-AI/gateway/blob/main/plugins/README.md).\n3. Run tests to ensure your plugin works as expected.\n4. Create a pull request with the following title format: `[New Plugin] Your Plugin Name`.\n5. In the pull request description, provide:\n   - A link to the original issue or proposal\n   - A summary of the changes and new features\n\n\nThe maintainers will review your submission and may suggest changes or improvements. Be prepared to engage in a constructive dialogue and make updates as needed.\n\n## 🧪 Testing\n\nBefore submitting your pull request:\n\n1. Write unit tests for your plugin in a `test-file.test.ts` file.\n2. Ensure all tests pass by running:\n\n\n\n## 🤔 Getting Help\nIf you have any questions or need assistance while developing your plugin, please join our [Discord](https://discord.gg/DD7vgKK299) community. It's the fastest way to get support and connect with other contributors.\n\n## 🎊 Your Plugin is Accepted!\nOnce your plugin is reviewed and accepted, it will be merged into the main repository. We appreciate your contribution to making the Portkey Gateway more powerful and versatile!\nThank you for contributing to Portkey Gateway Plugins!\n","isInternal":false,"tokens":837,"sizeBytes":3759},{"name":"manifest.json","path":"plugins/crowdstrike-aidr/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/crowdstrike-aidr/manifest.json","title":"Crowdstrike-aidr Skill","category":"anthropic-skill","format":"json","content":"{\n  \"id\": \"crowdstrike-aidr\",\n  \"description\": \"CrowdStrike AIDR for scanning LLM inputs and outputs\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"AIDR API token\",\n        \"description\": \"AIDR Token. Get your token from the Falcon console.\",\n        \"encrypted\": true\n      },\n      \"baseUrl\": {\n        \"type\": \"string\",\n        \"label\": \"Base url\",\n        \"description\": \"Base URL\"\n      }\n    },\n    \"required\": [\"baseUrl\", \"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Guard Chat Completions\",\n      \"id\": \"guardChatCompletions\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Pass LLM Input and Output to the guard_chat_completions endpoint. Able to block or sanitize text depending on configured rules.\"\n        }\n      ]\n    }\n  ]\n}\n","frontmatter":{"id":"crowdstrike-aidr","description":"CrowdStrike AIDR for scanning LLM inputs and outputs","credentials":{"type":"object","properties":{"apiKey":{"type":"string","label":"AIDR API token","description":"AIDR Token. Get your token from the Falcon console.","encrypted":true},"baseUrl":{"type":"string","label":"Base url","description":"Base URL"}},"required":["baseUrl","apiKey"]},"functions":[{"name":"Guard Chat Completions","id":"guardChatCompletions","supportedHooks":["beforeRequestHook","afterRequestHook"],"type":"guardrail","description":[{"type":"subHeading","text":"Pass LLM Input and Output to the guard_chat_completions endpoint. Able to block or sanitize text depending on configured rules."}]}]},"isInternal":false,"tokens":249,"sizeBytes":958},{"name":"manifest.json","path":"plugins/default/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/default/manifest.json","title":"Default","category":"anthropic-skill","format":"json","content":"{\n  \"id\": \"default\",\n  \"name\": \"Default\",\n  \"description\": \"The default set of guardrail functions available in the AI Gateway.\",\n  \"credentials\": [],\n  \"functions\": [\n    {\n      \"name\": \"Regex Match\",\n      \"id\": \"regexMatch\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the request or response text matches a regex pattern.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"rule\": {\n            \"type\": \"string\",\n            \"label\": \"Regex Rule\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the regex pattern\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Match\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be inverted\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"rule\"]\n      }\n    },\n    {\n      \"name\": \"Allowed Request Types\",\n      \"id\": \"allowedRequestTypes\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Control which request types (endpoints) can be processed. Use either an allowlist or blocklist approach. If no types are specified, all request types are allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"allowedTypes\": {\n            \"type\": \"array\",\n            \"label\": \"Allowed Request Types (Multi-select)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select request types to allow. Can be combined with blockedTypes for refined control. Can also be specified in metadata as 'supported_endpoints'.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"complete\",\n                \"chatComplete\",\n                \"embed\",\n                \"rerank\",\n                \"moderate\",\n                \"stream-complete\",\n                \"stream-chatComplete\",\n                \"stream-messages\",\n                \"proxy\",\n                \"imageGenerate\",\n                \"createSpeech\",\n                \"createTranscription\",\n                \"createTranslation\",\n                \"realtime\",\n                \"uploadFile\",\n                \"listFiles\",\n                \"retrieveFile\",\n                \"deleteFile\",\n                \"retrieveFileContent\",\n                \"createBatch\",\n                \"retrieveBatch\",\n                \"cancelBatch\",\n                \"listBatches\",\n                \"getBatchOutput\",\n                \"listFinetunes\",\n                \"createFinetune\",\n                \"retrieveFinetune\",\n                \"cancelFinetune\",\n                \"createModelResponse\",\n                \"getModelResponse\",\n                \"deleteModelResponse\",\n                \"listResponseInputItems\",\n                \"messages\"\n              ]\n            }\n          },\n          \"blockedTypes\": {\n            \"type\": \"array\",\n            \"label\": \"Blocked Request Types (Multi-select)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select request types to block. When combined with allowedTypes, blocked types take precedence. Can also be specified in metadata as 'blocked_endpoints'.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"complete\",\n                \"chatComplete\",\n                \"embed\",\n                \"rerank\",\n                \"moderate\",\n                \"stream-complete\",\n                \"stream-chatComplete\",\n                \"stream-messages\",\n                \"proxy\",\n                \"imageGenerate\",\n                \"createSpeech\",\n                \"createTranscription\",\n                \"createTranslation\",\n                \"realtime\",\n                \"uploadFile\",\n                \"listFiles\",\n                \"retrieveFile\",\n                \"deleteFile\",\n                \"retrieveFileContent\",\n                \"createBatch\",\n                \"retrieveBatch\",\n                \"cancelBatch\",\n                \"listBatches\",\n                \"getBatchOutput\",\n                \"listFinetunes\",\n                \"createFinetune\",\n                \"retrieveFinetune\",\n                \"cancelFinetune\",\n                \"createModelResponse\",\n                \"getModelResponse\",\n                \"deleteModelResponse\",\n                \"listResponseInputItems\",\n                \"messages\"\n              ]\n            }\n          }\n        },\n        \"required\": []\n      }\n    },\n    {\n      \"name\": \"Sentence Count\",\n      \"id\": \"sentenceCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of sentences. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minSentences\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Sentence Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of sentences to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxSentences\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Sentence Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of sentences to allow.\"\n              }\n            ],\n            \"default\": 99999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Word Count\",\n      \"id\": \"wordCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of words. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minWords\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Word Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of words to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxWords\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Word Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of words to allow.\"\n              }\n            ],\n            \"default\": 99999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Character Count\",\n      \"id\": \"characterCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of characters. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minCharacters\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Character Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of characters to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxCharacters\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Character Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of characters to allow.\"\n              }\n            ],\n            \"default\": 9999999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"JSON Schema\",\n      \"id\": \"jsonSchema\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the response JSON matches a JSON schema.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"schema\": {\n            \"type\": \"json\",\n            \"label\": \"JSON Schema\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the JSON schema to validate against.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Schema Match\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when schema does not match\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"schema\"]\n      }\n    },\n    {\n      \"name\": \"JSON Keys\",\n      \"id\": \"jsonKeys\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the response JSON contains any, all or none of the mentioned keys.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"keys\": {\n            \"type\": \"array\",\n            \"label\": \"JSON Keys\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the keys to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"any\", \"all\", \"none\"],\n            \"default\": \"any\"\n          }\n        },\n        \"required\": [\"keys\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Contains\",\n      \"id\": \"contains\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains any, all or none of the words or phrases\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"words\": {\n            \"type\": \"array\",\n            \"label\": \"Words or Phrases\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the words or phrases to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"any\", \"all\", \"none\"],\n            \"default\": \"any\"\n          }\n        },\n        \"required\": [\"words\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Valid URLs\",\n      \"id\": \"validUrls\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if all the URLs mentioned in the content are valid\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"onlyDNS\": {\n            \"type\": \"boolean\",\n            \"label\": \"Only DNS (10x faster)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Only check if all URL domains resolve.\"\n              }\n            ],\n            \"default\": false\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert URL Validation\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when URLs are invalid\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Webhook\",\n      \"id\": \"webhook\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Makes a request to a webhook which returns the verdict and data\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"webhookURL\": {\n            \"type\": \"string\",\n            \"label\": \"Webhook URL\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"eg: https://webhook.site/guardrail\"\n              }\n            ]\n          },\n          \"headers\": {\n            \"type\": \"json\",\n            \"label\": \"Headers\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the headers to send with the request.\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"webhookURL\"]\n      }\n    },\n    {\n      \"name\": \"Log\",\n      \"id\": \"log\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Makes a request to a log URL and always gives `true` as the verdict.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"logURL\": {\n            \"type\": \"string\",\n            \"label\": \"Log URL\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"eg: https://logging.site/collector\"\n              }\n            ]\n          },\n          \"headers\": {\n            \"type\": \"json\",\n            \"label\": \"Headers\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the headers to send with the request.\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"logURL\"]\n      }\n    },\n    {\n      \"name\": \"Contains Code\",\n      \"id\": \"containsCode\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains code of format SQL, Python, TypeScript, etc.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"format\": {\n            \"type\": \"string\",\n            \"label\": \"Code Format\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the code format to check for.\"\n              }\n            ],\n            \"enum\": [\n              \"SQL\",\n              \"Python\",\n              \"TypeScript\",\n              \"JavaScript\",\n              \"Java\",\n              \"C#\",\n              \"C++\",\n              \"C\",\n              \"Ruby\",\n              \"PHP\",\n              \"Swift\",\n              \"Kotlin\",\n              \"Go\",\n              \"Rust\",\n              \"Scala\",\n              \"R\",\n              \"Perl\",\n              \"Shell\",\n              \"HTML\",\n              \"CSS\",\n              \"XML\",\n              \"JSON\",\n              \"YAML\",\n              \"Markdown\",\n              \"Dockerfile\"\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Code Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when code is not found\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"format\"]\n      }\n    },\n    {\n      \"name\": \"Uppercase check\",\n      \"id\": \"alluppercase\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if content has all uppercase letters.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Case Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text is not all uppercase\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Ends With\",\n      \"id\": \"endsWith\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the content ends with a specified string.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"suffix\": {\n            \"type\": \"string\",\n            \"label\": \"Suffix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the suffix to check for.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Suffix Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text does not end with suffix\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"suffix\"]\n      }\n    },\n    {\n      \"name\": \"Lowercase check\",\n      \"id\": \"alllowercase\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if content has all lowercase letters.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Case Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text is not all lowercase\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Allowed Models\",\n      \"id\": \"modelwhitelist\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Blocks any request whose model isn’t on this list.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"models\": {\n            \"type\": \"array\",\n            \"label\": \"Model list\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the allowed models. e.g. gpt-4o, llama-3-70b, mixtral-8x7b\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Model Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"When on, any model in the list is blocked instead of allowed.\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"models\"]\n      }\n    },\n    {\n      \"name\": \"Model Rules\",\n      \"id\": \"modelRules\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Allow requests based on metadata-driven rules mapping to allowed models.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"rules\": {\n            \"type\": \"object\",\n            \"label\": \"Rules object: {\\\"defaults\\\": [\\\"model\\\"], \\\"metadata\\\": {\\\"key\\\": {\\\"value\\\": [\\\"models\\\"]}}}\",\n            \"description\": [\n              {\n                \"type\": \"text\",\n                \"text\": \"Overrides model list using metadata-based routing.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Model Check\",\n            \"description\": [\n              {\n                \"type\": \"text\",\n                \"text\": \"When on, any model resolved by rules is blocked instead of allowed.\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"rules\"]\n      }\n    },\n    {\n      \"name\": \"JWT\",\n      \"id\": \"jwt\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the JWT token is valid.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"jwksUri\": {\n            \"type\": \"string\",\n            \"label\": \"JWKS URI\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the JWKS URI of the JWT token.\"\n              }\n            ]\n          },\n          \"headerKey\": {\n            \"type\": \"string\",\n            \"label\": \"Header Key\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the header key to check for the JWT token.\"\n              }\n            ]\n          },\n          \"cacheMaxAge\": {\n            \"type\": \"number\",\n            \"label\": \"Cache Max Age\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the cache max age in seconds.\"\n              }\n            ],\n            \"default\": 86400\n          },\n          \"clockTolerance\": {\n            \"type\": \"number\",\n            \"label\": \"Clock Tolerance\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the clock tolerance in seconds.\"\n              }\n            ],\n            \"default\": 5\n          },\n          \"maxTokenAge\": {\n            \"type\": \"string\",\n            \"label\": \"Max Token Age\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the max token age.\"\n              }\n            ],\n            \"default\": \"1d\"\n          }\n        },\n        \"required\": [\"jwksUri\", \"headerKey\"]\n      }\n    },\n    {\n      \"name\": \"Required Metadata Keys\",\n      \"id\": \"requiredMetadataKeys\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the metadata contains all the required keys\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"metadataKeys\": {\n            \"type\": \"array\",\n            \"label\": \"Metadata Keys\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the metadata keys to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"all\", \"any\", \"none\"],\n            \"default\": \"all\"\n          }\n        },\n        \"required\": [\"metadataKeys\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Add Prefix\",\n      \"id\": \"addPrefix\",\n      \"type\": \"transformer\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Adds a configurable prefix to the user's prompt or messages before sending to the AI model\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prefix\": {\n            \"type\": \"string\",\n            \"label\": \"Prefix Text\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"The text to prepend to the user's prompt or message\"\n              }\n            ],\n            \"default\": \"Please respond helpfully and accurately to the following: \"\n          },\n          \"applyToRole\": {\n            \"type\": \"string\",\n            \"label\": \"Apply to Role\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"For chat completions, which message role to apply the prefix to\"\n              }\n            ],\n            \"enum\": [\"user\", \"system\", \"assistant\"],\n            \"default\": \"user\"\n          },\n          \"addToExisting\": {\n            \"type\": \"boolean\",\n            \"label\": \"Add to Existing Message\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, adds prefix to existing message. If false, creates new message with prefix\"\n              }\n            ],\n            \"default\": true\n          },\n          \"onlyIfEmpty\": {\n            \"type\": \"boolean\",\n            \"label\": \"Only Apply If Role Empty\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Only apply prefix if no message exists for the specified role (useful for system messages)\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"prefix\"]\n      }\n    },\n    {\n      \"name\": \"Not Null\",\n      \"id\": \"notNull\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the response content is not null, undefined, or empty. Useful for detecting when an AI model returns no content.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when content IS null (inverts the check)\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    }\n  ]\n}\n","frontmatter":{"id":"default","name":"Default","description":"The default set of guardrail functions available in the AI Gateway.","credentials":[],"functions":[{"name":"Regex Match","id":"regexMatch","type":"guardrail","supportedHooks":["beforeRequestHook","afterRequestHook"],"description":[{"type":"subHeading","text":"Check if the request or response text matches a regex pattern."}],"parameters":{"type":"object","properties":{"rule":{"type":"string","label":"Regex Rule","description":[{"type":"subHeading","text":"Enter the regex pattern"}]},"not":{"type":"boolean","label":"Invert Match","description":[{"type":"subHeading","text":"If true, the verdict will be inverted"}],"default":false}},"required":["rule"]}},{"name":"Allowed Request Types","id":"allowedRequestTypes","type":"guardrail","supportedHooks":["beforeRequestHook"],"description":[{"type":"subHeading","text":"Control which request types (endpoints) can be processed. Use either an allowlist or blocklist approach. If no types are specified, all request types are allowed."}],"parameters":{"type":"object","properties":{"allowedTypes":{"type":"array","label":"Allowed Request Types (Multi-select)","description":[{"type":"subHeading","text":"Select request types to allow. Can be combined with blockedTypes for refined control. Can also be specified in metadata as 'supported_endpoints'."}],"items":{"type":"string","enum":["complete","chatComplete","embed","rerank","moderate","stream-complete","stream-chatComplete","stream-messages","proxy","imageGenerate","createSpeech","createTranscription","createTranslation","realtime","uploadFile","listFiles","retrieveFile","deleteFile","retrieveFileContent","createBatch","retrieveBatch","cancelBatch","listBatches","getBatchOutput","listFinetunes","createFinetune","retrieveFinetune","cancelFinetune","createModelResponse","getModelResponse","deleteModelResponse","listResponseInputItems","messages"]}},"blockedTypes":{"type":"array","label":"Blocked Request Types (Multi-select)","description":[{"type":"subHeading","text":"Select request types to block. When combined with allowedTypes, blocked types take precedence. Can also be specified in metadata as 'blocked_endpoints'."}],"items":{"type":"string","enum":["complete","chatComplete","embed","rerank","moderate","stream-complete","stream-chatComplete","stream-messages","proxy","imageGenerate","createSpeech","createTranscription","createTranslation","realtime","uploadFile","listFiles","retrieveFile","deleteFile","retrieveFileContent","createBatch","retrieveBatch","cancelBatch","listBatches","getBatchOutput","listFinetunes","createFinetune","retrieveFinetune","cancelFinetune","createModelResponse","getModelResponse","deleteModelResponse","listResponseInputItems","messages"]}}},"required":[]}},{"name":"Sentence Count","id":"sentenceCount","type":"guardrail","supportedHooks":["beforeRequestHook","afterRequestHook"],"description":[{"type":"subHeading","text":"Checks if the content contains a certain number of sentences. Ranges allowed."}],"parameters":{"type":"object","properties":{"minSentences":{"type":"number","label":"Minimum Sentence Count","description":[{"type":"subHeading","text":"Enter the minimum number of sentences to allow."}],"default":0},"maxSentences":{"type":"number","label":"Maximum Sentence Count","description":[{"type":"subHeading","text":"Enter the maximum number of sentences to allow."}],"default":99999},"not":{"type":"boolean","label":"Invert Range Check","description":[{"type":"subHeading","text":"If true, the verdict will be true when count is outside the range"}],"default":false}}}},{"name":"Word Count","id":"wordCount","type":"guardrail","supportedHooks":["beforeRequestHook","afterRequestHook"],"description":[{"type":"subHeading","text":"Checks if the content contains a certain number of words. Ranges allowed."}],"parameters":{"type":"object","properties":{"minWords":{"type":"number","label":"Minimum Word Count","description":[{"type":"subHeading","text":"Enter the minimum number of words to allow."}],"default":0},"maxWords":{"type":"number","label":"Maximum Word Count","description":[{"type":"subHeading","text":"Enter the maximum number of words to allow."}],"default":99999},"not":{"type":"boolean","label":"Invert Range Check","description":[{"type":"subHeading","text":"If true, the verdict will be true when count is outside the range"}],"default":false}}}},{"name":"Character Count","id":"characterCount","type":"guardrail","supportedHooks":["beforeRequestHook","afterRequestHook"],"description":[{"type":"subHeading","text":"Checks if the content contains a certain number of characters. Ranges allowed."}],"parameters":{"type":"object","properties":{"minCharacters":{"type":"number","label":"Minimum Character Count","description":[{"type":"subHeading","text":"Enter the minimum number of characters to allow."}],"default":0},"maxCharacters":{"type":"number","label":"Maximum Character Count","description":[{"type":"subHeading","text":"Enter the maximum number of characters to allow."}],"default":9999999},"not":{"type":"boolean","label":"Invert Range Check","description":[{"type":"subHeading","text":"If true, the verdict will be true when count is outside the range"}],"default":false}}}},{"name":"JSON Schema","id":"jsonSchema","type":"guardrail","supportedHooks":["afterRequestHook"],"description":[{"type":"subHeading","text":"Check if the response JSON matches a JSON schema."}],"parameters":{"type":"object","properties":{"schema":{"type":"json","label":"JSON Schema","description":[{"type":"subHeading","text":"Enter the JSON schema to validate against."}]},"not":{"type":"boolean","label":"Invert Schema Match","description":[{"type":"subHeading","text":"If true, the verdict will be true when schema does not match"}],"default":false}},"required":["schema"]}},{"name":"JSON Keys","id":"jsonKeys","type":"guardrail","supportedHooks":["afterRequestHook"],"description":[{"type":"subHeading","text":"Check if the response JSON contains any, all or none of the mentioned keys."}],"parameters":{"type":"object","properties":{"keys":{"type":"array","label":"JSON Keys","description":[{"type":"subHeading","text":"Enter the keys to check for."}],"items":{"type":"string"}},"operator":{"type":"string","label":"Operator","description":[{"type":"subHeading","text":"Select the operator to use."}],"enum":["any","all","none"],"default":"any"}},"required":["keys","operator"]}},{"name":"Contains","id":"contains","type":"guardrail","supportedHooks":["afterRequestHook"],"description":[{"type":"subHeading","text":"Checks if the content contains any, all or none of the words or phrases"}],"parameters":{"type":"object","properties":{"words":{"type":"array","label":"Words or Phrases","description":[{"type":"subHeading","text":"Enter the words or phrases to check for."}],"items":{"type":"string"}},"operator":{"type":"string","label":"Operator","description":[{"type":"subHeading","text":"Select the operator to use."}],"enum":["any","all","none"],"default":"any"}},"required":["words","operator"]}},{"name":"Valid URLs","id":"validUrls","type":"guardrail","supportedHooks":["afterRequestHook"],"description":[{"type":"subHeading","text":"Checks if all the URLs mentioned in the content are valid"}],"parameters":{"type":"object","properties":{"onlyDNS":{"type":"boolean","label":"Only DNS (10x faster)","description":[{"type":"subHeading","text":"Only check if all URL domains resolve."}],"default":false},"not":{"type":"boolean","label":"Invert URL Validation","description":[{"type":"subHeading","text":"If true, the verdict will be true when URLs are invalid"}],"default":false}}}},{"name":"Webhook","id":"webhook","type":"guardrail","supportedHooks":["beforeRequest","afterRequest"],"description":[{"type":"subHeading","text":"Makes a request to a webhook which returns the verdict and data"}],"parameters":{"type":"object","properties":{"webhookURL":{"type":"string","label":"Webhook URL","description":[{"type":"subHeading","text":"eg: https://webhook.site/guardrail"}]},"headers":{"type":"json","label":"Headers","description":[{"type":"subHeading","text":"Enter the headers to send with the request."}]}},"required":["webhookURL"]}},{"name":"Log","id":"log","type":"guardrail","supportedHooks":["afterRequest"],"description":[{"type":"subHeading","text":"Makes a request to a log URL and always gives `true` as the verdict."}],"parameters":{"type":"object","properties":{"logURL":{"type":"string","label":"Log URL","description":[{"type":"subHeading","text":"eg: https://logging.site/collector"}]},"headers":{"type":"json","label":"Headers","description":[{"type":"subHeading","text":"Enter the headers to send with the request."}]}},"required":["logURL"]}},{"name":"Contains Code","id":"containsCode","type":"guardrail","supportedHooks":["afterRequestHook"],"description":[{"type":"subHeading","text":"Checks if the content contains code of format SQL, Python, TypeScript, etc."}],"parameters":{"type":"object","properties":{"format":{"type":"string","label":"Code Format","description":[{"type":"subHeading","text":"Select the code format to check for."}],"enum":["SQL","Python","TypeScript","JavaScript","Java","C#","C++","C","Ruby","PHP","Swift","Kotlin","Go","Rust","Scala","R","Perl","Shell","HTML","CSS","XML","JSON","YAML","Markdown","Dockerfile"]},"not":{"type":"boolean","label":"Invert Code Check","description":[{"type":"subHeading","text":"If true, the verdict will be true when code is not found"}],"default":false}},"required":["format"]}},{"name":"Uppercase check","id":"alluppercase","type":"guardrail","supportedHooks":["beforeRequest","afterRequest"],"description":[{"type":"subHeading","text":"Checks if content has all uppercase letters."}],"parameters":{"type":"object","properties":{"not":{"type":"boolean","label":"Invert Case Check","description":[{"type":"subHeading","text":"If true, the verdict will be true when text is not all uppercase"}],"default":false}}}},{"name":"Ends With","id":"endsWith","type":"guardrail","supportedHooks":["beforeRequest","afterRequest"],"description":[{"type":"subHeading","text":"Check if the content ends with a specified string."}],"parameters":{"type":"object","properties":{"suffix":{"type":"string","label":"Suffix","description":[{"type":"subHeading","text":"Enter the suffix to check for."}]},"not":{"type":"boolean","label":"Invert Suffix Check","description":[{"type":"subHeading","text":"If true, the verdict will be true when text does not end with suffix"}],"default":false}},"required":["suffix"]}},{"name":"Lowercase check","id":"alllowercase","type":"guardrail","supportedHooks":["beforeRequest","afterRequest"],"description":[{"type":"subHeading","text":"Checks if content has all lowercase letters."}],"parameters":{"type":"object","properties":{"not":{"type":"boolean","label":"Invert Case Check","description":[{"type":"subHeading","text":"If true, the verdict will be true when text is not all lowercase"}],"default":false}}}},{"name":"Allowed Models","id":"modelwhitelist","type":"guardrail","supportedHooks":["beforeRequestHook"],"description":[{"type":"subHeading","text":"Blocks any request whose model isn’t on this list."}],"parameters":{"type":"object","properties":{"models":{"type":"array","label":"Model list","description":[{"type":"subHeading","text":"Enter the allowed models. e.g. gpt-4o, llama-3-70b, mixtral-8x7b"}],"items":{"type":"string"}},"not":{"type":"boolean","label":"Invert Model Check","description":[{"type":"subHeading","text":"When on, any model in the list is blocked instead of allowed."}],"default":false}},"required":["models"]}},{"name":"Model Rules","id":"modelRules","type":"guardrail","supportedHooks":["beforeRequestHook"],"description":[{"type":"subHeading","text":"Allow requests based on metadata-driven rules mapping to allowed models."}],"parameters":{"type":"object","properties":{"rules":{"type":"object","label":"Rules object: {\"defaults\": [\"model\"], \"metadata\": {\"key\": {\"value\": [\"models\"]}}}","description":[{"type":"text","text":"Overrides model list using metadata-based routing."}]},"not":{"type":"boolean","label":"Invert Model Check","description":[{"type":"text","text":"When on, any model resolved by rules is blocked instead of allowed."}],"default":false}},"required":["rules"]}},{"name":"JWT","id":"jwt","type":"guardrail","supportedHooks":["beforeRequestHook"],"description":[{"type":"subHeading","text":"Check if the JWT token is valid."}],"parameters":{"type":"object","properties":{"jwksUri":{"type":"string","label":"JWKS URI","description":[{"type":"subHeading","text":"Enter the JWKS URI of the JWT token."}]},"headerKey":{"type":"string","label":"Header Key","description":[{"type":"subHeading","text":"Enter the header key to check for the JWT token."}]},"cacheMaxAge":{"type":"number","label":"Cache Max Age","description":[{"type":"subHeading","text":"Enter the cache max age in seconds."}],"default":86400},"clockTolerance":{"type":"number","label":"Clock Tolerance","description":[{"type":"subHeading","text":"Enter the clock tolerance in seconds."}],"default":5},"maxTokenAge":{"type":"string","label":"Max Token Age","description":[{"type":"subHeading","text":"Enter the max token age."}],"default":"1d"}},"required":["jwksUri","headerKey"]}},{"name":"Required Metadata Keys","id":"requiredMetadataKeys","type":"guardrail","supportedHooks":["beforeRequestHook"],"description":[{"type":"subHeading","text":"Checks if the metadata contains all the required keys"}],"parameters":{"type":"object","properties":{"metadataKeys":{"type":"array","label":"Metadata Keys","description":[{"type":"subHeading","text":"Enter the metadata keys to check for."}],"items":{"type":"string"}},"operator":{"type":"string","label":"Operator","description":[{"type":"subHeading","text":"Select the operator to use."}],"enum":["all","any","none"],"default":"all"}},"required":["metadataKeys","operator"]}},{"name":"Add Prefix","id":"addPrefix","type":"transformer","supportedHooks":["beforeRequestHook"],"description":[{"type":"subHeading","text":"Adds a configurable prefix to the user's prompt or messages before sending to the AI model"}],"parameters":{"type":"object","properties":{"prefix":{"type":"string","label":"Prefix Text","description":[{"type":"subHeading","text":"The text to prepend to the user's prompt or message"}],"default":"Please respond helpfully and accurately to the following: "},"applyToRole":{"type":"string","label":"Apply to Role","description":[{"type":"subHeading","text":"For chat completions, which message role to apply the prefix to"}],"enum":["user","system","assistant"],"default":"user"},"addToExisting":{"type":"boolean","label":"Add to Existing Message","description":[{"type":"subHeading","text":"If true, adds prefix to existing message. If false, creates new message with prefix"}],"default":true},"onlyIfEmpty":{"type":"boolean","label":"Only Apply If Role Empty","description":[{"type":"subHeading","text":"Only apply prefix if no message exists for the specified role (useful for system messages)"}],"default":false}},"required":["prefix"]}},{"name":"Not Null","id":"notNull","type":"guardrail","supportedHooks":["afterRequestHook"],"description":[{"type":"subHeading","text":"Checks if the response content is not null, undefined, or empty. Useful for detecting when an AI model returns no content."}],"parameters":{"type":"object","properties":{"not":{"type":"boolean","label":"Invert Check","description":[{"type":"subHeading","text":"If true, the verdict will be true when content IS null (inverts the check)"}],"default":false}}}}]},"isInternal":false,"tokens":5896,"sizeBytes":27840},{"name":"manifest.json","path":"plugins/exa/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/exa/manifest.json","title":"Exa Skill","category":"anthropic-skill","format":"json","content":"{\n  \"id\": \"exa\",\n  \"description\": \"Exa.ai integration for enhancing AI responses with real-time web search information\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your Exa.ai API key\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Online Search\",\n      \"id\": \"online\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"type\": \"transformer\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Enhances prompts with relevant web search results from Exa's search API before processing the request\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prefix\": {\n            \"type\": \"string\",\n            \"label\": \"Context Prefix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"String to prepend to the search context\"\n              }\n            ],\n            \"default\": \"\\n<web_search_context>\"\n          },\n          \"suffix\": {\n            \"type\": \"string\",\n            \"label\": \"Context Suffix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"String to append to the search context\"\n              }\n            ],\n            \"default\": \"\\n</web_search_context>\"\n          },\n          \"numResults\": {\n            \"type\": \"number\",\n            \"label\": \"Number of Results\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Number of search results to include in the enhanced prompt\"\n              }\n            ],\n            \"default\": 5\n          },\n          \"includeDomains\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"label\": \"Include Domains\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Limit search results to these domains (e.g., ['nytimes.com', 'bbc.com'])\"\n              }\n            ]\n          },\n          \"excludeDomains\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"label\": \"Exclude Domains\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Remove these domains from search results (e.g., ['wikipedia.org', 'reddit.com'])\"\n              }\n            ]\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"label\": \"Timeout\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Timeout for the Exa API call in milliseconds\"\n              }\n            ],\n            \"default\": 10000\n          }\n        },\n        \"required\": []\n      }\n    }\n  ]\n}\n","frontmatter":{"id":"exa","description":"Exa.ai integration for enhancing AI responses with real-time web search information","credentials":{"type":"object","properties":{"apiKey":{"type":"string","label":"API Key","description":"Your Exa.ai API key","encrypted":true}},"required":["apiKey"]},"functions":[{"name":"Online Search","id":"online","supportedHooks":["beforeRequestHook"],"type":"transformer","description":[{"type":"subHeading","text":"Enhances prompts with relevant web search results from Exa's search API before processing the request"}],"parameters":{"type":"object","properties":{"prefix":{"type":"string","label":"Context Prefix","description":[{"type":"subHeading","text":"String to prepend to the search context"}],"default":"\n<web_search_context>"},"suffix":{"type":"string","label":"Context Suffix","description":[{"type":"subHeading","text":"String to append to the search context"}],"default":"\n</web_search_context>"},"numResults":{"type":"number","label":"Number of Results","description":[{"type":"subHeading","text":"Number of search results to include in the enhanced prompt"}],"default":5},"includeDomains":{"type":"array","items":{"type":"string"},"label":"Include Domains","description":[{"type":"subHeading","text":"Limit search results to these domains (e.g., ['nytimes.com', 'bbc.com'])"}]},"excludeDomains":{"type":"array","items":{"type":"string"},"label":"Exclude Domains","description":[{"type":"subHeading","text":"Remove these domains from search results (e.g., ['wikipedia.org', 'reddit.com'])"}]},"timeout":{"type":"number","label":"Timeout","description":[{"type":"subHeading","text":"Timeout for the Exa API call in milliseconds"}],"default":10000}},"required":[]}}]},"isInternal":false,"tokens":635,"sizeBytes":2961},{"name":"manifest.json","path":"plugins/f5-guardrails/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/f5-guardrails/manifest.json","title":"F5-guardrails Skill","category":"anthropic-skill","format":"json","content":"{\n  \"id\": \"f5-guardrails\",\n  \"description\": \"F5 Guardrails Plugin - Partner guardrail powered by F5 Guardrails\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your F5 Guardrails API key for authentication\",\n        \"encrypted\": true\n      },\n      \"calypsoUrl\": {\n        \"type\": \"string\",\n        \"label\": \"F5 Guardrails URL\",\n        \"description\": \"The base URL for F5 Guardrails API. Defaults to https://us1.calypsoai.app\",\n        \"default\": \"https://us1.calypsoai.app\"\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"F5 Guardrails\",\n      \"id\": \"scan\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"F5 Guardrails powered by F5 Guardrails provides advanced content moderation and PII detection capabilities for your LLM inputs and outputs.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"label\": \"Redact\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Whether to redact PII data detected by the F5 guardrail. When enabled, detected PII will be masked in the content.\"\n              }\n            ],\n            \"default\": false\n          },\n          \"projectId\": {\n            \"type\": \"string\",\n            \"label\": \"Project-Id\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Your F5 Guardrails project identifier\"\n              }\n            ]\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"label\": \"Timeout\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"The timeout in milliseconds for the F5 guardrail scan. Defaults to 5000.\"\n              }\n            ],\n            \"default\": 5000\n          }\n        }\n      },\n      \"required\": [\"projectId\"]\n    }\n  ]\n}\n","frontmatter":{"id":"f5-guardrails","description":"F5 Guardrails Plugin - Partner guardrail powered by F5 Guardrails","credentials":{"type":"object","properties":{"apiKey":{"type":"string","label":"API Key","description":"Your F5 Guardrails API key for authentication","encrypted":true},"calypsoUrl":{"type":"string","label":"F5 Guardrails URL","description":"The base URL for F5 Guardrails API. Defaults to https://us1.calypsoai.app","default":"https://us1.calypsoai.app"}},"required":["apiKey"]},"functions":[{"name":"F5 Guardrails","id":"scan","supportedHooks":["beforeRequestHook","afterRequestHook"],"type":"guardrail","description":[{"type":"subHeading","text":"F5 Guardrails powered by F5 Guardrails provides advanced content moderation and PII detection capabilities for your LLM inputs and outputs."}],"parameters":{"type":"object","properties":{"redact":{"type":"boolean","label":"Redact","description":[{"type":"subHeading","text":"Whether to redact PII data detected by the F5 guardrail. When enabled, detected PII will be masked in the content."}],"default":false},"projectId":{"type":"string","label":"Project-Id","description":[{"type":"subHeading","text":"Your F5 Guardrails project identifier"}]},"timeout":{"type":"number","label":"Timeout","description":[{"type":"subHeading","text":"The timeout in milliseconds for the F5 guardrail scan. Defaults to 5000."}],"default":5000}}},"required":["projectId"]}]},"isInternal":false,"tokens":511,"sizeBytes":2179},{"name":"manifest.json","path":"plugins/javelin/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/javelin/manifest.json","title":"Javelin Skill","category":"anthropic-skill","format":"json","content":"{\n  \"id\": \"javelin\",\n  \"description\": \"Javelin's AI security platform provides comprehensive guardrails for trust & safety, prompt injection detection, and language detection. Applies all enabled guardrails configured in your Javelin application policy.\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Your Javelin API key for authentication\"\n          }\n        ]\n      },\n      \"domain\": {\n        \"type\": \"string\",\n        \"label\": \"Domain\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Javelin API domain\"\n          }\n        ],\n        \"default\": \"api-dev.javelin.live\",\n        \"required\": false\n      },\n      \"application\": {\n        \"type\": \"string\",\n        \"label\": \"Application Name\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Application name for policy-specific guardrails (required)\"\n          }\n        ],\n        \"required\": true\n      }\n    },\n    \"required\": [\"apiKey\", \"application\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Javelin Guardrails\",\n      \"id\": \"guardrails\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Auto-applies all enabled guardrails in your Javelin application policy including trust & safety, prompt injection detection, language detection, and more\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {}\n      }\n    }\n  ]\n}\n","frontmatter":{"id":"javelin","description":"Javelin's AI security platform provides comprehensive guardrails for trust & safety, prompt injection detection, and language detection. Applies all enabled guardrails configured in your Javelin application policy.","credentials":{"type":"object","properties":{"apiKey":{"type":"string","label":"API Key","description":[{"type":"subHeading","text":"Your Javelin API key for authentication"}]},"domain":{"type":"string","label":"Domain","description":[{"type":"subHeading","text":"Javelin API domain"}],"default":"api-dev.javelin.live","required":false},"application":{"type":"string","label":"Application Name","description":[{"type":"subHeading","text":"Application name for policy-specific guardrails (required)"}],"required":true}},"required":["apiKey","application"]},"functions":[{"name":"Javelin Guardrails","id":"guardrails","supportedHooks":["beforeRequestHook","afterRequestHook"],"type":"guardrail","description":[{"type":"subHeading","text":"Auto-applies all enabled guardrails in your Javelin application policy including trust & safety, prompt injection detection, language detection, and more"}],"parameters":{"type":"object","properties":{}}}]},"isInternal":false,"tokens":396,"sizeBytes":1715},{"name":"manifest.json","path":"plugins/lasso/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/manifest.json","title":"Lasso Skill","category":"anthropic-skill","format":"json","content":"# Lasso Skill\n\nPath: `plugins/lasso/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/manifest.json)","tokens":300,"sizeBytes":167},{"name":"manifest.json","path":"plugins/mistral/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/mistral/manifest.json","title":"Mistral Skill","category":"anthropic-skill","format":"json","content":"# Mistral Skill\n\nPath: `plugins/mistral/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/mistral/manifest.json)","tokens":300,"sizeBytes":173},{"name":"manifest.json","path":"plugins/pangea/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pangea/manifest.json","title":"Pangea Skill","category":"anthropic-skill","format":"json","content":"# Pangea Skill\n\nPath: `plugins/pangea/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pangea/manifest.json)","tokens":300,"sizeBytes":170},{"name":"manifest.json","path":"plugins/panw-prisma-airs/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/panw-prisma-airs/manifest.json","title":"Panw-prisma-airs Skill","category":"anthropic-skill","format":"json","content":"# Panw-prisma-airs Skill\n\nPath: `plugins/panw-prisma-airs/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/panw-prisma-airs/manifest.json)","tokens":300,"sizeBytes":200},{"name":"manifest.json","path":"plugins/patronus/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/patronus/manifest.json","title":"Patronus Skill","category":"anthropic-skill","format":"json","content":"# Patronus Skill\n\nPath: `plugins/patronus/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/patronus/manifest.json)","tokens":300,"sizeBytes":176},{"name":"manifest.json","path":"plugins/pillar/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pillar/manifest.json","title":"Pillar Skill","category":"anthropic-skill","format":"json","content":"# Pillar Skill\n\nPath: `plugins/pillar/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pillar/manifest.json)","tokens":300,"sizeBytes":170},{"name":"manifest.json","path":"plugins/portkey/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/portkey/manifest.json","title":"Portkey Skill","category":"anthropic-skill","format":"json","content":"# Portkey Skill\n\nPath: `plugins/portkey/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/portkey/manifest.json)","tokens":300,"sizeBytes":173},{"name":"manifest.json","path":"plugins/promptfoo/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptfoo/manifest.json","title":"Promptfoo Skill","category":"anthropic-skill","format":"json","content":"# Promptfoo Skill\n\nPath: `plugins/promptfoo/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptfoo/manifest.json)","tokens":300,"sizeBytes":179},{"name":"manifest.json","path":"plugins/promptsecurity/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptsecurity/manifest.json","title":"Promptsecurity Skill","category":"anthropic-skill","format":"json","content":"# Promptsecurity Skill\n\nPath: `plugins/promptsecurity/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptsecurity/manifest.json)","tokens":300,"sizeBytes":194},{"name":"manifest.json","path":"plugins/qualifire/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/qualifire/manifest.json","title":"Qualifire Skill","category":"anthropic-skill","format":"json","content":"# Qualifire Skill\n\nPath: `plugins/qualifire/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/qualifire/manifest.json)","tokens":300,"sizeBytes":179},{"name":"manifest.json","path":"plugins/sydelabs/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/sydelabs/manifest.json","title":"Sydelabs Skill","category":"anthropic-skill","format":"json","content":"# Sydelabs Skill\n\nPath: `plugins/sydelabs/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/sydelabs/manifest.json)","tokens":300,"sizeBytes":176},{"name":"manifest.json","path":"plugins/walledai/manifest.json","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/walledai/manifest.json","title":"Walledai Skill","category":"anthropic-skill","format":"json","content":"# Walledai Skill\n\nPath: `plugins/walledai/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/walledai/manifest.json)","tokens":300,"sizeBytes":176},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nThis is the **Portkey AI Gateway** - a fast, reliable AI gateway that routes requests to 250+ LLMs with sub-1ms latency. It's built with Hono framework for TypeScript/JavaScript and can be deployed to multiple environments including Cloudflare Workers, Node.js servers, and Docker containers.\n\n## Development Commands\n\n### Core Development\n- `npm run dev` - Start development server using Wrangler (Cloudflare Workers)\n- `npm run dev:node` - Start development server using Node.js\n- `npm run build` - Build the project for production\n- `npm run build-plugins` - Build the plugin system\n\n### Testing\n- `npm run test:gateway` - Run tests for the main gateway code (src/)\n- `npm run test:plugins` - Run tests for plugins\n- `jest src/` - Run specific gateway tests\n- `jest plugins/` - Run specific plugin tests\n\n### Code Quality\n- `npm run format` - Format code with Prettier\n- `npm run format:check` - Check code formatting\n- `npm run pretty` - Alternative format command\n\n### Deployment\n- `npm run deploy` - Deploy to Cloudflare Workers\n- `npm run start:node` - Start production Node.js server\n\n## Architecture\n\n### Core Components\n\n**Main Application (`src/index.ts`)**\n- Hono-based HTTP server with middleware pipeline\n- Handles multiple AI provider integrations\n- Routes: `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, etc.\n\n**Provider System (`src/providers/`)**\n- Modular provider implementations (OpenAI, Anthropic, Azure, etc.)\n- Each provider has standardized interface: `api.ts`, `chatComplete.ts`, `embed.ts`\n- Provider configs define supported features and transformations\n\n**Middleware Pipeline**\n- `requestValidator` - Validates incoming requests\n- `hooks` - Pre/post request hooks\n- `memoryCache` - Response caching\n- `logger` - Request/response logging\n- `adminAuth` - Node-only local UI session auth for `/public/*` login endpoints and `/log/stream`\n- `portkey` - Core Portkey-specific middleware for routing, guardrails, etc.\n\n**Plugin System (`plugins/`)**\n- Guardrail plugins for content filtering, PII detection, etc.\n- Each plugin has `manifest.json` defining capabilities\n- Plugins are built separately with `npm run build-plugins`\n\n### Key Concepts\n\n**Configs** - JSON configurations that define:\n- Provider routing and fallbacks\n- Load balancing strategies\n- Guardrails and content filtering\n- Caching and retry policies\n\n**Handlers** - Route-specific request processors in `src/handlers/`\n- Each AI API endpoint has dedicated handler\n- Stream handling for real-time responses\n- WebSocket support for realtime APIs\n\n## File Structure\n\n- `src/providers/` - AI provider integrations\n- `src/handlers/` - API endpoint handlers\n- `src/middlewares/` - Request/response middleware\n- `plugins/` - Guardrail and validation plugins\n- `cookbook/` - Example integrations and use cases\n- `conf.json` - Runtime configuration\n\n## Testing Strategy\n\nTests are organized by component:\n- `src/tests/` - Core gateway functionality tests\n- `src/handlers/__tests__/` - Handler-specific tests\n- `plugins/*/**.test.ts` - Plugin tests\n- Test timeout: 30 seconds (configured in jest.config.js)\n\n## Configuration\n\nThe gateway uses `conf.json` for runtime configuration. Sample config available in `conf_sample.json`.\n\nFor local UI hardening, set `admin_token` in `conf.json`. The `/public` UI uses this token to establish an in-memory admin session, and `/log/stream` requires that session.\n\nKey environment variables and configuration handled through Hono's adapter system for multi-environment deployment.","isInternal":false,"tokens":841,"sizeBytes":3654},{"name":"README.md","path":"plugins/lasso/README.md","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/README.md","title":"lasso Documentation","category":"plugin-manifest","format":"markdown","content":"# lasso Documentation\n\nPath: `plugins/lasso/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/README.md)","tokens":300,"sizeBytes":167},{"name":"README.md","path":"plugins/README.md","rawUrl":"https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/README.md","title":"plugins Documentation","category":"plugin-manifest","format":"markdown","content":"# Portkey Gateway Plugins\n\n## Table of Contents\n- [Portkey Gateway Plugins](#portkey-gateway-plugins)\n  - [Table of Contents](#table-of-contents)\n  - [Introduction](#introduction)\n  - [What are Plugins?](#what-are-plugins)\n  - [Why are Plugins Important?](#why-are-plugins-important)\n  - [Concepts](#concepts)\n    - [Hooks](#hooks)\n    - [Guardrails](#guardrails)\n    - [Checks](#checks)\n  - [Creating a Plugin](#creating-a-plugin)\n    - [Folder Structure](#folder-structure)\n    - [Manifest File](#manifest-file)\n    - [Plugin Function](#plugin-function)\n  - [Building Plugins into Your Gateway](#building-plugins-into-your-gateway)\n  - [Using Plugins](#using-plugins)\n  - [Testing Plugins](#testing-plugins)\n\n## Introduction\n\nThis folder contains plugins for the Portkey Gateway. Plugins allow developers to extend the capabilities of the Gateway by adding custom functionality at various stages of the request lifecycle. Currently, the primary type of plugins supported in the AI gateway are guardrails.\n\n## What are Plugins?\n\nPlugins in Portkey enable developers to extend the capabilities of the AI gateway by writing their own functionality. Portkey exposes the concept of hooks, which allows developers to execute custom functions at key points in the request journey. While the plugin system is designed to be extensible, the current focus is on implementing guardrails.\n\n## Why are Plugins Important?\n\nPlugins are crucial for several reasons:\n\n1. **Customization**: They allow you to tailor the Gateway's behavior to your specific needs, especially in terms of implementing guardrails.\n2. **Extensibility**: You can add new features and integrations without modifying the core Gateway code.\n3. **Modularity**: Plugins can be easily added, removed, or updated without affecting other parts of the system.\n4. **Community Contributions**: The plugin system allows the community to contribute and share useful extensions, particularly for guardrail implementations.\n\n## Concepts\n\n### Hooks\n\nHooks in Portkey's AI gateway allow custom functions to be executed at various stages of the request lifecycle. Currently, four types of hooks are supported:\n\n1. **Start**: Executed at the beginning of the request lifecycle for initial setup and logging.\n2. **BeforeRequest**: Executed before the request is sent to the AI model, typically used for implementing guardrails.\n3. **AfterRequest**: Executed after the AI model processes the request but before the response is returned, used for post-processing and validations.\n4. **End**: Executed at the end of the request lifecycle for final logging and cleanup.\n\nWhile hooks can be extended for custom logging solutions and other custom functionalities, their primary intended purpose is to set up and enforce guardrails.\n\n### Guardrails\n\nGuardrails in Portkey's AI gateway are a set of checks that are run together within the `beforeRequest` or `afterRequest` hooks to determine a `verdict`. The verdict of a guardrail dictates the actions to be taken on the request or response. For example, if the guardrail fails, the request can be failed, or the response can be returned with a 246 status code indicating that the guardrails failed.\n\nGuardrails can be defined either through the user interface (UI) of Portkey or as a JSON configuration within the Portkey `config`. This flexibility allows for easy management and customization of guardrails according to the specific needs of the application.\n\n### Checks\n\nA check is an individual function that assesses the input prompt or output response against predefined conditions. Each check returns a boolean verdict or may error out if issues are encountered. Checks are the building blocks of guardrails, and Portkey includes a set of predefined checks as well as the ability to add custom checks.\n\n## Creating a Plugin\n\nWhen creating a plugin for Portkey, keep in mind that it should primarily focus on implementing guardrails. Here's how to structure your plugin:\n\n### Folder Structure\n\nTo create a plugin, follow this structure in the `/plugins` folder:\n\n```\n/plugins\n  /your-plugin-name\n    - manifest.json\n    - main-function.ts\n    - test-file.test.ts (recommended)\n```\n\n### Manifest File\n\nThe `manifest.json` file defines the plugin's properties, required credentials, and available functions. Here's an example structure:\n\n```json\n{\n  \"id\": \"your-plugin-id\",\n  \"description\": \"A brief description of your guardrail plugin\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your API key description\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Your Guardrail Function\",\n      \"id\": \"yourGuardrailId\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Description of your guardrail function\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"paramName\": {\n            \"type\": \"string\",\n            \"label\": \"Parameter Label\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Description of the parameter\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"paramName\"]\n      }\n    }\n  ]\n}\n```\n\n### Plugin Function\n\nCreate a TypeScript file (e.g., `main-function.ts`) that exports a handler function. This function will implement your guardrail logic. Here's a basic structure:\n\n```typescript\nimport { HookEventType, PluginContext, PluginHandler, PluginParameters } from '../types';\n\nexport const handler: PluginHandler = async (\n  context: PluginContext,\n  parameters: PluginParameters,\n  eventType: HookEventType\n) => {\n  // Your guardrail logic here\n  // You can access:\n  // - context.request for request data\n  // - context.response for response data (in afterRequestHook)\n  // - parameters for plugin-specific parameters\n  // - eventType to determine which hook is being executed\n\n  return {\n    error: null, // or error object if an error occurred\n    verdict: true, // or false to indicate if the guardrail passed or failed\n    data: {} // any additional data you want to return\n  };\n};\n```\n\n## Building Plugins into Your Gateway\n\nTo build plugins into your Gateway, follow these steps:\n\n1. In the root directory of the Gateway repository, locate the `conf.json` file.\n2. Edit the `conf.json` file to specify which plugins you want to enable and provide any necessary credentials. Here's an example:\n\n```json\n{\n  \"plugins_enabled\": [\"default\", \"your-guardrail-plugin\"],\n  \"credentials\": {\n    \"your-guardrail-plugin\": {\n      \"apiKey\": \"your-api-key-here\"\n    }\n  },\n  \"cache\": false\n}\n```\n\n3. Run the build command to compile the plugins:\n\n```\nnpm run build-plugins\n```\n\nThis command will compile the plugins and prepare them for use with the Gateway.\n\n## Using Plugins\n\nOnce you've built the plugins, they will be automatically deployed with the Gateway when you run it. You can start the Gateway using one of the following commands:\n\n- For development:\n  ```\n  npm run dev\n  ```\n- For Node.js:\n  ```\n  npm run dev:node\n  ```\n- For Cloudflare Workers:\n  ```\n  npm run dev:workerd\n  ```\n\nThe guardrail plugins you've enabled in the `conf.json` file will be loaded and ready to use.\n\n## Testing Plugins\n\nTo test your guardrail plugins:\n\n1. Ensure you have written test files for your plugins (e.g., `test-file.test.ts`).\n2. Run the test command:\n\n```\nnpx jest\n```\n\nThis command will execute the test files in the plugins repository, allowing you to verify that your guardrail plugins are functioning correctly.","isInternal":false,"tokens":1697,"sizeBytes":7757}],"systemPromptSnippet":"<yakaai_skills repo=\"Portkey-AI/gateway\">\n<!-- File: plugins/acuvity/manifest.json (Tokens: ~2029 | Category: anthropic-skill) -->\n{\n  \"id\": \"acuvity\",\n  \"description\": \"acuvity Plugin\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Find your API key in the acuvity dashboard\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Acuvity\",\n      \"id\": \"Acuvity\",\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Comprehensive content safety and security checks\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prompt_injection\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable prompt injection detection\"\n              }\n            ]\n          },\n          \"prompt_injection_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for prompt injection detection\"\n              }\n            ]\n          },\n          \"toxic\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable toxicity detection\"\n              }\n            ]\n          },\n          \"toxic_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for toxicity detection\"\n              }\n            ]\n          },\n          \"jail_break\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable jailbreak detection\"\n              }\n            ]\n          },\n          \"jail_break_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for jailbreak detection\"\n              }\n            ]\n          },\n          \"malicious_url\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable malicious URL detection\"\n              }\n            ]\n          },\n          \"malicious_url_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for malicious URL detection\"\n              }\n            ]\n          },\n          \"biased\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable bias detection\"\n              }\n            ]\n          },\n          \"biased_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for bias detection\"\n              }\n            ]\n          },\n          \"harmful\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable harmful content detection\"\n              }\n            ]\n          },\n          \"harmful_threshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"multipleOf\": 0.01,\n            \"default\": 0.5,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Set the threshold for harmful content detection\"\n              }\n            ]\n          },\n          \"language\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable language check\"\n              }\n            ]\n          },\n          \"language_values\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"english\",\n              \"chinese\",\n              \"spanish\",\n              \"french\",\n              \"german\",\n              \"japanese\",\n              \"gibberish\"\n            ],\n            \"default\": \"english\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the language to check\"\n              }\n            ]\n          },\n          \"pii\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable PII detection\"\n              }\n            ]\n          },\n          \"pii_redact\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable PII redaction\"\n              }\n            ]\n          },\n          \"pii_categories\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"email_address\",\n                \"ssn\",\n                \"person\",\n                \"aba_routing_number\",\n                \"address\",\n                \"bank_account\",\n                \"bitcoin_wallet\",\n                \"credit_card\",\n                \"driver_license\",\n                \"itin_number\",\n                \"location\",\n                \"medical_license\",\n                \"money_amount\",\n                \"passport_number\",\n                \"phone_number\"\n              ]\n            },\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the categories that should NOT be allowed in the content\"\n              }\n            ]\n          },\n          \"secrets\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable secrets detection\"\n              }\n            ]\n          },\n          \"secrets_redact\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enable secrets redaction\"\n              }\n            ]\n          },\n          \"secrets_categories\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"credentials\",\n                \"adafruit\",\n                \"alibaba\",\n                \"anthropic\",\n                \"apideck\",\n                \"apify\",\n                \"atlassian\",\n                \"aws_secret_key\",\n                \"buildkite\",\n                \"checkout\",\n                \"clickuppersonal\",\n                \"contentfulpersonalaccess\",\n                \"database_url_with_credentials\",\n                \"databricks\",\n                \"denodeploy\",\n                \"dfuse\",\n                \"digitalocean\",\n                \"discord_webhook\",\n                \"docker_hub\",\n                \"doppler\",\n                \"dropbox\",\n                \"endorlabs\",\n                \"fleetbase\",\n                \"flutterwave\",\n                \"frameio\",\n                \"freshdesk\",\n                \"fullstory\",\n                \"github\",\n                \"gitlab\",\n                \"gocardless\",\n                \"google_api\",\n                \"grafana\",\n                \"groq\",\n                \"huggingface\",\n                \"intra42\",\n                \"jwt\",\n                \"klaviyo\",\n                \"launchdarkly\",\n                \"linearapi\",\n                \"locationiq\",\n                \"mailchimp\",\n                \"mailgun\",\n                \"mapbox\",\n                \"maxmind\",\n                \"microsoft_teams_webhook\",\n                \"nightfall\",\n                \"notion\",\n                \"npm\",\n                \"openai\",\n                \"pagarme\",\n                \"paystack\",\n                \"planetscale\",\n                \"planetscaledb\",\n                \"portainer\",\n                \"posthog\",\n                \"postman\",\n                \"prefect\",\n                \"private_key\",\n                \"pubnub_publish\",\n                \"pubnub_subscribe\",\n                \"pulumi\",\n                \"ramp\",\n                \"razorpay\",\n                \"readme\",\n                \"rechargepayments\",\n                \"replicate\",\n                \"rubygems\",\n                \"salesforce\",\n                \"sendgrid\",\n                \"sendinblue\",\n                \"shopify\",\n                \"slack_access\",\n                \"slack_bot\",\n                \"slack_refresh\",\n                \"slack_user\",\n                \"slack_webhook\",\n                \"slack_workflow_webhook\",\n                \"sourcegraph\",\n                \"sourcegraphcody\",\n                \"squareapp\",\n                \"squareup\",\n                \"stripe\",\n                \"supabase\",\n                \"tailscale\",\n                \"tines_webhook\",\n                \"trufflehog\",\n                \"twilio\",\n                \"ubidots\",\n                \"voiceflow\",\n                \"web_url_with_credentials\",\n                \"zapierwebhook\"\n              ]\n            },\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the types of secrets that should be detected in the content\"\n              }\n            ]\n          }\n        }\n      }\n    }\n  ]\n}\n\n<!-- File: plugins/aporia/manifest.json (Tokens: ~286 | Category: anthropic-skill) -->\n{\n  \"id\": \"aporia\",\n  \"description\": \"Aporia Guardrails mitigates LLM hallucinations, inappropriate responses, prompt injection attacks, and other unintended behaviors in real-time\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Find your API key in the Aporia dashboard\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Validate - Project\",\n      \"id\": \"validateProject\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check all the policies within an Aporia project\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"projectID\": {\n            \"type\": \"string\",\n            \"label\": \"Project ID\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the Aporia Project ID to validate\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"projectID\"]\n      }\n    }\n  ]\n}\n\n<!-- File: plugins/azure/manifest.json (Tokens: ~1315 | Category: anthropic-skill) -->\n{\n  \"name\": \"azure-ai\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Azure AI Content Safety and PII Detection plugins for content moderation\",\n  \"author\": \"Portkey AI\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"pii\": {\n        \"$ref\": \"#/definitions/credentials\"\n      },\n      \"contentSafety\": {\n        \"$ref\": \"#/definitions/credentials\"\n      }\n    }\n  },\n  \"functions\": [\n    {\n      \"name\": \"Content Safety\",\n      \"id\": \"contentSafety\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"parameters\": {\n        \"contentSafety\": {\n          \"blocklistNames\": {\n            \"type\": \"array\",\n            \"description\": \"Array of blocklist names to check against\",\n            \"default\": []\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-11-01\"\n          },\n          \"severity\": {\n            \"type\": \"number\",\n            \"description\": \"Severity threshold for the Content Safety API\",\n            \"default\": 2\n          },\n          \"categories\": {\n            \"type\": \"array\",\n            \"description\": \"Categories to check against\",\n            \"default\": [\"Hate\", \"SelfHarm\", \"Sexual\", \"Violence\"],\n            \"enum\": [\"Hate\", \"SelfHarm\", \"Sexual\", \"Violence\"]\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"PII Detection\",\n      \"id\": \"pii\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"domain\": {\n            \"type\": \"string\",\n            \"description\": \"Domain for PII detection ('none' or 'healthcare')\",\n            \"default\": \"none\"\n          },\n          \"modelVersion\": {\n            \"type\": \"string\",\n            \"description\": \"Version of the PII detection model to use\",\n            \"default\": \"latest\"\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-11-01\"\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"description\": \"Whether to redact the PII detected\",\n            \"default\": false\n          },\n          \"language\": {\n            \"type\": \"string\",\n            \"description\": \"Language for PII detection\",\n            \"default\": \"en\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Shield Prompt\",\n      \"id\": \"shieldPrompt\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": \"Detects jailbreak and prompt injection attacks using Azure AI Content Safety Prompt Shields API\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-09-01\"\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Protected Material\",\n      \"id\": \"protectedMaterial\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": \"Detects known protected/copyrighted text content in LLM outputs using Azure AI Content Safety Protected Material Detection API\",\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"timeout\": {\n            \"type\": \"number\",\n            \"description\": \"Timeout in milliseconds for the API request\",\n            \"default\": 5000\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for the Content Safety API\",\n            \"default\": \"2024-09-01\"\n          }\n        }\n      }\n    }\n  ],\n  \"definitions\": {\n    \"credentials\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"azureAuthMode\": {\n          \"type\": \"string\",\n          \"description\": \"Authentication mode for Azure AI services\",\n          \"default\": \"apiKey\",\n          \"enum\": [\"apiKey\", \"entra\", \"managed\"]\n        },\n        \"resourceName\": {\n          \"type\": \"string\",\n          \"description\": \"Azure Cognitive Services resource name (e.g., https://<your-resource-name>.cognitiveservices.azure.com)\",\n          \"required\": true\n        },\n        \"apiKey\": {\n          \"type\": \"string\",\n          \"description\": \"Azure API key\"\n        },\n        \"clientId\": {\n          \"type\": \"string\",\n          \"description\": \"Client ID for Azure Entra ID or Managed Identity authentication\"\n        },\n        \"clientSecret\": {\n          \"type\": \"string\",\n          \"description\": \"Client Secret for Azure Entra ID authentication\"\n        },\n        \"tenantId\": {\n          \"type\": \"string\",\n          \"description\": \"Tenant ID for Azure Entra ID authentication\"\n        },\n        \"customHost\": {\n          \"type\": \"string\",\n          \"description\": \"Custom host for Azure AI services (Private Link etc.)\"\n        }\n      },\n      \"anyOf\": [\n        {\n          \"required\": [\"apiKey\", \"azureAuthMode\"]\n        },\n        {\n          \"required\": [\"clientId\", \"clientSecret\", \"tenantId\", \"azureAuthMode\"]\n        },\n        {\n          \"required\": [\"clientId\", \"azureAuthMode\"]\n        }\n      ]\n    }\n  }\n}\n\n<!-- File: plugins/bedrock/manifest.json (Tokens: ~517 | Category: anthropic-skill) -->\n{\n  \"id\": \"bedrock\",\n  \"description\": \"AWS Bedrock Content Moderation classifier leverages AWS guardrails for effective guardrails and introduces a pragmatic approach to LLM safety by addressing model-generated harms such as unqualified advice and PII\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"accessKeyId\": {\n        \"type\": \"string\",\n        \"label\": \"Access Key ID\",\n        \"description\": \"Find your Access Key ID in the AWS Management Console\",\n        \"encrypted\": true\n      },\n      \"accessKeySecret\": {\n        \"type\": \"string\",\n        \"label\": \"Access Key Secret\",\n        \"description\": \"Find your Access Key Secret in the AWS Management Console\",\n        \"encrypted\": true\n      },\n      \"awsSessionToken\": {\n        \"type\": \"string\",\n        \"label\": \"AWS Session Token\",\n        \"description\": \"AWS Session token.\"\n      },\n      \"region\": {\n        \"type\": \"string\",\n        \"description\": \"Bedrock guardrail hosted region\",\n        \"lable\": \"Region\"\n      }\n    },\n    \"required\": [\"accessKeyId\", \"accessKeySecret\", \"region\"]\n  },\n\n  \"functions\": [\n    {\n      \"name\": \"Apply Bedrock guardrail\",\n      \"id\": \"guard\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Filters out Content that contain harmful content & prompt filters\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"guardrailVersion\": {\n            \"type\": \"string\",\n            \"label\": \"Guardrail Version\",\n            \"description\": \"Select the version of the guardrail to use\"\n          },\n          \"guardrailId\": {\n            \"type\": \"string\",\n            \"label\": \"Guardrail ID\",\n            \"description\": \"ID of the guardrail.\"\n          },\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"label\": \"Redact PII\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the PII identified will be redacted\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"guardrailVersion\", \"guardrailId\"]\n      }\n    }\n  ]\n}\n\n<!-- File: plugins/Contributing.md (Tokens: ~837 | Category: anthropic-skill) -->\n## 🎉 Welcome\n\nHello and Thank you for your interest in contributing to Portkey Gateway Plugins! We're excited to welcome new  developers to our community. This guide will help you get started with creating and submitting new guardrails plugins for the Portkey Gateway.\n\n## 🚀 Quick Start\n\n1. Fork the repository on GitHub: [https://github.com/Portkey-AI/gateway](https://github.com/Portkey-AI/gateway)\n2. Clone your forked repository to your local machine:\n   ```sh\n   git clone https://github.com/YOUR_USERNAME/gateway.git\n3. Navigate to the plugins directory:\n    ```sh \n    cd gateway/plugins\n    ```\n\n## 🔧 Creating a New Plugin\n\nCreate a new directory for your plugin in the `/plugins` folder:\n```sh \nCopy/plugins\n  /your-plugin-name\n    - manifest.json\n    - main-function.ts\n    - test-file.test.ts (recommended)\n```\n\nCreate a `manifest.json` file defining your plugin's properties, credentials, and functions.\nImplement your plugin logic in `main-function.ts.`\nWrite tests for your plugin in `test-file.test.ts`.\n\nFor detailed information on plugin structure and implementation, please refer to the  [Plugins README](https://github.com/Portkey-AI/gateway/tree/main/plugins#readme).\n\n\n## 📝 Plugin Guidelines\n\nFocus on implementing guardrails as the primary function of your plugin.\nEnsure your plugin works with the `beforeRequest` and `afterRequest` hooks.\nWrite clear and concise documentation within your code and in the `manifest.json` file.\nTest your plugin thoroughly before submission.\n\n\n## 🔄 Contributing a Plugin\n\nThere are two main ways to contribute a plugin to the Portkey Gateway:\n\n### 1. Work on Existing Issues\n\n1. Check the [Issues tab](https://github.com/Portkey-AI/gateway/issues) in the Portkey Gateway repository.\n2. Look for issues labeled with `good-first-issue` and `plugin`.\n3. Submit a pull request referencing the original issue number.\n\n### 2. Propose and Develop a New Plugin\n\nIf you have an idea for a new plugin:\n\n1. Check the [Issues tab](https://github.com/Portkey-AI/gateway/issues) to ensure a similar plugin hasn't been proposed.\n2. Create a new issue with the following title format: [Feature] Your Plugin Name.\n3. In the issue description, provide:\n   - **Plugin Name**: A clear, descriptive name for your plugin.\n   - **Description**: A brief overview of your plugin's functionality and its benefits.\n3. Submit a pull request referencing your proposal issue number.\n\n## 📤 Submitting Your Pull Request\n\nWhen your plugin is ready for review:\n\n1. Ensure your code follows the structure outlined in the [Plugins README](https://github.com/Portkey-AI/gateway/blob/main/plugins/README.md).\n3. Run tests to ensure your plugin works as expected.\n4. Create a pull request with the following title format: `[New Plugin] Your Plugin Name`.\n5. In the pull request description, provide:\n   - A link to the original issue or proposal\n   - A summary of the changes and new features\n\n\nThe maintainers will review your submission and may suggest changes or improvements. Be prepared to engage in a constructive dialogue and make updates as needed.\n\n## 🧪 Testing\n\nBefore submitting your pull request:\n\n1. Write unit tests for your plugin in a `test-file.test.ts` file.\n2. Ensure all tests pass by running:\n\n\n\n## 🤔 Getting Help\nIf you have any questions or need assistance while developing your plugin, please join our [Discord](https://discord.gg/DD7vgKK299) community. It's the fastest way to get support and connect with other contributors.\n\n## 🎊 Your Plugin is Accepted!\nOnce your plugin is reviewed and accepted, it will be merged into the main repository. We appreciate your contribution to making the Portkey Gateway more powerful and versatile!\nThank you for contributing to Portkey Gateway Plugins!\n\n<!-- File: plugins/crowdstrike-aidr/manifest.json (Tokens: ~249 | Category: anthropic-skill) -->\n{\n  \"id\": \"crowdstrike-aidr\",\n  \"description\": \"CrowdStrike AIDR for scanning LLM inputs and outputs\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"AIDR API token\",\n        \"description\": \"AIDR Token. Get your token from the Falcon console.\",\n        \"encrypted\": true\n      },\n      \"baseUrl\": {\n        \"type\": \"string\",\n        \"label\": \"Base url\",\n        \"description\": \"Base URL\"\n      }\n    },\n    \"required\": [\"baseUrl\", \"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Guard Chat Completions\",\n      \"id\": \"guardChatCompletions\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Pass LLM Input and Output to the guard_chat_completions endpoint. Able to block or sanitize text depending on configured rules.\"\n        }\n      ]\n    }\n  ]\n}\n\n<!-- File: plugins/default/manifest.json (Tokens: ~5896 | Category: anthropic-skill) -->\n{\n  \"id\": \"default\",\n  \"name\": \"Default\",\n  \"description\": \"The default set of guardrail functions available in the AI Gateway.\",\n  \"credentials\": [],\n  \"functions\": [\n    {\n      \"name\": \"Regex Match\",\n      \"id\": \"regexMatch\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the request or response text matches a regex pattern.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"rule\": {\n            \"type\": \"string\",\n            \"label\": \"Regex Rule\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the regex pattern\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Match\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be inverted\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"rule\"]\n      }\n    },\n    {\n      \"name\": \"Allowed Request Types\",\n      \"id\": \"allowedRequestTypes\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Control which request types (endpoints) can be processed. Use either an allowlist or blocklist approach. If no types are specified, all request types are allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"allowedTypes\": {\n            \"type\": \"array\",\n            \"label\": \"Allowed Request Types (Multi-select)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select request types to allow. Can be combined with blockedTypes for refined control. Can also be specified in metadata as 'supported_endpoints'.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"complete\",\n                \"chatComplete\",\n                \"embed\",\n                \"rerank\",\n                \"moderate\",\n                \"stream-complete\",\n                \"stream-chatComplete\",\n                \"stream-messages\",\n                \"proxy\",\n                \"imageGenerate\",\n                \"createSpeech\",\n                \"createTranscription\",\n                \"createTranslation\",\n                \"realtime\",\n                \"uploadFile\",\n                \"listFiles\",\n                \"retrieveFile\",\n                \"deleteFile\",\n                \"retrieveFileContent\",\n                \"createBatch\",\n                \"retrieveBatch\",\n                \"cancelBatch\",\n                \"listBatches\",\n                \"getBatchOutput\",\n                \"listFinetunes\",\n                \"createFinetune\",\n                \"retrieveFinetune\",\n                \"cancelFinetune\",\n                \"createModelResponse\",\n                \"getModelResponse\",\n                \"deleteModelResponse\",\n                \"listResponseInputItems\",\n                \"messages\"\n              ]\n            }\n          },\n          \"blockedTypes\": {\n            \"type\": \"array\",\n            \"label\": \"Blocked Request Types (Multi-select)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select request types to block. When combined with allowedTypes, blocked types take precedence. Can also be specified in metadata as 'blocked_endpoints'.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"complete\",\n                \"chatComplete\",\n                \"embed\",\n                \"rerank\",\n                \"moderate\",\n                \"stream-complete\",\n                \"stream-chatComplete\",\n                \"stream-messages\",\n                \"proxy\",\n                \"imageGenerate\",\n                \"createSpeech\",\n                \"createTranscription\",\n                \"createTranslation\",\n                \"realtime\",\n                \"uploadFile\",\n                \"listFiles\",\n                \"retrieveFile\",\n                \"deleteFile\",\n                \"retrieveFileContent\",\n                \"createBatch\",\n                \"retrieveBatch\",\n                \"cancelBatch\",\n                \"listBatches\",\n                \"getBatchOutput\",\n                \"listFinetunes\",\n                \"createFinetune\",\n                \"retrieveFinetune\",\n                \"cancelFinetune\",\n                \"createModelResponse\",\n                \"getModelResponse\",\n                \"deleteModelResponse\",\n                \"listResponseInputItems\",\n                \"messages\"\n              ]\n            }\n          }\n        },\n        \"required\": []\n      }\n    },\n    {\n      \"name\": \"Sentence Count\",\n      \"id\": \"sentenceCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of sentences. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minSentences\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Sentence Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of sentences to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxSentences\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Sentence Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of sentences to allow.\"\n              }\n            ],\n            \"default\": 99999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Word Count\",\n      \"id\": \"wordCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of words. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minWords\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Word Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of words to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxWords\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Word Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of words to allow.\"\n              }\n            ],\n            \"default\": 99999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Character Count\",\n      \"id\": \"characterCount\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains a certain number of characters. Ranges allowed.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"minCharacters\": {\n            \"type\": \"number\",\n            \"label\": \"Minimum Character Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the minimum number of characters to allow.\"\n              }\n            ],\n            \"default\": 0\n          },\n          \"maxCharacters\": {\n            \"type\": \"number\",\n            \"label\": \"Maximum Character Count\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the maximum number of characters to allow.\"\n              }\n            ],\n            \"default\": 9999999\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Range Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when count is outside the range\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"JSON Schema\",\n      \"id\": \"jsonSchema\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the response JSON matches a JSON schema.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"schema\": {\n            \"type\": \"json\",\n            \"label\": \"JSON Schema\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the JSON schema to validate against.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Schema Match\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when schema does not match\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"schema\"]\n      }\n    },\n    {\n      \"name\": \"JSON Keys\",\n      \"id\": \"jsonKeys\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the response JSON contains any, all or none of the mentioned keys.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"keys\": {\n            \"type\": \"array\",\n            \"label\": \"JSON Keys\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the keys to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"any\", \"all\", \"none\"],\n            \"default\": \"any\"\n          }\n        },\n        \"required\": [\"keys\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Contains\",\n      \"id\": \"contains\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains any, all or none of the words or phrases\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"words\": {\n            \"type\": \"array\",\n            \"label\": \"Words or Phrases\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the words or phrases to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"any\", \"all\", \"none\"],\n            \"default\": \"any\"\n          }\n        },\n        \"required\": [\"words\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Valid URLs\",\n      \"id\": \"validUrls\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if all the URLs mentioned in the content are valid\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"onlyDNS\": {\n            \"type\": \"boolean\",\n            \"label\": \"Only DNS (10x faster)\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Only check if all URL domains resolve.\"\n              }\n            ],\n            \"default\": false\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert URL Validation\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when URLs are invalid\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Webhook\",\n      \"id\": \"webhook\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Makes a request to a webhook which returns the verdict and data\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"webhookURL\": {\n            \"type\": \"string\",\n            \"label\": \"Webhook URL\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"eg: https://webhook.site/guardrail\"\n              }\n            ]\n          },\n          \"headers\": {\n            \"type\": \"json\",\n            \"label\": \"Headers\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the headers to send with the request.\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"webhookURL\"]\n      }\n    },\n    {\n      \"name\": \"Log\",\n      \"id\": \"log\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Makes a request to a log URL and always gives `true` as the verdict.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"logURL\": {\n            \"type\": \"string\",\n            \"label\": \"Log URL\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"eg: https://logging.site/collector\"\n              }\n            ]\n          },\n          \"headers\": {\n            \"type\": \"json\",\n            \"label\": \"Headers\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the headers to send with the request.\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"logURL\"]\n      }\n    },\n    {\n      \"name\": \"Contains Code\",\n      \"id\": \"containsCode\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the content contains code of format SQL, Python, TypeScript, etc.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"format\": {\n            \"type\": \"string\",\n            \"label\": \"Code Format\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the code format to check for.\"\n              }\n            ],\n            \"enum\": [\n              \"SQL\",\n              \"Python\",\n              \"TypeScript\",\n              \"JavaScript\",\n              \"Java\",\n              \"C#\",\n              \"C++\",\n              \"C\",\n              \"Ruby\",\n              \"PHP\",\n              \"Swift\",\n              \"Kotlin\",\n              \"Go\",\n              \"Rust\",\n              \"Scala\",\n              \"R\",\n              \"Perl\",\n              \"Shell\",\n              \"HTML\",\n              \"CSS\",\n              \"XML\",\n              \"JSON\",\n              \"YAML\",\n              \"Markdown\",\n              \"Dockerfile\"\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Code Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when code is not found\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"format\"]\n      }\n    },\n    {\n      \"name\": \"Uppercase check\",\n      \"id\": \"alluppercase\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if content has all uppercase letters.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Case Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text is not all uppercase\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Ends With\",\n      \"id\": \"endsWith\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the content ends with a specified string.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"suffix\": {\n            \"type\": \"string\",\n            \"label\": \"Suffix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the suffix to check for.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Suffix Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text does not end with suffix\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"suffix\"]\n      }\n    },\n    {\n      \"name\": \"Lowercase check\",\n      \"id\": \"alllowercase\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequest\", \"afterRequest\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if content has all lowercase letters.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Case Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when text is not all lowercase\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Allowed Models\",\n      \"id\": \"modelwhitelist\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Blocks any request whose model isn’t on this list.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"models\": {\n            \"type\": \"array\",\n            \"label\": \"Model list\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the allowed models. e.g. gpt-4o, llama-3-70b, mixtral-8x7b\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Model Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"When on, any model in the list is blocked instead of allowed.\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"models\"]\n      }\n    },\n    {\n      \"name\": \"Model Rules\",\n      \"id\": \"modelRules\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Allow requests based on metadata-driven rules mapping to allowed models.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"rules\": {\n            \"type\": \"object\",\n            \"label\": \"Rules object: {\\\"defaults\\\": [\\\"model\\\"], \\\"metadata\\\": {\\\"key\\\": {\\\"value\\\": [\\\"models\\\"]}}}\",\n            \"description\": [\n              {\n                \"type\": \"text\",\n                \"text\": \"Overrides model list using metadata-based routing.\"\n              }\n            ]\n          },\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Model Check\",\n            \"description\": [\n              {\n                \"type\": \"text\",\n                \"text\": \"When on, any model resolved by rules is blocked instead of allowed.\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"rules\"]\n      }\n    },\n    {\n      \"name\": \"JWT\",\n      \"id\": \"jwt\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Check if the JWT token is valid.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"jwksUri\": {\n            \"type\": \"string\",\n            \"label\": \"JWKS URI\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the JWKS URI of the JWT token.\"\n              }\n            ]\n          },\n          \"headerKey\": {\n            \"type\": \"string\",\n            \"label\": \"Header Key\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the header key to check for the JWT token.\"\n              }\n            ]\n          },\n          \"cacheMaxAge\": {\n            \"type\": \"number\",\n            \"label\": \"Cache Max Age\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the cache max age in seconds.\"\n              }\n            ],\n            \"default\": 86400\n          },\n          \"clockTolerance\": {\n            \"type\": \"number\",\n            \"label\": \"Clock Tolerance\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the clock tolerance in seconds.\"\n              }\n            ],\n            \"default\": 5\n          },\n          \"maxTokenAge\": {\n            \"type\": \"string\",\n            \"label\": \"Max Token Age\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the max token age.\"\n              }\n            ],\n            \"default\": \"1d\"\n          }\n        },\n        \"required\": [\"jwksUri\", \"headerKey\"]\n      }\n    },\n    {\n      \"name\": \"Required Metadata Keys\",\n      \"id\": \"requiredMetadataKeys\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the metadata contains all the required keys\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"metadataKeys\": {\n            \"type\": \"array\",\n            \"label\": \"Metadata Keys\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Enter the metadata keys to check for.\"\n              }\n            ],\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"operator\": {\n            \"type\": \"string\",\n            \"label\": \"Operator\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Select the operator to use.\"\n              }\n            ],\n            \"enum\": [\"all\", \"any\", \"none\"],\n            \"default\": \"all\"\n          }\n        },\n        \"required\": [\"metadataKeys\", \"operator\"]\n      }\n    },\n    {\n      \"name\": \"Add Prefix\",\n      \"id\": \"addPrefix\",\n      \"type\": \"transformer\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Adds a configurable prefix to the user's prompt or messages before sending to the AI model\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prefix\": {\n            \"type\": \"string\",\n            \"label\": \"Prefix Text\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"The text to prepend to the user's prompt or message\"\n              }\n            ],\n            \"default\": \"Please respond helpfully and accurately to the following: \"\n          },\n          \"applyToRole\": {\n            \"type\": \"string\",\n            \"label\": \"Apply to Role\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"For chat completions, which message role to apply the prefix to\"\n              }\n            ],\n            \"enum\": [\"user\", \"system\", \"assistant\"],\n            \"default\": \"user\"\n          },\n          \"addToExisting\": {\n            \"type\": \"boolean\",\n            \"label\": \"Add to Existing Message\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, adds prefix to existing message. If false, creates new message with prefix\"\n              }\n            ],\n            \"default\": true\n          },\n          \"onlyIfEmpty\": {\n            \"type\": \"boolean\",\n            \"label\": \"Only Apply If Role Empty\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Only apply prefix if no message exists for the specified role (useful for system messages)\"\n              }\n            ],\n            \"default\": false\n          }\n        },\n        \"required\": [\"prefix\"]\n      }\n    },\n    {\n      \"name\": \"Not Null\",\n      \"id\": \"notNull\",\n      \"type\": \"guardrail\",\n      \"supportedHooks\": [\"afterRequestHook\"],\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Checks if the response content is not null, undefined, or empty. Useful for detecting when an AI model returns no content.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"not\": {\n            \"type\": \"boolean\",\n            \"label\": \"Invert Check\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"If true, the verdict will be true when content IS null (inverts the check)\"\n              }\n            ],\n            \"default\": false\n          }\n        }\n      }\n    }\n  ]\n}\n\n<!-- File: plugins/exa/manifest.json (Tokens: ~635 | Category: anthropic-skill) -->\n{\n  \"id\": \"exa\",\n  \"description\": \"Exa.ai integration for enhancing AI responses with real-time web search information\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your Exa.ai API key\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Online Search\",\n      \"id\": \"online\",\n      \"supportedHooks\": [\"beforeRequestHook\"],\n      \"type\": \"transformer\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Enhances prompts with relevant web search results from Exa's search API before processing the request\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"prefix\": {\n            \"type\": \"string\",\n            \"label\": \"Context Prefix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"String to prepend to the search context\"\n              }\n            ],\n            \"default\": \"\\n<web_search_context>\"\n          },\n          \"suffix\": {\n            \"type\": \"string\",\n            \"label\": \"Context Suffix\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"String to append to the search context\"\n              }\n            ],\n            \"default\": \"\\n</web_search_context>\"\n          },\n          \"numResults\": {\n            \"type\": \"number\",\n            \"label\": \"Number of Results\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Number of search results to include in the enhanced prompt\"\n              }\n            ],\n            \"default\": 5\n          },\n          \"includeDomains\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"label\": \"Include Domains\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Limit search results to these domains (e.g., ['nytimes.com', 'bbc.com'])\"\n              }\n            ]\n          },\n          \"excludeDomains\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"label\": \"Exclude Domains\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Remove these domains from search results (e.g., ['wikipedia.org', 'reddit.com'])\"\n              }\n            ]\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"label\": \"Timeout\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Timeout for the Exa API call in milliseconds\"\n              }\n            ],\n            \"default\": 10000\n          }\n        },\n        \"required\": []\n      }\n    }\n  ]\n}\n\n<!-- File: plugins/f5-guardrails/manifest.json (Tokens: ~511 | Category: anthropic-skill) -->\n{\n  \"id\": \"f5-guardrails\",\n  \"description\": \"F5 Guardrails Plugin - Partner guardrail powered by F5 Guardrails\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your F5 Guardrails API key for authentication\",\n        \"encrypted\": true\n      },\n      \"calypsoUrl\": {\n        \"type\": \"string\",\n        \"label\": \"F5 Guardrails URL\",\n        \"description\": \"The base URL for F5 Guardrails API. Defaults to https://us1.calypsoai.app\",\n        \"default\": \"https://us1.calypsoai.app\"\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"F5 Guardrails\",\n      \"id\": \"scan\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"F5 Guardrails powered by F5 Guardrails provides advanced content moderation and PII detection capabilities for your LLM inputs and outputs.\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"redact\": {\n            \"type\": \"boolean\",\n            \"label\": \"Redact\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Whether to redact PII data detected by the F5 guardrail. When enabled, detected PII will be masked in the content.\"\n              }\n            ],\n            \"default\": false\n          },\n          \"projectId\": {\n            \"type\": \"string\",\n            \"label\": \"Project-Id\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Your F5 Guardrails project identifier\"\n              }\n            ]\n          },\n          \"timeout\": {\n            \"type\": \"number\",\n            \"label\": \"Timeout\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"The timeout in milliseconds for the F5 guardrail scan. Defaults to 5000.\"\n              }\n            ],\n            \"default\": 5000\n          }\n        }\n      },\n      \"required\": [\"projectId\"]\n    }\n  ]\n}\n\n<!-- File: plugins/javelin/manifest.json (Tokens: ~396 | Category: anthropic-skill) -->\n{\n  \"id\": \"javelin\",\n  \"description\": \"Javelin's AI security platform provides comprehensive guardrails for trust & safety, prompt injection detection, and language detection. Applies all enabled guardrails configured in your Javelin application policy.\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Your Javelin API key for authentication\"\n          }\n        ]\n      },\n      \"domain\": {\n        \"type\": \"string\",\n        \"label\": \"Domain\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Javelin API domain\"\n          }\n        ],\n        \"default\": \"api-dev.javelin.live\",\n        \"required\": false\n      },\n      \"application\": {\n        \"type\": \"string\",\n        \"label\": \"Application Name\",\n        \"description\": [\n          {\n            \"type\": \"subHeading\",\n            \"text\": \"Application name for policy-specific guardrails (required)\"\n          }\n        ],\n        \"required\": true\n      }\n    },\n    \"required\": [\"apiKey\", \"application\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Javelin Guardrails\",\n      \"id\": \"guardrails\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Auto-applies all enabled guardrails in your Javelin application policy including trust & safety, prompt injection detection, language detection, and more\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {}\n      }\n    }\n  ]\n}\n\n<!-- File: plugins/lasso/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Lasso Skill\n\nPath: `plugins/lasso/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/manifest.json)\n\n<!-- File: plugins/mistral/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Mistral Skill\n\nPath: `plugins/mistral/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/mistral/manifest.json)\n\n<!-- File: plugins/pangea/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Pangea Skill\n\nPath: `plugins/pangea/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pangea/manifest.json)\n\n<!-- File: plugins/panw-prisma-airs/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Panw-prisma-airs Skill\n\nPath: `plugins/panw-prisma-airs/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/panw-prisma-airs/manifest.json)\n\n<!-- File: plugins/patronus/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Patronus Skill\n\nPath: `plugins/patronus/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/patronus/manifest.json)\n\n<!-- File: plugins/pillar/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Pillar Skill\n\nPath: `plugins/pillar/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/pillar/manifest.json)\n\n<!-- File: plugins/portkey/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Portkey Skill\n\nPath: `plugins/portkey/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/portkey/manifest.json)\n\n<!-- File: plugins/promptfoo/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Promptfoo Skill\n\nPath: `plugins/promptfoo/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptfoo/manifest.json)\n\n<!-- File: plugins/promptsecurity/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Promptsecurity Skill\n\nPath: `plugins/promptsecurity/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/promptsecurity/manifest.json)\n\n<!-- File: plugins/qualifire/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Qualifire Skill\n\nPath: `plugins/qualifire/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/qualifire/manifest.json)\n\n<!-- File: plugins/sydelabs/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Sydelabs Skill\n\nPath: `plugins/sydelabs/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/sydelabs/manifest.json)\n\n<!-- File: plugins/walledai/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Walledai Skill\n\nPath: `plugins/walledai/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/walledai/manifest.json)\n\n<!-- File: CLAUDE.md (Tokens: ~841 | Category: claude-rule) -->\n# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nThis is the **Portkey AI Gateway** - a fast, reliable AI gateway that routes requests to 250+ LLMs with sub-1ms latency. It's built with Hono framework for TypeScript/JavaScript and can be deployed to multiple environments including Cloudflare Workers, Node.js servers, and Docker containers.\n\n## Development Commands\n\n### Core Development\n- `npm run dev` - Start development server using Wrangler (Cloudflare Workers)\n- `npm run dev:node` - Start development server using Node.js\n- `npm run build` - Build the project for production\n- `npm run build-plugins` - Build the plugin system\n\n### Testing\n- `npm run test:gateway` - Run tests for the main gateway code (src/)\n- `npm run test:plugins` - Run tests for plugins\n- `jest src/` - Run specific gateway tests\n- `jest plugins/` - Run specific plugin tests\n\n### Code Quality\n- `npm run format` - Format code with Prettier\n- `npm run format:check` - Check code formatting\n- `npm run pretty` - Alternative format command\n\n### Deployment\n- `npm run deploy` - Deploy to Cloudflare Workers\n- `npm run start:node` - Start production Node.js server\n\n## Architecture\n\n### Core Components\n\n**Main Application (`src/index.ts`)**\n- Hono-based HTTP server with middleware pipeline\n- Handles multiple AI provider integrations\n- Routes: `/v1/chat/completions`, `/v1/completions`, `/v1/embeddings`, etc.\n\n**Provider System (`src/providers/`)**\n- Modular provider implementations (OpenAI, Anthropic, Azure, etc.)\n- Each provider has standardized interface: `api.ts`, `chatComplete.ts`, `embed.ts`\n- Provider configs define supported features and transformations\n\n**Middleware Pipeline**\n- `requestValidator` - Validates incoming requests\n- `hooks` - Pre/post request hooks\n- `memoryCache` - Response caching\n- `logger` - Request/response logging\n- `adminAuth` - Node-only local UI session auth for `/public/*` login endpoints and `/log/stream`\n- `portkey` - Core Portkey-specific middleware for routing, guardrails, etc.\n\n**Plugin System (`plugins/`)**\n- Guardrail plugins for content filtering, PII detection, etc.\n- Each plugin has `manifest.json` defining capabilities\n- Plugins are built separately with `npm run build-plugins`\n\n### Key Concepts\n\n**Configs** - JSON configurations that define:\n- Provider routing and fallbacks\n- Load balancing strategies\n- Guardrails and content filtering\n- Caching and retry policies\n\n**Handlers** - Route-specific request processors in `src/handlers/`\n- Each AI API endpoint has dedicated handler\n- Stream handling for real-time responses\n- WebSocket support for realtime APIs\n\n## File Structure\n\n- `src/providers/` - AI provider integrations\n- `src/handlers/` - API endpoint handlers\n- `src/middlewares/` - Request/response middleware\n- `plugins/` - Guardrail and validation plugins\n- `cookbook/` - Example integrations and use cases\n- `conf.json` - Runtime configuration\n\n## Testing Strategy\n\nTests are organized by component:\n- `src/tests/` - Core gateway functionality tests\n- `src/handlers/__tests__/` - Handler-specific tests\n- `plugins/*/**.test.ts` - Plugin tests\n- Test timeout: 30 seconds (configured in jest.config.js)\n\n## Configuration\n\nThe gateway uses `conf.json` for runtime configuration. Sample config available in `conf_sample.json`.\n\nFor local UI hardening, set `admin_token` in `conf.json`. The `/public` UI uses this token to establish an in-memory admin session, and `/log/stream` requires that session.\n\nKey environment variables and configuration handled through Hono's adapter system for multi-environment deployment.\n\n<!-- File: plugins/lasso/README.md (Tokens: ~300 | Category: plugin-manifest) -->\n# lasso Documentation\n\nPath: `plugins/lasso/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/Portkey-AI/gateway/HEAD/plugins/lasso/README.md)\n\n<!-- File: plugins/README.md (Tokens: ~1697 | Category: plugin-manifest) -->\n# Portkey Gateway Plugins\n\n## Table of Contents\n- [Portkey Gateway Plugins](#portkey-gateway-plugins)\n  - [Table of Contents](#table-of-contents)\n  - [Introduction](#introduction)\n  - [What are Plugins?](#what-are-plugins)\n  - [Why are Plugins Important?](#why-are-plugins-important)\n  - [Concepts](#concepts)\n    - [Hooks](#hooks)\n    - [Guardrails](#guardrails)\n    - [Checks](#checks)\n  - [Creating a Plugin](#creating-a-plugin)\n    - [Folder Structure](#folder-structure)\n    - [Manifest File](#manifest-file)\n    - [Plugin Function](#plugin-function)\n  - [Building Plugins into Your Gateway](#building-plugins-into-your-gateway)\n  - [Using Plugins](#using-plugins)\n  - [Testing Plugins](#testing-plugins)\n\n## Introduction\n\nThis folder contains plugins for the Portkey Gateway. Plugins allow developers to extend the capabilities of the Gateway by adding custom functionality at various stages of the request lifecycle. Currently, the primary type of plugins supported in the AI gateway are guardrails.\n\n## What are Plugins?\n\nPlugins in Portkey enable developers to extend the capabilities of the AI gateway by writing their own functionality. Portkey exposes the concept of hooks, which allows developers to execute custom functions at key points in the request journey. While the plugin system is designed to be extensible, the current focus is on implementing guardrails.\n\n## Why are Plugins Important?\n\nPlugins are crucial for several reasons:\n\n1. **Customization**: They allow you to tailor the Gateway's behavior to your specific needs, especially in terms of implementing guardrails.\n2. **Extensibility**: You can add new features and integrations without modifying the core Gateway code.\n3. **Modularity**: Plugins can be easily added, removed, or updated without affecting other parts of the system.\n4. **Community Contributions**: The plugin system allows the community to contribute and share useful extensions, particularly for guardrail implementations.\n\n## Concepts\n\n### Hooks\n\nHooks in Portkey's AI gateway allow custom functions to be executed at various stages of the request lifecycle. Currently, four types of hooks are supported:\n\n1. **Start**: Executed at the beginning of the request lifecycle for initial setup and logging.\n2. **BeforeRequest**: Executed before the request is sent to the AI model, typically used for implementing guardrails.\n3. **AfterRequest**: Executed after the AI model processes the request but before the response is returned, used for post-processing and validations.\n4. **End**: Executed at the end of the request lifecycle for final logging and cleanup.\n\nWhile hooks can be extended for custom logging solutions and other custom functionalities, their primary intended purpose is to set up and enforce guardrails.\n\n### Guardrails\n\nGuardrails in Portkey's AI gateway are a set of checks that are run together within the `beforeRequest` or `afterRequest` hooks to determine a `verdict`. The verdict of a guardrail dictates the actions to be taken on the request or response. For example, if the guardrail fails, the request can be failed, or the response can be returned with a 246 status code indicating that the guardrails failed.\n\nGuardrails can be defined either through the user interface (UI) of Portkey or as a JSON configuration within the Portkey `config`. This flexibility allows for easy management and customization of guardrails according to the specific needs of the application.\n\n### Checks\n\nA check is an individual function that assesses the input prompt or output response against predefined conditions. Each check returns a boolean verdict or may error out if issues are encountered. Checks are the building blocks of guardrails, and Portkey includes a set of predefined checks as well as the ability to add custom checks.\n\n## Creating a Plugin\n\nWhen creating a plugin for Portkey, keep in mind that it should primarily focus on implementing guardrails. Here's how to structure your plugin:\n\n### Folder Structure\n\nTo create a plugin, follow this structure in the `/plugins` folder:\n\n```\n/plugins\n  /your-plugin-name\n    - manifest.json\n    - main-function.ts\n    - test-file.test.ts (recommended)\n```\n\n### Manifest File\n\nThe `manifest.json` file defines the plugin's properties, required credentials, and available functions. Here's an example structure:\n\n```json\n{\n  \"id\": \"your-plugin-id\",\n  \"description\": \"A brief description of your guardrail plugin\",\n  \"credentials\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"apiKey\": {\n        \"type\": \"string\",\n        \"label\": \"API Key\",\n        \"description\": \"Your API key description\",\n        \"encrypted\": true\n      }\n    },\n    \"required\": [\"apiKey\"]\n  },\n  \"functions\": [\n    {\n      \"name\": \"Your Guardrail Function\",\n      \"id\": \"yourGuardrailId\",\n      \"supportedHooks\": [\"beforeRequestHook\", \"afterRequestHook\"],\n      \"type\": \"guardrail\",\n      \"description\": [\n        {\n          \"type\": \"subHeading\",\n          \"text\": \"Description of your guardrail function\"\n        }\n      ],\n      \"parameters\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"paramName\": {\n            \"type\": \"string\",\n            \"label\": \"Parameter Label\",\n            \"description\": [\n              {\n                \"type\": \"subHeading\",\n                \"text\": \"Description of the parameter\"\n              }\n            ]\n          }\n        },\n        \"required\": [\"paramName\"]\n      }\n    }\n  ]\n}\n```\n\n### Plugin Function\n\nCreate a TypeScript file (e.g., `main-function.ts`) that exports a handler function. This function will implement your guardrail logic. Here's a basic structure:\n\n```typescript\nimport { HookEventType, PluginContext, PluginHandler, PluginParameters } from '../types';\n\nexport const handler: PluginHandler = async (\n  context: PluginContext,\n  parameters: PluginParameters,\n  eventType: HookEventType\n) => {\n  // Your guardrail logic here\n  // You can access:\n  // - context.request for request data\n  // - context.response for response data (in afterRequestHook)\n  // - parameters for plugin-specific parameters\n  // - eventType to determine which hook is being executed\n\n  return {\n    error: null, // or error object if an error occurred\n    verdict: true, // or false to indicate if the guardrail passed or failed\n    data: {} // any additional data you want to return\n  };\n};\n```\n\n## Building Plugins into Your Gateway\n\nTo build plugins into your Gateway, follow these steps:\n\n1. In the root directory of the Gateway repository, locate the `conf.json` file.\n2. Edit the `conf.json` file to specify which plugins you want to enable and provide any necessary credentials. Here's an example:\n\n```json\n{\n  \"plugins_enabled\": [\"default\", \"your-guardrail-plugin\"],\n  \"credentials\": {\n    \"your-guardrail-plugin\": {\n      \"apiKey\": \"your-api-key-here\"\n    }\n  },\n  \"cache\": false\n}\n```\n\n3. Run the build command to compile the plugins:\n\n```\nnpm run build-plugins\n```\n\nThis command will compile the plugins and prepare them for use with the Gateway.\n\n## Using Plugins\n\nOnce you've built the plugins, they will be automatically deployed with the Gateway when you run it. You can start the Gateway using one of the following commands:\n\n- For development:\n  ```\n  npm run dev\n  ```\n- For Node.js:\n  ```\n  npm run dev:node\n  ```\n- For Cloudflare Workers:\n  ```\n  npm run dev:workerd\n  ```\n\nThe guardrail plugins you've enabled in the `conf.json` file will be loaded and ready to use.\n\n## Testing Plugins\n\nTo test your guardrail plugins:\n\n1. Ensure you have written test files for your plugins (e.g., `test-file.test.ts`).\n2. Run the test command:\n\n```\nnpx jest\n```\n\nThis command will execute the test files in the plugins repository, allowing you to verify that your guardrail plugins are functioning correctly.\n</yakaai_skills>"}