Bton commited on
Commit
83ff9df
·
verified ·
1 Parent(s): b1be6ae

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +65 -64
app.py CHANGED
@@ -1,86 +1,87 @@
1
  import json
2
- import re
3
- import random
4
  import html
5
- import requests
6
- from bs4 import BeautifulSoup
7
  import gradio as gr
8
- from llama_cpp import Llama
9
- from llama_cpp_agent import LlamaCppAgent
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 your GGUF model from the HF repo
16
- :contentReference[oaicite:2]{index=2}
17
- :contentReference[oaicite:3]{index=3}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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": title_text,
24
- "price": price_text,
25
- "rating": rating_text,
26
- "first_review": review_text,
27
- :contentReference[oaicite:6]{index=6}
28
  }
29
 
30
- # Inference function
31
- :contentReference[oaicite:7]{index=7}
32
- :contentReference[oaicite:8]{index=8}
33
 
34
- # Format prompt
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{prompt}"
45
  )
46
 
47
- # Llama.cpp setup
48
- llm = Llama(model_path=MODEL_PATH, n_ctx=2048)
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
- # Extract JSON from response
64
- match = re.search(r'\{.*"title".*"review".*\}', full_text, re.DOTALL)
65
- if match:
66
- review = json.loads(match.group())
67
- else:
68
- review = {"title": "", "review": full_text.strip()}
 
 
69
 
70
- return prod["product_title"], review["title"], review["review"]
71
 
72
  # Gradio UI
73
- :contentReference[oaicite:9]{index=9}
74
- fn=review_generation_ui,
75
- :contentReference[oaicite:10]{index=10}
76
  outputs=[
77
- :contentReference[oaicite:11]{index=11}
78
- :contentReference[oaicite:12]{index=12}
79
- :contentReference[oaicite:13]{index=13}
80
  ],
81
- :contentReference[oaicite:14]{index=14}
82
- :contentReference[oaicite:15]{index=15}
83
  )
84
 
85
- :contentReference[oaicite:16]{index=16}
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()