@@ -611,3 +611,53 @@ vaip_core::OrtApiForVaip* create_org_api_hook() {
611611 return &the_global_api;
612612 }
613613}
614+
615+ struct ExternalEpLibaray {
616+ ExternalEpLibaray (const std::string& libray_name) : libray_name_{libray_name} {
617+ Ensure ();
618+ }
619+ onnxruntime::Provider* (*get_provider_api)();
620+ void (*create_ep_factories)(void *, const OrtApiBase*, void *, OrtEpFactory**, size_t , size_t *);
621+ void (*set_session_option)(OrtSessionOptions*);
622+
623+ void Ensure () {
624+ if (handle_)
625+ return ;
626+ auto & env = Provider_GetHost ()->Env__Default ();
627+ auto library_filename = PathString (LIBRARY_PREFIX) + PathString (libray_name_.begin (), libray_name_.end ()) + LIBRARY_EXTENSION;
628+ auto full_path = env.GetRuntimePath () + library_filename;
629+ ORT_THROW_IF_ERROR (env.LoadDynamicLibrary (full_path, true , &handle_));
630+ ORT_THROW_IF_ERROR (env.GetSymbolFromLibrary (handle_, " GetProvider" , (void **)&get_provider_api));
631+ }
632+
633+ void Clear () {
634+ if (handle_) {
635+ auto & env = Provider_GetHost ()->Env__Default ();
636+ auto status = env.UnloadDynamicLibrary (handle_);
637+ vai_assert (status.IsOK (), status.ErrorMessage ());
638+ handle_ = nullptr ;
639+ }
640+ }
641+
642+ private:
643+ std::string libray_name_;
644+ void * handle_{};
645+ };
646+ static std::unordered_map<std::string, std::unique_ptr<ExternalEpLibaray>> g_external_ep_libaries;
647+
648+ std::unique_ptr<onnxruntime::IExecutionProvider>
649+ CreateExecutionProviderFromAnotherEp (const std::string& lib, const OrtSessionOptions& session_options,
650+ std::unordered_map<std::string, std::string>& provider_options) {
651+ auto it = g_external_ep_libaries.find (lib);
652+ if (it == g_external_ep_libaries.end ()) {
653+ it = g_external_ep_libaries.emplace (lib, std::make_unique<ExternalEpLibaray>(lib)).first ;
654+ }
655+ auto ep_lib = it->second .get ();
656+ auto get_provider_func = ep_lib->get_provider_api ;
657+ auto provider = get_provider_func ();
658+ std::unique_ptr<onnxruntime::IExecutionProvider> ret;
659+ provider->Initialize ();
660+ std::ignore = provider->CreateIExecutionProvider (nullptr , nullptr , 0 , const_cast <onnxruntime::ProviderOptions&>(provider_options), session_options, *((OrtLogger*)nullptr ), ret);
661+
662+ return ret;
663+ }
0 commit comments