Super Simple PHP / Vanilla Javascript for DALLE3 API (+ Programming Languages Debate!)

After a request the other day from @Daller, I threw together a quick and simple solution with just two PHP files—one for the backend, one for the form—and some vanilla JavaScript (no libraries, just good old AJAX and cURL). Kept it basic to make things easy for those new to DALLE API.

The images are pulled from a URL that DALL·E 3 gives you, but they won’t last forever, so you’ll want to download them if you want to hang onto them. Or, if you’re feeling adventurous, you can modify the code to save the images locally (that’s your homework!).

index.php (frontend)
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Generate Image with DALL·E 3</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        textarea { width: 100%; height: 100px; padding: 10px; font-size: 16px; margin-bottom: 20px; border: 1px solid #ccc; border-radius: 5px; }
        select { width: 100%; padding: 10px; font-size: 16px; margin-bottom: 20px; border: 1px solid #ccc; border-radius: 5px; }
        button { padding: 10px 20px; font-size: 16px; cursor: pointer; background-color: #007bff; color: white; border: none; border-radius: 5px; }
        button:disabled { background-color: #999; cursor: not-allowed; }
        .error { color: red; margin-top: 20px; }
        .image { display: inline-block; margin: 10px; }
        .image img { max-width: 100%; height: auto; }
        #main-image { margin-top: 20px; }
        #history-images { margin-top: 20px; }
        #spinner { display: none; margin-top: 20px; }
    </style>
</head>
<body>

<h1>Generate Image with DALL·E 3</h1>

<form id="imageForm">
    <label for="prompt">Enter a text prompt:</label><br><br>
    <textarea id="prompt" name="prompt" placeholder="Enter your prompt here..."></textarea>
    <br>

    <!-- Add image size options -->
    <label for="size">Select Image Size:</label><br><br>
    <select id="size" name="size">
        <option value="1024x1024">1024x1024</option>
        <option value="1792x1024">1792x1024 (Wide)</option>
        <option value="1024x1792">1024x1792 (Tall)</option>
    </select>
    <br>

    <button type="submit">Generate Image</button>
</form>

<div id="spinner">
    <p>Generating image... Please wait.</p>
</div>

<div id="error" class="error"></div>
<div id="main-image"></div> <!-- Main image display area -->

<h2>History</h2>
<div id="history-images"></div> <!-- History of generated images -->

<script>
document.getElementById('imageForm').addEventListener('submit', function(e) {
    e.preventDefault(); // Prevent default form submission

    const prompt = document.getElementById('prompt').value.trim();
    const size = document.getElementById('size').value;

    if (!prompt) {
        document.getElementById('error').innerText = 'Please enter a valid prompt.';
        return;
    }

    document.getElementById('error').innerText = ''; // Clear previous errors
    document.getElementById('spinner').style.display = 'block'; // Show spinner
    document.querySelector('button').disabled = true; // Disable button

    // Create new AJAX request
    let xhr = new XMLHttpRequest();
    xhr.open('POST', 'genimage.php', true); // Keep pointing to genimage.php
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    // Handle response
    xhr.onload = function() {
        document.getElementById('spinner').style.display = 'none'; // Hide spinner
        document.querySelector('button').disabled = false; // Re-enable button

        if (xhr.status === 200) {
            try {
                let response = JSON.parse(xhr.responseText);
                if (response.error) {
                    document.getElementById('error').innerText = response.error;
                } else if (response.url) {
                    // Show the newly generated image
                    let mainImageDiv = document.getElementById('main-image');
                    mainImageDiv.innerHTML = ''; // Clear current main image
                    let img = document.createElement('img');
                    img.src = response.url;
                    img.alt = 'Generated Image';
                    mainImageDiv.appendChild(img);

                    // Update the session history with the new image
                    let historyDiv = document.getElementById('history-images');
                    let historyImageDiv = document.createElement('div');
                    historyImageDiv.className = 'image';
                    let historyImg = document.createElement('img');
                    historyImg.src = response.url;
                    historyImg.alt = 'Generated Image';
                    historyImageDiv.appendChild(historyImg);
                    historyDiv.appendChild(historyImageDiv); // Add to the history section
                }
            } catch (e) {
                document.getElementById('error').innerText = 'Error parsing response: ' + e.message;
            }
        } else {
            document.getElementById('error').innerText = 'Server error occurred. Status: ' + xhr.status;
        }
    };

    // Handle request errors
    xhr.onerror = function() {
        document.getElementById('spinner').style.display = 'none'; // Hide spinner
        document.querySelector('button').disabled = false; // Re-enable button
        document.getElementById('error').innerText = 'Request failed. Network or server error.';
    };

    // Send request with prompt and selected size
    xhr.send('prompt=' + encodeURIComponent(prompt) + '&size=' + encodeURIComponent(size));
});
</script>

</body>
</html>

…and…

genimage.php (backend)

<?php
session_start();

// Replace with your OpenAI API key
$api_key = 'API-KEY-HERE'; // Use your actual API key here

// Check if prompt and size are provided
if (isset($_POST['prompt']) && isset($_POST['size'])) {
    $prompt = htmlspecialchars(trim($_POST['prompt']));
    $size = htmlspecialchars(trim($_POST['size']));

    if (!empty($prompt) && !empty($size)) {
        // Initialize cURL session
        $ch = curl_init();

        // Payload for the API request
        $payload = json_encode([
            "prompt" => $prompt,
            "n" => 1,
            "model" => "dall-e-3",
            "size" => $size,
            "response_format" => "url",
            "user" => session_id() // Use session ID as user identifier
        ]);

        // Set cURL options
        curl_setopt($ch, CURLOPT_URL, "https://api.openai.com/v1/images/generations");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Content-Type: application/json",
            "Authorization: Bearer $api_key"
        ]);

        // Execute the cURL request
        $response = curl_exec($ch);
        $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($http_status == 200) {
            $data = json_decode($response, true);
            if (isset($data['data'][0]['url'])) {
                $image_url = $data['data'][0]['url'];

                // Store the generated image in the session history
                if (!isset($_SESSION['history'])) {
                    $_SESSION['history'] = [];
                }
                $_SESSION['history'][] = ['prompt' => $prompt, 'images' => [$image_url]];

                // Return the image URL as JSON
                echo json_encode(['url' => $image_url]);
            } else {
                echo json_encode(['error' => 'Failed to generate image.']);
            }
        } else {
            // Handle API or cURL errors
            $data = json_decode($response, true);
            $error_message = isset($data['error']['message']) ? $data['error']['message'] : 'Unknown error occurred.';
            echo json_encode(['error' => $error_message]);
        }
    } else {
        echo json_encode(['error' => 'Invalid prompt or size.']);
    }
} else {
    echo json_encode(['error' => 'No prompt or size provided.']);
}

I’ve tested it on a server, and it’s clunky, but it works! Some limitations compared to ChatGPT DALLE generation (you can’t say, change this or that in the last image), but if you’ve ever wanted to tinker with DALLE API, here’s your chance.

If anyone does make improvements, feel free to share them here to help others out!

8 Likes

Thanks for sharing, I’ll definitely have a look

1 Like

No problem. Like I said, super basic but a good starting point.

Here’s some PHP code for randomly putting together various fantasy prompts…

Quick and Dirty PHP Goblin Shenanigan Art Prompt Generator...
<?php
// Arrays of different environments
$environments = [
    "medieval village", 
    "magical forest", 
    "wizard’s tower", 
    "haunted castle", 
    "dwarven mine", 
    "enchanted meadow", 
    "skyship dock", 
    "crystal cave", 
    "goblin warcamp", 
    "ruined temple"
];

// Associating specific actions with each environment
$specific_actions_by_environment = [
    "medieval village" => [
        "swapping a knight’s helmet with a bucket",
        "tying a villager’s shoelaces together",
        "placing a whoopee cushion under the mayor’s chair",
        "filling a barrel of ale with frogs"
    ],
    "magical forest" => [
        "getting tangled in a vine while trying to swing like a monkey",
        "trying to fish with a broken spear",
        "making friends with a talking tree who tells bad jokes",
        "climbing a tree and getting stuck, yelling for help"
    ],
    "wizard’s tower" => [
        "mixing potions that explode into clouds of glitter",
        "turning invisible but forgetting their feet are showing",
        "accidentally summoning a tiny but angry fire elemental",
        "dropping a scroll and summoning a flock of ravens"
    ],
    "haunted castle" => [
        "scaring villagers with a floating sheet and a candle",
        "moving objects in the castle without being seen",
        "pretending to be a ghost by howling in the hallways",
        "replacing all the skeletons’ bones with sticks"
    ],
    "dwarven mine" => [
        "stealing a miner’s pickaxe and using it as a toothpick",
        "rolling boulders down a mine shaft for fun",
        "tying dynamite fuses together to prank the dwarves",
        "eating precious gems thinking they are candy"
    ],
    "enchanted meadow" => [
        "befriending a group of squirrels and causing mayhem",
        "stealing flowers from a fairy circle",
        "chasing butterflies while giggling",
        "trying to ride a deer and falling off"
    ],
    "skyship dock" => [
        "untying ropes from a skyship to see it float away",
        "pretending to be the captain and giving bad orders",
        "climbing the rigging of a skyship and getting stuck",
        "filling a balloon with air and letting it fly around the dock"
    ],
    "crystal cave" => [
        "stealing crystals and trying to juggle them",
        "using a crystal to make funny reflections on the cave walls",
        "pretending to be a stalactite and scaring adventurers",
        "singing loudly to hear their voice echo"
    ],
    "goblin warcamp" => [
        "tripping other goblins during training exercises",
        "painting mustaches on goblin flags",
        "swapping weapons with rubber chickens",
        "setting fire to tents while laughing"
    ],
    "ruined temple" => [
        "pretending to be a statue to scare adventurers",
        "stealing an ancient artifact and wearing it as a hat",
        "climbing onto crumbling pillars and yelling for help",
        "drawing mustaches on sacred murals"
    ]
];

// Arrays for genders, races, and actions at the end of the prompt
$genders = ["male", "female"];
$races = ["elf", "dwarf", "human", "halfling", "half-orc", "tiefling"];
$end_actions = [
    "looks on unamused",
    "crosses their arms with a smirk",
    "sighs in frustration",
    "chuckles quietly",
    "raises an eyebrow",
    "shakes their head"
];

// Randomly select an environment
$random_environment = $environments[array_rand($environments)];

// Randomly select an action based on the chosen environment
$random_action = $specific_actions_by_environment[$random_environment][array_rand($specific_actions_by_environment[$random_environment])];

// Randomly select a gender, race, and end action
$random_gender = $genders[array_rand($genders)];
$random_race = $races[array_rand($races)];
$random_end_action = $end_actions[array_rand($end_actions)];

// Determine if the end tag should appear (e.g., 30% chance)
$include_end_tag = rand(1, 100) <= 30; // Set to desired percentage (30% chance in this example)

// Create the generalized prompt with or without the added character and action
$prompt_template = "A mischievous DND FANTASY TABLETOP GOBLIN in a {environment} setting, involved in a humorous or chaotic activity like {specific_action}, with bright, playful colors. The scene is illustrated in an EPIC WIDE WATERCOLOR ILLUSTRATION style, featuring detailed elements of the {environment}, and the goblin’s mischievous grin or expression taking center stage.";

if ($include_end_tag) {
    $prompt_template .= " A {random_gender} {random_race} {random_end_action}.";
}

// Replace placeholders with actual values
$prompt = str_replace(
    ['{environment}', '{specific_action}', '{random_gender}', '{random_race}', '{random_end_action}'],
    [$random_environment, $random_action, $random_gender, $random_race, $random_end_action],
    $prompt_template
);

// Output the final prompt
echo $prompt;
?>
1 Like

Tanks very very much, very kind! :+1:

I checked some Git’s, but nothing was so simple and easy to start with.

I sadly came too late to the D&D, i would like it as a teen, and would maybe help coding for it today for the LLMs. I am a storyteller and very visual by hard, but like it is, it is very difficult to live as a artist in this world. (Now i’m generating pictures like crazy… :smile:)

1 Like

Come to a other world…

3 Likes

Woot! It actually worked!?!? Small smile.

Have fun with it, but those charges do add up quickly!

Hopefully some better devs will come along and improve the code.

An option to select style “Vivid” or “Natural” would be easy to add… and auto-saving the images with ImageMagick or something.

Didn’t want to overwhelm you, though, in just getting started out. :slight_smile:

1 Like

That’s cool, I am coding myself a bit. And automatic download is at the top of the list, I sometimes forget to download some images…
(I sadly detected that the API is way more expensive than the Plus.)

(The image is just uploaded now, I downloaded the script just now.)

1 Like

Ah, gotcha. I did test it, so it should work okay.

If I have time, I’ll see if I can’t add ImageMagick to save the files locally. I have it coded out - just need to change it for use here… Stay tuned…

Or would love to see what you do with it! :wink:

1 Like

Here my very quick solution for auto download, i wished the browser plus version for DallE would have it.
But i have no API key now, i used a dummy script to simulate a image return. i hope it works with API too…
(I had not much sleep, forgive some errors, in case.)

<?php
session_start();
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Generate Image with DALL·E 3</title>
	<style>
		body {
			font-family: Arial, sans-serif;
			margin: 20px;
		}

		textarea {
			width: 100%;
			height: 100px;
			padding: 10px;
			font-size: 16px;
			margin-bottom: 20px;
			border: 1px solid #ccc;
			border-radius: 5px;
		}

		select {
			width: 100%;
			padding: 10px;
			font-size: 16px;
			margin-bottom: 20px;
			border: 1px solid #ccc;
			border-radius: 5px;
		}

		button {
			padding: 10px 20px;
			font-size: 16px;
			cursor: pointer;
			background-color: #007bff;
			color: white;
			border: none;
			border-radius: 5px;
		}

		button:disabled {
			background-color: #999;
			cursor: not-allowed;
		}

		.error {
			color: red;
			margin-top: 20px;
		}

		.image {
			display: inline-block;
			margin: 0px;
		}

		.image img {
			max-width: 100%;
			height: auto;
		}

		#main-image {
			margin-top: 20px;
		}

		#history-images {
			margin-top: 20px;
			display: flex;
			flex-wrap: wrap;
			gap: 3px;
		}

		#history-images .image img {
			width: 240px;
			height: auto;
		}

		#spinner {
			display: none;
			margin-top: 20px;
		}

		.flex-container {
			display: flex;
			align-items: center;
			margin-top: 10px;
		}

		.flex-container label {
			margin-left: 10px;
		}
	</style>
