shukdevdatta123 commited on
Commit
1e3cc37
·
verified ·
1 Parent(s): 5e1d6fb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -181
app.py CHANGED
@@ -1,220 +1,136 @@
1
  import gradio as gr
 
 
2
  import time
 
3
 
4
- # Try importing OpenAI with error handling
5
- try:
6
- from openai import OpenAI
7
- except ImportError:
8
- print("OpenAI package not installed. Installing now...")
9
- import subprocess
10
- import sys
11
- subprocess.check_call([sys.executable, "-m", "pip", "install", "openai"])
12
- from openai import OpenAI
13
-
14
- def test_api_connection(api_key):
15
- """Test the API connection and return a status message"""
16
- if not api_key or api_key.strip() == "":
17
- return False, "API key is required"
18
 
19
- try:
20
- client = OpenAI(
21
- base_url="https://openrouter.ai/api/v1",
22
- api_key=api_key.strip(),
23
- )
24
- # Simple request to test connection
25
- client.models.list()
26
- return True, "API connection successful"
27
- except Exception as e:
28
- return False, f"API connection failed: {str(e)}"
29
-
30
- def generate_solution(api_key, problem_statement, progress=gr.Progress()):
31
- """Generate solution with progress updates"""
32
- progress(0, desc="Starting...")
33
-
34
- # Input validation
35
- if not api_key or api_key.strip() == "":
36
- return "Error: OpenRouter API key is required"
37
 
38
- if not problem_statement or problem_statement.strip() == "":
39
- return "Error: Please provide a problem statement"
 
 
 
40
 
41
- progress(0.1, desc="Validating API key...")
42
- # Test API connection first
43
- success, message = test_api_connection(api_key)
44
- if not success:
45
- return f"Error: {message}"
46
 
47
- progress(0.3, desc="Sending request to AI model...")
48
  try:
 
49
  client = OpenAI(
50
  base_url="https://openrouter.ai/api/v1",
51
- api_key=api_key.strip(),
52
  )
53
 
54
- progress(0.5, desc="Generating solution...")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  completion = client.chat.completions.create(
 
 
 
 
56
  model="open-r1/olympiccoder-7b:free",
57
  messages=[
58
- {
59
- "role": "system",
60
- "content": "You are a competitive programming expert. Provide a correct solution with clear reasoning. First output the code, then explain the approach."
61
- },
62
  {
63
  "role": "user",
64
- "content": f"Solve this problem:\n{problem_statement}"
65
  }
66
  ],
67
- temperature=0.3,
68
- max_tokens=2048
69
  )
70
 
71
- progress(0.8, desc="Processing response...")
72
- response = completion.choices[0].message.content
73
-
74
- progress(0.9, desc="Formatting output...")
75
- formatted_response = format_response(response)
76
 
77
- progress(1.0, desc="Done!")
78
- return formatted_response
79
-
80
  except Exception as e:
81
- error_message = str(e)
82
- print(f"Error occurred: {error_message}")
83
- return f"Error: {error_message}"
84
 
85
- def format_response(response):
86
- """Format the AI response into markdown with code blocks"""
87
- if not response:
88
- return "Error: Received empty response from AI model"
89
-
90
- formatted = []
91
- lines = response.split('\n')
92
-
93
- # Find code blocks
94
- in_code = False
95
- code_blocks = []
96
- current_block = []
97
-
98
- for line in lines:
99
- if line.strip().startswith('```'):
100
- if in_code:
101
- code_blocks.append(current_block)
102
- current_block = []
103
- else:
104
- current_block = []
105
- in_code = not in_code
106
- continue
107
-
108
- if in_code:
109
- current_block.append(line)
110
-
111
- # Handle unclosed code block
112
- if in_code and current_block:
113
- code_blocks.append(current_block)
114
 
115
- # Process code blocks and explanations
116
- processed_response = response
 
 
 
117
 
