19<Url type="text/html" method="get" template="https://janpaul123-valtownsemanticsearch.web.val.run/search?q={searchTerms}"/>
20<Url type="application/opensearchdescription+xml" template="https://janpaul123-valtownsemanticsearch.web.val.run/opensearch.xml"/>
21<Image height="16" width="16" type="image/png">https://pomdtr-favicons.web.val.run/val-town</Image>
22<moz:SearchForm>https://janpaul123-valtownsemanticsearch.web.val.run/search</moz:SearchForm>
23</OpenSearchDescription>`,
formStylesmain.tsx2 matches
112}
113114.image-container {
115display: flex;
116flex-direction: column;
120}
121122.image-footer {
123display: flex;
124justify-content: space-between;
textToImagePlaygroundmain.tsx13 matches
1import { generateImageHandler } from 'https://esm.town/v/iamseeley/generateImageHandler';
2import { realtimeGenerateImageHandler } from 'https://esm.town/v/iamseeley/realtimeGenerateImageHandler';
3import { formStyles } from "https://esm.town/v/iamseeley/formStyles";
49<meta charset="UTF-8">
10<meta name="viewport" content="width=device-width, initial-scale=1.0">
11<title>Image Generator</title>
12<style>
13${formStyles}
16<body>
17<header>
18<h2>Text to Image Playground</h2>
19<a target="blank" href="https://fal.ai">fal.ai</a>
20</header>
25</select> -->
26
27<form id="imageForm">
28<label for="model">Model:</label>
29<select id="model" name="model">
40</div>
41<div class="buttons">
42<button type="submit">Generate Image</button>
43<button type="button" id="resetButton">Reset</button>
44</div>
63const type = this.value;
64if (type === 'regular') {
65document.getElementById('imageForm').style.display = 'block';
66document.getElementById('realtimeForm').style.display = 'none';
67} else {
68document.getElementById('imageForm').style.display = 'none';
69document.getElementById('realtimeForm').style.display = 'block';
70}
74window.addEventListener('DOMContentLoaded', (event) => {
75document.getElementById('generationType').value = 'regular';
76document.getElementById('imageForm').style.display = 'block';
77document.getElementById('realtimeForm').style.display = 'none';
78});
90status: 200,
91});
92} else if (req.method === 'POST' && url.pathname === '/generate-image') {
93return generateImageHandler(req);
94// } else if (req.method === 'POST' && url.pathname === '/realtime-generate-image') {
95// return realtimeGenerateImageHandler(req);
96} else {
97return new Response('Not Found', { status: 404 });
realtimeFormLogicmain.tsx16 matches
8promptInput.addEventListener("input", () => {
9clearTimeout(debounceTimeout);
10debounceTimeout = setTimeout(generateImages, 500);
11});
1213async function generateImages() {
14resultDiv.innerHTML = ''; // Clear previous results
152526try {
27const response = await fetch('/realtime-generate-image', {
28method: 'POST',
29headers: {
42if (data.urls && Array.isArray(data.urls)) {
43data.urls.forEach(url => {
44appendImage(url, model);
45});
46} else {
51console.log('Request aborted');
52} else {
53console.error('Error generating images:', error);
54// Handle the error, display an error message, etc.
55}
59}
6061function appendImage(imageUrl, model) {
62const imgElement = new Image();
63imgElement.src = imageUrl;
64imgElement.alt = "Generated Image";
65imgElement.className = 'generated-image';
6667const loadingContainer = document.createElement('div');
71loadingShimmer.className = 'loading-shimmer';
7273const imageFooter = document.createElement('div');
74imageFooter.className = 'image-footer';
7576const modelElement = document.createElement('p');
83removeButton.onclick = () => loadingContainer.remove();
8485imageFooter.appendChild(modelElement);
86imageFooter.appendChild(removeButton);
8788loadingContainer.appendChild(loadingShimmer);
89loadingContainer.appendChild(imageFooter);
90resultDiv.appendChild(loadingContainer);
9193loadingShimmer.remove();
94imgElement.style.display = 'block';
95loadingContainer.insertBefore(imgElement, imageFooter);
96};
97
realtimeGenerateImageHandlermain.tsx13 matches
5});
67export const realtimeGenerateImageHandler = async (req: Request): Promise<Response> => {
8const { prompt, model } = await req.json();
91819try {
20console.log("Starting real-time image generation...");
2122const result = await new Promise((resolve, reject) => {
27},
28onError: (error) => {
29console.error("Error during real-time image generation:", error);
30reject(error);
31},
35connection.send({
36prompt,
37num_images: 4,
38});
39});
41console.log("Generation completed. Result:", result);
4243if (result.images && Array.isArray(result.images)) {
44const imageUrls = result.images.map((imageObj: any) => {
45if (imageObj && imageObj.url) {
46return imageObj.url; // Assuming there's a 'url' property in the image object
47} else {
48console.warn("Invalid image object:", imageObj);
49return null; // or handle invalid case accordingly
50}
51});
5253write(JSON.stringify({ urls: imageUrls }));
54} else {
55console.error("Invalid or missing 'images' property in the result. Result:", result);
56write(JSON.stringify({ error: "Invalid response received from the server." }));
57}
5859console.log("All image data sent");
60} catch (error) {
61console.error("Error in realtimeGenerateImageHandler:", error);
62write(JSON.stringify({ error: error.message }));
63}
realtimeFormLogicREADME.md1 match
1Migrated from folder: image_gen/realtimeFormLogic
1Migrated from folder: image_gen/realtimeGenerateImageHandler
generateImageHandlermain.tsx7 matches
5});
67export const generateImageHandler = async (req: Request): Promise<Response> => {
8try {
9const {
12prompt,
13negative_prompt = "",
14image_size,
15num_inference_steps,
16guidance_scale,
17seed,
18num_images,
19enable_safety_checker,
20sync_mode,
28prompt,
29negative_prompt,
30image_size,
31num_inference_steps: parseInt(num_inference_steps),
32guidance_scale: guidance_scale ? parseFloat(guidance_scale) : undefined,
33seed: seed ? parseInt(seed) : undefined,
34num_images: parseInt(num_images),
35enable_safety_checker: enable_safety_checker !== undefined ? enable_safety_checker : true,
36sync_mode: sync_mode !== undefined ? sync_mode : undefined,
40});
4142const imageUrls = result.images.map((image: any) => image.url);
4344return new Response(JSON.stringify({ imageUrls }), {
45headers: { "Content-Type": "application/json" },
46status: 200,
1/** @jsxImportSource npm:hono@3/jsx */
2import { fileToDataURL } from "https://esm.town/v/stevekrouse/fileToDataURL";
3import { modifyImage } from "https://esm.town/v/stevekrouse/modifyImage";
4import { chat } from "https://esm.town/v/stevekrouse/openai";
5import { Hono } from "npm:hono@3";
50type="file"
51id="file"
52accept="image/*"
53name="file"
54/>
115{
116role: "user",
117content: `What is the calorie count in this image?`,
118},
119{
120role: "user",
121content: [{
122type: "image_url",
123image_url: {
124url: dataURL,
125},
fileToDataURLREADME.md1 match
1# File to Data URL
23Was built for uploading base64 encoded images to GPT4v