diff --git a/GenAI/proxy/app.py b/GenAI/proxy/app.py new file mode 100644 index 0000000..14be431 --- /dev/null +++ b/GenAI/proxy/app.py @@ -0,0 +1,120 @@ +from flask import Flask, request, jsonify +import oci +import requests + +app = Flask(__name__) + +# Função para carregar configurações do arquivo +def load_config(config_file="/home/app/credentials.conf"): + config = {} + try: + with open(config_file, 'r') as f: + for line in f: + line = line.strip() + if line and not line.startswith('#'): # Ignora linhas vazias e comentários + key, value = line.split('=', 1) + config[key.strip()] = value.strip() + return config + except FileNotFoundError: + raise FileNotFoundError(f"Arquivo de configuração '{config_file}' não encontrado") + except Exception as e: + raise Exception(f"Erro ao carregar configuração: {str(e)}") + +# Carrega configuração do arquivo +config = load_config() + +# Modo de teste (define se deve usar credenciais reais ou simuladas) +TEST_MODE = config.get("test_mode", "false").lower() == "true" + +# Cria o signer do OCI (apenas se não estiver em modo de teste) +signer = None +if not TEST_MODE: + try: + signer = oci.signer.Signer( + tenancy=config.get("tenancy"), + user=config.get("user"), + fingerprint=config.get("fingerprint"), + private_key_file_location=config.get("key_file"), + pass_phrase=config.get("pass_phrase"), + private_key_content=config.get("key_content"), + ) + except Exception as e: + print(f"Erro ao inicializar signer OCI: {e}") + print("Executando em modo de teste...") + TEST_MODE = True + +# Funções de interação com o agente (adaptadas do agent_proxy.py) +def new_session_agent(region, agent_endpoint_id): + if TEST_MODE: + # Retorna uma resposta simulada em modo de teste + return {"id": f"test_session_{agent_endpoint_id[:8]}"} + + session = requests.Session() + session.auth = signer + url = ( + f"https://agent-runtime.generativeai.{region}.oci.oraclecloud.com/20240531/agentEndpoints/{agent_endpoint_id}/sessions" + ) + payload = { + "description": "", + "displayName": "", + "idleTimeoutInSeconds": "1200" + } + resp = session.post(url, json=payload) + resp.raise_for_status() # Levanta um erro para status codes 4xx/5xx + return resp.json() + +def ask_agent(region, agent_endpoint_id, session_id, user_message): + if TEST_MODE: + # Retorna uma resposta simulada em modo de teste + return { + "message": f"Resposta simulada para: {user_message}", + "sessionId": session_id, + "timestamp": "2024-01-01T00:00:00Z" + } + + session = requests.Session() + session.auth = signer + base_url = f"https://agent-runtime.generativeai.{region}.oci.oraclecloud.com/20240531" + chat_url = f"{base_url}/agentEndpoints/{agent_endpoint_id}/actions/chat" + payload = { + "userMessage": user_message, + "shouldStream": False, + "sessionId": session_id + } + response = session.post(chat_url, json=payload) + response.raise_for_status() # Levanta um erro para status codes 4xx/5xx + return response.json() + + +# Endpoint para teste +@app.route("/", methods=["GET"]) +def test(): + return jsonify({"test":"ok"}) + +# Endpoint para criar nova sessão +@app.route("/genai-agent///new-session", methods=["GET"]) +def new_session(region, agent_endpoint_id): + try: + response_data = new_session_agent(region, agent_endpoint_id) + return jsonify({"sessionId": response_data.get("id")}) + except requests.exceptions.RequestException as e: + print(str(e)) + return jsonify({"error": str(e)}), 400 + +# Endpoint para chat com o agente +@app.route("/genai-agent////chat", methods=["POST"]) +def agent_chat(region, agent_endpoint_id, session_id): + data = request.get_json() + user_message = data.get("userMessage") + if not all([user_message]): + print("missing userMessage") + return jsonify({"error": "userMessage é obrigatório"}), 400 + try: + response_data = ask_agent(region, agent_endpoint_id, session_id, user_message) + return jsonify({"agentResponse": response_data}) + except requests.exceptions.RequestException as e: + print(str(e)) + return jsonify({"error": str(e)}), 400 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=8000)