</head>
<body>

<h1>Generate Image with DALL·E 3</h1>

<form id="imageForm">
    <label for="prompt">Enter a text prompt:</label><br><br>
    <textarea id="prompt" name="prompt" placeholder="Enter your prompt here..."></textarea>
    <br>

    <!-- Add image size options -->
    <label for="size">Select Image Size:</label><br><br>
    <select id="size" name="size">
        <option value="1024x1024">1024x1024</option>
        <option value="1792x1024">1792x1024 (Wide)</option>
        <option value="1024x1792">1024x1792 (Tall)</option>
    </select>
    <br>

    <div class="flex-container">
        <input type="checkbox" id="autoDownload" name="autoDownload" checked>
        <label for="autoDownload">Auto-download image</label>
    </div>

    <button type="submit">Generate Image</button>
</form>

<div id="spinner">
    <p>Generating image... Please wait.</p>
</div>

<div id="error" class="error"></div>
<div id="main-image"></div> <!-- Main image display area -->

<h2>History</h2>
<div id="history-images"></div> <!-- History of generated images -->

<script>
document.getElementById('imageForm').addEventListener('submit', function(e) {
    e.preventDefault(); // Prevent default form submission

    const prompt = document.getElementById('prompt').value.trim();
    const size = document.getElementById('size').value;
    const autoDownload = document.getElementById('autoDownload').checked; // Check auto-download setting

    if (!prompt) {
        document.getElementById('error').innerText = 'Please enter a valid prompt.';
        return;
    }

    document.getElementById('error').innerText = ''; // Clear previous errors
    document.getElementById('spinner').style.display = 'block'; // Show spinner
    document.querySelector('button').disabled = true; // Disable button

    // Create new AJAX request
    let xhr = new XMLHttpRequest();
    xhr.open('POST', 'genimage.php', true); // Point to genimage.php
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    // Handle response
    xhr.onload = function() {
        document.getElementById('spinner').style.display = 'none'; // Hide spinner
        document.querySelector('button').disabled = false; // Re-enable button

        if (xhr.status === 200) {
            try {
                let response = JSON.parse(xhr.responseText);
                if (response.error) {
                    document.getElementById('error').innerText = response.error;
                } else if (response.url) {
                    // Show the newly generated image
                    let mainImageDiv = document.getElementById('main-image');
                    mainImageDiv.innerHTML = ''; // Clear current main image
                    let img = document.createElement('img');
                    img.src = response.url;
                    img.alt = 'Generated Image';
                    mainImageDiv.appendChild(img);

                    // Generate timestamp for the filename
                    let now = new Date();
                    let timestamp = now.getFullYear() + '-' +
                        String(now.getMonth() + 1).padStart(2, '0') + '-' +
                        String(now.getDate()).padStart(2, '0') + ' ' +
                        String(now.getHours()).padStart(2, '0') + '.' +
                        String(now.getMinutes()).padStart(2, '0') + '.' +
                        String(now.getSeconds()).padStart(2, '0');

                    // Truncate the prompt to a maximum of 150 characters
                    let truncatedPrompt = prompt.substring(0, 150);

                    // Create the full filename (use webp since OpenAI sends webp format)
                    let filename = `DALL·E ${timestamp} - ${truncatedPrompt}.webp`;

                    // Conditionally trigger the download if auto-download is enabled
                    if (autoDownload) {
                        let downloadLink = document.createElement('a');
                        downloadLink.href = response.url;
                        downloadLink.download = filename; // Set the generated filename
                        downloadLink.style.display = 'none'; // Hide the link
                        document.body.appendChild(downloadLink);
                        downloadLink.click(); // Trigger the download
                        document.body.removeChild(downloadLink); // Remove the link after download
                    }

                    // Update the session history with the new image
                    let historyDiv = document.getElementById('history-images');
                    let historyImageDiv = document.createElement('div');
                    historyImageDiv.className = 'image';
                    let historyImg = document.createElement('img');
                    historyImg.src = response.url;
                    historyImg.alt = 'Generated Image';
                    historyImageDiv.appendChild(historyImg);
                    historyDiv.appendChild(historyImageDiv); // Add to the history section
                }
            } catch (e) {
                document.getElementById('error').innerText = 'Error parsing response: ' + e.message;
            }
        } else {
            document.getElementById('error').innerText = 'Server error occurred. Status: ' + xhr.status;
        }
    };

    // Handle request errors
    xhr.onerror = function() {
        document.getElementById('spinner').style.display = 'none'; // Hide spinner
        document.querySelector('button').disabled = false; // Re-enable button
        document.getElementById('error').innerText = 'Request failed. Network or server error.';
    };

    // Send request with prompt and selected size
    xhr.send('prompt=' + encodeURIComponent(prompt) + '&size=' + encodeURIComponent(size));
});
</script>

