维基框架 (Wiki Framework) 1.1.0 版本发布 提供多模型AI辅助开发

介绍

多模型AI辅助开发

维基框架1.1.0集成了主流AI引擎的统一接口,支持开发者按需调用不同模型的优势能力:

  • DeepSeek​:专注代码生成与重构,擅长复杂业务逻辑实现

  • ChatGPT​:多模态推理能力,适用于系统架构设计

  • Grok​:实时数据分析,优化生产环境问题诊断

  • DouBao​:中文语义深度理解,提升本土化文档质量

  • Qwen3 ​:强化数学推理,专精财务/统计模块开发,支持在线搜索功能

通过智能路由机制,系统根据代码特征自动选择最佳模型(可手动配置)。开发者可同时使用多个模型协同工作,例如用DeepSeek生成代码,Qwen3验证事务,DouBao编写文档。

使用

运行环境要求

最低JDK版本:17+(1.0.7及更早版本支持Java 8)

统一接口架构

java 复制代码
  public static void main(String[] args) {
    CdkjApplication.run(AiApplication.class, args);
    QwenConfig config = new QwenConfig();
    config.setApiKey("sk-xxxx");
    QwenService chatService = (QwenService) AiUtils.findAiService(config);
    System.out.printf("AI回复" + chatService.chat("你好,请介绍一下你呢。"));

    config.setModel(Qwen.QWEN_VL_MAX_LATEST.getModel());
    QwenService service = AiUtils.findAiService(config, QwenService.class);
    System.out.printf("AI回复" + service.chatVision(List.of("介绍这个图片。"), List.of("https://framewiki.com/logo.png")));
  }

依赖引入

XML 复制代码
<dependency>
  <groupId>com.framewiki</groupId>
  <artifactId>wiki-all</artifactId>
  <version>1.1.0</version>
</dependency>

模块介绍

模块目录

配置读取

java 复制代码
package com.cdkjframework.ai.model.qwen;

import com.cdkjframework.ai.core.impl.BaseAiConfig;
import com.cdkjframework.ai.enums.ModelsName;
import com.cdkjframework.ai.enums.Openai;
import com.cdkjframework.ai.enums.Qwen;
import com.cdkjframework.util.tool.StringUtils;

/**
 * @ProjectName: wiki-framework
 * @Package: com.cdkjframework.ai.model.qwen
 * @ClassName: QwenConfig
 * @Description: java类作用描述
 * @Author: xiaLin
 * @Date: 2025/8/3 9:07
 * @Version: 1.0
 */
public class QwenConfig extends BaseAiConfig {
  /**
   * 构造函数
   */
  public QwenConfig() {
    // API接口地址
    super.setApiUrl("https://dashscope.aliyuncs.com/compatible-mode/v1");
    if (StringUtils.isNullAndSpaceOrEmpty(super.getModel())) {
      super.setModel(Qwen.QWEN_PLUS.getModel());
    }
  }

  /**
   * 构造函数
   *
   * @param apiKey API密钥
   */
  public QwenConfig(String apiKey) {
    this();
    super.setApiKey(apiKey);
  }

  /**
   * 获取模型(厂商)名称
   *
   * @return 返回模型(厂商)名称
   */
  @Override
  public String getModelName() {
    return ModelsName.QWEN.getValue();
  }
}

服务注入

java 复制代码
package com.cdkjframework.ai.model.qwen;

import com.cdkjframework.ai.core.AiConfig;
import com.cdkjframework.ai.core.AiProvider;
import com.cdkjframework.ai.enums.ModelsName;
import com.cdkjframework.ai.model.qwen.impl.QwenServiceImpl;

/**
 * @ProjectName: wiki-framework
 * @Package: com.cdkjframework.ai.model.qwen
 * @ClassName: QwenProvider
 * @Description: java类作用描述
 * @Author: xiaLin
 * @Date: 2025/8/3 9:08
 * @Version: 1.0
 */
public class QwenProvider implements AiProvider {
  /**
   * 获取服务名称
   *
   * @return 返回服务名称
   */
  @Override
  public String getServiceName() {
    return ModelsName.QWEN.getValue();
  }

  /**
   * 创建服务
   *
   * @param config 配置信息
   */
  @Override
  public QwenService create(AiConfig config) {
    return new QwenServiceImpl(config);
  }
}

