| 725 | |
| 726 | |
| 727 | def function_setup( |
| 728 | original_function: str, rules_obj, start_time, *args, **kwargs |
| 729 | ): # just run once to check if user wants to send their data anywhere - PostHog/Sentry/Slack/etc. |
| 730 | ### NOTICES ### |
| 731 | if litellm.set_verbose is True: |
| 732 | verbose_logger.warning( |
| 733 | "`litellm.set_verbose` is deprecated. Please set `os.environ['LITELLM_LOG'] = 'DEBUG'` for debug logs." |
| 734 | ) |
| 735 | try: |
| 736 | global callback_list, add_breadcrumb, user_logger_fn, Logging |
| 737 | |
| 738 | ## CUSTOM LLM SETUP ## |
| 739 | custom_llm_setup() |
| 740 | |
| 741 | ## GET APPLIED GUARDRAILS |
| 742 | applied_guardrails = get_applied_guardrails(kwargs) |
| 743 | |
| 744 | ## LOGGING SETUP |
| 745 | function_id: Optional[str] = kwargs["id"] if "id" in kwargs else None |
| 746 | |
| 747 | ## LAZY LOAD COROUTINE CHECKER ## |
| 748 | get_coroutine_checker_fn = getattr(sys.modules[__name__], "get_coroutine_checker") |
| 749 | coroutine_checker = get_coroutine_checker_fn() |
| 750 | |
| 751 | ## DYNAMIC CALLBACKS ## |
| 752 | dynamic_callbacks: Optional[List[Union[str, Callable, "CustomLogger"]]] = kwargs.pop("callbacks", None) |
| 753 | all_callbacks = get_dynamic_callbacks(dynamic_callbacks=dynamic_callbacks) |
| 754 | |
| 755 | if len(all_callbacks) > 0: |
| 756 | for callback in all_callbacks: |
| 757 | # check if callback is a string - e.g. "lago", "openmeter" |
| 758 | if isinstance(callback, str): |
| 759 | callback = litellm.litellm_core_utils.litellm_logging._init_custom_logger_compatible_class( # type: ignore |
| 760 | callback, |
| 761 | internal_usage_cache=None, |
| 762 | llm_router=None, # type: ignore |
| 763 | ) |
| 764 | if callback is None or any( |
| 765 | isinstance(cb, type(callback)) for cb in litellm._async_success_callback |
| 766 | ): # don't double add a callback |
| 767 | continue |
| 768 | if callback not in litellm.input_callback: |
| 769 | litellm.input_callback.append(callback) # type: ignore |
| 770 | if callback not in litellm.success_callback: |
| 771 | litellm.logging_callback_manager.add_litellm_success_callback(callback) # type: ignore |
| 772 | if callback not in litellm.failure_callback: |
| 773 | litellm.logging_callback_manager.add_litellm_failure_callback(callback) # type: ignore |
| 774 | if callback not in litellm._async_success_callback: |
| 775 | litellm.logging_callback_manager.add_litellm_async_success_callback(callback) # type: ignore |
| 776 | if callback not in litellm._async_failure_callback: |
| 777 | litellm.logging_callback_manager.add_litellm_async_failure_callback(callback) # type: ignore |
| 778 | print_verbose(f"Initialized litellm callbacks, Async Success Callbacks: {litellm._async_success_callback}") |
| 779 | |
| 780 | if ( |
| 781 | len(litellm.input_callback) > 0 or len(litellm.success_callback) > 0 or len(litellm.failure_callback) > 0 |
| 782 | ) and len( |
| 783 | callback_list # type: ignore |
| 784 | ) == 0: # type: ignore |