TypeError: Object of type PromptTemplate is not JSON serializable
Labels: name: auto:bug

### System Info

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[15], line 15
     12 qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=retriever.as_retriever())
     14 query = "halo"
---> 15 qa.run(query)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/base.py:440, in Chain.run(self, callbacks, tags, metadata, *args, **kwargs)
    438     if len(args) != 1:
    439         raise ValueError("`run` supports only one positional argument.")
--> 440     return self(args[0], callbacks=callbacks, tags=tags, metadata=metadata)[
    441         _output_key
    442     ]
    444 if kwargs and not args:
    445     return self(kwargs, callbacks=callbacks, tags=tags, metadata=metadata)[
    446         _output_key
    447     ]

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/base.py:243, in Chain.__call__(self, inputs, return_only_outputs, callbacks, tags, metadata, include_run_info)
    241 except (KeyboardInterrupt, Exception) as e:
    242     run_manager.on_chain_error(e)
--> 243     raise e
    244 run_manager.on_chain_end(outputs)
    245 final_outputs: Dict[str, Any] = self.prep_outputs(
    246     inputs, outputs, return_only_outputs
    247 )

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/base.py:237, in Chain.__call__(self, inputs, return_only_outputs, callbacks, tags, metadata, include_run_info)
    231 run_manager = callback_manager.on_chain_start(
    232     dumpd(self),
    233     inputs,
    234 )
    235 try:
    236     outputs = (
--> 237         self._call(inputs, run_manager=run_manager)
    238         if new_arg_supported
    239         else self._call(inputs)
    240     )
    241 except (KeyboardInterrupt, Exception) as e:
    242     run_manager.on_chain_error(e)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/retrieval_qa/base.py:131, in BaseRetrievalQA._call(self, inputs, run_manager)
    129 else:
    130     docs = self._get_docs(question)  # type: ignore[call-arg]
--> 131 answer = self.combine_documents_chain.run(
    132     input_documents=docs, question=question, callbacks=_run_manager.get_child()
    133 )
    135 if self.return_source_documents:
    136     return {self.output_key: answer, "source_documents": docs}

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/base.py:445, in Chain.run(self, callbacks, tags, metadata, *args, **kwargs)
    440     return self(args[0], callbacks=callbacks, tags=tags, metadata=metadata)[
    441         _output_key
    442     ]
    444 if kwargs and not args:
--> 445     return self(kwargs, callbacks=callbacks, tags=tags, metadata=metadata)[
    446         _output_key
    447     ]
    449 if not kwargs and not args:
    450     raise ValueError(
    451         "`run` supported with either positional arguments or keyword arguments,"
    452         " but none were provided."
    453     )

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/base.py:243, in Chain.__call__(self, inputs, return_only_outputs, callbacks, tags, metadata, include_run_info)
    241 except (KeyboardInterrupt, Exception) as e:
    242     run_manager.on_chain_error(e)
--> 243     raise e
    244 run_manager.on_chain_end(outputs)
    245 final_outputs: Dict[str, Any] = self.prep_outputs(
    246     inputs, outputs, return_only_outputs
    247 )

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/base.py:237, in Chain.__call__(self, inputs, return_only_outputs, callbacks, tags, metadata, include_run_info)
    231 run_manager = callback_manager.on_chain_start(
    232     dumpd(self),
    233     inputs,
    234 )
    235 try:
    236     outputs = (
--> 237         self._call(inputs, run_manager=run_manager)
    238         if new_arg_supported
    239         else self._call(inputs)
    240     )
    241 except (KeyboardInterrupt, Exception) as e:
    242     run_manager.on_chain_error(e)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/combine_documents/base.py:106, in BaseCombineDocumentsChain._call(self, inputs, run_manager)
    104 # Other keys are assumed to be needed for LLM prediction
    105 other_keys = {k: v for k, v in inputs.items() if k != self.input_key}
--> 106 output, extra_return_dict = self.combine_docs(
    107     docs, callbacks=_run_manager.get_child(), **other_keys
    108 )
    109 extra_return_dict[self.output_key] = output
    110 return extra_return_dict

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/combine_documents/stuff.py:165, in StuffDocumentsChain.combine_docs(self, docs, callbacks, **kwargs)
    163 inputs = self._get_inputs(docs, **kwargs)
    164 # Call predict on the LLM.
