瀏覽代碼

复制 spring-ai image

cherishsince 1 年之前
父節點
當前提交
c3e36c19ea

+ 73 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/Image.java

@@ -0,0 +1,73 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+import java.util.Objects;
+
+public class Image {
+
+	/**
+	 * The URL where the image can be accessed.
+	 */
+	private String url;
+
+	/**
+	 * Base64 encoded image string.
+	 */
+	private String b64Json;
+
+	public Image(String url, String b64Json) {
+		this.url = url;
+		this.b64Json = b64Json;
+	}
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	public String getB64Json() {
+		return b64Json;
+	}
+
+	public void setB64Json(String b64Json) {
+		this.b64Json = b64Json;
+	}
+
+	@Override
+	public String toString() {
+		return "Image{" + "url='" + url + '\'' + ", b64Json='" + b64Json + '\'' + '}';
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o)
+			return true;
+		if (!(o instanceof Image image))
+			return false;
+		return Objects.equals(url, image.url) && Objects.equals(b64Json, image.b64Json);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(url, b64Json);
+	}
+
+}

+ 27 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/ImageClient.java

@@ -0,0 +1,27 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+
+import cn.iocoder.yudao.framework.ai.model.ModelClient;
+
+@FunctionalInterface
+public interface ImageClient extends ModelClient<ImagePrompt, ImageResponse> {
+
+	ImageResponse call(ImagePrompt request);
+
+}

+ 52 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/ImageGeneration.java

@@ -0,0 +1,52 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+
+import cn.iocoder.yudao.framework.ai.model.ModelResult;
+
+public class ImageGeneration implements ModelResult<Image> {
+
+	private ImageGenerationMetadata imageGenerationMetadata;
+
+	private Image image;
+
+	public ImageGeneration(Image image) {
+		this.image = image;
+	}
+
+	public ImageGeneration(Image image, ImageGenerationMetadata imageGenerationMetadata) {
+		this.image = image;
+		this.imageGenerationMetadata = imageGenerationMetadata;
+	}
+
+	@Override
+	public Image getOutput() {
+		return image;
+	}
+
+	@Override
+	public ImageGenerationMetadata getMetadata() {
+		return imageGenerationMetadata;
+	}
+
+	@Override
+	public String toString() {
+		return "ImageGeneration{" + "imageGenerationMetadata=" + imageGenerationMetadata + ", image=" + image + '}';
+	}
+
+}

+ 23 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/ImageGenerationMetadata.java

@@ -0,0 +1,23 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+import cn.iocoder.yudao.framework.ai.model.ResultMetadata;
+
+public interface ImageGenerationMetadata extends ResultMetadata {
+
+}

+ 63 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/ImageMessage.java

@@ -0,0 +1,63 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+import java.util.Objects;
+
+public class ImageMessage {
+
+	private String text;
+
+	private Float weight;
+
+	public ImageMessage(String text) {
+		this.text = text;
+	}
+
+	public ImageMessage(String text, Float weight) {
+		this.text = text;
+		this.weight = weight;
+	}
+
+	public String getText() {
+		return text;
+	}
+
+	public Float getWeight() {
+		return weight;
+	}
+
+	@Override
+	public String toString() {
+		return "mageMessage{" + "text='" + text + '\'' + ", weight=" + weight + '}';
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o)
+			return true;
+		if (!(o instanceof ImageMessage that))
+			return false;
+		return Objects.equals(text, that.text) && Objects.equals(weight, that.weight);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(text, weight);
+	}
+
+}

+ 37 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/ImageOptions.java

@@ -0,0 +1,37 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+import cn.iocoder.yudao.framework.ai.model.ModelOptions;
+
+/**
+ * ImageOptions represent the common options, portable across different image generation
+ * models.
+ */
+public interface ImageOptions extends ModelOptions {
+
+	Integer getN();
+
+	String getModel();
+
+	Integer getWidth();
+
+	Integer getHeight();
+
+	String getResponseFormat(); // openai - url or base64 : stability ai byte[] or base64
+
+}

+ 119 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/ImageOptionsBuilder.java

