Coverage Report

Created: 2026-03-14 18:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/function/ai/ai_functions.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#pragma once
19
20
#include <gen_cpp/FrontendService.h>
21
#include <gen_cpp/PaloInternalService_types.h>
22
23
#include <algorithm>
24
#include <cctype>
25
#include <cstdlib>
26
#include <memory>
27
#include <string>
28
#include <type_traits>
29
#include <vector>
30
31
#include "common/config.h"
32
#include "common/status.h"
33
#include "core/column/column_array.h"
34
#include "core/column/column_const.h"
35
#include "core/column/column_nullable.h"
36
#include "core/cow.h"
37
#include "core/data_type/data_type_array.h"
38
#include "core/data_type/data_type_number.h"
39
#include "core/data_type/define_primitive_type.h"
40
#include "core/data_type/primitive_type.h"
41
#include "exprs/function/ai/ai_adapter.h"
42
#include "exprs/function/function.h"
43
#include "runtime/query_context.h"
44
#include "runtime/runtime_state.h"
45
#include "service/http/http_client.h"
46
#include "util/threadpool.h"
47
48
namespace doris {
49
#include "common/compile_check_begin.h"
50
51
// Base class for AI-based functions
52
template <typename Derived>
53
class AIFunction : public IFunction {
54
public:
55
11
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_17FunctionAIExtractEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_14FunctionAIMaskEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_19FunctionAITranslateEE8get_nameB5cxx11Ev
Line
Count
Source
55
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
56
57
    // If the user doesn't provide the first arg, `resource_name`
58
    // FE will add the `resource_name` to the arguments list using the Session Variable.
59
    // So the value here should be the maximum number that the function can accept.
60
0
    size_t get_number_of_arguments() const override {
61
0
        return assert_cast<const Derived&>(*this).number_of_arguments;
62
0
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_13FunctionEmbedEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_16FunctionAIFilterEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE23get_number_of_argumentsEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE23get_number_of_argumentsEv
63
64
0
    bool is_blockable() const override { return true; }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_13FunctionEmbedEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_16FunctionAIFilterEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE12is_blockableEv
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE12is_blockableEv
65
66
    virtual Status build_prompt(const Block& block, const ColumnNumbers& arguments, size_t row_num,
67
40
                                std::string& prompt) const {
68
40
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
69
40
        StringRef text_ref = text_column.column->get_data_at(row_num);
70
40
        prompt = std::string(text_ref.data, text_ref.size);
71
72
40
        return Status::OK();
73
40
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
67
2
                                std::string& prompt) const {
68
2
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
69
2
        StringRef text_ref = text_column.column->get_data_at(row_num);
70
2
        prompt = std::string(text_ref.data, text_ref.size);
71
72
2
        return Status::OK();
73
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
67
34
                                std::string& prompt) const {
68
34
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
69
34
        StringRef text_ref = text_column.column->get_data_at(row_num);
70
34
        prompt = std::string(text_ref.data, text_ref.size);
71
72
34
        return Status::OK();
73
34
    }
_ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
67
1
                                std::string& prompt) const {
68
1
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
69
1
        StringRef text_ref = text_column.column->get_data_at(row_num);
70
1
        prompt = std::string(text_ref.data, text_ref.size);
71
72
1
        return Status::OK();
73
1
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
67
2
                                std::string& prompt) const {
68
2
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
69
2
        StringRef text_ref = text_column.column->get_data_at(row_num);
70
2
        prompt = std::string(text_ref.data, text_ref.size);
71
72
2
        return Status::OK();
73
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
67
1
                                std::string& prompt) const {
68
1
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
69
1
        StringRef text_ref = text_column.column->get_data_at(row_num);
70
1
        prompt = std::string(text_ref.data, text_ref.size);
71
72
1
        return Status::OK();
73
1
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
74
75
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
76
0
                        uint32_t result, size_t input_rows_count) const override {
77
0
        DataTypePtr return_type_impl =
78
0
                assert_cast<const Derived&>(*this).get_return_type_impl(DataTypes());
79
0
        MutableColumnPtr col_result = return_type_impl->create_column();
80
81
0
        TAIResource config;
82
0
        std::shared_ptr<AIAdapter> adapter;
83
0
        if (Status status = assert_cast<const Derived*>(this)->_init_from_resource(
84
0
                    context, block, arguments, config, adapter);
85
0
            !status.ok()) {
86
0
            return status;
87
0
        }
88
89
0
        for (size_t i = 0; i < input_rows_count; ++i) {
90
            // Build AI prompt text
91
0
            std::string prompt;
92
0
            RETURN_IF_ERROR(
93
0
                    assert_cast<const Derived&>(*this).build_prompt(block, arguments, i, prompt));
94
95
            // Execute a single AI request and get the result
96
0
            if (return_type_impl->get_primitive_type() == PrimitiveType::TYPE_ARRAY) {
97
                // Array(Float) for AI_EMBED
98
0
                std::vector<float> float_result;
99
0
                RETURN_IF_ERROR(
100
0
                        execute_single_request(prompt, float_result, config, adapter, context));
101
102
0
                auto& col_array = assert_cast<ColumnArray&>(*col_result);
103
0
                auto& offsets = col_array.get_offsets();
104
0
                auto& nested_nullable_col = assert_cast<ColumnNullable&>(col_array.get_data());
105
0
                auto& nested_col =
106
0
                        assert_cast<ColumnFloat32&>(*(nested_nullable_col.get_nested_column_ptr()));
107
0
                nested_col.reserve(nested_col.size() + float_result.size());
108
109
0
                size_t current_offset = nested_col.size();
110
0
                nested_col.insert_many_raw_data(reinterpret_cast<const char*>(float_result.data()),
111
0
                                                float_result.size());
112
0
                offsets.push_back(current_offset + float_result.size());
113
0
                auto& null_map = nested_nullable_col.get_null_map_column();
114
0
                null_map.insert_many_vals(0, float_result.size());
115
0
            } else {
116
0
                std::string string_result;
117
0
                RETURN_IF_ERROR(
118
0
                        execute_single_request(prompt, string_result, config, adapter, context));
119
120
0
                switch (return_type_impl->get_primitive_type()) {
121
0
                case PrimitiveType::TYPE_STRING: { // string
122
0
                    assert_cast<ColumnString&>(*col_result)
123
0
                            .insert_data(string_result.data(), string_result.size());
124
0
                    break;
125
0
                }
126
0
                case PrimitiveType::TYPE_BOOLEAN: { // boolean for AI_FILTER
127
#ifdef BE_TEST
128
                    const char* test_result = std::getenv("AI_TEST_RESULT");
129
                    if (test_result != nullptr) {
130
                        string_result = test_result;
131
                    } else {
132
                        string_result = "0";
133
                    }
134
#endif
135
0
                    trim_string(string_result);
136
0
                    if (string_result != "1" && string_result != "0") {
137
0
                        return Status::RuntimeError("Failed to parse boolean value: " +
138
0
                                                    string_result);
139
0
                    }
140
0
                    assert_cast<ColumnUInt8&>(*col_result)
141
0
                            .insert_value(static_cast<UInt8>(string_result == "1"));
142
0
                    break;
143
0
                }
144
0
                case PrimitiveType::TYPE_FLOAT: { // float for AI_SIMILARITY
145
#ifdef BE_TEST
146
                    const char* test_result = std::getenv("AI_TEST_RESULT");
147
                    if (test_result != nullptr) {
148
                        string_result = test_result;
149
                    } else {
150
                        string_result = "0.0";
151
                    }
152
#endif
153
0
                    trim_string(string_result);
154
0
                    try {
155
0
                        float float_value = std::stof(string_result);
156
0
                        assert_cast<ColumnFloat32&>(*col_result).insert_value(float_value);
157
0
                    } catch (...) {
158
0
                        return Status::RuntimeError("Failed to parse float value: " +
159
0
                                                    string_result);
160
0
                    }
161
0
                    break;
162
0
                }
163
0
                default:
164
0
                    return Status::InternalError("Unsupported ReturnType for AIFunction");
165
0
                }
166
0
            }
167
0
        }
168
169
0
        block.replace_by_position(result, std::move(col_result));
170
0
        return Status::OK();
171
0
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_13FunctionEmbedEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_16FunctionAIFilterEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjm
172
173
protected:
174
    // The endpoint `v1/completions` does not support `system_prompt`.
175
    // To ensure a clear structure and stable AI results.
176
    // Convert from `v1/completions` to `v1/chat/completions`
177
52
    static void normalize_endpoint(TAIResource& config) {
178
52
        if (config.endpoint.ends_with("v1/completions")) {
179
1
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
1
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
1
                                    legacy_suffix.size(), "v1/chat/completions");
182
1
        }
183
52
    }
_ZN5doris10AIFunctionINS_13FunctionEmbedEE18normalize_endpointERNS_11TAIResourceE
Line
Count
Source
177
1
    static void normalize_endpoint(TAIResource& config) {
178
1
        if (config.endpoint.ends_with("v1/completions")) {
179
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
0
                                    legacy_suffix.size(), "v1/chat/completions");
182
0
        }
183
1
    }
_ZN5doris10AIFunctionINS_16FunctionAIFilterEE18normalize_endpointERNS_11TAIResourceE
Line
Count
Source
177
33
    static void normalize_endpoint(TAIResource& config) {
178
33
        if (config.endpoint.ends_with("v1/completions")) {
179
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
0
                                    legacy_suffix.size(), "v1/chat/completions");
182
0
        }
183
33
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE18normalize_endpointERNS_11TAIResourceE
_ZN5doris10AIFunctionINS_19FunctionAISentimentEE18normalize_endpointERNS_11TAIResourceE
Line
Count
Source
177
4
    static void normalize_endpoint(TAIResource& config) {
178
4
        if (config.endpoint.ends_with("v1/completions")) {
179
1
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
1
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
1
                                    legacy_suffix.size(), "v1/chat/completions");
182
1
        }
183
4
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAISummarizeEE18normalize_endpointERNS_11TAIResourceE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_18FunctionAIClassifyEE18normalize_endpointERNS_11TAIResourceE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_17FunctionAIExtractEE18normalize_endpointERNS_11TAIResourceE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_18FunctionAIGenerateEE18normalize_endpointERNS_11TAIResourceE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_14FunctionAIMaskEE18normalize_endpointERNS_11TAIResourceE
_ZN5doris10AIFunctionINS_20FunctionAISimilarityEE18normalize_endpointERNS_11TAIResourceE
Line
Count
Source
177
14
    static void normalize_endpoint(TAIResource& config) {
178
14
        if (config.endpoint.ends_with("v1/completions")) {
179
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
180
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
181
0
                                    legacy_suffix.size(), "v1/chat/completions");
182
0
        }
183
14
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAITranslateEE18normalize_endpointERNS_11TAIResourceE
184
185
private:
186
    // Trim whitespace and newlines from string
187
47
    static void trim_string(std::string& str) {
188
47
        str.erase(str.begin(), std::find_if(str.begin(), str.end(),
189
72
                                            [](unsigned char ch) { return !std::isspace(ch); }));
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_13FunctionEmbedEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
_ZZN5doris10AIFunctionINS_16FunctionAIFilterEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
Line
Count
Source
189
46
                                            [](unsigned char ch) { return !std::isspace(ch); }));
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAISentimentEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAISummarizeEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_18FunctionAIClassifyEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_17FunctionAIExtractEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_18FunctionAIGenerateEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_14FunctionAIMaskEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
_ZZN5doris10AIFunctionINS_20FunctionAISimilarityEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
Line
Count
Source
189
26
                                            [](unsigned char ch) { return !std::isspace(ch); }));
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAITranslateEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
190
47
        str.erase(std::find_if(str.rbegin(), str.rend(),
191
69
                               [](unsigned char ch) { return !std::isspace(ch); })
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_13FunctionEmbedEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
_ZZN5doris10AIFunctionINS_16FunctionAIFilterEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
Line
Count
Source
191
43
                               [](unsigned char ch) { return !std::isspace(ch); })
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAISentimentEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAISummarizeEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_18FunctionAIClassifyEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_17FunctionAIExtractEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_18FunctionAIGenerateEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_14FunctionAIMaskEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
_ZZN5doris10AIFunctionINS_20FunctionAISimilarityEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
Line
Count
Source
191
26
                               [](unsigned char ch) { return !std::isspace(ch); })
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAITranslateEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
192
47
                          .base(),