--> 165 return self.llm_chain.predict(callbacks=callbacks, **inputs), {}

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/llm.py:252, in LLMChain.predict(self, callbacks, **kwargs)
    237 def predict(self, callbacks: Callbacks = None, **kwargs: Any) -> str:
    238     """Format prompt with kwargs and pass to LLM.
    239 
    240     Args:
   (...)
    250             completion = llm.predict(adjective="funny")
    251     """
--> 252     return self(kwargs, callbacks=callbacks)[self.output_key]

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/base.py:243, in Chain.__call__(self, inputs, return_only_outputs, callbacks, tags, metadata, include_run_info)
    241 except (KeyboardInterrupt, Exception) as e:
    242     run_manager.on_chain_error(e)
--> 243     raise e
    244 run_manager.on_chain_end(outputs)
    245 final_outputs: Dict[str, Any] = self.prep_outputs(
    246     inputs, outputs, return_only_outputs
    247 )

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/base.py:237, in Chain.__call__(self, inputs, return_only_outputs, callbacks, tags, metadata, include_run_info)
    231 run_manager = callback_manager.on_chain_start(
    232     dumpd(self),
    233     inputs,
    234 )
    235 try:
    236     outputs = (
--> 237         self._call(inputs, run_manager=run_manager)
    238         if new_arg_supported
    239         else self._call(inputs)
    240     )
    241 except (KeyboardInterrupt, Exception) as e:
    242     run_manager.on_chain_error(e)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/llm.py:92, in LLMChain._call(self, inputs, run_manager)
     87 def _call(
     88     self,
     89     inputs: Dict[str, Any],
     90     run_manager: Optional[CallbackManagerForChainRun] = None,
     91 ) -> Dict[str, str]:
---> 92     response = self.generate([inputs], run_manager=run_manager)
     93     return self.create_outputs(response)[0]

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chains/llm.py:102, in LLMChain.generate(self, input_list, run_manager)
    100 """Generate LLM result from inputs."""
    101 prompts, stop = self.prep_prompts(input_list, run_manager=run_manager)
--> 102 return self.llm.generate_prompt(
    103     prompts,
    104     stop,
    105     callbacks=run_manager.get_child() if run_manager else None,
    106     **self.llm_kwargs,
    107 )

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chat_models/base.py:230, in BaseChatModel.generate_prompt(self, prompts, stop, callbacks, **kwargs)
    222 def generate_prompt(
    223     self,
    224     prompts: List[PromptValue],
   (...)
    227     **kwargs: Any,
    228 ) -> LLMResult:
    229     prompt_messages = [p.to_messages() for p in prompts]
--> 230     return self.generate(prompt_messages, stop=stop, callbacks=callbacks, **kwargs)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chat_models/base.py:125, in BaseChatModel.generate(self, messages, stop, callbacks, tags, metadata, **kwargs)
    123         if run_managers:
    124             run_managers[i].on_llm_error(e)
--> 125         raise e
    126 flattened_outputs = [
    127     LLMResult(generations=[res.generations], llm_output=res.llm_output)
    128     for res in results
    129 ]
    130 llm_output = self._combine_llm_outputs([res.llm_output for res in results])

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chat_models/base.py:115, in BaseChatModel.generate(self, messages, stop, callbacks, tags, metadata, **kwargs)
    112 for i, m in enumerate(messages):
    113     try:
    114         results.append(
--> 115             self._generate_with_cache(
    116                 m,
    117                 stop=stop,
    118                 run_manager=run_managers[i] if run_managers else None,
    119                 **kwargs,
    120             )
    121         )
    122     except (KeyboardInterrupt, Exception) as e:
    123         if run_managers:

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chat_models/base.py:262, in BaseChatModel._generate_with_cache(self, messages, stop, run_manager, **kwargs)
    258     raise ValueError(
    259         "Asked to cache, but no cache found at `langchain.cache`."
    260     )
    261 if new_arg_supported:
