langchain4j动态创建agent

SpringBoot-LangChain4j核心源码分析 如果有对当前的aiService定义添加tool工具, 那么会tool工具调用对应的大模型function calling的api, 这样模型会知道何时才会去调用系统内部的工具类.注解用于导入其他的配置类,使得这些配置类中的bean定义可以被当前配置类所在的Spring容器中识别和管理。循环调用ai模型, 根据模型反馈需要调用的工具链并将结果告诉模型, 最后根据模型的response返回最终的执行结果给用户。 根据实际的配置信息构建对应的aiService的bean对象。 阅读详情
package com.kongjs.smo.ai.langchain4j.service;

import com.kongjs.smo.ai.langchain4j.agent.AiAgent;
import com.kongjs.smo.ai.langchain4j.store.PersistentChatMemoryStore;
import com.kongjs.smo.ai.dto.ParamDTO;
import com.kongjs.smo.ai.entity.Agent;
import com.kongjs.smo.ai.entity.KnowledgeBase;
import com.kongjs.smo.ai.service.KnowledgeBaseService;
import com.kongjs.smo.common.mybatis.flex.enums.EnableEnum;
import com.kongjs.smo.common.web.exception.BusinessException;
import com.mybatisflex.core.query.QueryWrapper;
import com.zaxxer.hikari.HikariDataSource;
import dev.langchain4j.agentic.AgenticServices;
import dev.langchain4j.agentic.agent.AgentBuilder;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.embedding.onnx.bgesmallzhv15q.BgeSmallZhV15QuantizedEmbeddingModel;
import dev.langchain4j.model.embedding.request.EmbeddingInputType;
import dev.langchain4j.rag.DefaultRetrievalAugmentor;
import dev.langchain4j.rag.RetrievalAugmentor;
import dev.langchain4j.rag.content.injector.ContentInjector;
import dev.langchain4j.rag.content.injector.DefaultContentInjector;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.rag.query.router.DefaultQueryRouter;
import dev.langchain4j.rag.query.router.QueryRouter;
import dev.langchain4j.rag.query.transformer.CompressingQueryTransformer;
import dev.langchain4j.rag.query.transformer.QueryTransformer;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.pgvector.PgVectorEmbeddingStore;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

@Service
public class AiAgentServiceImpl implements AiAgentService {

    private final Logger logger = LoggerFactory.getLogger("Model");
    @Resource
    private HikariDataSource dataSource;
    @Resource(name = "aiDataSource")
    private HikariDataSource aiDataSource;
    @Resource
    private PersistentChatMemoryStore persistentChatMemoryStore;
    @Resource
    private com.kongjs.smo.ai.service.AgentService agentService;
    @Resource
    private KnowledgeBaseService knowledgeBaseService;
    @Resource
    private AiModelService modelService;

    @Override
    public AiAgent aiAgent(Long agentId, ParamDTO param) {
        Agent agent = agentService.getById(agentId);
        if (agent == null) {
            throw new BusinessException("智能体不存在");
        }
        if (!agent.getStatus().equals(EnableEnum.ENABLE.getCode())) {
            throw new BusinessException("智能体未启用");
        }
        List<KnowledgeBase> knowledgeBases = getKnowledgeBases(param.getKnowledgeBaseIds());
        ChatModel chatModel = modelService.getChatModel(param.getModelId());
        StreamingChatModel streamingChatModel = modelService.getStreamingChatModel(param.getModelId());
        //  https://docs.langchain4j.dev/tutorials/chat-memory#memory-vs-history
        ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder()
                .id(memoryId)
                .maxMessages(50)
                .chatMemoryStore(persistentChatMemoryStore)
                .build();
        AgentBuilder<AiAgent, AgentBuilder<AiAgent, ?>> agentBuilder = AgenticServices.agentBuilder(AiAgent.class);
        if (!CollectionUtils.isEmpty(knowledgeBases)) {
            List<ContentRetriever> contentRetrievers = new ArrayList<>();
            for (KnowledgeBase knowledgeBase : knowledgeBases) {
                // 向量模型
                EmbeddingModel embeddingModel = new BgeSmallZhV15QuantizedEmbeddingModel();
                // 向量存储 https://docs.langchain4j.dev/integrations/embedding-stores/pgvector/
                // 1. **VECTOR(默认)**:仅余弦相似度向量检索
                // 2. **HYBRID**:向量相似度 + PostgreSQL 全文搜索,**RRF 倒数排名融合**多路结果
                EmbeddingStore<TextSegment> embeddingStore = PgVectorEmbeddingStore.datasourceBuilder()
                        .skipCreateVectorExtension(true)
                        .datasource(aiDataSource)
                        .table(knowledgeBase.getCollection())
                        .searchMode(PgVectorEmbeddingStore.SearchMode.VECTOR)
                        .dimension(knowledgeBase.getDimension() == null ? embeddingModel.dimension() : knowledgeBase.getDimension())
                        .build();
                // rag
                ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
                        .embeddingStore(embeddingStore)
                        .embeddingModel(embeddingModel)
                        .embeddingInputType(EmbeddingInputType.QUERY)
                        .maxResults(20)
                        .minScore(0.75)
                        .build();
                contentRetrievers.add(contentRetriever);
            }
            ContentInjector contentInjector = DefaultContentInjector.builder()
                    .metadataKeysToInclude(List.of())
                    .build();
            QueryTransformer queryTransformer = new CompressingQueryTransformer(chatModel);
            QueryRouter queryRouter = new DefaultQueryRouter(contentRetrievers);
            RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder()
                    .queryTransformer(queryTransformer)
                    .contentInjector(contentInjector)
                    .queryRouter(queryRouter)
                    .build();
            agentBuilder.retrievalAugmentor(retrievalAugmentor);
        }
        return agentBuilder
                .name(agent.getAgentName())
                .description(agent.getDescription())
                .systemMessage(agent.getSystemPrompt())
                .userMessage(agent.getUserPrompt())
                .streamingChatModel(streamingChatModel)
                .chatMemoryProvider(chatMemoryProvider)
                .build();
    }

