Update app.py
Browse files
app.py
CHANGED
@@ -77,30 +77,25 @@ custom_css = """
|
|
77 |
--text-color: #1e293b;
|
78 |
--border-color: #e2e8f0;
|
79 |
}
|
80 |
-
|
81 |
body {
|
82 |
background-color: var(--background-color);
|
83 |
color: var(--text-color);
|
84 |
}
|
85 |
-
|
86 |
.container {
|
87 |
max-width: 1200px;
|
88 |
margin: 0 auto;
|
89 |
padding: 20px;
|
90 |
}
|
91 |
-
|
92 |
.analysis-box {
|
93 |
background-color: white;
|
94 |
border-radius: 12px;
|
95 |
padding: 24px;
|
96 |
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
|
97 |
border: 1px solid var(--border-color);
|
98 |
-
height:
|
99 |
overflow-y: auto;
|
100 |
width: 100%;
|
101 |
-
transition: height 0.3s ease;
|
102 |
}
|
103 |
-
|
104 |
.upload-box {
|
105 |
background-color: white;
|
106 |
border-radius: 12px;
|
@@ -109,7 +104,6 @@ body {
|
|
109 |
border: 1px solid var(--border-color);
|
110 |
width: 100%;
|
111 |
}
|
112 |
-
|
113 |
.primary-button {
|
114 |
background-color: var(--primary-color) !important;
|
115 |
color: white !important;
|
@@ -118,57 +112,30 @@ body {
|
|
118 |
font-weight: 500 !important;
|
119 |
width: 100%;
|
120 |
}
|
121 |
-
|
122 |
.primary-button:hover {
|
123 |
background-color: var(--secondary-color) !important;
|
124 |
}
|
125 |
-
|
126 |
.markdown-container {
|
127 |
max-width: 100%;
|
128 |
margin: 0 auto;
|
129 |
padding: 0 15px;
|
130 |
word-wrap: break-word;
|
131 |
}
|
132 |
-
|
133 |
-
.loading-container {
|
134 |
-
display: flex;
|
135 |
-
justify-content: center;
|
136 |
-
align-items: center;
|
137 |
-
height: 100%;
|
138 |
-
}
|
139 |
-
|
140 |
.loading-text {
|
141 |
color: var(--primary-color);
|
142 |
font-size: 1.2rem;
|
143 |
text-align: center;
|
144 |
margin-top: 2rem;
|
145 |
}
|
146 |
-
|
147 |
-
.loading-spinner {
|
148 |
-
border: 4px solid #f3f3f3;
|
149 |
-
border-top: 4px solid var(--primary-color);
|
150 |
-
border-radius: 50%;
|
151 |
-
width: 40px;
|
152 |
-
height: 40px;
|
153 |
-
animation: spin 1s linear infinite;
|
154 |
-
}
|
155 |
-
|
156 |
-
@keyframes spin {
|
157 |
-
0% { transform: rotate(0deg); }
|
158 |
-
100% { transform: rotate(360deg); }
|
159 |
-
}
|
160 |
-
|
161 |
.row {
|
162 |
display: flex;
|
163 |
flex-wrap: wrap;
|
164 |
gap: 20px;
|
165 |
}
|
166 |
-
|
167 |
.column {
|
168 |
flex: 1;
|
169 |
min-width: 300px;
|
170 |
}
|
171 |
-
|
172 |
@media (max-width: 768px) {
|
173 |
.row {
|
174 |
flex-direction: column;
|
@@ -180,14 +147,6 @@ body {
|
|
180 |
}
|
181 |
"""
|
182 |
|
183 |
-
# Loading HTML template
|
184 |
-
loading_html = """
|
185 |
-
<div class="loading-container">
|
186 |
-
<div class="loading-spinner"></div>
|
187 |
-
<div class="loading-text">Generating report...</div>
|
188 |
-
</div>
|
189 |
-
"""
|
190 |
-
|
191 |
# Gradio Interface
|
192 |
analyzer = ChartAnalyzer()
|
193 |
|
@@ -197,7 +156,7 @@ with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as demo:
|
|
197 |
gr.Markdown("""
|
198 |
<div style="text-align: center; margin-bottom: 32px;">
|
199 |
<h1 style="color: var(--primary-color); font-size: 2.5rem; margin-bottom: 16px;">
|
200 |
-
π
|
201 |
</h1>
|
202 |
<p style="color: var(--text-color); font-size: 1.1rem;">
|
203 |
Advanced AI-powered cryptocurrency technical analysis
|
@@ -227,17 +186,14 @@ with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as demo:
|
|
227 |
with gr.Column(elem_classes=["column"]):
|
228 |
with gr.Column(elem_classes=["analysis-box"]):
|
229 |
gr.Markdown("### π Analysis Report")
|
230 |
-
analysis_output = gr.
|
231 |
label="",
|
|
|
232 |
value="<div style='text-align:center; padding:20px; color:#666;'>Analysis report will appear here</div>"
|
233 |
)
|
234 |
|
235 |
# Event Handling
|
236 |
analyze_btn.click(
|
237 |
-
fn=lambda: loading_html, # Show loading spinner immediately
|
238 |
-
outputs=analysis_output,
|
239 |
-
queue=False
|
240 |
-
).then(
|
241 |
fn=analyzer.analyze_chart,
|
242 |
inputs=chart_input,
|
243 |
outputs=analysis_output,
|
|
|
77 |
--text-color: #1e293b;
|
78 |
--border-color: #e2e8f0;
|
79 |
}
|
|
|
80 |
body {
|
81 |
background-color: var(--background-color);
|
82 |
color: var(--text-color);
|
83 |
}
|
|
|
84 |
.container {
|
85 |
max-width: 1200px;
|
86 |
margin: 0 auto;
|
87 |
padding: 20px;
|
88 |
}
|
|
|
89 |
.analysis-box {
|
90 |
background-color: white;
|
91 |
border-radius: 12px;
|
92 |
padding: 24px;
|
93 |
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
|
94 |
border: 1px solid var(--border-color);
|
95 |
+
height: 600px;
|
96 |
overflow-y: auto;
|
97 |
width: 100%;
|
|
|
98 |
}
|
|
|
99 |
.upload-box {
|
100 |
background-color: white;
|
101 |
border-radius: 12px;
|
|
|
104 |
border: 1px solid var(--border-color);
|
105 |
width: 100%;
|
106 |
}
|
|
|
107 |
.primary-button {
|
108 |
background-color: var(--primary-color) !important;
|
109 |
color: white !important;
|
|
|
112 |
font-weight: 500 !important;
|
113 |
width: 100%;
|
114 |
}
|
|
|
115 |
.primary-button:hover {
|
116 |
background-color: var(--secondary-color) !important;
|
117 |
}
|
|
|
118 |
.markdown-container {
|
119 |
max-width: 100%;
|
120 |
margin: 0 auto;
|
121 |
padding: 0 15px;
|
122 |
word-wrap: break-word;
|
123 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
.loading-text {
|
125 |
color: var(--primary-color);
|
126 |
font-size: 1.2rem;
|
127 |
text-align: center;
|
128 |
margin-top: 2rem;
|
129 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
.row {
|
131 |
display: flex;
|
132 |
flex-wrap: wrap;
|
133 |
gap: 20px;
|
134 |
}
|
|
|
135 |
.column {
|
136 |
flex: 1;
|
137 |
min-width: 300px;
|
138 |
}
|
|
|
139 |
@media (max-width: 768px) {
|
140 |
.row {
|
141 |
flex-direction: column;
|
|
|
147 |
}
|
148 |
"""
|
149 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
150 |
# Gradio Interface
|
151 |
analyzer = ChartAnalyzer()
|
152 |
|
|
|
156 |
gr.Markdown("""
|
157 |
<div style="text-align: center; margin-bottom: 32px;">
|
158 |
<h1 style="color: var(--primary-color); font-size: 2.5rem; margin-bottom: 16px;">
|
159 |
+
π HundAI Q-Agent Vision
|
160 |
</h1>
|
161 |
<p style="color: var(--text-color); font-size: 1.1rem;">
|
162 |
Advanced AI-powered cryptocurrency technical analysis
|
|
|
186 |
with gr.Column(elem_classes=["column"]):
|
187 |
with gr.Column(elem_classes=["analysis-box"]):
|
188 |
gr.Markdown("### π Analysis Report")
|
189 |
+
analysis_output = gr.Markdown(
|
190 |
label="",
|
191 |
+
elem_classes=["markdown-container"],
|
192 |
value="<div style='text-align:center; padding:20px; color:#666;'>Analysis report will appear here</div>"
|
193 |
)
|
194 |
|
195 |
# Event Handling
|
196 |
analyze_btn.click(
|
|
|
|
|
|
|
|
|
197 |
fn=analyzer.analyze_chart,
|
198 |
inputs=chart_input,
|
199 |
outputs=analysis_output,
|