Spaces:
Running
Running
File size: 16,860 Bytes
68144c6 |
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 |
import gradio as gr
import os
import json
import requests
from huggingface_hub import InferenceClient
# Configuração da API HuggingFace
HF_TOKEN = os.environ.get('HF_TOKEN', '') # Token pode ser configurado como variável de ambiente
DEFAULT_CODE_MODEL = "bigcode/starcoder2-15b" # Modelo padrão para análise de código
def get_hf_client():
"""
Cria e retorna um cliente de inferência HuggingFace
"""
try:
client = InferenceClient(
model=DEFAULT_CODE_MODEL,
token=HF_TOKEN
)
return client
except Exception as e:
print(f"Erro ao criar cliente HuggingFace: {str(e)}")
return None
def analyze_code(code, language="python", model_id=DEFAULT_CODE_MODEL):
"""
Analisa código usando a API HuggingFace
"""
if not code:
return {
'success': False,
'message': 'É necessário fornecer o código para análise',
'analysis': None,
'language': language
}
try:
# Criar prompt para análise de código
prompt = f"""
Analise o seguinte código {language}:
```{language}
{code}
```
Por favor, forneça:
1. Uma análise geral da qualidade do código
2. Identificação de possíveis bugs ou problemas
3. Sugestões de melhoria e boas práticas
4. Avaliação de segurança (se aplicável)
"""
# Usar cliente HuggingFace para análise
client = get_hf_client()
if not client:
# Fallback para análise simulada se o cliente não estiver disponível
return {
'success': True,
'message': 'Análise de código realizada localmente (API HuggingFace não disponível)',
'analysis': {
'quality': 'Não foi possível conectar à API HuggingFace. Esta é uma análise simulada.',
'issues': ['API HuggingFace não disponível - token não configurado ou serviço indisponível'],
'suggestions': ['Configure o token HuggingFace como variável de ambiente para análise completa'],
'security': 'Não avaliado'
},
'language': language
}
# Fazer a chamada à API
response = client.text_generation(
prompt,
max_new_tokens=500,
temperature=0.3,
top_p=0.95,
repetition_penalty=1.2
)
# Processar a resposta
analysis_text = response
# Tentar extrair seções da resposta
quality = "Análise realizada com sucesso"
issues = []
suggestions = []
security = "Verificado"
# Análise básica do texto para extrair seções
if "qualidade" in analysis_text.lower():
quality_section = analysis_text.lower().split("qualidade")[1].split("\n")[0]
quality = quality_section[:100] + "..." if len(quality_section) > 100 else quality_section
if "problemas" in analysis_text.lower() or "bugs" in analysis_text.lower():
issues_text = analysis_text.lower().split("problemas")[1].split("sugestões")[0] if "problemas" in analysis_text.lower() else analysis_text.lower().split("bugs")[1].split("sugestões")[0]
issues = [issue.strip() for issue in issues_text.split("-") if issue.strip()]
if "sugestões" in analysis_text.lower():
suggestions_text = analysis_text.lower().split("sugestões")[1].split("segurança")[0] if "segurança" in analysis_text.lower() else analysis_text.lower().split("sugestões")[1]
suggestions = [suggestion.strip() for suggestion in suggestions_text.split("-") if suggestion.strip()]
if "segurança" in analysis_text.lower():
security_section = analysis_text.lower().split("segurança")[1].split("\n")[0]
security = security_section[:100] + "..." if len(security_section) > 100 else security_section
analysis = {
'raw_response': analysis_text,
'quality': quality,
'issues': issues[:5], # Limitar a 5 issues
'suggestions': suggestions[:5], # Limitar a 5 sugestões
'security': security
}
return {
'success': True,
'message': 'Código analisado com sucesso',
'analysis': analysis,
'language': language
}
except Exception as e:
return {
'success': False,
'message': f'Erro ao analisar código: {str(e)}',
'analysis': None,
'language': language
}
def get_supported_models():
"""
Retorna lista de modelos suportados para análise de código
"""
# Lista de modelos recomendados para análise de código
models = [
{
"id": "bigcode/starcoder2-15b",
"name": "StarCoder 2 (15B)",
"description": "Modelo especializado em código com 15B de parâmetros",
"languages": ["python", "javascript", "java", "c++", "php", "ruby", "go", "rust"]
},
{
"id": "bigcode/starcoder2-7b",
"name": "StarCoder 2 (7B)",
"description": "Versão mais leve do StarCoder com 7B de parâmetros",
"languages": ["python", "javascript", "java", "c++", "php", "ruby", "go", "rust"]
},
{
"id": "microsoft/codebert-base",
"name": "CodeBERT",
"description": "Modelo pré-treinado para compreensão de código",
"languages": ["python", "javascript", "java", "c#", "php", "go"]
}
]
return models
def generate_app_structure(prompt):
"""
Gera estrutura de aplicação com base no prompt usando a API HuggingFace
"""
try:
client = get_hf_client()
if not client:
# Fallback para geração simulada
return {
"type": "web_application",
"components": [
{
"type": "frontend",
"framework": "React",
"pages": [
{"name": "Home", "path": "/"},
{"name": "About", "path": "/about"},
{"name": "Contact", "path": "/contact"}
]
},
{
"type": "backend",
"framework": "Flask",
"endpoints": [
{"path": "/api/data", "method": "GET"},
{"path": "/api/submit", "method": "POST"}
]
}
],
"description": f"Aplicação gerada com base no prompt: {prompt}"
}
# Criar prompt para geração de estrutura
generation_prompt = f"""
Crie uma estrutura de aplicação web com base na seguinte descrição:
"{prompt}"
Responda apenas com um objeto JSON válido com a seguinte estrutura:
{{
"type": "web_application",
"components": [
{{
"type": "frontend",
"framework": "string",
"pages": [
{{"name": "string", "path": "string"}}
]
}},
{{
"type": "backend",
"framework": "string",
"endpoints": [
{{"path": "string", "method": "string"}}
]
}}
],
"description": "string"
}}
"""
# Fazer a chamada à API
response = client.text_generation(
generation_prompt,
max_new_tokens=800,
temperature=0.7,
top_p=0.95
)
# Tentar extrair JSON da resposta
try:
# Encontrar o início e fim do JSON na resposta
start_idx = response.find('{')
end_idx = response.rfind('}') + 1
if start_idx >= 0 and end_idx > start_idx:
json_str = response[start_idx:end_idx]
app_structure = json.loads(json_str)
return app_structure
else:
# Fallback para estrutura padrão
return {
"type": "web_application",
"components": [
{
"type": "frontend",
"framework": "React",
"pages": [
{"name": "Home", "path": "/"},
{"name": "Dashboard", "path": "/dashboard"}
]
},
{
"type": "backend",
"framework": "Flask",
"endpoints": [
{"path": "/api/data", "method": "GET"},
{"path": "/api/submit", "method": "POST"}
]
}
],
"description": f"Aplicação gerada com base no prompt: {prompt}"
}
except:
# Fallback para estrutura padrão em caso de erro no parsing
return {
"type": "web_application",
"components": [
{
"type": "frontend",
"framework": "React",
"pages": [
{"name": "Home", "path": "/"},
{"name": "Features", "path": "/features"}
]
},
{
"type": "backend",
"framework": "Flask",
"endpoints": [
{"path": "/api/data", "method": "GET"}
]
}
],
"description": f"Aplicação gerada com base no prompt: {prompt}"
}
except Exception as e:
# Estrutura padrão em caso de erro
return {
"type": "web_application",
"components": [
{
"type": "frontend",
"framework": "React",
"pages": [
{"name": "Home", "path": "/"}
]
},
{
"type": "backend",
"framework": "Flask",
"endpoints": [
{"path": "/api/data", "method": "GET"}
]
}
],
"description": f"Erro na geração: {str(e)}"
}
# Interface Gradio para análise de código
def code_analysis_interface(code, language, model_id):
result = analyze_code(code, language, model_id)
if not result['success']:
return f"Erro: {result['message']}"
analysis = result['analysis']
output = f"## Análise de Código ({language})\n\n"
output += f"### Qualidade Geral\n{analysis['quality']}\n\n"
if analysis['issues']:
output += "### Problemas Identificados\n"
for issue in analysis['issues']:
output += f"- {issue}\n"
output += "\n"
if analysis['suggestions']:
output += "### Sugestões de Melhoria\n"
for suggestion in analysis['suggestions']:
output += f"- {suggestion}\n"
output += "\n"
output += f"### Segurança\n{analysis['security']}\n\n"
return output
# Interface Gradio para geração de aplicação
def app_generation_interface(prompt):
app_structure = generate_app_structure(prompt)
output = f"## Aplicação Gerada\n\n"
output += f"### Descrição\n{app_structure['description']}\n\n"
output += "### Estrutura\n"
output += f"Tipo: {app_structure['type']}\n\n"
for component in app_structure['components']:
output += f"#### {component['type'].capitalize()}\n"
output += f"Framework: {component['framework']}\n\n"
if component['type'] == 'frontend':
output += "Páginas:\n"
for page in component['pages']:
output += f"- {page['name']}: {page['path']}\n"
output += "\n"
if component['type'] == 'backend':
output += "Endpoints:\n"
for endpoint in component['endpoints']:
output += f"- {endpoint['path']} ({endpoint['method']})\n"
output += "\n"
return output
# Interface principal
with gr.Blocks(title="App Generator - IA Real") as demo:
gr.Markdown("# App Generator - Crie aplicações com IA")
gr.Markdown("Crie aplicações incríveis com IA, a partir de prompts, imagens ou ficheiros")
with gr.Tabs():
with gr.TabItem("Gerador de Aplicações"):
with gr.Row():
with gr.Column():
prompt_input = gr.Textbox(
label="Descrição da Aplicação",
placeholder="Ex: Uma aplicação de lista de tarefas com autenticação de utilizadores",
lines=5
)
generate_btn = gr.Button("Gerar Aplicação")
app_output = gr.Markdown(label="Resultado")
generate_btn.click(
fn=app_generation_interface,
inputs=[prompt_input],
outputs=[app_output]
)
with gr.TabItem("Análise de Código"):
with gr.Row():
with gr.Column(scale=2):
language_select = gr.Dropdown(
choices=["python", "javascript", "java", "c++", "php", "ruby", "go", "rust"],
value="python",
label="Linguagem"
)
code_input = gr.Textbox(
label="Código para Análise",
placeholder="Cole seu código aqui para análise...",
lines=10
)
model_select = gr.Dropdown(
choices=[
"bigcode/starcoder2-15b",
"bigcode/starcoder2-7b",
"microsoft/codebert-base"
],
value="bigcode/starcoder2-15b",
label="Modelo de IA"
)
analyze_btn = gr.Button("Analisar Código")
analysis_output = gr.Markdown(label="Resultado da Análise")
analyze_btn.click(
fn=code_analysis_interface,
inputs=[code_input, language_select, model_select],
outputs=[analysis_output]
)
with gr.Column(scale=1):
gr.Markdown("### Sobre a Análise de Código")
gr.Markdown("""
Esta funcionalidade utiliza a API HuggingFace para analisar código em tempo real.
**Modelos disponíveis:**
- StarCoder 2 (15B): Modelo especializado em código com 15B de parâmetros
- StarCoder 2 (7B): Versão mais leve do StarCoder
- CodeBERT: Modelo pré-treinado para compreensão de código
**Linguagens suportadas:**
Python, JavaScript, Java, C++, PHP, Ruby, Go, Rust
Para resultados mais precisos, configure um token HuggingFace nas variáveis de ambiente.
""")
gr.Markdown("### Sobre o App Generator")
gr.Markdown("""
App Generator é uma aplicação open source que utiliza IA para gerar estruturas de aplicações e analisar código.
Desenvolvido com Gradio e HuggingFace, este projeto é totalmente gratuito e open source.
© 2025 App Generator - Licenciado sob MIT License
""")
# Iniciar a aplicação
demo.launch()
|