    public List<KnowledgeBase> getKnowledgeBases(List<Long> knowledgeBaseId) {
        if (CollectionUtils.isEmpty(knowledgeBaseId)) {
            return null;
        }
        return knowledgeBaseService.list(QueryWrapper.create()
                .in(KnowledgeBase::getId, knowledgeBaseId)
                .eq(KnowledgeBase::getStatus, EnableEnum.ENABLE.getCode()).limit(5));
    }
}
Java后端转型AI应用开发实战:基于SpringAI与LangChain4j构建RAG与Agent 在当今企业数字化转型浪潮中,AI应用开发已成为构建智能系统的核心能力。其原理在于通过大语言模型(LLM)处理自然语言,并结合检索增强生成(RAG)等技术,将非结构化数据转化为可用的知识。这项技术的价值在于能够为企业打造具备语义理解、自主决策能力的智能应用,例如智能客服、知识库和自动化流程助手。应用场景广泛覆盖金融、电商、医疗等多个行业,用于提升信息检索效率和决策智能化水平。本文聚焦于如何利用SpringAI和LangChain4j两大框架,为Java开发者提供一条清晰的工程化路径,将AI能力无缝集成到熟悉的 阅读详情

相关推荐

Java AI应用开发实战:Spring AI Alibaba与Langchain4j集成指南

如果你是一名Java开发者,最近一定被AI大模型的各种新闻和概念轰炸过。你可能尝试过Python的LangChain,觉得功能强大但生态陌生;或者看过一些Demo,感觉离企业级Java应用很远。一个现实的问题是: 在成熟的Java技术栈里,如何高效、稳定地集成AI能力,而不是为了用AI而重构整个技术体系? 这正是Spring AI、Spring AI Alibaba和Langchain4j要解决的核心痛点。它们不是简单的API封装,而是试图将大模型的“智能”以Spring开发者熟悉的方式——依赖注入、自动配

weixin_33693070的博客 402

LangChain4j知识总结

LangChanin4j知识总结汇总

penngo的专栏 1498

DevoxxGenie:基于Java的IDE插件,连接本地与云端AI模型实现智能编程

在当今的软件开发领域,AI编程助手正逐渐成为提升开发效率的关键工具。其核心原理在于利用大型语言模型(LLM)理解自然语言和代码上下文,通过智能代码补全、解释和生成来辅助开发者。这类工具的技术价值在于将开发者从重复性编码任务中解放出来,使其能更专注于架构设计和复杂问题解决。典型的应用场景包括代码审查、单元测试生成、技术文档编写以及遗留代码重构。本文聚焦的DevoxxGenie,正是一个深度集成此类能力的IntelliJ IDEA插件。它通过**LangChain4J**框架构建了统一的模型交互层,支持无缝切换

weixin_27021789的博客 961

Java团队如何用Spring AI与LangChain4j构建RAG与AI Agent应用

