1313# See the License for the specific language governing permissions and
1414# limitations under the License.
1515
16+ import asyncio
1617from typing import Any , List , Optional
1718
1819from langchain .callbacks .manager import (
1920 AsyncCallbackManagerForLLMRun ,
2021 CallbackManagerForLLMRun ,
2122)
2223from langchain .schema .output import GenerationChunk
23- from langchain_community .llms import HuggingFacePipeline
24+
25+ # Import HuggingFacePipeline with fallbacks for different LangChain versions
26+ HuggingFacePipeline = None # type: ignore[assignment]
27+
28+ try :
29+ from langchain_community .llms import (
30+ HuggingFacePipeline , # type: ignore[attr-defined,no-redef]
31+ )
32+ except ImportError :
33+ # Fallback for older versions of langchain
34+ try :
35+ from langchain .llms import (
36+ HuggingFacePipeline , # type: ignore[attr-defined,no-redef]
37+ )
38+ except ImportError :
39+ # Create a dummy class if HuggingFacePipeline is not available
40+ class HuggingFacePipeline : # type: ignore[misc,no-redef]
41+ def __init__ (self , * args , ** kwargs ):
42+ raise ImportError ("HuggingFacePipeline is not available" )
2443
2544
2645class HuggingFacePipelineCompatible (HuggingFacePipeline ):
@@ -47,12 +66,13 @@ def _call(
4766 )
4867
4968 # Streaming for NeMo Guardrails is not supported in sync calls.
50- if self .model_kwargs and self .model_kwargs .get ("streaming" ):
51- raise Exception (
69+ model_kwargs = getattr (self , "model_kwargs" , {})
70+ if model_kwargs and model_kwargs .get ("streaming" ):
71+ raise NotImplementedError (
5272 "Streaming mode not supported for HuggingFacePipeline in NeMo Guardrails!"
5373 )
5474
55- llm_result = self . _generate (
75+ llm_result = getattr ( self , " _generate" ) (
5676 [prompt ],
5777 stop = stop ,
5878 run_manager = run_manager ,
@@ -78,11 +98,12 @@ async def _acall(
7898 )
7999
80100 # Handle streaming, if the flag is set
81- if self .model_kwargs and self .model_kwargs .get ("streaming" ):
101+ model_kwargs = getattr (self , "model_kwargs" , {})
102+ if model_kwargs and model_kwargs .get ("streaming" ):
82103 # Retrieve the streamer object, needs to be set in model_kwargs
83- streamer = self . model_kwargs .get ("streamer" )
104+ streamer = model_kwargs .get ("streamer" )
84105 if not streamer :
85- raise Exception (
106+ raise ValueError (
86107 "Cannot stream, please add HuggingFace streamer object to model_kwargs!"
87108 )
88109
@@ -99,7 +120,7 @@ async def _acall(
99120 run_manager = run_manager ,
100121 ** kwargs ,
101122 )
102- loop .create_task (self . _agenerate (** generation_kwargs ))
123+ loop .create_task (getattr ( self , " _agenerate" ) (** generation_kwargs ))
103124
104125 # And start waiting for the chunks to come in.
105126 completion = ""
@@ -111,7 +132,7 @@ async def _acall(
111132
112133 return completion
113134
114- llm_result = await self . _agenerate (
135+ llm_result = await getattr ( self , " _agenerate" ) (
115136 [prompt ],
116137 stop = stop ,
117138 run_manager = run_manager ,
0 commit comments