Back to Repositories

Testing Authentication Requirements and Response Timing in gpt4free

This test suite evaluates authentication requirements and response timing across multiple AI chat providers in the gpt4free library. It implements comprehensive testing for async, streaming, and non-streaming responses while measuring performance metrics.

Test Coverage Overview

The test suite covers authentication validation and performance benchmarking across multiple provider endpoints including H2o, You, HuggingChat, OpenAssistant, Bing, and Bard.

Key functionality tested includes:
  • Async response handling
  • Streaming response processing
  • Non-streaming response handling
  • Response timing measurements
  • Authentication requirements validation

Implementation Analysis

The testing approach utilizes Python’s asyncio framework for concurrent execution and custom timing decorators for performance measurement.

Implementation patterns include:
  • Decorator-based timing measurements
  • Async/await pattern for concurrent testing
  • Generator-based streaming response handling
  • Modular provider testing architecture

Technical Details

Testing tools and configuration:
  • Python asyncio for asynchronous operations
  • Custom log_time decorators for performance tracking
  • PathLib for cross-platform path handling
  • Provider-specific authentication handling
  • Streaming and non-streaming response modes

Best Practices Demonstrated

The test implementation showcases several testing best practices including isolation of provider tests, comprehensive timing measurements, and proper error handling.

Notable practices:
  • Modular test organization
  • Consistent timing measurement approach
  • Multiple response mode testing
  • Clear output formatting
  • Flexible provider configuration

xtekky/gpt4free

etc/testing/test_needs_auth.py

            
import sys
from pathlib import Path
import asyncio

sys.path.append(str(Path(__file__).parent.parent))

import g4f
from  testing.log_time import log_time, log_time_async, log_time_yield


_providers = [
    g4f.Provider.H2o,
    g4f.Provider.You,
    g4f.Provider.HuggingChat,
    g4f.Provider.OpenAssistant,
    g4f.Provider.Bing,
    g4f.Provider.Bard
]

_instruct = "Hello, are you GPT 4?."

_example = """
OpenaiChat: Hello! How can I assist you today? 2.0 secs
Bard: Hello! How can I help you today? 3.44 secs
Bing: Hello, this is Bing. How can I help? 😊 4.14 secs
Async Total: 4.25 secs

OpenaiChat: Hello! How can I assist you today? 1.85 secs
Bard: Hello! How can I help you today? 3.38 secs
Bing: Hello, this is Bing. How can I help? 😊 6.14 secs
Stream Total: 11.37 secs

OpenaiChat: Hello! How can I help you today? 3.28 secs
Bard: Hello there! How can I help you today? 3.58 secs
Bing: Hello! How can I help you today? 3.28 secs
No Stream Total: 10.14 secs
"""

print("Bing: ", end="")
for response in log_time_yield(
    g4f.ChatCompletion.create,
    model=g4f.models.default,
    messages=[{"role": "user", "content": _instruct}],
    provider=g4f.Provider.Bing,
    #cookies=g4f.get_cookies(".huggingface.co"),
    stream=True,
    auth=True
):
    print(response, end="", flush=True)
print()
print()


async def run_async():
    responses = [
        log_time_async(
            provider.create_async, 
            model=None,
            messages=[{"role": "user", "content": _instruct}],
        )
        for provider in _providers
    ]
    responses = await asyncio.gather(*responses)
    for idx, provider in enumerate(_providers):
        print(f"{provider.__name__}:", responses[idx])
print("Async Total:", asyncio.run(log_time_async(run_async)))
print()


def run_stream():
    for provider in _providers:
        print(f"{provider.__name__}: ", end="")
        for response in log_time_yield(
            provider.create_completion,
            model=None,
            messages=[{"role": "user", "content": _instruct}],
        ):
            print(response, end="", flush=True)
        print()
print("Stream Total:", log_time(run_stream))
print()


def create_no_stream():
    for provider in _providers:
        print(f"{provider.__name__}:", end=" ")
        for response in log_time_yield(
            provider.create_completion,
            model=None,
            messages=[{"role": "user", "content": _instruct}],
            stream=False
        ):
            print(response, end="")
        print()
print("No Stream Total:", log_time(create_no_stream))
print()