Spring AI-54.智谱AI(ZhiPuAI)图像生成API

Spring AI-54.智谱AI(ZhiPuAI)图像生成API

Spring AI支持集成智谱AI的图像生成服务,提供基于中文提示词的图像生成能力,适用于中文场景下的创意设计、内容生成等需求。以下是详细的集成指南和接口说明:

一、环境准备
  1. 获取API密钥

    • 访问智谱AI开发者平台注册账号,创建应用并获取API密钥。

    • 设置环境变量或配置文件:

      export ZHIPUAI_API_KEY=your-zhipuai-api-key  
      
  2. 添加依赖
    在项目中引入智谱AI图像客户端支持:

    <!-- Maven -->
org.springframework.ai.retry.NonTransientAiException: HTTP 400 - {"requestId":"e7086b88-920b-97cf-b5a0-5b325342240f","code":"InvalidParameter","message":"No static resource api-openai/v1/embeddings/api/v1/services/embeddings/text-embedding/text-embedding."} at org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration$2.handleError(SpringAiRetryAutoConfiguration.java:109) ~[spring-ai-autoconfigure-retry-1.0.0.jar:1.0.0] at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.StatusHandler.lambda$fromErrorHandler$1(StatusHandler.java:71) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.StatusHandler.handle(StatusHandler.java:146) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.applyStatusHandlers(DefaultRestClient.java:680) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient.readWithMessageConverters(DefaultRestClient.java:200) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.readBody(DefaultRestClient.java:667) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.toEntityInternal(DefaultRestClient.java:637) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.toEntity(DefaultRestClient.java:626) ~[spring-web-6.1.6.jar:6.1.6] at com.alibaba.cloud.ai.dashscope.api.DashScopeApi.embeddings(DashScopeApi.java:344) ~[spring-ai-alibaba-core-1.0.0.2.jar:1.0.0.2] at com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel.lambda$call$1(DashScopeEmbeddingModel.java:143) ~[spring-ai-alibaba-core-1.0.0.2.jar:1.0.0.2] at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:335) ~[spring-retry-2.0.5.jar:na] at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:211) ~[spring-retry-2.0.5.jar:na] at com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel.lambda$call$3(DashScopeEmbeddingModel.java:141) ~[spring-ai-alibaba-core-1.0.0.2.jar:1.0.0.2] at io.micrometer.observation.Observation.observe(Observation.java:565) ~[micrometer-observation-1.12.5.jar:1.12.5] at com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel.call(DashScopeEmbeddingModel.java:140) ~[spring-ai-alibaba-core-1.0.0.2.jar:1.0.0.2] at org.springframework.ai.embedding.EmbeddingModel.embed(EmbeddingModel.java:67) ~[spring-ai-model-1.0.0.jar:1.0.0] at org.springframework.ai.embedding.EmbeddingModel.embed(EmbeddingModel.java:49) ~[spring-ai-model-1.0.0.jar:1.0.0] at org.springframework.ai.embedding.AbstractEmbeddingModel.dimensions(AbstractEmbeddingModel.java:70) ~[spring-ai-model-1.0.0.jar:1.0.0] at org.springframework.ai.embedding.AbstractEmbeddingModel.dimensions(AbstractEmbeddingModel.java:95) ~[spring-ai-model-1.0.0.jar:1.0.0] at org.springframework.ai.vectorstore.redis.RedisVectorStore.createObservationContextBuilder(RedisVectorStore.java:461) ~[spring-ai-redis-store-1.0.0.jar:1.0.0] at org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore.add(AbstractObservationVectorStore.java:79) ~[spring-ai-vector-store-1.0.0.jar:1.0.0] at com.serviceai.config.CommonConfiguration.lambda$vectorStoreInitializer$0(CommonConfiguration.java:72) ~[classes/:na] at org.springframework.boot.SpringApplication.lambda$callRunner$4(SpringApplication.java:786) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:83) ~[spring-core-6.1.6.jar:6.1.6] at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60) ~[spring-core-6.1.6.jar:6.1.6] at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:88) ~[spring-core-6.1.6.jar:6.1.6] at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:798) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:786) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.lambda$callRunners$3(SpringApplication.java:774) ~[spring-boot-3.2.5.jar:3.2.5] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na] at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357) ~[na:na] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510) ~[na:na] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na] at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:774) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:341) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.5.jar:3.2.5] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.5.jar:3.2.5] at com.serviceai.ServiceAiApplication.main(ServiceAiApplication.java:10) ~[classes/:na] 这个报错
09-02
<think> 我们正在处理一个Spring AI应用中的HTTP 400错误,具体错误信息是: `org.springframework.ai.retry.NonTransientAiException: HTTP 400 - {"requestId":"e7086b88-920b-97cf-b5a0-5b325342240f","code":"InvalidParameter","message":"No static resource api-openai/v1/embeddings/api/v1/services/embeddings/text-embedding/text-embedding."}` 错误信息表明,我们请求的URL路径不正确。从错误消息中可以看出,请求的URL路径为:`api-openai/v1/embeddings/api/v1/services/embeddings/text-embedding/text-embedding`,这显然是一个拼接错误的路径。 在Spring AI中,当我们使用OpenAI的嵌入功能时,我们需要正确配置基础URL和API路径。通常,OpenAI的嵌入API的路径应该是`/v1/embeddings`,但这里出现了重复的路径段。 根据错误信息,我们可能错误地配置了基础URL(base URL)和API路径(api path),导致两者被拼接在一起形成了无效的路径。 ### 常见的配置属性 在Spring AI中,与OpenAI相关的配置属性通常以`spring.ai.openai`为前缀。关键的配置属性包括: - `spring.ai.openai.base-url`: 用于设置OpenAI API的基础URL,默认是`https://api.openai.com`。 - `spring.ai.openai.embedding.options.model`: 设置嵌入模型,例如`text-embedding-ada-002`。 - `spring.ai.openai.embedding.options.api`: 设置API路径,但通常我们不需要设置这个,因为默认值是正确的。 ### 错误原因分析 从错误信息中的路径`api-openai/v1/embeddings/api/v1/services/embeddings/text-embedding/text-embedding`可以看出,这个路径由多个部分组成,其中包含了重复的部分。这可能是由于我们在配置基础URL时包含了部分路径(例如,配置了`base-url`为`http://your-host/api-openai`),同时又设置了API路径(可能是默认的或手动设置的`/v1/embeddings`),然后Spring AI在构造请求URL时进行了错误的拼接。 实际上,如果我们查看Spring AI的源代码,它构造请求URL的方式是: ``` String url = baseUrl + "/" + apiPath; ``` 因此,如果`baseUrl`已经包含了路径,再拼接上`apiPath`就会形成重复。 ### 解决方案 为了解决这个问题,我们需要检查我们的配置文件(如`application.properties`或`application.yml`)中的相关配置。 1. **检查基础URL(base-url)**:确保`spring.ai.openai.base-url`只包含协议、主机和端口(如果需要),而不包含API路径部分。例如: ```properties spring.ai.openai.base-url=https://api.openai.com ``` 2. **检查API路径(api)**:通常情况下,我们不需要设置API路径,因为Spring AI提供了默认值。但是,如果我们自定义了API路径,确保它不包含基础URL中已有的部分。默认的嵌入API路径是`/v1/embeddings`。 3. **完整配置示例**: ```properties # OpenAI API密钥 spring.ai.openai.api-key=YOUR_API_KEY # 基础URL(如果是使用官方OpenAI,则不需要设置,因为默认就是这个) # 如果使用代理或自己部署的兼容OpenAI API的服务,则设置正确的基础URL(不包含路径部分) spring.ai.openai.base-url=https://api.openai.com # 嵌入模型设置 spring.ai.openai.embedding.options.model=text-embedding-ada-002 ``` 4. **如果使用的是Azure OpenAI**:那么配置会有所不同,因为Azure OpenAIAPI路径格式不同。例如: ```properties spring.ai.openai.api-type=azure spring.ai.openai.base-url=https://{your-resource-name}.openai.azure.com spring.ai.openai.api-key={your-api-key} spring.ai.openai.embedding.options.model={deployment-name} # 部署的嵌入模型名称 spring.ai.openai.embedding.options.api=openai/deployments/{deployment-name}/embeddings?api-version={api-version} ``` 注意:在Azure OpenAI的情况下,API路径需要按照Azure的要求设置。 ### 针对当前错误的调整 根据错误信息中的路径,我们推测配置可能是这样的: - `base-url`可能被设置成了`http://somehost/api-openai/v1/embeddings`(或包含了`api-openai`等路径) -API路径可能被设置成了`api/v1/services/embeddings/text-embedding/text-embedding` 我们需要将`base-url`调整为不包含API路径的部分,同时将API路径调整为正确的值。 例如,如果我们使用的是官方的OpenAI服务,那么: - 将`spring.ai.openai.base-url`设置为`https://api.openai.com` - 移除任何自定义的API路径配置(使用默认的`/v1/embeddings`) 如果我们使用的是其他服务(比如自己部署的OpenAI API兼容服务),那么: - 确保`base-url`指向服务的主机,例如`http://localhost:8080` - 然后设置正确的API路径,例如`/v1/embeddings`(具体取决于服务提供的路径) ### 验证 调整配置后,重新启动应用,验证是否解决了问题。 ### 总结 这个错误通常是由于错误的基础URL和API路径配置导致的。请检查并调整这两个配置项,确保它们正确且不重复。 §§相关问题§§ 1. Spring AI中如何配置Azure OpenAI服务? 2. 除了路径配置错误,还有哪些原因会导致Spring AI中的HTTP 400错误? 3. 如何在Spring AI中自定义重试机制以处理暂时性错误? </think> ### 解决 `org.springframework.ai.retry.NonTransientAiException: HTTP 400` 错误的分析与方案 #### **错误原因分析** 1. **URL 路径配置错误**: - 错误信息明确提示 `No static resource api-openai/v1/embeddings/api/v1/services/embeddings/text-embedding/text-embedding`。 - 这表明 Spring AI 发送的请求 URL 路径无效,可能是配置文件中拼接了重复路径(如 `api-openai/v1/embeddings` + `/api/v1/services/...`)。 - 典型错误配置示例: ```properties # 错误示例:路径重复 spring.ai.openai.base-url=https://your-host/api-openai/v1/embeddings spring.ai.openai.embedding.options.api=/api/v1/services/embeddings/text-embedding ``` 2. **端点格式不兼容**: - OpenAI 的标准 Embeddings API 端点为 `/v1/embeddings`。 - 错误中的路径 `api/v1/services/embeddings/text-embedding/text-embedding` 不符合 OpenAI 官方格式,可能是自定义服务路径未正确配置。 3. **可能涉及 Azure OpenAI**: - Azure OpenAI 的路径格式为 `/openai/deployments/{deployment}/embeddings?api-version={version}`,若使用 Azure 服务需特殊配置[^1]。 --- #### **解决方案** ##### 1. **检查并修正 URL 配置** 在 `application.properties` 或 `application.yml` 中: ```properties # 官方 OpenAI 服务的正确配置 spring.ai.openai.base-url=https://api.openai.com spring.ai.openai.embedding.options.api=/v1/embeddings # 若使用 Azure OpenAI spring.ai.openai.api-type=azure spring.ai.openai.base-url=https://{YOUR_RESOURCE}.openai.azure.com spring.ai.openai.embedding.options.api=/openai/deployments/{DEPLOYMENT}/embeddings?api-version=2023-12-01-preview ``` ##### 2. **验证路径拼接逻辑** - Spring AI 会拼接 `base-url + api-path`,确保两者**不包含重复部分**。 ```java // 错误:导致路径重复 base-url: "https://host/api-openai/v1/embeddings" api-path: "/api/v1/services/..." // 实际 URL 变为 "api-openai/v1/embeddings/api/v1/..." ``` ##### 3. **检查依赖版本兼容性** - 确认 `spring-ai-bom` 版本(如 `1.0.0-M2`)与 OpenAI/Azure 客户端兼容。 ```xml <!-- pom.xml 依赖示例 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>${spring-ai.version}</version> </dependency> ``` ##### 4. **网络与权限验证** - 若使用自托管服务,检查网络连通性(参考引用 [^2] 的 `ping` 测试)。 - 确保 API 密钥有效且具有调用权限: ```properties spring.ai.openai.api-key=sk-xxxxxxxxxxxx ``` --- #### **总结步骤** 1. **修正配置**:检查 `base-url` 和 `api` 路径是否重复。 2. **统一路径格式**:使用官方标准路径(如 `/v1/embeddings`)。 3. **验证依赖**:确保 Spring AI 版本与目标服务兼容。 4. **诊断网络**:测试服务端可达性(参考引用 [^2])。 > 若问题仍存在,启用 DEBUG 日志定位具体请求 URL: > ```properties > logging.level.org.springframework.web.client=DEBUG > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员勇哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值