--> 262     return self._generate(
    263         messages, stop=stop, run_manager=run_manager, **kwargs
    264     )
    265 else:
    266     return self._generate(messages, stop=stop, **kwargs)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chat_models/openai.py:371, in ChatOpenAI._generate(self, messages, stop, run_manager, **kwargs)
    363     message = _convert_dict_to_message(
    364         {
    365             "content": inner_completion,
   (...)
    368         }
    369     )
    370     return ChatResult(generations=[ChatGeneration(message=message)])
--> 371 response = self.completion_with_retry(messages=message_dicts, **params)
    372 return self._create_chat_result(response)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chat_models/openai.py:319, in ChatOpenAI.completion_with_retry(self, **kwargs)
    315 @retry_decorator
    316 def _completion_with_retry(**kwargs: Any) -> Any:
    317     return self.client.create(**kwargs)
--> 319 return _completion_with_retry(**kwargs)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/tenacity/__init__.py:289, in BaseRetrying.wraps.<locals>.wrapped_f(*args, **kw)
    287 @functools.wraps(f)
    288 def wrapped_f(*args: t.Any, **kw: t.Any) -> t.Any:
--> 289     return self(f, *args, **kw)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/tenacity/__init__.py:379, in Retrying.__call__(self, fn, *args, **kwargs)
    377 retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs)
    378 while True:
--> 379     do = self.iter(retry_state=retry_state)
    380     if isinstance(do, DoAttempt):
    381         try:

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/tenacity/__init__.py:314, in BaseRetrying.iter(self, retry_state)
    312 is_explicit_retry = fut.failed and isinstance(fut.exception(), TryAgain)
    313 if not (is_explicit_retry or self.retry(retry_state)):
--> 314     return fut.result()
    316 if self.after is not None:
    317     self.after(retry_state)

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/concurrent/futures/_base.py:438, in Future.result(self, timeout)
    436     raise CancelledError()
    437 elif self._state == FINISHED:
--> 438     return self.__get_result()
    440 self._condition.wait(timeout)
    442 if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/concurrent/futures/_base.py:390, in Future.__get_result(self)
    388 if self._exception:
    389     try:
--> 390         raise self._exception
    391     finally:
    392         # Break a reference cycle with the exception in self._exception
    393         self = None

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/tenacity/__init__.py:382, in Retrying.__call__(self, fn, *args, **kwargs)
    380 if isinstance(do, DoAttempt):
    381     try:
--> 382         result = fn(*args, **kwargs)
    383     except BaseException:  # noqa: B902
    384         retry_state.set_exception(sys.exc_info())  # type: ignore[arg-type]

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/langchain/chat_models/openai.py:317, in ChatOpenAI.completion_with_retry.<locals>._completion_with_retry(**kwargs)
    315 @retry_decorator
    316 def _completion_with_retry(**kwargs: Any) -> Any:
--> 317     return self.client.create(**kwargs)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/openai/api_resources/chat_completion.py:25, in ChatCompletion.create(cls, *args, **kwargs)
     23 while True:
     24     try:
---> 25         return super().create(*args, **kwargs)
     26     except TryAgain as e:
     27         if timeout is not None and time.time() > start + timeout:

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/openai/api_resources/abstract/engine_api_resource.py:153, in EngineAPIResource.create(cls, api_key, api_base, api_type, request_id, api_version, organization, **params)
    127 @classmethod
    128 def create(
    129     cls,
   (...)
    136     **params,
    137 ):
    138     (
    139         deployment_id,
    140         engine,
   (...)
    150         api_key, api_base, api_type, api_version, organization, **params
    151     )
--> 153     response, _, api_key = requestor.request(
    154         "post",
    155         url,
    156         params=params,
    157         headers=headers,
    158         stream=stream,
    159         request_id=request_id,
    160         request_timeout=request_timeout,
    161     )
    163     if stream:
    164         # must be an iterator
    165         assert not isinstance(response, OpenAIResponse)

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/openai/api_requestor.py:288, in APIRequestor.request(self, method, url, params, headers, files, stream, request_id, request_timeout)
    277 def request(
    278     self,
    279     method,
   (...)
    286     request_timeout: Optional[Union[float, Tuple[float, float]]] = None,
    287 ) -> Tuple[Union[OpenAIResponse, Iterator[OpenAIResponse]], bool, str]:
