diff --git a/boost/src/chat.py b/boost/src/chat.py
index b3f252a..41d1521 100644
--- a/boost/src/chat.py
+++ b/boost/src/chat.py
@@ -49,6 +49,10 @@ def plain(self):
def history(self):
return self.tail.history()
+ def text(self):
+ # __str__ already does exactly this
+ return f"{self}"
+
def __create_node(self, **kwargs):
NodeType = self.chat_node_type
return NodeType(**kwargs)
diff --git a/boost/src/custom_modules/discussurl.py b/boost/src/custom_modules/discussurl.py
new file mode 100644
index 0000000..9c6d50b
--- /dev/null
+++ b/boost/src/custom_modules/discussurl.py
@@ -0,0 +1,40 @@
+import re
+import requests
+
+url_regex = r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))"
+prompt = """
+
+Your task is to fulfill the user's request by discussing provided content.
+
+
+
+{content}
+
+
+
+{request}
+
+""".strip()
+
+ID_PREFIX = "discussurl"
+
+
+async def apply(chat, llm):
+ text = chat.text()
+ urls = re.findall(url_regex, text)
+
+ # No - URLs - proceed as usual
+ if len(urls) == 0:
+ return await llm.stream_final_completion()
+
+ # Yes - URLs - read them
+ content = ""
+ for url in urls:
+ await llm.emit_status(f"Reading {url[0]}...")
+ content += requests.get(url[0]).text
+
+ await llm.stream_final_completion(
+ prompt=prompt,
+ content=content,
+ request=chat.tail.content,
+ )