Skip to content

Commit

Permalink
Feat/0.2.3.1 (#376)
Browse files Browse the repository at this point in the history
本地组件保存
openai升级
  • Loading branch information
yaojin3616 authored Mar 7, 2024
2 parents c9547f8 + b979ec8 commit 0fcf068
Show file tree
Hide file tree
Showing 8 changed files with 196 additions and 6 deletions.
10 changes: 6 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,19 @@ jobs:
- name: checkout
uses: actions/checkout@v2

- name: git message
id: git_message
- name: Process git message
id: process_message
run: |
echo "::set-output name=message::$( echo '${{github.event.head_commit.message}}' | sed ':a;N;$!ba;s/\n/\\n/g')"
value=$(echo "${{ github.event.head_commit.message }}" | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g')
echo "message=${value}" >> $GITHUB_ENV
shell: bash

- name: notify feishu
uses: fjogeleit/http-request-action@v1
with:
url: ' https://open.feishu.cn/open-apis/bot/v2/hook/2cfe0d8d-647c-4408-9f39-c59134035c4b'
method: 'POST'
data: '{"msg_type":"post","content":{"post":{"zh_cn":{"title": "${{github.event.pusher.name}}提交代码,开始编译", "content": [[{"tag":"text","text":"提交内容${{ github.event.head_commit.message }}"}]]}}}}'
data: '{"msg_type":"post","content":{"post":{"zh_cn":{"title": "${{github.event.pusher.name}}提交代码,开始编译", "content": [[{"tag":"text","text":"提交内容${{ env.message }}"}]]}}}}'


# 构建 bisheng-langchain
Expand Down
12 changes: 12 additions & 0 deletions src/backend/bisheng/api/errcode/component.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from bisheng.api.errcode.base import BaseErrorCode


# 组件模块 返回错误码,业务代码103
class ComponentExistError(BaseErrorCode):
Code: int = 10300
Msg: str = '组件已存在'


class ComponentNotExistError(BaseErrorCode):
Code: int = 10301
Msg: str = '组件不存在'
5 changes: 3 additions & 2 deletions src/backend/bisheng/api/router.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Router for base api
from bisheng.api.v1 import (chat_router, endpoints_router, finetune_router, flows_router,
knowledge_router, qa_router, report_router, server_router,
from bisheng.api.v1 import (chat_router, component_router, endpoints_router, finetune_router,
flows_router, knowledge_router, qa_router, report_router, server_router,
skillcenter_router, user_router, validate_router, variable_router)
from bisheng.api.v2 import chat_router_rpc, knowledge_router_rpc, rpc_router_rpc
from fastapi import APIRouter
Expand All @@ -18,6 +18,7 @@
router.include_router(variable_router)
router.include_router(report_router)
router.include_router(finetune_router)
router.include_router(component_router)

router_rpc = APIRouter(prefix='/api/v2', )
router_rpc.include_router(knowledge_router_rpc)
Expand Down
38 changes: 38 additions & 0 deletions src/backend/bisheng/api/services/component.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from typing import Any, List

from bisheng.api.errcode.component import ComponentExistError, ComponentNotExistError
from bisheng.api.v1.schemas import UnifiedResponseModel, resp_200
from bisheng.database.models.component import Component, ComponentDao


class ComponentService:
@classmethod
def get_all_component(cls, user: Any) -> UnifiedResponseModel[List[Component]]:
res = ComponentDao.get_user_components(user.get('user_id'))
return resp_200(data=res)

@classmethod
def save_component(cls, component: Component) -> UnifiedResponseModel[Component]:
exist_component = ComponentDao.get_component_by_name(component.user_id, component.name)
if exist_component:
return ComponentExistError.return_resp()
component = ComponentDao.insert_component(component)
return resp_200(data=component)

@classmethod
def update_component(cls, component: Component) -> UnifiedResponseModel[Component]:
exist_component = ComponentDao.get_component_by_name(component.user_id, component.name)
if not exist_component:
return ComponentNotExistError.return_resp()
exist_component.data = component.data
exist_component.description = component.description
component = ComponentDao.update_component(exist_component)
return resp_200(data=component)

@classmethod
def delete_component(cls, user_id: int, name: str) -> UnifiedResponseModel[Component]:
exist_component = ComponentDao.get_component_by_name(user_id, name)
if not exist_component:
return ComponentNotExistError.return_resp()
component = ComponentDao.delete_component(exist_component)
return resp_200(data=component)
2 changes: 2 additions & 0 deletions src/backend/bisheng/api/v1/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from bisheng.api.v1.chat import router as chat_router
from bisheng.api.v1.component import router as component_router
from bisheng.api.v1.endpoints import router as endpoints_router
from bisheng.api.v1.finetune import router as finetune_router
from bisheng.api.v1.flows import router as flows_router
Expand All @@ -24,4 +25,5 @@
'variable_router',
'report_router',
'finetune_router',
'component_router'
]
51 changes: 51 additions & 0 deletions src/backend/bisheng/api/v1/component.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import json
from typing import List

from bisheng.api.services.component import ComponentService
from bisheng.api.v1.schemas import CreateComponentReq, UnifiedResponseModel
from bisheng.database.models.component import Component
from fastapi import APIRouter, Body, Depends
from fastapi_jwt_auth import AuthJWT

router = APIRouter(prefix='/component', tags=['Component'])


@router.get('', response_model=UnifiedResponseModel[List[Component]])
def get_all_components(*,
Authorize: AuthJWT = Depends()):
# get login user
Authorize.jwt_required()
current_user = json.loads(Authorize.get_jwt_subject())
return ComponentService.get_all_component(current_user)


@router.post('', response_model=UnifiedResponseModel[Component])
def save_components(*,
data: CreateComponentReq,
Authorize: AuthJWT = Depends()):
# get login user
Authorize.jwt_required()
current_user = json.loads(Authorize.get_jwt_subject())
component = Component(**data.dict(), user_id=current_user.get('user_id'), user_name=current_user.get('user_name'))
return ComponentService.save_component(component)


@router.patch('', response_model=UnifiedResponseModel[Component])
def update_component(*,
data: CreateComponentReq,
Authorize: AuthJWT = Depends()):
# get login user
Authorize.jwt_required()
current_user = json.loads(Authorize.get_jwt_subject())
component = Component(**data.dict(), user_id=current_user.get('user_id'), user_name=current_user.get('user_name'))
return ComponentService.update_component(component)


@router.delete('', response_model=UnifiedResponseModel[Component])
def delete_component(*,
name: str = Body(..., embed=True, description='组件名'),
Authorize: AuthJWT = Depends()):
Authorize.jwt_required()
current_user = json.loads(Authorize.get_jwt_subject())

return ComponentService.delete_component(current_user.get('user_id'), name)
6 changes: 6 additions & 0 deletions src/backend/bisheng/api/v1/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,3 +198,9 @@ class FinetuneCreateReq(BaseModel):
extra_params: Dict = Field(default_factory=dict, description='训练任务所需额外参数')
train_data: Optional[List[Dict]] = Field(default=None, description='个人训练数据')
preset_data: Optional[List[Dict]] = Field(default=None, description='预设训练数据')


class CreateComponentReq(BaseModel):
name: str = Field(max_length=50, description='组件名称')
data: Any = Field(default='', description='组件数据')
description: Optional[str] = Field(default='', description='组件描述')
78 changes: 78 additions & 0 deletions src/backend/bisheng/database/models/component.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
from datetime import datetime
from typing import Any, Dict, List, Optional
from uuid import UUID, uuid4

from bisheng.database.base import session_getter
from bisheng.database.models.base import SQLModelSerializable
from pydantic import validator
from sqlmodel import JSON, Column, DateTime, Field, select, text


class ComponentBase(SQLModelSerializable):
name: str = Field(max_length=50, index=True, description='保存的组件名称')
description: Optional[str] = Field(default='', description='组件描述')
data: Optional[Any] = Field(default=None, description='组件数据')
user_id: int = Field(default=None, index=True, description='创建人ID')
user_name: str = Field(default=None, description='创建人姓名')
create_time: Optional[datetime] = Field(sa_column=Column(
DateTime, nullable=False, index=True, server_default=text('CURRENT_TIMESTAMP')))
update_time: Optional[datetime] = Field(sa_column=Column(
DateTime, nullable=False, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')))


class Component(ComponentBase, table=True):
id: UUID = Field(default_factory=uuid4, primary_key=True, unique=True)
data: Optional[Dict] = Field(default=None, sa_column=Column(JSON))

@validator('data')
def validate_json(cls, v):
# dict_keys(['description', 'name', 'id', 'data'])
if not v:
return v
if not isinstance(v, dict):
raise ValueError('Flow must be a valid JSON')

# data must contain nodes and edges
if 'nodes' not in v.keys():
raise ValueError('Flow must have nodes')
if 'edges' not in v.keys():
raise ValueError('Flow must have edges')
return v


class ComponentDao(ComponentBase):

@classmethod
def get_user_components(cls, user_id: int) -> List[Component]:
with session_getter() as session:
statement = select(Component).where(Component.user_id == user_id)
return session.exec(statement).all()

@classmethod
def get_component_by_name(cls, user_id: int, name: str) -> Component | None:
with session_getter() as session:
statement = select(Component).where(Component.user_id == user_id, Component.name == name)
return session.exec(statement).first()

@classmethod
def insert_component(cls, component: Component) -> Component:
with session_getter() as session:
session.add(component)
session.commit()
session.refresh(component)
return component

@classmethod
def update_component(cls, component: Component) -> Component:
with session_getter() as session:
session.add(component)
session.commit()
session.refresh(component)
return component

@classmethod
def delete_component(cls, component: Component) -> Component:
with session_getter() as session:
session.delete(component)
session.commit()
return component

0 comments on commit 0fcf068

Please sign in to comment.