DALL·E 3 与 Streamlit


7 个月前

在我之前的文章《使用 Streamlit 构建 ChatGPT 应用 - 高级版》中,我展示了如何使用 OpenAI API 和 Streamlit 构建一个 ChatGPT 应用。使用类似的代码构建 DALL·E 应用是一个合乎逻辑的下一步。然而,如果你经常使用 DALL·E,我建议你还是使用原生的 ChatGPT 服务,因为生成图像的成本可能相当高。就我个人而言,我只是偶尔使用,所以按需付费使用 API 对我来说更具成本效益。

由于设置与 ChatGPT 应用大致相同,我将在下面分享 DALL·E 应用的完整代码。

import streamlit as st
from openai import OpenAI
from PIL import Image
import requests
from io import BytesIO
import os
import json

DB_FILE = 'db.json'

def main():
    client = OpenAI(api_key=st.session_state.openai_api_key)
    st.title('DALL-E 3 文本到图像生成器')
    prompt = st.chat_input('输入你的提示')

    # 初始化聊天记录
    if "chat_history" not in st.session_state:
        st.session_state.chat_history = []

    if prompt:
        # 将用户的提示添加到聊天记录
        st.session_state.chat_history.append({"role": "user", "content": prompt})

        # 连接所有之前的提示
        all_prompts = " ".join([message["content"] for message in st.session_state.chat_history if message["role"] == "user"])

        response = client.images.generate(
          model="dall-e-3",
          prompt=all_prompts,
          size="1024x1024",
          quality="standard",
          n=1,
        )

        image_url = response.data[0].url
        response = requests.get(image_url)
        img = Image.open(BytesIO(response.content))

        # 将生成的图像添加到聊天记录
        st.session_state.chat_history.append({"role": "assistant", "content": img})

    # 显示聊天记录
    for message in st.session_state.chat_history:
        with st.chat_message(message["role"]):
            if isinstance(message["content"], str):
                st.markdown(message["content"])
            else:  # 消息是图像
                st.image(message["content"], use_column_width=True)

if __name__ == '__main__':
    if 'openai_api_key' in st.session_state and st.session_state.openai_api_key:
        main()
    else:
        # 如果 DB_FILE 不存在,则创建它
        if not os.path.exists(DB_FILE):
            with open(DB_FILE, 'w') as file:
                db = {
                    'openai_api_keys': [],
                }
                json.dump(db, file)
        # 加载数据库
        else:
            with open(DB_FILE, 'r') as file:
                db = json.load(file)

        # 从 db['openai_api_keys'] 显示选择框
        selected_key = st.selectbox(
            label="现有 OpenAI API 密钥", 
            options=db['openai_api_keys']
        )

        # 输入框用于输入新密钥
        new_key = st.text_input(
            label="新 OpenAI API 密钥", 
            type="password"
        )

        login = st.button("登录")

        # 如果提供了 new_key,则将其添加到 db['openai_api_keys']
        # 如果没有提供 new_key,则使用 selected_key
        if login:
            if new_key:
                db['openai_api_keys'].append(new_key)
                with open(DB_FILE, 'w') as file:
                    json.dump(db, file)
                st.success("密钥保存成功。")
                st.session_state['openai_api_key'] = new_key
                st.rerun()
            else:
                if selected_key:
                    st.success(f"使用密钥 '{selected_key}' 登录成功")
                    st.session_state['openai_api_key'] = selected_key
                    st.rerun()
                else:
                    st.error("登录需要 API 密钥")

首先,这是输入你的 OpenAI API 密钥的入口页面。

None

在主页面上,你会看到一个聊天环境,可以查看所有提示和生成的图像。每个新提示都会与之前的提示连接,使应用在与 API 交互时具有“记忆”。例如:

None

None

查看我们的 GitHub 获取完整代码,包括 Docker 选项。或者访问 hazl.ca 了解如何将应用直接部署到你自己的服务器上。希望你觉得这对你有帮助。

FluxAI 中文

© 2025. All Rights Reserved