118
- # Replace each code block with properly formatted markdown
119
- for i, block in enumerate(code_blocks):
120
- # Skip language identifier if present
121
- if block and any(block[0].strip().lower() == lang for lang in ["python", "java", "c++", "cpp", "javascript"]):
122
- code_content = '\n'.join(block[1:])
123
- lang = block[0].strip().lower()
124
- else:
125
- code_content = '\n'.join(block)
126
- lang = "python" # Default to Python
127
-
128
- # Create search pattern for the original block
129
- if i < len(code_blocks) - 1 or not in_code:
130
- block_text = '```' + '\n' + '\n'.join(block) + '\n' + '```'
131
- else:
132
- block_text = '```' + '\n' + '\n'.join(block)
133
-
134
- # Replace with properly formatted block
135
- formatted_block = f"```{lang}\n{code_content}\n```"
136
- processed_response = processed_response.replace(block_text, formatted_block)
137
-
138
- return processed_response
139
-
140
- # Define the Gradio interface
141
- with gr.Blocks(title="Competitive Programming Assistant", theme=gr.themes.Soft()) as app:
142
- gr.Markdown("# 🏆 Competitive Programming Assistant")
143
- gr.Markdown("Powered by OlympicCoder-7B via OpenRouter AI")
144
 
145
  with gr.Row():
146
- with gr.Column():
147
- api_key = gr.Textbox(
 
148
  label="OpenRouter API Key",
149
- type="password",
150
- placeholder="Enter your API key here...",
151
- value=""
152
  )
153
 
154
- test_btn = gr.Button("Test API Connection", variant="secondary")
155
- api_status = gr.Textbox(label="API Status", interactive=False)
 
 
 
156
 
157
- test_btn.click(
158
- fn=test_api_connection,
159
- inputs=[api_key],
160
- outputs=[gr.Checkbox(visible=False), api_status]
 
 
 
 
 
 
 
161
  )
162
 
163
- with gr.Row():
164
- problem_input = gr.Textbox(
165
- label="Problem Statement",
166
- lines=5,
167
- placeholder="Paste your programming problem here..."
168
- )
169
-
170
- submit_btn = gr.Button("Generate Solution", variant="primary", size="lg")
171
-
172
- # Add a status indicator
173
- status = gr.Markdown("Ready to generate solutions")
174
-
175
- # Output area
176
- solution_output = gr.Markdown(label="Solution")
177
-
178
- # Example problems
179
- gr.Examples(
180
- examples=[
181
- [
182
- "Given an array of integers, find two numbers such that they add up to a specific target number."
183
- ],
184
- [
185
- "Implement a function to calculate the minimum number of operations required to transform one string into another using only insertion, deletion, and substitution."
186
- ]
187
- ],
188
- inputs=[problem_input]
189
- )
190
-
191
- # Set up event handlers with additional status updates
192
- def on_submit_click(api_key, problem):
193
- return "Generating solution... Please wait."
194
 
 
195
  submit_btn.click(
196
- fn=on_submit_click,
197
- inputs=[api_key, problem_input],
198
- outputs=[status],
199
- queue=False
200
- ).then(
201
- fn=generate_solution,
202
- inputs=[api_key, problem_input],
203
- outputs=[solution_output],
204
- queue=True
205
- ).success(
206
- fn=lambda: "Solution generated successfully!",
207
- inputs=None,
208
- outputs=[status]
209
- ).error(
210
- fn=lambda: "An error occurred. Please check your inputs and try again.",
211
- inputs=None,
212
- outputs=[status]
213
  )
214
 
 
215
  if __name__ == "__main__":
216
- try:
217
- print("Starting Competitive Programming Assistant...")
218
- app.launch(server_port=7860, share=True, debug=True)
219
- except Exception as e:
220
- print(f"Error launching app: {str(e)}")
 
1
  import gradio as gr
2
+ import os
3
+ from openai import OpenAI
4
  import time
5
+ import markdown
6
 
7
+ def solve_competitive_problem(problem_statement, language_choice, api_key):
8
+ """
9
+ Generate a solution for a competitive programming problem
 
 
 
 
 
 
 
 
 
 
 
10
 
11
+ Args:
12
+ problem_statement (str): The problem statement
13
+ language_choice (str): Programming language for the solution
14
+ api_key (str): OpenRouter API key
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
+ Returns:
17
+ str: Step-by-step solution with code
18
+ """
19
+ if not api_key.strip():
20
+ return "Error: Please provide your OpenRouter API key."
21
 
