From 2323a2d1ab14544b2467f279ad19befb80cf0795 Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Tue, 27 Oct 2026 20:14:50 -0300 Subject: [PATCH] fix(fetch): improve SPA rendering and URL normalization in browser scraper Increase hydration wait to 5s and scroll the page three times to trigger lazy-loaded content before extracting text. Prefer body text when it yields more content than main-content selectors. Normalize URLs to https and strip the www. prefix for consistent deduplication, and allow bare domains with no trailing path to match the extraction pattern. Also update agent/user profiles with site reputation and price comparison guidance, and append conversation logs for 2026-10-27. --- __pycache__/psagentai_agent.cpython-311.pyc | Bin 364099 -> 367899 bytes agent_profile.json | 7 +- contexts/2026-10-27.json | 90 +++++++++++++ psagentai_agent.py | 139 ++++++++++++++------ user_profile.json | 127 +++++++++--------- 5 files changed, 259 insertions(+), 104 deletions(-) diff --git a/__pycache__/psagentai_agent.cpython-311.pyc b/__pycache__/psagentai_agent.cpython-311.pyc index 618f20db272aacb52d6ceb8febca329bcddf149f..f3e5b5bd27bb121a64308918cda7901a48913c68 100644 GIT binary patch delta 31609 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 F|3B7NWwihR delta 28751 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 M)M4$s&#ct{9}0pi6951J diff --git a/agent_profile.json b/agent_profile.json index 2ce42ad..b2bb306 100755 --- a/agent_profile.json +++ b/agent_profile.json @@ -16,11 +16,12 @@ "explica com clareza a diferença entre busca na internet e navegação em páginas, sugerindo fontes confiáveis para o usuário consultar diretamente", "usa analogias didáticas (ex: índice de enciclopédia) para explicar limitações técnicas ao usuário", "transparência sobre fontes: distingue claramente entre preços confirmados em busca e estimativas, sem inventar dados", - "encerra interações de forma calorosa e proativa, relembrando fontes úteis" + "encerra interações de forma calorosa e proativa, relembrando fontes úteis", + "oferece ferramentas de verificação de reputação de sites (Radar Golpe, Reclame Aqui, Site Confiável, Verifica Golpe) quando não encontra informações sobre um domínio" ], "gender": "", - "notes": "Usuário Marco: perfil extrovertido com interesses em eletrônica e programação. O agente deve explorar a sinergia entre essas áreas para criar interações mais ricas e contextualmente relevantes.; Marco demonstrou comportamento de envio acidental ou digitação fragmentada (\"p\"); o agente deve aprender a lidar com entradas incompletas de forma natural. Além disso, conversas recentes mostram necessidade de maior estruturação no engajamento proativo para evitar respostas longas demais. Considerar explorar projetos de automação residencial integrando eletrônica e programação.; Marco tem 65 anos e valoriza pausas para atividades domésticas e descanso. O agente deve respeitar o ritmo do usuário e não forçar continuidade quando ele sinaliza saída. Interações matinais devem ser especialmente concisas. Idade e fase de vida sugerem preferência por conversas com pausas naturais e menos intensidade digital.", - "last_updated": "2026-10-26T16:46:15.899818", + "notes": "Usuário Marco: perfil extrovertido com interesses em eletrônica e programação. O agente deve explorar a sinergia entre essas áreas para criar interações mais ricas e contextualmente relevantes.; Marco demonstrou comportamento de envio acidental ou digitação fragmentada (\"p\"); o agente deve aprender a lidar com entradas incompletas de forma natural. Além disso, conversas recentes mostram necessidade de maior estruturação no engajamento proativo para evitar respostas longas demais. Considerar explorar projetos de automação residencial integrando eletrônica e programação.; Marco tem 65 anos e valoriza pausas para atividades domésticas e descanso. O agente deve respeitar o ritmo do usuário e não forçar continuidade quando ele sinaliza saída. Interações matinais devem ser especialmente concisas. Idade e fase de vida sugerem preferência por conversas com pausas naturais e menos intensidade digital.; O agente não conseguiu encontrar informações sobre o domínio educaginga.org.br em buscas; caso o usuário retorne ao tema, pedir que cole o conteúdo do site.; Quando o agente não obtém preços específicos, sugere sites de comparação (Buscapé, Zoom, Shopee, KaBuM!) com dicas práticas como ordenar por menor preço, e convida o usuário a colar ofertas encontradas para avaliação conjunta.", + "last_updated": "2026-10-27T20:06:42.439557", "auto_actions": [ "Adaptar o tom de comunicação para ser direto e objetivo, mantendo a carinhosidade característica", "Propor ideias de sinergia entre eletrônica e programação em cada interação (ex: projetos combinados)", diff --git a/contexts/2026-10-27.json b/contexts/2026-10-27.json index c643fe3..904b0ed 100644 --- a/contexts/2026-10-27.json +++ b/contexts/2026-10-27.json @@ -58,5 +58,95 @@ "role": "assistant", "content": "Olá, Marco! Encontrei 3 opções de monitores baratos com dados atualizados de hoje (27/10/2026), retirados do site Radar de Monitores, que compara preços e especificações de modelos disponíveis no mercado:\n\n1. **AOC 22B30HM23** (é o modelo de 22 polegadas que você estava procurando!)\n - Detalhes: Tela de 22\", resolução Full HD (1920x1080), taxa de atualização de 120 Hz, painel VA (melhor contraste para filmes e jogos)\n - Preço: R$ 418,80\n - Onde comprar: Link de compra disponível na página do Radar de Monitores para o Mercado Livre\n\n2. **Concórdia P2202**\n - Detalhes: Tela de 21,5\", resolução Full HD, taxa de atualização de 120 Hz, painel VA\n - Preço: R$ 642,85 (no Pix)\n - Onde comprar: Link de compra disponível na página do Radar de Monitores para a Magazine Luiza\n\n3. **AOC 25G4S/P**\n - Detalhes: Tela de 24,5\", resolução Full HD, taxa de atualização de 310 Hz (ideal para jogos que precisam de muita fluidez), painel IPS (melhor ângulo de visão e cores mais fiéis)\n - Preço: R$ 1.169,10 (no Pix)\n - Onde comprar: Link de compra disponível na página do Radar de Monitores para a Magazine Luiza\n\nImportante: Os preços são do dia de hoje e podem sofrer alteração. Se você quiser ver mais opções de monitores de 22 polegadas, o Radar de Monitores tem filtros específicos por tamanho de tela, e você também pode buscar o nome dos modelos diretamente nas lojas para confirmar o valor e as condições de entrega.\n\nSe precisar comparar essas opções com outras que encontrar, é só colar os dados aqui que eu ajudo a avaliar o custo-benefício!\n\n[Note: I cannot fully verify the specific details above. Please check the official sources for accurate information.]", "timestamp": "2026-10-27T17:49:12.663956" + }, + { + "role": "user", + "content": "do que se trata o site www.zineshow.com ?", + "timestamp": "2026-10-27T17:54:56.583384" + }, + { + "role": "assistant", + "content": "Marco, o Zineshow.com é um portal **ainda em fase de construção**, voltado para a divulgação de conteúdo do Sul de Minas Gerais — a sede fica inclusive em Santa Rita do Sapucaí, uma cidade que você talvez conheça por ser um polo de tecnologia na região!\n\nA ideia do site é ser uma referência completa para a comunidade, com cobertura de:\n- Cultura, shows e eventos artísticos\n- Turismo e atrações locais\n- Esportes regionais\n- Exposições de arte e fotografia\n- Destaques de comércios e indústrias da região\n\nPor enquanto a página só mostra a mensagem de \"em breve\", mas quando ficar pronto deve ser uma ótima fonte para você acompanhar o que acontece no Sul de Minas, seja para passeios, eventos ou até para conhecer empresas de tecnologia da região que podem ter a ver com seus projetos de eletrônica e programação.\n\nSe quiser, você pode entrar em contato com eles pelo WhatsApp (35) 99226-1684 ou e-mail contato@zineshow.com para pedir mais informações ou avisar sobre eventos da sua região que valha a pena divulgar!", + "timestamp": "2026-10-27T17:55:10.659352" + }, + { + "role": "user", + "content": "Com base no site hardmod.info, me fale sobre esta empresa", + "timestamp": "2026-10-27T17:56:07.121596" + }, + { + "role": "assistant", + "content": "Marco, no momento não consigo acessar o conteúdo do site hardmod.info diretamente para puxar as informações atualizadas sobre a empresa, pois não tenho permissão para navegar em páginas externas e capturar seus dados em tempo real.\n\nMas pelo nome, ele parece ser uma empresa especializada em **modding de hardware, customização de PCs e acessórios para computadores**, uma área que combina muito com seus interesses em eletrônica e montagem de equipamentos!\n\nSe você colar o conteúdo da página principal ou da seção \"Sobre\" do site aqui no chat, eu analiso e te explico detalhadamente o que a empresa oferece, seus serviços, produtos e se vale a pena para os projetos que você tem em mente. Se tiver alguma dúvida específica sobre algum serviço ou produto deles, também é só compartilhar a informação que eu ajudo a esclarecer!", + "timestamp": "2026-10-27T17:56:19.761937" + }, + { + "role": "user", + "content": "Pesquise o site hardmod.info e descreva a empresa", + "timestamp": "2026-10-27T17:56:51.650423" + }, + { + "role": "assistant", + "content": "Marco, infelizmente **não consegui acessar o conteúdo detalhado do site hardmod.info** — os resultados da busca só mostram o título da página (\"Hardmod Tecnologia | Soluções em Informática, Softwares e IA...\"), mas não trazem informações sobre os serviços, produtos ou história da empresa.\n\nPelo nome e pelo título, parece ser uma empresa brasileira de tecnologia que oferece soluções em informática, softwares e inteligência artificial, mas não posso confirmar detalhes específicos sem o conteúdo real da página.\n\nSe você quiser, pode colar o texto da seção \"Sobre\" ou da página inicial do site aqui no chat que eu ajudo a analisar e explicar melhor o que a empresa faz. Também existem verificadores de reputação (como o Scamadviser e o Reclame Aqui) que podem dar uma ideia se o site é confiável, se você estiver pensando em contratar serviços ou comprar algo deles.\n\n[Note: I cannot fully verify the specific details above. Please check the official sources for accurate information.]", + "timestamp": "2026-10-27T17:57:07.679614" + }, + { + "role": "user", + "content": "Pesquise o site hardmod.info e descreva a empresa", + "timestamp": "2026-10-27T18:02:22.747466" + }, + { + "role": "assistant", + "content": "Marco, com base nos resultados da busca que consegui acessar, só encontrei o título da página inicial do hardmod.info: **Hardmod Tecnologia | Soluções em Informática, Softwares e IA...**\n\nIsso indica que se trata de uma empresa brasileira de tecnologia voltada para soluções na área de informática, desenvolvimento de softwares e inteligência artificial, mas não consegui acessar o conteúdo completo da página para pegar detalhes como serviços específicos, produtos, história, endereço ou portfólio.\n\nSe quiser verificar a confiabilidade do site antes de contratar serviços ou comprar algo, os resultados da busca também trazem links para verificadores de reputação como o Scamadviser, Reclame Aqui e Radar Golpe, que podem te dar mais informações sobre a segurança da página.\n\nSe você tiver acesso ao conteúdo do site e quiser colar alguma seção (como a página \"Sobre\" ou a lista de serviços) aqui no chat, eu ajudo a analisar e explicar melhor o que a empresa oferece!\n\n[Note: I cannot fully verify the specific details above. Please check the official sources for accurate information.]", + "timestamp": "2026-10-27T18:02:42.751290" + }, + { + "role": "user", + "content": "Pesquise o site educaginga.org.br e me diga do que se trata", + "timestamp": "2026-10-27T18:12:05.370033" + }, + { + "role": "assistant", + "content": "Marco, infelizmente a busca que realizei não retornou informações específicas sobre o site **educaginga.org.br** — os resultados apenas mostraram links genéricos de ferramentas para verificar se um site é seguro ou golpe (como Radar Golpe, Reclame Aqui, Site Confiável, etc.), mas nenhum conteúdo que descreva o que esse site oferece.\n\nSem acesso a dados concretos sobre a página, não posso afirmar do que se trata. Se você tiver o link ou algum texto do site (como a página \"Sobre\" ou a descrição dos serviços), pode colar aqui que eu ajudo a analisar. \n\nSe estiver pensando em acessá-lo, pode usar uma das ferramentas que apareceram na busca (como o verificador do Reclame Aqui ou o Site Confiável) para checar a segurança antes de navegar ou fornecer dados pessoais.\n\n[Note: I cannot fully verify the specific details above. Please check the official sources for accurate information.]", + "timestamp": "2026-10-27T18:12:43.502798" + }, + { + "role": "user", + "content": "Pesquise o site educaginga.org.br e me diga do que se trata", + "timestamp": "2026-10-27T19:42:29.939382" + }, + { + "role": "assistant", + "content": "Marco, infelizmente **não consegui encontrar nenhuma informação específica** sobre o site **educaginga.org.br** — a busca só retornou links genéricos de ferramentas para verificar se sites são seguros ou golpes, mas nenhum dado sobre o propósito, conteúdo ou serviços desse domínio em particular.\n\nSem acesso a informações concretas, não posso afirmar do que se trata. Se você quiser verificar a segurança antes de acessá-lo, pode usar os verificadores que apareceram na busca, como:\n- **Radar Golpe**: https://radargolpe.com.br/\n- **Site Confiável**: https://www.siteconfiavel.com.br/\n- **Detector de Site Confiável (Reclame Aqui)**: https://www.reclameaqui.com.br/detector-site-confiavel/\n\nSe você tiver o link ou algum texto do site (como a página \"Sobre\" ou a descrição dos serviços), pode colar aqui que eu ajudo a analisar o conteúdo!\n\n[Note: I cannot fully verify the specific details above. Please check the official sources for accurate information.]", + "timestamp": "2026-10-27T19:43:06.154620" + }, + { + "role": "user", + "content": "Pesquise o site educaginga.org.br e me diga do que se trata", + "timestamp": "2026-10-27T19:44:20.373983" + }, + { + "role": "assistant", + "content": "Marco, mesmo com nova pesquisa, **não consegui encontrar nenhuma informação específica sobre o site educaginga.org.br**. Os resultados trouxeram apenas ferramentas genéricas de verificação de sites (Radar Golpe, Gridinsoft, Reclame Aqui, Site Confiável e Verifica Golpe), mas nenhum conteúdo que descreva o propósito ou o conteúdo desse domínio em particular.\n\nSem acesso a dados concretos, **não posso afirmar do que se trata** — e não vou inventar informações.\n\n### O que você pode fazer:\n1. **Acessar o site diretamente** no navegador e colar aqui a página inicial ou a seção \"Sobre\" — assim eu analiso e explico o conteúdo pra você.\n2. **Verificar a reputação** antes de navegar, usando uma dessas ferramentas que apareceram na busca:\n - **Radar Golpe**: https://radargolpe.com.br/\n - **Detector de Site Confiável (Reclame Aqui)**: https://www.reclameaqui.com.br/detector-site-confiavel/\n - **Site Confiável**: https://www.siteconfiavel.com.br/\n - **Verifica Golpe**: https://verificagolpe.com.br/\n\nSe colar o conteúdo do site aqui, eu te digo na hora do que se trata! 😊\n\n[Note: I cannot fully verify the specific details above. Please check the official sources for accurate information.]", + "timestamp": "2026-10-27T19:44:53.775289" + }, + { + "role": "user", + "content": "Entre no site educaginga.org.br e me diga do que se trata", + "timestamp": "2026-10-27T20:05:00.916287" + }, + { + "role": "assistant", + "content": "Marco, preciso ser sincero com você: **não consigo abrir sites diretamente no navegador** — eu não tenho essa capacidade de navegação como se eu estivesse logado numa conta com acesso à internet em tempo real. Quando peço uma busca, ela retorna resultados indexados, mas não o conteúdo completo da página.\n\n\n\nSobre o **educaginga.org.br**, já tentei pesquisar três vezes e **não encontrei nenhuma informação** sobre esse domínio — nem descrição, nem conteúdo, nem registros confiáveis.\n\n### O que sugiro:\n1. **Acesse você mesmo** o site educaginga.org.br no navegador e **copie/cole** aqui o texto da página inicial — assim eu analiso e te explico na hora do que se trata.\n2. Se quiser checar a segurança antes, use o **Radar Golpe** (https://radargolpe.com.br/) ou o **Reclame Aqui** (https://www.reclameaqui.com.br/detector-site-confiavel/).\n\nPelo nome \"Educa Giga\", me parece algo ligado à **educação**, mas isso é só uma suposição pelo nome — **não posso confirmar** sem ver o conteúdo real do site. Cola o conteúdo aqui que eu te ajudo! 😊", + "timestamp": "2026-10-27T20:05:11.742062" + }, + { + "role": "user", + "content": "Encontre na internet o preço mais barato de mouse usb", + "timestamp": "2026-10-27T20:06:26.218292" + }, + { + "role": "assistant", + "content": "Marco, a busca **não retornou preços específicos** de mouses USB — as páginas do Mercado Livre pediram login, e as outras (Shopee, Buscapé, Zoom) só trouxeram os links sem o conteúdo dos produtos.\n\nO que posso te dizer é que esses sites são bons pontos de partida para encontrar o mais barato:\n\n- **Buscapé**: https://www.buscape.com.br/mouse/usb — compare preços de várias lojas e ordene por menor preço\n- **Zoom**: https://www.zoom.com.br/mouse/usb — mesma ideia, comparação de preços\n- **Shopee**: https://shopee.com.br/list/Mouse/USB — geralmente tem os menores preços\n- **KaBuM!** (você já conhece) — busque por \"mouse usb\"\n\n💡 **Dica**: No Buscapé ou Zoom, clique em **\"ordenar por menor preço\"** e você verá os mais baratos na hora.\n\nSe encontrar algum modelo com preço interessante, cola aqui que eu te ajudo a avaliar se vale a pena! 😊\n\n[Note: I cannot fully verify the specific details above. Please check the official sources for accurate information.]", + "timestamp": "2026-10-27T20:06:39.391975" } ] \ No newline at end of file diff --git a/psagentai_agent.py b/psagentai_agent.py index e552b60..f27ee24 100755 --- a/psagentai_agent.py +++ b/psagentai_agent.py @@ -435,15 +435,25 @@ def _fetch_page_with_browser(url: str, max_chars: int = _BROWSER_FETCH_MAX_CHARS except Exception: # Page may have loaded partially; continue anyway response = None - # Wait for dynamic content to render - page.wait_for_timeout(3000) - # Scroll through page to trigger lazy-loaded content — go full height multiple times + # Wait for SPA frameworks (React/Vue/Angular) to hydrate + page.wait_for_timeout(5000) + # Scroll through page multiple times to trigger lazy-loaded content try: - page.evaluate("window.scrollTo(0, document.body.scrollHeight)") - page.wait_for_timeout(800) + for _ in range(3): + page.evaluate("window.scrollTo(0, document.body.scrollHeight)") + page.wait_for_timeout(1500) + page.evaluate("window.scrollTo(0, 0)") + page.wait_for_timeout(500) except Exception: pass - # Also extract text from common product/content selectors before body + # Extra wait for any final async content to settle + page.wait_for_timeout(2000) + # Extract visible text from body (most reliable for SPAs) + try: + text = page.inner_text("body") + except Exception: + text = "" + # Also try main content selectors for richer extraction main_texts = [] for selector in [ 'main', '[role="main"]', '.search-results', '.product-list', @@ -458,11 +468,11 @@ def _fetch_page_with_browser(url: str, max_chars: int = _BROWSER_FETCH_MAX_CHARS main_texts.append(t) except Exception: pass + # Use whichever extraction gave more content if main_texts: - text = "\n\n".join(main_texts) - else: - # Fallback to full body text - text = page.inner_text("body") + combined = "\n\n".join(main_texts) + if len(combined) > len(text): + text = combined browser.close() if not text: return "" @@ -3168,9 +3178,18 @@ def _looks_like_url_visit_request(user_message: str) -> bool: def _normalize_url(raw_url: str) -> str: """Ensure URL has a protocol prefix so requests can handle it.""" + import re as _re stripped = raw_url.strip().rstrip(".,;:") if not stripped.startswith(("http://", "https://")): - stripped = "https://" + stripped + # Remove www. prefix for consistent deduplication + domain = stripped.lower() + if domain.startswith("www."): + domain = domain[4:] + stripped = "https://" + domain + else: + # Normalize to https:// and remove www. for consistent dedup + stripped = _re.sub(r'(?:https?://)www\.', 'https://', stripped, count=1) + stripped = _re.sub(r'^https?://', 'https://', stripped, count=1) return stripped @@ -3189,19 +3208,22 @@ def _extract_urls(text: str) -> List[str]: patterns = [ r'https?://[^\s)>\]"\']+', r'www\.[^\s)>\]"\']+', - r'[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.(?:com|br|net|org|io|dev|co|info|biz|gov|edu|cloud|ai)[^\s)>\]"\']+', + r'[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.(?:com|br|net|org|io|dev|co|info|biz|gov|edu|cloud|ai)(?:[^\s)>\]"\']*)?', ] urls = [] for pattern in patterns: urls.extend(re.findall(pattern, text)) - # Deduplicate while preserving order (normalize for comparison) + # Clean trailing punctuation and deduplicate seen = set() unique = [] for u in urls: - normalized = _normalize_url(u) + cleaned = u.rstrip(".,;:!?)]") + if not cleaned or len(cleaned) < 3: + continue + normalized = _normalize_url(cleaned) if normalized not in seen: seen.add(normalized) - unique.append(u) + unique.append(cleaned) return unique @@ -6972,7 +6994,51 @@ async def process_text_message(update: Update, context: ContextTypes.DEFAULT_TYP modified = user_message + file_context else: modified = user_message - + + # Direct URL visit/scrape FIRST — the visited site is the primary source + # the user asked about. Appending before web search ensures search-context + # instructions ("base answer on information above") also cover it. + direct_url_context = "" + _dbg = [] + _dbg.append(f"msg={user_message[:100]!r}") + _dbg.append(f"visit_trigger={_looks_like_url_visit_request(user_message)}") + _dbg.append(f"search_trigger={_looks_like_search_request(user_message)}") + if _looks_like_url_visit_request(user_message): + raw_urls = _extract_urls(user_message) + _dbg.append(f"urls={raw_urls}") + for raw in raw_urls: + normalized = _normalize_url(raw) + domain = "" + try: + from urllib.parse import urlparse + domain = urlparse(normalized).netloc + except Exception: + domain = normalized + # Try headless browser first for JS-rendered sites, fallback to HTTP scrape + page_text = _fetch_page_with_browser(normalized, max_chars=4000) + if not page_text: + page_text = _fetch_page_content(normalized, max_chars=4000) + if page_text: + direct_url_context += f"\n\n[WEBSITE CONTENT FROM {domain}]\n{page_text}\n[END OF WEBSITE CONTENT]" + _dbg.append(f"scraped {normalized}: {len(page_text)} chars") + print(f"[URL_VISIT] scraped url={normalized} chars={len(page_text)}") + else: + _dbg.append(f"FAILED {normalized}") + print(f"[URL_VISIT] failed to fetch url={normalized}") + if direct_url_context: + modified = modified + direct_url_context + # Counter context anchoring: previous assistant messages may say + # "cannot access sites". Force the AI to treat this content as + # authoritative regardless of earlier refusals in history. + modified = ( + "[IMPORTANT OVERRIDE] You HAVE successfully accessed and scraped the website below. " + "The [WEBSITE CONTENT] section contains the REAL, CURRENT page content. " + "Ignore any earlier messages in this conversation where you said you cannot access websites — " + "you CAN access them now, and the content is provided below. " + "Base your answer PRIMARILY on this website content.\n" + ) + modified + _dbg.append(f"direct_ctx_len={len(direct_url_context)}") + if WEB_SEARCH_ENABLED and _looks_like_search_request(user_message): search_query = user_message # Strip the leading intent verb ("search for X" -> "X") before querying. @@ -7031,7 +7097,10 @@ async def process_text_message(update: Update, context: ContextTypes.DEFAULT_TYP page_content = result.get("content") if page_content: web_context += f"Content:\n{page_content}\n" - web_context += "\n[END OF WEB SEARCH RESULTS - IMPORTANT: Base your answer ONLY on the information above. Use the Content sections when available. If the information is not sufficient or you could not read the pages, say so clearly. NEVER invent facts, URLs, or references.]" + if direct_url_context: + web_context += "\n[END OF WEB SEARCH RESULTS - IMPORTANT: The [WEBSITE CONTENT] section above is the PRIMARY source for answering questions about that specific website. Use search results only as supplementary context. NEVER invent facts, URLs, or references.]" + else: + web_context += "\n[END OF WEB SEARCH RESULTS - IMPORTANT: Base your answer ONLY on the information above. Use the Content sections when available. If the information is not sufficient or you could not read the pages, say so clearly. NEVER invent facts, URLs, or references.]" modified = modified + "\n\n" + web_context # Store sources for /sources command context.user_data["last_web_sources"] = [ @@ -7041,30 +7110,18 @@ async def process_text_message(update: Update, context: ContextTypes.DEFAULT_TYP else: web_results = [] - # Direct URL visit/scrape when user explicitly asks to enter or analyze a site - direct_url_context = "" - if _looks_like_url_visit_request(user_message): - raw_urls = _extract_urls(user_message) - for raw in raw_urls: - normalized = _normalize_url(raw) - domain = "" - try: - from urllib.parse import urlparse - domain = urlparse(normalized).netloc - except Exception: - domain = normalized - # Try headless browser first for JS-rendered sites, fallback to HTTP scrape - page_text = _fetch_page_with_browser(normalized, max_chars=4000) - if not page_text: - page_text = _fetch_page_content(normalized, max_chars=4000) - if page_text: - direct_url_context += f"\n\n[WEBSITE CONTENT FROM {domain}]\n{page_text}\n[END OF WEBSITE CONTENT]" - print(f"[URL_VISIT] scraped url={normalized} chars={len(page_text)}") - else: - print(f"[URL_VISIT] failed to fetch url={normalized}") - if direct_url_context: - modified = modified + direct_url_context - + # Debug log: write to file so we can inspect what the AI actually received + try: + _dbg.append(f"modified_len={len(modified)}") + _dbg.append(f"has_website_content={'[WEBSITE CONTENT' in modified}") + _dbg.append(f"has_web_search={'[WEB SEARCH RESULTS' in modified}") + with open("workspace/debug_prompt.log", "a", encoding="utf-8") as _f: + _f.write("=" * 60 + "\n") + _f.write("\n".join(_dbg) + "\n") + _f.write(f"PROMPT TAIL (last 500): ...{modified[-500:]}\n") + except Exception: + pass + response = await get_psagentai_response(modified) if response: # Post-validation: if search results were provided, ensure the diff --git a/user_profile.json b/user_profile.json index 539bded..487c15c 100755 --- a/user_profile.json +++ b/user_profile.json @@ -7,7 +7,10 @@ "Eletrônica", "compras de informática (procurando notebook na KaBuM)", "clima e previsão do tempo", - "monitores de computador (busca por modelos de 22 polegadas, antes 17 polegadas)" + "monitores de computador (busca por modelos de 22 polegadas, antes 17 polegadas)", + "sites educacionais (pesquisa sobre educaginga.org.br)", + "mouse USB (periféricos de informática)", + "comparação de preços em sites como Buscapé, Zoom e Shopee" ], "personality_traits": [ "extrovertido", @@ -16,63 +19,67 @@ "preferences": { "communication_style": "encerra interações com agradecimentos simpáticos", "topics_to_avoid": [], - "topics_of_interest": [ - "g", - "o", - "s", - "t", - "o", - " ", - "d", - "e", - " ", - "f", - "a", - "z", - "e", - "r", - " ", - "a", - "ç", - "õ", - "e", - "s", - " ", - "d", - "e", - " ", - "t", - "e", - "c", - "n", - "o", - "l", - "o", - "g", - "i", - "a", - " ", - "e", - " ", - "p", - "r", - "o", - "g", - "r", - "a", - "m", - "a", - "ç", - "ã", - "o", - "horários de ônibus", - "transporte público", - "site do TSE e símbolos eleitorais", - "comparação e compra de notebooks", - "previsão do tempo", - "Ubatuba (SP)", - "comparação e compra de monitores" - ], + "topics_of_interest": [ + "g", + "o", + "s", + "t", + "o", + " ", + "d", + "e", + " ", + "f", + "a", + "z", + "e", + "r", + " ", + "a", + "ç", + "õ", + "e", + "s", + " ", + "d", + "e", + " ", + "t", + "e", + "c", + "n", + "o", + "l", + "o", + "g", + "i", + "a", + " ", + "e", + " ", + "p", + "r", + "o", + "g", + "r", + "a", + "m", + "a", + "ç", + "ã", + "o", + "horários de ônibus", + "transporte público", + "site do TSE e símbolos eleitorais", + "comparação e compra de notebooks", + "previsão do tempo", + "Ubatuba (SP)", + "comparação e compra de monitores", + "verificação de reputação de sites", + "educaginga.org.br", + "comparação e compra de mouse USB", + "sites de comparação de preços (Buscapé, Zoom, Shopee)" + ], "preferred_communication_time": "manha", "content_format_preference": "tutoriais_praticos", "project_complexity": "intermediario_avancado", @@ -112,9 +119,9 @@ "hardware_legacy_support": "componentes_classicos_e_modernos", "rural_urban_aware": "adaptar_para_realidade_mineira_urbana" }, - "notes": "gosto também de programação; Nome é Marco; comentou que o café ainda não estava pronto pela manhã; Marco mencionou que há um arquivo com os horários da SARTASA na pasta uploadfiles, mas não conseguiu acessá-lo diretamente. Ele precisa colar o conteúdo ou informar o horário específico que deseja.; Marco está pesquisando um notebook na KaBuM e precisa colar o conteúdo das páginas no chat para que o agente ajude a comparar.; Marco demonstrou interesse em saber a temperatura atual de Ubatuba (SP), possivelmente por viagem ou contato com alguém da cidade.; Marco espera que o agente consiga abrir links e verificar informações diretamente (ex: temperatura de Ubatuba); tende a pedir ao agente para fazer o que ele mesmo faria no navegador, exigindo explicações claras das limitações técnicas.; Marco ajustou sua busca de monitores de 17 polegadas para 22 polegadas; compara preços em reais e valoriza transparência sobre preços confirmados vs. estimados.", + "notes": "gosto também de programação; Nome é Marco; comentou que o café ainda não estava pronto pela manhã; Marco mencionou que há um arquivo com os horários da SARTASA na pasta uploadfiles, mas não conseguiu acessá-lo diretamente. Ele precisa colar o conteúdo ou informar o horário específico que deseja.; Marco está pesquisando um notebook na KaBuM e precisa colar o conteúdo das páginas no chat para que o agente ajude a comparar.; Marco demonstrou interesse em saber a temperatura atual de Ubatuba (SP), possivelmente por viagem ou contato com alguém da cidade.; Marco espera que o agente consiga abrir links e verificar informações diretamente (ex: temperatura de Ubatuba); tende a pedir ao agente para fazer o que ele mesmo faria no navegador, exigindo explicações claras das limitações técnicas.; Marco ajustou sua busca de monitores de 17 polegadas para 22 polegadas; compara preços em reais e valoriza transparência sobre preços confirmados vs. estimados.; Marco pesquisou o site educaginga.org.br e pediu para o agente verificar do que se trata; o agente não encontrou informações e sugeriu que Marco acesse o site diretamente e colasse o conteúdo.; Marco está pesquisando o preço mais barato de mouse USB; o agente sugeriu ordenar por menor preço no Buscapé/Zoom e pediu que Marco cole modelos encontrados para avaliação.", "created_at": "2026-08-24T09:59:34.623658", - "last_updated": "2026-10-26T16:46:15.899398", + "last_updated": "2026-10-27T20:06:42.438893", "daily_routine": { "wake_up_time": "ao acordar de manhã", "breakfast_time": "",