File size: 3,993 Bytes
946a274
 
 
d7d471b
6f874f7
d7d471b
 
 
 
946a274
 
 
d7d471b
30c739d
 
d7d471b
 
 
 
 
 
 
 
 
 
 
 
 
946a274
30c739d
946a274
39bca12
d7d471b
39bca12
 
 
d7d471b
39bca12
d7d471b
39bca12
 
 
d7d471b
 
 
 
39bca12
30c739d
946a274
af926fe
d7d471b
946a274
 
6f874f7
946a274
d7d471b
 
 
 
d55b380
 
d7d471b
af926fe
d7d471b
 
 
 
6f874f7
d55b380
 
d7d471b
6f874f7
af926fe
6f874f7
af926fe
 
6f874f7
d7d471b
 
 
 
0f4b7f9
946a274
d7d471b
 
 
946a274
 
 
6f874f7
946a274
 
 
 
 
 
 
 
 
 
0f4b7f9
946a274
 
39bca12
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import gradio as gr
from gradio_client import Client
import os
import logging
import time  # Import time module for adding delays

# Set up logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)

# Function to call the API and get the result
def call_api(prompt):
    try:
        # Reload the Gradio client for each chunk
        client = Client("MiniMaxAI/MiniMax-Text-01")
        logger.info(f"Calling API with prompt: {prompt[:100]}...")  # Log the first 100 chars of the prompt
        result = client.predict(
            message=prompt,
            max_tokens=12800,
            temperature=0.1,
            top_p=0.9,
            api_name="/chat"
        )
        logger.info("API call successful.")
        return result
    except Exception as e:
        logger.error(f"API call failed: {e}")
        raise gr.Error(f"API call failed: {str(e)}")

# Function to segment the text file into chunks of 1500 words
def segment_text(file_path):
    try:
        logger.info(f"Reading file: {file_path}")
        # Try reading with UTF-8 encoding first
        with open(file_path, "r", encoding="utf-8") as f:
            text = f.read()
        logger.info("File read successfully with UTF-8 encoding.")
    except UnicodeDecodeError:
        logger.warning("UTF-8 encoding failed. Trying latin-1 encoding.")
        # Fallback to latin-1 encoding if UTF-8 fails
        with open(file_path, "r", encoding="latin-1") as f:
            text = f.read()
        logger.info("File read successfully with latin-1 encoding.")
    except Exception as e:
        logger.error(f"Failed to read file: {e}")
        raise gr.Error(f"Failed to read file: {str(e)}")
    
    # Split the text into chunks of 1500 words
    words = text.split()
    chunks = [" ".join(words[i:i + 1500]) for i in range(0, len(words), 1250)]
    logger.info(f"Segmented text into {len(chunks)} chunks.")
    return chunks

# Function to process the text file and make API calls with rate limiting
def process_text(file, prompt):
    try:
        logger.info("Starting text processing...")
        
        # Segment the text file into chunks
        file_path = file.name if hasattr(file, "name") else file
        chunks = segment_text(file_path)
        
        # Process each chunk with a 15-second delay between API calls
        results = []
        for idx, chunk in enumerate(chunks):
            logger.info(f"Processing chunk {idx + 1}/{len(chunks)}")
            try:
                # Call the API
                result = call_api(f"{prompt}\n\n{chunk}")
                results.append(result)
                logger.info(f"Chunk {idx + 1} processed successfully.")
                
                # Wait 15 seconds before the next API call
                if idx < len(chunks) - 1:  # No need to wait after the last chunk
                    logger.info("Waiting 15 seconds before the next API call...")
                    time.sleep(15)
                
            except Exception as e:
                logger.error(f"Failed to process chunk {idx + 1}: {e}")
                raise gr.Error(f"Failed to process chunk {idx + 1}: {str(e)}")
        
        return "All chunks processed successfully."
    
    except Exception as e:
        logger.error(f"An error occurred during processing: {e}")
        raise gr.Error(f"An error occurred: {str(e)}")

# Gradio interface
with gr.Blocks() as demo:
    gr.Markdown("## Text File Processor with Rate-Limited API Calls")
    with gr.Row():
        file_input = gr.File(label="Upload Text File")
        prompt_input = gr.Textbox(label="Enter Prompt")
    with gr.Row():
        output_message = gr.Textbox(label="Status Message")
    submit_button = gr.Button("Submit")
    
    submit_button.click(
        process_text,
        inputs=[file_input, prompt_input],
        outputs=[output_message]
    )

# Launch the Gradio app with a public link
demo.launch(share=True)