How to call text-to-image DIAL applications
From this notebook, you will learn how to call text-to-image applications via DIAL API chat/completions call.
DIAL application is a general term, which encompasses model adapters and applications with any custom logic.
DIAL currently supports a few text-to-image model adapters:
These models follow the same pattern of usage: they take the last user message as a prompt for image generation and return the generated image in the response.
For example purposes, we are going to use a sample text-to-image
application called render-text
which prints the user prompt as an
image.
The application returns: 1. completion text with a Markdown image link to the generated image, 2. file attachment which contains either * a base64-encoded image or * a URL to the image stored in the DIAL storage.
The format of the image attachment is controlled by the user message,
which is expected to have the following format:
(base64|url),<text to render>
.
Setup
Step 1: install all the necessary dependencies and import the libraries we are going to use.
!pip install requests==2.32.3
!pip install openai==1.43.0
!pip install httpx==0.27.2
!pip install langchain-openai==0.1.23
import requests
import openai
import langchain_openai
from IPython.display import Markdown
Step 2: if DIAL Core server is already configured and running, set
env vars DIAL_URL
and APP_NAME
to point to the DIAL Core server and
the text-to-image application (or model) you want to use.
Otherwise, run the docker-compose
file
in a separate terminal to start the DIAL Core server locally along
with a sample render-text application. The DIAL Core will become
available at http://localhost:8080
:
docker compose up core render-text
Step 3: configure DIAL_URL
and APP_NAME
env vars. The default
values are configured under the assumption that DIAL Core is running
locally via the docker-compose file.
import os
dial_url = os.environ.get("DIAL_URL", "http://localhost:8080")
os.environ["DIAL_URL"] = dial_url
app_name = os.environ.get("APP_NAME", "render-text")
os.environ["APP_NAME"] = app_name
Step 4: define helpers to display images in the notebook:
import base64
from IPython.display import Image as IPImage
from IPython.display import display
def display_base64_image(image_base64):
image_binary = base64.b64decode(image_base64)
display(IPImage(data=image_binary))
DIAL attachments
The render-text
application returns an image in its response. The DIAL
API allows to specify a list of attachment files for each message in the
DIAL request as well as in the message returned in the DIAL response.
The files attached to the request we call input attachments. They
are saved at the path
messages/{message_idx}/custom_content/attachments/{attachment_idx}
.
And the files attached to the response we call output attachments.
They are saved at the path
message/custom_content/attachments/{attachment_idx}
.
A single attachment (in our case an image attachment) may either contain the content of the image encoded in base64:
{
"type": "image/png",
"title": "Image",
"data": "<base64-encoded image data>"
}
or reference the attachment content via a URL:
{
"type": "image/png",
"title": "Image",
"url": "<image URL>"
}
The image URL is either 1. a publicly accessible URL or 2. a URL to an image uploaded to the DIAL Core server beforehand.
Downloading file from the DIAL file storage
Let’s define a helper method, which downloads an image from the DIAL file storage given a file URL.
If application returns a relative URL, then it resolves it against the DIAL Core URL. If the URL points to the DIAL Core server, then we need to provide the DIAL Core headers to be able to download the file.
from urllib.parse import urlparse
def is_relative_url(url) -> bool:
parsed_url = urlparse(url)
return (
not parsed_url.scheme
and not parsed_url.netloc
and not url.startswith("/")
)
def download_file_as_base64(dial_url: str, file_url: str, dial_headers: dict[str, str]) -> str:
if is_relative_url(file_url):
file_url = f"{dial_url}/v1/{file_url}"
headers = dial_headers if file_url.startswith(dial_url) else {}
response = requests.get(file_url, headers=headers)
response.raise_for_status()
data = response.content
return base64.b64encode(data).decode()
Now we demonstrate how to call the application via DIAL API and extract the image from the response.
Using Curl
- The application deployment is called
app_name
. - The local DIAL Core server URL is
dial_url
. - The OpenAI API version we are going to use is
2023-12-01-preview
.
Therefore, the application is accessible via the url:
${DIAL_URL}/openai/deployments/${APP_NAME}/chat/completions?api-version=2023-12-01-preview
Using base64-encoded image data
The curl command with a singe message asking for base64-encoded image:
!curl -X POST "${DIAL_URL}/openai/deployments/${APP_NAME}/chat/completions?api-version=2023-12-01-preview" \
-H "Api-Key:dial_api_key" \
-H "Content-Type:application/json" \
-d '{"messages": [{"role": "user", "content": "base64,Hello world!"}]}'
{"choices":[{"index":0,"finish_reason":"stop","message":{"role":"assistant","custom_content":{"attachments":[{"index":0,"type":"image/png","title":"Image","data":"iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAIAAABM5OhcAAAGHUlEQVR4nO3ZXWhTZxzH8e9psrbaiNham6JFQS2+QDOsbL4N6lYmoiK+i7tQbwrihYoX4o26zgtFtwkrgyobY9NuoAiKgi+1RqlvuImgNxNFC0XxtbMqvrRJdpGDMaenNpX9183+Ppyb8+TJk+ecfGfSzEkkEPnHZfX0BuT9pLDEhMISEwpLTCgsMaGwxITCEhMKS0woLDGhsMSEwhITCktMKCwxobDExL8dluMwbFinp/9NGW5y2DAcx3wz/xcZhfWWO6u72Zlefmf0USgmFJaYMAlr3z6mTKFfP0Ihpk4lGu3e048eZcYMCgvJzqa4mAULuHjRZ9rYsTgON2+mRn79FcchGOTx49RgbS2OQ01NpusnP/cvXaKsjECAFy/8N7l3r3uN+flUVHD2bPeu8f2XSHR9AEOH+j80dKh3kXXrACZPpqaGb75h9GgCAQ4d8l+q48pffQUwciRbt7JnD19+SThMIMAvv3hfev16gJ07UyNVVQSDAAcPpgbnzwdoasp0fSAcprSUadOoqSEW89nkmjXuNdbW8t13TJpEOMzAgWm3ouOd6VVHZpMyDuvYMYCZM2lvd0daWykuZvBg2tp8lvKcnjqF4xCJ8ORJavD2bcJhcnO5cSPtpc+fB1i0KDVSWsoXX5CdzerV7kg8TkEBH37YjfWTVq7sdJOHDwNUVqauMRZj7lzvf6gKK4NJUFJCS4vPUVKSdvtmzQK4ejXt6Rs2ANTX+7xJntM5cwCOHPFu4PvvAdauTRuMxykuprCQeJxEgtu3Aerq+OQTIhF3zu+/A2zc2I31k+7d63STyWu8cCFthRs3FFbakdmkrryeWVhI//7e+HbvBvj2W583yXM6aBBZWbx86d3AtWsAH3/sHa+qArh8mUSCujqAO3fYsAHH4cEDEgm2bAH4449urA8UFHgv/81NFhURDKb+uXp9hEIKK3UEu64GgKIifvvNZ3zxYu7eTZ22tNDezoABPjOfPev6VR49cr9TewwZ4j7qMXs2O3dSX08kQjTK6NGEw3z6KdXVRKPMm0d9PSUljBvXvfWTiXTm4UMGDiQQ8I7n5/P0adfX2EtkGlZuLhUV/uNvCoWIxzlwwGfm8OFdv0p+Pvfv8+qV971vbnYf9fjsM0IhTpxg7VqiUSorASZMoE8fTp5k5kzOnGH58ndf31ffvjx4QCzmbeuvvzJ6ei/xD//cUFZGayvl5VRUpI5YjGiUtraunz5pEvE4DQ3e8ePHASZP9o7n5DBtGqdP09TEtWtMneoOTpxIQwONjTx/zuzZ776+r0iE9nb3T4fX/vyT1ta0kVu33I/RXiqTz0sy/quwthagujo18uQJo0YRCvHsmc9SntPkL16RCE+fpgbv3CEcJieH69d9NvDzzwArVuA43L/vDm7eDLBsGf36pX2jymT9jhfrGdm1C2D6dPePhkSCtjb3R403b8XXX1Nezv79Pf91p0eOzCZlHFZ7O59/DrBkCT/8wI4djBlDVhZ79rgTcnMJBtm1i5YWn9NEgo0bAUaOZNs26uqornZ/Z/rpJ/8NPHxIIMAHH1BWlho8cwYgEGDhQu/8LtfveLGeTcZi7jVWVvLjj+zYwUcfMX48gwen3Yq8PIDy8p5/j3vkyGxSd34gffWKLVsYM4acHMJhZs2isTH16Lp15OWRm8uVKz6nyePwYaZPp6CAYJCiIubN49y5t20v+eVv1aq0PSS/gO/e7TP/7et3vNiOm3z+nE2bGDGC7GyGDGHpUpqbvbeiqoq8PLZv7/n3uEcOJ9GbvweIGf1PaDGhsMSEwhITCktMKCwxobDEhMISEwpLTCgsMaGwxITCEhMKS0woLDGhsMSEwhITCktMKCwxobDEhMISEwpLTCgsMaGwxITCEhMKS0woLDGhsMSEwhITCktMKCwxobDEhMISEwpLTCgsMaGwxITCEhMKS0woLDGhsMSEwhITCktMKCwxobDEhMISEwpLTCgsMaGwxITCEhMKS0woLDGhsMSEwhITCktMKCwxobDEhMISEwpLTCgsMaGwxITCEhMKS0woLDGhsMSEwhITCktMKCwxobDEhMISEwpLTCgsMfE3CAFF1FZJkwQAAAAASUVORK5CYII="}]},"content":"![Image](data:image/png;base64,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)"}}],"usage":null,"id":"3e89841d-6ad3-4582-be1e-92b862a21139","created":1707310924,"object":"chat.completion"}
Using DIAL storage
Now with the DIAL storage, the request is the same, but we are requesting an image URL instead of base64-encoded image data:
!curl -X POST "${DIAL_URL}/openai/deployments/${APP_NAME}/chat/completions?api-version=2023-12-01-preview" \
-H "Api-Key:dial_api_key" \
-H "Content-Type:application/json" \
-d '{"messages": [{"role": "user", "content": "url,Hello world!"}]}'
{"choices":[{"index":0,"finish_reason":"stop","message":{"role":"assistant","custom_content":{"attachments":[{"index":0,"type":"image/png","title":"Image","url":"files/FSWLtFA648cQNf6WfxHZcFzdABKNsTr7ygwQjYbiDi1n/appdata/render-text/images/picture.png"}]},"content":"![Image](data:image/png;base64,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)"}}],"usage":null,"id":"1e6d8fc1-b25b-454e-92fa-52557c03e19f","created":1707310928,"object":"chat.completion"}
Using Python library Requests
Let’s make an HTTP request using the Python requests
library and then
display the generated image.
The arguments are identical to the curl command above.
Non-streaming mode using base64-encoded image data
Let’s call the application in the non-streaming mode:
response = requests.post(
f"{dial_url}/openai/deployments/{app_name}/chat/completions?api-version=2023-12-01-preview",
headers={"Api-Key": "dial_api_key"},
json={"messages": [{"role": "user", "content": "base64,requests non-stream"}]},
)
body = response.json()
display(body)
message = body["choices"][0]["message"]
completion = message["content"]
print(f"Completion: {completion!r}")
assert completion.startswith("![Image](data:image/png;base64,"), "Unexpected completion"
image_data = message["custom_content"]["attachments"][0]["data"]
display_base64_image(image_data)
{'choices': [{'index': 0,
'finish_reason': 'stop',
'message': {'role': 'assistant',
'custom_content': {'attachments': [{'index': 0,
'type': 'image/png',
'title': 'Image',
'data': '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'}]},
'content': '![Image](data:image/png;base64,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)'}}],
'usage': None,
'id': '2c278f57-f6ac-4cd7-ad10-cc8f7fa42ea0',
'created': 1707310932,
'object': 'chat.completion'}
Completion: '![Image](data:image/png;base64,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)'
Non-streaming mode using DIAL storage
Now we ask to return URL to the image in DIAL storage. The only difference is that we need to download the image first and then display it.
response = requests.post(
f"{dial_url}/openai/deployments/{app_name}/chat/completions?api-version=2023-12-01-preview",
headers={"Api-Key": "dial_api_key"},
json={"messages": [{"role": "user", "content": "url,Requests non-stream"}]},
)
body = response.json()
display(body)
message = body["choices"][0]["message"]
completion = message["content"]
assert completion.startswith("![Image](data:image/png;base64,"), "Unexpected completion"
{'choices': [{'index': 0,
'finish_reason': 'stop',
'message': {'role': 'assistant',
'custom_content': {'attachments': [{'index': 0,
'type': 'image/png',
'title': 'Image',
'url': 'files/FSWLtFA648cQNf6WfxHZcFzdABKNsTr7ygwQjYbiDi1n/appdata/render-text/images/picture.png'}]},
'content': '![Image](data:image/png;base64,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)'}}],
'usage': None,
'id': '05987e87-3818-41c1-b4fd-c42d6b765926',
'created': 1707310938,
'object': 'chat.completion'}
The application completion contains a Markdown image, which we could display in the notebook:
Markdown(completion)
The same image is saved as an image attachment. We download the image from the DIAL storage first and then display it:
image_url = message["custom_content"]["attachments"][0]["url"]
image_data = download_file_as_base64(dial_url, image_url, {"Api-Key": "dial_api_key"})
display_base64_image(image_data)
From now on, we only demonstrate the use cases with DIAL storage.
Streaming mode using DIAL storage
When streaming is enabled, the chat completion returns a sequence of messages, each containing a chunk of a generated response:
response = requests.post(
f"{dial_url}/openai/deployments/{app_name}/chat/completions?api-version=2023-12-01-preview",
headers={"Api-Key": "dial_api_key"},
json={"messages": [{"role": "user", "content": "url,Requests stream"}], "stream": True},
)
for chunk in response.iter_lines():
print(chunk)
b'data: {"choices":[{"index":0,"finish_reason":null,"delta":{"role":"assistant"}}],"usage":null,"id":"9cae589e-238f-405d-8747-e1f5544ad6dc","created":1707310961,"object":"chat.completion.chunk"}'
b''
b'data: {"choices":[{"index":0,"finish_reason":null,"delta":{"custom_content":{"attachments":[{"index":0,"type":"image/png","title":"Image","url":"files/FSWLtFA648cQNf6WfxHZcFzdABKNsTr7ygwQjYbiDi1n/appdata/render-text/images/picture.png"}]}}}],"usage":null,"id":"9cae589e-238f-405d-8747-e1f5544ad6dc","created":1707310961,"object":"chat.completion.chunk"}'
b''
b'data: {"choices":[{"index":0,"finish_reason":null,"delta":{"content":"![Image](data:image/png;base64,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)"}}],"usage":null,"id":"9cae589e-238f-405d-8747-e1f5544ad6dc","created":1707310961,"object":"chat.completion.chunk"}'
b''
b'data: {"choices":[{"index":0,"finish_reason":"stop","delta":{}}],"usage":null,"id":"9cae589e-238f-405d-8747-e1f5544ad6dc","created":1707310961,"object":"chat.completion.chunk"}'
b''
b'data: [DONE]'
b''
Using OpenAI Python SDK
The DIAL deployment could be called using OpenAI Python SDK as well.
openai_client = openai.AzureOpenAI(
azure_endpoint=dial_url,
azure_deployment=app_name,
api_key="dial_api_key",
api_version="2023-12-01-preview",
)
Let’s call the application in the non-streaming mode:
chat_completion = openai_client.chat.completions.create(
messages=[
{
"role": "user",
"content": "url,OpenAI non-stream",
}
],
model=app_name,
)
print(chat_completion)
message = chat_completion.choices[0].message
completion = message.content
assert completion.startswith("![Image](data:image/png;base64,"), "Unexpected completion"
ChatCompletion(id='a029ad1c-ad4d-40e3-b293-6252f73dc079', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='![Image](data:image/png;base64,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)', role='assistant', function_call=None, tool_calls=None, custom_content={'attachments': [{'index': 0, 'type': 'image/png', 'title': 'Image', 'url': 'files/FSWLtFA648cQNf6WfxHZcFzdABKNsTr7ygwQjYbiDi1n/appdata/render-text/images/picture.png'}]}))], created=1707310972, model=None, object='chat.completion', system_fingerprint=None, usage=None)
The application completion contains a Markdown image, which we could display in the notebook:
Markdown(completion)
The same image is saved as an image attachment. We download the image from the DIAL storage first and then display it:
image_url = message.custom_content["attachments"][0]["url"]
image_data = download_file_as_base64(dial_url, image_url, {"Api-Key": "dial_api_key"})
display_base64_image(image_data)
Let’s call the application in the streaming mode:
chat_completion = openai_client.chat.completions.create(
messages=[
{
"role": "user",
"content": "url,OpenAI stream",
}
],
stream=True,
model=app_name,
)
completion = ""
for chunk in chat_completion:
print(chunk)
content = chunk.choices[0].delta.content
if content:
completion += content
assert completion.startswith("![Image](data:image/png;base64,"), "Unexpected completion"
Markdown(completion)
ChatCompletionChunk(id='6b6dd28f-4074-4dfe-bf31-9f51540bdd70', choices=[Choice(delta=ChoiceDelta(content=None, function_call=None, role='assistant', tool_calls=None), finish_reason=None, index=0, logprobs=None)], created=1707310983, model=None, object='chat.completion.chunk', system_fingerprint=None, usage=None)
ChatCompletionChunk(id='6b6dd28f-4074-4dfe-bf31-9f51540bdd70', choices=[Choice(delta=ChoiceDelta(content=None, function_call=None, role=None, tool_calls=None, custom_content={'attachments': [{'index': 0, 'type': 'image/png', 'title': 'Image', 'url': 'files/FSWLtFA648cQNf6WfxHZcFzdABKNsTr7ygwQjYbiDi1n/appdata/render-text/images/picture.png'}]}), finish_reason=None, index=0, logprobs=None)], created=1707310983, model=None, object='chat.completion.chunk', system_fingerprint=None, usage=None)
ChatCompletionChunk(id='6b6dd28f-4074-4dfe-bf31-9f51540bdd70', choices=[Choice(delta=ChoiceDelta(content='![Image](data:image/png;base64,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)', function_call=None, role=None, tool_calls=None), finish_reason=None, index=0, logprobs=None)], created=1707310983, model=None, object='chat.completion.chunk', system_fingerprint=None, usage=None)
ChatCompletionChunk(id='6b6dd28f-4074-4dfe-bf31-9f51540bdd70', choices=[Choice(delta=ChoiceDelta(content=None, function_call=None, role=None, tool_calls=None), finish_reason='stop', index=0, logprobs=None)], created=1707310983, model=None, object='chat.completion.chunk', system_fingerprint=None, usage=None)
Using LangChain
The LangChain library is
not suitable as a client of text-to-image applications, since
langchain-openai
ignores additional fields attached to the response
message.
Meaning that the response won’t contain any image attachments. It’s still possible to use the application completion if an application returns image that way:
from langchain_core.messages import HumanMessage
llm = langchain_openai.AzureChatOpenAI(
azure_endpoint=dial_url,
azure_deployment=app_name,
api_key="dial_api_key",
api_version="2023-12-01-preview",
)
Let’s call the application in the non-streaming mode:
output = llm.generate(messages=[[HumanMessage(content="url,LangChain non-stream")]])
print(output)
completion = output.generations[0][0].text
print(f"Completion: {completion!r}")
assert completion.startswith("![Image](data:image/png;base64,"), "Unexpected completion"
Markdown(completion)
generations=[[ChatGeneration(text='![Image](data:image/png;base64,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)', generation_info={'finish_reason': 'stop', 'logprobs': None}, message=AIMessage(content='![Image](data:image/png;base64,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)'))]] llm_output={'token_usage': {}, 'model_name': 'gpt-3.5-turbo'} run=[RunInfo(run_id=UUID('d533d005-95f2-4c24-a45d-be90e7f67e58'))]
Completion: '![Image](data:image/png;base64,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)'
Let’s call the application in the streaming mode:
output = llm.stream(input=[HumanMessage(content="url,LangChain stream")])
completion = ""
for chunk in output:
print(chunk.dict())
completion += chunk.content
assert completion.startswith("![Image](data:image/png;base64,"), "Unexpected completion"
Markdown(completion)
{'content': '', 'additional_kwargs': {}, 'type': 'AIMessageChunk', 'example': False}
{'content': '', 'additional_kwargs': {}, 'type': 'AIMessageChunk', 'example': False}
{'content': '![Image](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAIAAABM5OhcAAAJAUlEQVR4nO2cbUyVVRzAf8hLvIO8BAgBxkuLBkO3PgSYkChYupANC0Rd5noZ5JptwUYjwnBtqRHxIQoVtqI2bK4XlohbrmBFWX2ItSxJCd/WYMVLQAjcPtxnPDwX5D4oR5D+v50P9xzO/Z//vc+P8zz3uedcB4sFQZh3li10AsLSRMQSlCBiCUoQsQQliFiCEkQsQQkilqAEEUtQgoglKEHEEpQgYglKELEEJYhYghJELEEJS1YsBwciIxc6if8xpsRahAepqYlHHyU4GBcXAgJIT6ehYZ6HSE5m+/Z5jvn/4fabsa5dY/t2Nm3iyhVefJEjR9i7l8uX2baNxx9nfHzeBrpyhcuX5y3a/w6LxX4BIiJM9bwF5ZlnAIqLmZjQG8fGyMkBeOONecu5r4+hoYV/vbdpMdfJxEHq6aGggJUrcXMjJobycsbGbCOcP8+OHYSF4eHBqlW8955tkMZG1qzB0xNfX1JSOH2a++4z2P/ttwBpaTMk0NeHmxtRUYYROzvJz7/uiGZynlP+UvR3z1Qne2KNjnL//bi7U1ZGXR3p6QCvvGKIEB5OYiLr1lFXx4EDhIUB1NfrffbuBUhOpqaGt94iKQl/f1asMIj15JMAJ07MnEZREampDA5qI951FwkJZGRQV8frrxMUZBjRTM5TxbKbvxSDM6Y62RPr+HGA/fu16sAAzs7cc48hArB+PePjWsuZMwCrV2vVpiaA9HR9zhgfJzvb9nwdHY2TE8PDpnIGHnlEP2O2thpGNJPzVLFmz1+K7ftvqpM9sb74gpISzp3TW0JDcXU1RAC+/NLwrOXLcXbWHm/eDNDebujQ2WkrlpsbwcFmcwba2gyNvr76iGZythFrlvyl2BQHi4ntXw4ORERw4YKdbh0dtLXR3c3QELW1DAzoh8TBAUdHhoZwcdH7R0Twxx9an+BgensZGcHR0RDTy0s/tQFubvj4cPWqqZydnBgawtl55hHN5Dz5qu3mL9jgNC9RenvJzaWlhago4uNxcZnhY39goOGoAA4OhggBAbZWAX5+DA7q1aAgLl1iZARXV/tZBQQYrJo+ot2czecv2GJmWsPeqTAvD6CqSm8JDzcEnzFCRITex9sbJyfDh7LJ9qlxHnsM4OTJmdPIzycz0+yIc8rZbjQpNsVcJ3tieXvj56dXJya0GWX2CFMPzJo1AK2thg6//GJrv/Uaf9KeqeXXXwHS082OOKecRay5lvm58+7iwvAwIyNa9ZNPtMcTE2Yj7NgBUFGhHUVgbIyXXrLt9vDDZGRw4gT79xvaR0bYtQvghRduXc7CLJi9xhoYoLp6hvaMDGJiyMqitpYtW8jNpauLd94hMpILF/jnH7y8TMXftYvGRj7/nA0byMujv5+GBiYmCA3l0iVDz4YGNm6kpITmZnJy8PHh9985coTubioqyMw0+YLmIWdhNsxMa7PwwQdYLAwMUFhISIh2S/r4cTZuBDh7dg6nkuFhysqIjsbFhbAwdu7k4kXta2abJ46OUl1NUhI+Pjg7s2IFOTl89ZVtzrOPOKeczeQvZWoxdbvhFlBRwaef8tFHhIbqjf39+PgQHc1vvy1cZsINsVhWN4SE0N7Ou+8aGvftA9iyZUEyEm6KxTJjjYywdi3ffUdODg89xOgozc00NREXR1sbvr4LnZ8wRxaLWEBfH1VVHDtGVxcjI6xcSXY2xcVyKX1bsojEEpYSi+UaS1hiiFiCEkQsQQkilqAEEUtQws2KVVlJWdl8JCIsLW72dkNkJF1dyD0LwQY5FQpKsC/W+DhVVcTH4+FBaChbt+pfCTs40NWlPZhcp2vdj//DDyQk4OioL3g6doyUFLy88PQkLY3Tpw2j9PZSWMjdd+PuTmws+/YZFgpbYzY3k5iIuzthYZSXY7Hw9dc88ACenoSEsGcPw8M392YI84jd9Q/PPw+QlUV9PSUluLpy5510d2Ox0NhIYCBAYyONjfoKk+BgYmPJyKC6WtsvVVQEkJxMdTWHDnHvvTg68tln2lPMbPELDCQ6mgMHqKkhLg6gqIiICEpLOXqU5GSAZ59d+OUiUqzFfg9fX7y9uXZNqx48CFBcrFWnr0myUlCgt5w8CbBpk76kvb+fkBBCQ7WwJrclvv22Vj17VmspKtJa+vpwdcXTc4ZV81IWpNjvERSEszMXL2rV/n5aWvjxR616PbH+/FNvse4Z7OgwdCstBTh1CovpbYk9PXrL8uUAZ87oLatWAVy9uvDvqRSLxcTS5IICSktJTOSpp8jOZvVq7VQ1C/7+2inSyjff4ONDaCh//603xsYC/PQT69aRmkpqKh0d1NRoW/z6+/WLMyt+fvj761UPD/76i5gYQwvYPktYMMzY19BAfLzWPyrK8GMYM85YNqt4na5v76uvYrHQ08P69VrwrCy2bsXd3RAWCA83xLSOO/UHZ9auBTh/fuH/WaVYzMxYQG4uubn8/DONjbz5Jvn5jI2xc6dZdz09mZjg449n+FNUFMCePbS0UFXFc89p7dZNxlOZcXeobBldvMzu3blzHD3K99/rLe3tAElJWtXMjPXggwD9/YbGU6d4+WU6O7Hc0LbE6ePKjLWoip37WGNjPPEETz+t31Wybhee3PZu3RQ/NDRbkG3bACor9ZbBQQoLOXiQ4GCQLX5LErvqWbeSpqdTW0tNjfbha/KH89LSAHbv5vBhrYVps8vYGBs2AOTlcfgwlZXExbFsGe+/r3XYvRsgM5P6esrLCQvTfvJ0cpKbHlNmrEVe7Pf4918OHSIhAQ8P/PxISeHDD/W/trYSG4uzs34umy6BxcLoKK+9Rlwcd9xBcDCbNxt209/AtkQRa5EXWfMuKEG+hBaUIGIJShCxBCWIWIISRCxBCSKWoAQRS1CCiCUoQcQSlCBiCUoQsQQliFiCEkQsQQkilqAEEUtQgoglKEHEEpQgYglKELEEJYhYghJELEEJIpagBBFLUIKIJShBxBKUIGIJShCxBCWIWIISRCxBCSKWoAQRS1CCiCUoQcQSlCBiCUoQsQQliFiCEkQsQQkilqAEEUtQgoglKEHEEpQgYglKELEEJYhYghJELEEJ/wEHuVyELT6eogAAAABJRU5ErkJggg==)', 'additional_kwargs': {}, 'type': 'AIMessageChunk', 'example': False}
{'content': '', 'additional_kwargs': {}, 'type': 'AIMessageChunk', 'example': False}