From 237a1dfb535490eba4673242cef4826c943e045f Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Mon, 26 Oct 2026 10:32:31 -0300 Subject: [PATCH] feat(agent): add automatic web search and rename uploads dir to workspace - Add WEB_SEARCH_ENABLED and WEB_SEARCH_MAX_RESULTS config options - Detect search-intent messages via trigger keywords and inject web results into the AI context - Instruct the system prompt to use web search for factual, current, or time-sensitive questions instead of inventing data - Rename uploads directory from `uploadsfiles/` to `workspace/`, updating .gitignore and backup instructions in DEPLOY.md --- .env | 4 ++ .gitignore | 2 +- DEPLOY.md | 4 +- __pycache__/psagentai_agent.cpython-311.pyc | Bin 230520 -> 233313 bytes psagentai_agent.py | 69 +++++++++++++++++++- 5 files changed, 75 insertions(+), 4 deletions(-) diff --git a/.env b/.env index 81b4287..9230aa2 100755 --- a/.env +++ b/.env @@ -35,6 +35,10 @@ MAX_INTERVAL_MINUTES=90 # Maximum conversation history length per context (messages) MAX_HISTORY_LENGTH=50 +# Enable automatic web search when needed +WEB_SEARCH_ENABLED=true +WEB_SEARCH_MAX_RESULTS=5 + # Upload file context max characters sent to AI (0 = no truncation) UPLOAD_CONTEXT_MAX_CHARS=0 diff --git a/.gitignore b/.gitignore index 81fece3..f2c1ee0 100755 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -uploadsfiles/ +workspace/ uploads_metadata.json \ No newline at end of file diff --git a/DEPLOY.md b/DEPLOY.md index 1a3f320..d9053e2 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -216,12 +216,12 @@ Faça backup regular dos arquivos de dados dentro de `/app`: - `system_improvements.json` - `uploads_metadata.json` - pasta `contexts/` -- pasta `uploadsfiles/` +- pasta `workspace/` Exemplo simples de backup diário: ```bash -tar czf /root/backups/psagentai-$(date +%F).tar.gz -C /opt/psagentai/app user_profile.json agent_profile.json system_improvements.json uploads_metadata.json contexts uploadsfiles +tar czf /root/backups/psagentai-$(date +%F).tar.gz -C /opt/psagentai/app user_profile.json agent_profile.json system_improvements.json uploads_metadata.json contexts workspace ``` --- diff --git a/__pycache__/psagentai_agent.cpython-311.pyc b/__pycache__/psagentai_agent.cpython-311.pyc index b2880a2b5201b0efd3e93d1ed376fac54923fe51..c34347fe9f7d54c86f0d73c6dd4b008b20cc14d3 100644 GIT binary patch delta 36591 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 delta 34271 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 d( Optional[Dict[str, Any]]: return None +_WEB_SEARCH_TRIGGERS = [ + "pesquise", + "pesquisa", + "busque", + "buscar", + "procure", + "procurar", + "na internet", + "internet", + "web", + "google", + "o que é", + "quem é", + "qual a", + "qual o", + "como funciona", + "notícia", + "noticias", + "notícias", + "atualidade", + "atual", + "hoje", + "agora", + "tempo real", + "tempo real", + "previsão", + "clima", + "tempo", + "onde fica", + "onde é", + "localização", + "localizacao", + "mapa", + "endereço", + "endereco", +] + + +def _looks_like_search_request(user_message: str) -> bool: + q = user_message.lower().strip() + if len(q.split()) < 2: + return False + return any(t in q for t in _WEB_SEARCH_TRIGGERS) + + def get_all_uploads_for_chat(chat_id: int) -> Dict[str, Dict[str, Any]]: meta = load_uploads_metadata() return {fn: info for fn, info in meta.items() if info.get("chat_id") == chat_id} @@ -1330,6 +1377,12 @@ def build_system_prompt(profile: Dict[str, Any]) -> str: prompt += f"\n\nData atual: {current_date}." prompt += f"\nHora atual: {current_time} ({time_period})." prompt += f"\nFuso horário configurado: {tz}." + prompt += ( + "\n\nIMPORTANTE SOBRE INFORMAÇÕES ATUALIZADAS:" + "\n- Se a pergunta do usuário pedir algo factual, atual, notícia, previsão do tempo, cotação, data futura/passada, horário de funcionamento, endereço atualizado, etc., USE A BUSCA NA INTERNET para responder." + "\n- Não invente dados, não use conhecimento desatualizado." + "\n- Se não tiver acesso a busca, diga que não pode consultar agora." + ) except Exception: pass prompt += f"\n\nIMPORTANTE: Seu nome é {agent_name} e ele nunca muda. Se houver mensagens antigas no histórico onde você usou outro nome, ignore-as — o nome correto é {agent_name}. Sempre se apresente como {agent_name}." @@ -3887,6 +3940,20 @@ async def process_text_message(update: Update, context: ContextTypes.DEFAULT_TYP else: modified = user_message + if WEB_SEARCH_ENABLED and _looks_like_search_request(user_message): + search_query = user_message + for prefix in ["pesquise", "pesquisa", "busque", "buscar", "procure", "procurar", "me diga", "me informe", "qual", "quem", "como", "onde", "quando", "por que"]: + if search_query.lower().startswith(prefix): + search_query = search_query[len(prefix):].strip(" :,-") + break + if search_query: + web_results = _web_search(search_query, max_results=WEB_SEARCH_MAX_RESULTS) + if web_results: + web_context = "\n\nResultados da busca na internet:\n" + for i, result in enumerate(web_results, 1): + web_context += f"{i}. {result.get('title', '')}\nURL: {result.get('url', '')}\n" + modified = modified + "\n\n" + web_context + response = await get_psagentai_response(modified) if response: add_to_context("assistant", response)