Step-3
Welcome to Step-3, an advanced multimodal AI assistant by StepFun.
""")
with gr.Row():
with gr.Column(scale=3):
# 聊天界面
chatbot = gr.Chatbot(
height=600,
show_label=False,
elem_id="chatbot",
bubble_full_width=False,
avatar_images=None,
render_markdown=True
)
# 输入区域
with gr.Row():
with gr.Column(scale=8):
msg = gr.Textbox(
label="Message",
placeholder="Type your message here...",
lines=2,
max_lines=10,
show_label=False,
elem_id="message-textbox"
)
with gr.Column(scale=2):
image_input = gr.File(
label="Images",
file_count="multiple",
file_types=[".png", ".jpg", ".jpeg", ".gif", ".webp"],
interactive=True,
show_label=True
)
with gr.Column(scale=1, min_width=100):
submit_btn = gr.Button("Send", variant="primary")
# 底部按钮
with gr.Row():
clear_btn = gr.Button("🗑️ Clear", scale=1)
undo_btn = gr.Button("↩️ Undo", scale=1)
retry_btn = gr.Button("🔄 Retry", scale=1)
with gr.Column(scale=1):
# 设置面板
with gr.Accordion("⚙️ Settings", open=True):
system_prompt = gr.Textbox(
label="System Prompt",
placeholder="You are a helpful assistant...",
lines=3,
value="You are Step-3, a helpful AI assistant created by StepFun."
)
temperature = gr.Slider(
minimum=0,
maximum=2,
value=0.7,
step=0.1,
label="Temperature"
)
max_tokens = gr.Slider(
minimum=1,
maximum=4096,
value=2048,
step=1,
label="Max Tokens"
)
top_p = gr.Slider(
minimum=0,
maximum=1,
value=0.95,
step=0.01,
label="Top P"
)
# 事件处理函数
def user_submit(message, history, images):
"""用户提交消息时的处理"""
print(f"[DEBUG] user_submit called with message: {message[:50] if message else 'None'}...")
print(f"[DEBUG] user_submit called with images: {len(images) if images else 0} files")
if message or images:
# 清空输入,保存消息和图片用于后续处理
return gr.update(value=""), history, gr.update(value=None), message, images
return gr.update(value=message), history, gr.update(value=images), message, images
def bot_response(history, saved_message, saved_images, system_prompt, temperature, max_tokens, top_p):
"""生成机器人响应"""
print(f"[DEBUG] bot_response called with saved_message: {saved_message[:50] if saved_message else 'None'}...")
print(f"[DEBUG] bot_response called with saved_images: {len(saved_images) if saved_images else 0} files")
if saved_message or saved_images:
# 使用生成器处理消息
for updated_history in process_message(saved_message, history, saved_images, system_prompt, temperature, max_tokens, top_p):
yield updated_history
else:
yield history
def undo_last(history):
if history:
return history[:-1]
return history
def retry_last(history):
if history and history[-1][0]:
last_message = history[-1][0]
new_history = history[:-1]
return new_history, last_message
return history, ""
# 创建隐藏的组件来存储消息和图片
saved_msg = gr.State("")
saved_imgs = gr.State([])
# 提交消息 - Enter键
msg.submit(
user_submit,
[msg, chatbot, image_input],
[msg, chatbot, image_input, saved_msg, saved_imgs],
queue=False
).then(
bot_response,
[chatbot, saved_msg, saved_imgs, system_prompt, temperature, max_tokens, top_p],
chatbot
)
# 提交消息 - Send按钮
submit_btn.click(
user_submit,
[msg, chatbot, image_input],
[msg, chatbot, image_input, saved_msg, saved_imgs],
queue=False
).then(
bot_response,
[chatbot, saved_msg, saved_imgs, system_prompt, temperature, max_tokens, top_p],
chatbot
)
# 清空对话
clear_btn.click(
lambda: ([], "", None),
None,
[chatbot, msg, image_input]
)
# 撤销最后一条
undo_btn.click(
undo_last,
chatbot,
chatbot
)
# 重试最后一条
retry_btn.click(
retry_last,
chatbot,
[chatbot, saved_msg]
).then(
bot_response,
[chatbot, saved_msg, saved_imgs, system_prompt, temperature, max_tokens, top_p],
chatbot
)
# 页脚
gr.Markdown("""
---
""")
# 启动应用
if __name__ == "__main__":
print(f"[DEBUG] Starting app with API key: {'Set' if STEP_API_KEY else 'Not set'}")
print(f"[DEBUG] Base URL: {BASE_URL}")
demo.queue(max_size=20)
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False,
debug=False,
show_error=True
)