"""
Copyright 2026 Huawei Technologies Co., Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
from typing import Optional, List, Dict, Any, Union, TYPE_CHECKING
from backend.models.constants import (
FIELD_ID,
FIELD_NAME,
FIELD_DESCRIPTION,
FIELD_DOCUMENTS,
FIELD_DATASETS,
)
if TYPE_CHECKING:
from backend.models.document import Document
from backend.models.dataset import Dataset
def _extract_object_id(obj: Any) -> Union[int, str, Any]:
"""
提取对象的ID
Args:
obj: 可能是Document/Dataset对象或ID
Returns:
Union[int, str, Any]: 如果对象有id属性则返回id,否则返回对象本身
"""
if hasattr(obj, FIELD_ID) and getattr(obj, FIELD_ID) is not None:
return getattr(obj, FIELD_ID)
return obj
class Project:
"""
项目类,用于管理项目配置和关联资源
Attributes:
id: 项目唯一标识符
name: 项目名称
description: 项目描述
llm_provider: 大语言模型提供商
api_key: API密钥
model_name: 使用的模型名称
documents: 关联文档列表
datasets: 关联数据集列表
"""
def __init__(
self,
id: Optional[Union[int, str]] = None,
name: Optional[str] = None,
description: Optional[str] = None,
llm_provider: Optional[str] = None,
api_key: Optional[str] = None,
model_name: Optional[str] = None,
):
"""
初始化项目实例
Args:
id: 项目唯一标识符
name: 项目名称
description: 项目描述
llm_provider: 大语言模型提供商
api_key: API密钥
model_name: 使用的模型名称
"""
self.id = id
self.name = name
self.description = description
self.llm_provider = llm_provider
self.api_key = api_key
self.model_name = model_name
self.documents: List[Any] = []
self.datasets: List[Any] = []
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> 'Project':
"""
从配置字典创建Project实例
Args:
data: 包含项目配置的字典
Returns:
Project: 创建的项目实例
"""
instance = cls(
id=data.get(FIELD_ID),
name=data.get(FIELD_NAME),
description=data.get(FIELD_DESCRIPTION),
llm_provider=data.get('llm_provider'),
api_key=data.get('api_key'),
model_name=data.get('model_name'),
)
instance.documents = data.get(FIELD_DOCUMENTS, [])
instance.datasets = data.get(FIELD_DATASETS, [])
return instance
def to_dict(self) -> Dict[str, Any]:
"""
将实例导出为配置字典
Returns:
Dict[str, Any]: 包含所有属性的配置字典
"""
return {
FIELD_ID: self.id,
FIELD_NAME: self.name,
FIELD_DESCRIPTION: self.description,
'llm_provider': self.llm_provider,
'api_key': self.api_key,
'model_name': self.model_name,
FIELD_DOCUMENTS: [_extract_object_id(doc) for doc in self.documents],
FIELD_DATASETS: [_extract_object_id(dataset) for dataset in self.datasets],
}