from datetime import datetime
from typing import Dict, Any, List, Optional
from pydantic import BaseModel, Field
# First is the set of types that are used in the chainfury itself
[docs]class FENode(BaseModel):
"""FENode is the node as required by the UI to render the node in the graph. If you do not care about the UI, you can
populate either the ``cf_id`` or ``cf_data``."""
[docs] class CFData(BaseModel):
id: str
type: str
node: Dict[str, Any]
value: Any = None
cf_id: str = Field("", description="this is the id of the node in the chainfury graph")
cf_data: Optional[CFData] = Field(None, description="this is the data of the node in the chainfury graph")
[docs] class Position(BaseModel):
x: float
y: float
id: str = Field(description="The ID of the node, this is ignored by engine")
position: Position = Field(description="The position of the node in the graph")
type: str = Field("FuryEngineNode", description="The FE type of node")
width: int = Field(description="Width of the node card")
height: int = Field(description="Height of the node card")
selected: Optional[bool] = Field(None, description="Is this node selected")
position_absolute: Optional[Position] = Field(None, description="The absolute position of the node")
dragging: Optional[bool] = Field(None, description="Is this node draggable")
data: Optional[Dict[str, Any]] = Field({}, description="Any extra data to be stored by the node")
[docs]class Edge(BaseModel):
"""This is one edge of the graph"""
id: str = Field(description="The ID of the edge, this is ignored by engine")
source: str = Field(description="The ID of the source node")
sourceHandle: str = Field(description="The variable of the source node")
target: str = Field(description="The ID of the target node")
targetHandle: str = Field(description="The variable of the target node")
[docs]class Dag(BaseModel):
"""This is visual representation of the chain. JSON of this is stored in the DB."""
nodes: List[FENode]
edges: List[Edge]
sample: Dict[str, Any] = Field(default_factory=dict)
main_in: str = ""
main_out: str = ""
[docs]class CFPromptResult(BaseModel):
"""This is a structured result of the prompt by the Chain. This is more useful for providing types on the server."""
result: str
prompt_id: int = 0
task_id: str = ""
[docs]class ApiResponse(BaseModel):
"""This is the default response body of the API"""
message: str
[docs]class ApiPromptBody(BaseModel):
"""This is the prompt for the API to run the chain"""
session_id: str
chat_history: List[str] = []
data: Dict[str, Any] = dict()
new_message: str = ""
[docs]class ApiChain(BaseModel):
"""This is the on-the-wire representation of the chain. This is used by the network to transfer chains"""
name: str
dag: Optional[Dag] = None
description: Optional[str] = None
id: str = ""
created_at: Optional[datetime] = None
engine: str = ""
update_keys: List[str] = []
[docs]class ApiCreateChainRequest(BaseModel):
"""User request to create a new chain"""
name: str
engine: str
dag: Optional[Dag] = None
description: str = ""
[docs]class ApiListChainsResponse(BaseModel):
"""List of all the chains"""
chatbots: List[ApiChain]
[docs]class ApiAction(BaseModel):
[docs] class FnModel(BaseModel):
model_id: str = Field(description="The model ID taken from the /components/models API.")
model_params: dict = Field(description="The model parameters JSON.")
fn: dict = Field(description="The function JSON.")
[docs] class OutputModel(BaseModel):
type: str = Field(description="The type of the output.")
name: str = Field(description="The name of the output.")
loc: list[str] = Field(description="The location of the output in the JSON.")
name: str = Field(description="The name of the action.")
description: str = Field(description="The description of the action.")
tags: list[str] = Field(default=[], description="The tags for the action.")
fn: FnModel = Field(description="The function details for the action.")
outputs: list[OutputModel] = Field(description="The output details for the action.")
[docs]class ApiActionUpdateRequest(BaseModel):
name: str = Field(default="", description="The name of the action.")
description: str = Field(default="", description="The description of the action.")
tags: list[str] = Field(default=[], description="The tags for the action.")
fn: ApiAction.FnModel = Field(default=None, description="The function details for the action.")
outputs: list[ApiAction.OutputModel] = Field([], description="The output details for the action.")
update_fields: list[str] = Field(description="The fields to update.")
[docs]class ApiAuth(BaseModel):
username: str
password: str
[docs]class ApiSignUp(BaseModel):
username: str
email: str
password: str
[docs]class ApiChangePassword(BaseModel):
username: str
old_password: str
new_password: str
[docs]class ApiPromptFeedback(BaseModel):
score: int