前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Forest对接谷歌Gemini

使用Forest对接谷歌Gemini

作者头像
用户10136162
发布2024-02-19 09:29:57
1180
发布2024-02-19 09:29:57
举报
文章被收录于专栏:Eliauk的小窝Eliauk的小窝

1、前置需要

申请Gemini账号,并获取API Key

官网地址:Gemini

2、测试所引入依赖

代码语言:javascript
复制

<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-spring-boot-starter</artifactId>
    <version>1.5.33</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.18</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.0</version> <!-- 或更高版本 -->
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.12.0</version> <!-- 或更高版本 -->
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.12.0</version> <!-- 或更高版本 -->
</dependency>

3、yml文件配置

代码语言:javascript
复制
forest:
  variables:
    gemini:
      #proxies: https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent  这个是普通请求
      proxies: https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:streamGenerateContent # 这个是流式请求
      key: YOUR_API_KEY # 这里是你申请的apikey
  max-connections: 1000        # 连接池最大连接数
  connect-timeout: 300000        # 连接超时时间,单位为毫秒
  read-timeout: 300000           # 数据读取超时时间,单位为毫秒

4、创建接口

代码语言:javascript
复制
/**
 * 构造AI中台请求接口
 * @author Eliauk,微信:Cizai_,邮箱:zang.dromara.org <br/>
 * @date 2024/2/5 <br/>
 * @Copyright 博客:https://eliauku.gitee.io/  ||  per aspera and astra <br/>
 */

public interface AIMiddlePlatform {

    @PostRequest(url ="${gemini.proxies}" + "?" + "key=" + "${gemini.key}",
    headers = {"Accept: text/event-stream","User-Agent: fastchat Client"})
    InputStream intelligentQA(@JSONBody JSONObject params);
}

5、调用接口

代码语言:javascript
复制

/**
 * @author Eliauk,微信:Cizai_,邮箱:zang.dromara.org <br/>
 * @date 2024/2/18 <br/>
 * @Copyright 博客:https://eliauku.gitee.io/  ||  per aspera and astra <br/>
 */
@Slf4j
@RestController
@RequiredArgsConstructor
public class AiController {

    @Resource
    private final AIMiddlePlatform aimiddlePlatform;

    private final ExecutorService nonBlockingService = Executors.newCachedThreadPool();
    @PostMapping(value = "/ai",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter ai(@RequestParam String text) {
        final SseEmitter sseEmitter = new SseEmitter();

        nonBlockingService.execute(() -> {
            // 使用Jackson构建JSON对象
            ObjectMapper mapper = new ObjectMapper();
            ObjectNode textPart = mapper.createObjectNode().put("text", text);

            ArrayNode partsArray = mapper.createArrayNode().add(textPart);
            ObjectNode contentsObject = mapper.createObjectNode().set("parts", partsArray);
            ArrayNode contentsArray = mapper.createArrayNode().add(contentsObject);
            ObjectNode requestBody = mapper.createObjectNode().set("contents", contentsArray);

            InputStream result = aimiddlePlatform.intelligentQA(requestBody);

            StringBuilder sb = new StringBuilder();
            try (BufferedReader br = new BufferedReader(new InputStreamReader(result, "UTF-8"));
                 JsonParser parser = new JsonFactory(mapper).createParser(br)) {

                while (!parser.isClosed()) {
                    JsonToken jsonToken = parser.nextToken();

                    if (jsonToken == null) {
                        break;
                    }

                    if (JsonToken.FIELD_NAME.equals(jsonToken) && "text".equals(parser.getCurrentName())) {
                        parser.nextToken(); // 移动到字段值
                        sb.append(parser.getValueAsString()).append("\n"); // 收集"text"字段的值
                        System.out.println(parser.getValueAsString());
                        sseEmitter.send(parser.getValueAsString());
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                sseEmitter.complete();
            }
        });

        return sseEmitter;
    }
}

这样就可以得到流式相应的结果了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、前置需要
  • 2、测试所引入依赖
  • 3、yml文件配置
  • 4、创建接口
  • 5、调用接口
相关产品与服务
TI-Matrix 应用平台
TI-Matrix 应用平台是基于腾讯云和腾讯优图强大技术能力打造的全栈式人工智能服务平台,致力于帮助加速企业的数字化转型及促进 AI 行业生态共建。平台支持快速接入各种数据、算法和智能设备,并提供可视化编排工具进行服务和资源的管理及调度,进一步通过 AI 服务组件集成和标准化接口开放,降低 AI 应用开发成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档