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.node;
017
018import dev.tinyflow.core.chain.Chain;
019import dev.tinyflow.core.knowledge.Knowledge;
020import dev.tinyflow.core.knowledge.KnowledgeManager;
021import dev.tinyflow.core.util.Maps;
022import dev.tinyflow.core.util.StringUtil;
023import dev.tinyflow.core.util.TextTemplate;
024import org.slf4j.Logger;
025
026import java.util.Collections;
027import java.util.List;
028import java.util.Map;
029
030public class KnowledgeNode extends BaseNode {
031
032    private static final Logger logger = org.slf4j.LoggerFactory.getLogger(KnowledgeNode.class);
033
034    private Object knowledgeId;
035    private String keyword;
036    private String limit;
037
038    public Object getKnowledgeId() {
039        return knowledgeId;
040    }
041
042    public void setKnowledgeId(Object knowledgeId) {
043        this.knowledgeId = knowledgeId;
044    }
045
046    public String getKeyword() {
047        return keyword;
048    }
049
050    public void setKeyword(String keyword) {
051        this.keyword = keyword;
052    }
053
054    public String getLimit() {
055        return limit;
056    }
057
058    public void setLimit(String limit) {
059        this.limit = limit;
060    }
061
062    @Override
063    public Map<String, Object> execute(Chain chain) {
064        Map<String, Object> formatParameters = getFormatParameters(chain);
065        String realKeyword = TextTemplate.of(keyword).formatToString(formatParameters);
066        String realLimitString = TextTemplate.of(limit).formatToString(formatParameters);
067        int realLimit = 10;
068        if (StringUtil.hasText(realLimitString)) {
069            try {
070                realLimit = Integer.parseInt(realLimitString);
071            } catch (Exception e) {
072                logger.error(e.toString(), e);
073            }
074        }
075
076        Knowledge knowledge = KnowledgeManager.getInstance().getKnowledge(knowledgeId);
077
078        if (knowledge == null) {
079            return Collections.emptyMap();
080        }
081
082        List<Map<String, Object>> result = knowledge.search(realKeyword, realLimit, this, chain);
083        return Maps.of("documents", result);
084    }
085
086    @Override
087    public String toString() {
088        return "KnowledgeNode{" +
089                "knowledgeId=" + knowledgeId +
090                ", keyword='" + keyword + '\'' +
091                ", limit='" + limit + '\'' +
092                ", parameters=" + parameters +
093                ", outputDefs=" + outputDefs +
094                ", id='" + id + '\'' +
095                ", name='" + name + '\'' +
096                ", description='" + description + '\'' +
097                ", condition=" + condition +
098                ", validator=" + validator +
099                ", loopEnable=" + loopEnable +
100                ", loopIntervalMs=" + loopIntervalMs +
101                ", loopBreakCondition=" + loopBreakCondition +
102                ", maxLoopCount=" + maxLoopCount +
103                ", retryEnable=" + retryEnable +
104                ", resetRetryCountAfterNormal=" + resetRetryCountAfterNormal +
105                ", maxRetryCount=" + maxRetryCount +
106                ", retryIntervalMs=" + retryIntervalMs +
107                ", computeCostExpr='" + computeCostExpr + '\'' +
108                '}';
109    }
110}