From 5e932c84ae8df387da9e4c434bd68bbf541c9fb9 Mon Sep 17 00:00:00 2001 From: Stupdi Go Date: Fri, 27 Jun 2025 16:08:45 -0500 Subject: [PATCH] test --- .gitignore | 1 + main.py | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 .gitignore create mode 100644 main.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f7275bb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +venv/ diff --git a/main.py b/main.py new file mode 100644 index 0000000..1af2b12 --- /dev/null +++ b/main.py @@ -0,0 +1,119 @@ +from llama_cpp import Llama +from langchain_core.language_models import LLM +from langchain.prompts import PromptTemplate +from langchain.agents import AgentExecutor, create_react_agent +from langchain.tools import Tool +from typing import Optional, List +from googlesearch import search +from bs4 import BeautifulSoup +import requests +# --- LLaMA-CPP model setup --- +llm_model = Llama( + model_path="ReAction-1.5B.Q5_K_M.gguf", + n_ctx=2**21, + n_threads=8, + use_mlock=True, + verbose=False +) + +# --- LangChain wrapper --- +class LlamaCppLLM(LLM): + @property + def _llm_type(self) -> str: + return "llama-cpp" + + def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str: + result = llm_model( + prompt, + stop=stop, + max_tokens=1024, + echo=False, + + ) + output = result["choices"][0]["text"].strip() + return output + +custom_llm = LlamaCppLLM() + +# --- Tool definition --- +def extract_text(html): + soup = BeautifulSoup(html, "html.parser") + # Remove scripts and styles + for tag in soup(["script", "style"]): + tag.decompose() + text = soup.get_text(separator=" ", strip=True) + return text +def weather(city: str) -> str: + return f"The weather in {city} is Sunny." +def search_google(query:str): + print(f"serach tool called {query}") + return [url for url in search(query,stop=5)] +def get_webhtml(url): + print(url) + url = url.replace("'","") + if url: + r = requests.get(url) + else: + return None + return extract_text(r.text) if r.status_code == 200 else None +weather_tool = Tool( + name="weather", + func=weather, + description="Use this tool to get the weather of a given city. Input should be the city name." +) +search_tool = Tool( + name = "search_tool", + func=search_google, + description="Returns the first 5 results from google with a specific query" + ) +html_tool = Tool( + name="get_webhtml", + func=get_webhtml, + description="Given a url, it provides the HTML for it. If it returns None, the website isn't available." + ) + +# --- Custom ReAct prompt --- +prompt_template = PromptTemplate.from_template(""" +You are a helpful assistant that can use tools to answer questions. + +TOOLS: +{tools} + +FORMAT: +Question: the input question +Thought: think about what to do +Action: pick one of [{tool_names}] +Action Input: "" + +Observation: result of the action +... (you can repeat Thought/Action/Observation until you reach a Final Answer) ... +... (Also, only use Action Input AFTER you use Action, so before you use Action input again, you have to call a tool again. Reach a final Answer before 3 iterations) ... +Thought: I now know the final answer +Final Answer: + + +NEW QUESTION: + +Question: {input} +{agent_scratchpad} +""") + +# --- Create ReAct agent --- +react_agent = create_react_agent( + llm=custom_llm, + tools=[search_tool,html_tool], + prompt=prompt_template +) + +agent = AgentExecutor( + agent=react_agent, + tools=[search_tool,html_tool], + verbose=True, + handle_parsing_errors=True, + max_iterations=5 +) + +# --- Run it --- +response = agent.invoke({"input": "What is the weather in San Francisco"}) +print("\nFinal Output:\n", response) +