zeus00456

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

AI | springai - [入门案例]

maven 仓库

补充下面配置


          <repositories>
              <repository>
                  <id>spring-milestones</id>
                  <name>Spring Milestones</name>
                  <url>https://repo.spring.io/milestone</url>
              </repository>
              <!-- Spring Snapshots 仓库(可选,用于最新快照版) -->
              <repository>
                  <id>spring-snapshots</id>
                  <name>Spring Snapshots</name>
                  <url>https://repo.spring.io/snapshot</url>
              </repository>
          </repositories>

依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-openai</artifactId>
        </dependency>
<!--如果使用了方便连接的大模型,可以使用对应的 starter 包-->
<!--这个信息通常在对应的官网是没有的,但是可以在springai的官网找到-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.ai</groupId>-->
<!--            <artifactId>spring-ai-starter-model-minimax</artifactId>-->
<!--        </dependency>-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.8.26</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

配置

spring.application.name=demo
#spring.ai.openai.api-key=<api-key>
## 这才是推荐的使用 api-key 的方式,用环境变量
#spring.ai.openai.api-key=${AI_API_KEY}
spring.ai.openai.api-key=<api-key>
## 目前阶段,中转站通常是比较推荐的选择
## 中转站通常只需要变更 base-url,注意部分场景下已经不需要带 /v1 了
## 部分中转站要求 api-key 所在的组里包括对应的模型,才能调用其功能
## 这些信息,一般在模型广场上的每个模型详情里有说明
#spring.ai.openai.base-url=https://api.nonelinear.com/
spring.ai.openai.base-url=https://gitaigc.com


spring.ai.retry.max-attempts=1
spring.ai.retry.backoff.initial-interval=2s
spring.ai.retry.backoff.multiplier=5
spring.ai.retry.backoff.max-interval=3m

#文生文
#spring.ai.openai.chat.options.model=gpt-5-chat-latest
spring.ai.openai.chat.options.model=gpt-4o-mini
#spring.ai.openai.chat.options.temperature=0.1
spring.ai.openai.chat.options.temperature=1
#文生图
spring.ai.openai.image.options.model=gpt-4-dalle
#spring.ai.openai.image.options.model=gpt-image-1.5-high
#音生文
spring.ai.openai.audio.transcription.options.model=whisper-1
spring.ai.openai.audio.transcription.options.response-format=json

#文声音
spring.ai.openai.audio.speech.options.model=tts-1
spring.ai.openai.audio.speech.options.response-format=mp3
spring.ai.openai.audio.speech.options.voice=shimmer

基本 case

注意,spring ai 的 api 例子有可能随时间发生重大变化,下述 case 已与首次接触时有了极大不同
以官网为主 https://docs.spring.io/spring-ai/reference/api/chat/openai-chat.html

    //从使用情况上看,这个 api 不如 OpenAiChatModel
    private ChatClient chaty;
    @Resource
    private OpenAiChatModel chatClient;
    @Resource
    private OpenAiImageModel imageClient;
    @Resource
    private OpenAiAudioTranscriptionModel transClient;
    @Resource
    private OpenAiAudioSpeechModel audioClient;

    @Resource
    private ChatClient.Builder chat;

    @RequestMapping("ai")
    public String hello(@RequestParam("p") String p){
        System.out.println(System.getenv("GITAIGC_API_KEY"));
        return this.chaty.prompt()
                .user(p).call().content();
    }
    @RequestMapping("ai2")
    //调用时配置,会覆盖配置文件
    public String hello2(@RequestParam("p") String p){
        return this.chaty.prompt()
                .user(p).options(OpenAiChatOptions.builder().temperature(0.1d).model("gpt-5.5").build()).call().content();
//        return "";
    }
    @RequestMapping("img")
    public Object img(@RequestParam("p") String p){
        ImageResponse response = imageClient.call(
                new ImagePrompt(p,
                        OpenAiImageOptions.builder()
                                .quality("high")
                                .N(1)
                                //1024x1024, 1024x1536, 1536x1024,auto
                                .height(1024)
                                .width(1024).build())
        );
        return response.getResult().getOutput();
    }
    @RequestMapping("tr")
    public Object tr(@RequestParam("p") String p){
        ClassPathResource s = null;
        s = p.equals("zh")?new ClassPathResource(""):new ClassPathResource("");

        return transClient.call(s);
    }
    @RequestMapping("au")
    public Object au(@RequestParam("p") String p){
        byte[] a = audioClient.call(p);
        String f = "D:\\a.mp3";
        try{
            FileUtil.writeBytes(a,new File(f));
        }catch (Exception e) {
            //e.printStackTrace();
            System.err.println("写入文件时发生错误");
        }
        return "200";
    }
    @RequestMapping("mu")
    public String multi(){
        ClassPathResource s = new ClassPathResource("/a.png");

        UserMessage m = UserMessage.builder()
                .text("Explain what do you see on this picture?")
                .media(new Media(MimeTypeUtils.IMAGE_PNG, s))
                .build();

        ChatResponse response = chatClient.call(new Prompt(m,
                OpenAiChatOptions.builder().model(OpenAiApi.ChatModel.GPT_4_O.getValue()).build()));
        return response.getResult().getOutput().getText();
    }


    /* *******************************
     * 以下是工具
     ******************************* */
    @PostConstruct
    public void init(){ this.chaty = chat.build(); }
posted on 2026-06-01 21:27  问仙长何方蓬莱  阅读(8)  评论(0)    收藏  举报