Source code for orkes.graph.utils
import inspect
from typing import Callable
import random
from functools import wraps
import time
from orkes.shared.context import edge_trace_var
from orkes.graph.schema import FunctionTraceSchema
[docs]
def orkes_tracable(func):
"""
A decorator that traces the input, output, and execution time of a function
and records it in the current edge's trace.
This decorator is intended to be used on functions that are part of an OrkesGraph.
When a function decorated with `orkes_tracable` is executed during a traced
graph run, its inputs, output, and execution time will be captured and added
to the `function_traces` of the current edge trace.
If the function is executed outside of a traced graph run, it will behave
as if it were not decorated.
"""
@wraps(func)
def wrapper(*args, **kwargs):
edge_trace = edge_trace_var.get()
if not edge_trace:
return func(*args, **kwargs)
start_time = time.time()
result = func(*args, **kwargs)
elapsed = time.time() - start_time
# Attempt to create the trace object once
try:
function_trace = FunctionTraceSchema(
function_name=func.__name__,
input_args=args,
input_kwargs=kwargs,
return_value=result, # Try original result
elapsed=elapsed
)
except Exception:
# Fallback if result isn't serializable
function_trace = FunctionTraceSchema(
function_name=func.__name__,
input_args=args,
input_kwargs=kwargs,
return_value=str(result),
elapsed=elapsed
)
if edge_trace.function_traces is None:
edge_trace.function_traces = []
edge_trace.function_traces.append(function_trace)
return result
return wrapper
[docs]
def function_assertion(func: Callable, expected_type: type) -> bool:
"""
Asserts that a function has at least one parameter with the expected type annotation.
Args:
func (Callable): The function to inspect.
expected_type (type): The expected type annotation.
Returns:
bool: True if a parameter with the expected type is found, False otherwise.
"""
sig = inspect.signature(func)
for param in sig.parameters.values():
if param.annotation is not inspect._empty:
if param.annotation == expected_type:
return True
return False
[docs]
def is_typeddict_class(obj) -> bool:
"""
Checks if an object is a TypedDict class.
Args:
obj: The object to check.
Returns:
bool: True if the object is a TypedDict class, False otherwise.
"""
return isinstance(obj, type) and issubclass(obj, dict) and hasattr(obj, '__annotations__') and getattr(obj, '__total__', None) is not None
[docs]
def check_dict_values_type(d: dict, cls: type) -> bool:
"""
Checks if all values in a dictionary are of a certain type.
Args:
d (dict): The dictionary to check.
cls (type): The expected type of the values.
Returns:
bool: True if all values are of the specified type, False otherwise.
"""
return all(isinstance(v, cls) for v in d.values())
[docs]
def randomize_color_hex() -> str:
"""
Generates a random hex color code.
Returns:
str: A random hex color code in the format "#RRGGBB".
"""
return "#{:06x}".format(random.randint(0, 0xFFFFFF))