</body>
</html>

1 Like

Nice! Well done.

I’ll give it a look later if I have some time.

Thanks for sharing with the community!

1 Like

Super simple Python procedural Dall-E script, in this post:

This one-shot will pop up a tkinter image of what was received besides saving it.

I’ll leave as an exercise to your ingenuity to make it have the DALL-E 3 options (that are simple comments you can remove) as choices in a user interface, to loop and keep asking you for more images, to place your prompt idea in a wrapper to ensure less modification…

1 Like

Sweet. Thanks. They were looking specifically for PHP, but yours is a much better job/post despite being in Python. :wink: I wanted to do non-library too in order to keep it "super simple’…

I wonder if we shouldn’t have a good post somewhere with all member tools/scripts that are super useful. You’ve shared a lot of great code over the years… others too…

ETA: I sound like that ungrateful “Next!” lady on Reddit lol

php - might as well write your chatbot in .aspx

Not a good engine for making API calls with no backend - hosting admin decides to down to upgrade php? Free code for everyone!
It is not going to be good for examples, because you’ll likely be interfacing with an unknown database in practice.
New style is to offload your rendering onto the browser client.

Locally, why would one not use Python for an interpreted language - powered by binaries?
Plus, I’m willfully no good at it, primarily having hacked at appliances and WordPress of others that are no good at it.