193
47
                  str.end());
194
47
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_13FunctionEmbedEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZN5doris10AIFunctionINS_16FunctionAIFilterEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
187
33
    static void trim_string(std::string& str) {
188
33
        str.erase(str.begin(), std::find_if(str.begin(), str.end(),
189
33
                                            [](unsigned char ch) { return !std::isspace(ch); }));
190
33
        str.erase(std::find_if(str.rbegin(), str.rend(),
191
33
                               [](unsigned char ch) { return !std::isspace(ch); })
192
33
                          .base(),
193
33
                  str.end());
194
33
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAISentimentEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAISummarizeEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_18FunctionAIClassifyEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_17FunctionAIExtractEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_18FunctionAIGenerateEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Unexecuted instantiation: _ZN5doris10AIFunctionINS_14FunctionAIMaskEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZN5doris10AIFunctionINS_20FunctionAISimilarityEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
187
14
    static void trim_string(std::string& str) {
188
14
        str.erase(str.begin(), std::find_if(str.begin(), str.end(),
189
14
                                            [](unsigned char ch) { return !std::isspace(ch); }));
190
14
        str.erase(std::find_if(str.rbegin(), str.rend(),
191
14
                               [](unsigned char ch) { return !std::isspace(ch); })
192
14
                          .base(),
193
14
                  str.end());
194
14
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAITranslateEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
195
196
    // The ai resource must be literal
197
    Status _init_from_resource(FunctionContext* context, const Block& block,
198
                               const ColumnNumbers& arguments, TAIResource& config,
199
51
                               std::shared_ptr<AIAdapter>& adapter) const {
200
        // 1. Initialize config
201
51
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
202
51
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
203
51
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
204
205
51
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
206
51
                context->state()->get_query_ctx()->get_ai_resources();
207
51
        if (!ai_resources) {
208
1
            return Status::InternalError("AI resources metadata missing in QueryContext");
209
1
        }
210
50
        auto it = ai_resources->find(resource_name);
211
50
        if (it == ai_resources->end()) {
212
1
            return Status::InvalidArgument("AI resource not found: " + resource_name);
213
1
        }
214
49
        config = it->second;
215
216
49
        normalize_endpoint(config);
217
218
        // 2. Create an adapter based on provider_type
219
49
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
220
49
        if (!adapter) {
221
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
222
0
        }
223
49
        adapter->init(config);
224
225
49
        return Status::OK();
226
49
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
199
1
                               std::shared_ptr<AIAdapter>& adapter) const {
200
        // 1. Initialize config
201
1
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
202
1
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
203
1
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
204
205
1
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
206
1
                context->state()->get_query_ctx()->get_ai_resources();
207
1
        if (!ai_resources) {
208
0
            return Status::InternalError("AI resources metadata missing in QueryContext");
209
0
        }
210
1
        auto it = ai_resources->find(resource_name);
211
1
        if (it == ai_resources->end()) {
212
0
            return Status::InvalidArgument("AI resource not found: " + resource_name);
213
0
        }
214
1
        config = it->second;
215
216
1
        normalize_endpoint(config);
217
218
        // 2. Create an adapter based on provider_type
219
1
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
220
1
        if (!adapter) {
221
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
222
0
        }
223
1
        adapter->init(config);
224
225
1
        return Status::OK();
226
1
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
199
33
                               std::shared_ptr<AIAdapter>& adapter) const {
200
        // 1. Initialize config
201
33
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
202
33
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
203
33
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
204
205
33
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
206
33
                context->state()->get_query_ctx()->get_ai_resources();
207
33
        if (!ai_resources) {
208
0
            return Status::InternalError("AI resources metadata missing in QueryContext");
209
0
        }
210
33
        auto it = ai_resources->find(resource_name);
211
33
        if (it == ai_resources->end()) {
212
0
            return Status::InvalidArgument("AI resource not found: " + resource_name);
213
0
        }
214
33
        config = it->second;
215
216
33
        normalize_endpoint(config);
217
218
        // 2. Create an adapter based on provider_type
219
33
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
220
33
        if (!adapter) {
221
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
222
0
        }
223
33
        adapter->init(config);
224
225
33
        return Status::OK();
226
33
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
199
3
                               std::shared_ptr<AIAdapter>& adapter) const {
200
        // 1. Initialize config
201
3
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
202
3
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
203
3
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
204
205
3
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
206
3
                context->state()->get_query_ctx()->get_ai_resources();
207
3
        if (!ai_resources) {
208
1
            return Status::InternalError("AI resources metadata missing in QueryContext");
209
1
        }
210
2
        auto it = ai_resources->find(resource_name);
211
2
        if (it == ai_resources->end()) {
212
1
            return Status::InvalidArgument("AI resource not found: " + resource_name);
213
1
        }
214
1
        config = it->second;
215
216
1
        normalize_endpoint(config);
217
218
        // 2. Create an adapter based on provider_type
219
1
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
220
1
        if (!adapter) {
221
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
222
0
        }
223
1
        adapter->init(config);
224
225
1
        return Status::OK();
226
1
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
199
14
                               std::shared_ptr<AIAdapter>& adapter) const {
200
        // 1. Initialize config
201
14
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
202
14
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
203
14
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
204
205
14
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
206
14
                context->state()->get_query_ctx()->get_ai_resources();
207
14
        if (!ai_resources) {
208
0
            return Status::InternalError("AI resources metadata missing in QueryContext");
209
0
        }
210
14
        auto it = ai_resources->find(resource_name);
211
14
        if (it == ai_resources->end()) {
212
0
            return Status::InvalidArgument("AI resource not found: " + resource_name);
213
0
        }
214
14
        config = it->second;
215
216
14
        normalize_endpoint(config);
217
218
        // 2. Create an adapter based on provider_type
219
14
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
220
14
        if (!adapter) {
221
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
222
0
        }
223
14
        adapter->init(config);
224
225
14
        return Status::OK();
226
14
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
227
228
    // Executes the actual HTTP request
229
    Status do_send_request(HttpClient* client, const std::string& request_body,
230
                           std::string& response, const TAIResource& config,
231
0
                           std::shared_ptr<AIAdapter>& adapter, FunctionContext* context) const {
232
0
        RETURN_IF_ERROR(client->init(config.endpoint));
233
234
0
        QueryContext* query_ctx = context->state()->get_query_ctx();
235
0
        int64_t remaining_query_time = query_ctx->get_remaining_query_time_seconds();
236
0
        if (remaining_query_time <= 0) {
237
0
            return Status::TimedOut("Query timeout exceeded before AI request");
238
0
        }
239
240
0
        client->set_timeout_ms(remaining_query_time * 1000);
241
242
0
        if (!config.api_key.empty()) {
243
0
            RETURN_IF_ERROR(adapter->set_authentication(client));
244
0
        }
245
246
0
        return client->execute_post_request(request_body, &response);
247
0
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_13FunctionEmbedEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_16FunctionAIFilterEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE15do_send_requestEPNS_10HttpClientERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSA_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
248
249
    // Sends the request with retry mechanism for handling transient failures
250
    Status send_request_to_llm(const std::string& request_body, std::string& response,
251
                               const TAIResource& config, std::shared_ptr<AIAdapter>& adapter,
252
0
                               FunctionContext* context) const {
253
0
        return HttpClient::execute_with_retry(config.max_retries, config.retry_delay_second,
254
0
                                              [this, &request_body, &response, &config, &adapter,
255
0
                                               context](HttpClient* client) -> Status {
256
0
                                                  return this->do_send_request(client, request_body,
257
0
                                                                               response, config,
258
0
                                                                               adapter, context);
259
0
                                              });
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_13FunctionEmbedEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_16FunctionAIFilterEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAISentimentEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAISummarizeEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_18FunctionAIClassifyEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_17FunctionAIExtractEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_18FunctionAIGenerateEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_14FunctionAIMaskEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_20FunctionAISimilarityEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
Unexecuted instantiation: _ZZNK5doris10AIFunctionINS_19FunctionAITranslateEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextEENKUlPNS_10HttpClientEE_clESM_
260
0
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_13FunctionEmbedEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_16FunctionAIFilterEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE19send_request_to_llmERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
261
262
    // Wrapper for executing a single LLM request
263
    Status execute_single_request(const std::string& input, std::string& result,
264
                                  const TAIResource& config, std::shared_ptr<AIAdapter>& adapter,
265
48
                                  FunctionContext* context) const {
266
48
        std::vector<std::string> inputs = {input};
267
48
        std::vector<std::string> results;
268
269
48
        std::string request_body;
270
48
        RETURN_IF_ERROR(adapter->build_request_payload(
271
48
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
272
273
48
        std::string response;
274
48
        if (config.provider_type == "MOCK") {
275
            // Mock path for UT
276
48
            response = "this is a mock response. " + input;
277
48
        } else {
278
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
279
0
        }
280
281
48
        RETURN_IF_ERROR(adapter->parse_response(response, results));
282
48
        if (results.empty()) {
283
0
            return Status::InternalError("AI returned empty result");
284
0
        }
285
286
48
        result = std::move(results[0]);
287
48
        return Status::OK();
288
48
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_13FunctionEmbedEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
265
33
                                  FunctionContext* context) const {
266
33
        std::vector<std::string> inputs = {input};
267
33
        std::vector<std::string> results;
268
269
33
        std::string request_body;
270
33
        RETURN_IF_ERROR(adapter->build_request_payload(
271
33
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
272
273
33
        std::string response;
274
33
        if (config.provider_type == "MOCK") {
275
            // Mock path for UT
276
33
            response = "this is a mock response. " + input;
277
33
        } else {
278
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
279
0
        }
280
281
33
        RETURN_IF_ERROR(adapter->parse_response(response, results));
282
33
        if (results.empty()) {
283
0
            return Status::InternalError("AI returned empty result");
284
0
        }
285
286
33
        result = std::move(results[0]);
287
33
        return Status::OK();
288
33
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
265
1
                                  FunctionContext* context) const {
266
1
        std::vector<std::string> inputs = {input};
267
1
        std::vector<std::string> results;
268
269
1
        std::string request_body;
270
1
        RETURN_IF_ERROR(adapter->build_request_payload(
271
1
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
272
273
1
        std::string response;
274
1
        if (config.provider_type == "MOCK") {
275
            // Mock path for UT
276
1
            response = "this is a mock response. " + input;
277
1
        } else {
278
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
279
0
        }
280
281
1
        RETURN_IF_ERROR(adapter->parse_response(response, results));
282
1
        if (results.empty()) {
283
0
            return Status::InternalError("AI returned empty result");
284
0
        }
285
286
1
        result = std::move(results[0]);
287
1
        return Status::OK();
288
1
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
265
14
                                  FunctionContext* context) const {
266
14
        std::vector<std::string> inputs = {input};
267
14
        std::vector<std::string> results;
268
269
14
        std::string request_body;
270
14
        RETURN_IF_ERROR(adapter->build_request_payload(
271
14
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
272
273
14
        std::string response;
274
14
        if (config.provider_type == "MOCK") {
275
            // Mock path for UT
276
14
            response = "this is a mock response. " + input;
277
14
        } else {
278
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
279
0
        }
280
281
14
        RETURN_IF_ERROR(adapter->parse_response(response, results));
282
14
        if (results.empty()) {
283
0
            return Status::InternalError("AI returned empty result");
284
0
        }
285
286
14
        result = std::move(results[0]);
287
14
        return Status::OK();
288
14
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
289
290
    Status execute_single_request(const std::string& input, std::vector<float>& result,
291
                                  const TAIResource& config, std::shared_ptr<AIAdapter>& adapter,
292
1
                                  FunctionContext* context) const {
293
1
        std::vector<std::string> inputs = {input};
294
1
        std::vector<std::vector<float>> results;
295
296
1
        std::string request_body;
297
1
        RETURN_IF_ERROR(adapter->build_embedding_request(inputs, request_body));
298
299
1
        std::string response;
300
1
        if (config.provider_type == "MOCK") {
301
            // Mock path for UT
302
1
            response = "{\"embedding\": [0, 1, 2, 3, 4]}";
303
1
        } else {
304
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
305
0
        }
306
307
1
        RETURN_IF_ERROR(adapter->parse_embedding_response(response, results));
308
1
        if (results.empty()) {
309
0
            return Status::InternalError("AI returned empty result");
310
0
        }
311
312
1
        result = std::move(results[0]);
313
1
        return Status::OK();
314
1
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
292
1
                                  FunctionContext* context) const {
293
1
        std::vector<std::string> inputs = {input};
294
1
        std::vector<std::vector<float>> results;
295
296
1
        std::string request_body;
297
1
        RETURN_IF_ERROR(adapter->build_embedding_request(inputs, request_body));
298
299
1
        std::string response;
300
1
        if (config.provider_type == "MOCK") {
301
            // Mock path for UT
302
1
            response = "{\"embedding\": [0, 1, 2, 3, 4]}";
303
1
        } else {
304
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
305
0
        }
306
307
1
        RETURN_IF_ERROR(adapter->parse_embedding_response(response, results));
308
1
        if (results.empty()) {
309
0
            return Status::InternalError("AI returned empty result");
310
0
        }
311
312
1
        result = std::move(results[0]);
313
1
        return Status::OK();
314
1
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_16FunctionAIFilterEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISentimentEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_17FunctionAIExtractEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_14FunctionAIMaskEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
315
};
316
317
#include "common/compile_check_end.h"
318
} // namespace doris