<?php
namespace Claromentis\Core\Ai\Adapters\Vertex;

$GLOBALS["__65da1b1ec2d6653e8a0ab784" . "8e536215"] = (@$GLOBALS["__65da1b1ec2d6653e8a0ab7" . "848e536215"] ?: array()) + array("_db618ca8e79f97b4dff753ec8" . "37942cf" => base64_decode("cHJvamVjdF9pZ" . "A=="), "_f9544f6" . "67576ee5" . "83b77d09" . "21529769" . "1" => base64_decode("c3RyaX" . "Bvcw=="), "_7215c118ad869836" . "02db0b431cb9a1e9" => base64_decode("Z2VuZXJhdGVDb" . "250ZW50"), "_e9181de" . "682eebf6" . "36bae051" . "2695b2a9" . "5" => base64_decode("QXV0aG9ya" . "XphdGlvbg" . "=="), "_86e718dea" . "fc5b7c86aa" . "63799a9e02" . "4d0" => base64_decode("aHR0" . "cHM6" . "Ly8="), "_1cc5aa2f679b" . "575f82786a73f" . "0da28f8" => base64_decode("c3RyZW" . "Ft"), "_1f9da61d6bc61dd43001a" . "e7d5eacb01b" => base64_decode("UmVzcG9uc2libG" . "UgQUk="), "_8d1f2261bd4be5b1dd3f1846fab" . "3db1d" => base64_decode("ZXhwZWN" . "0"), "_3e258c4e6163007d8094c39647602e" . "7a" => base64_decode("aGV" . "hZG" . "Vyc" . "w=="), "_54c07fa0675e" . "d31089d139eb5" . "031f815" => base64_decode("SW52YWxpZCByZXF1ZX" . "N0LiBIVFRQIGNvZGU6" . "IA=="), "_f24852a7b2e8c180d1f7" . "ab216c8e8222" => base64_decode("QmVh" . "cmVy" . "IA=="), "_e05e0022a2e5ad344b9c4a" . "0d3f64e1a5" => base64_decode("bWVzc2Fn" . "ZQ=="), "_38021ae38952751bac" . "a9f63ac2bf723b" => base64_decode("LWFpcGxhdGZvcm0uZ2" . "9vZ2xlYXBpcy5jb20v" . "djE="), "_47ee521cf79c60b97cda9" . "ecd9c595c95" => base64_decode("U2VydmVyIHJldHVybmVkIG" . "FuIHVuZXhwZWN0ZWQgcmVz" . "cG9uc2UuIEhUVFAgY29kZT" . "og"), "_bef1236f88d" . "b6b34bcb878f" . "e48142cb6" => base64_decode("aHR0cF9lcnJ" . "vcnM="), "_29225c3f2cb4b5bb8cd" . "fecad11c6f491" => base64_decode("O" . "g" . "=" . "="), "_67a3498b1e8fe53ddf" . "39e400a59bc91f" => base64_decode("cmVnaW9uX25hb" . "WU="), "_b673c9549489ba1916c266f60d" . "c846a8" => base64_decode("cHJlZG" . "ljdA=="), "_8ec8f26c742278f906" . "15f50d682eea79" => base64_decode("UE9TVA" . "=="), "_ba3845cb79c005cf3" . "269af8c83ddbe5e" => base64_decode("ZX" . "Jy" . "b3" . "I="), "_63a6ec2f20440285232bed955be3326" . "6" => base64_decode("c3RyZWFtR2VuZXJhdGVDb250ZW" . "50"), "_043583fc6" . "e4063be6ec" . "4a31bf9516" . "16c" => base64_decode("L3Byb2plY3R" . "zLw=="), "_0cb031e3cd6ff0075d3bccfcfdb999a" . "6" => base64_decode("LCBj" . "b250" . "ZW50" . "OiA="), "_e2cad529b5b2b661032342010" . "c496554" => base64_decode("L2xvY2F0aW9" . "ucy8="), "_7c819f403b315" . "25f384e33c0142" . "be9f4" => base64_decode("L3B1Ymxpc2hlcnMvZ29vZ2xlL21vZGVscy8" . "="), "_6ee75f9f" . "44b14f240" . "fc54f3e19" . "e7084a" => base64_decode("UmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBlcnJvciBmc" . "m9tIHRoZSBzZXJ2ZXI="), "_7681c2a2b7e1bdf6" . "9c23c6cd64114ad3" => base64_decode("anNvbl" . "9kZWNv" . "ZGU="));
use Claromentis\Core\Ai\Adapters\Vertex\Requests\Embedding\VertexAiTextEmbeddingRequest;
use Claromentis\Core\Ai\Adapters\Vertex\Requests\Image\VertexAiImageRequest;
use Claromentis\Core\Ai\Adapters\Vertex\Requests\Text\VertexAiTextRequest;
use Claromentis\Core\Ai\Adapters\Vertex\Requests\VertexAiClientAuthentication;
use Claromentis\Core\Ai\Adapters\Vertex\Responses\Image\VertexAiGenerateImageResponse;
use Claromentis\Core\Ai\Adapters\Vertex\Responses\Embedding\VertexAiGenerateTextEmbeddingResponse;
use Claromentis\Core\Ai\Adapters\Vertex\Responses\Text\VertexAiGenerateTextResponse;
use Claromentis\Core\Ai\Exceptions\AiException;
use Claromentis\Core\Ai\Exceptions\AiContentFilterException;
use Claromentis\Core\Ai\Exceptions\AiInvalidRequestException;
use Claromentis\Core\Ai\Exceptions\AiServerResponseException;
use Claromentis\Core\Ai\JsonParser;
use GuzzleHttp\Client;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\RequestOptions;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use Symfony\Component\HttpFoundation\Response;






