require __DIR__ . "/AUTOMATIC1111/Generation/Configuration.php";
class AUTOMATIC1111{
public const GENERATION_PENDING = "PENDING";
public const GENERATION_PROCESSING = "PROCESSING";
public const GENERATION_COMPLETE = "COMPLETE";
public const GENERATION_FAILED = "FAILED";
private const HTTP_ERROR_BY_CODE = [
401 => ["Message" => "Unauthorized", ],
404 => ["Message" => "Not found", ],
422 => ["Message" => "Unprocessable Content", ],
503 => ["Message" => "Connection refused", ],
504 => ["Message" => "Gateway timeout XXX", ],
];
private const HTTP_METHOD_GET = "GET";
private const HTTP_METHOD_POST = "POST";
private ?\CurlHandle $cURL = null;
private array $RequestHeader = [
"Content-Type: application/json",
];
public ?string $APIBaseURL = null;
public ?string $User = null;
public ?string $Password = null;
public ?\Generation\Configuration $GenerationConfiguration = null;
public function __construct(
?string $APIBaseURL = null,
?string $User = null,
?string $Password = null,
?\Generation\Configuration $GenerationConfiguration = null,
){
foreach(get_defined_vars() as $Property => $Value)if(!is_null($Value))$this->$Property = $Value;
$this->cURL = curl_init();
}
public function __destruct(){
curl_close($this->cURL);
}
public function ProcessGenerationTask(
string $TaskPath,
string $ImagePath,
string $TaskID,
string $BaseURL,
){
$PendingPath = "{$TaskPath}/" . self::GENERATION_PENDING . "/";
$TaskFile = "{$TaskID}.json";
$Result = (object)[
"Error" => (object)["Code" => 0, "Message" => null, ],
"Data" => (object)[],
];
if(file_exists("{$PendingPath}{$TaskFile}")){
$GenerationData = json_decode(file_get_contents("{$PendingPath}{$TaskFile}"));
$GenerationData->Task->Status = self::GENERATION_PROCESSING;
$ProcessingPath = "{$TaskPath}/" . self::GENERATION_PROCESSING . "/";
if(!is_dir($ProcessingPath))mkdir($ProcessingPath, 0777, true);
rename("{$PendingPath}{$TaskFile}", "{$ProcessingPath}{$TaskFile}");
file_put_contents("{$ProcessingPath}{$TaskFile}", json_encode($GenerationData));
$Result = $this->APIRequest(
$GenerationData->API->Endpoint,
$GenerationData->API->Data,
$GenerationData->TimeoutSecond,
);
if($Result->Error->Code){
$GenerationData->Task->Status = self::GENERATION_FAILED;
}
else{
$GenerationData->Task->Status = self::GENERATION_COMPLETE;
if($Result->Data->images[0] ?? false){
$ImageFileSubPath = date("Y-m-d");
$ImageFilePath = "{$ImagePath}/{$ImageFileSubPath}";
if(!is_dir($ImageFilePath))mkdir($ImageFilePath, 0755, true);
$ImageFileName = UUID() . "-" . date("h-i-s") . ".png";
$ImageFile = "{$ImageFilePath}/{$ImageFileName}";
file_put_contents($ImageFile, base64_decode($Result->Data->images[0]));
$Result->Data = (object)[
"Path" => $ImageFile,
"URL" => "{$BaseURL}{$ImageFileSubPath}/{$ImageFileName}",
];
}
}
$FinalStatusPath = "{$TaskPath}/{$GenerationData->Task->Status}/";
if(!is_dir($FinalStatusPath))mkdir($FinalStatusPath, 0777, true);
rename("{$ProcessingPath}{$TaskFile}", "{$FinalStatusPath}{$TaskFile}");
file_put_contents("{$FinalStatusPath}{$TaskFile}", json_encode($GenerationData));
}
else{
$Result->Error = (object)["Code" => 99999, "Message" => "Task file not found", ];
}
return $Resutl;
}
public function CreateGenerationTask(
string $Path,
\Generation\Configuration $GenerationConfiguration,
){
$TaskID = "" . date("Y-m-d-H-i-s") . "-" . UUID();
$Result = $GenerationConfiguration->Data();
if(!$Result->Error->Code){
$Result->Data->Task = (object)[
"ID" => $TaskID,
"Time" => (object)[
"Create" => date("Y-m-d H:i:s"),
],
"Status" => self::GENERATION_PENDING,
];
$PendingPath = "{$Path}/{$Result->Data->Task->Status}/";
if(!is_dir($PendingPath))mkdir($PendingPath, 0777, true);
file_put_contents("{$PendingPath}{$TaskID}.json", json_encode($Result->Data));
}
return $Result;
}
public function Generate(
?\Generation\Configuration $GenerationConfiguration = null,
):object{
if(is_null($GenerationConfiguration))$GenerationConfiguration = $this->GenerationConfiguration;
$GenerationConfigurationData = $GenerationConfiguration->Data();
$Result = (object)[
"Error" => $GenerationConfigurationData->Error,
"Data" => (object)[],
];
if(!$Result->Error->Code)$Result = $this->APIRequest(
$GenerationConfigurationData->API->Endpoint,
$GenerationConfigurationData->API->Data,
$GenerationConfigurationData->TimeoutSecond,
);
return $Result;
}
public function QueStatus():object{
return $this->APIRequest("progress");
}
public function Option():object{
return $this->APIRequest("options");
}
public function Embedding():object{
return $this->APIRequest("embeddings");
}
public function PromptStyle():object{
return $this->APIRequest("prompt-styles");
}
public function LoRa():object{
return $this->APIRequest("loras");
}
public function Upscaler():object{
return $this->APIRequest("upscalers");
}
public function Scheduler():object{
return $this->APIRequest("schedulers");
}
public function Sampler():object{
return $this->APIRequest("samplers");
}
public function Model():object{
return $this->APIRequest("sd-models");
}
private function APIRequest(
string $Endpoint,
null|string|array|object $POSTData = null,
?int $TimeoutSecond = null,
):object{
if(is_null($TimeoutSecond))$TimeoutSecond = 600;
$Error = (object)["Code" => 0, "Message" => null, ];
$Data = (object)[];
$Method = self::HTTP_METHOD_GET;
if($POSTData){
$Method = self::HTTP_METHOD_POST;
if(
is_array($POSTData) ||
is_object($POSTData)
)$POSTData = json_encode($POSTData);
}
curl_setopt_array($this->cURL, [
CURLOPT_CUSTOMREQUEST => $Method,
CURLOPT_URL => "{$this->APIBaseURL}{$Endpoint}",
CURLOPT_HTTPHEADER => $this->RequestHeader,
CURLOPT_POSTFIELDS => $POSTData,
CURLOPT_HTTPAUTH => $this->User ? \CURLAUTH_BASIC : \CURLAUTH_NONE,
CURLOPT_USERPWD => "{$this->User}:{$this->Password}",
CURLOPT_TIMEOUT => $TimeoutSecond,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_CONNECTTIMEOUT => 60,
]);
set_time_limit($TimeoutSecond);
$Response = curl_exec($this->cURL);
$HTTPStatusCode = curl_getinfo($this->cURL, \CURLINFO_HTTP_CODE);
$cURLErrorCode = curl_errno($this->cURL);
$cURLErrorMessage = curl_error($this->cURL);
if($cURLErrorCode){
$Error->Code = $cURLErrorCode;
$Error->Message = $cURLErrorMessage;
}
else{
if($HTTPStatusCode == 200){
$Data = json_decode($Response);
}
else{
$Error = (object)[
"Code" => $HTTPStatusCode,
"Message" => self::HTTP_ERROR_BY_CODE[$HTTPStatusCode]["Message"] ?? "API error {$HTTPStatusCode}",
];
}
}
return (object)[
"Error" => $Error,
"Data" => $Data,
];
}
}
?>
Warning: Cannot modify header information - headers already sent by (output started at /WWW/default/.library/class/Joy/AUTOMATIC1111.php:1) in /WWW/default/index.php on line 203
Warning: http_response_code(): Cannot set response code - headers already sent (output started at /WWW/default/.library/class/Joy/AUTOMATIC1111.php:1) in /WWW/default/index.php on line 204
{"Title":"Resume for Bogus Boo","Name":"Bogus Boo","Location":"South East Asia","Email":"Boss@Bogus.Boo","Purpose":"Looking for job","Technology":["DNS","Linux","Database","Server maintenance","MySQL","Web server","Mail server","Private cloud implementation","Public cloud deployment","Docker","Virtualization"],"Availability":{"Type":["Full time","Part time","Contractual"],"Joining":"Immediate","Daily":"7 hours","Weekly":"5 days","Exclusion":"Per bank holidays & exclusive festivals"},"Expectation":{"Deployment":["Europe","Open to suggestion"],"Remuneration":"Industry standard","Role":"Consultant"},"Experience":{"HelloWorldYear":"1995","Professional":[{"Position":"CTO","Duration":"3.5 years","Organization":"Start up","Responsibility":["Pioneering product development","IoT","Distributed application","Database architecture","Data communication protocol","Solution architecture","Team formation","Business alignment","Development management","Technology managemeent"]},{"Position":"CTO","Duration":"3 years","Organization":"Start up","Responsibility":["Team formation","Business alignment","Development management","Technology managemeent","Web application","Android & iOS application","Platform management"]},{"Position":"Senior developer","Duration":"3 years","Organization":"Conglomerate","Responsibility":["Web application","PHP","MySQL"]}]},"Quote":["Ask the right question to get the right answer","Passion became profession"]}