--> 288     result = self.request_raw(
    289         method.lower(),
    290         url,
    291         params=params,
    292         supplied_headers=headers,
    293         files=files,
    294         stream=stream,
    295         request_id=request_id,
    296         request_timeout=request_timeout,
    297     )
    298     resp, got_stream = self._interpret_response(result, stream)
    299     return resp, got_stream, self.api_key

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/openai/api_requestor.py:581, in APIRequestor.request_raw(self, method, url, params, supplied_headers, files, stream, request_id, request_timeout)
    569 def request_raw(
    570     self,
    571     method,
   (...)
    579     request_timeout: Optional[Union[float, Tuple[float, float]]] = None,
    580 ) -> requests.Response:
--> 581     abs_url, headers, data = self._prepare_request_raw(
    582         url, supplied_headers, method, params, files, request_id
    583     )
    585     if not hasattr(_thread_context, "session"):
    586         _thread_context.session = _make_session()

File /Volumes/Samsung_T7/Augmented-FinQA/venv/lib/python3.10/site-packages/openai/api_requestor.py:553, in APIRequestor._prepare_request_raw(self, url, supplied_headers, method, params, files, request_id)
    551         data = params
    552     if params and not files:
--> 553         data = json.dumps(params).encode()
    554         headers["Content-Type"] = "application/json"
    555 else:

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/__init__.py:231, in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)
    226 # cached encoder
    227 if (not skipkeys and ensure_ascii and
    228     check_circular and allow_nan and
    229     cls is None and indent is None and separators is None and
    230     default is None and not sort_keys and not kw):
--> 231     return _default_encoder.encode(obj)
    232 if cls is None:
    233     cls = JSONEncoder

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/encoder.py:199, in JSONEncoder.encode(self, o)
    195         return encode_basestring(o)
    196 # This doesn't pass the iterator directly to ''.join() because the
    197 # exceptions aren't as detailed.  The list call should be roughly
    198 # equivalent to the PySequence_Fast that ''.join() would do.
--> 199 chunks = self.iterencode(o, _one_shot=True)
    200 if not isinstance(chunks, (list, tuple)):
    201     chunks = list(chunks)

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/encoder.py:257, in JSONEncoder.iterencode(self, o, _one_shot)
    252 else:
    253     _iterencode = _make_iterencode(
    254         markers, self.default, _encoder, self.indent, floatstr,
    255         self.key_separator, self.item_separator, self.sort_keys,
    256         self.skipkeys, _one_shot)
--> 257 return _iterencode(o, 0)

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/encoder.py:179, in JSONEncoder.default(self, o)
    160 def default(self, o):
    161     """Implement this method in a subclass such that it returns
    162     a serializable object for ``o``, or calls the base implementation
    163     (to raise a ``TypeError``).
   (...)
    177 
    178     """
--> 179     raise TypeError(f'Object of type {o.__class__.__name__} '
    180                     f'is not JSON serializable')

TypeError: Object of type PromptTemplate is not JSON serializable

### Who can help?

_No response_

### Information

- [ ] The official example notebooks/scripts
- [X] My own modified scripts

### Related Components

- [ ] LLMs/Chat Models
- [ ] Embedding Models
- [X] Prompts / Prompt Templates / Prompt Selectors
- [ ] Output Parsers
- [ ] Document Loaders
- [ ] Vector Stores / Retrievers
- [ ] Memory
- [ ] Agents / Agent Executors
- [ ] Tools / Toolkits
- [ ] Chains
- [ ] Callbacks/Tracing
- [ ] Async

### Reproduction

from langchain.prompts import PromptTemplate
prompt_template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.

Question: {question}
Answer in Italian:"""
PROMPT = PromptTemplate(
    template=prompt_template, input_variables=["question"]
)
chain_type_kwargs = {"prompt": PROMPT}
llm = ChatOpenAI(model_name = "gpt-3.5-turbo",temperature=0,model_kwargs=chain_type_kwargs)
qa_chain = load_qa_chain(llm=llm, chain_type="stuff",verbose=True)
qa = RetrievalQA(combine_documents_chain=qa_chain, retriever=retriever.as_retriever())
query = "halo"
qa.run(query)

### Expected behavior

Hope to use the PromptTemplate in QA