Repository: Avaiga/taipy
File: doc/gui/examples/controls/chat-streaming.py (Python)

Code before:

# invoked by request_wikipedia
def update_message(state: State, json, event_type: str, for_date: str, idx: int):
    if isinstance(json, dict):
        # response initial message
        set_message(state, f"{event_type} for {for_date}: \n", idx)

        for event in json.get(event_type, []):
            time.sleep(0.2) # to show the streaming effect
            # update response
            append_to_message(state, f"\n* {event.get('year', '')}: {event.get('text', '')}", idx)
            # invoke update_message_with_image in a thread
            invoke_long_callback(
                state=state,
                user_function=update_message_with_image,
                user_function_args=[
                    state.get_gui(),
                    get_state_id(state),
                    idx,
                    event.get("text", ""),
                    pages[0].get("thumbnail", {}) if (pages := event.get("pages", [])) and len(pages) else {},
                ],
            )


# set or append a message returning its index in the list
def set_message(state: State, message: str, idx: t.Optional[int] = None):
    if idx is not None and idx < len(state.messages):
        msg = state.messages[idx]
        state.messages[idx] = (msg[0], message, msg[2])
    else:
        idx = len(state.messages)
        state.messages.append((f"{len(state.messages)}", message, users[0][0]))
    state.refresh("messages")
    return idx


# append to an existing message
def append_to_message(state: State, message: str, idx: int):
    if idx < len(state.messages):
        msg = state.messages[idx]
        state.messages[idx] = (msg[0], f"{msg[1]}{message}", msg[2])
        state.refresh("messages")
    return idx


# request the wikipedia API, invoked by send_message
def request_wikipedia(gui: Gui, state_id: str, event_type: str, month: str, day: str):
    # inform the user a request is posted
    idx = invoke_callback(
        gui,

Review comment (suggestion):
```suggestion
# Set a new message or append to an existing message.
# Return the message index in the list.
```

Code after:
# Invoked by query_wikipedia()
def update_message(state: State, json, event_type: str, for_date: str, idx: int):
    if isinstance(json, dict):
        # Initial response content
        set_message(state, f"{event_type} for {for_date}:\n", idx)

        for event in json.get(event_type, []):
            time.sleep(0.2) # Apply the typewriter effect
            # Update response text
            append_to_message(state, f"\n* {event.get('year', '')}: {event.get('text', '')}", idx)
            # Invoke update_message_with_image() in a separated thread
            invoke_long_callback(
                state=state,
                user_function=update_message_with_image,
                user_function_args=[
                    state.get_gui(),
                    get_state_id(state),
                    idx,
                    event.get("text", ""),
                    pages[0].get("thumbnail", {}) if (pages := event.get("pages", [])) and len(pages) else {},
                ],
            )


# Set a new message or append to an existing message.
# Return the message index in the list.
def set_message(state: State, message: str, idx: t.Optional[int] = None):
    if idx is not None and idx < len(state.messages):
        msg = state.messages[idx]
        state.messages[idx] = (msg[0], message, msg[2])
    else:
        idx = len(state.messages)
        state.messages.append((f"{len(state.messages)}", message, users[0][0]))
    state.refresh("messages")
    return idx


# Append text to an existing message
def append_to_message(state: State, message: str, idx: int):
    if idx < len(state.messages):
        msg = state.messages[idx]
        state.messages[idx] = (msg[0], f"{msg[1]}{message}", msg[2])
        state.refresh("messages")
    return idx


# Invoke the Wikipedia API. This is invoked by send_message()
def request_wikipedia(gui: Gui, state_id: str, event_type: str, month: str, day: str):
    # Let the user known that a query was sent
    idx = invoke_callback(
        gui,