Skip to content

Commit c2971e7

Browse files
committed
update project
1 parent 0fdffe8 commit c2971e7

26 files changed

+1029
-109
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: GPTStudio Build and Publish
2+
3+
on:
4+
# run it on push to the default repository branch
5+
push:
6+
branches: [main]
7+
# run it during pull request
8+
pull_request:
9+
10+
jobs:
11+
# define job to build and publish docker image
12+
build-and-push-docker-image:
13+
name: Build Docker image and push to repositories
14+
# run only when code is compiling and tests are passing
15+
runs-on: ubuntu-latest
16+
17+
# steps to perform in job
18+
steps:
19+
- name: Checkout code
20+
uses: actions/checkout@v3
21+
22+
# setup Docker buld action
23+
- name: Set up Docker Buildx
24+
id: buildx
25+
uses: docker/setup-buildx-action@v2
26+
27+
- name: Login to DockerHub
28+
uses: docker/login-action@v2
29+
with:
30+
username: ${{ secrets.DOCKERHUB_USERNAME }}
31+
password: ${{ secrets.DOCKERHUB_TOKEN }}
32+
33+
- name: Build image and push to Docker Hub and GitHub Container Registry
34+
uses: docker/build-push-action@v2
35+
with:
36+
# 指向带有 Dockerfile 的源代码所在位置的相对路径
37+
context: ./
38+
file: ./Dockerfile
39+
# Note: tags has to be all lower-case
40+
tags: |
41+
talkincode/coolstudy:latest
42+
# build on feature branches, push only on main branch
43+
push: ${{ github.ref == 'refs/heads/main' }}
44+
45+
- name: Image digest
46+
run: echo ${{ steps.docker_build.outputs.digest }}

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,4 @@ cython_debug/
160160
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
161161
.idea/
162162

163+
/rundata/

CoolStudy.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import streamlit as st
2+
3+
4+
st.set_page_config(page_title="CoolStudy 酷学", page_icon="🦜")
5+
st.markdown("# 🦜CoolStudy 酷学")
6+
st.sidebar.markdown("# 🦜CoolStudy 酷学")
7+
8+
st.markdown("""
9+
**CoolStudy** 是一个创新的、基于 Streamlit 的学习辅助工具集合,专门设计用于提升学生的学习体验。
10+
我们的目标是通过集成人工智能(AI)技术,为学生提供一个直观、互动且富有成效的学习环境。
11+
12+
13+
### 特色功能:
14+
15+
- **多学科支持**:CoolStudy 支持数学、历史、科学等多个学科,为学生提供一个全面的学习环境。
16+
17+
- **AI辅助学习**:利用先进的人工智能算法,CoolStudy 可以解答学生的疑问、提供个性化学习建议,并辅助学生掌握复杂的学术概念。
18+
19+
- **交互式学习工具**:我们的工具集包括数学方程求解器、历史事实查询、科学实验模拟等多种功能,都是为了提供一种更具参与感和互动性的学习方式。
20+
21+
- **友好的用户界面**:通过 Streamlit,CoolStudy 拥有一个清晰、易于导航的用户界面,使学习过程既简单又愉快。
22+
23+
### 适用人群:
24+
25+
- **在校学生**:从小学到高中,无论是基础学科还是高级课程,都能从我们的工具中受益。
26+
- **自学者**:为有志于自我提高和终身学习的人士提供支持。
27+
- **教育工作者**:教师和辅导员可以使用我们的工具来增强教学效果和学生参与度。
28+
29+
### 未来展望:
30+
31+
在 CoolStudy,我们致力于不断创新和改进,以满足日益增长的教育需求。我们的愿景是创建一个全面的学习平台,不仅提供知识,更激发学生的好奇心和求知欲。
32+
33+
---
34+
35+
**如果你也有兴趣,欢迎加入 CoolStudy 的项目,开启智能学习新纪元!**
36+
37+
---
38+
""")