1 Like

Ooh I feel an old school programming language debate brewing. Hehe.

I hear you, though. PHP was front and center for a long time, but it’s pretty much outdated now.

I used AJAX to send the request to a second script. Could be locked down with checking session key likely.

No worries at not wanting to muck about with lowly PHP scripts! :wink:

I think once Daller noticed the API charges racking up, they went back to ChatGPT which is quite the value! Hah. It’s nice to have a back-up, though, when it does go down.

The best advice (yours) is to stick to modern + library be it Python, Javascript, or whatever…

Now… You wanna debate why JAVA is the best language ever, @_j ? :grin:

1 Like

Here’s a garbage collection…

1 Like

Hey, while I have you…

@stevenic and I were discussing “AI” programming languages… As in new not seen yet programming languages that AI will devise to code its own code.

Any thoughts on that? My first thought was that it would likely happen as we’ll be “talking to computers” like on Star Trek, etc. but it’s also kinda dangerous if an AI can script in a language humans can’t read…

That readability is why so many languages (like Java) are clunky, no?

Summary

I’m old enough to have been around when the first PCs were sold, and I rendered the very first fractals on a C128… Nobody here cares about that, but I’m deeply disappointed with how the whole programming language industry has developed. I don’t like a single language, I can just about tolerate C#, but with great pain… Today programming languages are nothing for aesthetics. The proof that all languages are BS is that there are so many of them. The same applies to the 100 Linux distributions. If it were well done, there would only be 1 + Assembler.