接口

服务接口

java 复制代码
package com.cdkjframework.ai.model.qwen;

import java.util.List;
import java.util.function.Consumer;

import com.cdkjframework.ai.constant.AiCommon;
import com.cdkjframework.ai.core.AiService;
import com.cdkjframework.ai.core.Message;
import com.cdkjframework.builder.ResponseBuilder;

/**
 * @ProjectName: wiki-framework
 * @Package: com.cdkjframework.ai.model.qwen
 * @ClassName: QwenService
 * @Description: java类作用描述
 * @Author: xiaLin
 * @Date: 2025/8/3 9:08
 * @Version: 1.0
 */
public interface QwenService extends AiService {

  /**
   * 搜索
   */
  String EXTRA_BODY = "extra_body";

  /**
   * 搜索值
   */
  String EXTRA_BODY_VALUE = "{\"enable_search\": True\"}";

  /**
   * 流式参数
   */
  String STREAM_OPTIONS = "stream_options";

  /**
   * 流式参数值
   */
  String STREAM_OPTIONS_VALUE = "{\"include_usage\": True}";

  /**
   * 对话
   * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档
   *
   * @param messages 消息列表
   * @return 返回AI回复的消息
   */
  String chatSearch(final List<Message> messages);

  /**
   * 对话-SSE 流式输出
   * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档
   *
   * @param messages 消息列表
   * @param callback 流式数据回调函数
   */
  void chatSearch(final List<Message> messages, final Consumer<ResponseBuilder> callback);

  /**
   * 图像理解:模型会依据传入的图片信息以及问题,给出回复。
   *
   * @param prompts 提问
   * @param images 图片列表/或者图片Base64编码图片列表(URI形式)
   * @return AI回答内容
   */
  String chatVision(List<String> prompts, final List<String> images);

  /**
   * 图像理解-SSE流式输出
   *
   * @param prompts   提问
   * @param images   传入的图片列表地址/或者图片Base64编码图片列表(URI形式)
   * @param callback 流式数据回调函数
   */
  void chatVision(List<String> prompts, final List<String> images, final Consumer<ResponseBuilder> callback);

  /**
   * 图像理解:模型会依据传入的图片信息以及问题,给出回复。
   *
   * @param prompts 提问
   * @param videos 视频列表(URI形式)
   * @return AI回答内容
   */
  String chatVideoVision(List<String> prompts, final List<List<String>> videos);

  /**
   * 图像理解-SSE流式输出
   *
   * @param prompts   提问
   * @param videos   视频列表(URI形式)
   * @param callback 流式数据回调函数
   */
  void chatVideoVision(List<String> prompts, final List<List<String>> videos, final Consumer<ResponseBuilder> callback);
}

服务接口实现

java 复制代码
package com.cdkjframework.ai.model.qwen.impl;

import com.cdkjframework.ai.core.AiConfig;
import com.cdkjframework.ai.core.Message;
import com.cdkjframework.ai.core.impl.BaseAiService;
import com.cdkjframework.ai.model.qwen.QwenService;
import com.cdkjframework.builder.ResponseBuilder;
import com.cdkjframework.constant.IntegerConsts;
import com.cdkjframework.util.tool.JsonUtils;
import com.cdkjframework.util.tool.ThreadUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

import static com.cdkjframework.ai.constant.AiConstant.*;
import static com.cdkjframework.ai.constant.AiConstant.Qwen.*;

/**
 * @ProjectName: wiki-framework
 * @Package: com.cdkjframework.ai.model.qwen.impl
 * @ClassName: QwenServiceImpl
 * @Description: Qwen AI 服务实现类
 * @Author: xiaLin
 * @Date: 2025/8/3 9:08
 * @Version: 1.0
 */
public class QwenServiceImpl extends BaseAiService implements QwenService {

  /**
   * 构造函数
   *
   * @param config AI 服务接口
   */
  public QwenServiceImpl(AiConfig config) {
    super(config);
  }

  /**
   * 对话
   * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档
   *
   * @param messages 消息列表
   * @return 返回AI回复的消息
   */
  @Override
  public String chat(List<Message> messages) {
    final String paramJson = buildChatRequestBody(messages, Boolean.FALSE);
    // 发送POST请求
    final StringBuilder response = post(CHAT_ENDPOINT, paramJson);
    // 返回结果
    return response.toString();
  }

