# Copyright 2025 Flower Labs GmbH. All Rights Reserved.## 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.# =============================================================================="""Flower type definitions."""fromcollections.abcimportCallablefromdataclassesimportdataclassfromenumimportEnumfromtypingimportAnyimportnumpyasnpimportnumpy.typingasnptNDArray=npt.NDArray[Any]NDArrayInt=npt.NDArray[np.int_]NDArrayFloat=npt.NDArray[np.float64]NDArrays=list[NDArray]# The following union type contains Python types corresponding to ProtoBuf types that# ProtoBuf considers to be "Scalar Value Types", even though some of them arguably do# not conform to other definitions of what a scalar is. Source:# https://developers.google.com/protocol-buffers/docs/overview#scalarScalar=bool|bytes|float|int|strValue=(bool|bytes|float|int|str|list[bool]|list[bytes]|list[float]|list[int]|list[str])# Value types for common.MetricRecordMetricScalar=int|floatMetricScalarList=list[int]|list[float]MetricRecordValues=MetricScalar|MetricScalarList# Value types for common.ConfigRecordConfigScalar=MetricScalar|str|bytes|boolConfigScalarList=MetricScalarList|list[str]|list[bytes]|list[bool]ConfigRecordValues=ConfigScalar|ConfigScalarListMetrics=dict[str,Scalar]MetricsAggregationFn=Callable[[list[tuple[int,Metrics]]],Metrics]Config=dict[str,Scalar]Properties=dict[str,Scalar]# Value type for user configsUserConfigValue=bool|float|int|strUserConfig=dict[str,UserConfigValue]
[docs]classCode(Enum):"""Client status codes."""OK=0GET_PROPERTIES_NOT_IMPLEMENTED=1GET_PARAMETERS_NOT_IMPLEMENTED=2FIT_NOT_IMPLEMENTED=3EVALUATE_NOT_IMPLEMENTED=4
classClientAppOutputCode(Enum):"""ClientAppIO status codes."""SUCCESS=0DEADLINE_EXCEEDED=1UNKNOWN_ERROR=2@dataclassclassClientAppOutputStatus:"""ClientAppIO status."""code:ClientAppOutputCodemessage:str
[docs]@dataclassclassGetParametersIns:"""Parameters request for a client."""config:Config
[docs]@dataclassclassGetParametersRes:"""Response when asked to return parameters."""status:Statusparameters:Parameters
[docs]@dataclassclassFitIns:"""Fit instructions for a client."""parameters:Parametersconfig:dict[str,Scalar]
[docs]@dataclassclassFitRes:"""Fit response from a client."""status:Statusparameters:Parametersnum_examples:intmetrics:dict[str,Scalar]
[docs]@dataclassclassEvaluateIns:"""Evaluate instructions for a client."""parameters:Parametersconfig:dict[str,Scalar]
[docs]@dataclassclassEvaluateRes:"""Evaluate response from a client."""status:Statusloss:floatnum_examples:intmetrics:dict[str,Scalar]
[docs]@dataclassclassGetPropertiesIns:"""Properties request for a client."""config:Config
[docs]@dataclassclassGetPropertiesRes:"""Properties response from a client."""status:Statusproperties:Properties
[docs]@dataclassclassReconnectIns:"""ReconnectIns message from server to client."""seconds:int|None
[docs]@dataclassclassDisconnectRes:"""DisconnectRes message from client to server."""reason:str
[docs]@dataclassclassServerMessage:"""ServerMessage is a container used to hold one instruction message."""get_properties_ins:GetPropertiesIns|None=Noneget_parameters_ins:GetParametersIns|None=Nonefit_ins:FitIns|None=Noneevaluate_ins:EvaluateIns|None=None
[docs]@dataclassclassClientMessage:"""ClientMessage is a container used to hold one result message."""get_properties_res:GetPropertiesRes|None=Noneget_parameters_res:GetParametersRes|None=Nonefit_res:FitRes|None=Noneevaluate_res:EvaluateRes|None=None
@dataclassclassRunStatus:"""Run status information."""status:strsub_status:strdetails:str@dataclassclassRun:# pylint: disable=too-many-instance-attributes"""Run details."""run_id:intfab_id:strfab_version:strfab_hash:stroverride_config:UserConfigpending_at:strstarting_at:strrunning_at:strfinished_at:strstatus:RunStatusflwr_aid:strfederation:str@classmethoddefcreate_empty(cls,run_id:int)->"Run":"""Return an empty Run instance."""returncls(run_id=run_id,fab_id="",fab_version="",fab_hash="",override_config={},pending_at="",starting_at="",running_at="",finished_at="",status=RunStatus(status="",sub_status="",details=""),flwr_aid="",federation="",)@dataclassclassFab:"""Fab file representation."""hash_str:strcontent:bytesverifications:dict[str,str]classRunNotRunningException(BaseException):"""Raised when a run is not running."""classInvalidRunStatusException(BaseException):"""Raised when an RPC is invalidated by the RunStatus."""def__init__(self,message:str)->None:super().__init__(message)self.message=message# OIDC account authentication types@dataclassclassAccountAuthLoginDetails:"""Account authentication login details."""authn_type:strdevice_code:strverification_uri_complete:strexpires_in:intinterval:int@dataclassclassAccountAuthCredentials:"""Account authentication tokens."""access_token:strrefresh_token:str@dataclassclassAccountInfo:"""User information for event log."""flwr_aid:str|Noneaccount_name:str|None@dataclassclassActor:"""Event log actor."""actor_id:str|Nonedescription:str|Noneip_address:str@dataclassclassEvent:"""Event log description."""action:strrun_id:int|Nonefab_hash:str|None@dataclassclassLogEntry:"""Event log record."""timestamp:stractor:Actorevent:Eventstatus:str