JimmyNewton's picture
Upload 3 files
68144c6 verified
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()