| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 | import matplotlib.pyplot as pltfrom fontTools.ttLib import TTFontfrom matplotlib.font_manager import findSystemFontsfrom core.tools.errors import ToolProviderCredentialValidationErrorfrom core.tools.provider.builtin.chart.tools.line import LinearChartToolfrom core.tools.provider.builtin_tool_provider import BuiltinToolProviderController# use a business themeplt.style.use('seaborn-v0_8-darkgrid')plt.rcParams['axes.unicode_minus'] = Falsedef init_fonts():    fonts = findSystemFonts()    popular_unicode_fonts = [        'Arial Unicode MS', 'DejaVu Sans', 'DejaVu Sans Mono', 'DejaVu Serif', 'FreeMono', 'FreeSans', 'FreeSerif',        'Liberation Mono', 'Liberation Sans', 'Liberation Serif', 'Noto Mono', 'Noto Sans', 'Noto Serif', 'Open Sans',        'Roboto', 'Source Code Pro', 'Source Sans Pro', 'Source Serif Pro', 'Ubuntu', 'Ubuntu Mono'    ]    supported_fonts = []    for font_path in fonts:        try:            font = TTFont(font_path)            # get family name            family_name = font['name'].getName(1, 3, 1).toUnicode()            if family_name in popular_unicode_fonts:                supported_fonts.append(family_name)        except:            pass    plt.rcParams['font.family'] = 'sans-serif'    # sort by order of popular_unicode_fonts    for font in popular_unicode_fonts:        if font in supported_fonts:            plt.rcParams['font.sans-serif'] = font            break    init_fonts()class ChartProvider(BuiltinToolProviderController):    def _validate_credentials(self, credentials: dict) -> None:        try:            LinearChartTool().fork_tool_runtime(                meta={                    "credentials": credentials,                }            ).invoke(                user_id='',                tool_parameters={                    "data": "1,3,5,7,9,2,4,6,8,10",                },            )        except Exception as e:            raise ToolProviderCredentialValidationError(str(e))
 |