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()