anlavn.ai.YourGPT Maven / Gradle / Ivy
package anlavn.ai;
// Make By Bình An || AnLaVN || KatoVN
import anlavn.file.Log;
import anlavn.file.Raw;
import anlavn.file.Zip;
import anlavn.net.DocNet;
import anlavn.net.License;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**Lớp YourGPT hỗ trợ suy luận LLM (Mô hình ngôn ngữ lớn) với LLaMA.
Lớp này cung cấp các phương thức để tải mô-đun YourGPT, khởi động máy chủ, tương tác với mô hình...
* @author AnLaVN - https://github.com/AnLaVN
*/
public final class YourGPT implements AutoCloseable {
private static Process YGPTProcess = null;
private static String MODEL_FILE = null;
private static final String
LLAMA_PATH = "YourGPT_LLaMA",
MODEL_PATH = "YourGPT_Model",
MODEL_DEFAULT = "https://huggingface.co/TheBloke/Mistral-7B-OpenOrca-GGUF/resolve/main/mistral-7b-openorca.Q4_K_M.gguf";
/**Các tham số LLaMA có thể định cấu hình cho máy chủ YourGPT.
Các tham số này phải được điều chỉnh trước khi khởi động máy chủ.
* Đọc thêm về các thông số có sẵn tại: https://github.com/ggerganov/llama.cpp/blob/master/examples/server/README.md */
public static Map params = new HashMap<>();
public static String API_KEY = "alk~XXX...XXX";
@Override public void close() throws Exception { destroy(); }
private static void setFile(String filePath, String module) {
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1), fileLoca = module + "/" + fileName;
File modulef = new File(module);
if (!modulef.exists()) modulef.mkdir();
boolean isNet = filePath.startsWith("http");
MODEL_FILE = fileLoca;
if (isNet && !new File(fileLoca).exists()) {
try {
Log.add("YourGPT - Download \"" + fileName + "\" to module " + module);
new DocNet(filePath).saveAs(fileLoca);
if (fileName.endsWith(".zip")) Zip.extract(isNet ? fileLoca : filePath, module);
else new Raw(filePath).copyTo(fileLoca, 26214400);
} catch (IOException e) {
Log.add("!!! Error try to init YourGPT: Can not init module " + module + ". Please check your connecttion. !!!\n\t\tError code: " + e.toString());
throw new RuntimeException(e);
}
}
}
/**Sử dụng phương thức này để tải mô-đun YourGPT bằng LLaMA mặc định và LLM mặc định.
Tương đương với việc gọi `loadModule("Win_CUDA12")`.
* @see YourGPT#loadModule(java.lang.String)
* @see YourGPT#loadModule(java.lang.String, java.lang.String)
*/
public static void loadModule() {
loadModule("Win_CUDA12");
}
/**Sử dụng phương thức này để tải mô-đun YourGPT bằng LLaMA được chỉ định và LLM mặc định.
* @param llama tên của tệp LLaMA cần tải.
* Ví dụ: "Win_CUDA12"
* Khám phá thêm tại https://anlavn-api.vercel.app/api/llama
* @see YourGPT#loadModule()
* @see YourGPT#loadModule(java.lang.String, java.lang.String)
*/
public static void loadModule(String llama) {
loadModule(llama, MODEL_DEFAULT);
}
/**Sử dụng phương thức này để tải mô-đun YourGPT bằng LLaMA được chỉ định và LLM được chỉ định.
* @param llama tên của tệp LLaMA cần tải.
* Ví dụ: "Win_CUDA12"
* Khám phá thêm tại https://anlavn-api.vercel.app/api/llama
* @param model vị trí của LLM được chỉ định, nó có thể là đường dẫn cục bộ hoặc địa chỉ liên kết.
* Ví dụ:
*
"C:/Users/AnLaVN/mistral-7b-openorca.Q4_K_M.gguf" cho vị trí tập tin hoặc,
*
"https://huggingface.co/TheBloke/Mistral-7B-OpenOrca-GGUF/resolve/main/mistral-7b-openorca.Q4_K_M.gguf"
* Khám phá thêm LLM tại https://huggingface.co
* @see YourGPT#loadModule()
* @see YourGPT#loadModule(java.lang.String)
*/
public static void loadModule(String llama, String model) {
try {
License.check(API_KEY, "AnLaVN03");
String licenseKey = URLEncoder.encode(API_KEY, StandardCharsets.UTF_8.toString());
llama = new DocNet("https://anlavn-api.vercel.app/api/llama?name="+llama+"&key="+licenseKey).readLine();
setFile(llama, LLAMA_PATH);
setFile(model, MODEL_PATH);
} catch (IOException e) {
Log.add("!!! Error try to load module YourGPT: Please check your connecttion or API key. !!!\n\t\tError code: " + e.toString());
throw new RuntimeException(e);
}
}
/**Sử dụng phương thức này để khởi động máy chủ YourGPT với các tham số đã chỉ định.
* Nếu mô-đun chưa được tải, nó sẽ cố tải bằng cài đặt mặc định.
*/
public static void start() {
License.check(API_KEY, "AnLaVN03");
if (YGPTProcess != null) {
Log.add("YourGPT - Process already start before. Try to destroy by default.");
destroy();
}
if (MODEL_FILE == null) {
Log.add("YourGPT - Module has not been loaded. Try to load module by default.");
loadModule();
}
List commands = new ArrayList<>();
commands.add(LLAMA_PATH + "/llama-server");
params.put("-m", "../" + MODEL_FILE);
for (Map.Entry entry : params.entrySet()) {
commands.add(entry.getKey());
commands.add(entry.getValue());
}
String[] command = commands.toArray(String[]::new);
new Thread() { @Override public void run() {
try {
Log.add("YourGPT - Start process with command:\n\t\t" + String.join(" ", command));
ProcessBuilder pb = new ProcessBuilder(command);
pb.directory(new File(LLAMA_PATH));
pb.redirectErrorStream(true);
YGPTProcess = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(YGPTProcess.getInputStream()));
int result = reader.read();
while (result != -1) {
System.out.print((char) result);
result = reader.read();
}
} catch (IOException e) {
Log.add("!!! Error try to start YourGPT: Error code: " + e.toString());
throw new RuntimeException(e);
}
}}.start();
}
/**Sử dụng phương thức này để truy xuất danh sách các tên LLaMA mới nhất hiện có.
* @return mảng các tên LLaMA mới nhất.
* Khám phá thêm tại https://anlavn-api.vercel.app/api/llama
* @throws java.io.IOException nếu không có kết nối internet hoặc máy chủ bị hỏng.
*/
public static String[] getLLaMA() throws IOException {
return new DocNet("https://anlavn-api.vercel.app/api/llama").readLine().split(",");
}
/**Sử dụng phương thức này để dọn sạch mô-đun YourGPT.LLaMA nếu nó tồn tại.*/
public static void cleanLLaMA() {
Log.add("YourGPT - Clean YourGPT.LLaMA module if exists.");
new File(LLAMA_PATH).deleteOnExit();
}
/**Sử dụng phương thức này để dọn sạch mô-đun YourGPT.Model nếu nó tồn tại.*/
public static void cleanModel() {
Log.add("YourGPT - Clean YourGPT.Model module if exists.");
new File(MODEL_PATH).deleteOnExit();
}
/**Sử dụng phương thức này để buộc phá hủy tiến trình YourGPT.*/
public static void destroy() {
if (YGPTProcess != null) {
Log.add("YourGPT - Forcibly destroy process.");
YGPTProcess.destroyForcibly();
YGPTProcess = null;
}
}
}