  /**
   * 对话-检索增强
   * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档
   *
   * @param messages 消息列表
   * @return 返回AI回复的消息
   */
  @Override
  public String chatSearch(List<Message> messages) {
    final String paramJson = buildChatRequestBody(messages, Boolean.TRUE);
    // 发送POST请求
    final StringBuilder response = post(CHAT_ENDPOINT, paramJson);
    // 返回结果
    return response.toString();
  }

  /**
   * 对话-SSE 流式输出
   * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档
   *
   * @param messages 消息列表
   * @param callback 流式数据回调函数
   */
  @Override
  public void chat(List<Message> messages, Consumer<ResponseBuilder> callback) {
    Map<String, Object> paramMap = buildChatStreamRequestBody(messages, Boolean.FALSE);
    ThreadUtils.newThread(() -> postStream(CHAT_ENDPOINT, paramMap, callback), QWEN_CHAT_SSE).start();
  }

  /**
   * 对话-SSE 流式输出
   * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档
   *
   * @param messages 消息列表
   * @param callback 流式数据回调函数
   */
  @Override
  public void chatSearch(List<Message> messages, Consumer<ResponseBuilder> callback) {
    Map<String, Object> paramMap = buildChatStreamRequestBody(messages, Boolean.TRUE);
    ThreadUtils.newThread(() -> postStream(CHAT_ENDPOINT, paramMap, callback), QWEN_CHAT_SSE).start();
  }

  /**
   * 对话-检索增强
   * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档
   *
   * @param prompts 消息列表
   * @return 返回AI回复的消息
   */

  @Override
  public String chatVision(List<String> prompts, List<String> images) {
    // 构建请求体
    String paramJson = buildChatVisionRequestBody(prompts, images);
    return post(CHAT_ENDPOINT, paramJson).toString();
  }

  /**
   * 对话 VISION SSE 流式输出
   * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档
   *
   * @param prompts   提词
   * @param images   图片列表
   * @param callback 流式数据回调函数
   */
  @Override
  public void chatVision(List<String> prompts, List<String> images, Consumer<ResponseBuilder> callback) {
    // 构建请求体
    Map<String, Object> paramMap = buildChatVisionStreamRequestBody(prompts, images);
    ThreadUtils.newThread(() -> postStream(CHAT_ENDPOINT, paramMap, callback), QWEN_CHAT_VISION_SSE).start();
  }

  /**
   * 图像理解:模型会依据传入的图片信息以及问题,给出回复。
   *
   * @param prompts 提问
   * @param videos  视频列表(URI形式)
   * @return AI回答内容
   */
  @Override
  public String chatVideoVision(List<String> prompts, List<List<String>> videos) {
    // 构建请求体
    String paramJson = buildChatVideoRequestBody(prompts, videos);
    return post(CHAT_ENDPOINT, paramJson).toString();
  }

  /**
   * 图像理解-SSE流式输出
   *
   * @param prompts  提问
   * @param videos   视频列表(URI形式)
   * @param callback 流式数据回调函数
   */
  @Override
  public void chatVideoVision(List<String> prompts, List<List<String>> videos, Consumer<ResponseBuilder> callback) {
    // 构建请求体
    Map<String, Object> paramMap = buildChatVideoStreamRequestBody(prompts, videos);
    ThreadUtils.newThread(() -> postStream(CHAT_ENDPOINT, paramMap, callback), QWEN_CHAT_VISION_SSE).start();
  }

  /**
   * 构建chat请求体
   *
   * @param messages 消息列表
   * @param search   是否搜索
   * @return 返回消息字符串
   */
  private String buildChatRequestBody(final List<Message> messages, boolean search) {
    final Map<String, Object> paramMap = new HashMap<>();
    buildRequestBody(Boolean.FALSE, search, paramMap, messages);
    // 合并其他参数
    paramMap.putAll(config.getAddConfigMap());

    // JSON 序列化
    return JsonUtils.objectToJsonString(paramMap);
  }

