Custom provider implementations for Llama Stack that extend the capabilities of AI applications with specialized safety and content filtering features.
This repository contains custom providers for Llama Stack, including:
- Question Validity Shield: Ensures queries are related to OpenShift/Ansible topics (It can be Configured for other Platforms).
- Redaction Shield: Automatically detects and redacts sensitive information from user messages
- Additional safety and content filtering providers
Manual procedure, assuming an existing PyPI API token available:
## Generate distribution archives to be uploaded into Python registry
pdm run python -m build
## Upload distribution archives into Python registry
pdm run python -m twine upload --repository ${PYTHON_REGISTRY} dist/*
- Pattern-based redaction: YAML-configurable regex patterns for flexible content filtering
- Automatic detection: Detects credit card numbers, API keys, tokens, passwords, and custom patterns
- Topic validation: Ensures queries are related to specified topics (OpenShift/Ansible) (It can be configured for other Platforms)
- LLM-powered classification: Uses AI to determine query relevance
- Customizable responses: Configure custom messages for invalid queries
- Python >= 3.12
- Llama Stack == 0.2.22
- pydantic >= 2.10.6
- 
Clone the repository git clone https://github.com/lightspeed-core/lightspeed-providers.git cd lightspeed-providers
- 
Install dependencies pip install -e .
- 
Install Llama Stack (if not already installed) pip install llama-stack 
- Install the Python package
pip install lightspeed_stack_providers 
- Configure your run.yaml (see Configuration section below)
Add to your run.yaml file:
# External providers configuration
external_providers_dir: ${env.EXTERNAL_PROVIDERS_DIR:/providers.d}
# Changes in the providers
providers:
  safety:
  - provider_id: llama-guard
    provider_type: inline::llama-guard
    config:
      excluded_categories: []
# For Redaction shields
  - provider_id: lightspeed_redaction
    provider_type: inline::lightspeed_redaction
    config:
        case_sensitive: false
        rules:
          - pattern: "(?i)(password|passwd)[\\s:=]+[^\\s]+"
            replacement: "[REDACTED_PASSWORD]"
          
          - pattern: "(?i)(registry|image):\\s*([\\w\\d\\.-]+)(:[\\w\\d\\.-]+)?"
            replacement: "\\1: [REDACTED_IMAGE]"
          
          - pattern: "(?i)(url|endpoint):\\s*https?://[\\w\\.-]+(:\\d+)?(/[\\w\\d\\.-]*)*"
            replacement: "\\1: [REDACTED_URL]"
        
          - pattern: "\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b"
            replacement: "[REDACTED_IP]"
        
          - pattern: "(?i)(api_key|secret)[\\s:=]+[a-zA-Z0-9\\-_]{16,}"
            replacement: "[REDACTED_SECRET]"
          
          - pattern: "(?i)(ssh-rsa|ssh-ed25519)\\s+[A-Za-z0-9+/=]+"
            replacement: "[REDACTED_SSH_KEY]"
# for question validity 
  - provider_id: lightspeed_question_validity
    provider_type: inline::lightspeed_question_validity
    config:
      model_id: ${env.INFERENCE_MODEL}
      model_prompt: |-
        Instructions:
        - You are a question classifying tool
        - You are an expert in ansible
        - Your job is to determine where or a user's question is related to ansible technologies and to provide a one-word response
        - If a question appears to be related to ansible technologies, answer with the word ${allowed}, otherwise answer with the word ${rejected}
        - Do not explain your answer, just provide the one-word response
        Example Question:
        Why is the sky blue?
        Example Response:
        ${rejected}
        Example Question:
        Can you help generate an ansible playbook to install an ansible collection?
        Example Response:
        ${allowed}
        Example Question:
        Can you help write an ansible role to install an ansible collection?
        Example Response:
        ${allowed}
        Question:
        ${message}
        Response:
        invalid_question_response: |-
        Hi, I'm the Ansible Lightspeed Intelligent Assistant, I can help you with questions about Ansible,
        please ask me a question related to Ansible.
# changes in the agents : 
shields:
  - shield_id: lightspeed_question_validity-shield
    provider_id: lightspeed_question_validity
  - shield_id: redaction-shield
    provider_id: lightspeed_redaction
    provider_shield_id: lightspeed-redaction-shield# Test the redaction shield
curl -X POST "http://localhost:8321/v1/safety/run_shield" \
  -H "Content-Type: application/json" \
  -d '{
    "shield_id": "redaction-shield",
    "messages": [
      {
        "role": "user", 
        "content": "My API key is abc123xyz and password is secret456"
      }
    ]
  }'- Create provider directory
mkdir -p ./providers.d/inline/safety/ mkdir -p ./providers.d/remote/tool_runtime/ curl -o ./providers.d/inline/safety/lightspeed_question_validity.yaml https://raw.githubusercontent.com/lightspeed-core/lightspeed- providers/refs/heads/main/resources/external_providers/inline/safety/lightspeed_question_validity.yaml curl -o ./providers.d/inline/safety/lightspeed_question_validity.yaml https://raw.githubusercontent.com/lightspeed-core/lightspeed- providers/refs/heads/main/resources/external_providers/inline/safety/lightspeed_redaction.yaml curl -o ./providers.d/remote/tool_runtime/lightspeed.yaml https://raw.githubusercontent.com/lightspeed-core/lightspeed-providers/refs/heads/main/resources/external_providers/remote/tool_runtime/lightspeed.yaml 
- Add external provider definition
# resources/external_providers/your_provider.yaml module: lightspeed_stack_providers.providers.inline.safety.your_provider config_class: lightspeed_stack_providers.providers.inline.safety.your_provider.config.YourProviderConfig pip_packages: ["lightspeed_stack_providers"] api_dependencies: - safety 
- Fork the repository
- Create a feature branch (git checkout -b feature/amazing-feature)
- Commit your changes (git commit -m 'Add amazing feature')
- Push to the branch (git push origin feature/amazing-feature)
- Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.