maximerenou/bing-ai

This package is abandoned and no longer maintained. No replacement package was suggested.
There is no license information available for the latest version (1.2) of this package.

Bing AI adapter

1.2 2023-08-21 16:23 UTC

This package is auto-updated.

Last update: 2024-04-21 17:54:04 UTC


README

New feature: send images in chat 🔥

Bing + PHP

Bing AI client

License Latest Stable Version PHP version cURL extension required

This is an unofficial PHP client for Bing AI, including Chat (GPT-4) and Image Creator (DALL-E).

Installation

composer require maximerenou/bing-ai

Demo

This demo program uses both Chat and Image Creator:

Demo

Source: examples/multi.php.

Usage

First, you need to sign in on bing.com and get your _U cookie.

❗ Make sure you send a first message to Bing Chat before using your cookie (CAPTCHA bypass)

How to get this cookie?
  1. Navigate to bing.com
  2. Sign in using your Microsoft account
  3. Back on bing.com, go to Bing Chat page and send a message (CAPTCHA verification occurs sometimes)
  4. Then, right-click and select "Inspect" - the browser console appears
  5. Go to "Application" tab
  6. Select "Cookies" > "https://www.bing.com" in the sidebar
  7. Search for "_U" cookie
  8. Copy its content
How to check if my cookie is working properly?
use MaximeRenou\BingAI\BingAI;

// $cookie - your "_U" cookie from bing.com
$ai = new BingAI($cookie);
$valid = $ai->checkCookie();

Chat AI

Demo: clone this repo, edit and run examples/chat.php.

use MaximeRenou\BingAI\BingAI;
use MaximeRenou\BingAI\Chat\Prompt;

// $cookie - your "_U" cookie from bing.com
$ai = new BingAI($cookie);

$conversation = $ai->createChatConversation();

// $text - Text-only version of Bing's answer
// $cards - Message objects array
list($text, $cards) = $conversation->ask(new Prompt("Hello World"));

$cards contains all "messages" exchanged with Bing AI. It can be text (prompt or answer), signals, suggestions, image generation requests, etc. Check Message.php to learn more about its format.

🔥 Image analysis

You may attach an image to your message:

$prompt = new Prompt("How cute is this animal?");
$prompt->withImage('/path/to/panda.png');
//or: $prompt->withImage($raw_image_data, true);

$conversation->ask($prompt, ...);

Try it! Type $image at the end of your message with examples/chat.php.

Real-time / progressive answer

You may pass a function as second argument to get real-time progression:

// $text - Incomplete text version
// $cards - Incomplete messages fleet
list($final_text, $final_cards) = $conversation->ask($prompt, function ($text, $cards) {
    echo $text;
});
Locale and location preferences
$conversation = $ai->createChatConversation()
    ->withLocation($latitude, $longitude, $radius) // Optional
    ->withPreferences('fr-FR', 'fr-FR', 'FR'); // Optional
Tone choice
use MaximeRenou\BingAI\Chat\Tone;

$conversation = $ai->createChatConversation()
    ->withTone(Tone::Creative); // Optional

// Choices:
// Tone::Balanced (default)
// Tone::Creative
// Tone::Precise
Resume a conversation

If you want to resume a previous conversation, you can retrieve its identifiers:

// Get current identifiers
$identifiers = $conversation->getIdentifiers();

// ...
// Resume conversation with $identifiers parameter, and number of previous questions asked
$conversation = $ai->resumeChatConversation($identifiers, 1);
Text generation
$subject = "Internet memes";
$tone = 'funny';
$type = 'blog post';
$length = 'short';

$prompt = new Prompt("Please write a *$length* *$type* in a *$tone* style about `$subject`. Please wrap the $type in a markdown codeblock.");

$conversation->ask($prompt->withoutCache(), ...)

To prevent answers like "I have already written [...]", you can disable cache for your prompt with withoutCache().

Handle throttling and kicks

Bing is limiting messages count per conversations. You can monitor it by calling getRemainingMessages() after every interaction.

$remaining = $conversation->getRemainingMessages();

if ($remaining === 0) {
    // You reached the limit
}

After every interaction, you should also check if you have been kicked from the conversation:

if ($conversation->kicked()) {
    // You have been kicked, you should start a new conversation
}

You may combine both checks with:

if ($conversation->ended()) {
    // You reached the limit or have been kicked
}

Image Creator

Demo: clone this repo, edit and run examples/images.php.

use MaximeRenou\BingAI\BingAI;

// $cookie - your "_U" cookie from bing.com
$ai = new BingAI($cookie);

$creator = $ai->createImages("A 3D teddy bear");

$creator->wait();

// Finally, get images URLs
if (! $creator->hasFailed()) {
    $images = $creator->getImages();
}

Image generation can become slower after consuming all of your "boosts". Check the section below to stay aware of your remaining boosts.

Check remaining boosts
$creator = $ai->getImageCreator();

$remaining_boosts = $creator->getRemainingBoosts();
Asynchronous generation You may quit after calling `createImages()` and check generation later using its ID:
$prompt = "A 3D teddy bear";
$creator = $ai->createImages($prompt);
$generation_id = $creator->getGenerationId();

// ...

$creator = $ai->getImageCreator();
$creator->resume($generation_id, $prompt);
Manually wait Instead of calling `$creator->wait();` you can loop by yourself:
do {
    sleep(1);
} while ($creator->isGenerating());

Disclaimer

Using Bing AI outside bing.com may violate Bing terms. Use it at your own risk. Bing is a trademark of Microsoft.