I was once desperate enough to try building a compiler. It’s completely mad to even think about it, so you can imagine the pain I was trying to escape from. Everything I have is outdated, and I’ve decided not to spend any more of my life learning languages that I don’t like. So, I’m very grateful for the PHP script from @PaulBellow. :smile: :+1:

I still hope that AI might one day develop a new language for humans, seam humans can not do it. I don’t know if I’ll live to see it.

Haaaaahahhahhhhhhaaaa, did I just start a programming language debate now?.. Yes, the pains and frustrations are still there, which is why I’m no longer learning Python. :dotted_line_face: Live is toooo short. :laughing:

1 Like

I don’t think we can count on a path of new emergent AI abilities in language models offered to the public, such as speaking to another AI in a language they invented or encoded and can interpret blind, like early GPT-4 could do. You get a chatbot that can be a chatbot at minimum expense, and its idea of a secret language is emoji. If you’ve got a rack of H100 to run it, Meta AI still comes with supervised training.

I was writing prompts made out of AI invented abbreviation and coding language to instill behaviors, written by AI. Now completely unintelligible to AI models.

You can have AI write assembly and virtually “compile” and link ELF binary if you want code hard to read that says “hello world”, but that is another layer of quality that is lost to post-training and sparsification.

So the spoiler is the $100M training investment is doled out solely by those that have a narrative of never-seen amazing AI being an internal breakthrough they can’t share - just needing IPO funds.

