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