@@ -0,0 +1,119 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+public class ImageOptionsBuilder {
+
+	private class ImageModelOptionsImpl implements ImageOptions {
+
+		private Integer n;
+
+		private String model;
+
+		private Integer width;
+
+		private Integer height;
+
+		private String responseFormat;
+
+		@Override
+		public Integer getN() {
+			return n;
+		}
+
+		public void setN(Integer n) {
+			this.n = n;
+		}
+
+		@Override
+		public String getModel() {
+			return model;
+		}
+
+		public void setModel(String model) {
+			this.model = model;
+		}
+
+		@Override
+		public String getResponseFormat() {
+			return responseFormat;
+		}
+
+		public void setResponseFormat(String responseFormat) {
+			this.responseFormat = responseFormat;
+		}
+
+		@Override
+		public Integer getWidth() {
+			return width;
+		}
+
+		public void setWidth(Integer width) {
+			this.width = width;
+		}
+
+		@Override
+		public Integer getHeight() {
+			return height;
+		}
+
+		public void setHeight(Integer height) {
+			this.height = height;
+		}
+
+	}
+
+	private final ImageModelOptionsImpl options = new ImageModelOptionsImpl();
+
+	private ImageOptionsBuilder() {
+
+	}
+
+	public static ImageOptionsBuilder builder() {
+		return new ImageOptionsBuilder();
+	}
+
+	public ImageOptionsBuilder withN(Integer n) {
+		options.setN(n);
+		return this;
+	}
+
+	public ImageOptionsBuilder withModel(String model) {
+		options.setModel(model);
+		return this;
+	}
+
+	public ImageOptionsBuilder withResponseFormat(String responseFormat) {
+		options.setResponseFormat(responseFormat);
+		return this;
+	}
+
+	public ImageOptionsBuilder withWidth(Integer width) {
+		options.setWidth(width);
+		return this;
+	}
+
+	public ImageOptionsBuilder withHeight(Integer height) {
+		options.setHeight(height);
+		return this;
+	}
+
+	public ImageOptions build() {
+		return options;
+	}
+
+}

+ 84 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/ImagePrompt.java

@@ -0,0 +1,84 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+import cn.iocoder.yudao.framework.ai.model.ModelRequest;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 图片内容
+ */
+public class ImagePrompt implements ModelRequest<List<ImageMessage>> {
+
+	private final List<ImageMessage> messages;
+
+	private ImageOptions imageModelOptions;
+
+	public ImagePrompt(List<ImageMessage> messages) {
+		this.messages = messages;
+	}
+
+	public ImagePrompt(List<ImageMessage> messages, ImageOptions imageModelOptions) {
+		this.messages = messages;
+		this.imageModelOptions = imageModelOptions;
+	}
+
+	public ImagePrompt(ImageMessage imageMessage, ImageOptions imageOptions) {
+		this(Collections.singletonList(imageMessage), imageOptions);
+	}
+
+	public ImagePrompt(String instructions, ImageOptions imageOptions) {
+		this(new ImageMessage(instructions), imageOptions);
+	}
+
+	public ImagePrompt(String instructions) {
+		this(new ImageMessage(instructions), ImageOptionsBuilder.builder().build());
+	}
+
+	@Override
+	public List<ImageMessage> getInstructions() {
+		return messages;
+	}
+
+	@Override
+	public ImageOptions getOptions() {
+		return imageModelOptions;
+	}
+
+	@Override
+	public String toString() {
+		return "NewImagePrompt{" + "messages=" + messages + ", imageModelOptions=" + imageModelOptions + '}';
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o)
+			return true;
+		if (!(o instanceof ImagePrompt that))
+			return false;
+		return Objects.equals(messages, that.messages) && Objects.equals(imageModelOptions, that.imageModelOptions);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(messages, imageModelOptions);
+	}
+
+}

+ 75 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/ImageResponse.java

@@ -0,0 +1,75 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+import cn.iocoder.yudao.framework.ai.model.ModelResponse;
+
+import java.util.List;
+import java.util.Objects;
+
+public class ImageResponse implements ModelResponse<ImageGeneration> {
+
+	private final ImageResponseMetadata imageResponseMetadata;
+
+	private final List<ImageGeneration> imageGenerations;
+
+	public ImageResponse(List<ImageGeneration> generations) {
+		this(generations, ImageResponseMetadata.NULL);
+	}
+
+	public ImageResponse(List<ImageGeneration> generations, ImageResponseMetadata imageResponseMetadata) {
+		this.imageResponseMetadata = imageResponseMetadata;
+		this.imageGenerations = List.copyOf(generations);
+	}
+
+	@Override
+	public ImageGeneration getResult() {
+		return imageGenerations.get(0);
+	}
+
+	@Override
+	public List<ImageGeneration> getResults() {
+		return imageGenerations;
+	}
+
+	@Override
+	public ImageResponseMetadata getMetadata() {
+		return imageResponseMetadata;
+	}
+
+	@Override
+	public String toString() {
+		return "ImageResponse{" + "imageResponseMetadata=" + imageResponseMetadata + ", imageGenerations="
+				+ imageGenerations + '}';
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o)
+			return true;
+		if (!(o instanceof ImageResponse that))
+			return false;
+		return Objects.equals(imageResponseMetadata, that.imageResponseMetadata)
+				&& Objects.equals(imageGenerations, that.imageGenerations);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(imageResponseMetadata, imageGenerations);
+	}
+
+}

+ 31 - 0
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/image/ImageResponseMetadata.java

@@ -0,0 +1,31 @@
+/*
+ * Copyright 2024-2024 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cn.iocoder.yudao.framework.ai.image;
+
+
+import cn.iocoder.yudao.framework.ai.model.ResponseMetadata;
+
+public interface ImageResponseMetadata extends ResponseMetadata {
+
+	ImageResponseMetadata NULL = new ImageResponseMetadata() {
+	};
+
+	default Long created() {
+		return System.currentTimeMillis();
+	}
+
+}