Skip to main content

End-to-end testing harness for AI agents via web service API

Project description

ReplicantX

Python 3.11+ License

ReplicantX is an end-to-end testing harness for AI agents that communicates via web service APIs. It enables you to run comprehensive test scenarios against live HTTP APIs with support for multiple authentication methods and detailed reporting.

โœจ Features

  • Two Test Levels:
    • Level 1 (Basic): Fixed user messages with deterministic assertions
    • Level 2 (Agent): Intelligent Replicant agent with configurable facts and conversation goals
  • Pydantic-Based Replicant Agent: Smart conversational agent that acts like a real user
  • Configurable Facts & Behavior: Agents can have knowledge (Name, Preferences) and custom personalities
  • Real-time Monitoring: Watch mode (--watch) for live conversation monitoring
  • Technical Debugging: Debug mode (--debug) with detailed HTTP, validation, and AI processing logs
  • Multiple Authentication: Supabase email+password, custom JWT, or no-auth
  • CLI Interface: Easy-to-use command-line interface with replicantx run
  • Automatic .env Loading: No manual environment variable sourcing required
  • GitHub Actions Ready: Built-in workflow for PR testing with Render preview URLs
  • Rich Reporting: Markdown and JSON reports with timing and assertion results
  • Retry & Backoff: Robust HTTP client with automatic retry logic

๐Ÿš€ Quick Start

Installation

pip install replicantx[cli]

Basic Usage

  1. Create a test scenario YAML file:

Basic Scenario (Level 1):

# tests/basic_test.yaml
name: "Test AI Agent Conversation"
base_url: https://your-api.com/api/chat
auth:
  provider: noop  # or supabase, jwt
level: basic
steps:
  - user: "Hello, I need help with booking a flight"
    expect_contains: ["flight", "booking"]
  - user: "I want to go to Paris"
    expect_regex: "(?i)paris.*available"

Agent Scenario (Level 2):

Generic Customer Support Example:

# tests/support_test.yaml
name: "Customer Support - Account Issue"
base_url: https://your-api.com/api/support
auth:
  provider: noop
level: agent
replicant:
  goal: "Get help with account access issue"
  facts:
    name: "Alex Chen"
    email: "alex.chen@example.com"
    account_id: "ACC-123456"
    issue_type: "login_problem"
    last_login: "2 weeks ago"
  system_prompt: |
    You are a customer seeking help with an account issue. You have the 
    necessary information but don't provide all details upfront.
    Answer questions based on your available facts.
  initial_message: "Hi, I'm having trouble accessing my account."
  max_turns: 12
  completion_keywords: ["resolved", "ticket created", "issue fixed"]

Travel Booking Example:

# tests/travel_test.yaml
name: "Travel Booking - Flight Reservation"
base_url: https://your-api.com/api/chat
auth:
  provider: noop
level: agent
replicant:
  goal: "Book a business class flight to Paris"
  facts:
    name: "Sarah Johnson"
    email: "sarah@example.com"
    travel_class: "business"
    destination: "Paris"
    budget: "$2000"
  system_prompt: |
    You are a customer trying to book a flight. You have the 
    necessary information but don't provide all details upfront.
    Answer questions based on your available facts.
  initial_message: "Hi, I'd like to book a flight to Paris."
  max_turns: 15
  completion_keywords: ["booked", "confirmed", "reservation number"]
  1. Run the test:
replicantx run tests/my_test.yaml --report report.md
  1. View the generated report in report.md

๐Ÿ” Environment Variables & Configuration

ReplicantX automatically detects environment variables from your system, .env files, and CI/CD environments. No special configuration needed when installed as a dependency!

โœ… Automatic Detection

When you install ReplicantX in your project:

# Your project setup
pip install replicantx[cli]

# Your environment variables (any of these methods work)
export OPENAI_API_KEY=sk-your-key          # Shell environment
echo "OPENAI_API_KEY=sk-key" > .env        # .env file
# OR set in your CI/CD platform

