Update 2026-05-13 16:43:53

This commit is contained in:
yi
2026-05-13 16:43:53 +08:00
parent 6af5c584f4
commit afd7c5fe85
490 changed files with 850 additions and 922 deletions
+361
View File
@@ -0,0 +1,361 @@
from pydantic import BaseModel, ConfigDict, Field
from typing import Optional, List, Dict, Any, Literal, Union
from datetime import datetime
from enum import Enum
class A2ATaskState(str, Enum):
SUBMITTED = "SUBMITTED"
WORKING = "WORKING"
COMPLETED = "COMPLETED"
FAILED = "FAILED"
CANCELED = "CANCELED"
INPUT_REQUIRED = "INPUT_REQUIRED"
AUTH_REQUIRED = "AUTH_REQUIRED"
REJECTED = "REJECTED"
class A2APartType(str, Enum):
TEXT = "text"
RAW = "raw"
URL = "url"
DATA = "data"
class A2AMessageRole(str, Enum):
USER = "user"
AGENT = "agent"
SYSTEM = "system"
class A2APartSchema(BaseModel):
part_type: A2APartType
text: Optional[str] = None
raw: Optional[bytes] = None
url: Optional[str] = None
data: Optional[Any] = None
mediaType: Optional[str] = None
filename: Optional[str] = None
metadata: Optional[Dict[str, Any]] = Field(default_factory=dict)
class A2APartCreateSchema(BaseModel):
part_type: A2APartType
text: Optional[str] = None
raw: Optional[str] = None
url: Optional[str] = None
data: Optional[Any] = None
mediaType: Optional[str] = None
filename: Optional[str] = None
metadata: Optional[Dict[str, Any]] = Field(default_factory=dict)
class A2AMessageSchema(BaseModel):
messageId: str
contextId: Optional[str] = None
taskId: Optional[str] = None
role: A2AMessageRole
parts: List[A2APartSchema] = Field(default_factory=list)
extensions: Optional[Dict[str, Any]] = Field(default_factory=dict)
referenceTaskIds: Optional[List[str]] = Field(default_factory=list)
createdAt: Optional[datetime] = None
model_config = ConfigDict(from_attributes=True)
class A2AMessageCreateSchema(BaseModel):
messageId: str
contextId: Optional[str] = None
taskId: Optional[str] = None
role: A2AMessageRole
parts: List[A2APartCreateSchema] = Field(default_factory=list)
extensions: Optional[Dict[str, Any]] = Field(default_factory=dict)
referenceTaskIds: Optional[List[str]] = Field(default_factory=list)
class A2AArtifactSchema(BaseModel):
artifactId: str
name: Optional[str] = None
description: Optional[str] = None
parts: List[A2APartSchema] = Field(default_factory=list)
metadata: Optional[Dict[str, Any]] = Field(default_factory=dict)
extensions: Optional[Dict[str, Any]] = Field(default_factory=dict)
createdAt: Optional[datetime] = None
updatedAt: Optional[datetime] = None
model_config = ConfigDict(from_attributes=True)
class A2AArtifactCreateSchema(BaseModel):
artifactId: str
name: Optional[str] = None
description: Optional[str] = None
parts: List[A2APartCreateSchema] = Field(default_factory=list)
metadata: Optional[Dict[str, Any]] = Field(default_factory=dict)
extensions: Optional[Dict[str, Any]] = Field(default_factory=dict)
class A2ATaskStatusSchema(BaseModel):
state: A2ATaskState
timestamp: datetime
class A2ATaskSchema(BaseModel):
id: str
contextId: Optional[str] = None
projectId: int
tenantId: int
source: str
remoteAgentId: Optional[int] = None
idempotencyKey: Optional[str] = None
state: A2ATaskState
inputText: str
outputText: Optional[str] = None
errorMessage: Optional[str] = None
metadata: Optional[Dict[str, Any]] = Field(default_factory=dict)
historyLength: int = 0
createdAt: datetime
updatedAt: datetime
finishedAt: Optional[datetime] = None
model_config = ConfigDict(from_attributes=True)
class A2ATaskWithMessagesSchema(A2ATaskSchema):
messages: List[A2AMessageSchema] = Field(default_factory=list)
artifacts: List[A2AArtifactSchema] = Field(default_factory=list)
class A2ATaskWithHistorySchema(BaseModel):
id: str
contextId: Optional[str] = None
projectId: int
tenantId: int
state: A2ATaskState
history: List[A2AMessageSchema] = Field(default_factory=list)
artifacts: List[A2AArtifactSchema] = Field(default_factory=list)
createdAt: datetime
updatedAt: datetime
finishedAt: Optional[datetime] = None
model_config = ConfigDict(from_attributes=True)
class TaskStatusUpdateEvent(BaseModel):
taskId: str
contextId: Optional[str] = None
status: A2ATaskStatusSchema
metadata: Optional[Dict[str, Any]] = Field(default_factory=dict)
class TaskArtifactUpdateEvent(BaseModel):
taskId: str
contextId: Optional[str] = None
artifact: A2AArtifactSchema
append: bool = False
lastChunk: bool = True
class TaskMessageEvent(BaseModel):
message: A2AMessageSchema
class StreamResponseTask(BaseModel):
id: str
contextId: Optional[str] = None
state: A2ATaskState
artifacts: List[A2AArtifactSchema] = Field(default_factory=list)
class StreamResponse(BaseModel):
task: Optional[StreamResponseTask] = None
message: Optional[A2AMessageSchema] = None
statusUpdate: Optional[TaskStatusUpdateEvent] = None
artifactUpdate: Optional[TaskArtifactUpdateEvent] = None
class SendMessageRequest(BaseModel):
message: A2AMessageCreateSchema
taskId: Optional[str] = None
contextId: Optional[str] = None
class SendStreamingMessageRequest(BaseModel):
message: A2AMessageCreateSchema
taskId: Optional[str] = None
contextId: Optional[str] = None
class GetTaskRequest(BaseModel):
historyLength: Optional[int] = None
class TaskListRequest(BaseModel):
contextId: Optional[str] = None
status: Optional[A2ATaskState] = None
pageSize: int = 20
pageToken: Optional[str] = None
class CancelTaskRequest(BaseModel):
pass
class PushNotificationConfigCreate(BaseModel):
targetUrl: str
secret: Optional[str] = None
authHeader: Optional[str] = None
enabled: bool = True
class PushNotificationConfig(BaseModel):
id: int
taskId: str
targetUrl: str
secret: Optional[str] = None
authHeader: Optional[str] = None
enabled: bool
createdBy: int
createdAt: datetime
model_config = ConfigDict(from_attributes=True)
class VersionNotSupportedError(BaseModel):
code: int = -32009
message: str = "Version not supported"
data: Optional[Dict[str, Any]] = None
class AgentSkillInputMode(str, Enum):
TEXT = "text"
DATA = "data"
RAW = "raw"
URL = "url"
class AgentSkillOutputMode(str, Enum):
TEXT = "text"
DATA = "data"
ARTIFACT = "artifact"
STREAM = "stream"
class AgentSkillSecurityRequirement(BaseModel):
scheme: str
scopes: Optional[List[str]] = None
class AgentSkillExample(BaseModel):
input: Dict[str, Any]
output: Dict[str, Any]
class AgentSkill(BaseModel):
id: str
name: str
description: Optional[str] = None
tags: List[str] = Field(default_factory=list)
examples: List[AgentSkillExample] = Field(default_factory=list)
inputModes: List[AgentSkillInputMode] = Field(default_factory=list)
outputModes: List[AgentSkillOutputMode] = Field(default_factory=list)
securityRequirements: List[AgentSkillSecurityRequirement] = Field(default_factory=list)
class AgentProvider(BaseModel):
organization: str
url: Optional[str] = None
class AgentSupportedInterface(BaseModel):
url: str
protocolBinding: str
protocolVersion: str
tenant: Optional[str] = None
class SecuritySchemeApiKey(BaseModel):
type: Literal["apiKey"] = "apiKey"
name: str
in_: str = Field(alias="in")
description: Optional[str] = None
model_config = ConfigDict(populate_by_name=True)
class SecuritySchemeHttpAuth(BaseModel):
type: Literal["http"] = "http"
scheme: str
description: Optional[str] = None
class OAuth2AuthorizationCodeFlow(BaseModel):
authorizationUrl: str
tokenUrl: str
scopes: Dict[str, str] = Field(default_factory=dict)
refreshUrl: Optional[str] = None
class OAuth2ClientCredentialsFlow(BaseModel):
tokenUrl: str
scopes: Dict[str, str] = Field(default_factory=dict)
refreshUrl: Optional[str] = None
class OAuth2DeviceCodeFlow(BaseModel):
authorizationUrl: str
tokenUrl: str
scopes: Dict[str, str] = Field(default_factory=dict)
deviceAuthorizationUrl: Optional[str] = None
class OAuth2Flows(BaseModel):
authorizationCode: Optional[OAuth2AuthorizationCodeFlow] = None
clientCredentials: Optional[OAuth2ClientCredentialsFlow] = None
deviceCode: Optional[OAuth2DeviceCodeFlow] = None
implicit: Optional[Dict[str, Any]] = None
password: Optional[Dict[str, Any]] = None
class SecuritySchemeOAuth2(BaseModel):
type: Literal["oauth2"] = "oauth2"
flows: OAuth2Flows
description: Optional[str] = None
class SecuritySchemeOpenIdConnect(BaseModel):
type: Literal["openIdConnect"] = "openIdConnect"
openIdConnectUrl: str
description: Optional[str] = None
scopes: Dict[str, str] = Field(default_factory=dict)
class SecuritySchemeMtls(BaseModel):
type: Literal["mutualTLS"] = "mutualTLS"
description: Optional[str] = None
caCerts: Optional[List[str]] = None
clientCert: Optional[str] = None
clientKey: Optional[str] = None
class AgentCardPublicSchema(BaseModel):
name: str
protocol_version: str = "1.0"
capabilities: List[str]
endpoints: Dict[str, str]
auth: List[str]
skills: List[AgentSkill] = Field(default_factory=list)
provider: Optional[AgentProvider] = None
supportedInterfaces: List[AgentSupportedInterface] = Field(default_factory=list)
defaultInputModes: List[str] = Field(default_factory=list)
defaultOutputModes: List[str] = Field(default_factory=list)
iconUrl: Optional[str] = None
documentationUrl: Optional[str] = None
class AgentCardExtendedSchema(AgentCardPublicSchema):
securitySchemes: Optional[Dict[str, Union[SecuritySchemeApiKey, SecuritySchemeHttpAuth, SecuritySchemeOAuth2, SecuritySchemeOpenIdConnect, SecuritySchemeMtls]]] = None
security: List[Dict[str, List[str]]] = Field(default_factory=list)
signatures: List[str] = Field(default_factory=list)
tenantId: Optional[int] = None
isAdmin: Optional[bool] = None
+128
View File
@@ -0,0 +1,128 @@
from typing import Any, Dict, List, Optional, Literal, Union
from pydantic import BaseModel, Field
# Base Chart Schema
class ChartSchema(BaseModel):
class ChartType(BaseModel):
type: Literal["bar", "line", "area", "arc"]
class ChartEncoding(BaseModel):
field: str
type: Literal["ordinal", "quantitative", "nominal"]
title: str
title: str
mark: ChartType
encoding: ChartEncoding
class TemporalChartEncoding(ChartSchema.ChartEncoding):
type: Literal["temporal"] = Field(default="temporal")
timeUnit: str = Field(default="yearmonth")
# Line Chart
class LineChartSchema(ChartSchema):
class LineChartMark(BaseModel):
type: Literal["line"] = Field(default="line")
class LineChartEncoding(BaseModel):
x: Union[TemporalChartEncoding, ChartSchema.ChartEncoding]
y: ChartSchema.ChartEncoding
color: Optional[ChartSchema.ChartEncoding] = None
mark: LineChartMark
encoding: LineChartEncoding
# Multi Line Chart
class MultiLineChartSchema(ChartSchema):
class MultiLineChartMark(BaseModel):
type: Literal["line"] = Field(default="line")
class MultiLineChartTransform(BaseModel):
fold: List[str]
as_: List[str] = Field(alias="as")
class MultiLineChartEncoding(BaseModel):
x: Union[TemporalChartEncoding, ChartSchema.ChartEncoding]
y: ChartSchema.ChartEncoding
color: ChartSchema.ChartEncoding
mark: MultiLineChartMark
transform: List[MultiLineChartTransform]
encoding: MultiLineChartEncoding
# Bar Chart
class BarChartSchema(ChartSchema):
class BarChartMark(BaseModel):
type: Literal["bar"] = Field(default="bar")
class BarChartEncoding(BaseModel):
x: Union[TemporalChartEncoding, ChartSchema.ChartEncoding]
y: ChartSchema.ChartEncoding
color: Optional[ChartSchema.ChartEncoding] = None
mark: BarChartMark
encoding: BarChartEncoding
# Grouped Bar Chart
class GroupedBarChartSchema(ChartSchema):
class GroupedBarChartMark(BaseModel):
type: Literal["bar"] = Field(default="bar")
class GroupedBarChartEncoding(BaseModel):
x: Union[TemporalChartEncoding, ChartSchema.ChartEncoding]
y: ChartSchema.ChartEncoding
xOffset: ChartSchema.ChartEncoding
color: ChartSchema.ChartEncoding
mark: GroupedBarChartMark
encoding: GroupedBarChartEncoding
# Stacked Bar Chart
class StackedBarChartYEncoding(ChartSchema.ChartEncoding):
stack: Literal["zero"] = Field(default="zero")
class StackedBarChartSchema(ChartSchema):
class StackedBarChartMark(BaseModel):
type: Literal["bar"] = Field(default="bar")
class StackedBarChartEncoding(BaseModel):
x: Union[TemporalChartEncoding, ChartSchema.ChartEncoding]
y: StackedBarChartYEncoding
color: ChartSchema.ChartEncoding
mark: StackedBarChartMark
encoding: StackedBarChartEncoding
# Pie Chart
class PieChartSchema(ChartSchema):
class PieChartMark(BaseModel):
type: Literal["arc"] = Field(default="arc")
class PieChartEncoding(BaseModel):
theta: ChartSchema.ChartEncoding
color: ChartSchema.ChartEncoding
mark: PieChartMark
encoding: PieChartEncoding
# Area Chart
class AreaChartSchema(ChartSchema):
class AreaChartMark(BaseModel):
type: Literal["area"] = Field(default="area")
class AreaChartEncoding(BaseModel):
x: Union[TemporalChartEncoding, ChartSchema.ChartEncoding]
y: ChartSchema.ChartEncoding
mark: AreaChartMark
encoding: AreaChartEncoding
# Response Model
class ChartGenerationResponse(BaseModel):
reasoning: str = Field(..., description="Reasoning for the chart choice or why a chart cannot be generated")
chart_type: Literal[
"line", "multi_line", "bar", "pie", "grouped_bar", "stacked_bar", "area", ""
] = Field(..., description="The type of chart generated, or empty string if none")
# Using Dict[str, Any] allows LLM to output valid Vega-Lite spec directly, avoiding Pydantic strict model serialization issues with dynamic fields
chart_spec: Optional[Dict[str, Any]] = Field(None, description="The generated Vega-Lite chart specification")
can_visualize: bool = Field(..., description="Whether the data can be visualized")
+29
View File
@@ -0,0 +1,29 @@
from pydantic import BaseModel, Field
from typing import Dict, Any, Optional
from datetime import datetime
class DataSourceBase(BaseModel):
name: str
type: str # sqlite, postgres, clickhouse, supabase, parquet
config: Dict[str, Any]
project_id: int
class DataSourceCreate(DataSourceBase):
pass
class DataSourceUpdate(BaseModel):
name: Optional[str] = None
type: Optional[str] = None
config: Optional[Dict[str, Any]] = None
class DataSource(DataSourceBase):
id: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class DataSourceTestRequest(BaseModel):
type: str
config: Dict[str, Any]
@@ -0,0 +1,28 @@
from typing import Optional
from pydantic import BaseModel, Field
class EmbeddingModelConfigBase(BaseModel):
name: str = Field(..., description="Display name for the model configuration")
provider: str = Field("openai", description="Provider type (e.g. openai)")
model: str = Field(..., description="Model name (e.g. text-embedding-3-small)")
api_base: Optional[str] = None
api_key: Optional[str] = None
class EmbeddingModelConfigCreate(EmbeddingModelConfigBase):
pass
class EmbeddingModelConfigUpdate(BaseModel):
name: Optional[str] = None
provider: Optional[str] = None
model: Optional[str] = None
api_base: Optional[str] = None
api_key: Optional[str] = None
class EmbeddingModelConfig(EmbeddingModelConfigBase):
id: str
class EmbeddingModelConnectionTestRequest(BaseModel):
provider: str = Field("openai")
model: str = Field(...)
api_base: Optional[str] = None
api_key: Optional[str] = None
+162
View File
@@ -0,0 +1,162 @@
from datetime import datetime
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field, field_validator
class KnowledgeDocumentBase(BaseModel):
title: str = Field(..., min_length=1, max_length=200)
content: str = Field(..., min_length=1)
metadata: Dict[str, Any] = Field(default_factory=dict)
class KnowledgeDocumentCreate(KnowledgeDocumentBase):
pass
class KnowledgeDocumentUpdate(BaseModel):
title: Optional[str] = Field(None, min_length=1, max_length=200)
content: Optional[str] = Field(None, min_length=1)
metadata: Optional[Dict[str, Any]] = None
class KnowledgeDocument(KnowledgeDocumentBase):
id: str
created_at: datetime
updated_at: datetime
class KnowledgeBaseConfigBase(BaseModel):
name: str = Field(..., min_length=1, max_length=120)
description: Optional[str] = None
project_id: Optional[int] = None
embedding_model: Optional[str] = None
chunk_size: int = Field(default=512, ge=64, le=4096)
chunk_overlap: int = Field(default=50, ge=0, le=512)
top_k: int = Field(default=3, ge=1, le=20)
is_active: bool = True
class KnowledgeBaseCreate(KnowledgeBaseConfigBase):
pass
class KnowledgeBaseUpdate(BaseModel):
name: Optional[str] = Field(None, min_length=1, max_length=120)
description: Optional[str] = None
project_id: Optional[int] = None
embedding_model: Optional[str] = None
chunk_size: Optional[int] = Field(None, ge=64, le=4096)
chunk_overlap: Optional[int] = Field(None, ge=0, le=512)
top_k: Optional[int] = Field(None, ge=1, le=20)
is_active: Optional[bool] = None
class KnowledgeBase(KnowledgeBaseConfigBase):
id: str
created_at: datetime
updated_at: datetime
documents: List[KnowledgeDocument] = Field(default_factory=list)
class KnowledgeSearchRequest(BaseModel):
query: str = Field(..., min_length=1)
top_k: Optional[int] = Field(default=None, ge=1, le=20)
class KnowledgeSearchHit(BaseModel):
doc_id: str
title: str
chunk: str
score: float
metadata: Dict[str, Any] = Field(default_factory=dict)
class KnowledgeSearchResponse(BaseModel):
answer: str
hits: List[KnowledgeSearchHit] = Field(default_factory=list)
class KnowledgeGlobalConfigUpdate(BaseModel):
api_base: Optional[str] = None
api_key: Optional[str] = None
default_embedding_model: Optional[str] = None
@field_validator("api_base")
@classmethod
def validate_api_base(cls, value: Optional[str]) -> Optional[str]:
if value is None:
return None
normalized = value.strip()
if not normalized:
return None
if not (normalized.startswith("http://") or normalized.startswith("https://")):
raise ValueError("api_base must start with http:// or https://")
return normalized.rstrip("/")
@field_validator("api_key")
@classmethod
def validate_api_key(cls, value: Optional[str]) -> Optional[str]:
if value is None:
return None
normalized = value.strip()
if not normalized:
return None
if len(normalized) > 512:
raise ValueError("api_key is too long")
return normalized
@field_validator("default_embedding_model")
@classmethod
def validate_default_embedding_model(cls, value: Optional[str]) -> Optional[str]:
if value is None:
return None
normalized = value.strip()
if not normalized:
return None
if len(normalized) > 200:
raise ValueError("default_embedding_model is too long")
return normalized
class KnowledgeGlobalConfig(BaseModel):
api_base: Optional[str] = None
api_key: Optional[str] = None
api_key_masked: Optional[str] = None
has_api_key: bool = False
default_embedding_model: Optional[str] = None
class KnowledgeConnectionTestRequest(BaseModel):
api_base: Optional[str] = None
api_key: Optional[str] = None
model_name: Optional[str] = None
@field_validator("api_base")
@classmethod
def validate_test_api_base(cls, value: Optional[str]) -> Optional[str]:
if value is None:
return None
normalized = value.strip()
if not normalized:
return None
if not (normalized.startswith("http://") or normalized.startswith("https://")):
raise ValueError("api_base must start with http:// or https://")
return normalized.rstrip("/")
@field_validator("api_key", "model_name")
@classmethod
def normalize_test_value(cls, value: Optional[str]) -> Optional[str]:
if value is None:
return None
normalized = value.strip()
return normalized or None
class KnowledgeConnectionTestResponse(BaseModel):
success: bool
message: str
model_name: Optional[str] = None
embedding_dimension: Optional[int] = None
resolved_api_base: Optional[str] = None
available_models: List[str] = Field(default_factory=list)
+30
View File
@@ -0,0 +1,30 @@
from typing import List, Dict, Optional, Literal
from pydantic import BaseModel, Field
class MCPServerBase(BaseModel):
name: str
type: Literal["stdio", "sse", "streamableHttp"]
command: Optional[str] = None
args: Optional[List[str]] = Field(default_factory=list)
env: Optional[Dict[str, str]] = Field(default_factory=dict)
url: Optional[str] = None
headers: Optional[Dict[str, str]] = Field(default_factory=dict)
project_id: int
status: str = "disconnected"
class MCPServerCreate(MCPServerBase):
pass
class MCPServerUpdate(BaseModel):
name: Optional[str] = None
type: Optional[Literal["stdio", "sse", "streamableHttp"]] = None
command: Optional[str] = None
args: Optional[List[str]] = None
env: Optional[Dict[str, str]] = None
url: Optional[str] = None
headers: Optional[Dict[str, str]] = None
project_id: Optional[int] = None
status: Optional[str] = None
class MCPServer(MCPServerBase):
id: str
+115
View File
@@ -0,0 +1,115 @@
from typing import List, Optional, Dict, Any, Union, Literal
from pydantic import BaseModel, Field
# Common Types
AccessControlOperator = Literal[
"EQUALS", "NOT_EQUALS", "GREATER_THAN", "LESS_THAN",
"GREATER_THAN_OR_EQUALS", "LESS_THAN_OR_EQUALS"
]
JoinType = Literal["ONE_TO_ONE", "ONE_TO_MANY", "MANY_TO_ONE", "MANY_TO_MANY"]
# Column Definitions
class SessionProperty(BaseModel):
name: str
required: bool
defaultExpr: Optional[str] = None
class AccessControlThreshold(BaseModel):
value: str
dataType: Literal["NUMERIC", "STRING"]
class ColumnAccessControl(BaseModel):
name: str
operator: AccessControlOperator
requiredProperties: List[SessionProperty]
threshold: Optional[AccessControlThreshold] = None
class Column(BaseModel):
name: str
type: str
relationship: Optional[str] = None
isCalculated: bool = False
notNull: bool = False
expression: Optional[str] = None
isHidden: bool = False
columnLevelAccessControl: Optional[ColumnAccessControl] = None
properties: Dict[str, Any] = Field(default_factory=dict)
# Model Definitions
class TableReference(BaseModel):
catalog: Optional[str] = None
schema_: Optional[str] = Field(None, alias="schema")
table: str
class RowLevelAccessControl(BaseModel):
name: str
requiredProperties: List[SessionProperty]
condition: str
class Model(BaseModel):
name: str
tableReference: Optional[TableReference] = None
refSql: Optional[str] = None
baseObject: Optional[str] = None
columns: List[Column] = Field(default_factory=list)
primaryKey: Optional[str] = None
cached: bool = False
refreshTime: Optional[str] = None
rowLevelAccessControls: List[RowLevelAccessControl] = Field(default_factory=list)
properties: Dict[str, Any] = Field(default_factory=dict)
# Relationship Definitions
class Relationship(BaseModel):
name: str
models: List[str] # minItems: 2, maxItems: 2
joinType: JoinType
condition: str
properties: Dict[str, Any] = Field(default_factory=dict)
# Metric Definitions
class MetricTimeGrain(BaseModel):
name: str
refColumn: str
dateParts: List[str]
class Metric(BaseModel):
name: str
baseObject: str
dimension: List[Column] = Field(default_factory=list)
measure: List[Column] = Field(default_factory=list)
timeGrain: List[MetricTimeGrain] = Field(default_factory=list)
cached: bool = False
refreshTime: Optional[str] = None
properties: Dict[str, Any] = Field(default_factory=dict)
# View Definitions
class View(BaseModel):
name: str
statement: str
properties: Dict[str, Any] = Field(default_factory=dict)
# Enum Definitions
class EnumValue(BaseModel):
name: str
value: Optional[str] = None
properties: Dict[str, Any] = Field(default_factory=dict)
class EnumDefinition(BaseModel):
name: str
values: List[EnumValue]
properties: Dict[str, Any] = Field(default_factory=dict)
# Main Manifest
class MDLManifest(BaseModel):
catalog: str
schema_: str = Field(..., alias="schema") # 'schema' is a reserved word in Pydantic v1/Python, aliasing
dataSource: Optional[str] = None
models: List[Model] = Field(default_factory=list)
relationships: List[Relationship] = Field(default_factory=list)
metrics: List[Metric] = Field(default_factory=list)
views: List[View] = Field(default_factory=list)
enumDefinitions: List[EnumDefinition] = Field(default_factory=list)
class Config:
populate_by_name = True
+23
View File
@@ -0,0 +1,23 @@
from pydantic import BaseModel
from typing import Optional, List
from datetime import datetime
class ProjectBase(BaseModel):
name: str
description: Optional[str] = None
class ProjectCreate(ProjectBase):
pass
class ProjectUpdate(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
class Project(ProjectBase):
id: int
owner_id: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
+27
View File
@@ -0,0 +1,27 @@
from pydantic import BaseModel
from typing import Optional
from datetime import datetime
class SubagentBase(BaseModel):
name: str
description: Optional[str] = None
instructions: Optional[str] = None
model: Optional[str] = None
class SubagentCreate(SubagentBase):
pass
class SubagentUpdate(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
instructions: Optional[str] = None
model: Optional[str] = None
class Subagent(SubagentBase):
id: int
project_id: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
+30
View File
@@ -0,0 +1,30 @@
from pydantic import BaseModel, ConfigDict
from typing import Optional
from datetime import datetime
class UserBase(BaseModel):
username: str
email: str
avatar: Optional[str] = None
is_active: Optional[bool] = True
is_admin: Optional[bool] = False
class UserCreate(UserBase):
password: str
class UserUpdate(BaseModel):
username: Optional[str] = None
email: Optional[str] = None
avatar: Optional[str] = None
is_active: Optional[bool] = None
is_admin: Optional[bool] = None
password: Optional[str] = None
class ResendVerificationRequest(BaseModel):
username: str
class UserResponse(UserBase):
id: int
created_at: datetime
model_config = ConfigDict(from_attributes=True)