Coverage Report

Created: 2026-04-10 12:12

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
50
// Base class for AI-based functions
51
template <typename Derived>
52
class AIFunction : public IFunction {
53
public:
54
11
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_19FunctionAISentimentEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_18FunctionAIClassifyEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_17FunctionAIExtractEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_18FunctionAIGenerateEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_14FunctionAIMaskEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
_ZNK5doris10AIFunctionINS_19FunctionAITranslateEE8get_nameB5cxx11Ev
Line
Count
Source
54
1
    std::string get_name() const override { return assert_cast<const Derived&>(*this).name; }
55
56
    // If the user doesn't provide the first arg, `resource_name`
57
    // FE will add the `resource_name` to the arguments list using the Session Variable.
58
    // So the value here should be the maximum number that the function can accept.
59
0
    size_t get_number_of_arguments() const override {
60
0
        return assert_cast<const Derived&>(*this).number_of_arguments;
61
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
62
63
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
64
65
    virtual Status build_prompt(const Block& block, const ColumnNumbers& arguments, size_t row_num,
66
40
                                std::string& prompt) const {
67
40
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
68
40
        StringRef text_ref = text_column.column->get_data_at(row_num);
69
40
        prompt = std::string(text_ref.data, text_ref.size);
70
71
40
        return Status::OK();
72
40
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
66
2
                                std::string& prompt) const {
67
2
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
68
2
        StringRef text_ref = text_column.column->get_data_at(row_num);
69
2
        prompt = std::string(text_ref.data, text_ref.size);
70
71
2
        return Status::OK();
72
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
66
34
                                std::string& prompt) const {
67
34
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
68
34
        StringRef text_ref = text_column.column->get_data_at(row_num);
69
34
        prompt = std::string(text_ref.data, text_ref.size);
70
71
34
        return Status::OK();
72
34
    }
_ZNK5doris10AIFunctionINS_20FunctionAIFixGrammarEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
66
1
                                std::string& prompt) const {
67
1
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
68
1
        StringRef text_ref = text_column.column->get_data_at(row_num);
69
1
        prompt = std::string(text_ref.data, text_ref.size);
70
71
1
        return Status::OK();
72
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
66
2
                                std::string& prompt) const {
67
2
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
68
2
        StringRef text_ref = text_column.column->get_data_at(row_num);
69
2
        prompt = std::string(text_ref.data, text_ref.size);
70
71
2
        return Status::OK();
72
2
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_20FunctionAISimilarityEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZNK5doris10AIFunctionINS_19FunctionAISummarizeEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
66
1
                                std::string& prompt) const {
67
1
        const ColumnWithTypeAndName& text_column = block.get_by_position(arguments[1]);
68
1
        StringRef text_ref = text_column.column->get_data_at(row_num);
69
1
        prompt = std::string(text_ref.data, text_ref.size);
70
71
1
        return Status::OK();
72
1
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE12build_promptERKNS_5BlockERKSt6vectorIjSaIjEEmRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
73
74
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
75
0
                        uint32_t result, size_t input_rows_count) const override {
76
0
        DataTypePtr return_type_impl =
77
0
                assert_cast<const Derived&>(*this).get_return_type_impl(DataTypes());
78
0
        MutableColumnPtr col_result = return_type_impl->create_column();
79
80
0
        TAIResource config;
81
0
        std::shared_ptr<AIAdapter> adapter;
82
0
        if (Status status = assert_cast<const Derived*>(this)->_init_from_resource(
83
0
                    context, block, arguments, config, adapter);
84
0
            !status.ok()) {
85
0
            return status;
86
0
        }
87
88
0
        for (size_t i = 0; i < input_rows_count; ++i) {
89
            // Build AI prompt text
90
0
            std::string prompt;
91
0
            RETURN_IF_ERROR(
92
0
                    assert_cast<const Derived&>(*this).build_prompt(block, arguments, i, prompt));
93
94
            // Execute a single AI request and get the result
95
0
            if (return_type_impl->get_primitive_type() == PrimitiveType::TYPE_ARRAY) {
96
                // Array(Float) for AI_EMBED
97
0
                std::vector<float> float_result;
98
0
                RETURN_IF_ERROR(
99
0
                        execute_single_request(prompt, float_result, config, adapter, context));
100
101
0
                auto& col_array = assert_cast<ColumnArray&>(*col_result);
102
0
                auto& offsets = col_array.get_offsets();
103
0
                auto& nested_nullable_col = assert_cast<ColumnNullable&>(col_array.get_data());
104
0
                auto& nested_col =
105
0
                        assert_cast<ColumnFloat32&>(*(nested_nullable_col.get_nested_column_ptr()));
106
0
                nested_col.reserve(nested_col.size() + float_result.size());
107
108
0
                size_t current_offset = nested_col.size();
109
0
                nested_col.insert_many_raw_data(reinterpret_cast<const char*>(float_result.data()),
110
0
                                                float_result.size());
111
0
                offsets.push_back(current_offset + float_result.size());
112
0
                auto& null_map = nested_nullable_col.get_null_map_column();
113
0
                null_map.insert_many_vals(0, float_result.size());
114
0
            } else {
115
0
                std::string string_result;
116
0
                RETURN_IF_ERROR(
117
0
                        execute_single_request(prompt, string_result, config, adapter, context));
118
119
0
                switch (return_type_impl->get_primitive_type()) {
120
0
                case PrimitiveType::TYPE_STRING: { // string
121
0
                    assert_cast<ColumnString&>(*col_result)
122
0
                            .insert_data(string_result.data(), string_result.size());
123
0
                    break;
124
0
                }
125
0
                case PrimitiveType::TYPE_BOOLEAN: { // boolean for AI_FILTER
126
#ifdef BE_TEST
127
                    const char* test_result = std::getenv("AI_TEST_RESULT");
128
                    if (test_result != nullptr) {
129
                        string_result = test_result;
130
                    } else {
131
                        string_result = "0";
132
                    }
133
#endif
134
0
                    trim_string(string_result);
135
0
                    if (string_result != "1" && string_result != "0") {
136
0
                        return Status::RuntimeError("Failed to parse boolean value: " +
137
0
                                                    string_result);
138
0
                    }
139
0
                    assert_cast<ColumnUInt8&>(*col_result)
140
0
                            .insert_value(static_cast<UInt8>(string_result == "1"));
141
0
                    break;
142
0
                }
143
0
                case PrimitiveType::TYPE_FLOAT: { // float for AI_SIMILARITY
144
#ifdef BE_TEST
145
                    const char* test_result = std::getenv("AI_TEST_RESULT");
146
                    if (test_result != nullptr) {
147
                        string_result = test_result;
148
                    } else {
149
                        string_result = "0.0";
150
                    }
151
#endif
152
0
                    trim_string(string_result);
153
0
                    try {
154
0
                        float float_value = std::stof(string_result);
155
0
                        assert_cast<ColumnFloat32&>(*col_result).insert_value(float_value);
156
0
                    } catch (...) {
157
0
                        return Status::RuntimeError("Failed to parse float value: " +
158
0
                                                    string_result);
159
0
                    }
160
0
                    break;
161
0
                }
162
0
                default:
163
0
                    return Status::InternalError("Unsupported ReturnType for AIFunction");
164
0
                }
165
0
            }
166
0
        }
167
168
0
        block.replace_by_position(result, std::move(col_result));
169
0
        return Status::OK();
170
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
171
172
protected:
173
    // The endpoint `v1/completions` does not support `system_prompt`.
174
    // To ensure a clear structure and stable AI results.
175
    // Convert from `v1/completions` to `v1/chat/completions`
176
52
    static void normalize_endpoint(TAIResource& config) {
177
52
        if (config.endpoint.ends_with("v1/completions")) {
178
1
            static constexpr std::string_view legacy_suffix = "v1/completions";
179
1
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
180
1
                                    legacy_suffix.size(), "v1/chat/completions");
181
1
        }
182
52
    }
_ZN5doris10AIFunctionINS_13FunctionEmbedEE18normalize_endpointERNS_11TAIResourceE
Line
Count
Source
176
1
    static void normalize_endpoint(TAIResource& config) {
177
1
        if (config.endpoint.ends_with("v1/completions")) {
178
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
179
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
180
0
                                    legacy_suffix.size(), "v1/chat/completions");
181
0
        }
182
1
    }
