76 std::string filename =
"huggingfaceServerless.log";
77 std::ofstream file(filename, std::ios::app);
79 std::cerr <<
"Unable to open file: " << filename << std::endl;
83 auto now = std::chrono::system_clock::now();
84 std::time_t now_c = std::chrono::system_clock::to_time_t(now);
87 file << std::put_time(std::localtime(&now_c),
"%Y-%m-%d %H:%M:%S") <<
" ";
90 file <<
"[HuggingFaceServerless] # Input:" << inputTokenNumber_
91 <<
" # Output: " << outputTokenNumber_
92 <<
" # NumFailure: " << numFailures_ << std::endl;
105 const SelectivityVector& rows,
106 std::vector<VectorPtr>& args,
108 exec::EvalCtx& context,
109 VectorPtr& output)
const override {
110 BaseVector::ensureWritable(rows, type, context.pool(), output);
112 exec::LocalDecodedVector decodedStringHolder(context, *args[0], rows);
113 auto decodedStringInput = decodedStringHolder.get();
114 int numInputs = rows.size();
116 cpr::Header headers{{
"Authorization", fmt::format(
"Bearer {}", apiToken_)}};
118 std::vector<std::vector<float>> result(numInputs);
123 const int HF_SERVERLESS_INPUT_LIMIT = 5000;
127 std::string strInputs =
"[";
128 int accuInputCount = 0;
129 int insertedDataIdx = 0;
130 for (
int i = 0; i < numInputs; i++) {
131 std::string valString =
132 std::string(decodedStringInput->valueAt<StringView>(i));
133 const_cast<uint64_t&
>(inputTokenNumber_) =
136 strInputs +=
"\"" + valString +
"\"";
139 if (i != (numInputs - 1) && accuInputCount != HF_SERVERLESS_INPUT_LIMIT) {
144 auto huggingFaceInputs =
"{\"inputs\": " + strInputs +
"}";
146 cpr::Response response = cpr::Post(
148 cpr::Body{huggingFaceInputs},
149 cpr::Header{headers});
151 if (response.status_code == 200) {
154 auto jsonObj = nlohmann::json::parse(response.text);
155 int processedEmbeddingCount = 0;
156 for (
const auto& innerVector : jsonObj) {
159 std::vector<float> floatVector(3);
160 for (
const auto& value : innerVector) {
164 if (value[
"label"] ==
"positive") {
166 }
else if (value[
"label"] ==
"neutral") {
168 }
else if (value[
"label"] ==
"negative") {
171 floatVector[dataIdx] = value[
"score"];
173 result[insertedDataIdx++] = floatVector;
176 if (processedEmbeddingCount == accuInputCount) {
180 if (apiURL_.find(
"all-MiniLM") != std::string::npos) {
181 auto returnedEmbedding = innerVector;
182 std::vector<float> embeddingVector;
183 for (
const auto& val : returnedEmbedding) {
184 embeddingVector.push_back(val);
186 const_cast<uint64_t&
>(outputTokenNumber_) =
187 outputTokenNumber_ + embeddingVector.size();
188 processedEmbeddingCount += 1;
189 result[insertedDataIdx++] = embeddingVector;
190 if (processedEmbeddingCount == accuInputCount) {
194 auto returnedEmbedding = innerVector[0];
197 for (
const auto& value : returnedEmbedding) {
198 std::vector<float> embeddingVector;
199 for (
const auto& val : value) {
200 embeddingVector.push_back(val);
202 processedEmbeddingCount += 1;
203 result[insertedDataIdx++] = embeddingVector;
204 if (processedEmbeddingCount == accuInputCount) {
210 throw std::runtime_error(fmt::format(
211 "Current HuggingFace Task Type {} is not supported",
217 std::cerr <<
"Error in fetching the results: "
218 << response.error.message << std::endl;
219 for (
int l = 0; i < accuInputCount; i++) {
220 result[insertedDataIdx++] = {0.0};
230 VectorMaker maker{context.pool()};
231 output = maker.arrayVector<
float>(result, REAL());