diff --git a/custom_components/groqd/config_flow.py b/custom_components/groqd/config_flow.py index 77d02d5..c8da565 100644 --- a/custom_components/groqd/config_flow.py +++ b/custom_components/groqd/config_flow.py @@ -35,6 +35,7 @@ from .const import ( CONF_SEARXNG_URL, CONF_SEARXNG_SAFESEARCH, CONF_SEARXNG_LANGUAGE, + CONF_AUTO_FETCH_URLS, CONF_SEED, CONF_STOP, CONF_TEMPERATURE, @@ -55,6 +56,7 @@ from .const import ( DEFAULT_SEARXNG_URL, DEFAULT_SEARXNG_SAFESEARCH, DEFAULT_SEARXNG_LANGUAGE, + DEFAULT_AUTO_FETCH_URLS, DOMAIN, ) from .const import DEFAULT_MAX_TOKENS, CONF_MAX_TOKENS @@ -293,6 +295,11 @@ class GroqdOptionsFlow(OptionsFlow): description={"suggested_value": options.get(CONF_SEARXNG_SAFESEARCH, DEFAULT_SEARXNG_SAFESEARCH)}, default=options.get(CONF_SEARXNG_SAFESEARCH, DEFAULT_SEARXNG_SAFESEARCH), ): NumberSelector(NumberSelectorConfig(min=0, max=2, step=1)), + vol.Optional( + CONF_AUTO_FETCH_URLS, + description={"suggested_value": options.get(CONF_AUTO_FETCH_URLS, DEFAULT_AUTO_FETCH_URLS)}, + default=options.get(CONF_AUTO_FETCH_URLS, DEFAULT_AUTO_FETCH_URLS), + ): bool, vol.Optional( CONF_LLM_HASS_API, description={"suggested_value": options.get(CONF_LLM_HASS_API)}, diff --git a/custom_components/groqd/const.py b/custom_components/groqd/const.py index b0f6514..7bd32c6 100644 --- a/custom_components/groqd/const.py +++ b/custom_components/groqd/const.py @@ -27,6 +27,7 @@ CONF_SEARXNG_ENABLED = "searxng_enabled" CONF_SEARXNG_URL = "searxng_url" CONF_SEARXNG_SAFESEARCH = "searxng_safesearch" CONF_SEARXNG_LANGUAGE = "searxng_language" +CONF_AUTO_FETCH_URLS = "auto_fetch_urls" DEFAULT_CHAT_MODEL = "meta-llama/llama-4-maverick-17b-128e-instruct" DEFAULT_CONTEXT_MESSAGES = 20 @@ -43,3 +44,4 @@ DEFAULT_SEARXNG_ENABLED = True DEFAULT_SEARXNG_URL = "http://127.0.0.1:8800" DEFAULT_SEARXNG_SAFESEARCH = 1 DEFAULT_SEARXNG_LANGUAGE = "en" +DEFAULT_AUTO_FETCH_URLS = True diff --git a/custom_components/groqd/conversation.py b/custom_components/groqd/conversation.py index fc9e3fb..e34ff34 100644 --- a/custom_components/groqd/conversation.py +++ b/custom_components/groqd/conversation.py @@ -52,6 +52,7 @@ from .const import ( CONF_SEARXNG_LANGUAGE, CONF_SEARXNG_SAFESEARCH, CONF_SEARXNG_URL, + CONF_AUTO_FETCH_URLS, CONF_SEED, CONF_STOP, CONF_TEMPERATURE, @@ -68,6 +69,7 @@ from .const import ( DEFAULT_SEARXNG_LANGUAGE, DEFAULT_SEARXNG_SAFESEARCH, DEFAULT_SEARXNG_URL, + DEFAULT_AUTO_FETCH_URLS, DEFAULT_TEMPERATURE, DEFAULT_TOOL_CHOICE, DEFAULT_TOP_P, @@ -180,6 +182,18 @@ async def _run_fetch(hass: HomeAssistant, url: str, max_chars: int) -> dict[str, cleaned = cleaned[:max_chars] return {"url": url, "content_type": content_type, "text": cleaned} + +def _extract_urls(text: str, limit: int = 3) -> list[str]: + urls = re.findall(r"https?://\\S+", text or "") + cleaned = [] + for url in urls: + url = url.rstrip(").,;!?\"'") + if url not in cleaned: + cleaned.append(url) + if len(cleaned) >= limit: + break + return cleaned + async def _run_searxng( hass: HomeAssistant, options: dict[str, Any], @@ -380,6 +394,23 @@ class GroqdConversationEntity( response=intent_response, conversation_id=conversation_id ) + if options.get(CONF_AUTO_FETCH_URLS, DEFAULT_AUTO_FETCH_URLS): + urls = _extract_urls(user_input.text) + if urls: + fetched_chunks = [] + for url in urls: + try: + fetched = await _run_fetch(self.hass, url, 2000) + fetched_chunks.append( + f"URL: {fetched['url']}\\nCONTENT: {fetched['text']}" + ) + except Exception as err: + fetched_chunks.append(f"URL: {url}\\nERROR: {err}") + prompt_parts.append( + "Fetched content from links provided by the user:\\n" + + "\\n\\n".join(fetched_chunks) + ) + if llm_api: prompt_parts.append(llm_api.api_prompt) diff --git a/custom_components/groqd/translations/en.json b/custom_components/groqd/translations/en.json index bc7eb1f..f88baee 100644 --- a/custom_components/groqd/translations/en.json +++ b/custom_components/groqd/translations/en.json @@ -41,6 +41,11 @@ "parallel_tool_calls": "Parallel tool calls", "response_format": "Response format", "memory_scope": "Memory scope", + "searxng_enabled": "Enable SearxNG web search", + "searxng_url": "SearxNG URL", + "searxng_language": "SearxNG language", + "searxng_safesearch": "SearxNG safe search", + "auto_fetch_urls": "Auto-fetch URLs in user messages", "llm_hass_api": "Home Assistant LLM API" }, "data_description": {