Spaces:
Sleeping
Sleeping
| import json | |
| from transformers import pipeline | |
| class StyleSavvy: | |
| def __init__( | |
| self, | |
| model_name: str = "google/flan-t5-large", | |
| device: int = -1, # -1 = CPU, or GPU index | |
| max_length: int = 150, | |
| ): | |
| self.pipe = pipeline( | |
| "text2text-generation", | |
| model=model_name, | |
| tokenizer=model_name, | |
| device=device, | |
| ) | |
| self.max_length = max_length | |
| def advise(self, items, body_type, face_shape, occasion): | |
| # 如果 items 是 JSON 字串,先 parse 回 Python list | |
| items = json.loads(items) if isinstance(items, str) else items | |
| prompt = ( | |
| f"The user is {body_type}-shaped with a {face_shape} face, " | |
| f"attending a {occasion}. They are wearing: " | |
| + ", ".join(i["label"] for i in items) | |
| + ".\n\nPlease list 5 concise style tips as bullet points:" | |
| ) | |
| result = self.pipe( | |
| prompt, | |
| max_length=self.max_length, | |
| num_beams=4, | |
| early_stopping=True, | |
| do_sample=False | |
| )[0]["generated_text"].strip() | |
| return result | |
| # import torch | |
| # # models/llm.py | |
| # # models/llm.py | |
| # import os | |
| # from typing import List | |
| # from transformers import pipeline, Pipeline | |
| # # Force CPU modes (avoid any MPS/CUDA issues on macOS) | |
| # os.environ["CUDA_VISIBLE_DEVICES"] = "" | |
| # os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "0" | |
| # class StyleSavvy: | |
| # def __init__( | |
| # self, | |
| # model_name: str = "openlm-research/open_llama_3b_v2", | |
| # device: int = -1, # -1 = CPU | |
| # max_new_tokens: int = 100, | |
| # temperature: float = 0.7, | |
| # top_p: float = 0.9, | |
| # ): | |
| # """ | |
| # Uses OpenLLaMA-3B-v2 (≈3B params) for fast, local inference. | |
| # """ | |
| # # Setup a causal text-generation pipeline | |
| # self.pipe: Pipeline = pipeline( | |
| # "text-generation", | |
| # model=model_name, | |
| # tokenizer=model_name, | |
| # device=device, | |
| # ) | |
| # # GPT‐style models need a pad token to avoid warnings | |
| # if self.pipe.tokenizer.pad_token_id is None: | |
| # self.pipe.tokenizer.pad_token = self.pipe.tokenizer.eos_token | |
| # self.max_new_tokens = max_new_tokens | |
| # self.temperature = temperature | |
| # self.top_p = top_p | |
| # def advise( | |
| # self, | |
| # items: List[str], | |
| # body_type: str, | |
| # face_shape: str, | |
| # occasion: str | |
| # ) -> List[str]: | |
| # """ | |
| # Builds a strict instruction prompt and returns exactly five "- " bullets. | |
| # """ | |
| # labels = ", ".join(items) if items else "an outfit" | |
| # prompt = ( | |
| # "You are a professional fashion consultant.\n" | |
| # f"The user is {body_type}-shaped with a {face_shape} face, attending {occasion}.\n" | |
| # f"They are wearing: {labels}.\n\n" | |
| # "Please provide exactly five concise style tips, each on its own line, " | |
| # "and starting with \"- \". No extra text." | |
| # ) | |
| # # Generate | |
| # output = self.pipe( | |
| # prompt, | |
| # max_new_tokens=self.max_new_tokens, | |
| # do_sample=True, | |
| # temperature=self.temperature, | |
| # top_p=self.top_p, | |
| # return_full_text=False, | |
| # )[0]["generated_text"] | |
| # # Extract bullets | |
| # tips = [ln.strip() for ln in output.splitlines() if ln.strip().startswith("- ")] | |
| # # Fallback: split on sentences if fewer than 5 bullets | |
| # if len(tips) < 5: | |
| # candidates = [s.strip() for s in output.replace("\n"," ").split(".") if s.strip()] | |
| # tips = [f"- {candidates[i]}" for i in range(min(5, len(candidates)))] | |
| # return tips[:5] | |