Skip to main content

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.31.0
!pip install openai==1.9.0
!pip install langchain-openai==0.0.3
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":"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"}]},"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)
Image

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)
Image

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,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAIAAABM5OhcAAAIJElEQVR4nO2cbUyV5R/HPwc4cXiUEHkI9GgGFUvDZqU8SROiLBy9oEUr6oVba2SrXkSNZsJcNROS5upPaUqF0Wgzt8pSN0rNbJO1HtayWRax6QrSYCnI4Zz/i3Pn7Tmcw8H9vcb89/3senHu6+F3rt+1z7nuc1+H4fD5EOKiEzXdExD/n0gsYQSJJYwgsYQRJJYwgsQSRpBYwggSSxhBYgkjSCxhBIkljCCxhBEkljCCxBJGkFjCCFMVy+vlzTeprCQ9ncsuIz2dykreeguv1+j0IlNXh8OBy8XQUIhWh4O5cy845saNrF37v07s347PF7mcPElpKUBhIS0tdHbS0sLSpQBlZZw6NaUgJsrp0yQlkZ0N0NERogPgdl9wWLd7qiujEq5MqdOKFQDr1wfXP/88wMqV0zb7ri6Ad97B5WLFilDpSaxpKpF7fPQRwF13hW5duRLgk0/+CQduN/39PPggs2cTG0tuLk1NjIwED+zupqiIxEQSEigro6fnvDmB282xY9TVkZNDQgKLFvH22yHevaqKGTMYHeWOO3A6GRyckF4YsTwe2tq47jri47niCmpq+PFHe8jEHd0fp7eXBQuIiuLMmchZ+HwMDFBfz7x5xMWRm0tzMx5P8Nw+/pjrrycujuxsmprwejl4kCVLSEggM5PVqzl9evotMSLWPfcAfPZZ6NaeHoDaWnuxcnJYvJibbqK1lTfeYPlygMpKxsftUQ0NAEVFbNpEayvXXkt0NB98YAeZM4eCApYvZ9s2NmwgJyfEzW5wEKeT++/H5+P11wE2b56qWI89BlBdTUcHjY24XKSn89tvliuzZgF0d9PdbcfJzCQvj8pKNm2ycpk8i7NnufFG4uNZu5Zt2ygvB2hqCpjbrFlcdRUbNtDeTn4+QEMDbjdr1rB1K0VFAA8/PP2WGBHL7cbpZHQ0dOvICDExzJtnLxZQU8PYmFXj9XLrrQBbtlg1u3cD3Hmn/fEdGiIri+xsa5SfigrbxcOHAW64IeCtX30VYOdOfD5OnCAqioqKqYqVkkJysj3JlhaAp56yUw66Ffqpr7drImaxYwfAc89ZrcPDOJ1cfXVwzP/8x7o8csSqaWiwav76C5eLxMSAfe5SKZF7uFxkZk7WISODuLiAxTp3W/GXffsASkuty6oqgO++C+izZg3A3r12kH37AjpcfjlOZ0BNcTFJSfZNdulSoqP5/fdgIUKKlZGB00l/v+3Enj189ZV1GU6s84NHzKKnh8ZGjh61W7OzcbmCYw4MBOQIHD5s1yxaBHDixPSLcqHlIpxj+QK/l6SkkJsbUFNYSHQ033xjXR46xIwZZGdz6pRd8vIAvv3W6hMdzc03BwRJSmJszL7s6+Pzzykr448/6O+nv5+SEsbHee+9Kc25vp6xMQoKaGykt5fERMrLKSiYbMjMmdYtcopZlJWxbh1nztDezjPP8MQTDA0xMhIQMzWVmTPty4QEIGD1/DVBoy4NIqo3d+6F3Qon2SH8r2Niwk5m3ToryMQ9MmgX8T+QTmTZsuCdJtxT4fbtLFhgjZo/P+DhIOSOFRQnYhYDA1RUWMGrq7n7buLjA8ICc+aEyNHrtWuWLQM4dmz6d6ALLeGX5x+WLKGriy++sJIM4uBBPB7rTMvPn38G9xkfZ3DQ/mgmJuL1snNniGjz51svYmMjzKqzk+RkOjsDKp9+mv37OX6crKwIw4HaWmpr+f57urtpa+O++/B4eOCByAP9RMzi0UfZs4eXX2b1aqve7aavL6CnwxFieMjKS4+I6u3aBVBdHbrV/1Vj9277Uwj8/HNAn0OHAKqqrEv/WevQUECfvXt59ll++insNnP+LvL11wB1dcF91q8HaGubbKfx+Th6lK1b6e21a778EqCwMMR7hYsTMYvkZFJT7SavF5crIOzEmBPf99LdsabUyX9A+uKLwfUTD0j91NTYD3Qej/Wk/eGHVk17O0Bzsz1qeJhrriExkb//DmvD+Yv+5JMAu3YF9+nrw+Gw/QgX6ocfABYvtp+2jh8HWLjQurzySsCaTLg4EbNISyMuzj7xev99a3HOrYzE4uRJSkoAiopobWX7dlpbKSyECT/pAGlpZGRYpzuvvUZxMcDjj9t9PB7rAOLee9myhY0byc8nKorOzslsOLfoXi+zZ5OWZh8WnF9KSnA4+PXXyUL5fNTVAZSXs3kz7e3Ww9dLL1mtt9wCsGqVfUQyMU7ELFatArjtNjo6aG4mJ8f61fLcJiexrHX0n/KlpRETQ1oa5eV0dAQce55brP37KS0lJYX4eIqKePfd4Ghnz/LCC+TnExtLZiZVVRw4EBwknFiffgrw0EOh5/nKKwGbazixRkdpbWXhQhISSE2luJiuLrv1wAHy8nA67XtZyDiTZzE8zCOPkJVl/XKwYwe33w5w5Mi/QiyH76L+txmHA7ebX365mDHFpYj+HksYQWIJI0gsYYSL/B1LCD/asYQRJJYwgsQSRpBYwggSSxhBYgkjSCxhBIkljCCxhBEkljCCxBJGkFjCCBJLGEFiCSNILGEEiSWMILGEESSWMILEEkaQWMIIEksYQWIJI0gsYQSJJYwgsYQRJJYwgsQSRpBYwggSSxhBYgkjSCxhBIkljCCxhBEkljCCxBJGkFjCCBJLGEFiCSNILGEEiSWMILGEESSWMILEEkaQWMIIEksYQWIJI0gsYQSJJYwgsYQRJJYwgsQSRpBYwggSSxhBYgkjSCxhBIkljCCxhBEkljCCxBJGkFjCCBJLGEFiCSNILGEEiSWMILGEEf4L7ov2PwG9PDUAAAAASUVORK5CYII=)', 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)
Image