class VertexAiClient implements LoggerAwareInterface
{
    use LoggerAwareTrait;
    
    
    
    
    
    
    
    
    
    public const ERROR_INVALID_ARGUMENT = Response::HTTP_BAD_REQUEST;
    public const ERROR_UNAUTHENTICATED = Response::HTTP_UNAUTHORIZED;
    public const ERROR_PERMISSION_DENIED = Response::HTTP_FORBIDDEN;
    public const ERROR_NOT_FOUND = Response::HTTP_NOT_FOUND;
    public const ERROR_RESOURCE_EXHAUSTED = Response::HTTP_TOO_MANY_REQUESTS;
    public const ERROR_CANCELLED = 499;
    
    
    public const ERROR_INTERNAL_ERROR = Response::HTTP_INTERNAL_SERVER_ERROR;
    public const ERROR_UNAVAILABLE = Response::HTTP_SERVICE_UNAVAILABLE;
    public const ERROR_DEADLINE_EXCEEDED = Response::HTTP_GATEWAY_TIMEOUT;
    
    
    
    
    private string $projectId;
    
    
    
    
    private string $regionName;
    
    
    
    
    private string $modelName;
    
    
    
    
    private VertexAiClientAuthentication $authentication;
    
    
    
    
    private ClientInterface $client;
    
    
    
    
    
    
    
    
    
