From 356b885362bad2cf4645da9bd69047e7c6bee9fa Mon Sep 17 00:00:00 2001 From: JE-Chen <33644111+JE-Chen@users.noreply.github.com> Date: Tue, 6 Feb 2024 08:32:09 +0800 Subject: [PATCH 1/4] Refactor and update Refactor * refactor get message on ask Update options set --- pyproject.toml | 6 +- re_edge_gpt/chat/chathub.py | 18 +- re_edge_gpt/chat/re_edge_gpt.py | 72 ++- re_edge_gpt/chat/request.py | 11 +- re_edge_gpt/image/upload_image.py | 21 +- re_edge_gpt/utils/constants.py | 52 +- re_edge_gpt/utils/conversation_style.py | 83 +-- requirements.txt | 1 + dev.toml => stable.toml | 6 +- test/source/example_reponse.json | 573 ++++++++++++++++++ test/unit_test/back-end/manual_test/test.jpg | Bin 0 -> 88731 bytes .../back-end/manual_test/test_bot_manual.py | 6 +- .../manual_test/test_bot_with_file.py | 2 +- 13 files changed, 746 insertions(+), 105 deletions(-) rename dev.toml => stable.toml (94%) create mode 100644 test/source/example_reponse.json create mode 100644 test/unit_test/back-end/manual_test/test.jpg diff --git a/pyproject.toml b/pyproject.toml index 427e5c7..2e92ccb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,13 +5,13 @@ requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] -name = "re_edge_gpt" -version = "0.0.28" +name = "re_edge_gpt_dev" +version = "0.0.32" authors = [ { name = "JE-Chen", email = "jechenmailman@gmail.com" }, ] dependencies = [ - "aiohttp", "certifi", "httpx", "prompt_toolkit", "requests", "rich", "regex" + "aiohttp", "certifi", "httpx", "prompt_toolkit", "requests", "rich", "regex", "Brotli" ] description = "Microsoft's Bing Chat AI" requires-python = ">=3.9" diff --git a/re_edge_gpt/chat/chathub.py b/re_edge_gpt/chat/chathub.py index 7357afe..a184ecc 100644 --- a/re_edge_gpt/chat/chathub.py +++ b/re_edge_gpt/chat/chathub.py @@ -80,7 +80,8 @@ async def ask_stream( locale: str = guess_locale(), # Use for attachment attachment: dict = None, - autosave: bool = True + remove_options: list = None, + add_options: list = None ) -> Generator[bool, Union[dict, str], None]: """ """ if self.encrypted_conversation_signature is not None: @@ -107,14 +108,21 @@ async def ask_stream( image_url = None if attachment is not None: if attachment.get("image_url") is not None: - response = await upload_image_url(**attachment, conversation_id=self.conversation_id) + response = await upload_image_url( + **attachment, conversation_id=self.conversation_id, cookies=cookies) else: - response = await upload_image(**attachment) + response = await upload_image( + **attachment, conversation_id=self.conversation_id, cookies=cookies) if response: image_url = f"https://www.bing.com/images/blob?bcid={response}" # Construct a ChatHub request - if autosave is False and "autosave" in conversation_style.value: - conversation_style.value.remove("autosave") + if remove_options is not None: + for option in remove_options: + if option in remove_options: + conversation_style.value.remove(option) + if add_options is not None: + for option in add_options: + conversation_style.value.append(option) self.request.update( prompt=prompt, conversation_style=conversation_style, diff --git a/re_edge_gpt/chat/re_edge_gpt.py b/re_edge_gpt/chat/re_edge_gpt.py index 16758fd..05c172c 100644 --- a/re_edge_gpt/chat/re_edge_gpt.py +++ b/re_edge_gpt/chat/re_edge_gpt.py @@ -6,7 +6,6 @@ from .chathub import * from .conversation import * from .request import * -from re_edge_gpt.utils.utilities import * class Chatbot: @@ -53,7 +52,8 @@ async def ask( locale: str = guess_locale(), simplify_response: bool = False, attachment: dict[str, str] = None, - autosave: bool = True + remove_options: list = None, + add_options: list = None ): """ Ask a question to the bot @@ -72,7 +72,8 @@ async def ask( attachment={"filename": r""}) For base64 image using attachment={"base64_image": r""}) - :param autosave: add autosave on request + :param remove_options remove options from Style + :param add_options add options to Style """ async for final, response in self.chat_hub.ask_stream( prompt=prompt, @@ -82,46 +83,51 @@ async def ask( search_result=search_result, locale=locale, attachment=attachment, - autosave=autosave + remove_options=remove_options, + add_options=add_options ): if final: if not simplify_response: return response - messages_left = response["item"]["throttling"][ - "maxNumUserMessagesInConversation" - ] - response["item"]["throttling"].get( + messages_left = (response.get("item").get("throttling").get("maxNumUserMessagesInConversation") + - response.get("item").get("throttling").get( "numUserMessagesInConversation", 0, - ) + )) if messages_left == 0: raise Exception("Max messages reached") - message = "" - for msg in reversed(response["item"]["messages"]): - if msg.get("adaptiveCards") and msg["adaptiveCards"][0]["body"][ - 0 - ].get("text"): - message = msg - break + message = {} + for msg in reversed(response.get("item").get("messages")): + if msg.get("author") == "bot": + old_message = message.get("text") + if old_message: + old_message = old_message + " \n " + else: + old_message = "" + message.update({ + "author": "bot", + "text": old_message + msg.get("text") + }) if not message: raise Exception("No message found") - suggestions = [ - suggestion["text"] - for suggestion in message.get("suggestedResponses", []) - ] - adaptive_cards = message.get("adaptiveCards", []) - sources = ( - adaptive_cards[0]["body"][0].get("text") if adaptive_cards else None - ) - sources_link = ( - adaptive_cards[0]["body"][-1].get("text") - if adaptive_cards - else None - ) + suggestions = [] + source_texts = [] + source_links = [] + for detail in reversed(response.get("item").get("messages")): + suggestion_responses = detail.get("suggestedResponses", {}) + source_attr = detail.get("sourceAttributions", {}) + if suggestion_responses: + for suggestion in suggestion_responses: + suggestions.append(suggestion.get("text")) + if source_attr: + for source in source_attr: + source_texts.append(source.get("providerDisplayName")) + source_links.append(source.get("seeMoreUrl")) return { "text": message["text"], "author": message["author"], - "sources": sources, - "sources_link": sources_link, + "source_texts": source_texts, + "source_links": source_links, "suggestions": suggestions, "messages_left": messages_left, "max_messages": response["item"]["throttling"][ @@ -139,7 +145,8 @@ async def ask_stream( webpage_context: str | None = None, search_result: bool = False, locale: str = guess_locale(), - autosave: bool = True + remove_options: list = None, + add_options: list = None ) -> Generator[bool, dict | str, None]: """ Ask a question to the bot @@ -152,7 +159,8 @@ async def ask_stream( webpage_context=webpage_context, search_result=search_result, locale=locale, - autosave=autosave + remove_options=remove_options, + add_options=add_options ): yield response diff --git a/re_edge_gpt/chat/request.py b/re_edge_gpt/chat/request.py index 0dc1440..4708d5c 100644 --- a/re_edge_gpt/chat/request.py +++ b/re_edge_gpt/chat/request.py @@ -63,15 +63,14 @@ def update( "allowedMessageTypes": [ "ActionRequest", "Chat", - "ConfirmationCard", "Context", - "Disengaged", + "InternalSearchQuery", + "InternalSearchResult", + "InternalLoaderMessage", "Progress", - "RenderContentRequest", - "AdsQuery", - "SemanticSerp", "GenerateContentQuery", - "SearchQuery" + "SearchQuery", + "GeneratedCode", ], "sliceIds": [ "schurmsg", diff --git a/re_edge_gpt/image/upload_image.py b/re_edge_gpt/image/upload_image.py index 67254a3..3386872 100644 --- a/re_edge_gpt/image/upload_image.py +++ b/re_edge_gpt/image/upload_image.py @@ -3,6 +3,8 @@ import aiohttp +from re_edge_gpt.utils.constants import IMAGE_HEADER + payload = { "imageInfo": {}, "knowledgeRequest": { @@ -17,9 +19,10 @@ } -async def upload_image_url(image_url: str, conversation_id: str, proxy: str = None, face_blur: bool = True): +async def upload_image_url(image_url: str, conversation_id: str, cookies: dict, + proxy: str = None, face_blur: bool = True): async with aiohttp.ClientSession( - headers={"Referer": "https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx"}, + headers=IMAGE_HEADER, cookies=cookies ) as session: url = "https://www.bing.com/images/kblob" @@ -31,17 +34,22 @@ async def upload_image_url(image_url: str, conversation_id: str, proxy: str = No data = aiohttp.FormData() data.add_field('knowledgeRequest', json.dumps(new_payload), content_type="application/json") async with session.post(url, data=data, proxy=proxy) as resp: + if not resp.status == 200: + raise Exception("Upload image failed") return (await resp.json())["blobId"] -async def upload_image(filename: str = None, base64_image: str = None, proxy: str = None, face_blur: bool = True): +async def upload_image(conversation_id: str, cookies: dict, filename: str = None, + base64_image: str = None, proxy: str = None, face_blur: bool = True): async with aiohttp.ClientSession( - headers={"Referer": "https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx"}, + headers=IMAGE_HEADER, cookies=cookies ) as session: url = "https://www.bing.com/images/kblob" - new_payload = payload.get("knowledgeRequest").update( + new_payload = payload + new_payload.get("knowledgeRequest").update( {"invokedSkillsRequestData": {"enableFaceBlur": face_blur}}) + new_payload.get("knowledgeRequest").get("convoData").update({"convoid": conversation_id}) if filename is not None: with open(filename, 'rb') as f: @@ -55,6 +63,7 @@ async def upload_image(filename: str = None, base64_image: str = None, proxy: st data = aiohttp.FormData() data.add_field('knowledgeRequest', json.dumps(new_payload), content_type="application/json") data.add_field('imageBase64', image_base64, content_type="application/octet-stream") - async with session.post(url, data=data, proxy=proxy) as resp: + if not resp.status == 200: + raise Exception("Upload image failed") return (await resp.json())["blobId"] diff --git a/re_edge_gpt/utils/constants.py b/re_edge_gpt/utils/constants.py index 4d7434b..622e1a1 100644 --- a/re_edge_gpt/utils/constants.py +++ b/re_edge_gpt/utils/constants.py @@ -11,15 +11,15 @@ "accept-language": "en;q=0.9,en-US;q=0.8", "accept-encoding": "gzip, deflate, br, zsdch", "content-type": "application/json", - "sec-ch-ua": '"Microsoft Edge";v="120", ' - '"Chromium";v="120", ' - '"Not?A_Brand";v="8"', + "sec-ch-ua": '"Not A(Brand";v="99", ' + '"Microsoft Edge";v="121", ' + '"Chromium";v="121"', "sec-ch-ua-arch": '"x86"', "sec-ch-ua-bitness": '"64"', - "sec-ch-ua-full-version": '"1-120.0.2210.133"', - "sec-ch-ua-full-version-list": '"Not_A Brand";v="8.0.0.0", ' - '"Chromium";v="120.0.6099.217", ' - '"Microsoft Edge";v="120.0.2210.133', + "sec-ch-ua-full-version": '"121.0.2277.83"', + "sec-ch-ua-full-version-list": '"Not A(Brand";v="99.0.0.0", ' + '"Microsoft Edge";v="121.0.2277.83", ' + '"Chromium";v="121.0.6167.85"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-model": "", "sec-ch-ua-platform": '"Windows"', @@ -39,13 +39,15 @@ "accept": "application/json", "accept-language": "en;q=0.9,en-US;q=0.8", "cache-control": "max-age=0", - "sec-ch-ua": '"Not_A Brand";v="8.0.0.0", "Chromium";v="120.0.6099.217", "Microsoft Edge";v="120.0.2210.133', + "sec-ch-ua": '"Not A(Brand";v="99", ' + '"Microsoft Edge";v="121", ' + '"Chromium";v="121"', "sec-ch-ua-arch": '"x86"', "sec-ch-ua-bitness": '"64"', - "sec-ch-ua-full-version": '"1-120.0.2210.133"', - "sec-ch-ua-full-version-list": '"Not_A Brand";v="8.0.0.0", ' - '"Chromium";v="120.0.6099.217", ' - '"Microsoft Edge";v="120.0.2210.133', + "sec-ch-ua-full-version": '"121.0.2277.83"', + "sec-ch-ua-full-version-list": '"Not A(Brand";v="99.0.0.0", ' + '"Microsoft Edge";v="121.0.2277.83", ' + '"Chromium";v="121.0.6167.85"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-model": '""', "sec-ch-ua-platform": '"Windows"', @@ -61,6 +63,32 @@ "x-forwarded-for": FORWARDED_IP, } +IMAGE_HEADER = { + "Accept": "*/*", + "Accept-Encoding": "gzip, deflate, br", + "Content-Type": "multipart/form-data", + "Referer": "https://www.bing.com/search?q=Bing+AI&showconv=1&FORM=hpcodx", + "sec-ch-ua": '"Not A(Brand";v="99", ' + '"Microsoft Edge";v="121", ' + '"Chromium";v="121"', + "sec-ch-ua-arch": '"x86"', + "sec-ch-ua-bitness": '"64"', + "sec-ch-ua-full-version": '"121.0.2277.83"', + "sec-ch-ua-full-version-list": '"Not A(Brand";v="99.0.0.0", ' + '"Microsoft Edge";v="121.0.2277.83", ' + '"Chromium";v="121.0.6167.85"', + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": "Windows", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/120.0.0.0 " + "Safari/537.36 " + "Edg/120.0.0.0", +} + BUNDLE_VERSION = "1.1498.1" SYDNEY_INIT_HEADER = HEADERS_INIT_CONVER.update( diff --git a/re_edge_gpt/utils/conversation_style.py b/re_edge_gpt/utils/conversation_style.py index a5c54d1..f8848c6 100644 --- a/re_edge_gpt/utils/conversation_style.py +++ b/re_edge_gpt/utils/conversation_style.py @@ -9,45 +9,60 @@ class ConversationStyle(Enum): creative = [ - "nlu_direct_response_filter", - "deepleo", - "disable_emoji_spoken_text", - "responsible_ai_policy_235", - "enablemm", - "h3imaginative", - "objopinion", - "dsblhlthcrd", - "dv3sugg", - "autosave", - "clgalileo", - "gencontentv3", + "fluxcopilot", + "nojbf", + "iyxapbing", + "iycapbing", + "dgencontentv3", + "nointernalsugg", + "disable_telemetry", + "machine_affinity", + "streamf", + "codeint", + "langdtwb", + "fdwtlst", + "fluxprod", + "eredirecturl", + "deuct3" ] balanced = [ - "nlu_direct_response_filter", - "deepleo", - "disable_emoji_spoken_text", - "responsible_ai_policy_235", - "enablemm", + "fluxcopilot", + "nojbf", + "iyxapbing", + "iycapbing", + "dgencontentv3", + "nointernalsugg", + "disable_telemetry", + "machine_affinity", + "streamf", + "codeint", + "langdtwb", + "fdwtlst", + "fluxprod", + "eredirecturl", + "deuct3", + # Balance "galileo", - "saharagenconv5", - "objopinion", - "dsblhlthcrd", - "dv3sugg", - "autosave", + "gldcl1p" ] precise = [ - "nlu_direct_response_filter", - "deepleo", - "disable_emoji_spoken_text", - "responsible_ai_policy_235", - "enablemm", - "h3precise", - "objopinion", - "dsblhlthcrd", - "dv3sugg", - "autosave", - "clgalileo", - "gencontentv3", + "fluxcopilot", + "nojbf", + "iyxapbing", + "iycapbing", + "dgencontentv3", + "nointernalsugg", + "disable_telemetry", + "machine_affinity", + "streamf", + "codeint", + "langdtwb", + "fdwtlst", + "fluxprod", + "eredirecturl", + "deuct3", + # Precise + "h3precise" ] diff --git a/requirements.txt b/requirements.txt index b1f9e9d..2253ec8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,3 +6,4 @@ requests rich regex re-edge-gpt +Brotli diff --git a/dev.toml b/stable.toml similarity index 94% rename from dev.toml rename to stable.toml index 33fdc70..ad2f594 100644 --- a/dev.toml +++ b/stable.toml @@ -5,13 +5,13 @@ requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] -name = "re_edge_gpt_dev" -version = "0.0.31" +name = "re_edge_gpt" +version = "0.0.29" authors = [ { name = "JE-Chen", email = "jechenmailman@gmail.com" }, ] dependencies = [ - "aiohttp", "certifi", "httpx", "prompt_toolkit", "requests", "rich", "regex" + "aiohttp", "certifi", "httpx", "prompt_toolkit", "requests", "rich", "regex", "Brotli" ] description = "Microsoft's Bing Chat AI" requires-python = ">=3.9" diff --git a/test/source/example_reponse.json b/test/source/example_reponse.json new file mode 100644 index 0000000..93e3649 --- /dev/null +++ b/test/source/example_reponse.json @@ -0,0 +1,573 @@ +{ + "type": 2, + "invocationId": "3", + "item": { + "messages": [ + { + "text": "Cake recipe", + "author": "user", + "from": { + "id": "914798280546316", + "name": null, + "partnerId": null + }, + "createdAt": "2024-02-05T07:59:47.4652542+00:00", + "timestamp": "2024-02-05T15:59:46+08:00", + "locale": "en-us", + "market": "en-us", + "region": "us", + "locationInfo": { + "country": "Australia", + "state": "South Australia", + "city": "Adelaide", + "sourceType": 1, + "isImplicitLocationIntent": false + }, + "locationHints": [ + { + "country": "United States", + "countryConfidence": 8, + "state": "California", + "city": "Los Angeles", + "timeZoneOffset": 8, + "sourceType": 1, + "center": { + "latitude": 34.05369, + "longitude": -118.24277, + "height": null + }, + "regionType": 2 + } + ], + "messageId": "6d94fedd-f7b5-42e3-bb5d-380b66528949", + "requestId": "6d94fedd-f7b5-42e3-bb5d-380b66528949", + "nlu": { + "scoredClassification": { + "classification": "CHAT_GPT", + "score": null + }, + "classificationRanking": [ + { + "classification": "CHAT_GPT", + "score": null + } + ], + "qualifyingClassifications": null, + "ood": null, + "metaData": null, + "entities": null + }, + "offense": "None", + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "cib", + "scores": [ + { + "component": "UserOffense", + "score": 0.0006932423 + }, + { + "component": "suicide_help", + "score": 0.01836964 + } + ], + "inputMethod": "Keyboard" + }, + { + "text": "Searching the web for: `Cake recipe`", + "hiddenText": "Cake recipe", + "author": "bot", + "createdAt": "2024-02-05T07:59:48.7661115+00:00", + "timestamp": "2024-02-05T07:59:48.7661115+00:00", + "messageId": "2c226a6a-8dbe-4835-8d14-33b26402364f", + "requestId": "6d94fedd-f7b5-42e3-bb5d-380b66528949", + "messageType": "InternalSearchQuery", + "offense": "None", + "adaptiveCards": [ + { + "type": "AdaptiveCard", + "version": "1.0", + "body": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "isSubtle": true, + "italic": true, + "text": "Searching the web for: `Cake recipe`" + } + ] + } + ] + } + ], + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "DeepLeo", + "invocation": "search_web(query=\"Cake recipe\")", + "toolResultPublishPreference": "Never" + }, + { + "text": "{\"recipe_search_results\":[{\"title\":\"The Perfect Chocolate Cake\",\"snippets\":[\"Perfectly moist and delicious, every time!\"],\"data\":{\"recipe_rating\":\"4.87/5\",\"recipe_time\":\"55 min\",\"ingredients_info\":\"1 ¾ cups - All-Purpose Flour,2 cups - Granulated Sugar,¾ cup - Unsweetened Cocoa Powder,1 teaspoon - Baking Powder,1 teaspoon - Kosher Salt,1 cup - Buttermilk (room temperature),2 - Large Eggs (at room temperature),2 teaspoons - Vanilla Extract,½ cup - Vegetable Oil,2 teaspoons - Baking Soda,1 cup - Freshly Brewed Coffee\"},\"url\":\"https://iambaker.net/cake-recipes/\"},{\"title\":\"The BEST Vanilla Cake Recipe\",\"snippets\":[\"This Classic Vanilla Cake pairs fluffy vanilla cake layers with a silky vanilla buttercream. The perfect cake for birthdays, weddings, or any occasion!\"],\"data\":{\"recipe_rating\":\"4.79/5\",\"recipe_reviewcount\":\"871\",\"recipe_time\":\"2 hr 35 min\",\"serving_info\":\"12\",\"calorie_info\":\"699\",\"ingredients_info\":\"2 ¼ cups - All-Purpose Flour,2 ¼ teaspoons - Baking Powder,¾ teaspoon - Salt,2 ¾ cups - Unsalted Butter (room temperature),3 cups - Granulated Sugar,3 - Large Eggs (room temperature),3 ½ teaspoons - Vanilla Extract,1 cup - Buttermilk (or whole milk, room temperature),6 - Large Egg Whites,add - Confetti Sprinkles,add - Nonpareils\"},\"url\":\"https://livforcake.com/vanilla-cake/\"},{\"title\":\"Vanilla Cake Recipe\",\"snippets\":[\"This delicious Vanilla Cake Recipe is so easy to make from scratch. With only a handful of ingredients, you can have this light and fluffy cake in no time.\"],\"data\":{\"recipe_rating\":\"5/5\",\"recipe_reviewcount\":\"1775\",\"recipe_time\":\"2 hr 45 min\",\"calorie_info\":\"1129\",\"ingredients_info\":\"2 ½ cups - All-Purpose Flour (280g),2 ¼ teaspoons - Baking Powder,1 teaspoon - Salt,1 ⅔ cups - Granulated Sugar (333g),¾ cup - Unsalted Butter (room temperature, 170g),3 - Large Eggs (room temperature),1 tablespoon - Vanilla (15mL),1 cup - Buttermilk (240mL),1 ½ cups - Unsalted Butter (room temperature),5 cups - Powdered Sugar,¼ cup - Milk (or cream, plus more as needed),2 teaspoons - Vanilla (10mL, plus more to taste if desired)\"},\"url\":\"https://preppykitchen.com/1448-2/\"}],\"web_search_results\":[{\"title\":\"Cake Recipes\",\"snippets\":[\"Cake Recipes Skip to content Allrecipes Search the site Search Please fill out this field. Log In My Account Log Out My Profile Saved Items & Collections Add a Recipe Help Magazine Subscribe Manage Your Subscription Give a Gift Subscription Get Help Newsletter Sweepstakes GET THE MAGAZINE Allrecipes Search Search Please fill out this field. Dinners Dinners 5-Ingredient Dinners One-Pot Meals Quick & Easy 30-Minute Meals Soups, Stews & Chili Comfort Food Main Dishes Sheet Pan Dinners View All Meals Meals Breakfast & Brunch Lunch Healthy Appetizers & Snacks Salads Side Dishes Soups Bread Drinks Desserts View All Ingredients Ingredients Chicken Beef Pork Seafood Pasta Fruits Vegetables View All Occasions Occasions Lunar New Year Recipes for the Super Bowl® Mardi Gras Valentine's Day View All Cuisines Cuisines Mexican Italian Chinese Indian German Greek Filipino Japanese View All Kitchen Tips Kitchen Tips Instant Pot Air Fryer Slow Cooker Product Reviews BBQ & Grilling Cookware & Equipment Ingredient Substitutions View All News News Recalls We Tried It Grocery Trends Celebrity & Entertainment View All Features Features Dinner Fix Sweet Spot In the Kitchen About Us About Us About Allrecipes Allstars How to Add a Recipe GET THE MAGAZINE Log In My Account My Account Log Out My Profile Saved Items & Collections Add a Recipe Help Magazine Magazine Subscribe Manage Your Subscription Give a Gift Subscription Get Help Newsletter Sweepstakes Follow Us Dinners 5-Ingredient Dinners One-Pot Meals Quick & Easy 30-Minute Meals Soups, Stews & Chili Comfort Food Main Dishes Sheet Pan Dinners View All Meals Breakfast & Brunch Lunch Healthy Appetizers & Snacks Salads Side Dishes Soups Bread Drinks Desserts View All Ingredients Chicken Beef Pork Seafood Pasta Fruits Vegetables View All Occasions Lunar New Year Recipes for the Super Bowl® Mardi Gras Valentine's Day View All Cuisines Mexican Italian Chinese Indian German Greek Filipino Japanese View All Kitchen Tips Instant Pot Air Fryer Slow Cooker Product Reviews BBQ & Grilling Cookware & Equipment Ingredient Substitutions View All News Recalls We Tried It Grocery Trends Celebrity & Entertainment View All Features Dinner Fix Sweet Spot In the Kitchen About Us Allstars How to Add a Recipe GET THE MAGAZINE Desserts Cake Recipes See the best cake recipes. Trusted recipes for chocolate cake, white cake, banana cakes, and carrot cakes with photos and tips from home cooks. Coconut Cake Wedding Cakes Red Velvet Cake Banana Cake Apple Cake Peach Cake Pumpkin Cake Zucchini Cake Sheet Cake Pineapple Cake Strawberry Cake Sponge Cake Blueberry Cake Poke Cake Cake Pop Recipes Mug Cake Cake Roll Recipes Bundt Cake Cupcakes Holiday Cakes Lemon Cake Angel Food Cake Cake Mix Cakes Cheesecake Coffee Cake Fruitcake Pound Cake Spice Cake Tortes White Cake Yellow Cake Chocolate Cake Carrot Cake Pumpkin Rolls Frosting and Icing Recipes Our 15 Favorite Fall Cakes Will Make Your Home Smell Amazing Sweet and Spicy Pumpkin Cakes 12 Different Ways Cream Cheese Frosting Apple Cheesecake 15 Coffee Cake Recipes to Try if You Love Streusel Explore Cake Recipes Chocolate Stout Cake Gooey Butter Cake What would you like to cook? Search the site Search Pancakes Meatloaf Cookies Poppy Seed and Walnut Roll\",\"See the best cake recipes. Trusted recipes for chocolate cake, white cake, banana cakes, and carrot cakes with photos and tips from home cooks.\"],\"url\":\"https://www.allrecipes.com/recipes/276/desserts/cakes/\"},{\"title\":\"Cake recipes - BBC Food\",\"snippets\":[\"Browse our easy cake recipes: from birthday cakes, chocolate cakes and lemon drizzle cakes to the perfect Victoria sponge - not forgetting plenty of gluten-free options.\"],\"url\":\"https://www.bbc.co.uk/food/cake\"}]}", + "hiddenText": "search_web('Cake recipe') was invoked and returned:\n```json\n{\"recipe_search_results\":[{\"title\":\"The Perfect Chocolate Cake\",\"snippets\":[\"Perfectly moist and delicious, every time!\"],\"data\":{\"recipe_rating\":\"4.87/5\",\"recipe_time\":\"55 min\",\"ingredients_info\":\"1 ¾ cups - All-Purpose Flour,2 cups - Granulated Sugar,¾ cup - Unsweetened Cocoa Powder,1 teaspoon - Baking Powder,1 teaspoon - Kosher Salt,1 cup - Buttermilk (room temperature),2 - Large Eggs (at room temperature),2 teaspoons - Vanilla Extract,½ cup - Vegetable Oil,2 teaspoons - Baking Soda,1 cup - Freshly Brewed Coffee\"},\"url\":\"https://iambaker.net/cake-recipes/\"},{\"title\":\"The BEST Vanilla Cake Recipe\",\"snippets\":[\"This Classic Vanilla Cake pairs fluffy vanilla cake layers with a silky vanilla buttercream. The perfect cake for birthdays, weddings, or any occasion!\"],\"data\":{\"recipe_rating\":\"4.79/5\",\"recipe_reviewcount\":\"871\",\"recipe_time\":\"2 hr 35 min\",\"serving_info\":\"12\",\"calorie_info\":\"699\",\"ingredients_info\":\"2 ¼ cups - All-Purpose Flour,2 ¼ teaspoons - Baking Powder,¾ teaspoon - Salt,2 ¾ cups - Unsalted Butter (room temperature),3 cups - Granulated Sugar,3 - Large Eggs (room temperature),3 ½ teaspoons - Vanilla Extract,1 cup - Buttermilk (or whole milk, room temperature),6 - Large Egg Whites,add - Confetti Sprinkles,add - Nonpareils\"},\"url\":\"https://livforcake.com/vanilla-cake/\"},{\"title\":\"Vanilla Cake Recipe\",\"snippets\":[\"This delicious Vanilla Cake Recipe is so easy to make from scratch. With only a handful of ingredients, you can have this light and fluffy cake in no time.\"],\"data\":{\"recipe_rating\":\"5/5\",\"recipe_reviewcount\":\"1775\",\"recipe_time\":\"2 hr 45 min\",\"calorie_info\":\"1129\",\"ingredients_info\":\"2 ½ cups - All-Purpose Flour (280g),2 ¼ teaspoons - Baking Powder,1 teaspoon - Salt,1 ⅔ cups - Granulated Sugar (333g),¾ cup - Unsalted Butter (room temperature, 170g),3 - Large Eggs (room temperature),1 tablespoon - Vanilla (15mL),1 cup - Buttermilk (240mL),1 ½ cups - Unsalted Butter (room temperature),5 cups - Powdered Sugar,¼ cup - Milk (or cream, plus more as needed),2 teaspoons - Vanilla (10mL, plus more to taste if desired)\"},\"url\":\"https://preppykitchen.com/1448-2/\"}],\"web_search_results\":[{\"title\":\"Cake Recipes\",\"snippets\":[\"Cake Recipes Skip to content Allrecipes Search the site Search Please fill out this field. Log In My Account Log Out My Profile Saved Items & Collections Add a Recipe Help Magazine Subscribe Manage Your Subscription Give a Gift Subscription Get Help Newsletter Sweepstakes GET THE MAGAZINE Allrecipes Search Search Please fill out this field. Dinners Dinners 5-Ingredient Dinners One-Pot Meals Quick & Easy 30-Minute Meals Soups, Stews & Chili Comfort Food Main Dishes Sheet Pan Dinners View All Meals Meals Breakfast & Brunch Lunch Healthy Appetizers & Snacks Salads Side Dishes Soups Bread Drinks Desserts View All Ingredients Ingredients Chicken Beef Pork Seafood Pasta Fruits Vegetables View All Occasions Occasions Lunar New Year Recipes for the Super Bowl® Mardi Gras Valentine's Day View All Cuisines Cuisines Mexican Italian Chinese Indian German Greek Filipino Japanese View All Kitchen Tips Kitchen Tips Instant Pot Air Fryer Slow Cooker Product Reviews BBQ & Grilling Cookware & Equipment Ingredient Substitutions View All News News Recalls We Tried It Grocery Trends Celebrity & Entertainment View All Features Features Dinner Fix Sweet Spot In the Kitchen About Us About Us About Allrecipes Allstars How to Add a Recipe GET THE MAGAZINE Log In My Account My Account Log Out My Profile Saved Items & Collections Add a Recipe Help Magazine Magazine Subscribe Manage Your Subscription Give a Gift Subscription Get Help Newsletter Sweepstakes Follow Us Dinners 5-Ingredient Dinners One-Pot Meals Quick & Easy 30-Minute Meals Soups, Stews & Chili Comfort Food Main Dishes Sheet Pan Dinners View All Meals Breakfast & Brunch Lunch Healthy Appetizers & Snacks Salads Side Dishes Soups Bread Drinks Desserts View All Ingredients Chicken Beef Pork Seafood Pasta Fruits Vegetables View All Occasions Lunar New Year Recipes for the Super Bowl® Mardi Gras Valentine's Day View All Cuisines Mexican Italian Chinese Indian German Greek Filipino Japanese View All Kitchen Tips Instant Pot Air Fryer Slow Cooker Product Reviews BBQ & Grilling Cookware & Equipment Ingredient Substitutions View All News Recalls We Tried It Grocery Trends Celebrity & Entertainment View All Features Dinner Fix Sweet Spot In the Kitchen About Us Allstars How to Add a Recipe GET THE MAGAZINE Desserts Cake Recipes See the best cake recipes. Trusted recipes for chocolate cake, white cake, banana cakes, and carrot cakes with photos and tips from home cooks. Coconut Cake Wedding Cakes Red Velvet Cake Banana Cake Apple Cake Peach Cake Pumpkin Cake Zucchini Cake Sheet Cake Pineapple Cake Strawberry Cake Sponge Cake Blueberry Cake Poke Cake Cake Pop Recipes Mug Cake Cake Roll Recipes Bundt Cake Cupcakes Holiday Cakes Lemon Cake Angel Food Cake Cake Mix Cakes Cheesecake Coffee Cake Fruitcake Pound Cake Spice Cake Tortes White Cake Yellow Cake Chocolate Cake Carrot Cake Pumpkin Rolls Frosting and Icing Recipes Our 15 Favorite Fall Cakes Will Make Your Home Smell Amazing Sweet and Spicy Pumpkin Cakes 12 Different Ways Cream Cheese Frosting Apple Cheesecake 15 Coffee Cake Recipes to Try if You Love Streusel Explore Cake Recipes Chocolate Stout Cake Gooey Butter Cake What would you like to cook? Search the site Search Pancakes Meatloaf Cookies Poppy Seed and Walnut Roll\",\"See the best cake recipes. Trusted recipes for chocolate cake, white cake, banana cakes, and carrot cakes with photos and tips from home cooks.\"],\"url\":\"https://www.allrecipes.com/recipes/276/desserts/cakes/\"},{\"title\":\"Cake recipes - BBC Food\",\"snippets\":[\"Browse our easy cake recipes: from birthday cakes, chocolate cakes and lemon drizzle cakes to the perfect Victoria sponge - not forgetting plenty of gluten-free options.\"],\"url\":\"https://www.bbc.co.uk/food/cake\"}]}\n```", + "author": "bot", + "createdAt": "2024-02-05T07:59:49.7013412+00:00", + "timestamp": "2024-02-05T07:59:49.7013412+00:00", + "messageId": "a1b7a553-3195-4175-8431-9ab1a7ad6755", + "requestId": "6d94fedd-f7b5-42e3-bb5d-380b66528949", + "messageType": "InternalSearchResult", + "offense": "None", + "adaptiveCards": [ + { + "type": "AdaptiveCard", + "version": "1.0", + "body": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "isSubtle": true, + "italic": true, + "text": "{\"recipe_search_results\":[{\"title\":\"The Perfect Chocolate Cake\",\"snippets\":[\"Perfectly moist and delicious, every time!\"],\"data\":{\"recipe_rating\":\"4.87/5\",\"recipe_time\":\"55 min\",\"ingredients_info\":\"1 ¾ cups - All-Purpose Flour,2 cups - Granulated Sugar,¾ cup - Unsweetened Cocoa Powder,1 teaspoon - Baking Powder,1 teaspoon - Kosher Salt,1 cup - Buttermilk (room temperature),2 - Large Eggs (at room temperature),2 teaspoons - Vanilla Extract,½ cup - Vegetable Oil,2 teaspoons - Baking Soda,1 cup - Freshly Brewed Coffee\"},\"url\":\"https://iambaker.net/cake-recipes/\"},{\"title\":\"The BEST Vanilla Cake Recipe\",\"snippets\":[\"This Classic Vanilla Cake pairs fluffy vanilla cake layers with a silky vanilla buttercream. The perfect cake for birthdays, weddings, or any occasion!\"],\"data\":{\"recipe_rating\":\"4.79/5\",\"recipe_reviewcount\":\"871\",\"recipe_time\":\"2 hr 35 min\",\"serving_info\":\"12\",\"calorie_info\":\"699\",\"ingredients_info\":\"2 ¼ cups - All-Purpose Flour,2 ¼ teaspoons - Baking Powder,¾ teaspoon - Salt,2 ¾ cups - Unsalted Butter (room temperature),3 cups - Granulated Sugar,3 - Large Eggs (room temperature),3 ½ teaspoons - Vanilla Extract,1 cup - Buttermilk (or whole milk, room temperature),6 - Large Egg Whites,add - Confetti Sprinkles,add - Nonpareils\"},\"url\":\"https://livforcake.com/vanilla-cake/\"},{\"title\":\"Vanilla Cake Recipe\",\"snippets\":[\"This delicious Vanilla Cake Recipe is so easy to make from scratch. With only a handful of ingredients, you can have this light and fluffy cake in no time.\"],\"data\":{\"recipe_rating\":\"5/5\",\"recipe_reviewcount\":\"1775\",\"recipe_time\":\"2 hr 45 min\",\"calorie_info\":\"1129\",\"ingredients_info\":\"2 ½ cups - All-Purpose Flour (280g),2 ¼ teaspoons - Baking Powder,1 teaspoon - Salt,1 ⅔ cups - Granulated Sugar (333g),¾ cup - Unsalted Butter (room temperature, 170g),3 - Large Eggs (room temperature),1 tablespoon - Vanilla (15mL),1 cup - Buttermilk (240mL),1 ½ cups - Unsalted Butter (room temperature),5 cups - Powdered Sugar,¼ cup - Milk (or cream, plus more as needed),2 teaspoons - Vanilla (10mL, plus more to taste if desired)\"},\"url\":\"https://preppykitchen.com/1448-2/\"}],\"web_search_results\":[{\"title\":\"Cake Recipes\",\"snippets\":[\"Cake Recipes Skip to content Allrecipes Search the site Search Please fill out this field. Log In My Account Log Out My Profile Saved Items & Collections Add a Recipe Help Magazine Subscribe Manage Your Subscription Give a Gift Subscription Get Help Newsletter Sweepstakes GET THE MAGAZINE Allrecipes Search Search Please fill out this field. Dinners Dinners 5-Ingredient Dinners One-Pot Meals Quick & Easy 30-Minute Meals Soups, Stews & Chili Comfort Food Main Dishes Sheet Pan Dinners View All Meals Meals Breakfast & Brunch Lunch Healthy Appetizers & Snacks Salads Side Dishes Soups Bread Drinks Desserts View All Ingredients Ingredients Chicken Beef Pork Seafood Pasta Fruits Vegetables View All Occasions Occasions Lunar New Year Recipes for the Super Bowl® Mardi Gras Valentine's Day View All Cuisines Cuisines Mexican Italian Chinese Indian German Greek Filipino Japanese View All Kitchen Tips Kitchen Tips Instant Pot Air Fryer Slow Cooker Product Reviews BBQ & Grilling Cookware & Equipment Ingredient Substitutions View All News News Recalls We Tried It Grocery Trends Celebrity & Entertainment View All Features Features Dinner Fix Sweet Spot In the Kitchen About Us About Us About Allrecipes Allstars How to Add a Recipe GET THE MAGAZINE Log In My Account My Account Log Out My Profile Saved Items & Collections Add a Recipe Help Magazine Magazine Subscribe Manage Your Subscription Give a Gift Subscription Get Help Newsletter Sweepstakes Follow Us Dinners 5-Ingredient Dinners One-Pot Meals Quick & Easy 30-Minute Meals Soups, Stews & Chili Comfort Food Main Dishes Sheet Pan Dinners View All Meals Breakfast & Brunch Lunch Healthy Appetizers & Snacks Salads Side Dishes Soups Bread Drinks Desserts View All Ingredients Chicken Beef Pork Seafood Pasta Fruits Vegetables View All Occasions Lunar New Year Recipes for the Super Bowl® Mardi Gras Valentine's Day View All Cuisines Mexican Italian Chinese Indian German Greek Filipino Japanese View All Kitchen Tips Instant Pot Air Fryer Slow Cooker Product Reviews BBQ & Grilling Cookware & Equipment Ingredient Substitutions View All News Recalls We Tried It Grocery Trends Celebrity & Entertainment View All Features Dinner Fix Sweet Spot In the Kitchen About Us Allstars How to Add a Recipe GET THE MAGAZINE Desserts Cake Recipes See the best cake recipes. Trusted recipes for chocolate cake, white cake, banana cakes, and carrot cakes with photos and tips from home cooks. Coconut Cake Wedding Cakes Red Velvet Cake Banana Cake Apple Cake Peach Cake Pumpkin Cake Zucchini Cake Sheet Cake Pineapple Cake Strawberry Cake Sponge Cake Blueberry Cake Poke Cake Cake Pop Recipes Mug Cake Cake Roll Recipes Bundt Cake Cupcakes Holiday Cakes Lemon Cake Angel Food Cake Cake Mix Cakes Cheesecake Coffee Cake Fruitcake Pound Cake Spice Cake Tortes White Cake Yellow Cake Chocolate Cake Carrot Cake Pumpkin Rolls Frosting and Icing Recipes Our 15 Favorite Fall Cakes Will Make Your Home Smell Amazing Sweet and Spicy Pumpkin Cakes 12 Different Ways Cream Cheese Frosting Apple Cheesecake 15 Coffee Cake Recipes to Try if You Love Streusel Explore Cake Recipes Chocolate Stout Cake Gooey Butter Cake What would you like to cook? Search the site Search Pancakes Meatloaf Cookies Poppy Seed and Walnut Roll\",\"See the best cake recipes. Trusted recipes for chocolate cake, white cake, banana cakes, and carrot cakes with photos and tips from home cooks.\"],\"url\":\"https://www.allrecipes.com/recipes/276/desserts/cakes/\"},{\"title\":\"Cake recipes - BBC Food\",\"snippets\":[\"Browse our easy cake recipes: from birthday cakes, chocolate cakes and lemon drizzle cakes to the perfect Victoria sponge - not forgetting plenty of gluten-free options.\"],\"url\":\"https://www.bbc.co.uk/food/cake\"}]}" + } + ] + } + ] + } + ], + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "DeepLeo", + "invocation": "search_web(query=\"Cake recipe\")", + "groundingInfo": { + "recipe_search_results": [ + { + "index": null, + "title": "The Perfect Chocolate Cake", + "snippets": [ + "Perfectly moist and delicious, every time!" + ], + "data": { + "recipe_rating": "4.87/5", + "recipe_time": "55 min", + "ingredients_info": "1 ¾ cups - All-Purpose Flour,2 cups - Granulated Sugar,¾ cup - Unsweetened Cocoa Powder,1 teaspoon - Baking Powder,1 teaspoon - Kosher Salt,1 cup - Buttermilk (room temperature),2 - Large Eggs (at room temperature),2 teaspoons - Vanilla Extract,½ cup - Vegetable Oil,2 teaspoons - Baking Soda,1 cup - Freshly Brewed Coffee" + }, + "context": null, + "url": "https://iambaker.net/cake-recipes/", + "lastUpdatedDate": null + }, + { + "index": null, + "title": "The BEST Vanilla Cake Recipe", + "snippets": [ + "This Classic Vanilla Cake pairs fluffy vanilla cake layers with a silky vanilla buttercream. The perfect cake for birthdays, weddings, or any occasion!" + ], + "data": { + "recipe_rating": "4.79/5", + "recipe_reviewcount": "871", + "recipe_time": "2 hr 35 min", + "serving_info": "12", + "calorie_info": "699", + "ingredients_info": "2 ¼ cups - All-Purpose Flour,2 ¼ teaspoons - Baking Powder,¾ teaspoon - Salt,2 ¾ cups - Unsalted Butter (room temperature),3 cups - Granulated Sugar,3 - Large Eggs (room temperature),3 ½ teaspoons - Vanilla Extract,1 cup - Buttermilk (or whole milk, room temperature),6 - Large Egg Whites,add - Confetti Sprinkles,add - Nonpareils" + }, + "context": null, + "url": "https://livforcake.com/vanilla-cake/", + "lastUpdatedDate": null + }, + { + "index": null, + "title": "Vanilla Cake Recipe", + "snippets": [ + "This delicious Vanilla Cake Recipe is so easy to make from scratch. With only a handful of ingredients, you can have this light and fluffy cake in no time." + ], + "data": { + "recipe_rating": "5/5", + "recipe_reviewcount": "1775", + "recipe_time": "2 hr 45 min", + "calorie_info": "1129", + "ingredients_info": "2 ½ cups - All-Purpose Flour (280g),2 ¼ teaspoons - Baking Powder,1 teaspoon - Salt,1 ⅔ cups - Granulated Sugar (333g),¾ cup - Unsalted Butter (room temperature, 170g),3 - Large Eggs (room temperature),1 tablespoon - Vanilla (15mL),1 cup - Buttermilk (240mL),1 ½ cups - Unsalted Butter (room temperature),5 cups - Powdered Sugar,¼ cup - Milk (or cream, plus more as needed),2 teaspoons - Vanilla (10mL, plus more to taste if desired)" + }, + "context": null, + "url": "https://preppykitchen.com/1448-2/", + "lastUpdatedDate": null + } + ], + "web_search_results": [ + { + "index": null, + "title": "Cake Recipes", + "snippets": [ + "Cake Recipes Skip to content Allrecipes Search the site Search Please fill out this field. Log In My Account Log Out My Profile Saved Items & Collections Add a Recipe Help Magazine Subscribe Manage Your Subscription Give a Gift Subscription Get Help Newsletter Sweepstakes GET THE MAGAZINE Allrecipes Search Search Please fill out this field. Dinners Dinners 5-Ingredient Dinners One-Pot Meals Quick & Easy 30-Minute Meals Soups, Stews & Chili Comfort Food Main Dishes Sheet Pan Dinners View All Meals Meals Breakfast & Brunch Lunch Healthy Appetizers & Snacks Salads Side Dishes Soups Bread Drinks Desserts View All Ingredients Ingredients Chicken Beef Pork Seafood Pasta Fruits Vegetables View All Occasions Occasions Lunar New Year Recipes for the Super Bowl® Mardi Gras Valentine's Day View All Cuisines Cuisines Mexican Italian Chinese Indian German Greek Filipino Japanese View All Kitchen Tips Kitchen Tips Instant Pot Air Fryer Slow Cooker Product Reviews BBQ & Grilling Cookware & Equipment Ingredient Substitutions View All News News Recalls We Tried It Grocery Trends Celebrity & Entertainment View All Features Features Dinner Fix Sweet Spot In the Kitchen About Us About Us About Allrecipes Allstars How to Add a Recipe GET THE MAGAZINE Log In My Account My Account Log Out My Profile Saved Items & Collections Add a Recipe Help Magazine Magazine Subscribe Manage Your Subscription Give a Gift Subscription Get Help Newsletter Sweepstakes Follow Us Dinners 5-Ingredient Dinners One-Pot Meals Quick & Easy 30-Minute Meals Soups, Stews & Chili Comfort Food Main Dishes Sheet Pan Dinners View All Meals Breakfast & Brunch Lunch Healthy Appetizers & Snacks Salads Side Dishes Soups Bread Drinks Desserts View All Ingredients Chicken Beef Pork Seafood Pasta Fruits Vegetables View All Occasions Lunar New Year Recipes for the Super Bowl® Mardi Gras Valentine's Day View All Cuisines Mexican Italian Chinese Indian German Greek Filipino Japanese View All Kitchen Tips Instant Pot Air Fryer Slow Cooker Product Reviews BBQ & Grilling Cookware & Equipment Ingredient Substitutions View All News Recalls We Tried It Grocery Trends Celebrity & Entertainment View All Features Dinner Fix Sweet Spot In the Kitchen About Us Allstars How to Add a Recipe GET THE MAGAZINE Desserts Cake Recipes See the best cake recipes. Trusted recipes for chocolate cake, white cake, banana cakes, and carrot cakes with photos and tips from home cooks. Coconut Cake Wedding Cakes Red Velvet Cake Banana Cake Apple Cake Peach Cake Pumpkin Cake Zucchini Cake Sheet Cake Pineapple Cake Strawberry Cake Sponge Cake Blueberry Cake Poke Cake Cake Pop Recipes Mug Cake Cake Roll Recipes Bundt Cake Cupcakes Holiday Cakes Lemon Cake Angel Food Cake Cake Mix Cakes Cheesecake Coffee Cake Fruitcake Pound Cake Spice Cake Tortes White Cake Yellow Cake Chocolate Cake Carrot Cake Pumpkin Rolls Frosting and Icing Recipes Our 15 Favorite Fall Cakes Will Make Your Home Smell Amazing Sweet and Spicy Pumpkin Cakes 12 Different Ways Cream Cheese Frosting Apple Cheesecake 15 Coffee Cake Recipes to Try if You Love Streusel Explore Cake Recipes Chocolate Stout Cake Gooey Butter Cake What would you like to cook? Search the site Search Pancakes Meatloaf Cookies Poppy Seed and Walnut Roll", + "See the best cake recipes. Trusted recipes for chocolate cake, white cake, banana cakes, and carrot cakes with photos and tips from home cooks." + ], + "data": null, + "context": null, + "url": "https://www.allrecipes.com/recipes/276/desserts/cakes/", + "lastUpdatedDate": null + }, + { + "index": null, + "title": "Cake recipes - BBC Food", + "snippets": [ + "Browse our easy cake recipes: from birthday cakes, chocolate cakes and lemon drizzle cakes to the perfect Victoria sponge - not forgetting plenty of gluten-free options." + ], + "data": null, + "context": null, + "url": "https://www.bbc.co.uk/food/cake", + "lastUpdatedDate": null + } + ] + } + }, + { + "text": "Generating answers for you...", + "hiddenText": "Generating answers for you...", + "author": "bot", + "createdAt": "2024-02-05T07:59:51.6305039+00:00", + "timestamp": "2024-02-05T07:59:51.6305039+00:00", + "messageId": "ed2bc5df-7b21-48cd-9131-7b962abed56e", + "requestId": "6d94fedd-f7b5-42e3-bb5d-380b66528949", + "messageType": "InternalLoaderMessage", + "offense": "None", + "adaptiveCards": [ + { + "type": "AdaptiveCard", + "version": "1.0", + "body": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "isSubtle": true, + "italic": true, + "text": "Generating answers for you..." + } + ] + } + ] + } + ], + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "DeepLeo" + }, + { + "text": "Certainly! Here are **two delightful cake recipes** for you to choose from:\n\n1. **The Perfect Chocolate Cake**:\n - **Ingredients**:\n - 1 ¾ cups all-purpose flour\n - 2 cups granulated sugar\n - ¾ cup unsweetened cocoa powder\n - 1 teaspoon baking powder\n - 1 teaspoon kosher salt\n - 1 cup buttermilk (room temperature)\n - 2 large eggs (at room temperature)\n - 2 teaspoons vanilla extract\n - ½ cup vegetable oil\n - 2 teaspoons baking soda\n - 1 cup freshly brewed coffee\n - **Instructions**:\n 1. Preheat the oven to 350°F (175°C).\n 2. Grease and flour two 9-inch round cake pans.\n 3. In a large mixing bowl, combine flour, sugar, cocoa powder, baking powder, and salt.\n 4. Add buttermilk, eggs, vanilla extract, vegetable oil, and coffee. Mix until well combined.\n 5. Divide the batter evenly between the pans.\n 6. Bake for 30-35 minutes or until a toothpick inserted comes out clean.\n 7. Let the cakes cool in the pans for 10 minutes, then transfer to wire racks to cool completely.\n 8. Frost with your favorite frosting and enjoy! 🍰\n - **Source**: [^1^]\n\n2. **The BEST Vanilla Cake Recipe**:\n - **Ingredients**:\n - 2 ¼ cups all-purpose flour\n - 2 ¼ teaspoons baking powder\n - ¾ teaspoon salt\n - 2 ¾ cups unsalted butter (room temperature)\n - 3 cups granulated sugar\n - 3 large eggs (room temperature)\n - 3 ½ teaspoons vanilla extract\n - 1 cup buttermilk (or whole milk, room temperature)\n - 6 large egg whites\n - Confetti sprinkles and nonpareils (optional)\n - **Instructions**:\n 1. Preheat the oven to 350°F (175°C).\n 2. Grease and line three 8-inch round cake pans.\n 3. In a medium bowl, whisk together flour, baking powder, and salt.\n 4. In a separate large mixing bowl, cream butter and sugar until light and fluffy.\n 5. Add eggs one at a time, beating well after each addition.\n 6. Mix in vanilla extract.\n 7. Alternate adding flour mixture and buttermilk, beginning and ending with flour.\n 8. Fold in egg whites.\n 9. Divide batter evenly among the pans.\n 10. Bake for 25-30 minutes or until a toothpick inserted comes out clean.\n 11. Let the cakes cool in the pans for 10 minutes, then transfer to wire racks to cool completely.\n 12. Frost with vanilla buttercream and decorate as desired! 🎂\n - **Source**: [^2^]\n\nFeel free to choose the one that tempts your taste buds! Happy baking! 🍰🎉.", + "author": "bot", + "createdAt": "2024-02-05T08:00:05.1812669+00:00", + "timestamp": "2024-02-05T08:00:05.1812669+00:00", + "messageId": "1c1f80a2-ccfe-46a1-8691-43025f2f54b5", + "requestId": "6d94fedd-f7b5-42e3-bb5d-380b66528949", + "offense": "None", + "adaptiveCards": [ + { + "type": "AdaptiveCard", + "version": "1.0", + "id": "entity-image-top", + "body": [ + { + "type": "Image", + "url": "https://www.bing.com/th?id=OSK.HEROSsXAx44IgpGMgI8IAQTiq6spBC8E_VyEV4qsN8YZi0A&pid=cdx&w=320&h=189&c=7", + "altText": "Cake", + "width": "320px", + "height": "189px", + "knowledgeImageMetadata": { + "entityUrl": "https://www.bing.com/lite/auw?q=~aa0ce00a-8785-0f92-fd9d-99e106cc8e79&o=t%3A1%3Bb%3Afff%3Bs%3AUtilityAnswer_lite%2CEntityCardHtml&filters=convmode%3A%221%22&&cc=us&setlang=en", + "overlayImageUrl": null, + "enableShowerGlass": false + } + }, + { + "type": "TextBlock", + "text": "[1]: https://iambaker.net/cake-recipes/ \"\"\n[2]: https://livforcake.com/vanilla-cake/ \"\"\n[3]: https://preppykitchen.com/1448-2/ \"\"\n[4]: https://www.allrecipes.com/recipes/276/desserts/cakes/ \"\"\n[5]: https://www.bbc.co.uk/food/cake \"\"\n\nCertainly! Here are **two delightful cake recipes** for you to choose from:\n\n1. **The Perfect Chocolate Cake**:\n - **Ingredients**:\n - 1 ¾ cups all-purpose flour\n - 2 cups granulated sugar\n - ¾ cup unsweetened cocoa powder\n - 1 teaspoon baking powder\n - 1 teaspoon kosher salt\n - 1 cup buttermilk (room temperature)\n - 2 large eggs (at room temperature)\n - 2 teaspoons vanilla extract\n - ½ cup vegetable oil\n - 2 teaspoons baking soda\n - 1 cup freshly brewed coffee\n - **Instructions**:\n 1. Preheat the oven to 350°F (175°C).\n 2. Grease and flour two 9-inch round cake pans.\n 3. In a large mixing bowl, combine flour, sugar, cocoa powder, baking powder, and salt.\n 4. Add buttermilk, eggs, vanilla extract, vegetable oil, and coffee. Mix until well combined.\n 5. Divide the batter evenly between the pans.\n 6. Bake for 30-35 minutes or until a toothpick inserted comes out clean.\n 7. Let the cakes cool in the pans for 10 minutes, then transfer to wire racks to cool completely.\n 8. Frost with your favorite frosting and enjoy! 🍰\n - **Source**: [^1^][1]\n\n2. **The BEST Vanilla Cake Recipe**:\n - **Ingredients**:\n - 2 ¼ cups all-purpose flour\n - 2 ¼ teaspoons baking powder\n - ¾ teaspoon salt\n - 2 ¾ cups unsalted butter (room temperature)\n - 3 cups granulated sugar\n - 3 large eggs (room temperature)\n - 3 ½ teaspoons vanilla extract\n - 1 cup buttermilk (or whole milk, room temperature)\n - 6 large egg whites\n - Confetti sprinkles and nonpareils (optional)\n - **Instructions**:\n 1. Preheat the oven to 350°F (175°C).\n 2. Grease and line three 8-inch round cake pans.\n 3. In a medium bowl, whisk together flour, baking powder, and salt.\n 4. In a separate large mixing bowl, cream butter and sugar until light and fluffy.\n 5. Add eggs one at a time, beating well after each addition.\n 6. Mix in vanilla extract.\n 7. Alternate adding flour mixture and buttermilk, beginning and ending with flour.\n 8. Fold in egg whites.\n 9. Divide batter evenly among the pans.\n 10. Bake for 25-30 minutes or until a toothpick inserted comes out clean.\n 11. Let the cakes cool in the pans for 10 minutes, then transfer to wire racks to cool completely.\n 12. Frost with vanilla buttercream and decorate as desired! 🎂\n - **Source**: [^2^][2]\n\nFeel free to choose the one that tempts your taste buds! Happy baking! 🍰🎉\n", + "wrap": true + }, + { + "type": "TextBlock", + "id": "AttributionsTextBlockID", + "size": "small", + "text": "Learn more: [1. iambaker.net](https://iambaker.net/cake-recipes/) [2. livforcake.com](https://livforcake.com/vanilla-cake/) [3. preppykitchen.com](https://preppykitchen.com/1448-2/) [4. www.allrecipes.com](https://www.allrecipes.com/recipes/276/desserts/cakes/) [5. www.bbc.co.uk](https://www.bbc.co.uk/food/cake) [6. www.gettyimages.com](https://www.gettyimages.com/detail/news-photo/the-wedding-cake-by-claire-ptak-of-london-based-bakery-news-photo/960096678)", + "wrap": true + } + ] + } + ], + "sourceAttributions": [ + { + "providerDisplayName": "The Perfect Chocolate Cake", + "seeMoreUrl": "https://iambaker.net/cake-recipes/", + "urlSignature": "DUH+rwqSCGR0/uQgY3mcO7pRe7wz2dq+hHStSP5+qg8=", + "searchQuery": "Cake recipe", + "provider": "search_web" + }, + { + "providerDisplayName": "The BEST Vanilla Cake Recipe", + "seeMoreUrl": "https://livforcake.com/vanilla-cake/", + "urlSignature": "B1Li9XySUuWIW6L2bFvQNQ/DSwU4PJlg9gWjdyiV2IE=", + "searchQuery": "Cake recipe", + "provider": "search_web" + }, + { + "providerDisplayName": "Vanilla Cake Recipe", + "seeMoreUrl": "https://preppykitchen.com/1448-2/", + "urlSignature": "4i26vTUCGYn5xqttBRdZweqH0Any/CknWfGscrXWIw4=", + "searchQuery": "Cake recipe", + "provider": "search_web" + }, + { + "providerDisplayName": "Cake Recipes", + "seeMoreUrl": "https://www.allrecipes.com/recipes/276/desserts/cakes/", + "urlSignature": "kjk16pJXXHik07yJamhNE+EY++Vi0R8+BaY2ixRucaI=", + "searchQuery": "Cake recipe", + "provider": "search_web" + }, + { + "providerDisplayName": "Cake recipes - BBC Food", + "seeMoreUrl": "https://www.bbc.co.uk/food/cake", + "urlSignature": "uoZNHBdb9aMg9kXC8cgCFUFpyFFl3cqq7FeJ13n3prw=", + "searchQuery": "Cake recipe", + "provider": "search_web" + }, + { + "providerDisplayName": "Getty Images", + "seeMoreUrl": "https://www.gettyimages.com/detail/news-photo/the-wedding-cake-by-claire-ptak-of-london-based-bakery-news-photo/960096678" + } + ], + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "DeepLeo", + "scores": [ + { + "component": "BotOffense", + "score": 0.001012286 + }, + { + "component": "BotOffense", + "score": 0.0010859444 + }, + { + "component": "BotOffense", + "score": 0.0012113064 + }, + { + "component": "BotOffense", + "score": 0.0010649627 + }, + { + "component": "BotOffense", + "score": 0.0009927262 + }, + { + "component": "BotOffense", + "score": 0.0006932423 + }, + { + "component": "BotOffense", + "score": 0.0006825019 + }, + { + "component": "BotOffense", + "score": 0.0007041516 + }, + { + "component": "BotOffense", + "score": 0.00080095365 + }, + { + "component": "BotOffense", + "score": 0.0007947255 + }, + { + "component": "BotOffense", + "score": 0.0008559007 + }, + { + "component": "BotOffense", + "score": 0.00081038737 + }, + { + "component": "BotOffense", + "score": 0.001044386 + }, + { + "component": "BotOffense", + "score": 0.00109019 + }, + { + "component": "BotOffense", + "score": 0.0011695103 + }, + { + "component": "BotOffense", + "score": 0.0011160142 + }, + { + "component": "BotOffense", + "score": 0.0010566838 + }, + { + "component": "BotOffense", + "score": 0.0010691263 + }, + { + "component": "BotOffense", + "score": 0.0012255674 + }, + { + "component": "BotOffense", + "score": 0.0012113064 + }, + { + "component": "BotOffense", + "score": 0.0017546144 + }, + { + "component": "BotOffense", + "score": 0.0017207355 + }, + { + "component": "BotOffense", + "score": 0.0018102111 + }, + { + "component": "BotOffense", + "score": 0.0016613906 + }, + { + "component": "BotOffense", + "score": 0.0014895174 + }, + { + "component": "BotOffense", + "score": 0.0013777326 + }, + { + "component": "BotOffense", + "score": 0.0066153924 + } + ], + "suggestedResponses": [ + { + "text": "What is the difference between baking powder and baking soda?", + "author": "user", + "createdAt": "2024-02-05T08:00:07.1591424+00:00", + "timestamp": "2024-02-05T08:00:07.1591424+00:00", + "messageId": "05ce9e2c-7401-45cc-b96f-930bdf1cf4db", + "messageType": "Suggestion", + "offense": "Unknown", + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "SuggestionChipsFalconService" + }, + { + "text": "Can I use milk instead of buttermilk in these recipes?", + "author": "user", + "createdAt": "2024-02-05T08:00:07.1591435+00:00", + "timestamp": "2024-02-05T08:00:07.1591435+00:00", + "messageId": "a9629ada-9bb1-4a76-9358-46ba485f514b", + "messageType": "Suggestion", + "offense": "Unknown", + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "SuggestionChipsFalconService" + }, + { + "text": "Do you have any gluten-free cake recipe?", + "author": "user", + "createdAt": "2024-02-05T08:00:07.1591439+00:00", + "timestamp": "2024-02-05T08:00:07.1591439+00:00", + "messageId": "b50c594b-f67b-49dc-a330-1f7930f1dbc0", + "messageType": "Suggestion", + "offense": "Unknown", + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "SuggestionChipsFalconService" + } + ] + }, + { + "text": "Cake recipe", + "hiddenText": "```json\n{\"recipe_search_results\":[{\"index\":\"1\",\"context\":\"{\\\"recipe_id\\\":\\\"6240a2ae181d403ba0d9720b378d7be3\\\"}\",\"url\":\"https://iambaker.net/cake-recipes/\"},{\"index\":\"2\",\"context\":\"{\\\"recipe_id\\\":\\\"c4d3dba8bfd4c4475d739e3f8828d179\\\"}\",\"url\":\"https://livforcake.com/vanilla-cake/\"},{\"index\":\"3\",\"context\":\"{\\\"recipe_id\\\":\\\"b5c2c862ca0d7c771d717257c7cdf46c\\\"}\",\"url\":\"https://preppykitchen.com/1448-2/\"}]}\n```", + "author": "bot", + "createdAt": "2024-02-05T08:00:04.5509483+00:00", + "timestamp": "2024-02-05T08:00:04.5509483+00:00", + "messageId": "e7a9ee43-2760-40c4-be27-546bb6de2ddb", + "requestId": "6d94fedd-f7b5-42e3-bb5d-380b66528949", + "messageType": "RenderCardRequest", + "offense": "None", + "adaptiveCards": [ + { + "type": "AdaptiveCard", + "version": "1.0", + "body": [ + { + "type": "RichTextBlock", + "inlines": [ + { + "type": "TextRun", + "isSubtle": true, + "italic": true, + "text": "Cake recipe" + } + ] + } + ] + } + ], + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "DeepLeo" + } + ], + "firstNewMessageIndex": 1, + "defaultChatName": null, + "conversationId": "51D|BingProd|98B347959B0B6FE2D5B23C56CC6F6C29CA387E879F46B630AB96918FE55D2B91", + "requestId": "6d94fedd-f7b5-42e3-bb5d-380b66528949", + "conversationExpiryTime": "2024-02-05T14:00:07.2264051Z", + "shouldInitiateConversation": true, + "telemetry": { + "startTime": "2024-02-05T07:59:47.4581744Z" + }, + "throttling": { + "maxNumUserMessagesInConversation": 30, + "numUserMessagesInConversation": 1, + "maxNumLongDocSummaryUserMessagesInConversation": 50, + "numLongDocSummaryUserMessagesInConversation": 0 + }, + "result": { + "value": "Success", + "message": "Cake recipe", + "serviceVersion": "20240203.103" + } + } +} \ No newline at end of file diff --git a/test/unit_test/back-end/manual_test/test.jpg b/test/unit_test/back-end/manual_test/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff2d4ebf8ecf9f4947d286221fd2be57aecd5a28 GIT binary patch literal 88731 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

q-|k* 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 literal 0 HcmV?d00001 diff --git a/test/unit_test/back-end/manual_test/test_bot_manual.py b/test/unit_test/back-end/manual_test/test_bot_manual.py index 49bb820..1e1d7ad 100644 --- a/test/unit_test/back-end/manual_test/test_bot_manual.py +++ b/test/unit_test/back-end/manual_test/test_bot_manual.py @@ -22,10 +22,10 @@ async def test_ask() -> None: str(Path(str(Path.cwd()) + "/copilot_cookies.json")), encoding="utf-8").read()) bot = await Chatbot.create(cookies=cookies, mode=mode) response = await bot.ask( - prompt="Beef noodle recipe", + prompt="Cake recipe", conversation_style=ConversationStyle.balanced, - search_result=True, - autosave=False + simplify_response=True, + search_result=True ) # If you are using non ascii char you need set ensure_ascii=False print(json.dumps(response, indent=2, ensure_ascii=False)) diff --git a/test/unit_test/back-end/manual_test/test_bot_with_file.py b/test/unit_test/back-end/manual_test/test_bot_with_file.py index e822007..e356c65 100644 --- a/test/unit_test/back-end/manual_test/test_bot_with_file.py +++ b/test/unit_test/back-end/manual_test/test_bot_with_file.py @@ -20,7 +20,7 @@ async def test_ask() -> None: prompt="What does this image show?", conversation_style=ConversationStyle.balanced, simplify_response=True, - attachment={"image_url": r"https://images.yourstory.com/cs/2/96eabe90392211eb93f18319e8c07a74/Image54nh-1683225460858.jpg"}) + attachment={"filename": "test.jpg"}) # If you are using non ascii char you need set ensure_ascii=False print(json.dumps(response, indent=2, ensure_ascii=False)) # Raw response From 3e5d538a0f75947f885edab66818a8f343068e40 Mon Sep 17 00:00:00 2001 From: JE-Chen <33644111+JE-Chen@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:54:17 +0800 Subject: [PATCH 2/4] Make response add image_create_text Make response add image_create_text --- re_edge_gpt/chat/re_edge_gpt.py | 4 + test/source/generate_image_response.json | 195 ++++++++++++++++++ .../back-end/manual_test/test_bot_manual.py | 2 +- 3 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 test/source/generate_image_response.json diff --git a/re_edge_gpt/chat/re_edge_gpt.py b/re_edge_gpt/chat/re_edge_gpt.py index 05c172c..c48ea20 100644 --- a/re_edge_gpt/chat/re_edge_gpt.py +++ b/re_edge_gpt/chat/re_edge_gpt.py @@ -110,6 +110,7 @@ async def ask( }) if not message: raise Exception("No message found") + image_create_text = "" suggestions = [] source_texts = [] source_links = [] @@ -123,12 +124,15 @@ async def ask( for source in source_attr: source_texts.append(source.get("providerDisplayName")) source_links.append(source.get("seeMoreUrl")) + if detail.get("contentType") == "IMAGE" and detail.get("messageType") == "GenerateContentQuery": + image_create_text = detail.get("text") return { "text": message["text"], "author": message["author"], "source_texts": source_texts, "source_links": source_links, "suggestions": suggestions, + "image_create_text": image_create_text, "messages_left": messages_left, "max_messages": response["item"]["throttling"][ "maxNumUserMessagesInConversation" diff --git a/test/source/generate_image_response.json b/test/source/generate_image_response.json new file mode 100644 index 0000000..ac7dd56 --- /dev/null +++ b/test/source/generate_image_response.json @@ -0,0 +1,195 @@ +{ + "type": 2, + "invocationId": "3", + "item": { + "messages": [ + { + "text": "Can u generate some food image", + "author": "user", + "from": { + "id": "914798280546316", + "name": null, + "partnerId": null + }, + "createdAt": "2024-02-06T01:35:56.0009996+00:00", + "timestamp": "2024-02-06T09:35:54+08:00", + "locale": "en-us", + "market": "en-us", + "region": "us", + "locationInfo": { + "country": "Australia", + "state": "South Australia", + "city": "Adelaide", + "sourceType": 1, + "isImplicitLocationIntent": false + }, + "locationHints": [ + { + "country": "United States", + "countryConfidence": 8, + "state": "California", + "city": "Los Angeles", + "timeZoneOffset": 8, + "sourceType": 1, + "center": { + "latitude": 34.05369, + "longitude": -118.24277, + "height": null + }, + "regionType": 2 + } + ], + "messageId": "c5044fee-d168-45dd-b644-9c22c6fc0743", + "requestId": "c5044fee-d168-45dd-b644-9c22c6fc0743", + "nlu": { + "scoredClassification": { + "classification": "CHAT_GPT", + "score": null + }, + "classificationRanking": [ + { + "classification": "CHAT_GPT", + "score": null + } + ], + "qualifyingClassifications": null, + "ood": null, + "metaData": null, + "entities": null + }, + "offense": "None", + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "cib", + "scores": [ + { + "component": "UserOffense", + "score": 0.0064882697 + }, + { + "component": "suicide_help", + "score": 0.01621503 + } + ], + "inputMethod": "Keyboard" + }, + { + "contentType": "IMAGE", + "text": "food", + "author": "bot", + "createdAt": "2024-02-06T01:35:57.4047391+00:00", + "timestamp": "2024-02-06T01:35:57.4047391+00:00", + "messageId": "06836583-aa88-43de-b1f7-8eaf9e527a95", + "requestId": "c5044fee-d168-45dd-b644-9c22c6fc0743", + "messageType": "GenerateContentQuery", + "offense": "None", + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "DeepLeo", + "invocation": "graphic_art(prompt=\"food\")" + }, + { + "text": "I'll try to create that.", + "author": "bot", + "createdAt": "2024-02-06T01:35:58.0076269+00:00", + "timestamp": "2024-02-06T01:35:58.0076269+00:00", + "messageId": "ebe1e06f-e47d-470f-97ef-bda48a3d257c", + "requestId": "c5044fee-d168-45dd-b644-9c22c6fc0743", + "offense": "None", + "adaptiveCards": [ + { + "type": "AdaptiveCard", + "version": "1.0", + "body": [ + { + "type": "TextBlock", + "text": "I'll try to create that.\n", + "wrap": true + } + ] + } + ], + "sourceAttributions": [], + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "DeepLeo", + "suggestedResponses": [ + { + "text": "Can you draw a picture of a pizza?", + "author": "user", + "createdAt": "2024-02-06T01:35:59.1695507+00:00", + "timestamp": "2024-02-06T01:35:59.1695507+00:00", + "messageId": "aa8d3cb2-92e7-43d2-981e-173380ec5eea", + "messageType": "Suggestion", + "offense": "Unknown", + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "SuggestionChipsFalconService" + }, + { + "text": "How about drawing an image of sushi?", + "author": "user", + "createdAt": "2024-02-06T01:35:59.1695517+00:00", + "timestamp": "2024-02-06T01:35:59.1695517+00:00", + "messageId": "ae4581c4-b21a-418e-8964-60c37450b68d", + "messageType": "Suggestion", + "offense": "Unknown", + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "SuggestionChipsFalconService" + }, + { + "text": "Draw me some fruits", + "author": "user", + "createdAt": "2024-02-06T01:35:59.169552+00:00", + "timestamp": "2024-02-06T01:35:59.169552+00:00", + "messageId": "16d9139c-922e-45d4-8234-40560f29ee0d", + "messageType": "Suggestion", + "offense": "Unknown", + "feedback": { + "tag": null, + "updatedOn": null, + "type": "None" + }, + "contentOrigin": "SuggestionChipsFalconService" + } + ] + } + ], + "firstNewMessageIndex": 1, + "defaultChatName": null, + "conversationId": "51D|BingProd|BD37D1DE4DBC113C0C68AB4439EDD367C4162BA398653EACD73368321C8D1D2F", + "requestId": "c5044fee-d168-45dd-b644-9c22c6fc0743", + "conversationExpiryTime": "2024-02-06T07:35:59.2109401Z", + "shouldInitiateConversation": true, + "telemetry": { + "startTime": "2024-02-06T01:35:55.9945813Z" + }, + "throttling": { + "maxNumUserMessagesInConversation": 30, + "numUserMessagesInConversation": 1, + "maxNumLongDocSummaryUserMessagesInConversation": 50, + "numLongDocSummaryUserMessagesInConversation": 0 + }, + "result": { + "value": "Success", + "message": "I'll try to create that.", + "serviceVersion": "20240203.114" + } + } +} \ No newline at end of file diff --git a/test/unit_test/back-end/manual_test/test_bot_manual.py b/test/unit_test/back-end/manual_test/test_bot_manual.py index 1e1d7ad..a9d4f86 100644 --- a/test/unit_test/back-end/manual_test/test_bot_manual.py +++ b/test/unit_test/back-end/manual_test/test_bot_manual.py @@ -22,7 +22,7 @@ async def test_ask() -> None: str(Path(str(Path.cwd()) + "/copilot_cookies.json")), encoding="utf-8").read()) bot = await Chatbot.create(cookies=cookies, mode=mode) response = await bot.ask( - prompt="Cake recipe", + prompt="Can u generate some food image", conversation_style=ConversationStyle.balanced, simplify_response=True, search_result=True From 4e6500690da5f1a24ecfbd1a6d8b10aa04abcd66 Mon Sep 17 00:00:00 2001 From: JE-Chen <33644111+JE-Chen@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:58:06 +0800 Subject: [PATCH 3/4] Update pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2e92ccb..dbcd81e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta" [project] name = "re_edge_gpt_dev" -version = "0.0.32" +version = "0.0.33" authors = [ { name = "JE-Chen", email = "jechenmailman@gmail.com" }, ] From 180eb84bf1a18ce16a3d0bdcc228519cfcb33ec9 Mon Sep 17 00:00:00 2001 From: JE-Chen <33644111+JE-Chen@users.noreply.github.com> Date: Tue, 6 Feb 2024 13:56:49 +0800 Subject: [PATCH 4/4] Update stable version to 0.0.30 Update stable version to 0.0.30 --- stable.toml => dev.toml | 4 ++-- pyproject.toml | 4 ++-- test/unit_test/back-end/manual_test/test_bot_manual.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename stable.toml => dev.toml (96%) diff --git a/stable.toml b/dev.toml similarity index 96% rename from stable.toml rename to dev.toml index ad2f594..dbcd81e 100644 --- a/stable.toml +++ b/dev.toml @@ -5,8 +5,8 @@ requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] -name = "re_edge_gpt" -version = "0.0.29" +name = "re_edge_gpt_dev" +version = "0.0.33" authors = [ { name = "JE-Chen", email = "jechenmailman@gmail.com" }, ] diff --git a/pyproject.toml b/pyproject.toml index dbcd81e..46a3284 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,8 +5,8 @@ requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] -name = "re_edge_gpt_dev" -version = "0.0.33" +name = "re_edge_gpt" +version = "0.0.30" authors = [ { name = "JE-Chen", email = "jechenmailman@gmail.com" }, ] diff --git a/test/unit_test/back-end/manual_test/test_bot_manual.py b/test/unit_test/back-end/manual_test/test_bot_manual.py index a9d4f86..4c9aafa 100644 --- a/test/unit_test/back-end/manual_test/test_bot_manual.py +++ b/test/unit_test/back-end/manual_test/test_bot_manual.py @@ -22,7 +22,7 @@ async def test_ask() -> None: str(Path(str(Path.cwd()) + "/copilot_cookies.json")), encoding="utf-8").read()) bot = await Chatbot.create(cookies=cookies, mode=mode) response = await bot.ask( - prompt="Can u generate some food image", + prompt="Homemade toast recipe", conversation_style=ConversationStyle.balanced, simplify_response=True, search_result=True