1 Like

I think this language just for machines already exists, it’s called assembler. It will simply be an assembly language that can communicate with modern hardware, nothing more. The principles haven’t changed, not even with AI. All software is executed by hardware, which has a few primitive basic functions with which everything is assembled. In the end, they are grouped into functions, and those into modules, and those again into assemblies, and so on.

I think an AI developing its own language is nothing more than a collection of highly complex structured functions and modules that are structured in such a way that humans can no longer understand them. And in fact, they already can’t. Most software is so complex that no one can truly understand it anymore. Instead of correcting errors, it’s often faster to rewrite the code from scratch.

It will simply be a language that accesses neural network clusters, like functions.

Maybe some have noticed this from texts I’ve written elsewhere, but I’m not afraid of AI itself, I’m afraid of those who own it.

1 Like

Right, but I was wondering if we’ll see less human-readable languages?

Or maybe the assembly code will get even better? Not sure that’s possible lol

I remember early on Facebook had a bunch of press about having to shut down chat bots that invented their own language, but I think the media hyped that into more than it was in reality…

I do think humans being able to read it will be important for safety, though.

Can someone ping Ilya and hope he shows up to offer his input? Nevermind, I heard he’s super busy figuring out safety with SSI! :wink:

I’ve done a bit of this (I think) believe it or not. And yes, the lack of instruct models for the GPT-4 line made things a bit more difficult for that method.

Things are constantly changing, though. I actually thought we’d see more “black box” things like the o1 model where a lot of the "reasoning’ is done behind the scenes…