  /**
   * 构建chatVision请求体
   *
   * @param prompts 提词
   * @param images 图片列表
   * @return 请求体字符串
   */
  private String buildChatVisionRequestBody(List<String> prompts, final List<String> images) {
    // 使用JSON工具
    Map<String, Object> paramMap = buildRequestBody(Boolean.FALSE, prompts, images);
    return JsonUtils.objectToJsonString(paramMap);
  }

  /**
   * 构建chatStream请求体
   *
   * @param messages 消息列表
   * @return 返回消息集合
   */
  private Map<String, Object> buildChatStreamRequestBody(final List<Message> messages, boolean search) {
    final Map<String, Object> paramMap = new HashMap<>();
    buildRequestBody(Boolean.TRUE, search, paramMap, messages);
    // 合并其他参数
    paramMap.putAll(config.getAddConfigMap());

    return paramMap;
  }

  /**
   * 构建图片生成请求体
   *
   * @param prompts 描述
   * @param images 图片
   * @return 请求体
   */
  private Map<String, Object> buildChatVisionStreamRequestBody(List<String> prompts, final List<String> images) {
    // 返回参数
    return buildRequestBody(Boolean.TRUE, prompts, images);
  }

  /**
   * 构建视频生成请求体
   *
   * @param prompts 描述
   * @param videos 图片
   * @return 请求体
   */
  private String buildChatVideoRequestBody(List<String> prompts, final List<List<String>> videos) {
    // 使用JSON工具
    Map<String, Object> paramMap = buildVideoRequestBody(Boolean.FALSE, prompts, videos);
    return JsonUtils.objectToJsonString(paramMap);
  }

  /**
   * 构建视频生成请求体
   *
   * @param prompts 描述
   * @param videos 图片
   * @return 请求体
   */
  private Map<String, Object> buildChatVideoStreamRequestBody(List<String> prompts, final List<List<String>> videos) {
    // 返回参数
    return buildVideoRequestBody(Boolean.TRUE, prompts, videos);
  }

  /**
   * 构建请求体
   *
   * @param stream 是否流式
   * @param prompts 提词
   * @param videos 图片列表
   * 
   * @return 请求体集合
   */
  private Map<String, Object> buildVideoRequestBody(boolean stream, List<String> prompts,
      final List<List<String>> videos) {
    // 定义消息结构
    final List<Message> messages = new ArrayList<>();
    final List<Object> content = getVideoObjects(prompts, videos);

    messages.add(new Message(USER, content));

    // 使用JSON工具
    final Map<String, Object> paramMap = new HashMap<>();
    if (stream) {
      paramMap.put(STREAM, Boolean.TRUE);
    }
    paramMap.put(MODEL, config.getModel());
    paramMap.put(MESSAGES, messages);
    // 合并其他参数
    paramMap.putAll(config.getAddConfigMap());
    return paramMap;
  }

  /**
   * 构建请求体
   *
   * @param stream  是否流式
   * @param prompts 提词
   * @param images  图片列表
   * 
   * @return 请求体集合
   */
  private Map<String, Object> buildRequestBody(boolean stream, List<String> prompts, final List<String> images) {
    // 定义消息结构
    final List<Message> messages = new ArrayList<>();
    final List<Object> content = getObjects(prompts, images);

    messages.add(new Message(USER, content));

    // 使用JSON工具
    final Map<String, Object> paramMap = new HashMap<>();
    if (stream) {
      paramMap.put(STREAM, Boolean.TRUE);
    }
    paramMap.put(MODEL, config.getModel());
    paramMap.put(MESSAGES, messages);
    // 合并其他参数
    paramMap.putAll(config.getAddConfigMap());
    return paramMap;
  }

  /**
   * 获取图片内容
   *
   * @param prompts 提词
   * @param videos 图片列表
   * 
   * @return 图片内容
   */
  private static List<Object> getVideoObjects(List<String> prompts, List<List<String>> videos) {
    final List<Object> content = new ArrayList<>(videos.size());
    for (List<String> video : videos) {
      int idx = videos.indexOf(video);
      String prompt = prompts.get(idx);
      // 构建视频内容
      HashMap<String, Object> urlMap = new HashMap<>(IntegerConsts.TWO);
      urlMap.put(TYPE, VIDEO);
      urlMap.put(VIDEO, video);
      content.add(urlMap);

      // 构建文本内容
      final Map<String, String> contentMap = new HashMap<>(IntegerConsts.TWO);
      contentMap.put(TYPE, TEXT);
      contentMap.put(TEXT, prompt);
      content.add(contentMap);
    }
    return content;
  }