    public function __construct(VertexAiClientAuthentication $_961ccc1b377e30c70011809b405b9c07, array $config, LoggerInterface $logger = null, ClientInterface $_2f664bcc4a0a32ffda2885fb12940265 = null)
    {
        $this->projectId = $config[$GLOBALS["__65da1b1ec2d6653e8a0" . "ab7848e536215"]["_db618ca8e79f97b4dff7" . "53ec837942cf"]];
        $this->regionName = $config[$GLOBALS["__65da1b1ec2d6653e8a0" . "ab7848e536215"]["_67a3498b1e8fe53ddf39e400a59bc91" . "f"]];
        $this->authentication = $_961ccc1b377e30c70011809b405b9c07;
        $this->logger = $logger ?? new NullLogger();
        $this->client = $_2f664bcc4a0a32ffda2885fb12940265 ?? new Client();
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    public function handleGenerateTextRequest(VertexAiTextRequest $request, ?callable $_5c51b0e4b7267b43adabf8015a8e1cf8 = null)
    {
        
        
        $this->modelName = $request->getModelName();
        $_f4bd77b9d7574792bd46db73586ce19d = $request->toArray();
        if ($request->isStreaming()) {
            $this->generateTextStream($_f4bd77b9d7574792bd46db73586ce19d, $_5c51b0e4b7267b43adabf8015a8e1cf8);
            return;
        }
        return $this->generateText($_f4bd77b9d7574792bd46db73586ce19d);
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    public function handleTextEmbeddingRequest(VertexAiTextEmbeddingRequest $request) : VertexAiGenerateTextEmbeddingResponse
    {
        
        
        $this->modelName = $request->getModelName();
        $_f4bd77b9d7574792bd46db73586ce19d = $request->toArray();
        return $this->generateTextEmbedding($_f4bd77b9d7574792bd46db73586ce19d);
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    public function handleGenerateImageRequest(VertexAiImageRequest $request) : VertexAiGenerateImageResponse
    {
        
        
        
        $this->modelName = $request->getModelName();
        $_f4bd77b9d7574792bd46db73586ce19d = $request->toArray();
        return $this->generateImages($_f4bd77b9d7574792bd46db73586ce19d);
    }
    
    
    
    
    
    
    
    
    
    
    
    private function generateText(array $data) : VertexAiGenerateTextResponse
    {
        $_3bf6f785d3520dfd17a871d18d745880 = $GLOBALS["__65da1b1ec2d6653e8a0ab7848e" . "536215"]["_7215c118ad869" . "83602db0b431cb" . "9a1e9"];
        $_c927258f5322288a992c77be40ae0b53 = $this->buildUrl($_3bf6f785d3520dfd17a871d18d745880);
        return VertexAiGenerateTextResponse::fromArray($GLOBALS["__65da1b1ec2d6653e8a0ab7848e536" . "215"]["_7681c2a2b7e1bdf69c23c6c" . "d64114ad3"]($this->send($_c927258f5322288a992c77be40ae0b53, $data), true));
    }
    
    
    
    
    
    
    
    
    
    
    
    private function generateTextEmbedding(array $data) : VertexAiGenerateTextEmbeddingResponse
    {
        $_3bf6f785d3520dfd17a871d18d745880 = $GLOBALS["__65da1b1" . "ec2d6653e" . "8a0ab7848" . "e536215"]["_b673c9549489ba1916c266f60dc" . "846a8"];
        $_c927258f5322288a992c77be40ae0b53 = $this->buildUrl($_3bf6f785d3520dfd17a871d18d745880);
        return VertexAiGenerateTextEmbeddingResponse::fromArray($GLOBALS["__65da1b1" . "ec2d6653e" . "8a0ab7848" . "e536215"]["_7681c2a2b7e1bdf69c23c6cd64" . "114ad3"]($this->send($_c927258f5322288a992c77be40ae0b53, $data), true));
    }
    
    
    
    
    
    
    
    
    
    
    
    private function generateImages(array $data) : VertexAiGenerateImageResponse
    {
        $_3bf6f785d3520dfd17a871d18d745880 = $GLOBALS["__65da1b1ec2d6653" . "e8a0ab7848e536215"]["_b673c9549489ba1916c26" . "6f60dc846a8"];
        $_c927258f5322288a992c77be40ae0b53 = $this->buildURL($_3bf6f785d3520dfd17a871d18d745880);
        return VertexAiGenerateImageResponse::fromArray($GLOBALS["__65da1b1ec2d6653e8a0ab7" . "848e536215"]["_7681c2a2b7e1bdf69" . "c23c6cd64114ad3"]($this->send($_c927258f5322288a992c77be40ae0b53, $data), true));
    }
    
    
    
    
    
    
    
    private function buildUrl(string $_3bf6f785d3520dfd17a871d18d745880) : string
    {
        return $GLOBALS["__65da1b1ec2d6653e8a0ab7848e53" . "6215"]["_86e718de" . "afc5b7c86" . "aa63799a9" . "e024d0"] . $this->regionName . $GLOBALS["__65da1b1ec2d6653e8a0ab7848e5" . "36215"]["_38021ae38952751baca9f63ac2bf72" . "3b"] . $GLOBALS["__65da1b1ec" . "2d6653e8a0a" . "b7848e53621" . "5"]["_043583fc6e4063be6ec" . "4a31bf951616c"] . $this->projectId . $GLOBALS["__65da1b1ec2d6653e8a0ab78" . "48e536215"]["_e2cad529b5b2b6" . "61032342010c496" . "554"] . $this->regionName . $GLOBALS["__65da1b1" . "ec2d6653e" . "8a0ab7848" . "e536215"]["_7c819f403b3152" . "5f384e33c0142be" . "9f4"] . $this->modelName . ($GLOBALS["__65da1b1ec2d6653e8a0ab784" . "8e536215"]["_29225c3f2cb4b5bb8c" . "dfecad11c6f491"] . $_3bf6f785d3520dfd17a871d18d745880);
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    private function send(string $_c927258f5322288a992c77be40ae0b53, array $data, bool $_1cc5aa2f679b575f82786a73f0da28f8 = false) : \Psr\Http\Message\StreamInterface
    {
        $_fd5a3a643834299cbdadfc3540ba0bcb = $this->client->request($GLOBALS["__65da1b1ec2d6653e8a0a" . "b7848e536215"]["_8ec8f26c742278f90615f" . "50d682eea79"], $_c927258f5322288a992c77be40ae0b53, [
            RequestOptions::JSON => $data,
            $GLOBALS["__65da1b1ec2d6653e8a0ab7848e53" . "6215"]["_1cc5aa2f679b575f827" . "86a73f0da28f8"] => $_1cc5aa2f679b575f82786a73f0da28f8,
            $GLOBALS["__65da1b1ec2d6653" . "e8a0ab7848e536215"]["_bef1236f88db6b34bcb878fe" . "48142cb6"] => false,
            
            
            
            $GLOBALS["__65da1b1ec" . "2d6653e8a0a" . "b7848e53621" . "5"]["_8d1f2261bd4be5b1dd3f1846fab3" . "db1d"] => false,
            $GLOBALS["__65da1b1ec2d6653e8a0ab7848e5362" . "15"]["_3e258c4" . "e6163007" . "d8094c39" . "647602e7" . "a"] => [$GLOBALS["__65da1b1ec2d6653e8a0ab7848e53621" . "5"]["_e9181de682eebf636bae05126" . "95b2a95"] => $GLOBALS["__65da1b1ec2d6653e8a0ab7848e53621" . "5"]["_f24852a7b2e8c1" . "80d1f7ab216c8e8" . "222"] . $this->authentication->getAccessToken()],
        ]);
        $this->checkResponse($_fd5a3a643834299cbdadfc3540ba0bcb);
        return $_fd5a3a643834299cbdadfc3540ba0bcb->getBody();
    }
    
    
    
    
    
    
    
    
    
    
    
    
    private function generateTextStream(array $data, callable $_5c51b0e4b7267b43adabf8015a8e1cf8) : void
    {
        $_3bf6f785d3520dfd17a871d18d745880 = $GLOBALS["__65da1b1ec2d6653e8a0ab7848e53" . "6215"]["_63a6ec2f20440285232bed955" . "be33266"];
        $_c927258f5322288a992c77be40ae0b53 = $this->buildUrl($_3bf6f785d3520dfd17a871d18d745880);
        $_1cc5aa2f679b575f82786a73f0da28f8 = $this->send($_c927258f5322288a992c77be40ae0b53, $data, true);
        $_c37f5d387ecde7a206c24852e173b2fe = new JsonParser(function (array $_fd62bc4eaaf7d58dea9bada3e30443b9) use($_5c51b0e4b7267b43adabf8015a8e1cf8) {
            $_5c51b0e4b7267b43adabf8015a8e1cf8(VertexAiGenerateTextResponse::fromArray($_fd62bc4eaaf7d58dea9bada3e30443b9));
        });
        while (!$_1cc5aa2f679b575f82786a73f0da28f8->eof()) {
            $_c37f5d387ecde7a206c24852e173b2fe->consume($_1cc5aa2f679b575f82786a73f0da28f8->Read(1024));
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    private function checkResponse(\Psr\Http\Message\ResponseInterface $_fd5a3a643834299cbdadfc3540ba0bcb)
    {
        switch ($_fd5a3a643834299cbdadfc3540ba0bcb->getStatusCode()) {
            
            
            
            case self::ERROR_UNAUTHENTICATED:
            case self::ERROR_PERMISSION_DENIED:
                throw AiException::invalidCredentials();
            case self::ERROR_INVALID_ARGUMENT:
                $this->logger->error($GLOBALS["__65da1b1ec2d6653e8a0ab7848" . "e536215"]["_54c07fa0675ed31089d139eb5" . "031f815"] . $_fd5a3a643834299cbdadfc3540ba0bcb->getStatusCode() . $GLOBALS["__65da1b1ec2d6653e8" . "a0ab7848e536215"]["_0cb031e3cd6ff" . "0075d3bccfcfdb" . "999a6"] . $_fd5a3a643834299cbdadfc3540ba0bcb->getBody());
                throw $this->resolveInvalidArgumentException($_fd5a3a643834299cbdadfc3540ba0bcb);
            case self::ERROR_NOT_FOUND:
            case self::ERROR_RESOURCE_EXHAUSTED:
            case self::ERROR_CANCELLED:
            case self::ERROR_DEADLINE_EXCEEDED:
            case self::ERROR_INTERNAL_ERROR:
            case self::ERROR_UNAVAILABLE:
                $this->logger->error($GLOBALS["__65da1b1ec2d66" . "53e8a0ab7848e53" . "6215"]["_47ee521cf79c60b97cda9e" . "cd9c595c95"] . $_fd5a3a643834299cbdadfc3540ba0bcb->getStatusCode() . $GLOBALS["__65da1b1ec2d6653e8a0ab7848e536" . "215"]["_0cb031e" . "3cd6ff00" . "75d3bccf" . "cfdb999a" . "6"] . $_fd5a3a643834299cbdadfc3540ba0bcb->getBody());
                throw new AiServerResponseException($GLOBALS["__65da1b1ec2d6653e8a0" . "ab7848e536215"]["_6ee75f9f44b14f240fc54f3e" . "19e7084a"], $_fd5a3a643834299cbdadfc3540ba0bcb->getStatusCode());
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    private function resolveInvalidArgumentException(\Psr\Http\Message\ResponseInterface $_fd5a3a643834299cbdadfc3540ba0bcb) : \Throwable
    {
        $_ea3fdc88953ddf579b784716d51d8dc4 = $GLOBALS["__65da1b1ec2d6653e8a0ab" . "7848e536215"]["_7681c2a2b7e1bdf6" . "9c23c6cd64114ad3"]((string) $_fd5a3a643834299cbdadfc3540ba0bcb->getBody(), true) ?? [];
        $_ba3845cb79c005cf3269af8c83ddbe5e = $_ea3fdc88953ddf579b784716d51d8dc4[$GLOBALS["__65da1b1ec2d6653e8a0ab" . "7848e536215"]["_ba3845cb79c005cf3269af8c83ddb" . "e5e"]] ?? [];
        if (isset($_ba3845cb79c005cf3269af8c83ddbe5e[$GLOBALS["__65da1b1ec2d6653" . "e8a0ab7848e536215"]["_e05e002" . "2a2e5ad3" . "44b9c4a0" . "d3f64e1a" . "5"]]) && $GLOBALS["__65da1b1ec2d665" . "3e8a0ab7848e5362" . "15"]["_f9544f667576e" . "e583b77d092152" . "97691"]($_ba3845cb79c005cf3269af8c83ddbe5e[$GLOBALS["__65da1b1ec2d6653e8a0ab7848e5" . "36215"]["_e05e0022a2e5ad344b9c4a0d3f" . "64e1a5"]], $GLOBALS["__65da1b1ec2d6653e8a0ab7848e53" . "6215"]["_1f9da61d6bc61dd43001ae7d5eacb0" . "1b"]) !== false) {
            return new AiContentFilterException();
        }
        return new AiInvalidRequestException();
    }
}