XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 1
UTF-8
from __future__ import annotations

import os
import requests
import json

from ..requests.raise_for_status import raise_for_status


def load_models():
    response = requests.get("https://gpt4all.io/models/models3.json")
    raise_for_status(response)
    return format_models(response.json())


def get_model_name(filename: str) -> str:
    name = filename.split(".", 1)[0]
    for replace in [
        "-v1_5",
        "-v1",
        "-q4_0",
        "_v01",
        "-v0",
        "-f16",
        "-gguf2",
        "-newbpe",
    ]:
        name = name.replace(replace, "")
    return name


def format_models(models: list) -> dict:
    return {
        get_model_name(model["filename"]): {
            "path": model["filename"],
            "ram": model["ramrequired"],
            "prompt": model["promptTemplate"] if "promptTemplate" in model else None,
            "system": model["systemPrompt"] if "systemPrompt" in model else None,
        }
        for model in models
    }


def read_models(file_path: str):
    with open(file_path, "rb") as f:
        return json.load(f)


def save_models(file_path: str, data):
    with open(file_path, "w") as f:
        json.dump(data, f, indent=4)


def get_model_dir() -> str:
    local_dir = os.path.dirname(os.path.abspath(__file__))
    project_dir = os.path.dirname(os.path.dirname(local_dir))
    model_dir = os.path.join(project_dir, "models")
    if not os.path.exists(model_dir):
        os.mkdir(model_dir)
    return model_dir


def get_models() -> dict[str, dict]:
    model_dir = get_model_dir()
    file_path = os.path.join(model_dir, "models.json")
    if os.path.isfile(file_path):
        return read_models(file_path)
    else:
        models = load_models()
        save_models(file_path, models)
        return models