#pragma once #include #include #include #include #include #include #include #include #include namespace kimodo { inline constexpr unsigned embedding_width = 4096; struct motion_data { unsigned frames = 0; unsigned joints = 0; std::vector local_rotations_xyzw; std::vector root_positions; }; struct prompt_segment { std::string prompt; unsigned frames = 0; }; class KIMODO_API model { public: static std::expected, std::string> load( std::string_view motion_gguf, std::string_view text_bundle = {}); std::expected generate_embedding( const std::array &embedding, unsigned frames, unsigned steps, std::uint64_t seed, float text_cfg, float constraint_cfg) const; std::expected generate_text( std::string_view utf8_prompt, unsigned frames, unsigned steps, std::uint64_t seed, float text_cfg, float constraint_cfg) const; std::expected generate_text_sequence( std::span segments, unsigned transition_frames, unsigned steps, std::uint64_t seed, float text_cfg, float constraint_cfg) const; ~model(); model(const model &) = delete; model &operator=(const model &) = delete; private: struct impl; explicit model(std::unique_ptr impl); std::unique_ptr impl_; }; } // namespace kimodo