maximerenou / bing-ai
Bing AI adapter
Installs: 1 400
Dependents: 0
Suggesters: 0
Security: 0
Stars: 42
Watchers: 3
Forks: 13
Open Issues: 1
Requires
- php: >=7.1
- ext-curl: *
- ratchet/pawl: ^0.4.1
README
New feature: send images in chat 🔥
Bing AI client
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:
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?
- Navigate to bing.com
- Sign in using your Microsoft account
- Back on bing.com, go to Bing Chat page and send a message (CAPTCHA verification occurs sometimes)
- Then, right-click and select "Inspect" - the browser console appears
- Go to "Application" tab
- Select "Cookies" > "https://www.bing.com" in the sidebar
- Search for "_U" cookie
- 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. CheckMessage.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 withexamples/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.