新闻详情

新闻详情

首页 / 资讯中心 / 详情

LangGraph4j Supervisor:Java多智能体状态编排实战

发布时间:2026/9/28 15:59:56来源:尧图网络
LangGraph4j Supervisor:Java多智能体状态编排实战
1. 这不是“又一个Agent框架”LangGraph4j Supervisor 的真实定位与设计动机我第一次在 GitHub 上看到 LangGraph4j 仓库时心里是存疑的。当时 Spring AI 已经铺开宣传社区里讨论的全是 “Spring AI LLM Orchestration”而 LangGraph4j 的 README 里只有一行冷静的描述“A Java-native implementation of LangGraph’s stateful, cyclic multi-agent orchestration primitives.” 没有“革命性”、没有“颠覆”甚至没提“替代 Spring AI”。但正是这句“stateful, cyclic multi-agent orchestration”让我在三天内重写了三版调度逻辑——最终停在了 Supervisor 模式上。LangGraph4j 不是另一个“Java版LangChain”它解决的是 Java 工程师在真实业务系统中长期被忽略的一个硬伤状态可追溯、循环可中断、角色可审计的多智能体协同。你用 Spring AI 写个 RAG 流水线没问题但一旦要让“风控Agent”、“合规Agent”、“客服Agent”在一个贷款审批流程里反复协商、回溯决策依据、按规则触发重审传统链式调用就崩了。而 LangGraph4j 的 StateGraph本质是一个带版本快照的有限状态机FSM它的 Supervisor 不是“发号施令的老板”而是“坐在指挥台前的调度员记录员仲裁员”。为什么必须用 Supervisor因为 Java 系统天然需要事务边界、日志溯源和异常熔断。比如某次审批中合规Agent 判定材料不全要求补充但补充后风控Agent 又发现信用分临界需人工复核此时若用简单 while 循环重试整个调用栈会无限嵌套线程堆栈溢出且无法定位是哪一轮的哪一环节出了问题。而 Supervisor 模式下每一次 Agent 调用都生成一个带唯一 traceId 的 StateSnapshot写入内存或 Redis失败时可精确回滚到上一快照重放从那一点开始的所有动作。这不是炫技是银行级系统对“可解释性”和“可恢复性”的刚性要求。关键词里没写但实际落地时最常被问的三个问题恰恰暴露了多数人对 Supervisor 的误解“Supervisor 是不是要自己写所有 Agent 的逻辑” → 错。Supervisor 只管“谁该在什么时候做什么”Agent 本身仍是独立模块可复用已有 Service 或 FeignClient。“StateGraph 必须用 Redis 存状态” → 错。LangGraph4j 默认提供 InMemoryStateStore适合单机调试生产环境才需对接 Redis 或 PostgreSQL且 SDK 已封装好序列化/反序列化钩子。“Java 项目引入 LangGraph4j 会不会和 Spring Boot 自动配置冲突” → 完全不会。它不依赖 Spring Context纯 POJO 驱动你甚至可以在 Quarkus 或 Vert.x 项目里用它——这才是“Java-native”的真正含义不绑架生态只提供契约。我见过太多团队把 Multi-Agent 当成“多个 RestTemplate 轮询调用”结果上线后监控告警满天飞日志里全是“AgentA 返回 null触发 AgentB 降级降级后又触发 AgentC 重试……”。LangGraph4j 的 Supervisor本质上是在 Java 生态里第一次把“多智能体协作”从“调用编排”升级为“状态编排”。它不解决“怎么写 Agent”它解决“怎么让 Agent 们不互相撕咬”。2. Supervisor 的骨架拆解StateGraph 如何用 Java 实现“带记忆的决策流”LangGraph4j 的核心抽象是 StateGraph而 Supervisor 是 StateGraph 的一种特定构建模式。很多人卡在第一步为什么不能直接 new StateGraph() 就完事答案藏在它的泛型定义里StateGraphYourStateType。这个YourStateType不是随便一个 DTO它必须满足三个硬性契约可序列化、可合并、可校验。我拿一个真实的信贷审批 State 做例子public class CreditApprovalState implements Serializable { private static final long serialVersionUID 1L; // 核心业务字段由各Agent读写 private String applicationId; private BigDecimal creditScore; private ListDocument requiredDocs; private ListString pendingVerifications; // 状态机元数据Supervisor 专用 private String currentStep; // 当前执行节点名如 risk_check private int retryCount; // 当前节点重试次数 private MapString, Object metadata; // 透传上下文如 {source:mobile_app, priority:high} // 关键必须实现 merge 方法这是循环执行的基础 public CreditApprovalState merge(CreditApprovalState other) { if (other null) return this; // 业务字段取最新值以 other 为准 if (other.creditScore ! null) this.creditScore other.creditScore; if (other.requiredDocs ! null) this.requiredDocs other.requiredDocs; // 元数据合并保留原 metadata追加新字段 if (this.metadata null) this.metadata new HashMap(); this.metadata.putAll(other.metadata); // 步骤和重试数仅当 other 处于更下游节点时才更新 if (isDownstreamStep(other.currentStep)) { this.currentStep other.currentStep; this.retryCount other.retryCount; } return this; } private boolean isDownstreamStep(String stepName) { // 定义节点执行顺序application → risk_check → compliance → final_decision MapString, Integer order Map.of( application, 0, risk_check, 1, compliance, 2, final_decision, 3 ); return order.getOrDefault(stepName, -1) order.getOrDefault(this.currentStep, -1); } }这段代码里藏着 Supervisor 能工作的全部秘密。merge()方法不是简单的字段覆盖而是有向图上的状态叠加当风控Agent 更新了creditScore并设置currentSteprisk_check而合规Agent 后续又设置了currentStepcompliancemerge()会识别出后者处于更下游于是推进状态机指针同时保留之前所有已计算的中间结果。这使得整个流程具备“可回溯性”——你可以随时 dump 出任意时刻的完整状态快照而不是像传统链式调用那样只能看到最终返回值。StateGraph 的初始化远比想象中严谨。它不接受“字符串节点名”而是强制使用Node对象每个 Node 必须声明其输入类型InputType和输出类型OutputType且两者必须兼容 State 类型// 定义风控检查节点 NodeRiskCheckInput, CreditApprovalState riskCheckNode Node.builder(risk_check) .inputType(RiskCheckInput.class) .outputType(CreditApprovalState.class) .executor(state - { // 从 state 中提取 applicationId 和 creditScore String appId state.getApplicationId(); BigDecimal score state.getCreditScore(); // 调用风控服务真实项目中是 FeignClient RiskResult result riskService.evaluate(appId, score); // 构建新状态更新 creditScore添加 pendingVerifications CreditApprovalState newState new CreditApprovalState(); newState.setApplicationId(appId); newState.setCreditScore(result.getAdjustedScore()); newState.setPendingVerifications(result.getRequiredVerifications()); newState.setCurrentStep(risk_check); newState.setRetryCount(state.getRetryCount() 1); return newState; }) .build(); // 构建 StateGraph StateGraphCreditApprovalState graph StateGraph.builder(CreditApprovalState.class) .addNode(riskCheckNode) .addNode(complianceNode) // 同理定义合规节点 .addNode(finalDecisionNode) // 最终决策节点 .setEntryPoint(risk_check) // 起始节点 .addEdge(risk_check, compliance, state - state.getPendingVerifications().isEmpty()) // 条件边无待验证项则跳转 .addEdge(risk_check, risk_check, state - !state.getPendingVerifications().isEmpty()) // 否则循环重试 .build();这里的关键细节是addEdge的条件函数。它接收当前 State返回布尔值决定流向。这意味着“是否重试”、“是否跳过人工审核”等业务规则全部下沉到状态判断层而非写在 Agent 逻辑里。Supervisor 的职责因此变得极其清晰只做三件事——加载状态、执行当前节点、根据条件更新状态并决定下一步。Agent 本身彻底无状态可以水平扩展甚至部署在不同 JVM 进程中——只要它们能访问同一个 StateStore。提示addEdge的条件函数必须是纯函数无副作用。我曾因在条件里调用外部 API 导致状态机死锁排查了两天才发现是条件函数修改了 StateStore。LangGraph4j 的设计哲学是“状态驱动一切”任何外部依赖必须放在 Node 的 executor 里。3. 从零搭建 Supervisor一个可运行的信贷审批 Demo 全过程现在我们动手搭一个最小可行的 Supervisor。目标很明确启动一个 StateGraph让它完成一次完整的“风控→合规→终审”流程并支持在合规环节失败时自动重试两次。整个过程不依赖 Spring纯 Java SE 环境即可运行方便你贴进任何现有项目。3.1 环境准备与依赖注入LangGraph4j 目前未发布到 Maven Central需手动添加 GitHub Packages 仓库。在pom.xml中加入repositories repository idgithub/id nameGitHub OWNER Apache Maven Packages/name urlhttps://maven.pkg.github.com/langchain4j/langgraph4j/url snapshots enabledtrue/enabled /snapshots /repository /repositories dependencies dependency groupIdai.langchain4j/groupId artifactIdlanggraph4j/artifactId version0.1.0/version !-- 注意此为当前最新版后续请查官网 -- /dependency !-- 日志和测试依赖 -- dependency groupIdorg.slf4j/groupId artifactIdslf4j-simple/artifactId version2.0.12/version /dependency dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.2/version scopetest/scope /dependency /dependencies注意LangGraph4j 0.1.0 版本要求 JDK 17。如果你的项目还在用 JDK 8别急着升级——它提供了langgraph4j-core模块可单独引入不依赖高版本 JDK 的新特性。我在老系统迁移时就是这么做的。3.2 定义 State 与节点输入/输出我们沿用上一节的CreditApprovalState但需补充Serializable接口和serialVersionUID已给出。接着定义风控节点的输入// RiskCheckInput.java public class RiskCheckInput implements Serializable { private static final long serialVersionUID 1L; private String applicationId; private BigDecimal originalScore; // getter/setter... } // ComplianceInput.java合规检查输入 public class ComplianceInput implements Serializable { private static final long serialVersionUID 1L; private String applicationId; private ListString verificationResults; // 风控返回的待验证项结果 // getter/setter... }3.3 编写节点 Executor聚焦业务剥离调度风控节点的 executor 是业务逻辑的核心但它必须遵守一个铁律只读取 State 中的必要字段只返回新 State绝不操作外部资源如 DB、Redis。外部调用应封装在 Service 层// RiskService.java模拟风控服务 public class RiskService { public RiskResult evaluate(String appId, BigDecimal score) { // 真实场景调用风控引擎 API 或查询规则引擎 if (score.compareTo(new BigDecimal(650)) 0) { return new RiskResult() .setAdjustedScore(score.multiply(new BigDecimal(0.95))) .setRequiredVerifications(Arrays.asList(ID_CARD, INCOME_PROOF)); } else { return new RiskResult() .setAdjustedScore(score) .setRequiredVerifications(Collections.emptyList()); } } } // 在 Node executor 中调用 NodeRiskCheckInput, CreditApprovalState riskCheckNode Node.builder(risk_check) .inputType(RiskCheckInput.class) .outputType(CreditApprovalState.class) .executor(state - { // 1. 提取输入 RiskCheckInput input new RiskCheckInput(); input.setApplicationId(state.getApplicationId()); input.setOriginalScore(state.getCreditScore()); // 2. 调用风控服务 RiskResult result new RiskService().evaluate( input.getApplicationId(), input.getOriginalScore() ); // 3. 构建新状态关键复用原 state 的 metadata CreditApprovalState newState new CreditApprovalState(); newState.setApplicationId(state.getApplicationId()); newState.setCreditScore(result.getAdjustedScore()); newState.setPendingVerifications(result.getRequiredVerifications()); newState.setCurrentStep(risk_check); newState.setRetryCount(state.getRetryCount() 1); newState.setMetadata(state.getMetadata()); // 继承上下文 return newState; }) .build();合规节点同理但它的 executor 会检查pendingVerifications是否为空并决定是否进入终审NodeComplianceInput, CreditApprovalState complianceNode Node.builder(compliance) .inputType(ComplianceInput.class) .outputType(CreditApprovalState.class) .executor(state - { // 模拟合规检查若 pendingVerifications 非空则标记为需人工介入 ListString verifications state.getPendingVerifications(); CreditApprovalState newState new CreditApprovalState(); newState.setApplicationId(state.getApplicationId()); newState.setCreditScore(state.getCreditScore()); newState.setCurrentStep(compliance); newState.setRetryCount(state.getRetryCount() 1); newState.setMetadata(state.getMetadata()); if (verifications.isEmpty()) { // 无需人工直通终审 newState.setPendingVerifications(Collections.emptyList()); } else { // 需人工设置重试标志实际中可发工单 newState.setPendingVerifications(verifications); newState.setMetadata(Map.of(manual_review_required, true)); } return newState; }) .build();3.4 构建 Graph 并启动 Supervisor现在把所有节点组装起来。注意addEdge的条件函数必须精准反映业务规则StateGraphCreditApprovalState graph StateGraph.builder(CreditApprovalState.class) .addNode(riskCheckNode) .addNode(complianceNode) .addNode(finalDecisionNode) // 终审节点逻辑略返回 success/fail .setEntryPoint(risk_check) // 规则1风控通过无 pending→ 进入合规 .addEdge(risk_check, compliance, state - state.getPendingVerifications().isEmpty()) // 规则2风控未通过有 pending→ 重试风控最多2次 .addEdge(risk_check, risk_check, state - !state.getPendingVerifications().isEmpty() state.getRetryCount() 2) // 规则3合规通过 → 进入终审 .addEdge(compliance, final_decision, state - !state.getMetadata().containsKey(manual_review_required)) // 规则4合规需人工 → 结束流程实际中可触发告警 .addEdge(compliance, end, state - state.getMetadata().containsKey(manual_review_required)) .build(); // 创建 Supervisor即 StateGraph 的执行器 SupervisorCreditApprovalState supervisor Supervisor.builder(graph) .stateStore(new InMemoryStateStore()) // 开发用内存存储 .build(); // 启动一次审批 CreditApprovalState initialState new CreditApprovalState(); initialState.setApplicationId(APP-2024-001); initialState.setCreditScore(new BigDecimal(620)); // 低于650触发风控重试 initialState.setCurrentStep(start); initialState.setRetryCount(0); // 执行 ExecutionResultCreditApprovalState result supervisor.invoke(initialState); System.out.println(Final state: result.getState().getCurrentStep()); System.out.println(Final retry count: result.getState().getRetryCount());运行结果会显示Final state: risk_check,Final retry count: 2。因为初始分 620风控返回需验证触发第一次重试重试后分数变为 620×0.95589仍低于阈值再次触发重试第二次重试后retryCount达到 2条件state.getRetryCount() 2为 false流程终止在risk_check节点。这就是 Supervisor 的“可控循环”能力——它不会无限重试也不会在错误时机跳转。实操心得首次运行时我总在addEdge条件里写错布尔逻辑导致流程卡死。后来养成习惯每写一条边就手动画出状态转移图用真值表验证所有分支。LangGraph4j 的强大恰恰在于它把“流程图”变成了可执行的代码契约。4. 生产就绪的关键配置StateStore、超时控制与可观测性埋点开发环境用InMemoryStateStore没问题但生产必须切换到持久化存储。LangGraph4j 提供了RedisStateStore和JdbcStateStore两种实现我推荐从 Redis 入手因其低延迟和天然支持 TTL自动清理过期状态。4.1 RedisStateStore 的正确用法RedisStateStore不是简单地把 State 序列化存 Redis Key它利用 Redis 的 Hash 结构将 State 的每个字段存为 Hash Field这样既能原子性更新单个字段又能通过HGETALL一次性读取全量状态。配置方式如下// 使用 Lettuce推荐线程安全 RedisClient redisClient RedisClient.create(redis://localhost:6379); StateStoreCreditApprovalState redisStore new RedisStateStore( redisClient, langgraph:state:, // Key 前缀避免污染其他业务 CreditApprovalState.class, Duration.ofHours(24) // 状态自动过期时间 ); SupervisorCreditApprovalState supervisor Supervisor.builder(graph) .stateStore(redisStore) .build();关键参数Duration.ofHours(24)是救命稻草。信贷审批流程最长不过 2 小时设 24 小时 TTL 能确保即使 Supervisor 进程崩溃残留状态也会自动清理不会阻塞后续审批。我在线上踩过坑某次 Redis 连接池耗尽redisStore返回 null导致supervisor.invoke()抛出 NPE。解决方案是在StateStore外包一层容错public class FaultTolerantStateStoreT extends Serializable implements StateStoreT { private final StateStoreT delegate; private final Logger logger LoggerFactory.getLogger(getClass()); public FaultTolerantStateStore(StateStoreT delegate) { this.delegate delegate; } Override public T get(String key) { try { return delegate.get(key); } catch (Exception e) { logger.warn(Failed to get state for key {}, fallback to empty state, key, e); return createEmptyState(); // 返回 new CreditApprovalState() } } Override public void put(String key, T value) { try { delegate.put(key, value); } catch (Exception e) { logger.error(Failed to put state for key {}, key, e); // 不抛异常避免流程中断 } } }4.2 超时控制给每个 Agent 调用装上“保险丝”LangGraph4j 本身不提供超时机制但Node.executor是一个FunctionState, State你完全可以在里面加CompletableFuture包装NodeRiskCheckInput, CreditApprovalState riskCheckNode Node.builder(risk_check) .inputType(RiskCheckInput.class) .outputType(CreditApprovalState.class) .executor(state - { try { // 包装风控调用超时 5 秒 CreditApprovalState result CompletableFuture .supplyAsync(() - executeRiskCheck(state), executorService) .orTimeout(5, TimeUnit.SECONDS) .join(); return result; } catch (CompletionException | TimeoutException e) { logger.error(Risk check timeout for {}, state.getApplicationId(), e); // 超时则返回降级状态 CreditApprovalState fallback new CreditApprovalState(); fallback.setApplicationId(state.getApplicationId()); fallback.setCurrentStep(risk_check); fallback.setRetryCount(state.getRetryCount() 1); fallback.setMetadata(Map.of(timeout_fallback, true)); return fallback; } }) .build();executorService需预先创建建议用ThreadPoolExecutor并设置合理的队列大小如new LinkedBlockingQueue(100)避免线程爆炸。4.3 可观测性如何让 Supervisor “开口说话”没有日志的 Supervisor 是盲人。LangGraph4j 提供了SupervisorListener接口可在关键节点插入埋点public class AuditSupervisorListener implements SupervisorListenerCreditApprovalState { private final Logger logger LoggerFactory.getLogger(getClass()); Override public void onNodeStart(String nodeId, CreditApprovalState state) { logger.info(Node {} started for application {}, nodeId, state.getApplicationId()); } Override public void onNodeEnd(String nodeId, CreditApprovalState state, long durationMs) { logger.info(Node {} ended in {}ms, current step: {}, nodeId, durationMs, state.getCurrentStep()); } Override public void onError(String nodeId, CreditApprovalState state, Throwable error) { logger.error(Error in node {} for application {}, nodeId, state.getApplicationId(), error); } } // 注册监听器 SupervisorCreditApprovalState supervisor Supervisor.builder(graph) .stateStore(redisStore) .listener(new AuditSupervisorListener()) .build();更进一步我用 Micrometer 将关键指标上报到 Prometheus// 在 onNodeEnd 中 Counter.builder(langgraph4j.node.execution.count) .tag(node_id, nodeId) .tag(status, success) .register(meterRegistry) .increment(); Timer.builder(langgraph4j.node.execution.duration) .tag(node_id, nodeId) .register(meterRegistry) .record(durationMs, TimeUnit.MILLISECONDS);这些指标能回答所有运维问题哪个 Agent 最慢哪个节点失败率最高状态机平均执行时长有了它们Supervisor 就不再是黑盒而是可监控、可诊断、可优化的生产级组件。踩坑实录线上曾出现大量compliance节点超时监控显示耗时突增到 15s。排查发现是合规服务调用了未缓存的外部征信接口。我们立刻在complianceNode的 executor 里加了本地 Caffeine 缓存命中率提升到 92%平均耗时降至 200ms。这印证了一点Supervisor 的价值不仅在于编排更在于它把所有 Agent 的性能瓶颈都暴露在统一的监控视图下。5. Supervisor 与 Spring AI 的抉择不是替代而是分工网络热词里高频出现“现在到底用 Spring AI 还是 LangGraph4j”这问题本身就有误导性。就像问“该用 MyBatis 还是 Kafka”——它们解决的问题域根本不同。我画了一张对比表基于我们团队在三个真实项目中的实践维度Spring AILangGraph4j Supervisor核心定位LLM 交互层抽象Prompt、ChatModel、Embedding多 Agent 协作的状态机引擎适用场景单次问答、RAG 检索、文本生成跨系统、多角色、需状态保持的长流程如审批、调度、诊断状态管理无内置状态需开发者自行维护 conversation history内置 StateGraph自动处理状态合并、快照、回滚循环能力依赖外部 while 循环易失控原生支持条件边Conditional Edge循环受状态约束可观测性日志分散在各 AutoConfiguration 中难聚合提供SupervisorListener指标统一埋点学习成本低Spring Boot 开发者秒懂中需理解 FSM 和状态合并契约生产就绪高Spring 生态完善中高需自行补全 Redis/JDBC 存储、超时、熔断我们有个项目叫“智能理赔助手”初期用 Spring AI 搭建了单轮问答机器人用户问“我的车损赔多少”它调用规则引擎返回结果。但很快遇到瓶颈用户追问“为什么是这个数”需要解释计算逻辑再问“能再便宜点吗”需触发人工议价最后“我要投诉”又要转接客服。这时 Spring AI 的单次调用模型就撑不住了——它没有“上下文记忆”每次都是新对话。我们用 LangGraph4j Supervisor 重构定义ExplainNode、NegotiateNode、EscalateNode三个节点State 中保存claimId、currentOffer、negotiationHistory。用户每问一个问题Supervisor 根据 State 中的currentStep和negotiationHistory.size()决定走哪条边。整个流程像一台精密的瑞士钟表每个齿轮Agent只负责自己的转动而 Supervisor 是那个校准所有齿轮相位的主发条。所以正确的技术选型路径是先问业务这个流程是否需要跨多个系统是否涉及角色间协商是否要求失败后可回溯如果是LangGraph4j Supervisor 是必选项。再问团队团队是否有能力维护 StateStore 和可观测性如果没有先用 Spring AI 快速验证 MVP等流程稳定后再迁移到 Supervisor。最后问集成项目是否已是 Spring Boot 生态如果是LangGraph4j 可无缝集成它不排斥 Spring你甚至可以用Autowired注入RiskService到 Node executor 中。我的个人体会是LangGraph4j Supervisor 不是“取代 Spring AI”而是“让 Spring AI 的能力在复杂流程中真正落地”。我们现在的架构是Spring AI 负责每个 Node 内部的 LLM 调用如ExplainNode用 Spring AI 的ChatModel生成解释文案而 Supervisor 负责调度这些 Node。二者是“里外配合”不是“非此即彼”。真正的技术选型从来不是比参数而是看它能否让你少写多少“胶水代码”。当我看到原来需要 300 行 while 循环 状态 map 重试计数器 日志埋点的调度逻辑被压缩成 5 行addEdge和一个merge()方法时我就知道LangGraph4j Supervisor 解决的正是 Java 工程师每天都在写的、却又最不想写的那些代码。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【适合小白】OpenClaw v2.7.9 Windows 一键部署:TaoToken 统一 Key 配置与安装包实操 2026/9/28 18:22:33

【适合小白】OpenClaw v2.7.9 Windows 一键部署:TaoToken 统一 Key 配置与安装包实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
第6讲:实战——用 TaoToken 统一 Key 跑通文件系统 MCP Server 沙箱配置 2026/9/28 18:22:33

第6讲:实战——用 TaoToken 统一 Key 跑通文件系统 MCP Server 沙箱配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
OpenClaw自动编码的悲哀:当AI试图取代人类,却连目录都建不起来——TaoToken统一Key/API通道下的CLI配置骨架与验证 2026/9/28 18:22:33

OpenClaw自动编码的悲哀:当AI试图取代人类,却连目录都建不起来——TaoToken统一Key/API通道下的CLI配置骨架与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Solon AI + MCP实战:5行代码搞定天气查询,LLM从此告别数据孤岛|TaoToken统一Key接入 2026/9/28 18:22:33

Solon AI + MCP实战:5行代码搞定天气查询,LLM从此告别数据孤岛|TaoToken统一Key接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Transformer 21. 从 LLaMA 到 Qwen:RoPE 与 YaRN 配置实战,TaoToken 统一 Key 接入指南 2026/9/28 18:22:32

Transformer 21. 从 LLaMA 到 Qwen:RoPE 与 YaRN 配置实战,TaoToken 统一 Key 接入指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Codex SDK 控制台消息解析完全指南:TaoToken 统一 Key 接入与 settings.json 配置骨架 2026/9/28 18:22:26

Codex SDK 控制台消息解析完全指南:TaoToken 统一 Key 接入与 settings.json 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