| 1906 | 1906 | const data = await generateResponse.json(); |
| 1907 | 1907 | console.debug('Z.AI image response:', data); |
| 1908 | 1908 | |
| 1909 | 1909 | const urlurlString = String(data?.data?.[0]?.url ?? ''); |
| 1910 | 1910 | if (!urlurlString || !isValidUrl(url) || !new URL(url).hostname.endsWith('.z.ai'urlString)) { |
| 1911 | 1911 | console.warn('Z.AI returned an invalid image URL.'); |
| 1912 | 1912 | return response.sendStatus(500); |
| 1913 | 1913 | } |
| 1914 | 1914 | |
| 1915 | + const url = new URL(urlString); |
| 1916 | + if (!url.hostname.endsWith('.z.ai') && !url.hostname.endsWith('.ufileos.com')) { |
| 1917 | + console.warn('Z.AI returned a URL with an unrecognized hostname.'); |
| 1918 | + return response.sendStatus(500); |
| 1919 | + } |
| 1920 | + |
| 1921 | + for (let attempt = 0; attempt < 5; attempt++) { |
| 1915 | 1922 | const imageResponse = await fetch(url); |
| 1916 | 1923 | if (!imageResponse.ok) { |
| 1924 | + // Sometimes the URL is valid but the image isn't immediately available |
| 1925 | + if (imageResponse.status === 404) { |
| 1926 | + console.info('Z.AI image not found yet, retrying...', { attempt: attempt + 1 }); |
| 1927 | + await delay(1000); |
| 1928 | + continue; |
| 1929 | + } |
| 1930 | + |
| 1917 | 1931 | console.warn('Z.AI image fetch returned an error. Status:', imageResponse.status, imageResponse.statusText); |
| 1918 | 1932 | return response.sendStatus(500); |
| 1919 | 1933 | } |
| 1920 | 1934 | |
| 1921 | 1935 | const buffer = await imageResponse.arrayBuffer(); |
| 1922 | 1936 | const image = Buffer.from(buffer).toString('base64'); |
| 1923 | 1937 | const format = path.extname(url.pathname).substring(1).toLowerCase() || 'png'; |
| 1924 | 1938 | |
| 1925 | 1939 | return response.send({ image, format }); |
| 1940 | + } |
| 1941 | + |
| 1942 | + console.warn('Z.AI image was not available after multiple attempts.'); |
| 1943 | + return response.sendStatus(500); |
| 1926 | 1944 | } catch (error) { |
| 1927 | 1945 | console.error(error); |
| 1928 | 1946 | return response.sendStatus(500); |