检索增强生成(RAG)和AI智能体(Agent)是当前构建实用AI系统的两大核心架构模式。RAG通过结合外部知识库与大语言模型,解决了模型知识陈旧和私有数据访问的难题,其原理涉及文本嵌入、向量检索与上下文增强生成。AI Agent则基于ReAct等框架,赋予大模型规划与调用工具的能力,使其能执行查询、计算等具体任务。这两种技术的工程价值在于,它们能将大模型的通用能力与特定业务数据和流程无缝对接,从而在智能客服、知识问答、自动化流程等场景中创造实际业务价值。对于Java技术栈而言,Spring AI提供了与S

weixin_34146805的博客 503

Agent Runtime 层的范式革命:从内存状态到事件日志

在大模型智能体(Agent)工程化落地过程中,‘状态管理’与‘执行隔离’是制约长流程、高可靠业务应用的核心瓶颈。传统基于内存缓存或上下文窗口的状态机制,面临上下文爆炸、故障不可追溯、凭证泄露等系统性风险。Anthropic 提出的 session-as-event-log 架构,将 Agent 会话抽象为持久化、可审计、时序化的事件日志,结合 Harness 无状态执行器与 Sandbox 微虚拟化沙箱,实现了 runtime 层的基础设施化。这一演进标志着 Agent 开发正从应用框架层(如 LangCh

dgqvhtlwq472235338的博客 347

【飞控】UAV Toolbox Support Package for PX4 Autopilots安装与配置

安装配置UAV Toolbox Support Package for PX4 Autopilots硬件安装包

m0_58373406的博客 1613

高级java每日一道面试题-2025年8月09日-基础篇[LangChain4j]-如何实现 Agent 的记忆管理?

LangChain4j 中的 Agent 记忆管理采用多层次体系,从临时存储到持久化与智能压缩。核心组件 ChatMemory 通过淘汰策略(基于消息数量或 Token 数)和持久化接口实现多轮对话管理。生产环境中需使用 ChatMemoryProvider 实现多用户隔离,并通过自定义 ChatMemoryStore 接口支持 Redis、MongoDB 等持久化方案。高级功能包括语义压缩技术,当对话超过阈值时自动生成摘要替代原始消息,有效保留关键信息。这种设计平衡了上下文窗口限制与对话连贯性需求,是构建

qq_43071699的博客 1045

AD21导出gerber文件

文件–>制造输出–>Gerber Files 文件–>制造输出–>Gerber Files 通用、光圈和高级跟第一步一样 3.文件–>制造输出–>NC Drill Files 这个默认就可以了 主要参考视频来自bilibili添加链接描述 此篇博客主要是写给自己好记的,无其他商业用途 ...

新手小杨 1万+

SpringBoot AI Agent框架选型:LangChain4j、LiteFlow与Dify实战对比

在构建企业级AI应用时,工作流编排与工具调用是核心挑战。工作流编排涉及将复杂任务分解为有序或并行的执行步骤,确保数据流与控制流的正确传递,这对于实现自动化业务流程至关重要。工具调用则允许AI模型安全、可靠地执行外部操作,如查询数据库或调用API,是AI Agent具备实际生产力的关键。这些技术的价值在于能将大语言模型的认知能力与现有业务系统无缝衔接,实现智能决策与自动化执行。在SpringBoot生态中,开发者常面临如何将AI能力深度集成到微服务架构的挑战。本文聚焦于LangChain4j、Spring A

weixin_34013044的博客 319

2024年数字IC秋招-格科微-数字电路设计工程师-笔试题

笔试题型:简答题(9个)笔试平台:牛客(电脑监控)笔试时间:2h。

qq_42135020的博客 1605

游戏大厂如何解析引擎技术

本文系统解析了游戏大厂如何评估和定制游戏引擎。游戏引擎作为游戏开发的核心基础,大厂会从性能、跨平台支持、渲染能力、网络模块等8个维度进行技术解析,通过文档查勘、源码阅读、Demo测试等7个步骤深度评估。解析后通常有三种决策:直接使用、深度定制或自研重构。文章以腾讯、网易、米哈游等为例,展示了不同厂商的引擎定制策略,并分析了技术解析面临的挑战和未来趋势。最终指出,体系化的引擎技术解析是打造高质量游戏的关键,需要持续的技术投入和团队协作。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 535

LangChain4j桥接层设计:构建Java Agent框架的工程实践

在AI应用开发中,大型语言模型(LLM)与业务系统的集成是关键挑战。其核心原理在于通过标准化接口抽象模型能力,实现技术解耦。这一过程的技术价值在于提升系统可维护性和扩展性,尤其在微服务架构中至关重要。应用场景广泛覆盖智能客服、自动化流程等需要自主决策的领域。本文聚焦于Java生态,探讨如何通过桥接层设计解决LangChain4j与Spring Boot的集成难题,实现工具自动发现和会话持久化,从而构建稳健的Agent框架。

weixin_33800463的博客 388

KEPServerEX作为MQTT客户端

打开软件: 测试没有连接上MQTT代理。

低码开发 1681

高级java每日一道面试题-2025年9月19日-数据处理篇[LangChain4j]-如何设计多租户架构?

本文深入探讨了LangChain4j多租户架构设计的关键要点。多租户架构需要实现数据、配置、资源、计费和安全的全面隔离,同时保证可扩展性和低成本。文章分析了三种主流实现模式(数据库级隔离、行级隔离和混合模式),并详细阐述了五大隔离维度的具体实施方案。重点介绍了LangChain4j核心组件的多租户设计方法,包括聊天记忆、向量存储、聊天模型等。此外,还提出了数据隔离与访问控制体系、性能优化方案以及应对架构挑战的解决方案。最终目标是构建安全、隔离、可扩展且低成本的SaaS化LLM应用系统。

qq_43071699的博客 992

提示词工程中的上下文隔离

已经进入context的prompt是没有办法让大模型真正的忘记的,但是可以通过prompt技巧强约束模型的后续推理中“不再使用、不再提及、不再引用”某部分提示词,这其实是一种行为抑制(behavior suppression),并不是删除。

Criss@陈磊 234

基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台

电动汽车的动力总成(Powertrain)是车辆的核心系统,包括动力电池、电机控制器、逆变器和驱动电机等关键部件。动力总成的控制策略直接影响车辆的动力性能、能耗效率和驾驶体验。为了验证和优化这些控制策略,基于MATLAB/Simulink的仿真平台成为一种高效且经济的解决方案。本项目旨在构建一个完整的基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台,涵盖控制策略建模、性能评估以及参数标定等功能模块,并通过仿真验证系统的有效性。

xiaoheshang_123的博客 177

基于LangChain4j与LangGraph4j的Java智能体工作流平台实战

低代码智能体平台日益流行,但Java团队在对接企业内部系统时,常因Python技术栈隔离而面临集成与运维难题。理解Agent工作流的核心,在于把模型调用、工具执行与业务逻辑编排成清晰可控的状态图。LangChain4j以统一抽象屏蔽模型供应商差异,LangGraph4j则用原生图结构管理分支与循环,两者结合为Java生态提供了一套贴合工程实践的智能体编排方案。从工作流DSL设计到State状态管理,再到多Agent协作与人工审批,这套技术栈能帮助团队快速搭建可复用的低代码平台,在保持技术栈统一的同时,实现A

weixin_42530570的博客 335

改进的主动轮廓模型实现图像分割

主动轮廓模型的优点在于可以自适应地调整轮廓形状和位置,适用于不同形状和大小的目标分割。改进的主动轮廓模型是一种有效的图像分割方法,能够适应不同场景下的图像分割需求。改进的主动轮廓模型涉及到许多参数,如模型参数、分割参数、权值系数等,这些参数的调整也会直接影响到分割结果。本文将介绍一个改进的主动轮廓模型,该模型可以实现对图像进行有效的分割。改进的主动轮廓模型是在传统的主动轮廓模型基础上进行的改进。和传统的模型相比,改进的主动轮廓模型加入了外部力和内部力,能够更好地适应复杂场景下的图像分割。

qq_39605374的博客 294

LangChain4j桥接层设计:解耦AI框架与业务系统的工程实践

在AI应用开发中,框架与业务系统的集成常面临技术栈耦合与逻辑错配的挑战。依赖倒置原则和关注点分离是解决这类问题的核心设计思想,通过引入中间层实现技术解耦。桥接层作为AI能力中间件,向上提供稳定的领域API,向下封装框架实现,有效管理模型生命周期、适配业务工具并集成可观测性。这种模式在Java生态的AI工程实践中尤为重要,能显著提升系统可维护性和技术选型灵活性。本文以LangChain4j为例,探讨如何通过桥接层设计解决框架直接集成带来的版本升级、业务逻辑失配和监控治理等实际问题,为构建稳健的AI应用提供可落

368

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

2. LangChain 进阶

本文基于 LangChain4j 实战项目,手把手讲解 Chat API 的两种调用方式:直接调用 ChatModel 与 AiServices 代理模式。涵盖依赖配置、Bean 工厂、动态代理原理,并深入进阶配置:日志调试、自定义监听器、超时控制与失败重试。每段代码逐行解释,附类比说明与 FAQ,适合零基础 Java 开发者快速上手 LangChain4j。所有代码已测试通过,源码开源在 Gitee,欢迎交流!

qq_15720875的博客 480

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LangChain4j+LangGraph4j构建Java低代码智能体平台:工作流编排与落地实践

低代码工作流编排正在成为企业将大模型落地为智能体应用的关键桥梁。其核心思想是将业务流程抽象为一张可执行的状态图,节点承载模型调用、工具执行或规则判断,边定义状态转移路径,配合全局状态实现灵活可控的流程调度。在Java技术栈中,LangChain4j负责模型交互与工具绑定,LangGraph4j提供图执行引擎,二者结合天然构成了智能体运行时底座。这样的设计让业务人员能通过拖拽配置生成可运行的工作流,从而落地智能客服、自动报表分析、动态业务规则等场景。基于LangChain4j与LangGraph4j构建的低代

weixin_29045585的博客 235

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

从AI Agent到共情编程助手:构建理解开发者意图的智能工具

在软件开发领域,AI编程助手正从简单的代码补全工具演变为能够理解开发者意图的智能伙伴。这一转变的核心在于AI Agent技术,它通过大型语言模型(LLM)作为大脑,结合记忆、规划和工具调用等组件,构建出能够感知环境、理解目标并自主执行任务的系统。Prompt工程是实现这一能力的关键,通过精心设计的系统提示词、思维链和少样本学习,引导LLM从文本生成器转变为任务规划者。这种技术架构的价值在于能够处理非结构化、带有情绪的自然语言输入,将模糊的需求转化为具体的技术方案,从而改变开发者解决问题的思维方式。在实际应用

weixin_34268843的博客 321

【AI Agent】2026年9月 AI Agent 全栈开发最新技术面试宝典(含高频+必背+大厂真题)

本文整理了2026年AI Agent全栈开发最新技术面试题,涵盖基础概念、核心框架和系统设计等关键领域。重点解析了AI Agent与普通Chatbot的本质区别(自主闭环执行能力)、Agentic Loop的完整工作流程(规划-执行-观察-评估循环),以及ReAct范式的原理与适用场景。特别强调面试回答技巧:需结合工程实践中的典型问题、处理方案和量化指标,而非简单背诵定义。内容来自字节、阿里等大厂真实面经,适合3-5年经验开发者准备春招面试,突出考察候选人在复杂场景下的技术决策能力。

小江的记录本 4618

大模型应用开发--Agent笔记1(定义,ReAct、Plan-and-execute范式,Coze、Dify低代码平台,LangChain、LlamaIndex、AutoGen框架,评估,含代码)

本文基于datawhale的Hello-Agents开源项目及其他大模型开发资料整理而成。内容分为四个部分: 智能体基础概念、智能体构建范式、智能体框架比较和智能体性能评估。笔记重点分析了不同范式的优缺点,并通过实际代码示例展示了各框架的具体实现方式。作者将持续更新学习内容,深入探索智能体开发的实践应用。

zhuai.blog.youkuaiyun.com 2011

Java工程师的AI Agent工程化实战指南

AI Agent并非全新技术概念,而是智能体(Agent)在软件工程中的范式演进,其核心原理是基于LLM的意图识别、工具调度与记忆管理。对Java开发者而言,技术价值不在于重学Python生态,而在于将Spring Boot成熟的工程能力——如Bean生命周期管理、Retry重试机制、Actuator可观测性、依赖注入与事务治理——无缝迁移到Agent架构中。典型应用场景包括智能客服路由、订单异常诊断、自动化运维决策等需结合业务逻辑与外部API调用的领域。本文聚焦Java生态下的Agent工程化落地,深入解

weixin_28339967的博客 213

AI工具调用技术:拓展智能边界与实战应用

工具调用(Tool Calling)是AI应用开发中的关键技术,它通过请求-执行-反馈的协作模式,使AI系统能够安全地访问外部资源和能力。这项技术的核心原理是将AI的意图识别能力与外部工具的执行能力相结合,既扩展了AI的功能边界,又保证了系统安全性。在工程实践中,工具调用常用于实时数据获取、系统集成、复杂计算等场景,如通过Jsoup实现网页数据抓取,或使用LangChain4j框架标准化工具接口。通过合理设计工具描述和参数规范,开发者可以构建出高效可靠的AI工具链,显著提升智能应用的实用价值。

weixin_33675507的博客 358
上一篇: langchain4j动态创建助手代码
下一篇: 登录使用rsa加密
Tirzano
博客等级 码龄9年 108粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值