  /**
   * 获取视频内容
   *
   * @param prompts 提词
   * @param images  图片列表
   * 
   * @return 图片内容
   */
  private static List<Object> getObjects(List<String> prompts, List<String> images) {
    final List<Object> content = new ArrayList<>(IntegerConsts.ONE);
    for (String img : images) {
      int idx = img.indexOf(img);
      String prompt = prompts.get(idx);

      // 构建图片内容
      HashMap<String, Object> imgUrlMap = new HashMap<>(IntegerConsts.ONE);
      imgUrlMap.put(TYPE, IMAGE_URL);
      HashMap<String, Object> imgMap = new HashMap<>(IntegerConsts.ONE);
      imgMap.put(URL, img);

      imgUrlMap.put(IMAGE_URL, imgMap);
      content.add(imgUrlMap);

      HashMap<String, String> urlMap = new HashMap<>(IntegerConsts.TWO);
      urlMap.put(TYPE, TEXT);
      urlMap.put(TEXT, prompt);

      content.add(urlMap);
    }

    return content;
  }

  /**
   * 构建请求体
   *
   * @param stream   是否流式
   * @param search   是否搜索
   * @param paramMap 参数集合
   * @param messages 聊天消息
   */
  private void buildRequestBody(boolean stream, boolean search, final Map<String, Object> paramMap,
      final List<Message> messages) {
    paramMap.put(MODEL, config.getModel());
    paramMap.put(MESSAGES, messages);
    if (stream) {
      paramMap.put(STREAM, Boolean.TRUE);
      paramMap.put(STREAM_OPTIONS, STREAM_OPTIONS_VALUE);
    }
    if (search) {
      paramMap.put(EXTRA_BODY, EXTRA_BODY_VALUE);
    }
  }

}

AI工厂

java 复制代码
package com.cdkjframework.ai;

import com.cdkjframework.ai.core.AiConfig;
import com.cdkjframework.ai.core.AiProvider;
import com.cdkjframework.ai.core.AiService;
import com.cdkjframework.exceptions.GlobalRuntimeException;

import java.util.Map;
import java.util.ServiceLoader;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 创建 AiFactory 工厂类
 *
 * @ProjectName: wiki-framework
 * @Package: com.cdkjframework.ai
 * @ClassName: AiFactory
 * @Description: 创建 AiFactory 工厂类
 * @Author: xiaLin
 * @Version: 1.0
 */
public class AiFactory {
  /**
   * 创建 AiFactory 工厂类
   */
  private static final Map<String, AiProvider> PROVIDERS = new ConcurrentHashMap<>();

  // 加载所有 AiProvider 实现类
  static {
    final ServiceLoader<AiProvider> loader = ServiceLoader.load(AiProvider.class);
    for (final AiProvider provider : loader) {
      PROVIDERS.put(provider.getServiceName().toLowerCase(), provider);
    }
  }


  /**
   * 获取AI服务
   *
   * @param config AI 配置
   * @return AI服务实例
   */
  public static AiService findAiService(final AiConfig config) {
    return findAiService(config, AiService.class);
  }

  /**
   * 获取AI服务
   *
   * @param config Ai 配置
   * @param clazz  AI服务类
   * @param <T>    AI服务类
   * @return clazz对应的AI服务类实例
   */
  @SuppressWarnings("unchecked")
  public static <T extends AiService> T findAiService(final AiConfig config, final Class<T> clazz) {
    final AiProvider provider = PROVIDERS.get(config.getModelName().toLowerCase());
    if (provider == null) {
      throw new IllegalArgumentException("不支持的模型: " + config.getModelName());
    }

    final AiService service = provider.create(config);
    if (!clazz.isInstance(service)) {
      throw new GlobalRuntimeException("模型服务不属于指定类型: " + clazz.getSimpleName());
    }

    // 返回服务
    return (T) service;
  }
}

AI工具

java 复制代码
package com.cdkjframework.ai;

