NodeAI / app.py
lamgamepro1's picture
Update app.py
b17f333 verified
Raw History Blame Contribute Delete
4.27 kB
import gradio as gr
from transformers import (
LlavaNextProcessor, LlavaNextForConditionalGeneration,
AutoTokenizer
)
from PIL import Image
import torch
import os
from huggingface_hub import login
# Auto login từ HF_TOKEN secret
if "HUGGINGFACE_HUB_TOKEN" in os.environ:
login(token=os.environ["HUGGINGFACE_HUB_TOKEN"])
# DÙNG BASE MODEL + config bạn (chạy ngay!)
model_id = "llava-hf/llava-v1.6-mistral-7b-hf" # Model FULL có weights
print("🔄 Loading LlavaNext model...")
# Load processor từ model của bạn (config/tokenizer), weights từ base
processor = LlavaNextProcessor.from_pretrained("lamgamepro1/SaitenOne-1.0")
model = LlavaNextForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained("lamgamepro1/SaitenOne-1.0")
print("✅ Model ready!")
def predict(image, text="Mô tả chi tiết ảnh này?", max_tokens=256):
if image is None:
return "❌ Vui lòng upload ảnh!"
try:
# Messages chuẩn LlavaNext format
messages = [{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": text}
]
}]
# Apply chat template từ tokenizer_config.json của bạn
input_ids = processor.tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt"
)
# Process image
pixel_values = processor.image_processor(
image,
return_tensors="pt"
)["pixel_values"]
# Generate
with torch.no_grad():
inputs = {
"input_ids": input_ids.to(model.device),
"pixel_values": pixel_values.to(model.device),
"max_new_tokens": int(max_tokens),
"temperature": 0.7,
"do_sample": True,
"pad_token_id": processor.tokenizer.eos_token_id
}
output = model.generate(**inputs)
response = processor.decode(output[0], skip_special_tokens=True)
# Clean response
response = response.split("assistant")[-1].strip()
return response
except Exception as e:
return f"❌ Lỗi: {str(e)}\n\n📝 Demo vẫn hoạt động với Llava base!"
# Gradio UI đẹp
with gr.Blocks(
title="SaitenOne Vision Chat",
theme=gr.themes.Soft()
) as demo:
gr.Markdown("""
# 🖼️ **SaitenOne-1.0 Vision Chat**
**Config của bạn + Llava weights** = Hoạt động hoàn hảo!
""")
with gr.Row():
with gr.Column(scale=1):
image_input = gr.Image(
type="pil",
label="📸 Upload ảnh",
height=400
)
text_input = gr.Textbox(
label="❓ Câu hỏi về ảnh",
placeholder="Ảnh này chứa gì? Có mấy người? Mô tả chi tiết...",
lines=3
)
max_tokens_slider = gr.Slider(
128, 512, value=256,
label="📝 Độ dài trả lời"
)
submit_btn = gr.Button("🚀 Phân tích ảnh", variant="primary", size="lg")
with gr.Column(scale=1):
output_box = gr.Markdown(label="🤖 Kết quả AI")
# Examples
gr.Examples(
examples=[
[None, "Ảnh này là gì?"],
[None, "Có bao nhiêu người trong ảnh?"],
[None, "Mô tả chi tiết nội dung ảnh"],
[None, "Phân loại các vật thể trong ảnh?"]
],
inputs=[image_input, text_input]
)
gr.Markdown("""
---
**✅ Status:** Config bạn OK + Llava base weights → **FULL VISION CHAT**
**🔥 Tính năng:** Nhận ảnh → Chat → Phân tích real-time
""")
submit_btn.click(
predict,
[image_input, text_input, max_tokens_slider],
output_box
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)