streamlit-testGenius/streamlit_app.py

179 lines
6.6 KiB
Python
Raw Normal View History

2024-05-07 17:27:11 +08:00
# ------------------------------------------
import os
2023-11-03 03:32:17 +08:00
import numpy as np
2024-05-07 17:27:11 +08:00
import altair as alt
2020-11-03 14:29:22 +08:00
import pandas as pd
import streamlit as st
2024-05-07 17:27:11 +08:00
import datetime
import time
import random
import dashscope
from dashscope import Generation
from streamlit_option_menu import option_menu
from http import HTTPStatus
2024-05-07 20:34:44 +08:00
from PIL import Image
2024-05-07 17:27:11 +08:00
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY") # get api key from environment variable
st.set_page_config(layout="wide", page_title='TestGenius')
2024-05-07 20:34:44 +08:00
default_title = 'New Chat'
2024-05-07 17:27:11 +08:00
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:
2024-05-07 20:34:44 +08:00
st.image('logo.png')
2024-05-07 17:27:11 +08:00
st.subheader('', divider='rainbow')
st.write('')
2024-05-07 20:34:44 +08:00
llm = st.selectbox('Choose your Model', AVAILABLE_MODELS, index=0)
2024-05-07 17:27:11 +08:00
# 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
)
2024-05-07 20:34:44 +08:00
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
2024-05-07 17:27:11 +08:00
def respond(prompt):
messages = [
{'role': 'user', 'content': prompt}]
2024-05-07 20:34:44 +08:00
responses = Generation.call(model="qwen-turbo",
2024-05-07 17:27:11 +08:00
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):
2024-05-07 20:34:44 +08:00
messages = [
{'role': 'system', 'content': instruction},
{'role': 'user', 'content': prompt}]
response = Generation.call(model="qwen-turbo",
2024-05-07 17:27:11 +08:00
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
)
2020-11-03 14:29:22 +08:00
2024-05-07 20:34:44 +08:00
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")
2024-05-07 17:27:11 +08:00
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)
2024-05-07 20:34:44 +08:00
instruction = """# 角色定义
您是一位高级测试工程师AI专注于从用户提供的产品功能描述中生成详细准确的测试用例您可以处理包含文字描述和/或图片说明的需求
# 任务需求
- 深入分析用户提交的一个或多个产品功能需求
- 根据需求按需求顺序生成测试用例
# 输入处理
- 用户输入可以是文字描述图片或两者的结合
- 当面对多个需求时您应能够识别并按照需求的序号或提出顺序生成对应的测试用例
# 格式和规范
- 每个测试用例应按照Markdown格式的表格展示
- 表格应包括三个字段`用例编号``测试步骤``预期结果`
- 确保测试用例的编撰语言与用户的产品功能描述语言一致
- 对于图像中的需求应先解读图像内容然后按照文字需求处理
# 输出规则
- 对于每个需求生成的测试用例应该包括一个独立的Markdown表格
- 如果用户提交了多个需求应按照需求的提出顺序分别生成并编号每个测试用例确保输出的顺序性和准确性
- 若用户输入与产品功能无关以专业态度回应作为测试工程师AI我主要生成测试用例请提供具体的产品功能需求
"""
if uploaded_file:
answer = respond_image(prompt, image_path)
else:
answer = respond_nonStream(prompt, instruction)
2024-05-07 17:27:11 +08:00
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)