@@ -43,6 +43,37 @@ function toAbsoluteUrl(url) {
4343 }
4444}
4545
46+ function detectBase64ImageMime ( base64Text ) {
47+ const s = String ( base64Text || '' ) . trim ( ) . replace ( / \s + / g, '' ) ;
48+ if ( ! s ) return 'image/png' ;
49+ if ( s . startsWith ( '/9j/' ) ) return 'image/jpeg' ;
50+ if ( s . startsWith ( 'iVBORw0KGgo' ) ) return 'image/png' ;
51+ if ( s . startsWith ( 'UklGR' ) ) return 'image/webp' ;
52+ if ( s . startsWith ( 'R0lGOD' ) ) return 'image/gif' ;
53+ if ( s . startsWith ( 'Qk' ) ) return 'image/bmp' ;
54+ return 'image/png' ;
55+ }
56+
57+ function toImageDataUrl ( raw ) {
58+ const value = String ( raw || '' ) . trim ( ) ;
59+ if ( ! value ) return '' ;
60+ if ( value . startsWith ( 'data:image/' ) ) return value ;
61+ const mime = detectBase64ImageMime ( value ) ;
62+ return `data:${ mime } ;base64,${ value } ` ;
63+ }
64+
65+ function pickImageSrc ( item ) {
66+ const rawUrl = String ( item ?. url || '' ) . trim ( ) ;
67+ if ( rawUrl && rawUrl !== 'https://assets.grok.com/' && rawUrl !== 'https://assets.grok.com' ) {
68+ return toAbsoluteUrl ( rawUrl ) ;
69+ }
70+ const b64json = String ( item ?. b64_json || '' ) . trim ( ) ;
71+ if ( b64json ) return toImageDataUrl ( b64json ) ;
72+ const base64 = String ( item ?. base64 || '' ) . trim ( ) ;
73+ if ( base64 ) return toImageDataUrl ( base64 ) ;
74+ return '' ;
75+ }
76+
4677function showUserMsg ( role , content ) {
4778 const wrap = document . createElement ( 'div' ) ;
4879 wrap . className = 'msg' ;
@@ -418,22 +449,25 @@ async function generateImage() {
418449 const res = await fetch ( '/v1/images/generations' , {
419450 method : 'POST' ,
420451 headers,
421- body : JSON . stringify ( { prompt, model, n, response_format : 'url' } ) ,
452+ body : JSON . stringify ( { prompt, model, n } ) ,
422453 } ) ;
423454 const data = await res . json ( ) . catch ( ( ) => ( { } ) ) ;
424455 if ( ! res . ok ) throw new Error ( data ?. error ?. message || data ?. detail || `HTTP ${ res . status } ` ) ;
425456
426457 const items = Array . isArray ( data ?. data ) ? data . data : [ ] ;
427458 if ( ! items . length ) throw new Error ( '没有生成结果' ) ;
428459
460+ let rendered = 0 ;
429461 items . forEach ( ( it ) => {
430- const url = it . url ? String ( it . url ) : it . b64_json ? `data:image/png;base64, ${ String ( it . b64_json ) } ` : '' ;
462+ const url = pickImageSrc ( it ) ;
431463 if ( ! url ) return ;
464+ rendered += 1 ;
432465 const card = document . createElement ( 'div' ) ;
433466 card . className = 'result-card' ;
434467 card . innerHTML = `<img src="${ escapeHtml ( url ) } " alt="image" />` ;
435468 q ( 'image-results' ) . appendChild ( card ) ;
436469 } ) ;
470+ if ( ! rendered ) throw new Error ( '图片返回为空或格式不支持' ) ;
437471 } catch ( e ) {
438472 showToast ( '生图失败: ' + ( e ?. message || e ) , 'error' ) ;
439473 }
0 commit comments