from __future__ import annotations import argparse from pathlib import Path try: from .model_utils import ( DEFAULT_MODEL_PATH, QuantizedSkinGPTModel, build_single_turn_messages, ) except ImportError: from model_utils import ( DEFAULT_MODEL_PATH, QuantizedSkinGPTModel, build_single_turn_messages, ) def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description="SkinGPT-R1 INT4 multi-turn chat") parser.add_argument("--model_path", type=str, default=DEFAULT_MODEL_PATH) parser.add_argument("--image", type=str, required=True, help="Path to initial image") return parser def main() -> None: args = build_parser().parse_args() if not Path(args.image).exists(): print(f"Error: Image {args.image} not found.") return model = QuantizedSkinGPTModel(args.model_path) history = build_single_turn_messages( args.image, "Please analyze this image.", system_prompt="You are a professional AI dermatology assistant. Analyze the skin condition carefully.", ) print("\n=== SkinGPT-R1 INT4 Chat (Type 'exit' to quit) ===") print(f"Image loaded: {args.image}") print("\nModel is thinking...", end="", flush=True) response = model.generate_response(history) print(f"\rAssistant: {response}\n") history.append({"role": "assistant", "content": [{"type": "text", "text": response}]}) while True: try: user_input = input("User: ") if user_input.lower() in ["exit", "quit"]: break if not user_input.strip(): continue history.append({"role": "user", "content": [{"type": "text", "text": user_input}]}) print("Model is thinking...", end="", flush=True) response = model.generate_response(history) print(f"\rAssistant: {response}\n") history.append({"role": "assistant", "content": [{"type": "text", "text": response}]}) except KeyboardInterrupt: break if __name__ == "__main__": main()