Dockerfile

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# 使用 Mambaforge 基础镜像
2+
FROM condaforge/mambaforge:latest
3+
4+
# 设置非交互式前端,避免 apt-get 交互式提示
5+
ENV DEBIAN_FRONTEND=noninteractive
6+
7+
# 设置时区
8+
RUN echo "Asia/Shanghai" > /etc/timezone && \
9+
ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
10+
apt-get update && \
11+
apt-get install -y tzdata && \
12+
dpkg-reconfigure --frontend noninteractive tzdata
13+
14+
# 安装 Tesseract-OCR、Graphviz、字体以及 FFMPEG
15+
RUN apt-get update && \
16+
apt-get install -y tesseract-ocr tesseract-ocr-chi-sim graphviz fonts-wqy-microhei fonts-noto ffmpeg && \
17+
apt-get clean && \
18+
rm -rf /var/lib/apt/lists/*
19+
20+
# 设置工作目录
21+
WORKDIR /app
22+
23+
# 复制项目文件
24+
COPY ./CoolStudy.py ./CoolStudy.py
25+
COPY ./pages ./pages
26+
COPY ./libs ./libs
27+
COPY ./apps ./apps
28+
COPY ./config.toml ./.streamlit/config.toml
29+
COPY ./components ./components
30+
COPY requirements.txt ./requirements.txt
31+
32+
# 安装项目依赖以及 OpenCV
33+
RUN pip install --no-cache-dir -r requirements.txt
34+
35+
# 暴露 Streamlit 默认端口
36+
EXPOSE 8501
37+
38+
# 环境变量设置为非缓冲模式,以便实时输出
39+
ENV PYTHONUNBUFFERED=1
40+
41+
# 设置启动命令
42+
CMD ["streamlit","run", "CoolStudy.py", "--server.port=8501"]

License

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
MIT License
2+
3+
Copyright (c) 2023 CoolStudy
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6+
7+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8+
9+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Makefile

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
arm64:
2+
docker buildx build --build-arg GoArch="arm64" --platform=linux/arm64 -t \
3+
talkincode/coolstudy:latest-arm64 .
4+
docker push talkincode/coolstudy:latest-arm64
5+
6+
fastpub:
7+
docker buildx build --build-arg GoArch="amd64" --platform=linux/amd64 -t \
8+
talkincode/coolstudy:latest .
9+
docker push talkincode/coolstudy:latest
10+
11+
updocker:
12+
ssh gpts-server "cd /home/master/coolstudy && sudo docker-compose pull && sudo docker-compose up -d"
13+
14+
.PHONY: clean build

README.md

+17-20
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,26 @@
11
# CoolStudy:下一代智能学习工具
22

3+
______ __ ______ _ __
4+
.' ___ | [ |.' ____ \ / |_ | ]
5+
/ .' \_| .--. .--. | || (___ \_|`| |-'__ _ .--.| | _ __
6+
| | / .'`\ \/ .'`\ \| | _.____`. | | [ | | | / /'`\' | [ \ [ ]
7+
\ `.___.'\| \__. || \__. || || \____) | | |, | \_/ |,| \__/ | \ '/ /
8+
`.____ .' '.__.' '.__.'[___]\______.' \__/ '.__.'_/ '.__.;__][\_: /
9+
\__.'
10+
311
**CoolStudy** 是一个创新的、基于 Streamlit 的学习辅助工具集合,专门设计用于提升学生的学习体验。
412
我们的目标是通过集成人工智能(AI)技术,为学生提供一个直观、互动且富有成效的学习环境。
513

6-
### 项目背景:
7-
8-
这是 JettWang 和他的徒弟 BoyJiang(7年级学生) 的第一个项目,起因是 BoyJiang 在学习过程中陷入了一种困境,
9-
BoyJiang 对各门学科提不起兴趣,尤其是数学,但是 BoyJiang 酷爱编程,可是编程不是孤立的学科,它需要数学、英语等多学科的知识作为基础。
10-
没有良好的基础,BoyJiang 在编程学习过程中会很快遇到天花板。
11-
12-
同时 JettWang 发现, BoyJiang 在学习编程中,对已经学习的基础知识的不能很好的运用,单调的知识点学习,简单代码片段,
13-
小程序的编写不能更有效的提高他的编程能力。 于是, JettWang 和 BoyJiang 进行了一番深入探讨,
14-
决定通过开发一个真正应用级别的项目来实现学习的目的。
15-
16-
这是一个很大胆的尝试,因为 BoyJiang 只有 7 年级的学历,而且没有完整应用编程经验,甚至还停留在基础学习阶段。
17-
这就好比前线打仗了,枪杆子还没摸热,但是却要上战场了。不过幸运的是,JettWang 为 BoyJiang 准备了一套够硬的护甲,
18-
这套“护甲”就是 JettWang 近20年的编程经验,以及他在软件应用领域的专业知识。还有多年来 JettWang 积累的各种软硬件资源。
19-
这其中还包括朋友支助的强大的 AI 资源, 比如 GPU 服务器, OpenAI 的 GPT 等。这样一套护甲可以让 BoyJiang 初期可以顶着炮火上前线。
14+
## 项目背景:
2015

21-
于是,JettWang 和 BoyJiang 开始了他们的冒险之旅。他们的目标是开发一个可以帮助像 BoyJiang 这样的学生学习的工具,它就是 ”CoolStudy“,
22-
中文名叫”酷学“, 这是两人一拍脑袋想出来的,这个工具最大的核心特色就是:酷。 没错,“酷”代表有趣和激情。
23-
当下的教育体制成功的磨灭了学生学习的兴趣和激情,而 CoolStudy 的目标就是要让学习重新变得有趣而富有激情。
16+
JettWang 和他的7年级学生徒弟 BoyJiang,共同启动了一个大胆的项目,旨在解决 BoyJiang 在学习过程中的困境,
17+
特别是对数学和其他学科的兴趣缺乏。尽管 BoyJiang 对编程充满热情,但他在应用基础知识方面遇到了挑战。
18+
为了克服这一点,并提高他的编程技能,他们决定开发一个名为“CoolStudy(酷学)”的学习工具。这个工具的核心特色是“酷”,
19+
意在使学习变得有趣和富有激情,从而激发学生像 BoyJiang 这样的学生的学习兴趣。
20+
JettWang 凭借其近20年的编程经验和丰富的资源,包括强大的 AI 资源,为这个项目提供了坚实的支持。
2421

2522

26-
### 特色功能:
23+
## 特色功能:
2724

2825
- **多学科支持**:CoolStudy 支持数学、历史、科学等多个学科,为学生提供一个全面的学习环境。
2926

@@ -33,13 +30,13 @@ BoyJiang 对各门学科提不起兴趣,尤其是数学,但是 BoyJiang 酷
3330

3431
- **友好的用户界面**:通过 Streamlit,CoolStudy 拥有一个清晰、易于导航的用户界面,使学习过程既简单又愉快。
3532

36-
### 适用人群:
33+
## 适用人群:
3734

3835
- **在校学生**:从小学到高中,无论是基础学科还是高级课程,都能从我们的工具中受益。
3936
- **自学者**:为有志于自我提高和终身学习的人士提供支持。
4037
- **教育工作者**:教师和辅导员可以使用我们的工具来增强教学效果和学生参与度。
4138

42-
### 未来展望:
39+
## 未来展望:
4340

4441
在 CoolStudy,我们致力于不断创新和改进,以满足日益增长的教育需求。我们的愿景是创建一个全面的学习平台,不仅提供知识,更激发学生的好奇心和求知欲。
4542

apps/__init__.py

Whitespace-only changes.

apps/calculator_01.py

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import streamlit as st
2+
3+
4+
def show_page():
5+
# 创建页面标题
6+
st.title("计算器")
7+
# 创建页面副标题
8+
st.subheader("这是一个简单的计算器")
9+
# 创建页面描述
10+
st.markdown("""
11+
这是第一版本的计算器,他的用处非常不大,勉强可以计算加法,但是还是可以计算很大的数字的加法。用起来不是很方便。
12+
但是,这是一个可以正常运行的计算器,这是一个很好的开始。BoyJiang同学在老师的指导下已经可以独立完成这个版本的计算器了。
13+
对于 streamlit 的玩法已经有了初步了解, 在这个过程中对很多基本的语法,数据类型有了一次难得的实战。
14+
""")
15+
16+
# 创建代码块显示当前代码
17+
with st.expander("查看代码"):
18+
st.code(open(__file__, "r", encoding="utf-8").read(), language="python")
19+
20+
# 创建一个分割线
21+
st.divider()
22+
23+
# 定义当前页面持久变量 left_val 表示加号左边的数字
24+
if "left_val" not in st.session_state:
25+
st.session_state["left_val"] = ""
26+
27+
# 定义当前页面持久变量 right_val 表示加号右边的数字
28+
if "right_val" not in st.session_state:
29+
st.session_state["right_val"] = ""
30+
31+
# 定义当前页面持久变量 pos 表示当前输入的位置是左边还是右边
32+
if "pos" not in st.session_state:
33+
st.session_state["pos"] = "left"
34+
35+
# 创建三个并排的列, 用于显示输入框
36+
colin1, colin2, colin3 = st.columns(3)
37+
# 创建左边输入框
38+
left_box = colin1.text_input("left", st.session_state["left_val"])
39+
# 创建右边输入框
40+
right_box = colin2.text_input("right", st.session_state["right_val"])
41+
# 创建结果输入框,暂时使用一个空的容器
42+
resultbox = colin3.container()
43+
44+
def update_val(value):
45+
# 定义一个函数,用于更新输入框的值
46+
pos = st.session_state["pos"]
47+
if pos == "left" and st.session_state["left_val"] not in ["0"]:
48+
st.session_state["left_val"] += value
49+
elif pos == "right" and st.session_state["right_val"] not in ["0"]:
50+
st.session_state["right_val"] += value
51+
st.rerun()
52+
53+
# 创建一个九宫格的矩阵, 来模拟计算器的界面
54+
col1, col2, col3 = st.columns(3)
55+
col4, col5, col6 = st.columns(3)
56+
col7, col8, col9 = st.columns(3)
57+
col10, col0, col12 = st.columns(3)
58+
59+
# 创建一个函数,用于创建数字按钮
60+
def create_number_button(column, number):
61+
if column.button(str(number)):
62+
update_val(str(number))
63+
64+
# 创建数字按钮序列,用语创建数字按钮
65+
cols = [col0, col1, col2, col3, col4, col5, col6, col7, col8, col9]
66+
67+
# 遍历数字按钮序列,创建数字按钮
68+
for col in cols:
69+
create_number_button(col, cols.index(col))
70+
71+
# 创建加号按钮
72+
if col10.button("加"):
73+
st.session_state["pos"] = "right"
74+
75+
# 创建等号按钮, 点击等号按钮时,计算结果
76+
if col12.button("="):
77+
try:
78+
lval = int(st.session_state["left_val"])
79+
except:
80+
lval = 0
81+
82+
try:
83+
rval = int(st.session_state["right_val"])
84+
except:
85+
rval = 0
86+
87+
result = str(lval + rval)
88+
resultbox.text_input("结果", result)
89+
90+
# 创建清除按钮,点击清除按钮时,清除输入框的值
91+
if st.button("清除"):
92+
st.session_state["left_val"] = ""
93+
st.session_state["right_val"] = ""
94+
st.session_state["pos"] = "left"
95+
st.rerun()

config.toml

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[server]
2+
enableCORS = false
3+
enableXsrfProtection = false

docker-compose.yml

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
version: "3"
2+
services:
3+
coolstudy:
4+
container_name: "coolstudy"
5+
image: talkincode/coolstudy:latest
6+
logging:
7+
driver: "json-file"
8+
options:
9+
max-size: "50m"
10+
environment:
11+
- GPT_SERVICE_ADDRESS=${GPT_SERVICE_ADDRESS}
12+
- GPT_SERVICE_TOKEN=${GPT_SERVICE_TOKEN}
13+
- OPENAI_API_TYPE=${OPENAI_API_TYPE}
14+
- OPENAI_API_KEY=${OPENAI_API_KEY}
15+
- AZURE_OPENAI_API_VERSION=${AZURE_OPENAI_API_VERSION}
16+
- AZURE_OPENAI_API_BASE=${AZURE_OPENAI_API_BASE}
17+
- AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY}
18+
- MSAL_TENANTID=${MSAL_TENANTID}
19+
- MSAL_APPID=${MSAL_APPID}
20+
- DATA_DIR=/data
21+
volumes:
22+
- coolstudy-volume:/data
23+
ports:
24+
- "8501:8501"
25+
command: ["streamlit","run", "/CoolStudy.py"]
26+
networks:
27+
coolstudy_network:
28+
29+
networks:
30+
coolstudy_network:
31+
32+
volumes:
33+
coolstudy-volume:

libs/__init__.py

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import os
2+
3+
4+
def get_data_dir() -> str:
5+
data_dir = os.getenv("DATA_DIR", "/tmp/data")
6+
if not os.path.exists(data_dir):
7+
os.makedirs(data_dir)
8+
return os.path.abspath(data_dir)
9+

libs/knowledge.py

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import requests
2+
import os
3+
4+
5+
# 定义知识库名称和对应的集合名称
6+
knowledge_dictionary = {
7+
"未选择": "",
8+
}
9+
10+
11+
def search_knowledge(collection, query):
12+
"""Define a knowledge base retrieval function"""
13+
gpt_address = os.getenv("GPT_SERVICE_ADDRESS")
14+
api_token = os.getenv("GPT_SERVICE_TOKEN")
15+
url = f"{gpt_address}/knowledge/search"
16+
headers = {
17+
"Accept": "application/json",
18+
"Content-Type": "application/json",
19+
"Authorization": f"Bearer {api_token}"
20+
}
21+
payload = {
22+
"collection": collection,
23+
"query": query
24+
}
25+
26+
response = requests.post(url, headers=headers, json=payload)
27+
if response.status_code != 200:
28+
return f"Error searching knowledge: {response.text}"
29+
data = response.json()
30+
31+
def fmt(v):
32+
return f'**Score**: {v["score"]}\n\n{v["content"]}\n\n---\n\n'
33+
34+
return "\n\n".join([fmt(v) for v in data["result"]["data"]])
35+

0 commit comments

Comments
 (0)