Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,86 +1,87 @@
|
|
1 |
import json
|
2 |
-
import re
|
3 |
-
import random
|
4 |
import html
|
5 |
-
import
|
6 |
-
from bs4 import BeautifulSoup
|
7 |
import gradio as gr
|
8 |
-
from
|
9 |
-
|
10 |
-
from llama_cpp_agent.providers import LlamaCppPythonProvider
|
11 |
-
from llama_cpp_agent.chat_history import BasicChatHistory
|
12 |
-
from llama_cpp_agent.chat_history.messages import Roles
|
13 |
from huggingface_hub import hf_hub_download
|
|
|
14 |
|
15 |
-
# Download
|
16 |
-
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
-
# Scraping logic (adjusted from your script):
|
20 |
-
:contentReference[oaicite:4]{index=4}
|
21 |
-
:contentReference[oaicite:5]{index=5}
|
22 |
return {
|
23 |
-
"product_title":
|
24 |
-
"price":
|
25 |
-
"rating":
|
26 |
-
"first_review":
|
27 |
-
:
|
28 |
}
|
29 |
|
30 |
-
#
|
31 |
-
:
|
32 |
-
|
33 |
|
34 |
-
|
35 |
-
prompt = json.dumps({
|
36 |
-
"product_title": prod["product_title"],
|
37 |
-
"price": prod["price"],
|
38 |
-
"rating": prod["rating"],
|
39 |
-
"first_review": prod["first_review"],
|
40 |
-
"about_this_item": prod["about_this_item"],
|
41 |
-
}, ensure_ascii=False)
|
42 |
-
full_prompt = (
|
43 |
"Write a product review based on the following product details.\n"
|
44 |
-
f"Your input is:\n{
|
45 |
)
|
46 |
|
47 |
-
|
48 |
-
|
49 |
-
provider = LlamaCppPythonProvider(llm)
|
50 |
-
agent = LlamaCppAgent(provider, system_prompt="", predefined_messages_formatter_type="CHATML")
|
51 |
-
settings = provider.get_provider_default_settings()
|
52 |
-
settings.stream = False
|
53 |
-
|
54 |
-
# Run inference
|
55 |
-
stream = agent.get_chat_response(
|
56 |
-
full_prompt,
|
57 |
-
llm_sampling_settings=settings,
|
58 |
-
chat_history=BasicChatHistory(),
|
59 |
-
returns_streaming_generator=False
|
60 |
-
)
|
61 |
-
full_text = "".join(token for token in stream)
|
62 |
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
|
|
|
|
69 |
|
70 |
-
return
|
71 |
|
72 |
# Gradio UI
|
73 |
-
|
74 |
-
fn=
|
75 |
-
|
76 |
outputs=[
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
],
|
81 |
-
|
82 |
-
|
83 |
)
|
84 |
|
85 |
-
:
|
86 |
demo.launch()
|
|
|
1 |
import json
|
|
|
|
|
2 |
import html
|
3 |
+
import re
|
|
|
4 |
import gradio as gr
|
5 |
+
from bs4 import BeautifulSoup
|
6 |
+
import requests
|
|
|
|
|
|
|
7 |
from huggingface_hub import hf_hub_download
|
8 |
+
from llama_cpp import Llama
|
9 |
|
10 |
+
# Download the model from your HF repo (replace with your actual repo/model filename)
|
11 |
+
hf_hub_download(
|
12 |
+
repo_id="Bton/llama3-pr-Q4_K_M.gguf",
|
13 |
+
filename="unsloth.Q4_K_M.gguf",
|
14 |
+
local_dir="."
|
15 |
+
)
|
16 |
+
|
17 |
+
# Load model
|
18 |
+
llm = Llama(
|
19 |
+
model_path="./your-model.Q4_K_M.gguf",
|
20 |
+
n_ctx=2048,
|
21 |
+
n_threads=4
|
22 |
+
)
|
23 |
+
|
24 |
+
# Scrape product details
|
25 |
+
def scrape_amazon_product(url):
|
26 |
+
headers = {
|
27 |
+
"User-Agent": "Mozilla/5.0",
|
28 |
+
"Accept-Language": "en-US,en;q=0.9",
|
29 |
+
}
|
30 |
+
response = requests.get(url, headers=headers)
|
31 |
+
soup = BeautifulSoup(response.content, "html.parser")
|
32 |
+
|
33 |
+
title = soup.find(id="productTitle")
|
34 |
+
price = soup.select_one(".a-offscreen")
|
35 |
+
rating = next((e.get_text() for e in soup.select("span.a-icon-alt") if "out of 5 stars" in e.text), None)
|
36 |
+
review_elem = soup.select_one("div.reviewText.review-text-content")
|
37 |
+
|
38 |
+
about_section = soup.find("div", id="feature-bullets")
|
39 |
+
bullets = about_section.select("ul.a-unordered-list li span") if about_section else []
|
40 |
+
about = " ".join(b.get_text(strip=True) for b in bullets if b.get_text(strip=True))
|
41 |
|
|
|
|
|
|
|
42 |
return {
|
43 |
+
"product_title": title.get_text(strip=True) if title else None,
|
44 |
+
"price": price.get_text(strip=True) if price else None,
|
45 |
+
"rating": rating,
|
46 |
+
"first_review": review_elem.get_text(strip=True) if review_elem else None,
|
47 |
+
"about_this_item": html.escape(about)
|
48 |
}
|
49 |
|
50 |
+
# Generate review
|
51 |
+
def generate_review(url):
|
52 |
+
product = scrape_amazon_product(url)
|
53 |
|
54 |
+
prompt = (
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
"Write a product review based on the following product details.\n"
|
56 |
+
f"Your input is:\n{json.dumps(product)}"
|
57 |
)
|
58 |
|
59 |
+
response = llm(prompt, stop=["<|im_end|>", "<|end_of_text|>"])
|
60 |
+
text = response["choices"][0]["text"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
|
62 |
+
try:
|
63 |
+
match = re.search(r'\{.*"title".*"review".*\}', text, re.DOTALL)
|
64 |
+
if match:
|
65 |
+
review_json = json.loads(match.group())
|
66 |
+
else:
|
67 |
+
review_json = {"title": "Review Generated", "review": text.strip()}
|
68 |
+
except:
|
69 |
+
review_json = {"title": "Review Generated", "review": text.strip()}
|
70 |
|
71 |
+
return product["product_title"], review_json["title"], review_json["review"]
|
72 |
|
73 |
# Gradio UI
|
74 |
+
demo = gr.Interface(
|
75 |
+
fn=generate_review,
|
76 |
+
inputs=gr.Textbox(label="Amazon URL"),
|
77 |
outputs=[
|
78 |
+
gr.Textbox(label="Product Title"),
|
79 |
+
gr.Textbox(label="Review Title"),
|
80 |
+
gr.Textbox(label="Review Body", lines=5)
|
81 |
],
|
82 |
+
title="Amazon Review Bot (GGUF)",
|
83 |
+
description="Enter an Amazon product URL to generate a review using your GGUF model."
|
84 |
)
|
85 |
|
86 |
+
if __name__ == "__main__":
|
87 |
demo.launch()
|