Skip to main content

Snapshot of the error

File "/opt/homebrew/Cellar/python@3.11/3.11.7_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/client.py", line 1271, in putheader
    if _is_illegal_header_value(values[i]):

The above error points to the putheader definition in client.py file located 

python@3.11/3.11.7_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/

The putheader definition in the client.py file:

1250     def putheader(self, header, *values):
1251         """Send a request header line to the server.
1252
1253         For example: h.putheader('Accept', 'text/html')
1254         """
1255         if self.__state != _CS_REQ_STARTED:
1256             raise CannotSendHeader()
1257
1258         if hasattr(header, 'encode'):
1259             header = header.encode('ascii')
1260
1261         if not _is_legal_header_name(header):
1262             raise ValueError('Invalid header name %r' % (header,))
1263
1264         values = list(values)
1265         for i, one_value in enumerate(values):
1266             if hasattr(one_value, 'encode'):
1267                 values[i] = one_value.encode('latin-1')
1268             elif isinstance(one_value, int):
1269                 values[i] = str(one_value).encode('ascii')
1270
1271             if _is_illegal_header_value(values[i]):
1272                 raise ValueError('Invalid header value %r' % (values[i],))
1273
1274         value = b'\r\n\t'.join(values)
1275         header = header + b': ' + value
1276         self._output(header)

 

This error occurred whether run locally and noted in the errors on this page or on the server (in this case Ubuntu).

 

Working through the issue

Environment file (.env)

I read many suggestions that the error was a result of the variables not being set in the environment file (.env).  Given I was able to upsert the embeddings, this didn't make sense.  I cross checked by creating an .env file and added the 

PINECONE_API_KEY=/... YOUR KEY .../
PINECONE_API_ENV=/... YOUR ENV .../

As thought, no impact on the error.

 

Pinecone API key has a response

Reading the following post - https://stackoverflow.com/questions/77463987/tryin-to-connect-to-pinecone-but-the-code-only-work-in-jupyter-notebook-not-as, I thought about the os.getenv("PINECONE_API_KEY").  I knew this was correct and outputting.

 

Initialised?

Continuing from the previous steps, a realisation prompted a validation check to ensure Pinecone had been properly initialised. Despite expectations, testing revealed an oversight.

To rectify this, I connected the initialisation process in the relevant script. Specifically, within the search_from_existing_index() function, I incorporated pinecone_processor.initialise_pinecone() to address the initialisation discrepancy.

# Get Pinecone instance from an existing index.
def search_from_existing_index():
	# Initialise Pinecone
	pinecone_processor.initialise_pinecone()

	embeddings = openai_manager.embeddings

	# already have an index
	# This method is used when you already have a Pinecone index and want to instantiate a Pinecone client object to interact with that existing index.
	search_index = Pinecone.from_existing_index(index_name=common_variables.pinecone_index_name, embedding=embeddings)

	return search_index


# Run the search in the document(s0.)
def search_pinecone(search_index, prompt):

	llm = ChatOpenAI(temperature=common_variables.temperature, openai_api_key=OPENAI_API_KEY, model_name=common_variables.model)
	chain = load_qa_chain(llm, chain_type=common_variables.chain_type)

	docs = search_index.similarity_search(prompt, include_metadata=True)

	response = chain.run(input_documents=docs, question=prompt)

	return response


# Document query
# Current query question is - "What are examples of good data science teams?"
def query_pinecone_documents(prompt):
	# Use the global keyword to indicate that you're modifying the new documents
	# global common_variables.new_documents

	search_index = search_from_existing_index()

	# llm = OpenAI(temperature=0, openai_api_key=llm_key)
	# chain = load_qa_chain(llm, chain_type="stuff")
	# prompt the document register.
	response = search_pinecone(search_index, prompt)
	# output = chain.run(input_documents=docs, question=prompt)

	return response

 

In case you need further details, the initialise definition is:

def initialise_pinecone():
  pinecone.init(
    api_key=PINECONE_API_KEY,
    environment=PINECONE_API_ENV
  )

 

 

