#pragma once #include "engine/framework/runtime/session.h" #include "../streaming/streaming.h" #include #include #include #include #include #include #include #include namespace minitts::app { struct RecipeModelRole { std::string name; engine::runtime::TaskSpec task; }; using RecipeEventSink = std::function; class IRecipeModelExecutor { public: virtual ~IRecipeModelExecutor() = default; virtual engine::runtime::TaskResult run( std::string_view role, const engine::runtime::TaskSpec & task, const engine::runtime::TaskRequest & request) = 0; virtual engine::runtime::TaskResult stream( std::string_view, const engine::runtime::TaskSpec &, const engine::runtime::TaskRequest &, const RecipeEventSink &, const AudioChunkStream * = nullptr) { throw std::runtime_error("this recipe executor does not support streaming"); } }; class IRecipe { public: virtual ~IRecipe() = default; virtual std::string id() const = 0; virtual std::string description() const = 0; virtual std::vector roles() const = 0; virtual engine::runtime::TaskResult run( IRecipeModelExecutor & executor, const engine::runtime::TaskRequest & request, const RecipeEventSink & event_sink = {}) const = 0; }; using RecipeFactory = std::function()>; class RecipePluginRegistration { public: explicit RecipePluginRegistration(RecipeFactory factory); }; std::unordered_map options_for_recipe_role( const std::unordered_map & options, std::string_view role, std::initializer_list recipe_roles, bool include_shared); class RecipeRegistry { public: void add(std::unique_ptr recipe); const IRecipe & require(std::string_view id) const; std::vector ids() const; private: std::unordered_map> recipes_; }; RecipeRegistry make_recipe_registry(); } // namespace minitts::app