mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-25 03:10:08 +08:00
fix: 调整图片高度,修复gemini画图 (#5585)
This commit is contained in:
parent
4162dd6c61
commit
72b8faf760
@ -99,6 +99,7 @@ const MessageImage: FC<Props> = ({ block }) => {
|
||||
<Image
|
||||
src={image}
|
||||
key={`image-${index}`}
|
||||
height={200}
|
||||
preview={{
|
||||
toolbarRender: (
|
||||
_,
|
||||
@ -130,18 +131,21 @@ const Container = styled.div`
|
||||
flex-direction: row;
|
||||
gap: 10px;
|
||||
margin-top: 8px;
|
||||
width: 100%;
|
||||
width: auto;
|
||||
`
|
||||
const Image = styled(AntdImage)`
|
||||
border-radius: 10px;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
padding: 5px;
|
||||
border-radius: 8px;
|
||||
|
||||
.ant-image-img {
|
||||
width: auto;
|
||||
}
|
||||
`
|
||||
const ToobarWrapper = styled(Space)`
|
||||
padding: 0px 24px;
|
||||
color: #fff;
|
||||
font-size: 20px;
|
||||
background-color: rgba(0, 0, 0, 0.1);
|
||||
background-color: rgba(238, 233, 233, 0.1);
|
||||
border-radius: 100px;
|
||||
.anticon {
|
||||
padding: 12px;
|
||||
|
||||
@ -40,7 +40,7 @@ import {
|
||||
Usage,
|
||||
WebSearchSource
|
||||
} from '@renderer/types'
|
||||
import { BlockCompleteChunk, ChunkType, LLMWebSearchCompleteChunk } from '@renderer/types/chunk'
|
||||
import { BlockCompleteChunk, Chunk, ChunkType, LLMWebSearchCompleteChunk } from '@renderer/types/chunk'
|
||||
import type { Message, Response } from '@renderer/types/newMessage'
|
||||
import { removeSpecialCharactersForTopicName } from '@renderer/utils'
|
||||
import { mcpToolCallResponseToGeminiMessage, parseAndCallTools } from '@renderer/utils/mcp-tools'
|
||||
@ -122,8 +122,11 @@ export default class GeminiProvider extends BaseProvider {
|
||||
// Add any generated images from previous responses
|
||||
const imageBlocks = findImageBlocks(message)
|
||||
for (const imageBlock of imageBlocks) {
|
||||
if (imageBlock.metadata?.generateImage?.images && imageBlock.metadata.generateImage.images.length > 0) {
|
||||
for (const imageUrl of imageBlock.metadata.generateImage.images) {
|
||||
if (
|
||||
imageBlock.metadata?.generateImageResponse?.images &&
|
||||
imageBlock.metadata.generateImageResponse.images.length > 0
|
||||
) {
|
||||
for (const imageUrl of imageBlock.metadata.generateImageResponse.images) {
|
||||
if (imageUrl && imageUrl.startsWith('data:')) {
|
||||
// Extract base64 data and mime type from the data URL
|
||||
const matches = imageUrl.match(/^data:(.+);base64,(.*)$/)
|
||||
@ -448,7 +451,7 @@ export default class GeminiProvider extends BaseProvider {
|
||||
}
|
||||
|
||||
// 4. Image Generation
|
||||
const generateImage = this.processGeminiImageResponse(chunk)
|
||||
const generateImage = this.processGeminiImageResponse(chunk, onChunk)
|
||||
if (generateImage?.images?.length) {
|
||||
onChunk({ type: ChunkType.IMAGE_COMPLETE, image: generateImage })
|
||||
}
|
||||
@ -715,7 +718,10 @@ export default class GeminiProvider extends BaseProvider {
|
||||
* @param response - Gemini响应
|
||||
* @param onChunk - 处理生成块的回调
|
||||
*/
|
||||
private processGeminiImageResponse(chunk: GenerateContentResponse): { type: 'base64'; images: string[] } | undefined {
|
||||
private processGeminiImageResponse(
|
||||
chunk: GenerateContentResponse,
|
||||
onChunk: (chunk: Chunk) => void
|
||||
): { type: 'base64'; images: string[] } | undefined {
|
||||
const parts = chunk.candidates?.[0]?.content?.parts
|
||||
if (!parts) {
|
||||
return
|
||||
@ -727,6 +733,10 @@ export default class GeminiProvider extends BaseProvider {
|
||||
if (!part.inlineData) {
|
||||
return null
|
||||
}
|
||||
// onChunk的位置需要更改
|
||||
onChunk({
|
||||
type: ChunkType.IMAGE_CREATED
|
||||
})
|
||||
const dataPrefix = `data:${part.inlineData.mimeType || 'image/png'};base64,`
|
||||
return part.inlineData.data?.startsWith('data:') ? part.inlineData.data : dataPrefix + part.inlineData.data
|
||||
})
|
||||
|
||||
Loading…
Reference in New Issue
Block a user