Source code for pinecone.admin.admin

from pinecone.config import OpenApiConfiguration, Config
from pinecone.openapi_support import ApiClient
from pinecone.core.openapi.oauth import API_VERSION
from pinecone.core.openapi.oauth.apis import OAuthApi
from pinecone.core.openapi.oauth.models import TokenRequest
from typing import Optional, Dict
from pinecone.utils import get_user_agent
import os
from copy import deepcopy


[docs] class Admin: """ A class for accessing the Pinecone Admin API. A prerequisite for using this class is to have a `service account <https://docs.pinecone.io/guides/organizations/manage-service-accounts>`_. To create a service account, visit the `Pinecone web console <https://app.pinecone.io>`_ and navigate to the ``Access > Service Accounts`` section. After creating a service account, you will be provided with a client ID and secret. These values can be passed to the Admin constructor or set the ``PINECONE_CLIENT_ID`` and ``PINECONE_CLIENT_SECRET`` environment variables. :param client_id: The client ID for the Pinecone API. To obtain a client ID and secret, you must create a service account via the Pinecone web console. This value can be passed using keyword arguments or set the ``PINECONE_CLIENT_ID`` environment variable. :type client_id: Optional[str] :param client_secret: The client secret for the Pinecone API. To obtain a client ID and secret, you must create a service account via the Pinecone web console. This value can be passed using keyword arguments or set the ``PINECONE_CLIENT_SECRET`` environment variable. :type client_secret: Optional[str] :param additional_headers: Additional headers to use for the Pinecone API. This is a dictionary of key-value pairs. This is primarily used for internal testing purposes. :type additional_headers: Optional[Dict[str, str]] """ def __init__( self, client_id: Optional[str] = None, client_secret: Optional[str] = None, additional_headers: Optional[Dict[str, str]] = None, ): """ Initialize the ``Admin`` class. :param client_id: The client ID for the Pinecone API. To obtain a client ID and secret, you must create a service account via the Pinecone web console. This value can be passed using keyword arguments or set the ``PINECONE_CLIENT_ID`` environment variable. :type client_id: Optional[str] :param client_secret: The client secret for the Pinecone API. To obtain a client ID and secret, you must create a service account via the Pinecone web console. This value can be passed using keyword arguments or set the ``PINECONE_CLIENT_SECRET`` environment variable. :type client_secret: Optional[str] :param additional_headers: Additional headers to use for the Pinecone API. This is a dictionary of key-value pairs. This is primarily used for internal testing purposes. :type additional_headers: Optional[Dict[str, str]] """ if client_id is not None: self._client_id = client_id else: env_client_id = os.environ.get("PINECONE_CLIENT_ID", None) if env_client_id is None: raise ValueError( "client_id is not set. Pass client_id to the Admin constructor or set the PINECONE_CLIENT_ID environment variable." ) self._client_id = env_client_id if client_secret is not None: self._client_secret = client_secret else: env_client_secret = os.environ.get("PINECONE_CLIENT_SECRET", None) if env_client_secret is None: raise ValueError( "client_secret is not set. Pass client_secret to the Admin constructor or set the PINECONE_CLIENT_SECRET environment variable." ) self._client_secret = env_client_secret if additional_headers is None: additional_headers = {} _oauth_api_config = OpenApiConfiguration(host="https://login.pinecone.io") _oauth_api_client = ApiClient(configuration=_oauth_api_config) _oauth_api_client.set_default_header("X-Pinecone-Api-Version", API_VERSION) for key, value in additional_headers.items(): _oauth_api_client.set_default_header(key, value) _oauth_api_client.user_agent = get_user_agent(Config()) _oauth_api = OAuthApi(_oauth_api_client) token_request = TokenRequest( client_id=self._client_id, client_secret=self._client_secret, grant_type="client_credentials", audience="https://api.pinecone.io/", ) token_response = _oauth_api.get_token(token_request) self._token = token_response.access_token _child_api_config = deepcopy(_oauth_api_config) _child_api_config.host = "https://api.pinecone.io" _child_api_config.api_key_prefix = {"BearerAuth": "Bearer"} _child_api_config.api_key = {"BearerAuth": self._token} self._child_api_client = ApiClient(configuration=_child_api_config) self._child_api_client.set_default_header("X-Pinecone-Api-Version", API_VERSION) for key, value in additional_headers.items(): self._child_api_client.set_default_header(key, value) self._child_api_client.user_agent = get_user_agent(Config()) # Lazily initialize resources self._project = None self._api_key = None @property def project(self): """A namespace for project-related operations Alias for :func:`projects`. To learn about all project-related operations, see :func:`pinecone.admin.resources.ProjectResource`. Examples -------- .. code-block:: python :caption: Creating a project from pinecone import Admin # Using environment variables to pass PINECONE_CLIENT_ID and PINECONE_CLIENT_SECRET admin = Admin() # Create a project with no quota for pod indexes admin.project.create( name="my-project" max_pods=0 ) .. code-block:: python :caption: Listing all projects from pinecone import Admin admin = Admin() admin.projects.list() .. code-block:: python :caption: Deleting a project from pinecone import Admin admin = Admin() project = admin.project.get(name="my-project") admin.project.delete(project_id=project.id) """ if self._project is None: from pinecone.admin.resources import ProjectResource self._project = ProjectResource(self._child_api_client) return self._project @property def projects(self): """Alias for :func:`project`""" return self.project @property def api_key(self): """A namespace for api key-related operations Alias for :func:`api_keys`. To learn about all api key-related operations, see :func:`pinecone.admin.resources.ApiKeyResource`. Examples -------- .. code-block:: python :caption: Creating an API key from pinecone import Admin admin = Admin() project = admin.project.get(name="my-project") admin.api_key.create( name="my-api-key", project_id=project.id, description="my-api-key-description", roles=["ProjectEditor"] ) .. code-block:: python :caption: Listing all API keys for a project from pinecone import Admin admin = Admin() project = admin.project.get(name="my-project") admin.api_key.list(project_id=project.id) .. code-block:: python :caption: Deleting an API key from pinecone import Admin admin = Admin() project = admin.project.get(name="my-project") # List api keys for the project keys_list = admin.api_key.list(project_id=project.id) # Delete the first api key in the list admin.api_key.delete(api_key_id=keys_list[0].id) """ if self._api_key is None: from pinecone.admin.resources import ApiKeyResource self._api_key = ApiKeyResource(self._child_api_client) return self._api_key @property def api_keys(self): """Alias for :func:`api_key`""" return self.api_key