22
+ if not problem_statement.strip():
23
+ return "Error: Please provide a problem statement."
 
 
 
24
 
 
25
  try:
26
+ # Initialize OpenAI client with OpenRouter base URL
27
  client = OpenAI(
28
  base_url="https://openrouter.ai/api/v1",
29
+ api_key=api_key,
30
  )
31
 
32
+ # Create prompt with language preference
33
+ prompt = f"""
34
+ You are an expert competitive programmer. Analyze the following problem and provide a step-by-step solution with explanations and code in {language_choice}.
35
+
36
+ Problem:
37
+ {problem_statement}
38
+
39
+ Your response should include:
40
+ 1. Problem Analysis: Break down the problem statement and identify the key challenges
41
+ 2. Approach: Describe your approach to solve the problem and why it's optimal
42
+ 3. Algorithm: Explain the algorithm you'll use with time and space complexity analysis
43
+ 4. Implementation: Write clean, efficient, and well-commented {language_choice} code
44
+ 5. Testing: Explain how to test the solution with example inputs/outputs
45
+ """
46
+
47
+ # Call the model
48
  completion = client.chat.completions.create(
49
+ extra_headers={
50
+ "HTTP-Referer": "https://competitive-programming-assistant.app",
51
+ "X-Title": "Competitive Programming Assistant",
52
+ },
53
  model="open-r1/olympiccoder-7b:free",
54
  messages=[
 
 
 
 
55
  {
56
  "role": "user",
57
+ "content": prompt
58
  }
59
  ],
60
+ temperature=0.7,
61
+ stream=False
62
  )
63
 
64
+ solution = completion.choices[0].message.content
65
+ return solution
 
 
 
66
 
 
 
 
67
  except Exception as e:
68
+ return f"Error: {str(e)}"
 
 
69
 
70
+ # Create a Gradio interface
71
+ with gr.Blocks(title="Competitive Programming Assistant", theme=gr.themes.Soft()) as app:
72
+ gr.Markdown("""
73
+ # 🏆 Competitive Programming Assistant
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
 
75
+ Upload a problem statement from Codeforces, LeetCode, or any competitive programming platform to get:
76
+ - Step-by-step analysis
77
+ - Optimal solution approach
78
+ - Complete code implementation
79
+ - Time and space complexity analysis
80
 
81
+ Powered by the OlympicCoder model.
82
+ """)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
 
84
  with gr.Row():
85
+ with gr.Column(scale=2):
86
+ api_key_input = gr.Textbox(
87
+ placeholder="Enter your OpenRouter API key here",
88
  label="OpenRouter API Key",
89
+ type="password"
 
 
90
  )
91
 
92
+ problem_input = gr.Textbox(
93
+ placeholder="Paste your competitive programming problem statement here...",
94
+ label="Problem Statement",
95
+ lines=10
96
+ )
97
 
98
+ language = gr.Dropdown(
99
+ choices=["Python", "C++", "Java", "JavaScript"],
100
+ value="Python",
101
+ label="Programming Language"
102
+ )
103
+
104
+ submit_btn = gr.Button("Generate Solution", variant="primary")
105
+
106
+ with gr.Column(scale=3):
107
+ solution_output = gr.Markdown(
108
+ label="Generated Solution"
109
  )
110
 
111
+ with gr.Accordion("About", open=False):
112
+ gr.Markdown("""
113
+ ### How to use this app:
114
+
115
+ 1. Enter your OpenRouter API key (get one at [openrouter.ai](https://openrouter.ai))
116
+ 2. Paste the complete problem statement
117
+ 3. Select your preferred programming language
118
+ 4. Click "Generate Solution"
119
+
120
+ ### Tips for best results:
121
+
122
+ - Include the entire problem, including input/output formats and constraints
123
+ - Make sure to include example inputs and outputs
124
+ - For complex problems, consider adding clarifying notes
125
+ """)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
 
127
+ # Handle form submission
128
  submit_btn.click(
129
+ solve_competitive_problem,
130
+ inputs=[problem_input, language, api_key_input],
131
+ outputs=solution_output
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  )
133
 
134
+ # Launch the app
135
  if __name__ == "__main__":
136
+ app.launch()