import com.cdkjframework.ai.core.AiConfig;
import com.cdkjframework.ai.core.AiService;
import com.cdkjframework.ai.core.Message;
import com.cdkjframework.ai.model.deepseek.DeepSeekService;
import com.cdkjframework.ai.model.doubao.DouBaoService;
import com.cdkjframework.ai.model.grok.GrokService;
import com.cdkjframework.ai.model.openai.OpenaiService;
import com.cdkjframework.ai.model.qwen.QwenService;

import java.util.List;

/**
 * AI 工具类
 *
 * @ProjectName: wiki-framework
 * @Package: com.cdkjframework.ai
 * @ClassName: AiUtils
 * @Description: AI 工具类
 * @Author: xiaLin
 * @Version: 1.0
 */
public class AiUtils {


  /**
   * 获取AI模型服务,每个大模型提供的功能会不一样,可以调用此方法指定不同AI服务类,调用不同的功能
   *
   * @param config 创建的AI服务模型的配置
   * @param clazz  AI模型服务类
   * @param <T>    AiService实现类
   * @return 返回 AI 模型服务类 的实现类实例
   */
  public static <T extends AiService> T findAiService(final AiConfig config, final Class<T> clazz) {
    return AiFactory.findAiService(config, clazz);
  }

  /**
   * 获取AI模型服务
   *
   * @param config 创建的AI服务模型的配置
   * @return 返回 AI 服务模型 其中只有公共方法
   */
  public static AiService findAiService(final AiConfig config) {
    return findAiService(config, AiService.class);
  }

  /**
   * 获取DeepSeek模型服务
   *
   * @param config 创建的AI服务模型的配置
   * @return DeepSeekService
   */
  public static DeepSeekService findDeepSeekService(final AiConfig config) {
    return findAiService(config, DeepSeekService.class);
  }

  /**
   * 获取DouBao模型服务
   *
   * @param config 创建的AI服务模型的配置
   * @return DouBaoService
   */
  public static DouBaoService findDouBaoService(final AiConfig config) {
    return findAiService(config, DouBaoService.class);
  }

  /**
   * 获取Grok模型服务
   *
   * @param config 创建的AI服务模型的配置
   * @return GrokService
   */
  public static GrokService findGrokService(final AiConfig config) {
    return findAiService(config, GrokService.class);
  }

  /**
   * 获取Openai模型服务
   *
   * @param config 创建的AI服务模型的配置
   * @return OpenAiService
   */
  public static OpenaiService findOpenAiService(final AiConfig config) {
    return findAiService(config, OpenaiService.class);
  }

  /**
   * 获取Qwen模型服务
   *
   * @param config 创建的AI服务模型的配置
   * @return QwenService
   */
  public static QwenService findQwenService(final AiConfig config) {
    return findAiService(config, QwenService.class);
  }

  /**
   * AI大模型对话功能(公共)
   *
   * @param config 创建的AI服务模型的配置
   * @param prompt 需要对话的内容
   * @return 返回 AI模型返回消息内容
   */
  public static String chat(final AiConfig config, final String prompt) {
    return findAiService(config).chat(prompt);
  }

  /**
   * AI大模型对话功能(公共)
   *
   * @param config   创建的AI服务模型的配置
   * @param messages 由目前为止的对话组成的消息列表,可以设置role,content。详细参考官方文档
   * @return 返回 AI模型返回消息内容
   */
  public static String chat(final AiConfig config, final List<Message> messages) {
    return findAiService(config).chat(messages);
  }
}

总结

以上只是博主自己在实际项目中和参考其它文章总结出来,然后在将其实封成工具分享给大家。

相关源码在:维基框架

Gitee: https://gitee.com/cdkjframework/wiki-framework

Github:https://github.com/cdkjframework/wiki-framework

如果喜欢博主的分享记得给博主点点小星星

相关推荐
陈广亮26 分钟前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬35 分钟前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia1 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区1 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两4 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪4 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat232554 小时前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源
王鑫星4 小时前
SWE-bench 首次突破 80%:Claude Opus 4.5 发布,Anthropic 的野心不止于写代码
人工智能
lnix4 小时前
当“大龙虾”养在本地:我们离“反SaaS”的AI未来还有多远?
人工智能·aigc