wip: 优化了部分代码,修改了部分致命漏洞,完善了README.md
This commit is contained in:
parent
1715b64d17
commit
929cf0e2f2
1
.env
1
.env
|
|
@ -3,3 +3,4 @@ POSTGRES_PASSWORD=postgres
|
||||||
POSTGRES_HOST=127.0.0.1
|
POSTGRES_HOST=127.0.0.1
|
||||||
POSTGRES_PORT=5432
|
POSTGRES_PORT=5432
|
||||||
POSTGRES_DB=pretor
|
POSTGRES_DB=pretor
|
||||||
|
SECRET_KEY=114514
|
||||||
28
README.md
28
README.md
|
|
@ -0,0 +1,28 @@
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
# Pretor (执政官)
|
||||||
|
|
||||||
|
一款基于 Python 的分布式多 Agent 协作系统
|
||||||
|
|
||||||
|
[](https://www.python.org/)
|
||||||
|
[](LICENSE)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
**Pretor** 是一款基于 **Ray** 构建的下一代分布式多 Agent 协作系统。项目采用“中心监管 + 边缘执行”的异构集群模式,通过大参数 MoE 模型进行高层逻辑推理,并协同微调后的轻量化模型高效完成具体任务。借助 **Pydantic-AI** 提供的强类型约束与 FastAPI 异步网关,Pretor 实现了任务从需求拆解、资源调度到自动化执行的全链路闭环,为个人提供可靠的人工智能助手服务。
|
||||||
|
|
||||||
|
---
|
||||||
|
## 特别之处?
|
||||||
|
|
||||||
|
- 本项目通过 **Ray** 和 **vllm** 实现个人个性化助手的创建,你可以通过收集符合你自己偏好的数据,构建独属于自己的风格的人工智能助手。
|
||||||
|
- 本项目通过多 Agent 协作,实现比起单 Agent 系统更强的性能,从而完成更复杂的任务。
|
||||||
|
- 本项目通过调用本地模型,从而减少对于昂贵的API使用和一定程度上的安全保护。如果你是创作者,可以通过用自己的作品去训练属于自己的模型,提高工作效率。
|
||||||
|
- (暂未实现)本项目适配多种消息平台,实现在外可通过多种方式给 **Pretor** 下达指令完成工作。
|
||||||
|
- (暂未实现)本项目内置 **growth_node(生长节点)** ,实现傻瓜式微调模型操作,让你的 **Pretor** 自己学会一些独特的技能。
|
||||||
|
|
||||||
|
那么如何拥有属于自己的**执政官**呢?
|
||||||
|
|
||||||
|
---
|
||||||
|
## 快速开始
|
||||||
|
本项目正在开发中...
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
- [ ] 实现由监管模型理解并发布,子个体向下布置任务,完成任务向上传递,监管模型检查的全工作流
|
- [ ] 实现由监管模型理解并发布,子个体向下布置任务,完成任务向上传递,监管模型检查的全工作流
|
||||||
---
|
---
|
||||||
#### 简介
|
#### 简介
|
||||||
**ArchonBot**是一款python开发,实现将小模型进行微调后整理为一个大型集群,从而实现低算力情况下高复杂度任务的实现。
|
**Pretor**是一款python开发,实现将小模型进行微调后整理为一个大型集群,从而实现低算力情况下高复杂度任务的实现。
|
||||||
系统模型分为以下部分:
|
系统模型分为以下部分:
|
||||||
- **监管节点**:负责基本交流和任务分流;
|
- **监管节点**:负责基本交流和任务分流;
|
||||||
- **管控节点**:负责调度系统资源;
|
- **管控节点**:负责调度系统资源;
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
from fastapi import APIRouter, Request
|
from fastapi import APIRouter, Request
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from pretor.utils.access import Accessor
|
from pretor.utils.access import Accessor
|
||||||
|
from fastapi.concurrency import run_in_threadpool
|
||||||
|
|
||||||
auth_router = APIRouter(prefix="/api/v1/auth", tags=["auth"])
|
auth_router = APIRouter(prefix="/api/v1/auth", tags=["auth"])
|
||||||
|
|
||||||
|
|
@ -25,7 +26,7 @@ class UserRegister(BaseModel):
|
||||||
@auth_router.post("/register")
|
@auth_router.post("/register")
|
||||||
async def create_user(user_register: UserRegister, request: Request):
|
async def create_user(user_register: UserRegister, request: Request):
|
||||||
postgres_database = request.app.state.postgres_database
|
postgres_database = request.app.state.postgres_database
|
||||||
hashed_password = Accessor.hash_password(user_register.password)
|
hashed_password = await run_in_threadpool(Accessor.hash_password, user_register.password)
|
||||||
user = await postgres_database.auth_database.add_user.remote(user_register.user_name, hashed_password)
|
user = await postgres_database.auth_database.add_user.remote(user_register.user_name, hashed_password)
|
||||||
return {"message": "success", "user_id": user.user_id}
|
return {"message": "success", "user_id": user.user_id}
|
||||||
|
|
||||||
|
|
@ -36,9 +37,9 @@ class UserLogin(BaseModel):
|
||||||
@auth_router.post("/login")
|
@auth_router.post("/login")
|
||||||
async def login_user(user_login: UserLogin, request: Request):
|
async def login_user(user_login: UserLogin, request: Request):
|
||||||
postgres_database = request.app.state.postgres_database
|
postgres_database = request.app.state.postgres_database
|
||||||
user = postgres_database.auth_database.login_user.remote(user_login.user_name)
|
user = await postgres_database.auth_database.login_user.remote(user_login.user_name)
|
||||||
if user.user_name != user_login.user_name:
|
if user.user_name != user_login.user_name:
|
||||||
pass
|
pass
|
||||||
token = Accessor.login_hashed_password(user, user_login.password)
|
token = await run_in_threadpool(Accessor.login_hashed_password, user, user_login.password)
|
||||||
return {"message":"success", "token":token}
|
return {"message":"success", "token":token}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ class GlobalStateMachine:
|
||||||
del self.event_dict[event_id]
|
del self.event_dict[event_id]
|
||||||
|
|
||||||
def get_event(self, event_id: str) -> PretorEvent:
|
def get_event(self, event_id: str) -> PretorEvent:
|
||||||
return self.event_dict.get("event_id", None)
|
return self.event_dict.get(event_id, None)
|
||||||
|
|
||||||
def update_attachment(self, event_id: str, attachment: Dict[str, str]) -> None:
|
def update_attachment(self, event_id: str, attachment: Dict[str, str]) -> None:
|
||||||
self.event_dict[event_id].attachment = attachment
|
self.event_dict[event_id].attachment = attachment
|
||||||
|
|
@ -83,10 +83,10 @@ class GlobalStateMachine:
|
||||||
provider_apikey=provider_apikey,
|
provider_apikey=provider_apikey,
|
||||||
provider_owner=provider_owner)
|
provider_owner=provider_owner)
|
||||||
try:
|
try:
|
||||||
if provider_type not in self.global_provider_manager.provider_mapper.keys():
|
provider_class = self.global_provider_manager.provider_mapper.get(provider_type, None)
|
||||||
|
if provider_class is None:
|
||||||
logger.warning(f"Provider type {provider_type} is not supported.")
|
logger.warning(f"Provider type {provider_type} is not supported.")
|
||||||
return None
|
return None
|
||||||
provider_class = self.global_provider_manager.provider_mapper.get(provider_type)
|
|
||||||
provider: Provider = await provider_class.create_model(provider_args)
|
provider: Provider = await provider_class.create_model(provider_args)
|
||||||
|
|
||||||
provider.provider_owner = provider_owner
|
provider.provider_owner = provider_owner
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,10 @@ from loguru import logger
|
||||||
from typing import Optional, Dict, Union, Any, List
|
from typing import Optional, Dict, Union, Any, List
|
||||||
from pretor.utils.error import WorkflowError, WorkflowExit
|
from pretor.utils.error import WorkflowError, WorkflowExit
|
||||||
from pretor.core.individual.control_node.template import ForWorkflowInput as ControlForWorkflowInput, \
|
from pretor.core.individual.control_node.template import ForWorkflowInput as ControlForWorkflowInput, \
|
||||||
ControlNodeResponse, ForWorkflow as ControlForWorkflow
|
ForWorkflow as ControlForWorkflow
|
||||||
from pretor.core.individual.consciousness_node.template import ForWorkflowInput as ConsciousnessForWorkflowInput, \
|
from pretor.core.individual.consciousness_node.template import ForWorkflowInput as ConsciousnessForWorkflowInput, \
|
||||||
ForSupervisoryInput, ForSupervisoryNode, ForWorkflow as ConsciousnessForWorkflow
|
ForSupervisoryInput, ForSupervisoryNode, ForWorkflow as ConsciousnessForWorkflow
|
||||||
from pretor.core.individual.supervisory_node.template import TerminationMessage, ForUser
|
from pretor.core.individual.supervisory_node.template import TerminationMessage
|
||||||
|
|
||||||
|
|
||||||
class WorkflowEngine:
|
class WorkflowEngine:
|
||||||
|
|
|
||||||
|
|
@ -39,5 +39,5 @@ class WorkflowManager:
|
||||||
def generate_workflow_template(self, name: str, desc: str, steps: list) -> None:
|
def generate_workflow_template(self, name: str, desc: str, steps: list) -> None:
|
||||||
try:
|
try:
|
||||||
self.workflow_template_generator.generate_workflow_template(name=name, desc=desc, steps=steps)
|
self.workflow_template_generator.generate_workflow_template(name=name, desc=desc, steps=steps)
|
||||||
except:
|
except Exception as e:
|
||||||
pass
|
logger.exception("Failed to generate workflow template")
|
||||||
|
|
@ -27,7 +27,7 @@ class TokenData(BaseModel):
|
||||||
exp: Optional[int] = None
|
exp: Optional[int] = None
|
||||||
|
|
||||||
|
|
||||||
SECRET_KEY = os.getenv("SECRET_KEY", "your-fallback-secret-for-dev")
|
SECRET_KEY = os.getenv("SECRET_KEY")
|
||||||
ALGORITHM = "HS256"
|
ALGORITHM = "HS256"
|
||||||
ACCESS_TOKEN_EXPIRE_MINUTES = 60 * 24 # 默认有效期 1 天
|
ACCESS_TOKEN_EXPIRE_MINUTES = 60 * 24 # 默认有效期 1 天
|
||||||
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue