fxn 0.0.40__py3-none-any.whl → 0.0.42__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fxn/__init__.py +3 -1
 - fxn/beta/__init__.py +6 -0
 - fxn/beta/client.py +16 -0
 - fxn/beta/prediction.py +16 -0
 - fxn/beta/remote.py +207 -0
 - fxn/c/__init__.py +7 -10
 - fxn/c/configuration.py +114 -56
 - fxn/c/fxnc.py +42 -22
 - fxn/c/map.py +60 -30
 - fxn/c/prediction.py +72 -33
 - fxn/c/predictor.py +55 -27
 - fxn/c/stream.py +33 -15
 - fxn/c/value.py +215 -42
 - fxn/cli/__init__.py +14 -12
 - fxn/cli/auth.py +1 -1
 - fxn/cli/misc.py +1 -1
 - fxn/cli/{predict.py → predictions.py} +33 -36
 - fxn/cli/predictors.py +3 -51
 - fxn/client.py +58 -0
 - fxn/compile/__init__.py +7 -0
 - fxn/compile/compile.py +80 -0
 - fxn/compile/sandbox.py +177 -0
 - fxn/compile/signature.py +183 -0
 - fxn/function.py +10 -6
 - fxn/lib/__init__.py +1 -1
 - fxn/lib/linux/arm64/libFunction.so +0 -0
 - fxn/lib/linux/x86_64/libFunction.so +0 -0
 - fxn/lib/macos/arm64/Function.dylib +0 -0
 - fxn/lib/macos/x86_64/Function.dylib +0 -0
 - fxn/lib/windows/arm64/Function.dll +0 -0
 - fxn/lib/windows/x86_64/Function.dll +0 -0
 - fxn/services/__init__.py +4 -4
 - fxn/services/prediction.py +180 -351
 - fxn/services/predictor.py +14 -187
 - fxn/services/user.py +16 -42
 - fxn/types/__init__.py +4 -4
 - fxn/types/dtype.py +1 -1
 - fxn/types/prediction.py +20 -10
 - fxn/types/predictor.py +18 -32
 - fxn/types/user.py +9 -15
 - fxn/version.py +2 -2
 - {fxn-0.0.40.dist-info → fxn-0.0.42.dist-info}/METADATA +5 -5
 - fxn-0.0.42.dist-info/RECORD +47 -0
 - {fxn-0.0.40.dist-info → fxn-0.0.42.dist-info}/WHEEL +1 -1
 - fxn/api/__init__.py +0 -6
 - fxn/api/client.py +0 -43
 - fxn/c/dtype.py +0 -26
 - fxn/c/status.py +0 -12
 - fxn/c/version.py +0 -13
 - fxn/cli/env.py +0 -40
 - fxn-0.0.40.dist-info/RECORD +0 -44
 - {fxn-0.0.40.dist-info → fxn-0.0.42.dist-info}/LICENSE +0 -0
 - {fxn-0.0.40.dist-info → fxn-0.0.42.dist-info}/entry_points.txt +0 -0
 - {fxn-0.0.40.dist-info → fxn-0.0.42.dist-info}/top_level.txt +0 -0
 
    
        fxn/c/prediction.py
    CHANGED
    
    | 
         @@ -1,37 +1,76 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
2 
     | 
    
         
             
            #   Function
         
     | 
| 
       3 
     | 
    
         
            -
            #   Copyright ©  
     | 
| 
      
 3 
     | 
    
         
            +
            #   Copyright © 2025 NatML Inc. All Rights Reserved.
         
     | 
| 
       4 
4 
     | 
    
         
             
            #
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
            from ctypes import  
     | 
| 
       7 
     | 
    
         
            -
            from  
     | 
| 
       8 
     | 
    
         
            -
            from  
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                 
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                 
     | 
| 
       20 
     | 
    
         
            -
                 
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                 
     | 
| 
       28 
     | 
    
         
            -
                 
     | 
| 
       29 
     | 
    
         
            -
                 
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                 
     | 
| 
      
 6 
     | 
    
         
            +
            from ctypes import byref, c_double, c_int32, c_void_p, create_string_buffer
         
     | 
| 
      
 7 
     | 
    
         
            +
            from pathlib import Path
         
     | 
| 
      
 8 
     | 
    
         
            +
            from typing import final
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            from .fxnc import get_fxnc, status_to_error, FXNStatus
         
     | 
| 
      
 11 
     | 
    
         
            +
            from .map import ValueMap
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            @final
         
     | 
| 
      
 14 
     | 
    
         
            +
            class Prediction:
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                def __init__ (self, prediction):
         
     | 
| 
      
 17 
     | 
    
         
            +
                    self.__prediction = prediction
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                @property
         
     | 
| 
      
 20 
     | 
    
         
            +
                def id (self) -> str:
         
     | 
| 
      
 21 
     | 
    
         
            +
                    id = create_string_buffer(256)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    status = get_fxnc().FXNPredictionGetID(self.__prediction, id, len(id))
         
     | 
| 
      
 23 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 24 
     | 
    
         
            +
                        return id.value.decode("utf-8")
         
     | 
| 
      
 25 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 26 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to get prediction id with error: {status_to_error(status)}")
         
     | 
| 
      
 27 
     | 
    
         
            +
                
         
     | 
| 
      
 28 
     | 
    
         
            +
                @property
         
     | 
| 
      
 29 
     | 
    
         
            +
                def latency (self) -> float:
         
     | 
| 
      
 30 
     | 
    
         
            +
                    latency = c_double()
         
     | 
| 
      
 31 
     | 
    
         
            +
                    status = get_fxnc().FXNPredictionGetLatency(self.__prediction, byref(latency))
         
     | 
| 
      
 32 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 33 
     | 
    
         
            +
                        return latency.value
         
     | 
| 
      
 34 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 35 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to get prediction latency with error: {status_to_error(status)}")
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                @property
         
     | 
| 
      
 38 
     | 
    
         
            +
                def results (self) -> ValueMap | None:
         
     | 
| 
      
 39 
     | 
    
         
            +
                    map = c_void_p()
         
     | 
| 
      
 40 
     | 
    
         
            +
                    status = get_fxnc().FXNPredictionGetResults(self.__prediction, byref(map))
         
     | 
| 
      
 41 
     | 
    
         
            +
                    if status != FXNStatus.OK:
         
     | 
| 
      
 42 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to get prediction results with error: {status_to_error(status)}")
         
     | 
| 
      
 43 
     | 
    
         
            +
                    map = ValueMap(map, owner=False)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    return map if len(map) > 0 else None
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                @property
         
     | 
| 
      
 47 
     | 
    
         
            +
                def error (self) -> str | None:
         
     | 
| 
      
 48 
     | 
    
         
            +
                    error = create_string_buffer(2048)
         
     | 
| 
      
 49 
     | 
    
         
            +
                    get_fxnc().FXNPredictionGetError(self.__prediction, error, len(error))
         
     | 
| 
      
 50 
     | 
    
         
            +
                    error = error.value.decode("utf-8")
         
     | 
| 
      
 51 
     | 
    
         
            +
                    return error if error else None
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                @property
         
     | 
| 
      
 54 
     | 
    
         
            +
                def logs (self) -> str:
         
     | 
| 
      
 55 
     | 
    
         
            +
                    fxnc = get_fxnc()
         
     | 
| 
      
 56 
     | 
    
         
            +
                    log_length = c_int32()
         
     | 
| 
      
 57 
     | 
    
         
            +
                    status = fxnc.FXNPredictionGetLogLength(self.__prediction, byref(log_length))
         
     | 
| 
      
 58 
     | 
    
         
            +
                    if status != FXNStatus.OK:
         
     | 
| 
      
 59 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to get prediction log length with error: {status_to_error(status)}")
         
     | 
| 
      
 60 
     | 
    
         
            +
                    logs = create_string_buffer(log_length.value + 1)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    status = fxnc.FXNPredictionGetLogs(self.__prediction, logs, len(logs))
         
     | 
| 
      
 62 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 63 
     | 
    
         
            +
                        return logs.value.decode("utf-8")
         
     | 
| 
      
 64 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 65 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to get prediction logs with error: {status_to_error(status)}")
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                def __enter__ (self):
         
     | 
| 
      
 68 
     | 
    
         
            +
                    return self
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                def __exit__ (self, exc_type, exc_value, traceback):
         
     | 
| 
      
 71 
     | 
    
         
            +
                    self.__release()
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                def __release (self):
         
     | 
| 
      
 74 
     | 
    
         
            +
                    if self.__prediction:
         
     | 
| 
      
 75 
     | 
    
         
            +
                        get_fxnc().FXNPredictionRelease(self.__prediction)
         
     | 
| 
      
 76 
     | 
    
         
            +
                    self.__prediction = None
         
     | 
    
        fxn/c/predictor.py
    CHANGED
    
    | 
         @@ -1,31 +1,59 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
2 
     | 
    
         
             
            #   Function
         
     | 
| 
       3 
     | 
    
         
            -
            #   Copyright ©  
     | 
| 
      
 3 
     | 
    
         
            +
            #   Copyright © 2025 NatML Inc. All Rights Reserved.
         
     | 
| 
       4 
4 
     | 
    
         
             
            #
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
            from ctypes import  
     | 
| 
       7 
     | 
    
         
            -
            from  
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            from . 
     | 
| 
       10 
     | 
    
         
            -
            from . 
     | 
| 
       11 
     | 
    
         
            -
            from .map import  
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                 
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                 
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 6 
     | 
    
         
            +
            from ctypes import byref, c_void_p
         
     | 
| 
      
 7 
     | 
    
         
            +
            from typing import final
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            from .configuration import Configuration
         
     | 
| 
      
 10 
     | 
    
         
            +
            from .fxnc import get_fxnc, status_to_error, FXNStatus
         
     | 
| 
      
 11 
     | 
    
         
            +
            from .map import ValueMap
         
     | 
| 
      
 12 
     | 
    
         
            +
            from .prediction import Prediction
         
     | 
| 
      
 13 
     | 
    
         
            +
            from .stream import PredictionStream
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            @final
         
     | 
| 
      
 16 
     | 
    
         
            +
            class Predictor:
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def __init__ (self, configuration: Configuration):
         
     | 
| 
      
 19 
     | 
    
         
            +
                    predictor = c_void_p()
         
     | 
| 
      
 20 
     | 
    
         
            +
                    status = get_fxnc().FXNPredictorCreate(configuration._Configuration__configuration, byref(predictor))
         
     | 
| 
      
 21 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 22 
     | 
    
         
            +
                        self.__predictor = predictor
         
     | 
| 
      
 23 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 24 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create predictor with error: {status_to_error(status)}")
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def create_prediction (self, inputs: ValueMap) -> Prediction:
         
     | 
| 
      
 27 
     | 
    
         
            +
                    prediction = c_void_p()
         
     | 
| 
      
 28 
     | 
    
         
            +
                    status = get_fxnc().FXNPredictorCreatePrediction(
         
     | 
| 
      
 29 
     | 
    
         
            +
                        self.__predictor,
         
     | 
| 
      
 30 
     | 
    
         
            +
                        inputs._ValueMap__map,
         
     | 
| 
      
 31 
     | 
    
         
            +
                        byref(prediction)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    )
         
     | 
| 
      
 33 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 34 
     | 
    
         
            +
                        return Prediction(prediction)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 36 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create prediction with error: {status_to_error(status)}")
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                def stream_prediction (self, inputs: ValueMap) -> PredictionStream:
         
     | 
| 
      
 39 
     | 
    
         
            +
                    stream = c_void_p()
         
     | 
| 
      
 40 
     | 
    
         
            +
                    status = get_fxnc().FXNPredictorStreamPrediction(
         
     | 
| 
      
 41 
     | 
    
         
            +
                        self.__predictor,
         
     | 
| 
      
 42 
     | 
    
         
            +
                        inputs._ValueMap__map,
         
     | 
| 
      
 43 
     | 
    
         
            +
                        byref(stream)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    )
         
     | 
| 
      
 45 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 46 
     | 
    
         
            +
                        return PredictionStream(stream)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 48 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to stream prediction with error: {status_to_error(status)}")
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                def __enter__ (self):
         
     | 
| 
      
 51 
     | 
    
         
            +
                    return self
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                def __exit__ (self, exc_type, exc_value, traceback):
         
     | 
| 
      
 54 
     | 
    
         
            +
                    self.__release()
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                def __release (self):
         
     | 
| 
      
 57 
     | 
    
         
            +
                    if self.__predictor:
         
     | 
| 
      
 58 
     | 
    
         
            +
                        get_fxnc().FXNPredictorRelease(self.__predictor)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    self.__predictor = None
         
     | 
    
        fxn/c/stream.py
    CHANGED
    
    | 
         @@ -1,22 +1,40 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
2 
     | 
    
         
             
            #   Function
         
     | 
| 
       3 
     | 
    
         
            -
            #   Copyright ©  
     | 
| 
      
 3 
     | 
    
         
            +
            #   Copyright © 2025 NatML Inc. All Rights Reserved.
         
     | 
| 
       4 
4 
     | 
    
         
             
            #
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
            from ctypes import  
     | 
| 
       7 
     | 
    
         
            -
            from  
     | 
| 
       8 
     | 
    
         
            -
            from .status import FXNStatus
         
     | 
| 
      
 6 
     | 
    
         
            +
            from ctypes import byref, c_void_p
         
     | 
| 
      
 7 
     | 
    
         
            +
            from typing import final
         
     | 
| 
       9 
8 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
            from .fxnc import get_fxnc, status_to_error, FXNStatus
         
     | 
| 
      
 10 
     | 
    
         
            +
            from .prediction import Prediction
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
            @final
         
     | 
| 
      
 13 
     | 
    
         
            +
            class PredictionStream:
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
            def  
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                 
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                 
     | 
| 
       20 
     | 
    
         
            -
                 
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
                def __init__ (self, stream):
         
     | 
| 
      
 16 
     | 
    
         
            +
                    self.__stream = stream
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def __iter__ (self):
         
     | 
| 
      
 19 
     | 
    
         
            +
                    return self
         
     | 
| 
      
 20 
     | 
    
         
            +
                
         
     | 
| 
      
 21 
     | 
    
         
            +
                def __next__ (self) -> Prediction:
         
     | 
| 
      
 22 
     | 
    
         
            +
                    prediction = c_void_p()
         
     | 
| 
      
 23 
     | 
    
         
            +
                    status = get_fxnc().FXNPredictionStreamReadNext(self.__stream, byref(prediction))
         
     | 
| 
      
 24 
     | 
    
         
            +
                    if status == FXNStatus.ERROR_INVALID_OPERATION:
         
     | 
| 
      
 25 
     | 
    
         
            +
                        raise StopIteration()
         
     | 
| 
      
 26 
     | 
    
         
            +
                    elif status != FXNStatus.OK:
         
     | 
| 
      
 27 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to read next prediction in stream with error: {status_to_error(status)}")
         
     | 
| 
      
 28 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 29 
     | 
    
         
            +
                        return Prediction(prediction)
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                def __enter__ (self):
         
     | 
| 
      
 32 
     | 
    
         
            +
                    return self
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                def __exit__ (self, exc_type, exc_value, traceback):
         
     | 
| 
      
 35 
     | 
    
         
            +
                    self.__release()
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                def __release (self):
         
     | 
| 
      
 38 
     | 
    
         
            +
                    if self.__stream:
         
     | 
| 
      
 39 
     | 
    
         
            +
                        get_fxnc().FXNPredictionStreamRelease(self.__stream)
         
     | 
| 
      
 40 
     | 
    
         
            +
                    self.__stream = None
         
     | 
    
        fxn/c/value.py
    CHANGED
    
    | 
         @@ -1,50 +1,223 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
2 
     | 
    
         
             
            #   Function
         
     | 
| 
       3 
     | 
    
         
            -
            #   Copyright ©  
     | 
| 
      
 3 
     | 
    
         
            +
            #   Copyright © 2025 NatML Inc. All Rights Reserved.
         
     | 
| 
       4 
4 
     | 
    
         
             
            #
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
            from  
     | 
| 
       7 
     | 
    
         
            -
            from . 
     | 
| 
       8 
     | 
    
         
            -
            from  
     | 
| 
      
 6 
     | 
    
         
            +
            from __future__ import annotations
         
     | 
| 
      
 7 
     | 
    
         
            +
            from collections.abc import Iterable
         
     | 
| 
      
 8 
     | 
    
         
            +
            from enum import IntFlag
         
     | 
| 
      
 9 
     | 
    
         
            +
            from ctypes import byref, cast, c_char_p, c_int, c_int32, c_uint8, c_void_p, string_at, POINTER
         
     | 
| 
      
 10 
     | 
    
         
            +
            from io import BytesIO
         
     | 
| 
      
 11 
     | 
    
         
            +
            from json import dumps, loads
         
     | 
| 
      
 12 
     | 
    
         
            +
            from numpy import array, dtype, int32, ndarray, zeros
         
     | 
| 
      
 13 
     | 
    
         
            +
            from numpy.ctypeslib import as_array, as_ctypes_type
         
     | 
| 
      
 14 
     | 
    
         
            +
            from PIL import Image
         
     | 
| 
      
 15 
     | 
    
         
            +
            from typing import final, Any
         
     | 
| 
       9 
16 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 17 
     | 
    
         
            +
            from ..types import Dtype
         
     | 
| 
      
 18 
     | 
    
         
            +
            from .fxnc import get_fxnc, status_to_error, FXNStatus
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            class ValueFlags (IntFlag):
         
     | 
| 
       11 
21 
     | 
    
         
             
                NONE = 0
         
     | 
| 
       12 
22 
     | 
    
         
             
                COPY_DATA = 1
         
     | 
| 
       13 
23 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                 
     | 
| 
       22 
     | 
    
         
            -
                 
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                 
     | 
| 
       31 
     | 
    
         
            -
                 
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                 
     | 
| 
       40 
     | 
    
         
            -
                 
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
            @final
         
     | 
| 
      
 25 
     | 
    
         
            +
            class Value:
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def __init__ (self, value, *, owner: bool=True):
         
     | 
| 
      
 28 
     | 
    
         
            +
                    self.__value = value
         
     | 
| 
      
 29 
     | 
    
         
            +
                    self.__owner = owner
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                @property
         
     | 
| 
      
 32 
     | 
    
         
            +
                def data (self):
         
     | 
| 
      
 33 
     | 
    
         
            +
                    data = c_void_p()
         
     | 
| 
      
 34 
     | 
    
         
            +
                    status = get_fxnc().FXNValueGetData(self.__value, byref(data))
         
     | 
| 
      
 35 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 36 
     | 
    
         
            +
                        return data
         
     | 
| 
      
 37 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 38 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to get value data with error: {status_to_error(status)}")
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                @property
         
     | 
| 
      
 41 
     | 
    
         
            +
                def type (self) -> Dtype:
         
     | 
| 
      
 42 
     | 
    
         
            +
                    dtype = c_int()
         
     | 
| 
      
 43 
     | 
    
         
            +
                    status = get_fxnc().FXNValueGetType(self.__value, byref(dtype))
         
     | 
| 
      
 44 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 45 
     | 
    
         
            +
                        return _DTYPE_TO_STR.get(dtype.value)
         
     | 
| 
      
 46 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 47 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to get value data type with error: {status_to_error(status)}")
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                @property
         
     | 
| 
      
 50 
     | 
    
         
            +
                def shape (self) -> list[int] | None:
         
     | 
| 
      
 51 
     | 
    
         
            +
                    if self.type not in _TENSOR_DTYPES:
         
     | 
| 
      
 52 
     | 
    
         
            +
                        return None
         
     | 
| 
      
 53 
     | 
    
         
            +
                    fxnc = get_fxnc()
         
     | 
| 
      
 54 
     | 
    
         
            +
                    dims = c_int32()
         
     | 
| 
      
 55 
     | 
    
         
            +
                    status = fxnc.FXNValueGetDimensions(self.__value, byref(dims))
         
     | 
| 
      
 56 
     | 
    
         
            +
                    if status != FXNStatus.OK:
         
     | 
| 
      
 57 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to get value dimensions with error: {status_to_error(status)}")
         
     | 
| 
      
 58 
     | 
    
         
            +
                    shape = zeros(dims.value, dtype=int32)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    status = fxnc.FXNValueGetShape(self.__value, shape.ctypes.data_as(POINTER(c_int32)), dims)
         
     | 
| 
      
 60 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 61 
     | 
    
         
            +
                        return shape.tolist()
         
     | 
| 
      
 62 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 63 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to get value shape with error: {status_to_error(status)}")
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                def to_object (self) -> Any:
         
     | 
| 
      
 66 
     | 
    
         
            +
                    type = self.type
         
     | 
| 
      
 67 
     | 
    
         
            +
                    if type == Dtype.null:
         
     | 
| 
      
 68 
     | 
    
         
            +
                        return None
         
     | 
| 
      
 69 
     | 
    
         
            +
                    elif type in _TENSOR_DTYPES:
         
     | 
| 
      
 70 
     | 
    
         
            +
                        ctype = as_ctypes_type(dtype(type))
         
     | 
| 
      
 71 
     | 
    
         
            +
                        tensor = as_array(cast(self.data, POINTER(ctype)), self.shape)
         
     | 
| 
      
 72 
     | 
    
         
            +
                        return tensor.item() if len(tensor.shape) == 0 else tensor.copy()
         
     | 
| 
      
 73 
     | 
    
         
            +
                    elif type == Dtype.string:
         
     | 
| 
      
 74 
     | 
    
         
            +
                        return cast(self.data, c_char_p).value.decode()
         
     | 
| 
      
 75 
     | 
    
         
            +
                    elif type in [Dtype.list, Dtype.dict]:
         
     | 
| 
      
 76 
     | 
    
         
            +
                        return loads(cast(self.data, c_char_p).value.decode())
         
     | 
| 
      
 77 
     | 
    
         
            +
                    elif type == Dtype.image:
         
     | 
| 
      
 78 
     | 
    
         
            +
                        pixel_buffer = as_array(cast(self.data, POINTER(c_uint8)), self.shape)
         
     | 
| 
      
 79 
     | 
    
         
            +
                        return Image.fromarray(pixel_buffer.squeeze()).copy()
         
     | 
| 
      
 80 
     | 
    
         
            +
                    elif type == Dtype.binary:
         
     | 
| 
      
 81 
     | 
    
         
            +
                        return BytesIO(string_at(self.data, self.shape[0]))
         
     | 
| 
      
 82 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 83 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to convert Function value to object because value has unsupported type: {type}")
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                def __enter__ (self):
         
     | 
| 
      
 86 
     | 
    
         
            +
                    return self
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                def __exit__ (self, exc_type, exc_value, traceback):
         
     | 
| 
      
 89 
     | 
    
         
            +
                    self.__release()
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                def __release (self):
         
     | 
| 
      
 92 
     | 
    
         
            +
                    if self.__value and self.__owner:
         
     | 
| 
      
 93 
     | 
    
         
            +
                        get_fxnc().FXNValueRelease(self.__value)
         
     | 
| 
      
 94 
     | 
    
         
            +
                    self.__value = None
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                @classmethod
         
     | 
| 
      
 97 
     | 
    
         
            +
                def create_array (
         
     | 
| 
      
 98 
     | 
    
         
            +
                    cls,
         
     | 
| 
      
 99 
     | 
    
         
            +
                    data: ndarray,
         
     | 
| 
      
 100 
     | 
    
         
            +
                    *,
         
     | 
| 
      
 101 
     | 
    
         
            +
                    flags: ValueFlags=ValueFlags.NONE
         
     | 
| 
      
 102 
     | 
    
         
            +
                ) -> Value:
         
     | 
| 
      
 103 
     | 
    
         
            +
                    dtype = _STR_TO_DTYPE.get(data.dtype.name)
         
     | 
| 
      
 104 
     | 
    
         
            +
                    if dtype is None:
         
     | 
| 
      
 105 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create array value because data type is not supported: {data.dtype}")
         
     | 
| 
      
 106 
     | 
    
         
            +
                    value = c_void_p()
         
     | 
| 
      
 107 
     | 
    
         
            +
                    status = get_fxnc().FXNValueCreateArray(
         
     | 
| 
      
 108 
     | 
    
         
            +
                        data.ctypes.data_as(c_void_p),
         
     | 
| 
      
 109 
     | 
    
         
            +
                        data.ctypes.shape_as(c_int32),
         
     | 
| 
      
 110 
     | 
    
         
            +
                        len(data.shape),
         
     | 
| 
      
 111 
     | 
    
         
            +
                        dtype,
         
     | 
| 
      
 112 
     | 
    
         
            +
                        flags,
         
     | 
| 
      
 113 
     | 
    
         
            +
                        byref(value)
         
     | 
| 
      
 114 
     | 
    
         
            +
                    )
         
     | 
| 
      
 115 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 116 
     | 
    
         
            +
                        return Value(value)
         
     | 
| 
      
 117 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 118 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create array value with error: {status_to_error(status)}")
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
                @classmethod
         
     | 
| 
      
 121 
     | 
    
         
            +
                def create_string (cls, data: str) -> Value:
         
     | 
| 
      
 122 
     | 
    
         
            +
                    value = c_void_p()
         
     | 
| 
      
 123 
     | 
    
         
            +
                    status = get_fxnc().FXNValueCreateString(data.encode(), byref(value))
         
     | 
| 
      
 124 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 125 
     | 
    
         
            +
                        return Value(value)
         
     | 
| 
      
 126 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 127 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create string value with error: {status_to_error(status)}")
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                @classmethod
         
     | 
| 
      
 130 
     | 
    
         
            +
                def create_list (cls, data: Iterable[Any]) -> Value:
         
     | 
| 
      
 131 
     | 
    
         
            +
                    value = c_void_p()
         
     | 
| 
      
 132 
     | 
    
         
            +
                    status = get_fxnc().FXNValueCreateList(dumps(data).encode(), byref(value))
         
     | 
| 
      
 133 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 134 
     | 
    
         
            +
                        return Value(value)
         
     | 
| 
      
 135 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 136 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create list value with error: {status_to_error(status)}")
         
     | 
| 
      
 137 
     | 
    
         
            +
                
         
     | 
| 
      
 138 
     | 
    
         
            +
                @classmethod
         
     | 
| 
      
 139 
     | 
    
         
            +
                def create_dict (cls, data: dict[str, Any]) -> Value:
         
     | 
| 
      
 140 
     | 
    
         
            +
                    value = c_void_p()
         
     | 
| 
      
 141 
     | 
    
         
            +
                    status = get_fxnc().FXNValueCreateDict(dumps(data).encode(), byref(value))
         
     | 
| 
      
 142 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 143 
     | 
    
         
            +
                        return Value(value)
         
     | 
| 
      
 144 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 145 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create dict value with error: {status_to_error(status)}")
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                @classmethod
         
     | 
| 
      
 148 
     | 
    
         
            +
                def create_image (cls, image: Image.Image) -> Value:
         
     | 
| 
      
 149 
     | 
    
         
            +
                    value = c_void_p()
         
     | 
| 
      
 150 
     | 
    
         
            +
                    pixel_buffer = array(image)
         
     | 
| 
      
 151 
     | 
    
         
            +
                    status = get_fxnc().FXNValueCreateImage(
         
     | 
| 
      
 152 
     | 
    
         
            +
                        pixel_buffer.ctypes.data_as(c_void_p),
         
     | 
| 
      
 153 
     | 
    
         
            +
                        image.width,
         
     | 
| 
      
 154 
     | 
    
         
            +
                        image.height,
         
     | 
| 
      
 155 
     | 
    
         
            +
                        pixel_buffer.shape[2],
         
     | 
| 
      
 156 
     | 
    
         
            +
                        ValueFlags.COPY_DATA,
         
     | 
| 
      
 157 
     | 
    
         
            +
                        byref(value)
         
     | 
| 
      
 158 
     | 
    
         
            +
                    )
         
     | 
| 
      
 159 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 160 
     | 
    
         
            +
                        return Value(value)
         
     | 
| 
      
 161 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 162 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create image value with error: {status_to_error(status)}")        
         
     | 
| 
      
 163 
     | 
    
         
            +
             
     | 
| 
      
 164 
     | 
    
         
            +
                @classmethod
         
     | 
| 
      
 165 
     | 
    
         
            +
                def create_binary (
         
     | 
| 
      
 166 
     | 
    
         
            +
                    cls,
         
     | 
| 
      
 167 
     | 
    
         
            +
                    data: memoryview,
         
     | 
| 
      
 168 
     | 
    
         
            +
                    *,
         
     | 
| 
      
 169 
     | 
    
         
            +
                    flags: ValueFlags=ValueFlags.NONE
         
     | 
| 
      
 170 
     | 
    
         
            +
                ) -> Value:
         
     | 
| 
      
 171 
     | 
    
         
            +
                    buffer = (c_uint8 * len(data)).from_buffer(data)
         
     | 
| 
      
 172 
     | 
    
         
            +
                    value = c_void_p()
         
     | 
| 
      
 173 
     | 
    
         
            +
                    status = get_fxnc().FXNValueCreateBinary(buffer, len(data), flags, byref(value))
         
     | 
| 
      
 174 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 175 
     | 
    
         
            +
                        return Value(value)
         
     | 
| 
      
 176 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 177 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create binary value with error: {status_to_error(status)}")
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
      
 179 
     | 
    
         
            +
                @classmethod
         
     | 
| 
      
 180 
     | 
    
         
            +
                def create_null (cls) -> Value:
         
     | 
| 
      
 181 
     | 
    
         
            +
                    value = c_void_p()
         
     | 
| 
      
 182 
     | 
    
         
            +
                    status = get_fxnc().FXNValueCreateNull(byref(value))
         
     | 
| 
      
 183 
     | 
    
         
            +
                    if status == FXNStatus.OK:
         
     | 
| 
      
 184 
     | 
    
         
            +
                        return Value(value)
         
     | 
| 
      
 185 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 186 
     | 
    
         
            +
                        raise RuntimeError(f"Failed to create null value with error: {status_to_error(status)}")
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
      
 189 
     | 
    
         
            +
            _STR_TO_DTYPE = {
         
     | 
| 
      
 190 
     | 
    
         
            +
                Dtype.null: 0,
         
     | 
| 
      
 191 
     | 
    
         
            +
                Dtype.float16: 1,
         
     | 
| 
      
 192 
     | 
    
         
            +
                Dtype.float32: 2,
         
     | 
| 
      
 193 
     | 
    
         
            +
                Dtype.float64: 3,
         
     | 
| 
      
 194 
     | 
    
         
            +
                Dtype.int8: 4,
         
     | 
| 
      
 195 
     | 
    
         
            +
                Dtype.int16: 5,
         
     | 
| 
      
 196 
     | 
    
         
            +
                Dtype.int32: 6,
         
     | 
| 
      
 197 
     | 
    
         
            +
                Dtype.int64: 7,
         
     | 
| 
      
 198 
     | 
    
         
            +
                Dtype.uint8: 8,
         
     | 
| 
      
 199 
     | 
    
         
            +
                Dtype.uint16: 9,
         
     | 
| 
      
 200 
     | 
    
         
            +
                Dtype.uint32: 10,
         
     | 
| 
      
 201 
     | 
    
         
            +
                Dtype.uint64: 11,
         
     | 
| 
      
 202 
     | 
    
         
            +
                Dtype.bool: 12,
         
     | 
| 
      
 203 
     | 
    
         
            +
                Dtype.string: 13,
         
     | 
| 
      
 204 
     | 
    
         
            +
                Dtype.list: 14,
         
     | 
| 
      
 205 
     | 
    
         
            +
                Dtype.dict: 15,
         
     | 
| 
      
 206 
     | 
    
         
            +
                Dtype.image: 16,
         
     | 
| 
      
 207 
     | 
    
         
            +
                Dtype.binary: 17,
         
     | 
| 
      
 208 
     | 
    
         
            +
            }
         
     | 
