| | import requests
|
| | import json
|
| | import re
|
| | from typing import Optional, List, Dict, Any
|
| |
|
| | class AIForwarder:
|
| | def __init__(self, api_url: str, system_prompt_file: str = "summary.txt"):
|
| | """
|
| | Initialize the AI Forwarder
|
| |
|
| | Args:
|
| | api_url: The API endpoint URL
|
| | system_prompt_file: Path to the file containing system prompt
|
| | """
|
| | self.api_url = api_url
|
| | self.system_prompt = self._load_system_prompt(system_prompt_file)
|
| |
|
| | def _load_system_prompt(self, file_path: str) -> str:
|
| | """Load system prompt from file"""
|
| | try:
|
| | with open(file_path, 'r', encoding='utf-8') as f:
|
| | content = f.read().strip()
|
| | print(f"✓ System prompt loaded from {file_path}")
|
| | return content
|
| | except FileNotFoundError:
|
| | print(f"⚠ Warning: {file_path} not found. Using default prompt.")
|
| | return self._get_default_prompt()
|
| |
|
| | def _get_default_prompt(self) -> str:
|
| | """Default system prompt for sheet forwarding"""
|
| | return """You are an AI assistant that helps users access different sheets.
|
| | When a user requests a specific sheet number, respond with the format: <forward>NUMBER</forward>
|
| | For example:
|
| | - User: "I want sheet 3" → Response: "<forward>3</forward>"
|
| | - User: "Show me sheet number 5" → Response: "<forward>5</forward>"
|
| | - User: "Can I see the second sheet?" → Response: "<forward>2</forward>"
|
| |
|
| | Always extract the sheet number from the user's request and format it properly."""
|
| |
|
| | def _extract_sheet_number(self, response: str) -> Optional[int]:
|
| | """Extract sheet number from AI response"""
|
| | match = re.search(r'<forward>(\d+)</forward>', response)
|
| | if match:
|
| | return int(match.group(1))
|
| | return None
|
| |
|
| | def _clean_chat_history(self, chat_history: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
| | """
|
| | Remove any existing system messages from chat history
|
| |
|
| | Args:
|
| | chat_history: Original chat history
|
| |
|
| | Returns:
|
| | Cleaned chat history without system messages
|
| | """
|
| | cleaned = []
|
| | for message in chat_history:
|
| |
|
| | if message.get("role") != "system":
|
| | cleaned.append(message)
|
| | return cleaned
|
| |
|
| | def process_chat_history(
|
| | self,
|
| | chat_history: List[Dict[str, Any]],
|
| | temperature: float = 0.9,
|
| | top_p: float = 0.95,
|
| | max_tokens: Optional[int] = 1000
|
| | ) -> Dict[str, Any]:
|
| | """
|
| | Process chat history and get AI response
|
| | This is the main function to use when importing this module
|
| |
|
| | Args:
|
| | chat_history: List of chat messages with roles (user/assistant)
|
| | Example: [
|
| | {"role": "user", "content": "I want sheet 3"},
|
| | {"role": "assistant", "content": "Sure!"},
|
| | {"role": "user", "content": "Show me sheet 5"}
|
| | ]
|
| | temperature: Sampling temperature
|
| | top_p: Nucleus sampling parameter
|
| | max_tokens: Maximum tokens to generate
|
| |
|
| | Returns:
|
| | Dictionary with response and extracted sheet number
|
| | """
|
| |
|
| | cleaned_history = self._clean_chat_history(chat_history)
|
| |
|
| |
|
| | final_history = [{"role": "system", "content": self.system_prompt}]
|
| | final_history.extend(cleaned_history)
|
| |
|
| |
|
| | payload = {
|
| | "user_input": None,
|
| | "chat_history": final_history,
|
| | "temperature": temperature,
|
| | "top_p": top_p,
|
| | }
|
| |
|
| | try:
|
| |
|
| | response = requests.post(
|
| | self.api_url,
|
| | json=payload,
|
| | headers={"Content-Type": "application/json"},
|
| | timeout=30
|
| | )
|
| | response.raise_for_status()
|
| |
|
| |
|
| | result = response.json()
|
| | assistant_response = result.get("assistant_response", "")
|
| |
|
| |
|
| | sheet_number = self._extract_sheet_number(assistant_response)
|
| |
|
| | return {
|
| | "success": True,
|
| | "response": assistant_response,
|
| | "sheet_number": sheet_number,
|
| | "raw_response": result
|
| | }
|
| |
|
| | except requests.exceptions.RequestException as e:
|
| | return {
|
| | "success": False,
|
| | "error": str(e),
|
| | "response": None,
|
| | "sheet_number": None
|
| | }
|
| |
|
| | def forward_single_message(
|
| | self,
|
| | user_input: str,
|
| | previous_history: Optional[List[Dict[str, Any]]] = None
|
| | ) -> Dict[str, Any]:
|
| | """
|
| | Forward a single user message (with optional previous history)
|
| |
|
| | Args:
|
| | user_input: User's message
|
| | previous_history: Optional previous chat history
|
| |
|
| | Returns:
|
| | Dictionary with response and sheet number
|
| | """
|
| | chat_history = previous_history.copy() if previous_history else []
|
| | chat_history.append({"role": "user", "content": user_input})
|
| |
|
| | return self.process_chat_history(chat_history)
|
| |
|
| |
|
| |
|
| | if __name__ == "__main__":
|
| |
|
| | api_url = "https://dooratre-xx-gpt-5.hf.space/chat"
|
| | forwarder = AIForwarder(api_url)
|
| |
|
| | print("\n" + "="*50)
|
| | print("AI Sheet Forwarder - Testing Mode")
|
| | print("="*50 + "\n")
|
| |
|
| |
|
| | print("Test 1: Processing chat history")
|
| | print("-" * 50)
|
| |
|
| | test_history = [
|
| | {"role": "user", "content": "Hello!"},
|
| | {"role": "assistant", "content": "Hi! How can I help you?"},
|
| | {"role": "user", "content": "I want sheet number 3"}
|
| | ]
|
| |
|
| | result = forwarder.process_chat_history(test_history)
|
| |
|
| | if result["success"]:
|
| | print(f"AI Response: {result['response']}")
|
| | if result["sheet_number"]:
|
| | print(f"✓ Sheet {result['sheet_number']} detected")
|
| | else:
|
| | print(f"✗ Error: {result['error']}")
|
| |
|
| | print("\n" + "="*50)
|
| | print("Interactive Mode (type 'quit' to exit)")
|
| | print("="*50 + "\n")
|
| |
|
| | conversation_history = []
|
| |
|
| | while True:
|
| | try:
|
| | user_input = input("YOU: ").strip()
|
| |
|
| | if user_input.lower() == 'quit':
|
| | print("Goodbye!")
|
| | break
|
| |
|
| | if not user_input:
|
| | continue
|
| |
|
| |
|
| | conversation_history.append({"role": "user", "content": user_input})
|
| |
|
| |
|
| | result = forwarder.process_chat_history(conversation_history)
|
| |
|
| | if result["success"]:
|
| | print(f"AI: {result['response']}")
|
| |
|
| |
|
| | conversation_history.append({
|
| | "role": "assistant",
|
| | "content": result['response']
|
| | })
|
| |
|
| | if result["sheet_number"]:
|
| | print(f"✓ Sheet {result['sheet_number']} requested\n")
|
| | else:
|
| | print(f"✗ Error: {result['error']}\n")
|
| |
|
| | except KeyboardInterrupt:
|
| | print("\n\nGoodbye!")
|
| | break
|
| | except Exception as e:
|
| | print(f"✗ Unexpected error: {e}\n") |