Spaces:
Sleeping
Sleeping
rsm-roguchi commited on
Commit ·
24e0afd
1
Parent(s): 69a41e0
a bunch of stuff?
Browse files- build/lib/server/__init__.py +0 -0
- build/lib/server/blog.py +306 -0
- build/lib/server/meta.py +70 -0
- build/lib/server/price_matching.py +0 -0
- build/lib/server/twitter.py +75 -0
- pyproject.toml +3 -0
- requirements.txt +0 -292
- ultima_seo.egg-info/PKG-INFO +47 -0
- ultima_seo.egg-info/SOURCES.txt +12 -0
- ultima_seo.egg-info/dependency_links.txt +1 -0
- ultima_seo.egg-info/requires.txt +19 -0
- ultima_seo.egg-info/top_level.txt +1 -0
build/lib/server/__init__.py
ADDED
|
File without changes
|
build/lib/server/blog.py
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from shiny import reactive, render, ui
|
| 2 |
+
import os, sys
|
| 3 |
+
from bs4 import BeautifulSoup
|
| 4 |
+
from pytrends.request import TrendReq
|
| 5 |
+
from playwright.async_api import async_playwright
|
| 6 |
+
import requests
|
| 7 |
+
import re, ast
|
| 8 |
+
import time
|
| 9 |
+
|
| 10 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "code")))
|
| 11 |
+
from llm_connect import get_response
|
| 12 |
+
|
| 13 |
+
from dotenv import load_dotenv
|
| 14 |
+
load_dotenv()
|
| 15 |
+
|
| 16 |
+
SHOPIFY_STORE = "ultima-supply.myshopify.com"
|
| 17 |
+
SHOPIFY_TOKEN = os.getenv("SHOPIFY_TOKEN")
|
| 18 |
+
SHOPIFY_API_VERSION = "2024-04"
|
| 19 |
+
BLOG_ID = "73667707064"
|
| 20 |
+
|
| 21 |
+
# === Async JS-rendered scraping ===
|
| 22 |
+
async def scrape_div_content_from_url(url: str) -> str:
|
| 23 |
+
try:
|
| 24 |
+
async with async_playwright() as p:
|
| 25 |
+
browser = await p.chromium.launch(headless=True)
|
| 26 |
+
page = await browser.new_page()
|
| 27 |
+
await page.goto(url, wait_until="networkidle")
|
| 28 |
+
html = await page.content()
|
| 29 |
+
await browser.close()
|
| 30 |
+
|
| 31 |
+
soup = BeautifulSoup(html, "html.parser")
|
| 32 |
+
divs = soup.find_all("div", class_="article-body")
|
| 33 |
+
if not divs:
|
| 34 |
+
print("[WARN] No <div class='article-body'> found.")
|
| 35 |
+
return ""
|
| 36 |
+
|
| 37 |
+
texts = [div.get_text(separator=" ", strip=True) for div in divs]
|
| 38 |
+
return "\n\n".join(texts)
|
| 39 |
+
except Exception as e:
|
| 40 |
+
print(f"[ERROR] Failed to render or scrape: {e}")
|
| 41 |
+
return ""
|
| 42 |
+
|
| 43 |
+
# === Async keyword + scrape + fallback logic ===
|
| 44 |
+
async def get_keywords_and_content(url: str, top_n=5, llm_n=25):
|
| 45 |
+
scraped_text = await scrape_div_content_from_url(url)
|
| 46 |
+
if not scraped_text:
|
| 47 |
+
print("[ERROR] No scraped content. Cannot proceed.")
|
| 48 |
+
return [], ""
|
| 49 |
+
|
| 50 |
+
# === Step 1: Extract condensed topic keywords ===
|
| 51 |
+
try:
|
| 52 |
+
condensed_prompt = (
|
| 53 |
+
"From the content below, extract 5 to 7 mid-specific Google search phrases that reflect real user intent. "
|
| 54 |
+
"They should describe product types, use cases, or collector topics — not brand names alone. "
|
| 55 |
+
"Avoid single-word topics and overly broad terms like 'pokemon'. Each phrase should be 2–5 words, lowercase, and ASCII only.\n\n"
|
| 56 |
+
"You MUST return ONLY a valid Python list of strings. Do not use bullet points, newlines, or any explanation. "
|
| 57 |
+
"Your response must look exactly like this format:\n"
|
| 58 |
+
"['phrase one', 'phrase two', 'phrase three']\n\n"
|
| 59 |
+
f"Content:\n{scraped_text}"
|
| 60 |
+
)
|
| 61 |
+
|
| 62 |
+
condensed_topic_raw = get_response(
|
| 63 |
+
input=condensed_prompt,
|
| 64 |
+
template=lambda x: x.strip(),
|
| 65 |
+
llm="gemini",
|
| 66 |
+
md=False,
|
| 67 |
+
temperature=0.6,
|
| 68 |
+
max_tokens=100,
|
| 69 |
+
model_name="gemini-2.0-flash-lite"
|
| 70 |
+
)
|
| 71 |
+
print(condensed_topic_raw)
|
| 72 |
+
|
| 73 |
+
match = re.search(r"\[.*?\]", condensed_topic_raw, re.DOTALL)
|
| 74 |
+
condensed_topic = ast.literal_eval(match.group(0)) if match else []
|
| 75 |
+
if not condensed_topic:
|
| 76 |
+
condensed_topic = ["trading cards"]
|
| 77 |
+
|
| 78 |
+
print(f"[INFO] Condensed topic keywords: {condensed_topic}")
|
| 79 |
+
except Exception as e:
|
| 80 |
+
print(f"[WARN] Could not infer topics: {e}")
|
| 81 |
+
condensed_topic = ["trading cards"]
|
| 82 |
+
|
| 83 |
+
# === Step 2: Pull suggestions from PyTrends ===
|
| 84 |
+
all_suggestions = set()
|
| 85 |
+
try:
|
| 86 |
+
pytrends = TrendReq(hl="en-US", tz=360, timeout=10)
|
| 87 |
+
for topic in condensed_topic:
|
| 88 |
+
time.sleep(5)
|
| 89 |
+
suggestions = pytrends.suggestions(keyword=topic)
|
| 90 |
+
if suggestions:
|
| 91 |
+
titles = [s["title"] for s in suggestions]
|
| 92 |
+
all_suggestions.update(titles)
|
| 93 |
+
print(f"[INFO] Suggestions for '{topic}': {titles[:3]}")
|
| 94 |
+
except Exception as e:
|
| 95 |
+
print(f"[WARN] PyTrends suggestions failed: {e}")
|
| 96 |
+
|
| 97 |
+
all_suggestions = list(all_suggestions)
|
| 98 |
+
|
| 99 |
+
# === Step 3: Let Gemini filter suggestions for relevance ===
|
| 100 |
+
filtered_keywords = []
|
| 101 |
+
if all_suggestions:
|
| 102 |
+
filter_prompt = (
|
| 103 |
+
f"The following article was scraped:\n\n{scraped_text[:1500]}\n\n"
|
| 104 |
+
f"Here is a list of keyword suggestions:\n{all_suggestions}\n\n"
|
| 105 |
+
"Return only the keywords that are clearly relevant to the article topic. "
|
| 106 |
+
"Return a valid Python list of strings only. No explanation, bullets, or formatting."
|
| 107 |
+
)
|
| 108 |
+
|
| 109 |
+
raw_filtered = get_response(
|
| 110 |
+
input=filter_prompt,
|
| 111 |
+
template=lambda x: x.strip(),
|
| 112 |
+
llm="gemini",
|
| 113 |
+
md=False,
|
| 114 |
+
temperature=0.3,
|
| 115 |
+
max_tokens=200
|
| 116 |
+
)
|
| 117 |
+
|
| 118 |
+
match = re.search(r"\[.*?\]", raw_filtered)
|
| 119 |
+
if match:
|
| 120 |
+
try:
|
| 121 |
+
filtered_keywords = ast.literal_eval(match.group(0))
|
| 122 |
+
except:
|
| 123 |
+
filtered_keywords = []
|
| 124 |
+
|
| 125 |
+
# === Step 4: Fallback to Gemini keyword generation if needed ===
|
| 126 |
+
if not filtered_keywords:
|
| 127 |
+
fallback_prompt = (
|
| 128 |
+
f"You are an SEO expert. Generate {llm_n} niche-relevant SEO keywords "
|
| 129 |
+
f"based on this content:\n\n{scraped_text}\n\n"
|
| 130 |
+
"Return a comma-separated list of lowercase 2–5 word search phrases. No formatting."
|
| 131 |
+
)
|
| 132 |
+
fallback_keywords_raw = get_response(
|
| 133 |
+
input=fallback_prompt,
|
| 134 |
+
template=lambda x: x.strip(),
|
| 135 |
+
llm="gemini",
|
| 136 |
+
md=False,
|
| 137 |
+
temperature=0.7,
|
| 138 |
+
max_tokens=400
|
| 139 |
+
)
|
| 140 |
+
filtered_keywords = [kw.strip() for kw in fallback_keywords_raw.split(",") if kw.strip()]
|
| 141 |
+
print(f"[INFO] Fallback keywords used: {filtered_keywords[:top_n]}")
|
| 142 |
+
|
| 143 |
+
# === Step 5: Enforce minimum of 30 keywords ===
|
| 144 |
+
combined_keywords = list(dict.fromkeys(filtered_keywords)) # remove duplicates
|
| 145 |
+
if len(combined_keywords) < 30:
|
| 146 |
+
needed = 30 - len(combined_keywords)
|
| 147 |
+
print(f"[INFO] Need {needed} more keywords to reach 30. Using Gemini to pad.")
|
| 148 |
+
|
| 149 |
+
pad_prompt = (
|
| 150 |
+
f"The following article content is missing SEO keyword coverage:\n\n"
|
| 151 |
+
f"{scraped_text}\n\n"
|
| 152 |
+
f"Generate exactly {needed} additional SEO keyword phrases. "
|
| 153 |
+
"Each keyword must be:\n"
|
| 154 |
+
"- 2 to 5 words long\n"
|
| 155 |
+
"- lowercase only\n"
|
| 156 |
+
"- written in ASCII (no symbols or accents)\n"
|
| 157 |
+
"- clearly relevant to the article\n"
|
| 158 |
+
"- not overlapping with any common generic terms like 'pokemon'\n\n"
|
| 159 |
+
"You MUST return a valid Python list of strings. DO NOT include any explanation, extra text, markdown, or formatting.\n"
|
| 160 |
+
"Format example:\n"
|
| 161 |
+
"['keyword one', 'keyword two', 'keyword three']"
|
| 162 |
+
)
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
pad_raw = get_response(
|
| 166 |
+
input=pad_prompt,
|
| 167 |
+
template=lambda x: x.strip(),
|
| 168 |
+
llm="gemini",
|
| 169 |
+
md=False,
|
| 170 |
+
temperature=0.7,
|
| 171 |
+
max_tokens=200
|
| 172 |
+
)
|
| 173 |
+
|
| 174 |
+
pad_keywords = []
|
| 175 |
+
|
| 176 |
+
pad_match = re.search(r"\[[^\]]+\]", pad_raw) # greedy, non-linebreaking
|
| 177 |
+
if pad_match:
|
| 178 |
+
try:
|
| 179 |
+
pad_keywords = ast.literal_eval(pad_match.group(0))
|
| 180 |
+
except Exception as e:
|
| 181 |
+
print(f"[WARN] ast.literal_eval failed: {e}")
|
| 182 |
+
pad_keywords = []
|
| 183 |
+
|
| 184 |
+
combined_keywords = list(dict.fromkeys(combined_keywords + pad_keywords))
|
| 185 |
+
print(f"[INFO] Padded {len(pad_keywords)} keywords:", pad_keywords)
|
| 186 |
+
|
| 187 |
+
|
| 188 |
+
return combined_keywords[:30], scraped_text
|
| 189 |
+
|
| 190 |
+
|
| 191 |
+
|
| 192 |
+
# === Shopify publisher ===
|
| 193 |
+
def publish_blog_post(title: str, html_body: str, blog_id: str = BLOG_ID):
|
| 194 |
+
url = f"https://{SHOPIFY_STORE}/admin/api/{SHOPIFY_API_VERSION}/blogs/{blog_id}/articles.json"
|
| 195 |
+
headers = {
|
| 196 |
+
"X-Shopify-Access-Token": SHOPIFY_TOKEN,
|
| 197 |
+
"Content-Type": "application/json"
|
| 198 |
+
}
|
| 199 |
+
data = {
|
| 200 |
+
"article": {
|
| 201 |
+
"title": title,
|
| 202 |
+
"body_html": html_body
|
| 203 |
+
}
|
| 204 |
+
}
|
| 205 |
+
|
| 206 |
+
response = requests.post(url, json=data, headers=headers)
|
| 207 |
+
if response.status_code == 201:
|
| 208 |
+
return True, response.json()
|
| 209 |
+
else:
|
| 210 |
+
return False, response.text
|
| 211 |
+
|
| 212 |
+
# === SHINY SERVER ===
|
| 213 |
+
def server(input, output, session):
|
| 214 |
+
related_keywords = reactive.Value([])
|
| 215 |
+
generated_blog = reactive.Value(("", "")) # (title, html_content)
|
| 216 |
+
|
| 217 |
+
@output
|
| 218 |
+
@render.ui
|
| 219 |
+
@reactive.event(input.generate_btn)
|
| 220 |
+
async def blog_result():
|
| 221 |
+
url = input.url()
|
| 222 |
+
if not url:
|
| 223 |
+
return ui.HTML("<p><strong>⚠️ Please enter a URL.</strong></p>")
|
| 224 |
+
|
| 225 |
+
keywords, scraped = await get_keywords_and_content(url)
|
| 226 |
+
related_keywords.set(keywords)
|
| 227 |
+
keyword_str = ", ".join(keywords)
|
| 228 |
+
|
| 229 |
+
# Title generation from scraped text
|
| 230 |
+
infer_topic_prompt = (
|
| 231 |
+
f"Based on the following article content:\n\n{scraped[:2000]}\n\n"
|
| 232 |
+
f"Return a short, descriptive blog post title (max 70 characters)."
|
| 233 |
+
f"Return ONLY the TITLE"
|
| 234 |
+
)
|
| 235 |
+
seo_title = get_response(
|
| 236 |
+
input=infer_topic_prompt,
|
| 237 |
+
template=lambda x: x.strip().replace('"', ''),
|
| 238 |
+
llm="gemini",
|
| 239 |
+
md=False,
|
| 240 |
+
temperature=0.5,
|
| 241 |
+
max_tokens=20
|
| 242 |
+
)
|
| 243 |
+
|
| 244 |
+
# Blog generation with injected SEO
|
| 245 |
+
prompt = (
|
| 246 |
+
f"You are a content writer for a collectibles brand called 'Ultima Supply'.\n"
|
| 247 |
+
f"Given the following scraped content:\n\n{scraped}\n\n"
|
| 248 |
+
f"Adapt this into an engaging, original, and heavily detailed SEO-optimized blog post.\n"
|
| 249 |
+
f"Inject the following SEO keywords naturally and organically throughout the content:\n{keyword_str}\n\n"
|
| 250 |
+
f"Use proper HTML structure: <h1> for the title, <h2> for section headers, and <p> for all paragraphs.\n"
|
| 251 |
+
f"Do NOT include any markdown, code blocks, or triple backticks. Do NOT use ```html or any formatting fences.\n"
|
| 252 |
+
f"Just return the raw HTML.\n\n"
|
| 253 |
+
f"DO NOT include any hyperlinks or images inside the body of the blog post.\n"
|
| 254 |
+
f"At the very end, add a single call-to-action in a new <p> tag:\n"
|
| 255 |
+
f"Visit <a href='https://ultima-supply.myshopify.com'>Ultima Supply</a> to explore more collectibles."
|
| 256 |
+
)
|
| 257 |
+
|
| 258 |
+
blog_html = get_response(
|
| 259 |
+
input=prompt,
|
| 260 |
+
template=lambda x: x.strip(),
|
| 261 |
+
llm="gemini",
|
| 262 |
+
md=False,
|
| 263 |
+
temperature=0.9,
|
| 264 |
+
max_tokens=5000
|
| 265 |
+
)
|
| 266 |
+
|
| 267 |
+
blog_html = re.sub(r"```[a-zA-Z]*\n?", "", blog_html).strip()
|
| 268 |
+
blog_html = blog_html.replace("```", "").strip()
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
generated_blog.set((seo_title, blog_html))
|
| 272 |
+
|
| 273 |
+
return ui.HTML(
|
| 274 |
+
f"<p><strong>✅ Blog generated with title:</strong> {seo_title}</p>"
|
| 275 |
+
f"<p>Click 'Post to Shopify' to publish.</p>{blog_html}"
|
| 276 |
+
)
|
| 277 |
+
|
| 278 |
+
@output
|
| 279 |
+
@render.ui
|
| 280 |
+
def keywords_used():
|
| 281 |
+
kws = related_keywords()
|
| 282 |
+
if not kws:
|
| 283 |
+
return ui.HTML("<p><strong>No SEO keywords retrieved yet.</strong></p>")
|
| 284 |
+
|
| 285 |
+
return ui.HTML(
|
| 286 |
+
f"<p><strong>✅ SEO Keywords Injected ({len(kws)}):</strong></p><ul>"
|
| 287 |
+
+ "".join(f"<li>{kw}</li>" for kw in kws) +
|
| 288 |
+
"</ul>"
|
| 289 |
+
)
|
| 290 |
+
|
| 291 |
+
|
| 292 |
+
@reactive.effect
|
| 293 |
+
@reactive.event(input.post_btn)
|
| 294 |
+
def post_to_shopify():
|
| 295 |
+
seo_title, html = generated_blog()
|
| 296 |
+
|
| 297 |
+
if not html:
|
| 298 |
+
ui.notification_show("⚠️ No blog generated yet.", type="warning")
|
| 299 |
+
return
|
| 300 |
+
|
| 301 |
+
success, response = publish_blog_post(title=seo_title, html_body=html)
|
| 302 |
+
|
| 303 |
+
if success:
|
| 304 |
+
ui.notification_show("✅ Blog posted to Shopify successfully!", type="message")
|
| 305 |
+
else:
|
| 306 |
+
ui.notification_show(f"❌ Failed to publish: {response}", type="error")
|
build/lib/server/meta.py
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from shiny import reactive, render, ui
|
| 2 |
+
import os
|
| 3 |
+
import requests
|
| 4 |
+
from dotenv import load_dotenv
|
| 5 |
+
from llm_connect import get_response # your existing function
|
| 6 |
+
|
| 7 |
+
load_dotenv()
|
| 8 |
+
|
| 9 |
+
PAGE_ID = os.getenv("FB_PAGE_ID")
|
| 10 |
+
ACCESS_TOKEN = os.getenv("FB_PAGE_ACCESS_TOKEN")
|
| 11 |
+
|
| 12 |
+
generated_fb_post = reactive.Value("")
|
| 13 |
+
|
| 14 |
+
def generate_facebook_post(topic: str) -> str:
|
| 15 |
+
prompt = (
|
| 16 |
+
f"You are a social media manager for a hobby e-commerce company called 'Ultima Supply'.\n"
|
| 17 |
+
f"Write a short, engaging Facebook post (max 500 characters) about: '{topic}'.\n"
|
| 18 |
+
f"Use casual and friendly tone. Include emojis and 3-5 relevant hashtags."
|
| 19 |
+
)
|
| 20 |
+
return get_response(
|
| 21 |
+
input=prompt,
|
| 22 |
+
template=lambda x: x,
|
| 23 |
+
llm="gemini",
|
| 24 |
+
md=False,
|
| 25 |
+
temperature=0.9,
|
| 26 |
+
max_tokens=500
|
| 27 |
+
)
|
| 28 |
+
|
| 29 |
+
def post_to_facebook(message: str) -> str:
|
| 30 |
+
url = f"https://graph.facebook.com/{PAGE_ID}/feed"
|
| 31 |
+
payload = {
|
| 32 |
+
"message": message,
|
| 33 |
+
"access_token": ACCESS_TOKEN
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
response = requests.post(url, data=payload)
|
| 37 |
+
if response.status_code != 200:
|
| 38 |
+
return f"❌ Facebook post failed: {response.status_code} - {response.text}"
|
| 39 |
+
|
| 40 |
+
post_id = response.json().get("id", "Unknown")
|
| 41 |
+
return f"✅ Post successful! Facebook Post ID: {post_id}"
|
| 42 |
+
|
| 43 |
+
def server(input, output, session):
|
| 44 |
+
post_status = reactive.Value("")
|
| 45 |
+
|
| 46 |
+
@output
|
| 47 |
+
@render.ui
|
| 48 |
+
@reactive.event(input.gen_btn_fb)
|
| 49 |
+
def fb_post_draft():
|
| 50 |
+
topic = input.fb_topic()
|
| 51 |
+
if not topic.strip():
|
| 52 |
+
return ui.HTML("<p><strong>⚠️ Enter a topic first.</strong></p>")
|
| 53 |
+
post = generate_facebook_post(topic)
|
| 54 |
+
generated_fb_post.set(post)
|
| 55 |
+
return ui.HTML(f"<p><strong>Generated Facebook Post:</strong><br>{post}</p>")
|
| 56 |
+
|
| 57 |
+
@output
|
| 58 |
+
@render.text
|
| 59 |
+
def fb_post_status():
|
| 60 |
+
return post_status()
|
| 61 |
+
|
| 62 |
+
@reactive.effect
|
| 63 |
+
@reactive.event(input.post_btn_fb)
|
| 64 |
+
def _():
|
| 65 |
+
post = generated_fb_post()
|
| 66 |
+
if not post:
|
| 67 |
+
post_status.set("⚠️ No post generated yet.")
|
| 68 |
+
else:
|
| 69 |
+
result = post_to_facebook(post)
|
| 70 |
+
post_status.set(result)
|
build/lib/server/price_matching.py
ADDED
|
File without changes
|
build/lib/server/twitter.py
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from shiny import reactive, render, ui
|
| 2 |
+
import os
|
| 3 |
+
import tweepy
|
| 4 |
+
from dotenv import load_dotenv
|
| 5 |
+
from llm_connect import get_response # your existing function
|
| 6 |
+
|
| 7 |
+
load_dotenv()
|
| 8 |
+
|
| 9 |
+
# Twitter API v2 credentials
|
| 10 |
+
BEARER_TOKEN = os.getenv("TWITTER_BEARER_TOKEN")
|
| 11 |
+
API_KEY = os.getenv("TWITTER_ACC_API_KEY")
|
| 12 |
+
API_SECRET = os.getenv("TWITTER_ACC_API_SECRET")
|
| 13 |
+
ACCESS_TOKEN = os.getenv("TWITTER_ACC_ACCESS_TOKEN")
|
| 14 |
+
ACCESS_TOKEN_SECRET = os.getenv("TWITTER_ACC_ACCESS_TOKEN_SECRET")
|
| 15 |
+
|
| 16 |
+
client = tweepy.Client(
|
| 17 |
+
bearer_token=BEARER_TOKEN,
|
| 18 |
+
consumer_key=API_KEY,
|
| 19 |
+
consumer_secret=API_SECRET,
|
| 20 |
+
access_token=ACCESS_TOKEN,
|
| 21 |
+
access_token_secret=ACCESS_TOKEN_SECRET
|
| 22 |
+
)
|
| 23 |
+
|
| 24 |
+
generated_tweet = reactive.Value("")
|
| 25 |
+
|
| 26 |
+
def generate_tweet_from_topic(topic: str) -> str:
|
| 27 |
+
prompt = (
|
| 28 |
+
f"You are a social media manager for a hobby e-commerce company called 'Ultima Supply'.\n"
|
| 29 |
+
f"Write a short, engaging Twitter post (max 500 characters) about: '{topic}'.\n"
|
| 30 |
+
f"Include emojis or 3-5 SEO relevant hashtags. Use casual, fun language."
|
| 31 |
+
)
|
| 32 |
+
return get_response(
|
| 33 |
+
input=prompt,
|
| 34 |
+
template=lambda x: x,
|
| 35 |
+
llm='gemini',
|
| 36 |
+
md=False,
|
| 37 |
+
temperature=0.9,
|
| 38 |
+
max_tokens=500
|
| 39 |
+
)
|
| 40 |
+
|
| 41 |
+
def post_tweet(text: str) -> str:
|
| 42 |
+
try:
|
| 43 |
+
response = client.create_tweet(text=text)
|
| 44 |
+
return f"✅ Tweet posted (ID: {response.data['id']})"
|
| 45 |
+
except Exception as e:
|
| 46 |
+
return f"❌ Failed to post tweet: {e}"
|
| 47 |
+
|
| 48 |
+
def server(input, output, session):
|
| 49 |
+
post_status = reactive.Value("")
|
| 50 |
+
|
| 51 |
+
@output
|
| 52 |
+
@render.ui
|
| 53 |
+
@reactive.event(input.gen_btn_twt)
|
| 54 |
+
def tweet_draft():
|
| 55 |
+
topic = input.tweet_topic()
|
| 56 |
+
if not topic.strip():
|
| 57 |
+
return ui.HTML("<p><strong>⚠️ Enter a topic first.</strong></p>")
|
| 58 |
+
tweet = generate_tweet_from_topic(topic)
|
| 59 |
+
generated_tweet.set(tweet)
|
| 60 |
+
return ui.HTML(f"<p><strong>Generated Tweet:</strong><br>{tweet}</p>")
|
| 61 |
+
|
| 62 |
+
@output
|
| 63 |
+
@render.text
|
| 64 |
+
def tweet_post_status():
|
| 65 |
+
return post_status()
|
| 66 |
+
|
| 67 |
+
@reactive.effect
|
| 68 |
+
@reactive.event(input.post_btn_twt)
|
| 69 |
+
def _():
|
| 70 |
+
tweet = generated_tweet()
|
| 71 |
+
if not tweet:
|
| 72 |
+
post_status.set("⚠️ No tweet generated yet.")
|
| 73 |
+
else:
|
| 74 |
+
result = post_tweet(tweet)
|
| 75 |
+
post_status.set(result)
|
pyproject.toml
CHANGED
|
@@ -25,3 +25,6 @@ dependencies = [
|
|
| 25 |
"bs4>=0.0.2",
|
| 26 |
"playwright>=1.53.0",
|
| 27 |
]
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
"bs4>=0.0.2",
|
| 26 |
"playwright>=1.53.0",
|
| 27 |
]
|
| 28 |
+
|
| 29 |
+
[tool.setuptools]
|
| 30 |
+
packages = ["server"]
|
requirements.txt
CHANGED
|
@@ -1,202 +1,35 @@
|
|
| 1 |
aiofiles==23.2.1
|
| 2 |
-
alembic @ file:///home/conda/feedstock_root/build_artifacts/alembic_1727122811080/work
|
| 3 |
-
altair @ file:///home/conda/feedstock_root/build_artifacts/altair-split_1727892028500/work
|
| 4 |
-
annotated-types @ file:///home/conda/feedstock_root/build_artifacts/annotated-types_1716290248287/work
|
| 5 |
-
anyio @ file:///home/conda/feedstock_root/build_artifacts/anyio_1728935693959/work
|
| 6 |
anywidget==0.9.13
|
| 7 |
appdirs==1.4.4
|
| 8 |
-
archspec @ file:///home/conda/feedstock_root/build_artifacts/archspec_1708969572489/work
|
| 9 |
-
argon2-cffi @ file:///home/conda/feedstock_root/build_artifacts/argon2-cffi_1692818318753/work
|
| 10 |
-
argon2-cffi-bindings @ file:///home/conda/feedstock_root/build_artifacts/argon2-cffi-bindings_1725356585055/work
|
| 11 |
-
arrow @ file:///home/conda/feedstock_root/build_artifacts/arrow_1696128962909/work
|
| 12 |
asgiref==3.8.1
|
| 13 |
-
astor @ file:///home/conda/feedstock_root/build_artifacts/astor_1733838630785/work
|
| 14 |
-
asttokens @ file:///home/conda/feedstock_root/build_artifacts/asttokens_1698341106958/work
|
| 15 |
-
async-lru @ file:///home/conda/feedstock_root/build_artifacts/async-lru_1690563019058/work
|
| 16 |
-
async_generator @ file:///home/conda/feedstock_root/build_artifacts/async_generator_1722652753231/work
|
| 17 |
-
attrs @ file:///home/conda/feedstock_root/build_artifacts/attrs_1722977137225/work
|
| 18 |
-
awscli @ file:///home/conda/feedstock_root/build_artifacts/awscli_1739865871727/work
|
| 19 |
-
Babel @ file:///home/conda/feedstock_root/build_artifacts/babel_1702422572539/work
|
| 20 |
backoff==2.2.1
|
| 21 |
-
bash_kernel @ file:///home/conda/feedstock_root/build_artifacts/bash_kernel_1736166576131/work
|
| 22 |
-
beautifulsoup4 @ file:///home/conda/feedstock_root/build_artifacts/beautifulsoup4_1705564648255/work
|
| 23 |
-
black @ file:///home/conda/feedstock_root/build_artifacts/black-recipe_1738616016765/work
|
| 24 |
-
bleach @ file:///home/conda/feedstock_root/build_artifacts/bleach_1696630167146/work
|
| 25 |
-
blinker @ file:///home/conda/feedstock_root/build_artifacts/blinker_1715091184126/work
|
| 26 |
-
blis @ file:///home/conda/feedstock_root/build_artifacts/cython-blis_1729663829405/work
|
| 27 |
-
bokeh @ file:///home/conda/feedstock_root/build_artifacts/bokeh_1728932480540/work
|
| 28 |
-
boltons @ file:///home/conda/feedstock_root/build_artifacts/boltons_1711936407380/work
|
| 29 |
-
botocore @ file:///home/conda/feedstock_root/build_artifacts/botocore_1739845302597/work
|
| 30 |
-
Bottleneck @ file:///home/conda/feedstock_root/build_artifacts/bottleneck_1729268868751/work
|
| 31 |
-
Brotli @ file:///home/conda/feedstock_root/build_artifacts/brotli-split_1725267488082/work
|
| 32 |
-
cached-property @ file:///home/conda/feedstock_root/build_artifacts/cached_property_1615209429212/work
|
| 33 |
-
cachetools @ file:///home/conda/feedstock_root/build_artifacts/cachetools_1737517575301/work
|
| 34 |
-
catalogue @ file:///home/conda/feedstock_root/build_artifacts/catalogue_1736092420971/work
|
| 35 |
causal-learn==0.1.4.0
|
| 36 |
-
certifi @ file:///home/conda/feedstock_root/build_artifacts/certifi_1739515848642/work/certifi
|
| 37 |
-
certipy @ file:///home/conda/feedstock_root/build_artifacts/certipy_1726467183730/work
|
| 38 |
-
cffi @ file:///home/conda/feedstock_root/build_artifacts/cffi_1725560558132/work
|
| 39 |
-
charset-normalizer @ file:///home/conda/feedstock_root/build_artifacts/charset-normalizer_1728479282467/work
|
| 40 |
clarabel==0.10.0
|
| 41 |
-
click @ file:///home/conda/feedstock_root/build_artifacts/click_1692311806742/work
|
| 42 |
-
cloudpathlib @ file:///home/conda/feedstock_root/build_artifacts/cloudpathlib-meta_1729359055183/work
|
| 43 |
-
cloudpickle @ file:///home/conda/feedstock_root/build_artifacts/cloudpickle_1729059237860/work
|
| 44 |
-
colorama @ file:///home/conda/feedstock_root/build_artifacts/colorama_1666700638685/work
|
| 45 |
-
comm @ file:///home/conda/feedstock_root/build_artifacts/comm_1710320294760/work
|
| 46 |
-
conda @ file:///home/conda/feedstock_root/build_artifacts/conda_1738241127085/work
|
| 47 |
-
conda-libmamba-solver @ file:///home/conda/feedstock_root/build_artifacts/conda-libmamba-solver_1737800978214/work/src
|
| 48 |
-
conda-package-handling @ file:///home/conda/feedstock_root/build_artifacts/conda-package-handling_1729006966809/work
|
| 49 |
-
conda_package_streaming @ file:///home/conda/feedstock_root/build_artifacts/conda-package-streaming_1729004031731/work
|
| 50 |
-
confection @ file:///home/conda/feedstock_root/build_artifacts/confection_1701179097401/work
|
| 51 |
connectorx==0.3.3
|
| 52 |
-
contourpy @ file:///home/conda/feedstock_root/build_artifacts/contourpy_1727293529029/work
|
| 53 |
-
cryptography @ file:///home/conda/feedstock_root/build_artifacts/cryptography-split_1729286672586/work
|
| 54 |
cvxpy==1.6.0
|
| 55 |
-
cycler @ file:///home/conda/feedstock_root/build_artifacts/cycler_1696677705766/work
|
| 56 |
-
cymem @ file:///home/conda/feedstock_root/build_artifacts/cymem_1737125888380/work
|
| 57 |
Cython==0.29.37
|
| 58 |
-
cytoolz @ file:///home/conda/feedstock_root/build_artifacts/cytoolz_1728335000602/work
|
| 59 |
-
dask @ file:///home/conda/feedstock_root/build_artifacts/dask-core_1729174050417/work
|
| 60 |
-
dask-expr @ file:///home/conda/feedstock_root/build_artifacts/dask-expr_1729200954651/work
|
| 61 |
-
debugpy @ file:///home/conda/feedstock_root/build_artifacts/debugpy_1728594098955/work
|
| 62 |
-
decorator @ file:///home/conda/feedstock_root/build_artifacts/decorator_1641555617451/work
|
| 63 |
-
defusedxml @ file:///home/conda/feedstock_root/build_artifacts/defusedxml_1615232257335/work
|
| 64 |
-
dill @ file:///home/conda/feedstock_root/build_artifacts/dill_1727594984357/work
|
| 65 |
-
distributed @ file:///home/conda/feedstock_root/build_artifacts/distributed_1729197350190/work
|
| 66 |
-
distro @ file:///home/conda/feedstock_root/build_artifacts/distro_1704321475663/work
|
| 67 |
-
docutils @ file:///home/conda/feedstock_root/build_artifacts/docutils_1728488675683/work
|
| 68 |
dowhy==0.12
|
| 69 |
-
duckdb @ file:///home/conda/feedstock_root/build_artifacts/python-duckdb-split_1739479592999/work/tools/pythonpkg
|
| 70 |
-
duckdb_engine @ file:///home/conda/feedstock_root/build_artifacts/duckdb-engine_1737017790760/work
|
| 71 |
econml==0.15.1
|
| 72 |
-
entrypoints @ file:///home/conda/feedstock_root/build_artifacts/entrypoints_1643888246732/work
|
| 73 |
-
et_xmlfile @ file:///home/conda/feedstock_root/build_artifacts/et_xmlfile_1729892939528/work
|
| 74 |
-
exceptiongroup @ file:///home/conda/feedstock_root/build_artifacts/exceptiongroup_1720869315914/work
|
| 75 |
-
executing @ file:///home/conda/feedstock_root/build_artifacts/executing_1725214404607/work
|
| 76 |
faicons==0.2.2
|
| 77 |
fastapi==0.115.8
|
| 78 |
fastexcel==0.12.1
|
| 79 |
-
fastjsonschema @ file:///home/conda/feedstock_root/build_artifacts/python-fastjsonschema_1718477020893/work/dist
|
| 80 |
ffmpy==0.5.0
|
| 81 |
filelock==3.17.0
|
| 82 |
-
filetype @ file:///home/conda/feedstock_root/build_artifacts/filetype_1667445778563/work
|
| 83 |
-
findspark @ file:///home/conda/feedstock_root/build_artifacts/findspark_1735921127722/work
|
| 84 |
-
fonttools @ file:///home/conda/feedstock_root/build_artifacts/fonttools_1729530372367/work
|
| 85 |
-
formulaic @ file:///home/conda/feedstock_root/build_artifacts/formulaic_1734816457952/work
|
| 86 |
-
fqdn @ file:///home/conda/feedstock_root/build_artifacts/fqdn_1638810296540/work/dist
|
| 87 |
-
frozendict @ file:///home/conda/feedstock_root/build_artifacts/frozendict_1728841327252/work
|
| 88 |
-
fsspec @ file:///home/conda/feedstock_root/build_artifacts/fsspec_1729608855534/work
|
| 89 |
-
fst-pso @ file:///home/conda/feedstock_root/build_artifacts/fst-pso_1674508369029/work
|
| 90 |
-
funcy @ file:///home/conda/feedstock_root/build_artifacts/funcy_1734381131891/work
|
| 91 |
-
future @ file:///home/conda/feedstock_root/build_artifacts/future_1738926421307/work
|
| 92 |
-
FuzzyTM @ file:///home/conda/feedstock_root/build_artifacts/fuzzytm_1674510610147/work
|
| 93 |
-
gensim @ file:///home/conda/feedstock_root/build_artifacts/gensim_1707360327203/work
|
| 94 |
-
gitdb @ file:///home/conda/feedstock_root/build_artifacts/gitdb_1697791558612/work
|
| 95 |
-
GitPython @ file:///home/conda/feedstock_root/build_artifacts/gitpython_1711991025291/work
|
| 96 |
-
gmpy2 @ file:///home/conda/feedstock_root/build_artifacts/gmpy2_1725379832114/work
|
| 97 |
-
googleapis-common-protos @ file:///home/conda/feedstock_root/build_artifacts/googleapis-common-protos-feedstock_1724834223554/work
|
| 98 |
gradio==5.16.1
|
| 99 |
gradio_client==1.7.0
|
| 100 |
-
graphlib-backport @ file:///home/conda/feedstock_root/build_artifacts/graphlib-backport_1635566048409/work
|
| 101 |
graphviz==0.20.3
|
| 102 |
-
greenlet @ file:///home/conda/feedstock_root/build_artifacts/greenlet_1726922184666/work
|
| 103 |
-
grpcio @ file:///home/conda/feedstock_root/build_artifacts/grpc-split_1730233386122/work
|
| 104 |
-
grpcio-status @ file:///home/conda/feedstock_root/build_artifacts/grpcio-status_1727244689671/work
|
| 105 |
-
h11 @ file:///home/conda/feedstock_root/build_artifacts/h11_1664132893548/work
|
| 106 |
-
h2 @ file:///home/conda/feedstock_root/build_artifacts/h2_1634280454336/work
|
| 107 |
-
h5py @ file:///home/conda/feedstock_root/build_artifacts/h5py_1729617657254/work
|
| 108 |
hpack==4.0.0
|
| 109 |
htmltools==0.6.0
|
| 110 |
-
httpcore @ file:///home/conda/feedstock_root/build_artifacts/httpcore_1727820890233/work
|
| 111 |
-
httpx @ file:///home/conda/feedstock_root/build_artifacts/httpx_1724778349782/work
|
| 112 |
huggingface-hub==0.28.1
|
| 113 |
-
hyperframe @ file:///home/conda/feedstock_root/build_artifacts/hyperframe_1619110129307/work
|
| 114 |
-
idna @ file:///home/conda/feedstock_root/build_artifacts/idna_1726459485162/work
|
| 115 |
-
imagecodecs @ file:///home/conda/feedstock_root/build_artifacts/imagecodecs_1734411441407/work
|
| 116 |
-
imageio @ file:///home/conda/feedstock_root/build_artifacts/imageio_1729190692267/work
|
| 117 |
-
importlib_metadata @ file:///home/conda/feedstock_root/build_artifacts/importlib-metadata_1726082825846/work
|
| 118 |
-
importlib_resources @ file:///home/conda/feedstock_root/build_artifacts/importlib_resources_1725921340658/work
|
| 119 |
-
interface_meta @ file:///home/conda/feedstock_root/build_artifacts/interface_meta_1734284382083/work
|
| 120 |
-
ipykernel @ file:///home/conda/feedstock_root/build_artifacts/ipykernel_1719845459717/work
|
| 121 |
-
ipympl @ file:///home/conda/feedstock_root/build_artifacts/ipympl_1713251546026/work
|
| 122 |
-
ipython @ file:///home/conda/feedstock_root/build_artifacts/ipython_1729866374957/work
|
| 123 |
-
ipython-sql @ file:///home/conda/feedstock_root/build_artifacts/ipython-sql_1636816912182/work
|
| 124 |
-
ipython_genutils @ file:///home/conda/feedstock_root/build_artifacts/ipython_genutils_1716278396992/work
|
| 125 |
-
ipywidgets @ file:///home/conda/feedstock_root/build_artifacts/ipywidgets_1724334859652/work
|
| 126 |
-
isoduration @ file:///home/conda/feedstock_root/build_artifacts/isoduration_1638811571363/work/dist
|
| 127 |
-
isort @ file:///home/conda/feedstock_root/build_artifacts/isort_1738061237894/work
|
| 128 |
-
jedi @ file:///home/conda/feedstock_root/build_artifacts/jedi_1696326070614/work
|
| 129 |
-
Jinja2 @ file:///home/conda/feedstock_root/build_artifacts/jinja2_1715127149914/work
|
| 130 |
-
jmespath @ file:///home/conda/feedstock_root/build_artifacts/jmespath_1733229141657/work
|
| 131 |
-
joblib @ file:///home/conda/feedstock_root/build_artifacts/joblib_1714665484399/work
|
| 132 |
-
json5 @ file:///home/conda/feedstock_root/build_artifacts/json5_1712986206667/work
|
| 133 |
-
jsonpatch @ file:///home/conda/feedstock_root/build_artifacts/jsonpatch_1695536281965/work
|
| 134 |
-
jsonpointer @ file:///home/conda/feedstock_root/build_artifacts/jsonpointer_1725302935093/work
|
| 135 |
-
jsonschema @ file:///home/conda/feedstock_root/build_artifacts/jsonschema_1720529478715/work
|
| 136 |
-
jsonschema-specifications @ file:///tmp/tmpvslgxhz5/src
|
| 137 |
jupysql==0.10.17
|
| 138 |
jupysql-plugin==0.4.5
|
| 139 |
-
jupyter-events @ file:///home/conda/feedstock_root/build_artifacts/jupyter_events_1710805637316/work
|
| 140 |
-
jupyter-lsp @ file:///home/conda/feedstock_root/build_artifacts/jupyter-lsp-meta_1712707420468/work/jupyter-lsp
|
| 141 |
-
jupyter-server-mathjax @ file:///home/conda/feedstock_root/build_artifacts/jupyter-server-mathjax_1672324512570/work
|
| 142 |
-
jupyter_client @ file:///home/conda/feedstock_root/build_artifacts/jupyter_client_1726610684920/work
|
| 143 |
-
jupyter_core @ file:///home/conda/feedstock_root/build_artifacts/jupyter_core_1727163409502/work
|
| 144 |
-
jupyter_server @ file:///home/conda/feedstock_root/build_artifacts/jupyter_server_1720816649297/work
|
| 145 |
-
jupyter_server_terminals @ file:///home/conda/feedstock_root/build_artifacts/jupyter_server_terminals_1710262634903/work
|
| 146 |
-
jupyterhub @ file:///home/conda/feedstock_root/build_artifacts/jupyterhub-feedstock_1729524405642/work
|
| 147 |
-
jupyterlab @ file:///home/conda/feedstock_root/build_artifacts/jupyterlab_1724745148804/work
|
| 148 |
-
jupyterlab_git @ file:///home/conda/feedstock_root/build_artifacts/jupyterlab-git_1720358782306/work
|
| 149 |
-
jupyterlab_pygments @ file:///home/conda/feedstock_root/build_artifacts/jupyterlab_pygments_1707149102966/work
|
| 150 |
-
jupyterlab_server @ file:///home/conda/feedstock_root/build_artifacts/jupyterlab_server-split_1721163288448/work
|
| 151 |
-
jupyterlab_widgets @ file:///home/conda/feedstock_root/build_artifacts/jupyterlab_widgets_1724331334887/work
|
| 152 |
-
jupytext @ file:///home/conda/feedstock_root/build_artifacts/jupytext_1739264996936/work
|
| 153 |
-
kiwisolver @ file:///home/conda/feedstock_root/build_artifacts/kiwisolver_1725459266942/work
|
| 154 |
-
langcodes @ file:///home/conda/feedstock_root/build_artifacts/langcodes_1734376437639/work
|
| 155 |
-
language_data @ file:///home/conda/feedstock_root/build_artifacts/language-data_1732032415021/work
|
| 156 |
-
lazy_loader @ file:///home/conda/feedstock_root/build_artifacts/lazy-loader_1723774329602/work
|
| 157 |
-
libmambapy @ file:///home/conda/feedstock_root/build_artifacts/mamba-split_1730842684690/work/libmambapy
|
| 158 |
-
lightgbm @ file:///home/conda/feedstock_root/build_artifacts/liblightgbm_1737912911005/work
|
| 159 |
-
lime @ file:///home/conda/feedstock_root/build_artifacts/lime_1734777765833/work
|
| 160 |
-
linearmodels @ file:///home/conda/feedstock_root/build_artifacts/linearmodels_1727187098966/work
|
| 161 |
linkify-it-py==2.0.3
|
| 162 |
llvmlite==0.43.0
|
| 163 |
-
locket @ file:///home/conda/feedstock_root/build_artifacts/locket_1650660393415/work
|
| 164 |
-
lz4 @ file:///home/conda/feedstock_root/build_artifacts/lz4_1733474241180/work
|
| 165 |
-
Mako @ file:///home/conda/feedstock_root/build_artifacts/mako_1715711344987/work
|
| 166 |
-
marisa-trie @ file:///home/conda/feedstock_root/build_artifacts/marisa-trie_1736178990851/work
|
| 167 |
-
Markdown @ file:///home/conda/feedstock_root/build_artifacts/markdown_1710435156458/work
|
| 168 |
-
markdown-it-py @ file:///home/conda/feedstock_root/build_artifacts/markdown-it-py_1733250460757/work
|
| 169 |
MarkupSafe==2.1.5
|
| 170 |
matplotlib==3.9.2
|
| 171 |
-
matplotlib-inline @ file:///home/conda/feedstock_root/build_artifacts/matplotlib-inline_1713250518406/work
|
| 172 |
-
mdit-py-plugins @ file:///home/conda/feedstock_root/build_artifacts/mdit-py-plugins_1733854715505/work
|
| 173 |
-
mdurl @ file:///home/conda/feedstock_root/build_artifacts/mdurl_1733255585584/work
|
| 174 |
-
menuinst @ file:///home/conda/feedstock_root/build_artifacts/menuinst_1725359038078/work
|
| 175 |
-
miniful @ file:///home/conda/feedstock_root/build_artifacts/miniful_1738578852010/work
|
| 176 |
-
mistune @ file:///home/conda/feedstock_root/build_artifacts/mistune_1698947099619/work
|
| 177 |
-
mizani @ file:///home/conda/feedstock_root/build_artifacts/mizani_1733850081884/work
|
| 178 |
-
mlxtend @ file:///home/conda/feedstock_root/build_artifacts/mlxtend_1737927625693/work
|
| 179 |
momentchi2==0.1.8
|
| 180 |
monotonic==1.6
|
| 181 |
-
mpmath @ file:///home/conda/feedstock_root/build_artifacts/mpmath_1678228039184/work
|
| 182 |
-
msgpack @ file:///home/conda/feedstock_root/build_artifacts/msgpack-python_1725975016068/work
|
| 183 |
munkres==1.1.4
|
| 184 |
-
murmurhash @ file:///home/conda/feedstock_root/build_artifacts/murmurhash_1728932916716/work
|
| 185 |
-
mypy_extensions @ file:///home/conda/feedstock_root/build_artifacts/mypy_extensions_1733230897951/work
|
| 186 |
-
narwhals @ file:///home/conda/feedstock_root/build_artifacts/narwhals_1739851660861/work
|
| 187 |
-
nbclassic @ file:///home/conda/feedstock_root/build_artifacts/nbclassic_1716838762700/work
|
| 188 |
-
nbclient @ file:///home/conda/feedstock_root/build_artifacts/nbclient_1710317608672/work
|
| 189 |
-
nbconvert @ file:///home/conda/feedstock_root/build_artifacts/nbconvert-meta_1718135430380/work
|
| 190 |
-
nbdime @ file:///home/conda/feedstock_root/build_artifacts/nbdime_1725627669057/work
|
| 191 |
-
nbformat @ file:///home/conda/feedstock_root/build_artifacts/nbformat_1712238998817/work
|
| 192 |
-
nest_asyncio @ file:///home/conda/feedstock_root/build_artifacts/nest-asyncio_1705850609492/work
|
| 193 |
-
networkx @ file:///home/conda/feedstock_root/build_artifacts/networkx_1729530778722/work
|
| 194 |
-
nltk @ file:///home/conda/feedstock_root/build_artifacts/nltk_1734309924703/work
|
| 195 |
-
notebook @ file:///home/conda/feedstock_root/build_artifacts/notebook_1724861303656/work
|
| 196 |
-
notebook_shim @ file:///home/conda/feedstock_root/build_artifacts/notebook-shim_1707957777232/work
|
| 197 |
-
numba @ file:///home/conda/feedstock_root/build_artifacts/numba_1718888016245/work
|
| 198 |
-
numexpr @ file:///home/conda/feedstock_root/build_artifacts/numexpr_1729662221511/work
|
| 199 |
-
numpy @ file:///home/conda/feedstock_root/build_artifacts/numpy_1707225359967/work/dist/numpy-1.26.4-cp312-cp312-linux_x86_64.whl#sha256=031b7d6b2e5e604d9e21fc21be713ebf28ce133ec872dce6de006742d5e49bab
|
| 200 |
nvidia-cublas-cu12==12.6.4.1
|
| 201 |
nvidia-cuda-cupti-cu12==12.6.80
|
| 202 |
nvidia-cuda-nvrtc-cu12==12.6.77
|
|
@@ -210,181 +43,56 @@ nvidia-cusparselt-cu12==0.6.3
|
|
| 210 |
nvidia-nccl-cu12==2.21.5
|
| 211 |
nvidia-nvjitlink-cu12==12.6.85
|
| 212 |
nvidia-nvtx-cu12==12.6.77
|
| 213 |
-
oauthlib @ file:///home/conda/feedstock_root/build_artifacts/oauthlib_1666056362788/work
|
| 214 |
-
openpyxl @ file:///home/conda/feedstock_root/build_artifacts/openpyxl_1725460884078/work
|
| 215 |
orjson==3.10.15
|
| 216 |
osqp==0.6.7.post3
|
| 217 |
-
outcome @ file:///home/conda/feedstock_root/build_artifacts/outcome_1733406188332/work
|
| 218 |
-
overrides @ file:///home/conda/feedstock_root/build_artifacts/overrides_1706394519472/work
|
| 219 |
-
packaging @ file:///home/conda/feedstock_root/build_artifacts/packaging_1718189413536/work
|
| 220 |
-
pamela @ file:///home/conda/feedstock_root/build_artifacts/pamela_1723212587578/work
|
| 221 |
pandas==2.2.3
|
| 222 |
-
pandocfilters @ file:///home/conda/feedstock_root/build_artifacts/pandocfilters_1631603243851/work
|
| 223 |
-
parso @ file:///home/conda/feedstock_root/build_artifacts/parso_1712320355065/work
|
| 224 |
-
partd @ file:///home/conda/feedstock_root/build_artifacts/partd_1715026491486/work
|
| 225 |
-
pathspec @ file:///home/conda/feedstock_root/build_artifacts/pathspec_1733233363808/work
|
| 226 |
-
patsy @ file:///home/conda/feedstock_root/build_artifacts/patsy_1704469236901/work
|
| 227 |
-
pexpect @ file:///home/conda/feedstock_root/build_artifacts/pexpect_1706113125309/work
|
| 228 |
-
pickleshare @ file:///home/conda/feedstock_root/build_artifacts/pickleshare_1602536217715/work
|
| 229 |
-
pillow @ file:///home/conda/feedstock_root/build_artifacts/pillow_1729065636207/work
|
| 230 |
-
pkgutil_resolve_name @ file:///home/conda/feedstock_root/build_artifacts/pkgutil-resolve-name_1694617248815/work
|
| 231 |
-
platformdirs @ file:///home/conda/feedstock_root/build_artifacts/platformdirs_1726613481435/work
|
| 232 |
ploomber-core==0.2.26
|
| 233 |
-
plotly @ file:///home/conda/feedstock_root/build_artifacts/plotly_1738287743623/work
|
| 234 |
-
plotnine @ file:///home/conda/feedstock_root/build_artifacts/plotnine_1735816953568/work
|
| 235 |
-
pluggy @ file:///home/conda/feedstock_root/build_artifacts/pluggy_1713667077545/work
|
| 236 |
polars==1.22.0
|
| 237 |
posthog==3.14.1
|
| 238 |
-
preshed @ file:///home/conda/feedstock_root/build_artifacts/preshed_1728945652685/work
|
| 239 |
-
prettytable @ file:///home/conda/feedstock_root/build_artifacts/prettytable_1738401694108/work
|
| 240 |
-
prometheus_client @ file:///home/conda/feedstock_root/build_artifacts/prometheus_client_1726901976720/work
|
| 241 |
-
prompt_toolkit @ file:///home/conda/feedstock_root/build_artifacts/prompt-toolkit_1727341649933/work
|
| 242 |
-
protobuf @ file:///home/conda/feedstock_root/build_artifacts/protobuf_1728668314281/work/bazel-bin/python/dist/protobuf-5.28.2-cp312-abi3-linux_x86_64.whl#sha256=f103c8b99ca0a96e2feeaa5c5589b37c02b05bd901d908f7825153340c69de0a
|
| 243 |
-
psutil @ file:///home/conda/feedstock_root/build_artifacts/psutil_1729847057810/work
|
| 244 |
-
psycopg2 @ file:///home/conda/feedstock_root/build_artifacts/psycopg2-split_1727892814430/work
|
| 245 |
psygnal==0.12.0
|
| 246 |
-
ptyprocess @ file:///home/conda/feedstock_root/build_artifacts/ptyprocess_1609419310487/work/dist/ptyprocess-0.7.0-py2.py3-none-any.whl
|
| 247 |
-
pure_eval @ file:///home/conda/feedstock_root/build_artifacts/pure_eval_1721585709575/work
|
| 248 |
-
py-cpuinfo @ file:///home/conda/feedstock_root/build_artifacts/py-cpuinfo_1666774466606/work
|
| 249 |
py4j==0.10.9.7
|
| 250 |
pyarrow==17.0.0
|
| 251 |
-
pyasn1 @ file:///home/conda/feedstock_root/build_artifacts/pyasn1_1733217608156/work
|
| 252 |
-
pycosat @ file:///home/conda/feedstock_root/build_artifacts/pycosat_1696355774225/work
|
| 253 |
-
pycparser @ file:///home/conda/feedstock_root/build_artifacts/pycparser_1711811537435/work
|
| 254 |
-
pycurl @ file:///home/conda/feedstock_root/build_artifacts/pycurl_1725361476421/work
|
| 255 |
-
pydantic @ file:///home/conda/feedstock_root/build_artifacts/pydantic_1726601062926/work
|
| 256 |
-
pydantic_core @ file:///home/conda/feedstock_root/build_artifacts/pydantic-core_1726524971346/work
|
| 257 |
-
pydeck @ file:///home/conda/feedstock_root/build_artifacts/pydeck_1667589451974/work
|
| 258 |
pydot==3.0.4
|
| 259 |
-
pydotplus @ file:///home/conda/feedstock_root/build_artifacts/pydotplus_1734535704590/work
|
| 260 |
pydub==0.25.1
|
| 261 |
-
pyFUME @ file:///home/conda/feedstock_root/build_artifacts/pyfume_1674509566653/work
|
| 262 |
-
Pygments @ file:///home/conda/feedstock_root/build_artifacts/pygments_1714846767233/work
|
| 263 |
-
pyhdfe @ file:///home/conda/feedstock_root/build_artifacts/pyhdfe_1735397688053/work
|
| 264 |
-
PyJWT @ file:///home/conda/feedstock_root/build_artifacts/pyjwt_1722701264352/work
|
| 265 |
-
pyLDAvis @ file:///home/conda/feedstock_root/build_artifacts/pyldavis_1736887884723/work
|
| 266 |
-
pyparsing @ file:///home/conda/feedstock_root/build_artifacts/pyparsing_1728880423364/work
|
| 267 |
pyrsm==1.2.0
|
| 268 |
-
PySocks @ file:///home/conda/feedstock_root/build_artifacts/pysocks_1661604839144/work
|
| 269 |
pyspark==4.0.0.dev2
|
| 270 |
-
python-dateutil @ file:///home/conda/feedstock_root/build_artifacts/python-dateutil_1709299778482/work
|
| 271 |
-
python-dotenv @ file:///home/conda/feedstock_root/build_artifacts/python-dotenv_1733243180666/work
|
| 272 |
-
python-json-logger @ file:///home/conda/feedstock_root/build_artifacts/python-json-logger_1677079630776/work
|
| 273 |
python-multipart==0.0.20
|
| 274 |
-
pytz @ file:///home/conda/feedstock_root/build_artifacts/pytz_1706886791323/work
|
| 275 |
PyWavelets==1.7.0
|
| 276 |
-
PyYAML @ file:///home/conda/feedstock_root/build_artifacts/pyyaml_1725456134219/work
|
| 277 |
-
pyzmq @ file:///home/conda/feedstock_root/build_artifacts/pyzmq_1728642254015/work
|
| 278 |
qdldl==0.1.7.post5
|
| 279 |
questionary==2.1.0
|
| 280 |
radian==0.6.13
|
| 281 |
rchitect==0.4.7
|
| 282 |
-
referencing @ file:///home/conda/feedstock_root/build_artifacts/referencing_1714619483868/work
|
| 283 |
-
regex @ file:///home/conda/feedstock_root/build_artifacts/regex_1730952243530/work
|
| 284 |
-
requests @ file:///home/conda/feedstock_root/build_artifacts/requests_1717057054362/work
|
| 285 |
-
rfc3339-validator @ file:///home/conda/feedstock_root/build_artifacts/rfc3339-validator_1638811747357/work
|
| 286 |
-
rfc3986-validator @ file:///home/conda/feedstock_root/build_artifacts/rfc3986-validator_1598024191506/work
|
| 287 |
-
rich @ file:///home/conda/feedstock_root/build_artifacts/rich_1733342254348/work/dist
|
| 288 |
-
rpds-py @ file:///home/conda/feedstock_root/build_artifacts/rpds-py_1725327050544/work
|
| 289 |
-
rsa @ file:///home/conda/feedstock_root/build_artifacts/rsa_1614171254180/work
|
| 290 |
-
ruamel.yaml @ file:///home/conda/feedstock_root/build_artifacts/ruamel.yaml_1728764986945/work
|
| 291 |
-
ruamel.yaml.clib @ file:///home/conda/feedstock_root/build_artifacts/ruamel.yaml.clib_1728724466132/work
|
| 292 |
ruff==0.9.6
|
| 293 |
-
s3transfer @ file:///home/conda/feedstock_root/build_artifacts/s3transfer_1737737761316/work
|
| 294 |
safehttpx==0.1.6
|
| 295 |
safetensors==0.5.2
|
| 296 |
-
scikit-image @ file:///home/conda/feedstock_root/build_artifacts/scikit-image_1729813832871/work/dist/scikit_image-0.24.0-cp312-cp312-linux_x86_64.whl#sha256=c02226adc1bbc3cff0787d5d2c2ef3ff92d050487b0086107059af19dc29b97d
|
| 297 |
-
scikit-learn @ file:///home/conda/feedstock_root/build_artifacts/scikit-learn_1726082671867/work/dist/scikit_learn-1.5.2-cp312-cp312-linux_x86_64.whl#sha256=7788ecb5f833925f336ead218eb6aff84070ef8d4c6457fe66e41ed104ed2600
|
| 298 |
-
scipy @ file:///home/conda/feedstock_root/build_artifacts/scipy-split_1706041474046/work/dist/scipy-1.12.0-cp312-cp312-linux_x86_64.whl#sha256=455585fb13f602615d4e6633d9becf631347243101f5b6983e5718c2dd364888
|
| 299 |
scs==3.2.7.post2
|
| 300 |
-
seaborn @ file:///home/conda/feedstock_root/build_artifacts/seaborn-split_1714494649443/work
|
| 301 |
-
selenium @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_selenium_1737667202/work
|
| 302 |
semantic-version==2.10.0
|
| 303 |
-
Send2Trash @ file:///home/conda/feedstock_root/build_artifacts/send2trash_1712584999685/work
|
| 304 |
setuptools==75.1.0
|
| 305 |
shap==0.43.0
|
| 306 |
-
shellingham @ file:///home/conda/feedstock_root/build_artifacts/shellingham_1733300899265/work
|
| 307 |
shiny==1.2.1
|
| 308 |
shinyswatch==0.8.0
|
| 309 |
shinywidgets==0.5.1
|
| 310 |
-
simpful @ file:///home/conda/feedstock_root/build_artifacts/simpful_1738578860095/work
|
| 311 |
-
simpy @ file:///home/conda/feedstock_root/build_artifacts/simpy_1735073919790/work
|
| 312 |
-
six @ file:///home/conda/feedstock_root/build_artifacts/six_1620240208055/work
|
| 313 |
slicer==0.0.7
|
| 314 |
-
smart_open @ file:///home/conda/feedstock_root/build_artifacts/smart_open_1734485076778/work/dist
|
| 315 |
-
smmap @ file:///home/conda/feedstock_root/build_artifacts/smmap_1634310307496/work
|
| 316 |
-
sniffio @ file:///home/conda/feedstock_root/build_artifacts/sniffio_1708952932303/work
|
| 317 |
-
sortedcontainers @ file:///home/conda/feedstock_root/build_artifacts/sortedcontainers_1621217038088/work
|
| 318 |
-
soupsieve @ file:///home/conda/feedstock_root/build_artifacts/soupsieve_1693929250441/work
|
| 319 |
-
spacy @ file:///home/conda/feedstock_root/build_artifacts/spacy_1732449874682/work
|
| 320 |
-
spacy-legacy @ file:///home/conda/feedstock_root/build_artifacts/spacy-legacy_1674550301837/work
|
| 321 |
-
spacy-loggers @ file:///home/conda/feedstock_root/build_artifacts/spacy-loggers_1694527114282/work
|
| 322 |
sparse==0.15.5
|
| 323 |
-
SQLAlchemy @ file:///home/conda/feedstock_root/build_artifacts/sqlalchemy_1729066352888/work
|
| 324 |
sqlglot==26.6.0
|
| 325 |
-
sqlparse @ file:///home/conda/feedstock_root/build_artifacts/sqlparse_1734007102193/work
|
| 326 |
-
srsly @ file:///home/conda/feedstock_root/build_artifacts/srsly_1737143183180/work
|
| 327 |
-
stack-data @ file:///home/conda/feedstock_root/build_artifacts/stack_data_1669632077133/work
|
| 328 |
starlette==0.45.3
|
| 329 |
-
statsmodels @ file:///home/conda/feedstock_root/build_artifacts/statsmodels_1727986688191/work
|
| 330 |
-
streamlit @ file:///home/conda/feedstock_root/build_artifacts/streamlit_1739846950093/work
|
| 331 |
sympy==1.13.1
|
| 332 |
-
tables @ file:///home/conda/feedstock_root/build_artifacts/pytables_1724161041994/work
|
| 333 |
-
tblib @ file:///home/conda/feedstock_root/build_artifacts/tblib_1702066284995/work
|
| 334 |
-
tenacity @ file:///home/conda/feedstock_root/build_artifacts/tenacity_1733649050774/work
|
| 335 |
-
terminado @ file:///home/conda/feedstock_root/build_artifacts/terminado_1710262609923/work
|
| 336 |
textblob==0.19.0
|
| 337 |
-
thinc @ file:///home/conda/feedstock_root/build_artifacts/thinc_1733202756977/work
|
| 338 |
-
threadpoolctl @ file:///home/conda/feedstock_root/build_artifacts/threadpoolctl_1714400101435/work
|
| 339 |
-
tifffile @ file:///home/conda/feedstock_root/build_artifacts/tifffile_1727250434425/work
|
| 340 |
-
tinycss2 @ file:///home/conda/feedstock_root/build_artifacts/tinycss2_1729802851396/work
|
| 341 |
tokenizers==0.21.0
|
| 342 |
-
toml @ file:///home/conda/feedstock_root/build_artifacts/toml_1734091811753/work
|
| 343 |
-
tomli @ file:///home/conda/feedstock_root/build_artifacts/tomli_1727974628237/work
|
| 344 |
tomlkit==0.13.2
|
| 345 |
-
toolz @ file:///home/conda/feedstock_root/build_artifacts/toolz_1728059506884/work
|
| 346 |
torch==2.6.0+cu126
|
| 347 |
torchaudio==2.6.0+cu126
|
| 348 |
torchvision==0.21.0+cu126
|
| 349 |
-
tornado @ file:///home/conda/feedstock_root/build_artifacts/tornado_1724956131631/work
|
| 350 |
-
tqdm @ file:///home/conda/feedstock_root/build_artifacts/tqdm_1722737464726/work
|
| 351 |
-
traitlets @ file:///home/conda/feedstock_root/build_artifacts/traitlets_1713535121073/work
|
| 352 |
transformers==4.49.0
|
| 353 |
-
trio @ file:///home/conda/feedstock_root/build_artifacts/trio_1739529641377/work
|
| 354 |
-
trio-websocket @ file:///home/conda/feedstock_root/build_artifacts/bld/rattler-build_trio-websocket_1739800863/work
|
| 355 |
triton==3.2.0
|
| 356 |
-
truststore @ file:///home/conda/feedstock_root/build_artifacts/truststore_1729762363021/work
|
| 357 |
typer==0.15.1
|
| 358 |
typer-slim==0.15.1
|
| 359 |
-
types-python-dateutil @ file:///home/conda/feedstock_root/build_artifacts/types-python-dateutil_1727940235703/work
|
| 360 |
-
typing-utils @ file:///home/conda/feedstock_root/build_artifacts/typing_utils_1622899189314/work
|
| 361 |
-
typing_extensions @ file:///home/conda/feedstock_root/build_artifacts/typing_extensions_1717802530399/work
|
| 362 |
-
tzdata @ file:///home/conda/feedstock_root/build_artifacts/python-tzdata_1727140567071/work
|
| 363 |
-
tzlocal @ file:///home/conda/feedstock_root/build_artifacts/tzlocal_1739471997586/work
|
| 364 |
uc-micro-py==1.0.3
|
| 365 |
-
unicodedata2 @ file:///home/conda/feedstock_root/build_artifacts/unicodedata2_1729704561929/work
|
| 366 |
-
uri-template @ file:///home/conda/feedstock_root/build_artifacts/uri-template_1688655812972/work/dist
|
| 367 |
-
urllib3 @ file:///home/conda/feedstock_root/build_artifacts/urllib3_1726496430923/work
|
| 368 |
uv==0.6.1
|
| 369 |
uvicorn==0.34.0
|
| 370 |
vaderSentiment==3.3.2
|
| 371 |
-
wasabi @ file:///home/conda/feedstock_root/build_artifacts/wasabi_1715409665169/work
|
| 372 |
-
watchdog @ file:///home/conda/feedstock_root/build_artifacts/watchdog_1730492891215/work
|
| 373 |
watchfiles==1.0.4
|
| 374 |
-
wcwidth @ file:///home/conda/feedstock_root/build_artifacts/wcwidth_1704731205417/work
|
| 375 |
-
weasel @ file:///home/conda/feedstock_root/build_artifacts/weasel_1734270156651/work
|
| 376 |
-
webcolors @ file:///home/conda/feedstock_root/build_artifacts/webcolors_1723294704277/work
|
| 377 |
-
webencodings @ file:///home/conda/feedstock_root/build_artifacts/webencodings_1694681268211/work
|
| 378 |
-
websocket-client @ file:///home/conda/feedstock_root/build_artifacts/websocket-client_1713923384721/work
|
| 379 |
websockets==14.2
|
| 380 |
wheel==0.44.0
|
| 381 |
-
widgetsnbextension @ file:///home/conda/feedstock_root/build_artifacts/widgetsnbextension_1724331337528/work
|
| 382 |
-
wrapt @ file:///home/conda/feedstock_root/build_artifacts/wrapt_1736869451908/work
|
| 383 |
-
wsproto @ file:///home/conda/feedstock_root/build_artifacts/wsproto_1733060193308/work
|
| 384 |
-
xgboost @ file:///home/conda/feedstock_root/build_artifacts/xgboost-split_1738880198843/work/python-package
|
| 385 |
-
xlrd @ file:///home/conda/feedstock_root/build_artifacts/xlrd_1610224409810/work
|
| 386 |
xlsx2csv==0.8.4
|
| 387 |
-
xyzservices @ file:///home/conda/feedstock_root/build_artifacts/xyzservices_1725366347586/work
|
| 388 |
-
zict @ file:///home/conda/feedstock_root/build_artifacts/zict_1681770155528/work
|
| 389 |
-
zipp @ file:///home/conda/feedstock_root/build_artifacts/zipp_1726248574750/work
|
| 390 |
zstandard==0.23.0
|
|
|
|
| 1 |
aiofiles==23.2.1
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
anywidget==0.9.13
|
| 3 |
appdirs==1.4.4
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
asgiref==3.8.1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
backoff==2.2.1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
causal-learn==0.1.4.0
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
clarabel==0.10.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
connectorx==0.3.3
|
|
|
|
|
|
|
| 9 |
cvxpy==1.6.0
|
|
|
|
|
|
|
| 10 |
Cython==0.29.37
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
dowhy==0.12
|
|
|
|
|
|
|
| 12 |
econml==0.15.1
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
faicons==0.2.2
|
| 14 |
fastapi==0.115.8
|
| 15 |
fastexcel==0.12.1
|
|
|
|
| 16 |
ffmpy==0.5.0
|
| 17 |
filelock==3.17.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
gradio==5.16.1
|
| 19 |
gradio_client==1.7.0
|
|
|
|
| 20 |
graphviz==0.20.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
hpack==4.0.0
|
| 22 |
htmltools==0.6.0
|
|
|
|
|
|
|
| 23 |
huggingface-hub==0.28.1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
jupysql==0.10.17
|
| 25 |
jupysql-plugin==0.4.5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
linkify-it-py==2.0.3
|
| 27 |
llvmlite==0.43.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
MarkupSafe==2.1.5
|
| 29 |
matplotlib==3.9.2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
momentchi2==0.1.8
|
| 31 |
monotonic==1.6
|
|
|
|
|
|
|
| 32 |
munkres==1.1.4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
nvidia-cublas-cu12==12.6.4.1
|
| 34 |
nvidia-cuda-cupti-cu12==12.6.80
|
| 35 |
nvidia-cuda-nvrtc-cu12==12.6.77
|
|
|
|
| 43 |
nvidia-nccl-cu12==2.21.5
|
| 44 |
nvidia-nvjitlink-cu12==12.6.85
|
| 45 |
nvidia-nvtx-cu12==12.6.77
|
|
|
|
|
|
|
| 46 |
orjson==3.10.15
|
| 47 |
osqp==0.6.7.post3
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
pandas==2.2.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
ploomber-core==0.2.26
|
|
|
|
|
|
|
|
|
|
| 50 |
polars==1.22.0
|
| 51 |
posthog==3.14.1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
psygnal==0.12.0
|
|
|
|
|
|
|
|
|
|
| 53 |
py4j==0.10.9.7
|
| 54 |
pyarrow==17.0.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
pydot==3.0.4
|
|
|
|
| 56 |
pydub==0.25.1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
pyrsm==1.2.0
|
|
|
|
| 58 |
pyspark==4.0.0.dev2
|
|
|
|
|
|
|
|
|
|
| 59 |
python-multipart==0.0.20
|
|
|
|
| 60 |
PyWavelets==1.7.0
|
|
|
|
|
|
|
| 61 |
qdldl==0.1.7.post5
|
| 62 |
questionary==2.1.0
|
| 63 |
radian==0.6.13
|
| 64 |
rchitect==0.4.7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
ruff==0.9.6
|
|
|
|
| 66 |
safehttpx==0.1.6
|
| 67 |
safetensors==0.5.2
|
|
|
|
|
|
|
|
|
|
| 68 |
scs==3.2.7.post2
|
|
|
|
|
|
|
| 69 |
semantic-version==2.10.0
|
|
|
|
| 70 |
setuptools==75.1.0
|
| 71 |
shap==0.43.0
|
|
|
|
| 72 |
shiny==1.2.1
|
| 73 |
shinyswatch==0.8.0
|
| 74 |
shinywidgets==0.5.1
|
|
|
|
|
|
|
|
|
|
| 75 |
slicer==0.0.7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
sparse==0.15.5
|
|
|
|
| 77 |
sqlglot==26.6.0
|
|
|
|
|
|
|
|
|
|
| 78 |
starlette==0.45.3
|
|
|
|
|
|
|
| 79 |
sympy==1.13.1
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
textblob==0.19.0
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
tokenizers==0.21.0
|
|
|
|
|
|
|
| 82 |
tomlkit==0.13.2
|
|
|
|
| 83 |
torch==2.6.0+cu126
|
| 84 |
torchaudio==2.6.0+cu126
|
| 85 |
torchvision==0.21.0+cu126
|
|
|
|
|
|
|
|
|
|
| 86 |
transformers==4.49.0
|
|
|
|
|
|
|
| 87 |
triton==3.2.0
|
|
|
|
| 88 |
typer==0.15.1
|
| 89 |
typer-slim==0.15.1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
uc-micro-py==1.0.3
|
|
|
|
|
|
|
|
|
|
| 91 |
uv==0.6.1
|
| 92 |
uvicorn==0.34.0
|
| 93 |
vaderSentiment==3.3.2
|
|
|
|
|
|
|
| 94 |
watchfiles==1.0.4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
websockets==14.2
|
| 96 |
wheel==0.44.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
xlsx2csv==0.8.4
|
|
|
|
|
|
|
|
|
|
| 98 |
zstandard==0.23.0
|
ultima_seo.egg-info/PKG-INFO
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.4
|
| 2 |
+
Name: ultima-seo
|
| 3 |
+
Version: 0.1.0
|
| 4 |
+
Summary: Add your description here
|
| 5 |
+
Requires-Python: >=3.12
|
| 6 |
+
Description-Content-Type: text/markdown
|
| 7 |
+
Requires-Dist: scipy==1.11.4
|
| 8 |
+
Requires-Dist: anthropic>=0.55.0
|
| 9 |
+
Requires-Dist: google-generativeai>=0.8.5
|
| 10 |
+
Requires-Dist: ipywidgets>=8.1.7
|
| 11 |
+
Requires-Dist: langchain>=0.3.26
|
| 12 |
+
Requires-Dist: langchain-anthropic>=0.3.16
|
| 13 |
+
Requires-Dist: langchain-community>=0.0.28
|
| 14 |
+
Requires-Dist: langchain-google-genai>=2.0.10
|
| 15 |
+
Requires-Dist: langchain-openai>=0.3.27
|
| 16 |
+
Requires-Dist: openai>=1.93.0
|
| 17 |
+
Requires-Dist: pydantic>=2.11.7
|
| 18 |
+
Requires-Dist: pydantic-ai>=0.3.5
|
| 19 |
+
Requires-Dist: pyrsm>=1.6.0
|
| 20 |
+
Requires-Dist: python-dotenv>=1.1.1
|
| 21 |
+
Requires-Dist: pytrends>=4.9.2
|
| 22 |
+
Requires-Dist: requests>=2.32.4
|
| 23 |
+
Requires-Dist: tweepy>=4.16.0
|
| 24 |
+
Requires-Dist: bs4>=0.0.2
|
| 25 |
+
Requires-Dist: playwright>=1.53.0
|
| 26 |
+
|
| 27 |
+
---
|
| 28 |
+
title: Ultima Seo
|
| 29 |
+
emoji: 🌍
|
| 30 |
+
colorFrom: yellow
|
| 31 |
+
colorTo: indigo
|
| 32 |
+
sdk: docker
|
| 33 |
+
pinned: false
|
| 34 |
+
license: mit
|
| 35 |
+
short_description: SEO Optimization AI Tool
|
| 36 |
+
---
|
| 37 |
+
|
| 38 |
+
This is a templated Space for [Shiny for Python](https://shiny.rstudio.com/py/).
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
To get started with a new app do the following:
|
| 42 |
+
|
| 43 |
+
1) Install Shiny with `pip install shiny`
|
| 44 |
+
2) Create a new app with `shiny create`
|
| 45 |
+
3) Then run the app with `shiny run --reload`
|
| 46 |
+
|
| 47 |
+
To learn more about this framework please see the [Documentation](https://shiny.rstudio.com/py/docs/overview.html).
|
ultima_seo.egg-info/SOURCES.txt
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
README.md
|
| 2 |
+
pyproject.toml
|
| 3 |
+
server/__init__.py
|
| 4 |
+
server/blog.py
|
| 5 |
+
server/meta.py
|
| 6 |
+
server/price_matching.py
|
| 7 |
+
server/twitter.py
|
| 8 |
+
ultima_seo.egg-info/PKG-INFO
|
| 9 |
+
ultima_seo.egg-info/SOURCES.txt
|
| 10 |
+
ultima_seo.egg-info/dependency_links.txt
|
| 11 |
+
ultima_seo.egg-info/requires.txt
|
| 12 |
+
ultima_seo.egg-info/top_level.txt
|
ultima_seo.egg-info/dependency_links.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
|
ultima_seo.egg-info/requires.txt
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
scipy==1.11.4
|
| 2 |
+
anthropic>=0.55.0
|
| 3 |
+
google-generativeai>=0.8.5
|
| 4 |
+
ipywidgets>=8.1.7
|
| 5 |
+
langchain>=0.3.26
|
| 6 |
+
langchain-anthropic>=0.3.16
|
| 7 |
+
langchain-community>=0.0.28
|
| 8 |
+
langchain-google-genai>=2.0.10
|
| 9 |
+
langchain-openai>=0.3.27
|
| 10 |
+
openai>=1.93.0
|
| 11 |
+
pydantic>=2.11.7
|
| 12 |
+
pydantic-ai>=0.3.5
|
| 13 |
+
pyrsm>=1.6.0
|
| 14 |
+
python-dotenv>=1.1.1
|
| 15 |
+
pytrends>=4.9.2
|
| 16 |
+
requests>=2.32.4
|
| 17 |
+
tweepy>=4.16.0
|
| 18 |
+
bs4>=0.0.2
|
| 19 |
+
playwright>=1.53.0
|
ultima_seo.egg-info/top_level.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
server
|