streamlit-testGenius/streamlit_app.py
2024-05-07 20:34:44 +08:00

179 lines
6.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ------------------------------------------
import os
import numpy as np
import altair as alt
import pandas as pd
import streamlit as st
import datetime
import time
import random
import dashscope
from dashscope import Generation
from streamlit_option_menu import option_menu
from http import HTTPStatus
from PIL import Image
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY") # get api key from environment variable
st.set_page_config(layout="wide", page_title='TestGenius')
default_title = 'New Chat'
default_messages = [('user', 'Hello'),
('assistant', 'Hello, how can I help you?')
]
conversations = [{
'id': 1,
'title': 'Hello',
'messages': default_messages
}]
def chat(user, message):
with st.chat_message(user):
print(user, ':', message)
st.markdown(message)
if 'conversations' not in st.session_state:
st.session_state.conversations = conversations
conversations = st.session_state.conversations
# 当前选择的对话
if 'index' not in st.session_state:
st.session_state.index = 0
AVAILABLE_MODELS = [
"qwen-max",
"qwen-turbo",
]
with st.sidebar:
st.image('logo.png')
st.subheader('', divider='rainbow')
st.write('')
llm = st.selectbox('Choose your Model', AVAILABLE_MODELS, index=0)
# if st.button('New Chat'):
# conversations.append({'title': default_title, 'messages': []})
# st.session_state.index = len(conversations) - 1
titles = []
for idx, conversation in enumerate(conversations):
titles.append(conversation['title'])
option = option_menu(
'Conversations',
titles,
default_index=st.session_state.index
)
uploaded_file = st.file_uploader("Choose a image file", type="jpg")
if st.button("Clear Chat History"):
st.session_state.messages.clear()
if uploaded_file:
image_uploaded = Image.open(uploaded_file)
image_path = image_uploaded.filename
def respond(prompt):
messages = [
{'role': 'user', 'content': prompt}]
responses = Generation.call(model="qwen-turbo",
messages=messages,
result_format='message', # 设置输出为'message'格式
stream=True, # 设置输出方式为流式输出
incremental_output=True # 增量式流式输出
)
for response in responses:
if response.status_code == HTTPStatus.OK:
yield response.output.choices[0]['message']['content'] + " "
else:
yield 'Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
)
def respond_nonStream(prompt, instruction):
messages = [
{'role': 'system', 'content': instruction},
{'role': 'user', 'content': prompt}]
response = Generation.call(model="qwen-turbo",
messages=messages,
result_format='message', # 设置输出为'message'格式
)
if response.status_code == HTTPStatus.OK:
return response.output.choices[0]['message']['content']
else:
return 'Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
)
def respond_image(prompt, image):
messages = [
{'role': 'user',
"content": [
{"image": image},
{"text": prompt}
]
}
]
response = dashscope.MultiModalConversation.call(model="qwen-vl-max",
messages=messages,
result_format='message', # 设置输出为'message'格式
)
if response.status_code == HTTPStatus.OK:
return response.output.choices[0]['message']['content']
else:
return 'Request id: %s, Status code: %s, error code: %s, error message: %s' % (
response.request_id, response.status_code,
response.code, response.message
)
prompt = st.chat_input("Enter your Questions")
st.session_state.messages = conversations[st.session_state.index]['messages']
if prompt:
if conversations[st.session_state.index]['title'] == default_title:
conversations[st.session_state.index]['title'] = prompt[:12]
for user, message in st.session_state.messages:
chat(user, message)
chat('user', prompt)
instruction = """# 角色定义
您是一位高级测试工程师AI专注于从用户提供的产品功能描述中生成详细准确的测试用例。您可以处理包含文字描述和/或图片说明的需求。
# 任务需求
- 深入分析用户提交的一个或多个产品功能需求。
- 根据需求,按需求顺序生成测试用例。
# 输入处理
- 用户输入可以是文字描述、图片,或两者的结合。
- 当面对多个需求时,您应能够识别并按照需求的序号或提出顺序生成对应的测试用例。
# 格式和规范
- 每个测试用例应按照Markdown格式的表格展示。
- 表格应包括三个字段:`用例编号`、`测试步骤`、`预期结果`。
- 确保测试用例的编撰语言与用户的产品功能描述语言一致。
- 对于图像中的需求,应先解读图像内容,然后按照文字需求处理。
# 输出规则
- 对于每个需求生成的测试用例应该包括一个独立的Markdown表格。
- 如果用户提交了多个需求,应按照需求的提出顺序分别生成并编号每个测试用例,确保输出的顺序性和准确性。
- 若用户输入与产品功能无关以专业态度回应“作为测试工程师AI我主要生成测试用例。请提供具体的产品功能需求。
"""
if uploaded_file:
answer = respond_image(prompt, image_path)
else:
answer = respond_nonStream(prompt, instruction)
st.session_state.messages.append(('user', prompt))
st.session_state.messages.append(('assistant', answer))
chat('assistant', answer)
else:
for user, message in st.session_state.messages:
chat(user, message)