| 
      
 209 
     | 
    
         
            +
            _DTYPE_TO_STR = { value: key for key, value in _STR_TO_DTYPE.items() }
         
     | 
| 
      
 210 
     | 
    
         
            +
            _TENSOR_DTYPES = {
         
     | 
| 
      
 211 
     | 
    
         
            +
                Dtype.float16,
         
     | 
| 
      
 212 
     | 
    
         
            +
                Dtype.float32,
         
     | 
| 
      
 213 
     | 
    
         
            +
                Dtype.float64,
         
     | 
| 
      
 214 
     | 
    
         
            +
                Dtype.int8,
         
     | 
| 
      
 215 
     | 
    
         
            +
                Dtype.int16,
         
     | 
| 
      
 216 
     | 
    
         
            +
                Dtype.int32,
         
     | 
| 
      
 217 
     | 
    
         
            +
                Dtype.int64,
         
     | 
| 
      
 218 
     | 
    
         
            +
                Dtype.uint8,
         
     | 
| 
      
 219 
     | 
    
         
            +
                Dtype.uint16,
         
     | 
| 
      
 220 
     | 
    
         
            +
                Dtype.uint32,
         
     | 
| 
      
 221 
     | 
    
         
            +
                Dtype.uint64,
         
     | 
| 
      
 222 
     | 
    
         
            +
                Dtype.bool,
         
     | 
| 
      
 223 
     | 
    
         
            +
            }
         
     | 
    
        fxn/cli/__init__.py
    CHANGED
    
    | 
         @@ -1,15 +1,15 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # 
         
     | 
| 
       2 
2 
     | 
    
         
             
            #   Function
         
     | 
| 
       3 
     | 
    
         
            -
            #   Copyright ©  
     | 
| 
      
 3 
     | 
    
         
            +
            #   Copyright © 2025 NatML Inc. All Rights Reserved.
         
     | 
| 
       4 
4 
     | 
    
         
             
            #
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            from typer import Typer
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
            from .auth import app as auth_app
         
     | 
| 
       9 
     | 
    
         
            -
            from . 
     | 
| 
      
 9 
     | 
    
         
            +
            #from .compile import compile_predictor
         
     | 
| 
       10 
10 
     | 
    
         
             
            from .misc import cli_options
         
     | 
| 
       11 
     | 
    
         
            -
            from . 
     | 
| 
       12 
     | 
    
         
            -
            from .predictors import  
     | 
| 
      
 11 
     | 
    
         
            +
            from .predictions import create_prediction
         
     | 
| 
      
 12 
     | 
    
         
            +
            from .predictors import retrieve_predictor
         
     | 
| 
       13 
13 
     | 
    
         
             
            from ..version import __version__
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
            # Define CLI
         
     | 
| 
         @@ -26,16 +26,18 @@ app.callback()(cli_options) 
     | 
|
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
            # Add subcommands
         
     | 
| 
       28 
28 
     | 
    
         
             
            app.add_typer(auth_app, name="auth", help="Login, logout, and check your authentication status.")
         
     | 
| 
       29 
     | 
    
         
            -
            #app.add_typer(env_app, name="env", help="Manage predictor environment variables.")
         
     | 
| 
       30 
29 
     | 
    
         | 
| 
       31 
30 
     | 
    
         
             
            # Add top-level commands
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
            #app.command( 
     | 
| 
       38 
     | 
    
         
            -
            # 
     | 
| 
      
 31 
     | 
    
         
            +
            app.command(
         
     | 
| 
      
 32 
     | 
    
         
            +
                name="predict",
         
     | 
| 
      
 33 
     | 
    
         
            +
                help="Make a prediction.",
         
     | 
| 
      
 34 
     | 
    
         
            +
                context_settings={ "allow_extra_args": True, "ignore_unknown_options": True }
         
     | 
| 
      
 35 
     | 
    
         
            +
            )(create_prediction)
         
     | 
| 
      
 36 
     | 
    
         
            +
            # app.command(
         
     | 
| 
      
 37 
     | 
    
         
            +
            #     name="compile",
         
     | 
| 
      
 38 
     | 
    
         
            +
            #     help="Create a predictor by compiling a Python function."
         
     | 
| 
      
 39 
     | 
    
         
            +
            # )(compile_predictor)
         
     | 
| 
      
 40 
     | 
    
         
            +
            app.command(name="retrieve", help="Retrieve a predictor.")(retrieve_predictor)
         
     | 
| 
       39 
41 
     | 
    
         | 
| 
       40 
42 
     | 
    
         
             
            # Run
         
     | 
| 
       41 
43 
     | 
    
         
             
            if __name__ == "__main__":
         
     | 
    
        fxn/cli/auth.py
    CHANGED