Appendix

def from_existing_index

I delved into the definition and requirements of from_existing_index to gain a better understanding of the functionality. This exploration was part of the process of comprehending the underlying issue.

@classmethod
def from_existing_index(
        cls,
        index_name: str,
        embedding: Embeddings,
        text_key: str = "text",
        namespace: Optional[str] = None,
    ) -> Pinecone:
        """Load pinecone vectorstore from index name."""
        try:
            import pinecone
        except ImportError:
            raise ValueError(
                "Could not import pinecone python package. "
                "Please install it with `pip install pinecone-client`."
            )

        return cls(
            pinecone.Index(index_name), embedding.embed_query, text_key, namespace
        )

 

 

The full error

Traceback (most recent call last):
  File "/Users/{user}/Sites/AI%20Search/main.py", line 73, in <module>
    outcome = process_request(file)
              ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/{user}/Sites/AI%20Search/main.py", line 42, in process_request
    outcome = query_pinecone.query_pinecone_documents(request)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/{user}/Sites/AI%20Search/processes/query_pinecone.py", line 152, in query_pinecone_documents
    search_index = search_from_existing_index()
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/{user}/Sites/AI%20Search/processes/query_pinecone.py", line 121, in search_from_existing_index
    search_index = Pinecone.from_existing_index(index_name=index, embedding=embeddings)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/langchain/vectorstores/pinecone.py", line 442, in from_existing_index
    pinecone_index = cls.get_pinecone_index(index_name, pool_threads)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/langchain/vectorstores/pinecone.py", line 359, in get_pinecone_index
    indexes = pinecone.list_indexes()  # checks if provided index exists
              ^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/pinecone/manage.py", line 185, in list_indexes
    response = api_instance.list_indexes()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/pinecone/core/client/api_client.py", line 776, in __call__
    return self.callable(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/pinecone/core/client/api/index_operations_api.py", line 1130, in __list_indexes
    return self.call_with_http_info(**kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/pinecone/core/client/api_client.py", line 838, in call_with_http_info
    return self.api_client.call_api(
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/pinecone/core/client/api_client.py", line 413, in call_api
    return self.__call_api(resource_path, method,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/pinecone/core/client/api_client.py", line 200, in __call_api
    response_data = self.request(
                    ^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/pinecone/core/client/api_client.py", line 439, in request
    return self.rest_client.GET(url,
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/pinecone/core/client/rest.py", line 236, in GET
    return self.request("GET", url,
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/pinecone/core/client/rest.py", line 202, in request
    r = self.pool_manager.request(method, url,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/_request_methods.py", line 110, in request
    return self.request_encode_url(
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/_request_methods.py", line 143, in request_encode_url
    return self.urlopen(method, url, **extra_kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/poolmanager.py", line 444, in urlopen
    response = conn.urlopen(method, u.request_uri, **kw)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py", line 790, in urlopen
    response = self._make_request(
               ^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py", line 496, in _make_request
    conn.request(
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/connection.py", line 394, in request
    self.putheader(header, value)
  File "/opt/homebrew/lib/python3.11/site-packages/urllib3/connection.py", line 308, in putheader
    super().putheader(header, *values)
  File "/opt/homebrew/Cellar/python@3.11/3.11.7_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/client.py", line 1271, in putheader
    if _is_illegal_header_value(values[i]):

 

Related articles

Andrew Fletcher29 Feb 2024
Python - OSError: [Errno 24] Too many open files
The "Too many open files" error in Python typically occurs when your program has opened more file descriptors than the operating system allows. This error is often seen in situations where files are not being properly closed after use, leading to the exhaustion of available file...
Andrew Fletcher17 Feb 2024
How to update installed Python packages
You can use the pip list --outdated command to view a list of installed Python packages that have newer versions available. This command will show you which packages are outdated and can be updated to the latest versions.Here's how you can use itpip list --outdatedThis command will display a list of...