001/**
002 * Copyright (c) 2025-2026, Michael Yang 杨福海 (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.gnu.org/licenses/lgpl-3.0.txt
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package dev.tinyflow.core.searchengine.impl;
017
018import com.alibaba.fastjson.JSON;
019import com.alibaba.fastjson.JSONArray;
020import com.alibaba.fastjson.JSONObject;
021import dev.tinyflow.core.chain.Chain;
022import dev.tinyflow.core.node.SearchEngineNode;
023import dev.tinyflow.core.searchengine.BaseSearchEngine;
024import dev.tinyflow.core.util.Maps;
025import dev.tinyflow.core.util.OKHttpClientWrapper;
026
027import java.util.*;
028
029public class BochaaiSearchEngineImpl extends BaseSearchEngine {
030
031    private static final String DEFAULT_API_URL = "https://api.bochaai.com/v1/ai-search";
032    private OKHttpClientWrapper okHttpClientWrapper = new OKHttpClientWrapper();
033
034    public BochaaiSearchEngineImpl() {
035        setApiUrl(DEFAULT_API_URL);
036    }
037
038    public OKHttpClientWrapper getOkHttpClientWrapper() {
039        return okHttpClientWrapper;
040    }
041
042    public void setOkHttpClientWrapper(OKHttpClientWrapper okHttpClientWrapper) {
043        this.okHttpClientWrapper = okHttpClientWrapper;
044    }
045
046    @Override
047    public List<Map<String, Object>> search(String keyword, int limit, SearchEngineNode searchEngineNode, Chain chain) {
048
049        Map<String, String> headers = new HashMap<>();
050        headers.put("Authorization", "Bearer " + apiKey);
051        headers.put("Content-Type", "application/json");
052
053        String jsonString = Maps.of("query", keyword)
054                .set("summary", true).
055                set("freshness", "noLimit")
056                .set("count", limit)
057                .set("stream", false)
058                .toJSON();
059
060
061        String responseString = okHttpClientWrapper.post(apiUrl, headers, jsonString);
062        JSONObject object = JSON.parseObject(responseString);
063
064        if (200 == object.getIntValue("code")) {
065            JSONArray messages = object.getJSONArray("messages");
066            List<Map<String, Object>> result = new ArrayList<>();
067            for (int i = 0; i < messages.size(); i++) {
068                result.add(messages.getJSONObject(i));
069            }
070            return result;
071        }
072
073        return Collections.emptyList();
074    }
075}