Using LangChain

The LangChain library is not suitable as a client of text-to-image applications, since langchain-openai<=0.0.2 ignores the 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,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkCAIAAABM5OhcAAAKDUlEQVR4nO2cbWxTVRiAn7F17JONbbiOTjbch3FmwEiMyoaADMYU4kBGHDCISlADEoOJIyHhU4xGQMRJnA7YokzNMPi1AEICCoQPUX9IjAgIk89IQbfhNse2+qM3u9yutLfYwwq8T86P3tO373l7+/Te2/acBjkcCILf6dXTBQi3JyKWoAQRS1CCiCUoQcQSlCBiCUoQsQQliFiCEkQsQQkilqAEEUtQgoglKEHEEpQgYglKuG3FCgoiNbWni7iDMSVWAL5IdXU88QRWK6GhJCSQn09NjZ+HyM2ltNTPOe8cbr0j1tWrlJYyfjznz/PKK2zYwPz5nDvHtGk89RQdHX4b6Px5zp3zW7Y7DofDewNSUkxF3oT2/PMACxbQ2al3trdTXAzw1lt+q7mhgebmnn++t2gzF2TiRbLbmTOHgQMJDycjg2XLaG93zXDyJDNmkJxMZCQ5OXz0kWuS2lqGDycqithY8vLYvZv77zfYf+gQwKhRbgpoaCA8nLQ0w4gnTjB9+nVHNFOzT/X7FLxtG489RkICFgtWK5Mnc+iQz0kCtvlHrLY2HniAiAiWLKGqivx8gKVLDRkGDGDIEEaPpqqKlStJTgaortZj5s8HyM2looJ33mHYMOLj6d/fINazzwJs2+a+jLIyRo7kyhVtxLvvZtAgCgqoquLNN0lMNIxopuZrxfJav09PdvlygIwM3niDTZtYuhSrleBgPvzwRkYMwOYfsbZsAXjtNW2zqQmLhXvvNWQAxoyho0PrOXwYYOhQbbOuDiA/Xz9mdHQwaZLr+To9nZAQWlpM1Qw8/rh+xty71zCimZqvFctz/d2H9hD87bcEBTF4ME1N+qPOncNqJSyMEyd8HjEAm7kgb2Lt2sXChRw/rvfYbISFue7r774zPKpvXywW7faECQAHDxoCTpxwFSs8HKvVbM3Avn2GzthYfUQzNbuI5aH+7kN7CJ440f1xd906gJdf9nnEAGxBXc/BA0FBpKRw6pSXsCNH2LeP06dpbqayUns7dmUIDqa5mdBQPT4lhT/+0GKsVi5dorWV4GBDzuho/dQGhIcTE8OFC6ZqDgmhuRmLxf2IZmruetZe63cZ2nNwYiJ2Oy0thgDg2DEyM3nwQQ4c8J7Ebtf7ExK875CbTIhfsly6REkJO3aQlkZ2NqGhbj729+vnuh+DggwZEhJcrQLi4rhyRd9MTOTsWVpbCQvzXpXzutjDiF5rNl+/T8GXL7sJAO0q6vJlU0n69dNvmzk63GT8I9a8eezYwdq1vPii1uN8b11L796eMkREYLfT0eHq1t9/GzYfeohPP2XPHsaMcZOktBS7na1bTY1opmbz9fsUHBfHxYu0tbl6c+aMdq+ZJLt2+VBPD2DyesXzNVafPsTF6ZudndoRxXOGlBQ9ZvhwgL17DQG//upapPMaf9w4NzX89htAfr7ZEX2q2Ws2r7vr2uCiIoCtW11j3n0XYP58n0cMwGYuyJtYCQmEh+sf1j7/XBOi6xON1930wQcAhYX6h7irV5k82Y39BQUAK1YYOltayMszvFpeR/SpZv+KtXs3wODB2uWjs50/j9VK797a54lbXSyzp8KmJsrL3fQXFJCRQVERlZVMnEhJCfX1vP8+qamcOsU//xAdbSr/M89QW8vWrYwdy9SpNDZSU0NnJzYbZ88aImtqKCxk4UK2b6e4mJgYfv+dDRs4fZoVKxg3zuQT8kPNN8yIESxezNKl5OQwezY2G8ePs24dFy+yfj1paWpHv0mYsc8DH3+Mw0FTE3PnkpSkfUG8ZQuFhQBHj/rwjm9pYckS0tMJDSU5mZkzOXNG+5nZ5YFtbZSXM2wYMTFYLPTvT3Exe/b4dtjwqWYz9Zsf2tnq6igsJD6ekBASE3nySfbv9zlJwDZTXzfcBFas4Kuv+OwzbDa9s7GRmBjS0zl2rOcqE26IQJndkJTEwYPalVYXzt89nF8nCrcWgXLEam1lxAi+/57iYh59lLY2tm+nro6sLPbtIza2p+sTfCRQxAIaGli7ls2bqa+ntZWBA5k0iQULlF9KCyoIILGE24lAucYSbjNELEEJIpagBBFLUIKIJSjh/4q1Zg1LlvijEOH24v9+3ZCaSn29l98ThTsQORUKSvAuVkcHa9eSnU1kJDYbU6boPwkHBVFfr93omjXrXI//448MGkRwMK2tWv/mzeTlER1NVBSjRmlzkrq4dIm5c7nnHiIiyMxk+XLDRGFnzu3bGTKEiAiSk1m2DIeD/ft5+GGiokhKYt48Wlr+384Q/IjX+Q8vvQRQVER1NQsXEhbGXXdx+jQOB7W12szr2lpqa/X5HlYrmZkUFFBers2bKysDyM2lvJzVq7nvPoKD+fprfRqM1yV+/fqRns7KlVRUkJUFUFZGSgqLFrFxI7m5AC+80PPTRaQ5m/eI2Fj69OHqVW1z1SqABQu0ze4zhJzMmaP3fPMNwPjx+prBxkaSkrDZtLQmlyW+9562efSo1lNWpvU0NBAWRlSUYSmztB5s3iMSE7FYOHNG22xsZMcOfvpJ27yeWH/+qfc41wweOWIIW7QIYOdOHKaXJdrtek/fvgCHD+s9OTkAFy70/D6V5jAzNXnOHBYtYsgQZs9m0iSGDtVOVR6IjzcsTjpwgJgYbDbDkpvMTICff2b0aEaOZORIjhyhokJb4tfYqF+cOYmLIz5e34yM5K+/yMgw9IDro4Qew4x9NTVkZ2vxaWmGv6Zwe8RymVMbcn17X30VhwO7XVvOlZZGURFTphARYUgLDBhgyOkc99o/nBkxAuDkyZ5/s0pzmFxMUVJCSQm//EJtLW+/zfTptLczc6ZZd6Oi6Ozkiy/c3OVcOGBmiZ/b1aEelowKPYxn744fZ+NGfvhB7zl4EGDYMG3TzBHrkUcAGhsNnTt3snix9gcYN7Assfu4csQKqOble6z2dp5+muee079VGjAA0Je9OxcuNzd7SjJtGsCaNXrPlSvMncuqVVitAKGhtLTol0dffqnd7uz0XJ0QwHhVb8YMgPx8KiupqNA+fHX9cd6oUQCzZrF+vdZDt6NLeztjxwJMncr69axZQ1YWvXqxaZMWMGsWwLhxVFezbBnJydpfnnYd5LrnlCNWgDfvEf/+y+rVDBpEZCRxceTl8ckn+r1795KZicWin8u6S+Bw0NbG66+TlUXv3litTJhgWE1/A8sSRawAbzLnXVCC/AgtKEHEEpQgYglKELEEJYhYghJELEEJIpagBBFLUIKIJShBxBKUIGIJShCxBCWIWIISRCxBCSKWoAQRS1CCiCUoQcQSlCBiCUoQsQQliFiCEkQsQQkilqAEEUtQgoglKEHEEpQgYglKELEEJYhYghJELEEJIpagBBFLUIKIJShBxBKUIGIJShCxBCWIWIISRCxBCSKWoAQRS1CCiCUoQcQSlCBiCUoQsQQliFiCEv4DnVDAQYuGrOEAAAAASUVORK5CYII=)'
Image

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,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)', 'additional_kwargs': {}, 'type': 'AIMessageChunk', 'example': False}
{'content': '', 'additional_kwargs': {}, 'type': 'AIMessageChunk', 'example': False}
Image