_ZN5doris10AIFunctionINS_16FunctionAIFilterEE18normalize_endpointERNS_11TAIResourceE
Line
Count
Source
176
33
    static void normalize_endpoint(TAIResource& config) {
177
33
        if (config.endpoint.ends_with("v1/completions")) {
178
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
179
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
180
0
                                    legacy_suffix.size(), "v1/chat/completions");
181
0
        }
182
33
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_20FunctionAIFixGrammarEE18normalize_endpointERNS_11TAIResourceE
_ZN5doris10AIFunctionINS_19FunctionAISentimentEE18normalize_endpointERNS_11TAIResourceE
Line
Count
Source
176
4
    static void normalize_endpoint(TAIResource& config) {
177
4
        if (config.endpoint.ends_with("v1/completions")) {
178
1
            static constexpr std::string_view legacy_suffix = "v1/completions";
179
1
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
180
1
                                    legacy_suffix.size(), "v1/chat/completions");
181
1
        }
182
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
176
14
    static void normalize_endpoint(TAIResource& config) {
177
14
        if (config.endpoint.ends_with("v1/completions")) {
178
0
            static constexpr std::string_view legacy_suffix = "v1/completions";
179
0
            config.endpoint.replace(config.endpoint.size() - legacy_suffix.size(),
180
0
                                    legacy_suffix.size(), "v1/chat/completions");
181
0
        }
182
14
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAITranslateEE18normalize_endpointERNS_11TAIResourceE
183
184
private:
185
    // Trim whitespace and newlines from string
186
47
    static void trim_string(std::string& str) {
187
47
        str.erase(str.begin(), std::find_if(str.begin(), str.end(),
188
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
188
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
188
26
                                            [](unsigned char ch) { return !std::isspace(ch); }));
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAITranslateEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE_clEh
189
47
        str.erase(std::find_if(str.rbegin(), str.rend(),
190
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
190
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
190
26
                               [](unsigned char ch) { return !std::isspace(ch); })
Unexecuted instantiation: _ZZN5doris10AIFunctionINS_19FunctionAITranslateEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEENKUlhE0_clEh
191
47
                          .base(),
192
47
                  str.end());
193
47
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_13FunctionEmbedEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
_ZN5doris10AIFunctionINS_16FunctionAIFilterEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Line
Count
Source
186
33
    static void trim_string(std::string& str) {
187
33
        str.erase(str.begin(), std::find_if(str.begin(), str.end(),
188
33
                                            [](unsigned char ch) { return !std::isspace(ch); }));
189
33
        str.erase(std::find_if(str.rbegin(), str.rend(),
190
33
                               [](unsigned char ch) { return !std::isspace(ch); })
191
33
                          .base(),
192
33
                  str.end());
193
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
186
14
    static void trim_string(std::string& str) {
187
14
        str.erase(str.begin(), std::find_if(str.begin(), str.end(),
188
14
                                            [](unsigned char ch) { return !std::isspace(ch); }));
189
14
        str.erase(std::find_if(str.rbegin(), str.rend(),
190
14
                               [](unsigned char ch) { return !std::isspace(ch); })
191
14
                          .base(),
192
14
                  str.end());
193
14
    }
Unexecuted instantiation: _ZN5doris10AIFunctionINS_19FunctionAITranslateEE11trim_stringERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
194
195
    // The ai resource must be literal
196
    Status _init_from_resource(FunctionContext* context, const Block& block,
197
                               const ColumnNumbers& arguments, TAIResource& config,
198
51
                               std::shared_ptr<AIAdapter>& adapter) const {
199
        // 1. Initialize config
200
51
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
201
51
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
202
51
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
203
204
51
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
205
51
                context->state()->get_query_ctx()->get_ai_resources();
206
51
        if (!ai_resources) {
207
1
            return Status::InternalError("AI resources metadata missing in QueryContext");
208
1
        }
209
50
        auto it = ai_resources->find(resource_name);
210
50
        if (it == ai_resources->end()) {
211
1
            return Status::InvalidArgument("AI resource not found: " + resource_name);
212
1
        }
213
49
        config = it->second;
214
215
49
        normalize_endpoint(config);
216
217
        // 2. Create an adapter based on provider_type
218
49
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
219
49
        if (!adapter) {
220
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
221
0
        }
222
49
        adapter->init(config);
223
224
49
        return Status::OK();
225
49
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
198
1
                               std::shared_ptr<AIAdapter>& adapter) const {
199
        // 1. Initialize config
200
1
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
201
1
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
202
1
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
203
204
1
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
205
1
                context->state()->get_query_ctx()->get_ai_resources();
206
1
        if (!ai_resources) {
207
0
            return Status::InternalError("AI resources metadata missing in QueryContext");
208
0
        }
209
1
        auto it = ai_resources->find(resource_name);
210
1
        if (it == ai_resources->end()) {
211
0
            return Status::InvalidArgument("AI resource not found: " + resource_name);
212
0
        }
213
1
        config = it->second;
214
215
1
        normalize_endpoint(config);
216
217
        // 2. Create an adapter based on provider_type
218
1
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
219
1
        if (!adapter) {
220
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
221
0
        }
222
1
        adapter->init(config);
223
224
1
        return Status::OK();
225
1
    }
_ZNK5doris10AIFunctionINS_16FunctionAIFilterEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
Line
Count
Source
198
33
                               std::shared_ptr<AIAdapter>& adapter) const {
199
        // 1. Initialize config
200
33
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
201
33
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
202
33
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
203
204
33
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
205
33
                context->state()->get_query_ctx()->get_ai_resources();
206
33
        if (!ai_resources) {
207
0
            return Status::InternalError("AI resources metadata missing in QueryContext");
208
0
        }
209
33
        auto it = ai_resources->find(resource_name);
210
33
        if (it == ai_resources->end()) {
211
0
            return Status::InvalidArgument("AI resource not found: " + resource_name);
212
0
        }
213
33
        config = it->second;
214
215
33
        normalize_endpoint(config);
216
217
        // 2. Create an adapter based on provider_type
218
33
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
219
33
        if (!adapter) {
220
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
221
0
        }
222
33
        adapter->init(config);
223
224
33
        return Status::OK();
225
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
198
3
                               std::shared_ptr<AIAdapter>& adapter) const {
199
        // 1. Initialize config
200
3
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
201
3
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
202
3
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
203
204
3
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
205
3
                context->state()->get_query_ctx()->get_ai_resources();
206
3
        if (!ai_resources) {
207
1
            return Status::InternalError("AI resources metadata missing in QueryContext");
208
1
        }
209
2
        auto it = ai_resources->find(resource_name);
210
2
        if (it == ai_resources->end()) {
211
1
            return Status::InvalidArgument("AI resource not found: " + resource_name);
212
1
        }
213
1
        config = it->second;
214
215
1
        normalize_endpoint(config);
216
217
        // 2. Create an adapter based on provider_type
218
1
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
219
1
        if (!adapter) {
220
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
221
0
        }
222
1
        adapter->init(config);
223
224
1
        return Status::OK();
225
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
198
14
                               std::shared_ptr<AIAdapter>& adapter) const {
199
        // 1. Initialize config
200
14
        const ColumnWithTypeAndName& resource_column = block.get_by_position(arguments[0]);
201
14
        StringRef resource_name_ref = resource_column.column->get_data_at(0);
202
14
        std::string resource_name = std::string(resource_name_ref.data, resource_name_ref.size);
203
204
14
        const std::shared_ptr<std::map<std::string, TAIResource>>& ai_resources =
205
14
                context->state()->get_query_ctx()->get_ai_resources();
206
14
        if (!ai_resources) {
207
0
            return Status::InternalError("AI resources metadata missing in QueryContext");
208
0
        }
209
14
        auto it = ai_resources->find(resource_name);
210
14
        if (it == ai_resources->end()) {
211
0
            return Status::InvalidArgument("AI resource not found: " + resource_name);
212
0
        }
213
14
        config = it->second;
214
215
14
        normalize_endpoint(config);
216
217
        // 2. Create an adapter based on provider_type
218
14
        adapter = AIAdapterFactory::create_adapter(config.provider_type);
219
14
        if (!adapter) {
220
0
            return Status::InvalidArgument("Unsupported AI provider type: " + config.provider_type);
221
0
        }
222
14
        adapter->init(config);
223
224
14
        return Status::OK();
225
14
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE19_init_from_resourceEPNS_15FunctionContextERKNS_5BlockERKSt6vectorIjSaIjEERNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEE
226
227
    // Executes the actual HTTP request
228
    Status do_send_request(HttpClient* client, const std::string& request_body,
229
                           std::string& response, const TAIResource& config,
230
0
                           std::shared_ptr<AIAdapter>& adapter, FunctionContext* context) const {
231
0
        RETURN_IF_ERROR(client->init(config.endpoint));
232
233
0
        QueryContext* query_ctx = context->state()->get_query_ctx();
234
0
        int64_t remaining_query_time = query_ctx->get_remaining_query_time_seconds();
235
0
        if (remaining_query_time <= 0) {
236
0
            return Status::TimedOut("Query timeout exceeded before AI request");
237
0
        }
238
239
0
        client->set_timeout_ms(remaining_query_time * 1000);
240
241
0
        if (!config.api_key.empty()) {
242
0
            RETURN_IF_ERROR(adapter->set_authentication(client));
243
0
        }
244
245
0
        return client->execute_post_request(request_body, &response);
246
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
247
248
    // Sends the request with retry mechanism for handling transient failures
249
    Status send_request_to_llm(const std::string& request_body, std::string& response,
250
                               const TAIResource& config, std::shared_ptr<AIAdapter>& adapter,
251
0
                               FunctionContext* context) const {
252
0
        return HttpClient::execute_with_retry(config.max_retries, config.retry_delay_second,
253
0
                                              [this, &request_body, &response, &config, &adapter,
254
0
                                               context](HttpClient* client) -> Status {
255
0
                                                  return this->do_send_request(client, request_body,
256
0
                                                                               response, config,
257
0
                                                                               adapter, context);
258
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_
259
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
260
261
    // Wrapper for executing a single LLM request
262
    Status execute_single_request(const std::string& input, std::string& result,
263
                                  const TAIResource& config, std::shared_ptr<AIAdapter>& adapter,
264
48
                                  FunctionContext* context) const {
265
48
        std::vector<std::string> inputs = {input};
266
48
        std::vector<std::string> results;
267
268
48
        std::string request_body;
269
48
        RETURN_IF_ERROR(adapter->build_request_payload(
270
48
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
271
272
48
        std::string response;
273
48
        if (config.provider_type == "MOCK") {
274
            // Mock path for UT
275
48
            response = "this is a mock response. " + input;
276
48
        } else {
277
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
278
0
        }
279
280
48
        RETURN_IF_ERROR(adapter->parse_response(response, results));
281
48
        if (results.empty()) {
282
0
            return Status::InternalError("AI returned empty result");
283
0
        }
284
285
48
        result = std::move(results[0]);
286
48
        return Status::OK();
287
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
264
33
                                  FunctionContext* context) const {
265
33
        std::vector<std::string> inputs = {input};
266
33
        std::vector<std::string> results;
267
268
33
        std::string request_body;
269
33
        RETURN_IF_ERROR(adapter->build_request_payload(
270
33
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
271
272
33
        std::string response;
273
33
        if (config.provider_type == "MOCK") {
274
            // Mock path for UT
275
33
            response = "this is a mock response. " + input;
276
33
        } else {
277
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
278
0
        }
279
280
33
        RETURN_IF_ERROR(adapter->parse_response(response, results));
281
33
        if (results.empty()) {
282
0
            return Status::InternalError("AI returned empty result");
283
0
        }
284
285
33
        result = std::move(results[0]);
286
33
        return Status::OK();
287
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
264
1
                                  FunctionContext* context) const {
265
1
        std::vector<std::string> inputs = {input};
266
1
        std::vector<std::string> results;
267
268
1
        std::string request_body;
269
1
        RETURN_IF_ERROR(adapter->build_request_payload(
270
1
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
271
272
1
        std::string response;
273
1
        if (config.provider_type == "MOCK") {
274
            // Mock path for UT
275
1
            response = "this is a mock response. " + input;
276
1
        } else {
277
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
278
0
        }
279
280
1
        RETURN_IF_ERROR(adapter->parse_response(response, results));
281
1
        if (results.empty()) {
282
0
            return Status::InternalError("AI returned empty result");
283
0
        }
284
285
1
        result = std::move(results[0]);
286
1
        return Status::OK();
287
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
264
14
                                  FunctionContext* context) const {
265
14
        std::vector<std::string> inputs = {input};
266
14
        std::vector<std::string> results;
267
268
14
        std::string request_body;
269
14
        RETURN_IF_ERROR(adapter->build_request_payload(
270
14
                inputs, assert_cast<const Derived&>(*this).system_prompt, request_body));
271
272
14
        std::string response;
273
14
        if (config.provider_type == "MOCK") {
274
            // Mock path for UT
275
14
            response = "this is a mock response. " + input;
276
14
        } else {
277
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
278
0
        }
279
280
14
        RETURN_IF_ERROR(adapter->parse_response(response, results));
281
14
        if (results.empty()) {
282
0
            return Status::InternalError("AI returned empty result");
283
0
        }
284
285
14
        result = std::move(results[0]);
286
14
        return Status::OK();
287
14
    }
Unexecuted instantiation: _ZNK5doris10AIFunctionINS_19FunctionAITranslateEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS8_RKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
288
289
    Status execute_single_request(const std::string& input, std::vector<float>& result,
290
                                  const TAIResource& config, std::shared_ptr<AIAdapter>& adapter,
291
1
                                  FunctionContext* context) const {
292
1
        std::vector<std::string> inputs = {input};
293
1
        std::vector<std::vector<float>> results;
294
295
1
        std::string request_body;
296
1
        RETURN_IF_ERROR(adapter->build_embedding_request(inputs, request_body));
297
298
1
        std::string response;
299
1
        if (config.provider_type == "MOCK") {
300
            // Mock path for UT
301
1
            response = "{\"embedding\": [0, 1, 2, 3, 4]}";
302
1
        } else {
303
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
304
0
        }
305
306
1
        RETURN_IF_ERROR(adapter->parse_embedding_response(response, results));
307
1
        if (results.empty()) {
308
0
            return Status::InternalError("AI returned empty result");
309
0
        }
310
311
1
        result = std::move(results[0]);
312
1
        return Status::OK();
313
1
    }
_ZNK5doris10AIFunctionINS_13FunctionEmbedEE22execute_single_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIfSaIfEERKNS_11TAIResourceERSt10shared_ptrINS_9AIAdapterEEPNS_15FunctionContextE
Line
Count
Source
291
1
                                  FunctionContext* context) const {
292
1
        std::vector<std::string> inputs = {input};
293
1
        std::vector<std::vector<float>> results;
294
295
1
        std::string request_body;
296
1
        RETURN_IF_ERROR(adapter->build_embedding_request(inputs, request_body));
297
298
1
        std::string response;
299
1
        if (config.provider_type == "MOCK") {
300
            // Mock path for UT
301
1
            response = "{\"embedding\": [0, 1, 2, 3, 4]}";
302
1
        } else {
303
0
            RETURN_IF_ERROR(send_request_to_llm(request_body, response, config, adapter, context));
304
0
        }
305
306
1
        RETURN_IF_ERROR(adapter->parse_embedding_response(response, results));
307
1
        if (results.empty()) {
308
0
            return Status::InternalError("AI returned empty result");
309
0
        }
310
311
1
        result = std::move(results[0]);
312
1
        return Status::OK();
313
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
314
};
315
316
} // namespace doris