# ReplicantX automatically finds them!
replicantx run tests/*.yaml

๐Ÿš€ Quick Setup

Essential variables for different use cases:

# LLM Integration (PydanticAI auto-detects these)
export OPENAI_API_KEY=sk-your-openai-key
export ANTHROPIC_API_KEY=sk-ant-your-anthropic-key

# Supabase Authentication
export SUPABASE_URL=https://your-project.supabase.co
export SUPABASE_ANON_KEY=your-supabase-anon-key

# Target API Configuration
export REPLICANTX_TARGET=your-api-domain.com

# Custom Authentication
export JWT_TOKEN=your-jwt-token
export MY_API_KEY=your-custom-api-key

๐Ÿ”„ Works Everywhere

Local Development:

# Create .env file (ReplicantX automatically loads it!)
cat > .env << 'EOF'
OPENAI_API_KEY=sk-dev-key
REPLICANTX_TARGET=dev-api.example.com
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-supabase-key
EOF

# Just run tests - no need to source .env!
replicantx run tests/*.yaml

# Or export manually (old way still works)
export OPENAI_API_KEY=sk-dev-key
replicantx run tests/*.yaml

GitHub Actions (No .env files needed!):

# .github/workflows/test-api.yml
jobs:
  test:
    runs-on: ubuntu-latest
    env:
      # GitHub Secrets โ†’ Environment Variables
      OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
      REPLICANTX_TARGET: ${{ secrets.API_TARGET_URL }}
    steps:
      - run: pip install replicantx[cli]
      - run: replicantx run tests/*.yaml --ci
      # ReplicantX automatically finds the variables!

๐Ÿ“ Using in YAML Files

Reference variables with {{ env.VARIABLE_NAME }} syntax:

name: "API Test"
base_url: "https://{{ env.REPLICANTX_TARGET }}/api/chat"
auth:
  provider: supabase
  project_url: "{{ env.SUPABASE_URL }}"
  api_key: "{{ env.SUPABASE_ANON_KEY }}"
level: agent
replicant:
  facts:
    api_key: "{{ env.MY_API_KEY }}"
  llm:
    model: "openai:gpt-4o"  # Uses OPENAI_API_KEY automatically

๐ŸŽฏ GitHub Secrets Setup

  1. Go to Repository Settings โ†’ Secrets and Variables โ†’ Actions

  2. Add secrets:

    • OPENAI_API_KEY = sk-your-openai-key
    • SUPABASE_URL = https://your-project.supabase.co
    • SUPABASE_ANON_KEY = your-supabase-key
    • REPLICANTX_TARGET = api.yourproject.com
  3. Use in workflow:

    env:
      OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
      REPLICANTX_TARGET: ${{ secrets.REPLICANTX_TARGET }}
    

๐Ÿ’ก Key Benefits:

  • โœ… Automatic .env loading - Just create a .env file and run tests
  • โœ… Zero configuration - ReplicantX finds variables automatically
  • โœ… Works everywhere - local, CI/CD, Docker, cloud platforms
  • โœ… Secure by default - no hardcoded secrets in code
  • โœ… Standard patterns - uses industry-standard environment variable detection

Note: Create a .env.example file in your project to document which variables are needed. See our comprehensive environment variable guide in the LLM Integration section.

๐ŸŽฏ Automatic .env File Loading

ReplicantX automatically loads environment variables from .env files using python-dotenv. No manual sourcing required!

๐Ÿ“ Create .env File

# Create .env file in your project root
cat > .env << 'EOF'
# LLM API Keys
OPENAI_API_KEY=sk-your-openai-key
ANTHROPIC_API_KEY=sk-ant-your-anthropic-key

# Target API
REPLICANTX_TARGET=https://api.yourproject.com

# Supabase Authentication
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-supabase-anon-key
TEST_USER_EMAIL=test@example.com
TEST_USER_PASSWORD=testpassword123

# JWT Authentication
JWT_TOKEN=your-jwt-token
EOF

๐Ÿš€ Run Tests Directly

# Just run - ReplicantX finds .env automatically!
replicantx run tests/*.yaml

# Validate test files
replicantx validate tests/*.yaml

# Generate reports
replicantx run tests/*.yaml --report report.md

๐Ÿ” How It Works

  1. Automatic Discovery: ReplicantX looks for .env files in current directory and parent directories
  2. Non-intrusive: If no .env file exists, it continues normally
  3. Environment Priority: Existing environment variables take precedence over .env values
  4. Secure: .env files should be added to .gitignore to avoid committing secrets

๐Ÿ›ก๏ธ Security Best Practices

# Add .env to .gitignore
echo ".env" >> .gitignore

# Create .env.example for documentation
cat > .env.example << 'EOF'
# Copy this file to .env and fill in your values
OPENAI_API_KEY=sk-your-openai-key-here
REPLICANTX_TARGET=https://your-api-domain.com
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-supabase-anon-key-here
EOF

โœ… No more manual environment variable management!

๐Ÿ“– Documentation

Test Scenario Configuration

Basic Scenarios (Level 1)

Basic scenarios use fixed user messages with deterministic assertions:

name: "Basic Test Scenario"
base_url: "https://api.example.com/chat"
auth:
  provider: noop
level: basic
steps:
  - user: "User message"
    expect_contains: ["expected", "text"]
    expect_regex: "regex_pattern"
    expect_equals: "exact_match"
    expect_not_contains: ["forbidden", "text"]

Agent Scenarios (Level 2)

Agent scenarios use intelligent Replicant agents that converse naturally:

name: "Agent Test Scenario"
base_url: "https://api.example.com/chat"
auth:
  provider: supabase
  email: test@example.com
  password: password123
  project_url: "{{ env.SUPABASE_URL }}"
  api_key: "{{ env.SUPABASE_ANON_KEY }}"
level: agent
validate_politeness: false  # Optional: validate conversational tone (default: false)
replicant:
  goal: "Description of what the agent should achieve"
  facts:
    name: "User Name"
    email: "user@example.com"
    # Add any facts the agent should know
  system_prompt: |
    Customize the agent's personality and behavior.
    This prompt defines how the agent should act.
  initial_message: "Starting message for the conversation"
  max_turns: 20
  completion_keywords: 
    - "success"
    - "completed"
    - "finished"
  fullconversation: true  # Send full conversation history with each request

Politeness Validation

By default, ReplicantX focuses on functional API validation. However, you can optionally enable politeness/conversational tone validation:

# Disable politeness validation (default) - focuses on functional responses
validate_politeness: false

# Enable politeness validation - also checks for conversational tone
validate_politeness: true

When to use politeness validation:

  • โœ… Customer-facing APIs where tone matters
  • โœ… Chatbots and conversational AI services
  • โœ… User experience testing scenarios

When to skip politeness validation:

  • โŒ Internal APIs focused on functionality
  • โŒ Data APIs returning structured responses
  • โŒ Technical integrations where tone is irrelevant

Note: Politeness validation is subjective and based on common conversational patterns. It looks for polite phrases like "please", "thank you", "how can I help", question patterns, and helpful language.

CLI Commands

# Run all tests in a directory
replicantx run tests/*.yaml --report report.md

# Run with CI mode (exits 1 on failure)
replicantx run tests/*.yaml --report report.md --ci

# Run specific test file
replicantx run tests/specific_test.yaml

# Real-time conversation monitoring
replicantx run tests/*.yaml --watch

# Technical debugging with detailed logs
replicantx run tests/*.yaml --debug

# Combined monitoring and debugging
replicantx run tests/*.yaml --debug --watch

# Validate test files without running
replicantx validate tests/*.yaml --verbose

๐Ÿ“Š Real-time Monitoring & Debugging

ReplicantX provides comprehensive monitoring and debugging capabilities to help you understand what's happening during test execution.

๐Ÿ” Watch Mode (--watch)

Real-time conversation monitoring for observing test execution as it happens:

replicantx run tests/agent_test.yaml --watch

What you see:

  • ๐Ÿ‘ฅ Live conversation setup with goal and facts
  • ๐Ÿ‘ค Replicant messages as they're sent (with timestamps)
  • โฑ๏ธ Response waiting indicators
  • ๐Ÿค– Agent responses as received
  • โœ…/โŒ Step results with pass/fail status and timing
  • ๐Ÿ“Š Final summary with success rate, duration, goal achievement

Perfect for:

  • โœ… Live demos - Show clients real AI conversations
  • โœ… Test monitoring - Watch long-running tests progress
  • โœ… User experience validation - See conversation flow
  • โœ… Performance monitoring - Track response times

Example Output:

[22:04:42] ๐Ÿ‘ฅ LIVE CONVERSATION - Starting agent scenario
[22:04:42] ๐ŸŽฏ Goal: Book a business class flight to Paris
[22:04:42] ๐Ÿ‘ค Replicant: Hi, I'd like to book a flight to Paris.
[22:04:52] โœ… Step 1: PASSED (10.2s)
[22:04:52] ๐Ÿค– Agent: What cabin class would you prefer?
[22:04:53] ๐Ÿ‘ค Replicant: Business class, please.
[22:05:03] โœ… Step 2: PASSED (9.8s)

๐Ÿ”ง Debug Mode (--debug)

Technical deep-dive with detailed system information:

replicantx run tests/agent_test.yaml --debug

What you see:

  • ๐Ÿ” HTTP client setup (URL, timeout, auth provider, headers)
  • ๐Ÿ” Replicant agent initialization (goal, facts, AI model settings)
  • ๐Ÿ” HTTP requests (payload details, conversation history)
  • ๐Ÿ” API responses (status codes, latency, content preview)
  • ๐Ÿ” Response validation (assertion counts, individual results)
  • ๐Ÿ” AI processing (response parsing, message generation)

Perfect for:

  • ๐Ÿ” Troubleshooting - Diagnose failed assertions
  • ๐Ÿ” Performance tuning - Analyze HTTP latency and bottlenecks
  • ๐Ÿ” Integration debugging - Check payload formats and API calls
  • ๐Ÿ” AI behavior analysis - Understand PydanticAI decision making

Example Output:

๐Ÿ” DEBUG HTTP Client initialized
   โ”œโ”€ base_url: https://api.example.com/chat
   โ”œโ”€ timeout: 120s
   โ”œโ”€ auth_provider: supabase
   โ”œโ”€ auth_headers: 2 headers

๐Ÿ” DEBUG HTTP request payload
   โ”œโ”€ message: Hi, I'd like to book a flight to Paris.
   โ”œโ”€ conversation_history_length: 1
   โ”œโ”€ payload_size: 229 chars

๐Ÿ” DEBUG Response validation completed
   โ”œโ”€ total_assertions: 2
   โ”œโ”€ passed_assertions: 2
   โ”œโ”€ overall_passed: True

๐ŸŽฏ Combined Mode (--debug --watch)

Get both real-time conversation flow and technical details:

replicantx run tests/agent_test.yaml --debug --watch

Perfect for:

  • ๐ŸŽฏ Development - Full visibility during feature building
  • ๐ŸŽฏ Complex debugging - When you need everything
  • ๐ŸŽฏ Training - Teaching others how the system works
  • ๐ŸŽฏ Comprehensive analysis - Complete test execution insight

๐Ÿ’ก Monitoring Tips

For Long-running Tests:

# Watch progress while generating a report
replicantx run tests/*.yaml --watch --report detailed.md

For CI/CD Debugging:

# Debug mode with CI exit codes
replicantx run tests/*.yaml --debug --ci

For Performance Analysis:

# Combined with verbose output
replicantx run tests/*.yaml --debug --verbose --report performance.json

Authentication Providers

Supabase

auth:
  provider: supabase
  email: user@example.com
  password: password123
  project_url: "{{ env.SUPABASE_URL }}"
  api_key: "{{ env.SUPABASE_ANON_KEY }}"

JWT

auth:
  provider: jwt
  token: "{{ env.JWT_TOKEN }}"

No Authentication

auth:
  provider: noop

๐Ÿค– Replicant Agent System

The Replicant agent is a Pydantic-based intelligent conversational agent that:

Key Features

  • Fact-Based Responses: Uses configured facts to answer API questions intelligently
  • Natural Conversation: Acts like a real user who doesn't provide all information upfront
  • Customizable Behavior: System prompts allow different personalities and response patterns
  • Goal-Oriented: Works toward specific objectives with completion detection
  • Context Awareness: Maintains conversation history and state

LLM-Powered Fact Usage

The agent intelligently uses configured facts through LLM integration:

  • Context-aware: LLMs understand when facts are relevant to questions
  • Natural integration: Facts are woven naturally into conversation responses
  • Smart timing: Agent knows when to volunteer information vs. wait to be asked
  • Conversation memory: Recent chat history provides context for fact usage

Conversation State Management

ReplicantX provides flexible conversation state management to handle different API architectures:

Full Conversation History (fullconversation: true)

Sends the complete conversation history (including all responses) with each request:

replicant:
  fullconversation: true  # Default behavior

Benefits:

  • โœ… Complete Context: API receives full conversation state
  • โœ… Stateless APIs: Works with APIs that don't maintain session state
  • โœ… Microservices: Suitable for distributed systems
  • โœ… Testing Realism: Mimics real-world stateless interactions

Limited History (fullconversation: false)

Sends only the last 10 messages for performance:

replicant:
  fullconversation: false

Use Cases:

  • ๐Ÿ”ง Performance Testing: Reduce payload size for high-volume testing
  • ๐Ÿ”ง Legacy APIs: Compatible with APIs expecting limited context
  • ๐Ÿ”ง Memory Constraints: When API has payload size limitations

API Payload Format Configuration

ReplicantX supports multiple API payload formats for maximum compatibility with any conversational API:

OpenAI Format (payload_format: openai) - Default

Industry-standard OpenAI chat completion format:

replicant:
  payload_format: openai  # Default behavior

Payload Structure:

{
  "messages": [
    {"role": "user", "content": "Hello"},
    {"role": "assistant", "content": "Hi there!"},
    {"role": "user", "content": "How are you?"}
  ]
}

Best For:

  • โœ… OpenAI APIs and compatible services
  • โœ… Industry standard - widely supported
  • โœ… Full conversation context with message arrays
  • โœ… Modern conversational AI platforms

Simple Format (payload_format: simple)

Minimal message-only format for basic APIs:

replicant:
  payload_format: simple

Payload Structure:

{
  "message": "Hello, how are you?"
}

Best For:

  • โœ… Simple APIs that only need the current message
  • โœ… Performance-critical scenarios
  • โœ… Legacy systems with minimal payload requirements
  • โœ… Testing basic functionality without conversation context

Anthropic Format (payload_format: anthropic)

Anthropic Claude-compatible format:

replicant:
  payload_format: anthropic

Payload Structure:

{
  "messages": [
    {"role": "user", "content": "Hello"},
    {"role": "assistant", "content": "Hi there!"}
  ]
}

Best For:

  • โœ… Anthropic Claude APIs and compatible services
  • โœ… Claude-based applications and integrations
  • โœ… Conversational AI platforms using Claude models

Legacy Format (payload_format: legacy)

Original ReplicantX format for backward compatibility:

replicant:
  payload_format: legacy

Payload Structure:

{
  "message": "Hello, how are you?",
  "timestamp": "2025-07-09T10:30:00",
  "conversation_history": [
    {"role": "user", "content": "Hello"},
    {"role": "assistant", "content": "Hi there!"}
  ]
}

Best For:

  • ๐Ÿ”ง Existing ReplicantX integrations (backward compatibility)
  • ๐Ÿ”ง Custom APIs expecting the original format
  • ๐Ÿ”ง Migration scenarios when transitioning to new formats

Session Management

ReplicantX supports session management to maintain conversation state across multiple API requests without sending the full conversation history each time. This is more efficient and realistic for production APIs.

Session Modes
replicant:
  # Session management configuration
  session_mode: auto  # disabled, auto, fixed, or env
  session_id: null  # Required when session_mode is "fixed"
  session_timeout: 300  # Session timeout in seconds (default: 5 minutes)
  
  # Session-aware payload formats
  payload_format: openai_session  # openai_session, simple_session, restful_session
  fullconversation: false  # Disable when using session management

Session Modes:

  • disabled (default): No session management, uses full conversation history
  • auto: Auto-generate unique session ID for each test run
  • fixed: Use a specific session ID (requires session_id field)
  • env: Use session ID from REPLICANTX_SESSION_ID environment variable

Session-Aware Payload Formats:

  • openai_session: {"session_id": "...", "message": "..."}
  • simple_session: {"conversation_id": "...", "message": "..."}
  • restful_session: {"message": "..."} (session ID in URL path)
Example Configurations

Auto-Generated Session:

replicant:
  session_mode: auto
  payload_format: openai_session
  fullconversation: false
  session_timeout: 600  # 10 minutes

Fixed Session ID:

replicant:
  session_mode: fixed
  session_id: "test_session_12345"
  payload_format: simple_session
  fullconversation: false

RESTful Session (Session ID in URL):

replicant:
  session_mode: auto
  payload_format: restful_session
  fullconversation: false
# Results in requests to: /conversations/{session_id}/messages

Environment-Based Session:

# Set environment variable
export REPLICANTX_SESSION_ID="prod_session_abc123"

# Use in YAML
replicant:
  session_mode: env
  payload_format: openai_session
  fullconversation: false
Session Management Benefits

โœ… Efficiency:

  • Reduces payload size significantly
  • Faster API requests
  • Lower bandwidth usage

โœ… Realistic Testing:

  • Matches production API patterns
  • Tests session handling logic
  • Validates conversation continuity

โœ… Flexibility:

  • Multiple session ID strategies
  • Configurable timeouts
  • Different payload formats

โœ… Debugging:

  • Session information in debug logs
  • Session lifecycle tracking
  • Timeout monitoring
When to Use Session Management

Use session management when:

  • โœ… Your API supports conversation IDs
  • โœ… You want to test session handling
  • โœ… Payload size is a concern
  • โœ… Testing production-like scenarios

Use full conversation when:

  • โŒ API doesn't support sessions
  • โŒ Testing legacy endpoints
  • โŒ Need complete conversation context
  • โŒ Debugging conversation flow

Complete Configuration Example

name: "Universal API Test"
base_url: https://api.example.com/chat
auth:
  provider: noop
level: agent
replicant:
  goal: "Test API with OpenAI-compatible format"
  facts:
    name: "Test User"
    email: "test@example.com"
  system_prompt: |
    You are a helpful user testing an API.
  initial_message: "Hello, I'm testing the API."
  max_turns: 10
  completion_keywords: ["complete", "finished", "done"]
  fullconversation: true  # Send full conversation history
  payload_format: openai  # Use OpenAI-compatible format
  llm:
    model: "test"
    temperature: 0.7
    max_tokens: 150

Session Management Examples

Auto-Generated Session (Recommended):

name: "Flight Booking with Session"
base_url: "https://api.example.com/chat"
auth:
  provider: "noop"
level: "agent"
replicant:
  goal: "Book a flight from London to Paris"
  facts:
    name: "Alex Johnson"
    email: "alex@example.com"
    departure: "London"
    destination: "Paris"
    date: "next Friday"
  system_prompt: "You are a customer booking a flight. Be polite and provide details when asked."
  initial_message: "Hi, I need to book a flight from London to Paris for next Friday."
  max_turns: 15
  session_mode: auto  # Auto-generate session ID
  payload_format: openai_session  # Session-aware format
  fullconversation: false  # Use session instead of full conversation
  session_timeout: 600  # 10 minutes
  llm:
    model: "test"

Fixed Session ID (For Testing):

name: "Customer Support with Fixed Session"
base_url: "https://api.example.com/support"
auth:
  provider: "noop"
level: "agent"
replicant:
  goal: "Get help with billing issue"
  facts:
    name: "Sarah Chen"
    account_id: "ACC-789456"
    issue: "billing"
  system_prompt: "You are a customer with a billing question."
  initial_message: "Hello, I have a billing question."
  max_turns: 10
  session_mode: fixed
  session_id: "test_session_12345"  # Fixed session ID
  payload_format: simple_session
  fullconversation: false
  session_timeout: 300  # 5 minutes
  llm:
    model: "test"

RESTful Session (Session ID in URL):

name: "Pizza Order with RESTful Session"
base_url: "https://api.example.com"
auth:
  provider: "noop"
level: "agent"
replicant:
  goal: "Order a pizza for delivery"
  facts:
    name: "Mike Rodriguez"
    address: "123 Main St, NYC"
    phone: "+1 555 123 4567"
  system_prompt: "You are ordering a pizza. Be friendly and provide your details."
  initial_message: "Hi, I'd like to order a pizza for delivery."
  max_turns: 8
  session_mode: auto
  payload_format: restful_session  # Session ID goes in URL
  fullconversation: false
  # Results in requests to: /conversations/{session_id}/messages
  llm:
    model: "test"

Migration Guide

From Legacy to OpenAI Format:

# Old configuration (still works)
replicant:
  payload_format: legacy  # or omit entirely

# New recommended configuration
replicant:
  payload_format: openai  # More compatible with modern APIs

For Simple APIs:

replicant:
  payload_format: simple
  fullconversation: false  # Not needed for simple format

For Anthropic APIs:

replicant:
  payload_format: anthropic
  fullconversation: true  # Maintain conversation context

System Prompt Examples

Helpful User:

system_prompt: |
  You are a polite user trying to achieve your goal. You have the 
  necessary information but need prompting to remember details.

Forgetful Customer:

system_prompt: |
  You are a customer who sometimes forgets details and needs 
  multiple prompts. You're friendly but can be a bit scattered.

Demanding User:

system_prompt: |
  You are an impatient user who wants quick results. You provide 
  information when asked but expect efficient service.

๐Ÿง  LLM Integration

ReplicantX uses PydanticAI for powerful LLM integration with multiple providers:

Supported Providers

  • OpenAI: GPT-4, GPT-4o, and other OpenAI models
  • Anthropic: Claude 4.0 Sonnet, Claude 4 Haiku, and other Claude models
  • Google: Gemini models via Google AI and VertexAI
  • Groq: Fast inference with Llama, Mixtral, and other models
  • Ollama: Local LLM deployment
  • Test: Built-in test model for development (no API keys needed)

Configuration

Add LLM configuration to your agent scenarios using PydanticAI model strings:

Technical Support Example:

level: agent
replicant:
  goal: "Get technical support for my account"
  facts:
    name: "Jordan Smith"
    # ... other facts
  system_prompt: |
    You are a customer seeking help with a technical issue.
    Use your available facts to answer questions naturally.
  # ... other config
  llm:
    model: "openai:gpt-4.1-mini"     # PydanticAI model string
    temperature: 0.7           # Response creativity (0.0-1.0)
    max_tokens: 150            # Maximum response length

Flight Booking Example:

level: agent
replicant:
  goal: "Book a business class flight to Paris"
  facts:
    name: "Sarah Johnson"
    destination: "Paris"
    travel_class: "business"
    # ... other facts
  system_prompt: |
    You are a customer trying to book a flight. You have the 
    necessary information but don't provide all details upfront.
  # ... other config
  llm:
    model: "anthropic:claude-3-5-sonnet-latest"  # PydanticAI model string
    temperature: 0.8           # Response creativity (0.0-1.0)
    max_tokens: 200            # Maximum response length

Model String Examples

# OpenAI models
model: "openai:gpt-4o"
model: "openai:gpt-4.1-mini"
model: "openai:gpt-4.1-nano"

# Anthropic models  
model: "anthropic:claude-3-5-sonnet-latest"
model: "anthropic:claude-3-haiku-20240307"

# Google models
model: "gemini-1.5-pro"
model: "gemini-1.5-flash"

# Groq models
model: "groq:llama-3.1-8b-instant"
model: "groq:mixtral-8x7b-32768"

# Test model (no API key needed)
model: "test"

Environment Variables

PydanticAI automatically detects API keys from environment variables:

# OpenAI
export OPENAI_API_KEY=sk-your-api-key

# Anthropic
export ANTHROPIC_API_KEY=sk-ant-your-api-key

# Google AI
export GOOGLE_API_KEY=your-google-api-key

# Groq
export GROQ_API_KEY=your-groq-api-key

Installation with LLM Support

# Install with all LLM providers
pip install replicantx[all]

# Install with specific providers
pip install replicantx[openai]
pip install replicantx[anthropic]

# Core installation (includes PydanticAI with test model)
pip install replicantx

How LLM Integration Works

  1. Smart Prompting: System prompts are enhanced with available facts and conversation context
  2. Natural Responses: LLMs generate contextually appropriate responses based on user personas
  3. Fact Integration: Available facts are automatically included in prompts for relevant responses
  4. Graceful Fallback: If LLM calls fail, the system falls back to rule-based responses
  5. Conversation Memory: Recent conversation history is maintained for context

Examples with PydanticAI

Customer Support Example:

name: "Customer Support - Billing Issue"
base_url: https://api.example.com/support
auth:
  provider: noop
level: agent
replicant:
  goal: "Get customer support for billing issue"
  facts:
    name: "Alex Chen"
    account_number: "ACC-12345"
    issue_type: "billing"
    last_payment: "$99.99 on Jan 15th"
  system_prompt: |
    You are a customer who is polite but slightly frustrated about 
    a billing issue. You have the necessary account information but 
    may need prompting to remember specific details.
  initial_message: "Hi, I have a question about my recent bill."
  max_turns: 12
  completion_keywords: ["resolved", "ticket created", "issue closed"]
  fullconversation: true  # Send full conversation history with each request
  payload_format: openai  # Use OpenAI-compatible format
  llm:
    model: "openai:gpt-4o"  # PydanticAI model string
    temperature: 0.8
    max_tokens: 120

Flight Booking Example:

name: "Travel Booking - Flight to Paris"
base_url: https://api.example.com/chat
auth:
  provider: supabase
  project_url: "{{ env.SUPABASE_URL }}"
  api_key: "{{ env.SUPABASE_ANON_KEY }}"
  email: "{{ env.TEST_USER_EMAIL }}"
  password: "{{ env.TEST_USER_PASSWORD }}"
level: agent
replicant:
  goal: "Book a business class flight to Paris for next weekend"
  facts:
    name: "Sarah Johnson"
    email: "sarah.johnson@example.com"
    travel_class: "business"
    destination: "Paris"
    departure_city: "New York"
    travel_date: "next Friday"
    passengers: 1
    budget: "$3000"
    preferences: "aisle seat, vegetarian meal"
  system_prompt: |
    You are a helpful user trying to book a flight. You have all the 
    necessary information but you're a typical user who doesn't 
    provide all details upfront.
  initial_message: "Hi, I'd like to book a flight to Paris for next weekend."
  max_turns: 15
  completion_keywords: ["booked", "confirmed", "reservation number", "booking complete"]
  fullconversation: true  # Send full conversation history with each request
  payload_format: openai  # Use OpenAI-compatible format
  llm:
    model: "openai:gpt-4o"
    temperature: 0.7
    max_tokens: 150

These examples enable much more natural and contextually aware conversations compared to rule-based responses.

๐Ÿ”ง GitHub Actions Integration

Add this workflow to .github/workflows/replicantx.yml:

name: ReplicantX E2E Tests
on:
  pull_request: { types: [opened, synchronize, reopened] }
jobs:
  replicantx:
    runs-on: ubuntu-latest
    env:
      SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
      SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
      REPLICANTX_TARGET: pr-${{ github.event.pull_request.number }}-helix-api.onrender.com
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: "3.11" }
      - run: pip install "replicantx[cli]"
      - run: |
          until curl -sf "https://$REPLICANTX_TARGET/health"; do
            echo "Waiting for previewโ€ฆ"; sleep 5; done
      - run: replicantx run tests/*.yaml --report report.md --ci
      - uses: marocchino/sticky-pull-request-comment@v2
        if: always()
        with: { path: report.md }

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

replicantx-0.1.3.tar.gz (61.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

replicantx-0.1.3-py3-none-any.whl (53.7 kB view details)

Uploaded Python 3

File details

Details for the file replicantx-0.1.3.tar.gz.

File metadata

  • Download URL: replicantx-0.1.3.tar.gz
  • Upload date:
  • Size: 61.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for replicantx-0.1.3.tar.gz
Algorithm Hash digest
SHA256 f721ee8731afcf298fcaf24b80147fc5d7509ce8bef68e3c3a432ed7db545524
MD5 33a19a7c4cb0445831d527a6ae3fabc2
BLAKE2b-256 a3ce816f87e2459b9e84397e9caab44edf9a3af5c1052e21fdde206250a0be3e

See more details on using hashes here.

File details

Details for the file replicantx-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: replicantx-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 53.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for replicantx-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 424a012581132a80e7c16ea96012842937560de5011af5247422b6ee24dfbe42
MD5 29827ca6bb2e89fefd25fbf7aa7f29a5
BLAKE2b-256 a4247315eda2d3496c292e3272aba88e5a575b011d429365f5069e3938a06185

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page