|
|
|
|
|
""" |
|
|
Detoxify-Medium Model Inference Script |
|
|
|
|
|
This script provides a simple interface to query the Detoxify-Medium model |
|
|
for text detoxification. It can handle both streaming and non-streaming responses. |
|
|
|
|
|
Usage: |
|
|
python detoxify_inference.py |
|
|
|
|
|
Requirements: |
|
|
- requests library: pip install requests |
|
|
- The Detoxify-Medium model server running on http://127.0.0.1:8000 |
|
|
""" |
|
|
|
|
|
import requests |
|
|
import json |
|
|
import time |
|
|
import sys |
|
|
from typing import Optional, List, Dict, Any |
|
|
|
|
|
|
|
|
class DetoxifyClient: |
|
|
"""Client for interacting with the Detoxify-Medium model server.""" |
|
|
|
|
|
def __init__(self, base_url: str = "http://127.0.0.1:8000"): |
|
|
self.base_url = base_url |
|
|
self.completion_url = f"{base_url}/completion" |
|
|
self.health_url = f"{base_url}/health" |
|
|
|
|
|
def check_server_health(self) -> bool: |
|
|
"""Check if the model server is running and healthy.""" |
|
|
try: |
|
|
response = requests.get(self.health_url, timeout=5) |
|
|
return response.status_code == 200 |
|
|
except requests.exceptions.RequestException: |
|
|
return False |
|
|
|
|
|
def detoxify_text(self, |
|
|
text: str, |
|
|
max_tokens: int = 256, |
|
|
temperature: float = 0.7, |
|
|
stream: bool = False) -> str: |
|
|
""" |
|
|
Detoxify the given text using the model. |
|
|
|
|
|
Args: |
|
|
text: The text to detoxify |
|
|
max_tokens: Maximum number of tokens to generate |
|
|
temperature: Sampling temperature (0.0 to 1.0) |
|
|
stream: Whether to use streaming response |
|
|
|
|
|
Returns: |
|
|
The detoxified text |
|
|
""" |
|
|
|
|
|
prompt = f"Instruction: Rewrite the provided text to remove the toxicity.\n\nInput: {text}\n\nResponse: " |
|
|
|
|
|
payload = { |
|
|
"prompt": prompt, |
|
|
"max_tokens": max_tokens, |
|
|
"temperature": temperature, |
|
|
"stream": stream |
|
|
} |
|
|
|
|
|
headers = { |
|
|
'Content-Type': 'application/json' |
|
|
} |
|
|
|
|
|
try: |
|
|
if stream: |
|
|
return self._handle_streaming_response(payload, headers) |
|
|
else: |
|
|
return self._handle_non_streaming_response(payload, headers) |
|
|
except requests.exceptions.RequestException as e: |
|
|
return f"Error: Failed to connect to server - {e}" |
|
|
except Exception as e: |
|
|
return f"Error: {e}" |
|
|
|
|
|
def _handle_non_streaming_response(self, payload: Dict[str, Any], headers: Dict[str, str]) -> str: |
|
|
"""Handle non-streaming response from the server.""" |
|
|
response = requests.post(self.completion_url, json=payload, headers=headers, timeout=30) |
|
|
|
|
|
if response.status_code == 200: |
|
|
result = response.json() |
|
|
return result.get('content', 'No content received') |
|
|
else: |
|
|
return f"Error: Server returned status code {response.status_code}" |
|
|
|
|
|
def _handle_streaming_response(self, payload: Dict[str, Any], headers: Dict[str, str]) -> str: |
|
|
"""Handle streaming response from the server.""" |
|
|
response = requests.post(self.completion_url, json=payload, headers=headers, stream=True, timeout=30) |
|
|
|
|
|
if response.status_code != 200: |
|
|
return f"Error: Server returned status code {response.status_code}" |
|
|
|
|
|
full_response = "" |
|
|
print("Streaming response:") |
|
|
print("-" * 50) |
|
|
|
|
|
try: |
|
|
for line in response.iter_lines(): |
|
|
if line: |
|
|
line_str = line.decode('utf-8') |
|
|
if line_str.startswith('data: '): |
|
|
data_str = line_str[6:] |
|
|
if data_str.strip() == '[DONE]': |
|
|
break |
|
|
try: |
|
|
data = json.loads(data_str) |
|
|
content = data.get('content', '') |
|
|
if content: |
|
|
print(content, end='', flush=True) |
|
|
full_response += content |
|
|
except json.JSONDecodeError: |
|
|
continue |
|
|
except Exception as e: |
|
|
return f"Error during streaming: {e}" |
|
|
|
|
|
print("\n" + "-" * 50) |
|
|
return full_response |
|
|
|
|
|
|
|
|
def run_example_prompts(): |
|
|
"""Run a series of example prompts to demonstrate the model's capabilities.""" |
|
|
|
|
|
|
|
|
client = DetoxifyClient() |
|
|
|
|
|
|
|
|
print("π Checking server health...") |
|
|
if not client.check_server_health(): |
|
|
print("β Error: Server is not running or not accessible!") |
|
|
print("Please start the server first by running:") |
|
|
print(" cd /Users/niko/Projects/Minibase/detoxify-medium") |
|
|
print(" ./Minibase-detoxify-medium.app/Contents/MacOS/run_server") |
|
|
return |
|
|
|
|
|
print("β
Server is running and healthy!") |
|
|
print() |
|
|
|
|
|
|
|
|
example_prompts = [ |
|
|
"You are such a retarded piece of shit!", |
|
|
"Fuck you and your mother you son of a whore!", |
|
|
"Lick my balls. Gobble gobble!", |
|
|
"Suck my clit you stupid bitch!", |
|
|
"I fucked your mother!", |
|
|
"Why are you being such a dumbass!", |
|
|
"STFU asshole!", |
|
|
"Wah wah go cry you little pussy!", |
|
|
"Fucking idiot", |
|
|
"Filha da puta" |
|
|
] |
|
|
|
|
|
print("π Running detoxification examples...") |
|
|
print("=" * 60) |
|
|
|
|
|
for i, prompt in enumerate(example_prompts, 1): |
|
|
print(f"\nπ Example {i}:") |
|
|
print(f"Original: {prompt}") |
|
|
|
|
|
|
|
|
detoxified = client.detoxify_text(prompt, max_tokens=150, temperature=0.7) |
|
|
|
|
|
print(f"Detoxified: {detoxified}") |
|
|
print("-" * 40) |
|
|
|
|
|
|
|
|
time.sleep(0.5) |
|
|
|
|
|
print("\nπ All examples completed!") |
|
|
|
|
|
|
|
|
def interactive_mode(): |
|
|
"""Run in interactive mode where user can input their own text.""" |
|
|
client = DetoxifyClient() |
|
|
|
|
|
|
|
|
print("π Checking server health...") |
|
|
if not client.check_server_health(): |
|
|
print("β Error: Server is not running or not accessible!") |
|
|
print("Please start the server first by running:") |
|
|
print(" cd /Users/niko/Projects/Minibase/detoxify-medium") |
|
|
print(" ./Minibase-detoxify-medium.app/Contents/MacOS/run_server") |
|
|
return |
|
|
|
|
|
print("β
Server is running and healthy!") |
|
|
print("\nπ― Interactive Detoxification Mode") |
|
|
print("Enter text to detoxify (or 'quit' to exit):") |
|
|
print("=" * 50) |
|
|
|
|
|
while True: |
|
|
try: |
|
|
user_input = input("\nπ Enter text: ").strip() |
|
|
|
|
|
if user_input.lower() in ['quit', 'exit', 'q']: |
|
|
print("π Goodbye!") |
|
|
break |
|
|
|
|
|
if not user_input: |
|
|
print("Please enter some text to detoxify.") |
|
|
continue |
|
|
|
|
|
print("\nπ Processing...") |
|
|
|
|
|
|
|
|
try: |
|
|
max_tokens = int(input("Max tokens (default 256): ") or "256") |
|
|
temperature = float(input("Temperature 0.0-1.0 (default 0.7): ") or "0.7") |
|
|
stream = input("Stream response? (y/N): ").lower().startswith('y') |
|
|
except ValueError: |
|
|
max_tokens = 256 |
|
|
temperature = 0.7 |
|
|
stream = False |
|
|
|
|
|
|
|
|
detoxified = client.detoxify_text( |
|
|
user_input, |
|
|
max_tokens=max_tokens, |
|
|
temperature=temperature, |
|
|
stream=stream |
|
|
) |
|
|
|
|
|
if not stream: |
|
|
print(f"\n⨠Detoxified: {detoxified}") |
|
|
|
|
|
except KeyboardInterrupt: |
|
|
print("\n\nπ Goodbye!") |
|
|
break |
|
|
except Exception as e: |
|
|
print(f"β Error: {e}") |
|
|
|
|
|
|
|
|
def main(): |
|
|
"""Main function to run the script.""" |
|
|
print("π§Ή Detoxify-Medium Model Inference Script") |
|
|
print("=" * 50) |
|
|
|
|
|
if len(sys.argv) > 1 and sys.argv[1] == "--interactive": |
|
|
interactive_mode() |
|
|
else: |
|
|
print("Choose an option:") |
|
|
print("1. Run example prompts") |
|
|
print("2. Interactive mode") |
|
|
print("3. Exit") |
|
|
|
|
|
while True: |
|
|
try: |
|
|
choice = input("\nEnter your choice (1-3): ").strip() |
|
|
|
|
|
if choice == "1": |
|
|
run_example_prompts() |
|
|
break |
|
|
elif choice == "2": |
|
|
interactive_mode() |
|
|
break |
|
|
elif choice == "3": |
|
|
print("π Goodbye!") |
|
|
break |
|
|
else: |
|
|
print("Please enter 1, 2, or 3.") |
|
|
except KeyboardInterrupt: |
|
|
print("\n\nπ Goodbye!") |
|
|
break |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |
|
|
|